stem-1.7.1/0000775000175000017500000000000013411004021013174 5ustar atagaratagar00000000000000stem-1.7.1/cache_manual.py0000775000175000017500000000403313341034346016170 0ustar atagaratagar00000000000000#!/usr/bin/env python # Copyright 2015-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Caches tor's latest manual content. Run this to pick new man page changes. """ import re import sys import stem.manual import stem.util.system try: # account for urllib's change between python 2.x and 3.x import urllib.request as urllib except ImportError: import urllib2 as urllib GITWEB_MAN_LOG = 'https://gitweb.torproject.org/tor.git/log/doc/tor.1.txt' MAN_LOG_LINK = "href='/tor.git/commit/doc/tor.1.txt\?id=([^']*)'" if __name__ == '__main__': try: man_log_page = urllib.urlopen(GITWEB_MAN_LOG).read() man_commit = re.search(MAN_LOG_LINK, man_log_page).group(1) except: print("Unable to determine the latest commit to edit tor's man page: %s" % sys.exc_info()[1]) sys.exit(1) try: stem_commit = stem.util.system.call('git rev-parse HEAD')[0] except IOError as exc: print("Unable to determine stem's current commit: %s" % exc) sys.exit(1) print('Latest tor commit editing man page: %s' % man_commit) print('Current stem commit: %s' % stem_commit) print('') try: cached_manual = stem.manual.Manual.from_cache() db_schema = cached_manual.schema except stem.manual.SchemaMismatch as exc: cached_manual, db_schema = None, exc.database_schema except IOError: cached_manual, db_schema = None, None # local copy has been deleted if db_schema != stem.manual.SCHEMA_VERSION: print('Cached database schema is out of date (was %s, but current version is %s)' % (db_schema, stem.manual.SCHEMA_VERSION)) cached_manual = None latest_manual = stem.manual.Manual.from_remote() if cached_manual: if cached_manual == latest_manual: print('Manual information is already up to date, nothing to do.') sys.exit(0) print('Differences detected...\n') print(stem.manual._manual_differences(cached_manual, latest_manual)) latest_manual.man_commit = man_commit latest_manual.stem_commit = stem_commit latest_manual.save(stem.manual.CACHE_PATH) stem-1.7.1/README.md0000664000175000017500000000063713341474573014512 0ustar atagaratagar00000000000000## Stem (Python Tor Library) Stem is a Python controller library for **[Tor](https://www.torproject.org/)**. With it you can use Tor's [control protocol](https://gitweb.torproject.org/torspec.git/tree/control-spec.txt) to script against the Tor process, or build things such as [Nyx](https://nyx.torproject.org/). Documentation and tutorials available at **[stem.torproject.org](https://stem.torproject.org/)**. stem-1.7.1/cache_fallback_directories.py0000775000175000017500000000370213341034346021050 0ustar atagaratagar00000000000000#!/usr/bin/env python # Copyright 2016-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Caches tor's latest fallback directories. """ import re import sys import stem.descriptor.remote import stem.util.system try: # account for urllib's change between python 2.x and 3.x import urllib.request as urllib except ImportError: import urllib2 as urllib GITWEB_MAN_LOG = 'https://gitweb.torproject.org/tor.git/log/src/or/fallback_dirs.inc' FALLBACK_DIR_LINK = "href='/tor.git/commit/src/or/fallback_dirs.inc\?id=([^']*)'" if __name__ == '__main__': try: fallback_dir_page = urllib.urlopen(GITWEB_MAN_LOG).read() fallback_dir_commit = re.search(FALLBACK_DIR_LINK, fallback_dir_page).group(1) except: print("Unable to determine the latest commit to edit tor's fallback directories: %s" % sys.exc_info()[1]) sys.exit(1) try: stem_commit = stem.util.system.call('git rev-parse HEAD')[0] except IOError as exc: print("Unable to determine stem's current commit: %s" % exc) sys.exit(1) print('Latest tor commit editing fallback directories: %s' % fallback_dir_commit) print('Current stem commit: %s' % stem_commit) print('') cached_fallback_directories = stem.descriptor.remote.FallbackDirectory.from_cache() latest_fallback_directories = stem.descriptor.remote.FallbackDirectory.from_remote() if cached_fallback_directories == latest_fallback_directories: print('Fallback directories are already up to date, nothing to do.') sys.exit(0) # all fallbacks have the same header metadata, so just picking one headers = latest_fallback_directories.values()[0].header if latest_fallback_directories else None print('Differences detected...\n') print(stem.descriptor.remote._fallback_directory_differences(cached_fallback_directories, latest_fallback_directories)) stem.descriptor.remote.FallbackDirectory._write(latest_fallback_directories, fallback_dir_commit, stem_commit, headers) stem-1.7.1/setup.py0000664000175000017500000001253613355452221014735 0ustar atagaratagar00000000000000#!/usr/bin/env python # Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information # # Release Checklist # ================= # # * Recache latest information (cache_manual.py and cache_fallback_directories.py) # # * Test with python2.6, python2.7, python3, and pypy. # |- If using tox run... # | # | % tox -- --all --target RUN_ALL,ONLINE # | # | Otherwise, for each interpreter run... # | # | % [python_interpreter] run_tests.py --all --target RUN_ALL,ONLINE # | # |- Pypy test instructions for ubuntu are... # | # | % sudo apt-get install pypy # | % wget https://bootstrap.pypa.io/get-pip.py # | % pypy get-pip.py --user # | % ~/.local/bin/pip install mock pycodestyle pyflakes --user # | % pypy ./run_tests.py --all # | # +- Some version of python 3.x should be available in your platform's # repositories. To test against a specific version on ubuntu try the # following. In this example, Python 3.7... # # % sudo apt-get install build-essential python-dev python-setuptools python-pip python-smbus # % sudo apt-get install libncursesw5-dev libgdbm-dev libc6-dev # % sudo apt-get install zlib1g-dev libsqlite3-dev tk-dev # % sudo apt-get install libssl-dev openssl libffi-dev # # % wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz # % tar -xzf Python-3.7.0.tgz # % mv Python-3.7.0 ~ # # % cd ~/Python-3.7.0 # % ./configure # % make # # % cd /path/to/stem # % ~/Python-3.7.0/python ./run_tests.py --all # # * Tag the release # |- Bump stem's version (in stem/__init__.py and docs/index.rst). # |- git commit -a -m "Stem release 1.0.0" # |- git tag -u 9ABBEEC6 -m "stem release 1.0.0" 1.0.0 d0bb81a # +- git push --tags # # * Dry-run release on https://pypi.python.org/pypi/stem/ # |- python setup.py sdist --dryrun # |- gpg --detach-sig --armor dist/stem-dry-run-1.0.0.tar.gz # |- twine upload dist/* # +- Check that https://pypi.python.org/pypi/stem-dry-run/ looks correct, comparing it to https://pypi.python.org/pypi/stem/ # +- Don't worry about the 'Bug Tracker' being missing. That's an attribute of the project itself. # # * Final release # |- rm dist/* # |- python setup.py sdist # |- gpg --detach-sig --armor dist/stem-1.0.0.tar.gz # +- twine upload dist/* # # * Contact package maintainers # * Announce the release (example: https://blog.torproject.org/blog/stem-release-11) import distutils.core import os import sys import stem if '--dryrun' in sys.argv: DRY_RUN = True sys.argv.remove('--dryrun') else: DRY_RUN = False SUMMARY = 'Stem is a Python controller library that allows applications to interact with Tor (https://www.torproject.org/).' DRY_RUN_SUMMARY = 'Ignore this package. This is dry-run release creation to work around PyPI limitations (https://github.com/pypa/packaging-problems/issues/74#issuecomment-260716129).' DESCRIPTION = """ For tutorials and API documentation see `Stem's homepage `_. Quick Start ----------- To install you can either use... :: pip install stem ... or install from the source tarball. Stem supports both the python 2.x and 3.x series. To use its python3 counterpart you simply need to install using that version of python. :: python3 setup.py install After that, give some `tutorials `_ a try! For questions or to discuss project ideas we're available on `irc `_ and the `tor-dev@ email list `_. """.strip() MANIFEST = """ include cache_fallback_directories.py include cache_manual.py include LICENSE include README.md include MANIFEST.in include requirements.txt include run_tests.py include tox.ini graft docs graft test global-exclude __pycache__ global-exclude *.orig global-exclude *.pyc global-exclude *.swp global-exclude *.swo global-exclude .tox global-exclude *~ recursive-exclude test/data * recursive-exclude docs/_build * """.strip() # installation requires us to be in our setup.py's directory os.chdir(os.path.dirname(os.path.abspath(__file__))) with open('MANIFEST.in', 'w') as manifest_file: manifest_file.write(MANIFEST) try: distutils.core.setup( name = 'stem-dry-run' if DRY_RUN else 'stem', version = stem.__version__, description = DRY_RUN_SUMMARY if DRY_RUN else SUMMARY, long_description = DESCRIPTION, license = stem.__license__, author = stem.__author__, author_email = stem.__contact__, url = stem.__url__, packages = ['stem', 'stem.client', 'stem.descriptor', 'stem.interpreter', 'stem.response', 'stem.util'], keywords = 'tor onion controller', scripts = ['tor-prompt'], package_data = { 'stem': ['cached_fallbacks.cfg', 'cached_manual.sqlite', 'settings.cfg'], 'stem.interpreter': ['settings.cfg'], 'stem.util': ['ports.cfg'], }, classifiers = [ 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', 'License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)', 'Topic :: Security', 'Topic :: Software Development :: Libraries :: Python Modules', ], ) finally: if os.path.exists('MANIFEST.in'): os.remove('MANIFEST.in') if os.path.exists('MANIFEST'): os.remove('MANIFEST') stem-1.7.1/stem/0000775000175000017500000000000013411004021014144 5ustar atagaratagar00000000000000stem-1.7.1/stem/process.py0000664000175000017500000002352613411002355016214 0ustar atagaratagar00000000000000# Copyright 2011-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Helper functions for working with tor as a process. :NO_TORRC: when provided as a torrc_path tor is ran with a blank configuration :DEFAULT_INIT_TIMEOUT: number of seconds before we time out our attempt to start a tor instance **Module Overview:** :: launch_tor - starts up a tor process launch_tor_with_config - starts a tor process with a custom torrc """ import os import re import signal import subprocess import tempfile import threading import stem.prereq import stem.util.str_tools import stem.util.system import stem.version NO_TORRC = '' DEFAULT_INIT_TIMEOUT = 90 def launch_tor(tor_cmd = 'tor', args = None, torrc_path = None, completion_percent = 100, init_msg_handler = None, timeout = DEFAULT_INIT_TIMEOUT, take_ownership = False, close_output = True, stdin = None): """ Initializes a tor process. This blocks until initialization completes or we error out. If tor's data directory is missing or stale then bootstrapping will include making several requests to the directory authorities which can take a little while. Usually this is done in 50 seconds or so, but occasionally calls seem to get stuck, taking well over the default timeout. **To work to must log at NOTICE runlevel to stdout.** It does this by default, but if you have a 'Log' entry in your torrc then you'll also need 'Log NOTICE stdout'. Note: The timeout argument does not work on Windows or when outside the main thread, and relies on the global state of the signal module. .. versionchanged:: 1.6.0 Allowing the timeout argument to be a float. .. versionchanged:: 1.7.0 Added the **close_output** argument. :param str tor_cmd: command for starting tor :param list args: additional arguments for tor :param str torrc_path: location of the torrc for us to use :param int completion_percent: percent of bootstrap completion at which this'll return :param functor init_msg_handler: optional functor that will be provided with tor's initialization stdout as we get it :param int timeout: time after which the attempt to start tor is aborted, no timeouts are applied if **None** :param bool take_ownership: asserts ownership over the tor process so it aborts if this python process terminates or a :class:`~stem.control.Controller` we establish to it disconnects :param bool close_output: closes tor's stdout and stderr streams when bootstrapping is complete if true :param str stdin: content to provide on stdin :returns: **subprocess.Popen** instance for the tor subprocess :raises: **OSError** if we either fail to create the tor process or reached a timeout without success """ if stem.util.system.is_windows(): if timeout is not None and timeout != DEFAULT_INIT_TIMEOUT: raise OSError('You cannot launch tor with a timeout on Windows') timeout = None elif threading.current_thread().__class__.__name__ != '_MainThread': if timeout is not None and timeout != DEFAULT_INIT_TIMEOUT: raise OSError('Launching tor with a timeout can only be done in the main thread') timeout = None # sanity check that we got a tor binary if os.path.sep in tor_cmd: # got a path (either relative or absolute), check what it leads to if os.path.isdir(tor_cmd): raise OSError("'%s' is a directory, not the tor executable" % tor_cmd) elif not os.path.isfile(tor_cmd): raise OSError("'%s' doesn't exist" % tor_cmd) elif not stem.util.system.is_available(tor_cmd): raise OSError("'%s' isn't available on your system. Maybe it's not in your PATH?" % tor_cmd) # double check that we have a torrc to work with if torrc_path not in (None, NO_TORRC) and not os.path.exists(torrc_path): raise OSError("torrc doesn't exist (%s)" % torrc_path) # starts a tor subprocess, raising an OSError if it fails runtime_args, temp_file = [tor_cmd], None if args: runtime_args += args if torrc_path: if torrc_path == NO_TORRC: temp_file = tempfile.mkstemp(prefix = 'empty-torrc-', text = True)[1] runtime_args += ['-f', temp_file] else: runtime_args += ['-f', torrc_path] if take_ownership: runtime_args += ['__OwningControllerProcess', str(os.getpid())] tor_process = None try: tor_process = subprocess.Popen(runtime_args, stdout = subprocess.PIPE, stdin = subprocess.PIPE, stderr = subprocess.PIPE) if stdin: tor_process.stdin.write(stem.util.str_tools._to_bytes(stdin)) tor_process.stdin.close() if timeout: def timeout_handler(signum, frame): raise OSError('reached a %i second timeout without success' % timeout) signal.signal(signal.SIGALRM, timeout_handler) signal.setitimer(signal.ITIMER_REAL, timeout) bootstrap_line = re.compile('Bootstrapped ([0-9]+)%') problem_line = re.compile('\[(warn|err)\] (.*)$') last_problem = 'Timed out' while True: # Tor's stdout will be read as ASCII bytes. This is fine for python 2, but # in python 3 that means it'll mismatch with other operations (for instance # the bootstrap_line.search() call later will fail). # # It seems like python 2.x is perfectly happy for this to be unicode, so # normalizing to that. init_line = tor_process.stdout.readline().decode('utf-8', 'replace').strip() # this will provide empty results if the process is terminated if not init_line: raise OSError('Process terminated: %s' % last_problem) # provide the caller with the initialization message if they want it if init_msg_handler: init_msg_handler(init_line) # return the process if we're done with bootstrapping bootstrap_match = bootstrap_line.search(init_line) problem_match = problem_line.search(init_line) if bootstrap_match and int(bootstrap_match.group(1)) >= completion_percent: return tor_process elif problem_match: runlevel, msg = problem_match.groups() if 'see warnings above' not in msg: if ': ' in msg: msg = msg.split(': ')[-1].strip() last_problem = msg except: if tor_process: tor_process.kill() # don't leave a lingering process tor_process.wait() raise finally: if timeout: signal.alarm(0) # stop alarm if tor_process and close_output: if tor_process.stdout: tor_process.stdout.close() if tor_process.stderr: tor_process.stderr.close() if temp_file: try: os.remove(temp_file) except: pass def launch_tor_with_config(config, tor_cmd = 'tor', completion_percent = 100, init_msg_handler = None, timeout = DEFAULT_INIT_TIMEOUT, take_ownership = False, close_output = True): """ Initializes a tor process, like :func:`~stem.process.launch_tor`, but with a customized configuration. This writes a temporary torrc to disk, launches tor, then deletes the torrc. For example... :: tor_process = stem.process.launch_tor_with_config( config = { 'ControlPort': '2778', 'Log': [ 'NOTICE stdout', 'ERR file /tmp/tor_error_log', ], }, ) .. versionchanged:: 1.7.0 Added the **close_output** argument. :param dict config: configuration options, such as "{'ControlPort': '9051'}", values can either be a **str** or **list of str** if for multiple values :param str tor_cmd: command for starting tor :param int completion_percent: percent of bootstrap completion at which this'll return :param functor init_msg_handler: optional functor that will be provided with tor's initialization stdout as we get it :param int timeout: time after which the attempt to start tor is aborted, no timeouts are applied if **None** :param bool take_ownership: asserts ownership over the tor process so it aborts if this python process terminates or a :class:`~stem.control.Controller` we establish to it disconnects :param bool close_output: closes tor's stdout and stderr streams when bootstrapping is complete if true :returns: **subprocess.Popen** instance for the tor subprocess :raises: **OSError** if we either fail to create the tor process or reached a timeout without success """ # TODO: Drop this version check when tor 0.2.6.3 or higher is the only game # in town. try: use_stdin = stem.version.get_system_tor_version(tor_cmd) >= stem.version.Requirement.TORRC_VIA_STDIN except IOError: use_stdin = False # we need to be sure that we're logging to stdout to figure out when we're # done bootstrapping if 'Log' in config: stdout_options = ['DEBUG stdout', 'INFO stdout', 'NOTICE stdout'] if isinstance(config['Log'], str): config['Log'] = [config['Log']] has_stdout = False for log_config in config['Log']: if log_config in stdout_options: has_stdout = True break if not has_stdout: config['Log'].append('NOTICE stdout') config_str = '' for key, values in list(config.items()): if isinstance(values, str): config_str += '%s %s\n' % (key, values) else: for value in values: config_str += '%s %s\n' % (key, value) if use_stdin: return launch_tor(tor_cmd, ['-f', '-'], None, completion_percent, init_msg_handler, timeout, take_ownership, close_output, stdin = config_str) else: torrc_descriptor, torrc_path = tempfile.mkstemp(prefix = 'torrc-', text = True) try: with open(torrc_path, 'w') as torrc_file: torrc_file.write(config_str) # prevents tor from erroring out due to a missing torrc if it gets a sighup args = ['__ReloadTorrcOnSIGHUP', '0'] return launch_tor(tor_cmd, args, torrc_path, completion_percent, init_msg_handler, timeout, take_ownership) finally: try: os.close(torrc_descriptor) os.remove(torrc_path) except: pass stem-1.7.1/stem/exit_policy.py0000664000175000017500000010512313341474573017101 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Representation of tor exit policies. These can be easily used to check if exiting to a destination is permissible or not. For instance... :: >>> from stem.exit_policy import ExitPolicy, MicroExitPolicy >>> policy = ExitPolicy('accept *:80', 'accept *:443', 'reject *:*') >>> print(policy) accept *:80, accept *:443, reject *:* >>> print(policy.summary()) accept 80, 443 >>> policy.can_exit_to('75.119.206.243', 80) True >>> policy = MicroExitPolicy('accept 80,443') >>> print(policy) accept 80,443 >>> policy.can_exit_to('75.119.206.243', 80) True :: ExitPolicy - Exit policy for a Tor relay |- MicroExitPolicy - Microdescriptor exit policy | |- can_exit_to - check if exiting to this destination is allowed or not |- is_exiting_allowed - check if any exiting is allowed |- summary - provides a short label, similar to a microdescriptor |- has_private - checks if policy has anything expanded from the 'private' keyword |- strip_private - provides a copy of the policy without 'private' entries |- has_default - checks if policy ends with the defaultly appended suffix |- strip_default - provides a copy of the policy without the default suffix |- __str__ - string representation +- __iter__ - ExitPolicyRule entries that this contains ExitPolicyRule - Single rule of an exit policy chain |- MicroExitPolicyRule - Single rule for a microdescriptor policy | |- is_address_wildcard - checks if we'll accept any address |- is_port_wildcard - checks if we'll accept any port |- get_address_type - provides the protocol our ip address belongs to |- is_match - checks if we match a given destination |- get_mask - provides the address representation of our mask |- get_masked_bits - provides the bit representation of our mask |- is_default - flag indicating if this was part of the default end of a policy |- is_private - flag indicating if this was expanded from a 'private' keyword +- __str__ - string representation for this rule get_config_policy - provides the ExitPolicy based on torrc rules .. data:: AddressType (enum) Enumerations for IP address types that can be in an exit policy. ============ =========== AddressType Description ============ =========== **WILDCARD** any address of either IPv4 or IPv6 **IPv4** IPv4 address **IPv6** IPv6 address ============ =========== """ from __future__ import absolute_import import re import socket import zlib import stem.prereq import stem.util import stem.util.connection import stem.util.enum import stem.util.str_tools if stem.prereq._is_lru_cache_available(): from functools import lru_cache else: from stem.util.lru_cache import lru_cache AddressType = stem.util.enum.Enum(('WILDCARD', 'Wildcard'), ('IPv4', 'IPv4'), ('IPv6', 'IPv6')) # Addresses aliased by the 'private' policy. From the tor man page... # # To specify all internal and link-local networks (including 0.0.0.0/8, # 169.254.0.0/16, 127.0.0.0/8, 192.168.0.0/16, 10.0.0.0/8, and 172.16.0.0/12), # you can use the 'private' alias instead of an address. PRIVATE_ADDRESSES = ( '0.0.0.0/8', '169.254.0.0/16', '127.0.0.0/8', '192.168.0.0/16', '10.0.0.0/8', '172.16.0.0/12', ) def get_config_policy(rules, ip_address = None): """ Converts an ExitPolicy found in a torrc to a proper exit pattern. This accounts for... * ports being optional * the 'private' keyword .. deprecated:: 1.7.0 Tor's torrc parameters lack a formal spec, making it difficult for this method to be reliable. Callers are encouraged to move to :func:`~stem.control.Controller.get_exit_policy` instead. :param str,list rules: comma separated rules or list to be converted :param str ip_address: this relay's IP address for the 'private' policy if it's present, this defaults to the local address :returns: :class:`~stem.exit_policy.ExitPolicy` reflected by the rules :raises: **ValueError** if input isn't a valid tor exit policy """ if ip_address and not (stem.util.connection.is_valid_ipv4_address(ip_address) or stem.util.connection.is_valid_ipv6_address(ip_address, allow_brackets = True)): raise ValueError("%s isn't a valid IP address" % ip_address) elif ip_address and stem.util.connection.is_valid_ipv6_address(ip_address, allow_brackets = True) and not (ip_address[0] == '[' and ip_address[-1] == ']'): ip_address = '[%s]' % ip_address # ExitPolicy validation expects IPv6 addresses to be bracketed if stem.util._is_str(rules): rules = rules.split(',') result = [] for rule in rules: rule = rule.strip() if not rule: continue if not re.search(':[\d\-\*]+$', rule): rule = '%s:*' % rule if 'private' in rule: acceptance = rule.split(' ', 1)[0] port = rule.rsplit(':', 1)[1] addresses = list(PRIVATE_ADDRESSES) if ip_address: addresses.append(ip_address) else: try: addresses.append(socket.gethostbyname(socket.gethostname())) except: pass # we might not have a network connection for private_addr in addresses: result.append(ExitPolicyRule('%s %s:%s' % (acceptance, private_addr, port))) else: result.append(ExitPolicyRule(rule)) return ExitPolicy(*result) def _flag_private_rules(rules): """ Determine if part of our policy was expanded from the 'private' keyword. This doesn't differentiate if this actually came from the 'private' keyword or a series of rules exactly matching it. """ matches = [] # find all possible starting indexes for i, rule in enumerate(rules): if i + len(PRIVATE_ADDRESSES) > len(rules): break rule_str = '%s/%s' % (rule.address, rule.get_masked_bits()) if rule_str == PRIVATE_ADDRESSES[0]: matches.append(i) for start_index in matches: # To match the private policy the following must all be true... # # * series of addresses and bit masks match PRIVATE_ADDRESSES # * all rules have the same port range # * all rules have the same acceptance (all accept or reject entries) # # The last rule is dynamically based on the relay's public address. It may # not be present if get_config_policy() created this policy and we couldn't # resolve our address. last_index = start_index + len(PRIVATE_ADDRESSES) rule_set = rules[start_index:last_index] last_rule = rules[last_index] if len(rules) > last_index else None is_match = True min_port, max_port = rule_set[0].min_port, rule_set[0].max_port is_accept = rule_set[0].is_accept for i, rule in enumerate(rule_set): rule_str = '%s/%s' % (rule.address, rule.get_masked_bits()) if rule_str != PRIVATE_ADDRESSES[i] or rule.min_port != min_port or rule.max_port != max_port or rule.is_accept != is_accept: is_match = False break if is_match: for rule in rule_set: rule._is_private = True if last_rule and not last_rule.is_address_wildcard() and last_rule.min_port == min_port and last_rule.max_port == max_port and last_rule.is_accept == is_accept: last_rule._is_private = True def _flag_default_rules(rules): """ Determine if part of our policy ends with the defaultly appended suffix. """ if len(rules) >= len(DEFAULT_POLICY_RULES): rules_suffix = tuple(rules[-len(DEFAULT_POLICY_RULES):]) if rules_suffix == DEFAULT_POLICY_RULES: for rule in rules_suffix: rule._is_default_suffix = True class ExitPolicy(object): """ Policy for the destinations that a relay allows or denies exiting to. This is, in effect, just a list of :class:`~stem.exit_policy.ExitPolicyRule` entries. :param list rules: **str** or :class:`~stem.exit_policy.ExitPolicyRule` entries that make up this policy """ def __init__(self, *rules): # sanity check the types for rule in rules: if not stem.util._is_str(rule) and not isinstance(rule, ExitPolicyRule): raise TypeError('Exit policy rules can only contain strings or ExitPolicyRules, got a %s (%s)' % (type(rule), rules)) # Unparsed representation of the rules we were constructed with. Our # _get_rules() method consumes this to provide ExitPolicyRule instances. # This is lazily evaluated so we don't need to actually parse the exit # policy if it's never used. is_all_str = True for rule in rules: if not stem.util._is_str(rule): is_all_str = False if rules and is_all_str: byte_rules = [stem.util.str_tools._to_bytes(r) for r in rules] self._input_rules = zlib.compress(b','.join(byte_rules)) else: self._input_rules = rules self._rules = None self._hash = None # Result when no rules apply. According to the spec policies default to 'is # allowed', but our microdescriptor policy subclass might want to change # this. self._is_allowed_default = True @lru_cache() def can_exit_to(self, address = None, port = None, strict = False): """ Checks if this policy allows exiting to a given destination or not. If the address or port is omitted then this will check if we're allowed to exit to any instances of the defined address or port. :param str address: IPv4 or IPv6 address (with or without brackets) :param int port: port number :param bool strict: if the address or port is excluded then check if we can exit to **all** instances of the defined address or port :returns: **True** if exiting to this destination is allowed, **False** otherwise """ if not self.is_exiting_allowed(): return False for rule in self._get_rules(): if rule.is_match(address, port, strict): return rule.is_accept return self._is_allowed_default @lru_cache() def is_exiting_allowed(self): """ Provides **True** if the policy allows exiting whatsoever, **False** otherwise. """ rejected_ports = set() for rule in self._get_rules(): if rule.is_accept: for port in range(rule.min_port, rule.max_port + 1): if port not in rejected_ports: return True elif rule.is_address_wildcard(): if rule.is_port_wildcard(): return False else: rejected_ports.update(range(rule.min_port, rule.max_port + 1)) return self._is_allowed_default @lru_cache() def summary(self): """ Provides a short description of our policy chain, similar to a microdescriptor. This excludes entries that don't cover all IP addresses, and is either white-list or blacklist policy based on the final entry. For instance... :: >>> policy = ExitPolicy('accept *:80', 'accept *:443', 'reject *:*') >>> policy.summary() 'accept 80, 443' >>> policy = ExitPolicy('accept *:443', 'reject *:1-1024', 'accept *:*') >>> policy.summary() 'reject 1-442, 444-1024' :returns: **str** with a concise summary for our policy """ # determines if we're a white-list or blacklist is_whitelist = not self._is_allowed_default for rule in self._get_rules(): if rule.is_address_wildcard() and rule.is_port_wildcard(): is_whitelist = not rule.is_accept break # Iterates over the policies and adds the the ports we'll return (ie, # allows if a white-list and rejects if a blacklist). Regardless of a # port's allow/reject policy, all further entries with that port are # ignored since policies respect the first matching policy. display_ports, skip_ports = [], set() for rule in self._get_rules(): if not rule.is_address_wildcard(): continue elif rule.is_port_wildcard(): break for port in range(rule.min_port, rule.max_port + 1): if port in skip_ports: continue # if accept + white-list or reject + blacklist then add if rule.is_accept == is_whitelist: display_ports.append(port) # all further entries with this port should be ignored skip_ports.add(port) # convert port list to a list of ranges (ie, ['1-3'] rather than [1, 2, 3]) if display_ports: display_ranges, temp_range = [], [] display_ports.sort() display_ports.append(None) # ending item to include last range in loop for port in display_ports: if not temp_range or temp_range[-1] + 1 == port: temp_range.append(port) else: if len(temp_range) > 1: display_ranges.append('%i-%i' % (temp_range[0], temp_range[-1])) else: display_ranges.append(str(temp_range[0])) temp_range = [port] else: # everything for the inverse is_whitelist = not is_whitelist display_ranges = ['1-65535'] # constructs the summary string label_prefix = 'accept ' if is_whitelist else 'reject ' return (label_prefix + ', '.join(display_ranges)).strip() def has_private(self): """ Checks if we have any rules expanded from the 'private' keyword. Tor appends these by default to the start of the policy and includes a dynamic address (the relay's public IP). .. versionadded:: 1.3.0 :returns: **True** if we have any private rules expanded from the 'private' keyword, **False** otherwise """ for rule in self._get_rules(): if rule.is_private(): return True return False def strip_private(self): """ Provides a copy of this policy without 'private' policy entries. .. versionadded:: 1.3.0 :returns: **ExitPolicy** without private rules """ return ExitPolicy(*[rule for rule in self._get_rules() if not rule.is_private()]) def has_default(self): """ Checks if we have the default policy suffix. .. versionadded:: 1.3.0 :returns: **True** if we have the default policy suffix, **False** otherwise """ for rule in self._get_rules(): if rule.is_default(): return True return False def strip_default(self): """ Provides a copy of this policy without the default policy suffix. .. versionadded:: 1.3.0 :returns: **ExitPolicy** without default rules """ return ExitPolicy(*[rule for rule in self._get_rules() if not rule.is_default()]) def _get_rules(self): if self._rules is None: rules = [] is_all_accept, is_all_reject = True, True if isinstance(self._input_rules, bytes): decompressed_rules = zlib.decompress(self._input_rules).split(b',') else: decompressed_rules = self._input_rules for rule in decompressed_rules: if isinstance(rule, bytes): rule = stem.util.str_tools._to_unicode(rule) if stem.util._is_str(rule): if not rule.strip(): continue rule = ExitPolicyRule(rule.strip()) if rule.is_accept: is_all_reject = False else: is_all_accept = False rules.append(rule) if rule.is_address_wildcard() and rule.is_port_wildcard(): break # this is a catch-all, no reason to include more # If we only have one kind of entry *and* end with a wildcard then # we might as well use the simpler version. For instance... # # reject *:80, reject *:443, reject *:* # # ... could also be represented as simply... # # reject *:* # # This mostly comes up with reject-all policies because the # 'reject private:*' appends an extra seven rules that have no # effect. if rules and (rules[-1].is_address_wildcard() and rules[-1].is_port_wildcard()): if is_all_accept: rules = [ExitPolicyRule('accept *:*')] elif is_all_reject: rules = [ExitPolicyRule('reject *:*')] _flag_private_rules(rules) _flag_default_rules(rules) self._rules = rules self._input_rules = None return self._rules def __len__(self): return len(self._get_rules()) def __iter__(self): for rule in self._get_rules(): yield rule @lru_cache() def __str__(self): return ', '.join([str(rule) for rule in self._get_rules()]) def __hash__(self): if self._hash is None: my_hash = 0 for rule in self._get_rules(): my_hash *= 1024 my_hash += hash(rule) self._hash = my_hash return self._hash def __eq__(self, other): return hash(self) == hash(other) if isinstance(other, ExitPolicy) else False def __ne__(self, other): return not self == other class MicroExitPolicy(ExitPolicy): """ Exit policy provided by the microdescriptors. This is a distilled version of a normal :class:`~stem.exit_policy.ExitPolicy` contains, just consisting of a list of ports that are either accepted or rejected. For instance... :: accept 80,443 # only accepts common http ports reject 1-1024 # only accepts non-privileged ports Since these policies are a subset of the exit policy information (lacking IP ranges) clients can only use them to guess if a relay will accept traffic or not. To quote the `dir-spec `_ (section 3.2.1)... :: With microdescriptors, clients don't learn exact exit policies: clients can only guess whether a relay accepts their request, try the BEGIN request, and might get end-reason-exit-policy if they guessed wrong, in which case they'll have to try elsewhere. :var bool is_accept: **True** if these are ports that we accept, **False** if they're ports that we reject :param str policy: policy string that describes this policy """ def __init__(self, policy): # Microdescriptor policies are of the form... # # MicrodescriptrPolicy ::= ("accept" / "reject") SP PortList NL # PortList ::= PortOrRange # PortList ::= PortList "," PortOrRange # PortOrRange ::= INT "-" INT / INT self._policy = policy if policy.startswith('accept'): self.is_accept = True elif policy.startswith('reject'): self.is_accept = False else: raise ValueError("A microdescriptor exit policy must start with either 'accept' or 'reject': %s" % policy) policy = policy[6:] if not policy.startswith(' '): raise ValueError('A microdescriptor exit policy should have a space separating accept/reject from its port list: %s' % self._policy) policy = policy.lstrip() # convert our port list into MicroExitPolicyRule rules = [] for port_entry in policy.split(','): if '-' in port_entry: min_port, max_port = port_entry.split('-', 1) else: min_port = max_port = port_entry if not stem.util.connection.is_valid_port(min_port) or \ not stem.util.connection.is_valid_port(max_port): raise ValueError("'%s' is an invalid port range" % port_entry) rules.append(MicroExitPolicyRule(self.is_accept, int(min_port), int(max_port))) super(MicroExitPolicy, self).__init__(*rules) self._is_allowed_default = not self.is_accept def __str__(self): return self._policy def __hash__(self): return hash(str(self)) def __eq__(self, other): return hash(self) == hash(other) if isinstance(other, MicroExitPolicy) else False def __ne__(self, other): return not self == other class ExitPolicyRule(object): """ Single rule from the user's exit policy. These rules are chained together to form complete policies that describe where a relay will and will not allow traffic to exit. The format of these rules are formally described in the `dir-spec `_ as an 'exitpattern'. Note that while these are similar to tor's man page entry for ExitPolicies, it's not the exact same. An exitpattern is better defined and stricter in what it'll accept. For instance, ports are not optional and it does not contain the 'private' alias. This should be treated as an immutable object. .. versionchanged:: 1.5.0 Support for 'accept6/reject6' entries and '\*4/6' wildcards. :var bool is_accept: indicates if exiting is allowed or disallowed :var str address: address that this rule is for :var int min_port: lower end of the port range that we include (inclusive) :var int max_port: upper end of the port range that we include (inclusive) :param str rule: exit policy rule to be parsed :raises: **ValueError** if input isn't a valid tor exit policy rule """ def __init__(self, rule): # policy ::= "accept[6]" exitpattern | "reject[6]" exitpattern # exitpattern ::= addrspec ":" portspec rule = stem.util.str_tools._to_unicode(rule) self.is_accept = rule.startswith('accept') is_ipv6_only = rule.startswith('accept6') or rule.startswith('reject6') if rule.startswith('accept6') or rule.startswith('reject6'): exitpattern = rule[7:] elif rule.startswith('accept') or rule.startswith('reject'): exitpattern = rule[6:] else: raise ValueError("An exit policy must start with either 'accept[6]' or 'reject[6]': %s" % rule) if not exitpattern.startswith(' '): raise ValueError('An exit policy should have a space separating its accept/reject from the exit pattern: %s' % rule) exitpattern = exitpattern.lstrip() if ':' not in exitpattern or ']' in exitpattern.rsplit(':', 1)[1]: raise ValueError("An exitpattern must be of the form 'addrspec:portspec': %s" % rule) self.address = None self._address_type = None self._masked_bits = None self.min_port = self.max_port = None self._hash = None # Our mask in ip notation (ex. '255.255.255.0'). This is only set if we # either have a custom mask that can't be represented by a number of bits, # or the user has called mask(), lazily loading this. self._mask = None # Malformed exit policies are rejected, but there's an exception where it's # just skipped: when an accept6/reject6 rule has an IPv4 address... # # "Using an IPv4 address with accept6 or reject6 is ignored and generates # a warning." self._skip_rule = False addrspec, portspec = exitpattern.rsplit(':', 1) self._apply_addrspec(rule, addrspec, is_ipv6_only) self._apply_portspec(rule, portspec) # Flags to indicate if this rule seems to be expanded from the 'private' # keyword or tor's default policy suffix. self._is_private = False self._is_default_suffix = False def is_address_wildcard(self): """ **True** if we'll match against **any** address, **False** otherwise. Note that this is different than \*4, \*6, or '/0' address which are wildcards for only either IPv4 or IPv6. :returns: **bool** for if our address matching is a wildcard """ return self._address_type == _address_type_to_int(AddressType.WILDCARD) def is_port_wildcard(self): """ **True** if we'll match against any port, **False** otherwise. :returns: **bool** for if our port matching is a wildcard """ return self.min_port in (0, 1) and self.max_port == 65535 def is_match(self, address = None, port = None, strict = False): """ **True** if we match against the given destination, **False** otherwise. If the address or port is omitted then this will check if we're allowed to exit to any instances of the defined address or port. :param str address: IPv4 or IPv6 address (with or without brackets) :param int port: port number :param bool strict: if the address or port is excluded then check if we can exit to **all** instances of the defined address or port :returns: **bool** indicating if we match against this destination :raises: **ValueError** if provided with a malformed address or port """ if self._skip_rule: return False # validate our input and check if the argument doesn't match our address type if address is not None: address_type = self.get_address_type() if stem.util.connection.is_valid_ipv4_address(address): if address_type == AddressType.IPv6: return False elif stem.util.connection.is_valid_ipv6_address(address, allow_brackets = True): if address_type == AddressType.IPv4: return False address = address.lstrip('[').rstrip(']') else: raise ValueError("'%s' isn't a valid IPv4 or IPv6 address" % address) if port is not None and not stem.util.connection.is_valid_port(port): raise ValueError("'%s' isn't a valid port" % port) # If we're not matching against an address or port but the rule has one # then we're a fuzzy match. When that happens... # # * If strict and a reject rule then we're a match ('can exit to *all* instances'). # * If not strict and an accept rule then match ('an exit ot *any* instance'). fuzzy_match = False if not self.is_address_wildcard(): # Already got the integer representation of our mask and our address # with the mask applied. Just need to check if this address with the # mask applied matches. if address is None: fuzzy_match = True else: comparison_addr_bin = stem.util.connection.address_to_int(address) comparison_addr_bin &= self._get_mask_bin() if self._get_address_bin() != comparison_addr_bin: return False if not self.is_port_wildcard(): if port is None: fuzzy_match = True elif port < self.min_port or port > self.max_port: return False if fuzzy_match: return strict != self.is_accept else: return True def get_address_type(self): """ Provides the :data:`~stem.exit_policy.AddressType` for our policy. :returns: :data:`~stem.exit_policy.AddressType` for the type of address that we have """ return _int_to_address_type(self._address_type) def get_mask(self, cache = True): """ Provides the address represented by our mask. This is **None** if our address type is a wildcard. :param bool cache: caches the result if **True** :returns: str of our subnet mask for the address (ex. '255.255.255.0') """ # Lazy loading our mask because it is very infrequently requested. There's # no reason to usually use memory for it. if not self._mask: address_type = self.get_address_type() if address_type == AddressType.WILDCARD: mask = None elif address_type == AddressType.IPv4: mask = stem.util.connection.get_mask_ipv4(self._masked_bits) elif address_type == AddressType.IPv6: mask = stem.util.connection.get_mask_ipv6(self._masked_bits) if not cache: return mask self._mask = mask return self._mask def get_masked_bits(self): """ Provides the number of bits our subnet mask represents. This is **None** if our mask can't have a bit representation. :returns: int with the bit representation of our mask """ return self._masked_bits def is_private(self): """ Checks if this rule was expanded from the 'private' policy keyword. .. versionadded:: 1.3.0 :returns: **True** if this rule was expanded from the 'private' keyword, **False** otherwise. """ return self._is_private def is_default(self): """ Checks if this rule belongs to the default exit policy suffix. .. versionadded:: 1.3.0 :returns: **True** if this rule was part of the default end of a policy, **False** otherwise. """ return self._is_default_suffix @lru_cache() def __str__(self): """ Provides the string representation of our policy. This does not necessarily match the rule that we were constructed from (due to things like IPv6 address collapsing or the multiple representations that our mask can have). However, it is a valid that would be accepted by our constructor to re-create this rule. """ label = 'accept ' if self.is_accept else 'reject ' if self.is_address_wildcard(): label += '*:' else: address_type = self.get_address_type() if address_type == AddressType.IPv4: label += self.address else: label += '[%s]' % self.address # Including our mask label as follows... # - exclude our mask if it doesn't do anything # - use our masked bit count if we can # - use the mask itself otherwise if (address_type == AddressType.IPv4 and self._masked_bits == 32) or \ (address_type == AddressType.IPv6 and self._masked_bits == 128): label += ':' elif self._masked_bits is not None: label += '/%i:' % self._masked_bits else: label += '/%s:' % self.get_mask() if self.is_port_wildcard(): label += '*' elif self.min_port == self.max_port: label += str(self.min_port) else: label += '%i-%i' % (self.min_port, self.max_port) return label @lru_cache() def _get_mask_bin(self): # provides an integer representation of our mask return int(stem.util.connection._address_to_binary(self.get_mask(False)), 2) @lru_cache() def _get_address_bin(self): # provides an integer representation of our address return stem.util.connection.address_to_int(self.address) & self._get_mask_bin() def _apply_addrspec(self, rule, addrspec, is_ipv6_only): # Parses the addrspec... # addrspec ::= "*" | ip4spec | ip6spec # Expand IPv4 and IPv6 specific wildcards into /0 entries so we have one # fewer bizarre special case headaches to deal with. if addrspec == '*4': addrspec = '0.0.0.0/0' elif addrspec == '*6' or (addrspec == '*' and is_ipv6_only): addrspec = '[0000:0000:0000:0000:0000:0000:0000:0000]/0' if '/' in addrspec: self.address, addr_extra = addrspec.split('/', 1) else: self.address, addr_extra = addrspec, None if addrspec == '*': self._address_type = _address_type_to_int(AddressType.WILDCARD) self.address = self._masked_bits = None elif stem.util.connection.is_valid_ipv4_address(self.address): # ipv4spec ::= ip4 | ip4 "/" num_ip4_bits | ip4 "/" ip4mask # ip4 ::= an IPv4 address in dotted-quad format # ip4mask ::= an IPv4 mask in dotted-quad format # num_ip4_bits ::= an integer between 0 and 32 if is_ipv6_only: self._skip_rule = True self._address_type = _address_type_to_int(AddressType.IPv4) if addr_extra is None: self._masked_bits = 32 elif stem.util.connection.is_valid_ipv4_address(addr_extra): # provided with an ip4mask try: self._masked_bits = stem.util.connection._get_masked_bits(addr_extra) except ValueError: # mask can't be represented as a number of bits (ex. '255.255.0.255') self._mask = addr_extra self._masked_bits = None elif addr_extra.isdigit(): # provided with a num_ip4_bits self._masked_bits = int(addr_extra) if self._masked_bits < 0 or self._masked_bits > 32: raise ValueError('IPv4 masks must be in the range of 0-32 bits') else: raise ValueError("The '%s' isn't a mask nor number of bits: %s" % (addr_extra, rule)) elif self.address.startswith('[') and self.address.endswith(']') and \ stem.util.connection.is_valid_ipv6_address(self.address[1:-1]): # ip6spec ::= ip6 | ip6 "/" num_ip6_bits # ip6 ::= an IPv6 address, surrounded by square brackets. # num_ip6_bits ::= an integer between 0 and 128 self.address = stem.util.connection.expand_ipv6_address(self.address[1:-1].upper()) self._address_type = _address_type_to_int(AddressType.IPv6) if addr_extra is None: self._masked_bits = 128 elif addr_extra.isdigit(): # provided with a num_ip6_bits self._masked_bits = int(addr_extra) if self._masked_bits < 0 or self._masked_bits > 128: raise ValueError('IPv6 masks must be in the range of 0-128 bits') else: raise ValueError("The '%s' isn't a number of bits: %s" % (addr_extra, rule)) else: raise ValueError("'%s' isn't a wildcard, IPv4, or IPv6 address: %s" % (addrspec, rule)) def _apply_portspec(self, rule, portspec): # Parses the portspec... # portspec ::= "*" | port | port "-" port # port ::= an integer between 1 and 65535, inclusive. # # Due to a tor bug the spec says that we should accept port of zero, but # connections to port zero are never permitted. if portspec == '*': self.min_port, self.max_port = 1, 65535 elif portspec.isdigit(): # provided with a single port if stem.util.connection.is_valid_port(portspec, allow_zero = True): self.min_port = self.max_port = int(portspec) else: raise ValueError("'%s' isn't within a valid port range: %s" % (portspec, rule)) elif '-' in portspec: # provided with a port range port_comp = portspec.split('-', 1) if stem.util.connection.is_valid_port(port_comp, allow_zero = True): self.min_port = int(port_comp[0]) self.max_port = int(port_comp[1]) if self.min_port > self.max_port: raise ValueError("Port range has a lower bound that's greater than its upper bound: %s" % rule) else: raise ValueError('Malformed port range: %s' % rule) else: raise ValueError("Port value isn't a wildcard, integer, or range: %s" % rule) def __hash__(self): if self._hash is None: self._hash = stem.util._hash_attr(self, 'is_accept', 'address', 'min_port', 'max_port') * 1024 + hash(self.get_mask(False)) return self._hash def __eq__(self, other): return hash(self) == hash(other) if isinstance(other, ExitPolicyRule) else False def __ne__(self, other): return not self == other def _address_type_to_int(address_type): return AddressType.index_of(address_type) def _int_to_address_type(address_type_int): return list(AddressType)[address_type_int] class MicroExitPolicyRule(ExitPolicyRule): """ Lighter weight ExitPolicyRule derivative for microdescriptors. """ def __init__(self, is_accept, min_port, max_port): self.is_accept = is_accept self.address = None # wildcard address self.min_port = min_port self.max_port = max_port self._skip_rule = False def is_address_wildcard(self): return True def get_address_type(self): return AddressType.WILDCARD def get_mask(self, cache = True): return None def get_masked_bits(self): return None def __hash__(self): return stem.util._hash_attr(self, 'is_accept', 'min_port', 'max_port', cache = True) def __eq__(self, other): return hash(self) == hash(other) if isinstance(other, MicroExitPolicyRule) else False def __ne__(self, other): return not self == other DEFAULT_POLICY_RULES = tuple([ExitPolicyRule(rule) for rule in ( 'reject *:25', 'reject *:119', 'reject *:135-139', 'reject *:445', 'reject *:563', 'reject *:1214', 'reject *:4661-4666', 'reject *:6346-6429', 'reject *:6699', 'reject *:6881-6999', 'accept *:*', )]) stem-1.7.1/stem/descriptor/0000775000175000017500000000000013411004021016322 5ustar atagaratagar00000000000000stem-1.7.1/stem/descriptor/certificate.py0000664000175000017500000002336113341034346021202 0ustar atagaratagar00000000000000# Copyright 2017-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Parsing for `Tor Ed25519 certificates `_, which are used to validate the key used to sign server descriptors. .. versionadded:: 1.6.0 **Module Overview:** :: Ed25519Certificate - Ed25519 signing key certificate | +- Ed25519CertificateV1 - version 1 Ed25519 certificate | |- is_expired - checks if certificate is presently expired | +- validate - validates signature of a server descriptor | +- parse - reads base64 encoded certificate data Ed25519Extension - extension included within an Ed25519Certificate .. data:: CertType (enum) Purpose of Ed25519 certificate. As new certificate versions are added this enumeration will expand. ============== =========== CertType Description ============== =========== **SIGNING** signing a signing key with an identity key **LINK_CERT** TLS link certificate signed with ed25519 signing key **AUTH** authentication key signed with ed25519 signing key ============== =========== .. data:: ExtensionType (enum) Recognized exception types. ==================== =========== ExtensionType Description ==================== =========== **HAS_SIGNING_KEY** includes key used to sign the certificate ==================== =========== .. data:: ExtensionFlag (enum) Flags that can be assigned to Ed25519 certificate extensions. ====================== =========== ExtensionFlag Description ====================== =========== **AFFECTS_VALIDATION** extension affects whether the certificate is valid **UNKNOWN** extension includes flags not yet recognized by stem ====================== =========== """ import base64 import binascii import collections import datetime import hashlib import stem.prereq import stem.util.enum import stem.util.str_tools ED25519_HEADER_LENGTH = 40 ED25519_SIGNATURE_LENGTH = 64 ED25519_ROUTER_SIGNATURE_PREFIX = b'Tor router descriptor signature v1' CertType = stem.util.enum.UppercaseEnum('SIGNING', 'LINK_CERT', 'AUTH') ExtensionType = stem.util.enum.Enum(('HAS_SIGNING_KEY', 4),) ExtensionFlag = stem.util.enum.UppercaseEnum('AFFECTS_VALIDATION', 'UNKNOWN') class Ed25519Extension(collections.namedtuple('Ed25519Extension', ['type', 'flags', 'flag_int', 'data'])): """ Extension within an Ed25519 certificate. :var int type: extension type :var list flags: extension attribute flags :var int flag_int: integer encoding of the extension attribute flags :var bytes data: data the extension concerns """ class Ed25519Certificate(object): """ Base class for an Ed25519 certificate. :var int version: certificate format version :var str encoded: base64 encoded ed25519 certificate """ def __init__(self, version, encoded): self.version = version self.encoded = encoded @staticmethod def parse(content): """ Parses the given base64 encoded data as an Ed25519 certificate. :param str content: base64 encoded certificate :returns: :class:`~stem.descriptor.certificate.Ed25519Certificate` subclsss for the given certificate :raises: **ValueError** if content is malformed """ try: decoded = base64.b64decode(stem.util.str_tools._to_bytes(content)) if not decoded: raise TypeError('empty') except (TypeError, binascii.Error) as exc: raise ValueError("Ed25519 certificate wasn't propoerly base64 encoded (%s):\n%s" % (exc, content)) version = stem.util.str_tools._to_int(decoded[0:1]) if version == 1: return Ed25519CertificateV1(version, content, decoded) else: raise ValueError('Ed25519 certificate is version %i. Parser presently only supports version 1.' % version) class Ed25519CertificateV1(Ed25519Certificate): """ Version 1 Ed25519 certificate, which are used for signing tor server descriptors. :var CertType type: certificate purpose :var datetime expiration: expiration of the certificate :var int key_type: format of the key :var bytes key: key content :var list extensions: :class:`~stem.descriptor.certificate.Ed25519Extension` in this certificate :var bytes signature: certificate signature """ def __init__(self, version, encoded, decoded): super(Ed25519CertificateV1, self).__init__(version, encoded) if len(decoded) < ED25519_HEADER_LENGTH + ED25519_SIGNATURE_LENGTH: raise ValueError('Ed25519 certificate was %i bytes, but should be at least %i' % (len(decoded), ED25519_HEADER_LENGTH + ED25519_SIGNATURE_LENGTH)) cert_type = stem.util.str_tools._to_int(decoded[1:2]) if cert_type in (0, 1, 2, 3): raise ValueError('Ed25519 certificate cannot have a type of %i. This is reserved to avoid conflicts with tor CERTS cells.' % cert_type) elif cert_type == 4: self.type = CertType.SIGNING elif cert_type == 5: self.type = CertType.LINK_CERT elif cert_type == 6: self.type = CertType.AUTH elif cert_type == 7: raise ValueError('Ed25519 certificate cannot have a type of 7. This is reserved for RSA identity cross-certification.') else: raise ValueError("BUG: Ed25519 certificate type is decoded from one byte. It shouldn't be possible to have a value of %i." % cert_type) # expiration time is in hours since epoch try: self.expiration = datetime.datetime.utcfromtimestamp(stem.util.str_tools._to_int(decoded[2:6]) * 3600) except ValueError as exc: raise ValueError('Invalid expiration timestamp (%s): %s' % (exc, stem.util.str_tools._to_int(decoded[2:6]) * 3600)) self.key_type = stem.util.str_tools._to_int(decoded[6:7]) self.key = decoded[7:39] self.signature = decoded[-ED25519_SIGNATURE_LENGTH:] self.extensions = [] extension_count = stem.util.str_tools._to_int(decoded[39:40]) remaining_data = decoded[40:-ED25519_SIGNATURE_LENGTH] for i in range(extension_count): if len(remaining_data) < 4: raise ValueError('Ed25519 extension is missing header field data') extension_length = stem.util.str_tools._to_int(remaining_data[:2]) extension_type = stem.util.str_tools._to_int(remaining_data[2:3]) extension_flags = stem.util.str_tools._to_int(remaining_data[3:4]) extension_data = remaining_data[4:4 + extension_length] if extension_length != len(extension_data): raise ValueError("Ed25519 extension is truncated. It should have %i bytes of data but there's only %i." % (extension_length, len(extension_data))) flags, remaining_flags = [], extension_flags if remaining_flags % 2 == 1: flags.append(ExtensionFlag.AFFECTS_VALIDATION) remaining_flags -= 1 if remaining_flags: flags.append(ExtensionFlag.UNKNOWN) if extension_type == ExtensionType.HAS_SIGNING_KEY and len(extension_data) != 32: raise ValueError('Ed25519 HAS_SIGNING_KEY extension must be 32 bytes, but was %i.' % len(extension_data)) self.extensions.append(Ed25519Extension(extension_type, flags, extension_flags, extension_data)) remaining_data = remaining_data[4 + extension_length:] if remaining_data: raise ValueError('Ed25519 certificate had %i bytes of unused extension data' % len(remaining_data)) def is_expired(self): """ Checks if this certificate is presently expired or not. :returns: **True** if the certificate has expired, **False** otherwise """ return datetime.datetime.now() > self.expiration def validate(self, server_descriptor): """ Validates our signing key and that the given descriptor content matches its Ed25519 signature. :param stem.descriptor.server_descriptor.Ed25519 server_descriptor: relay server descriptor to validate :raises: * **ValueError** if signing key or descriptor are invalid * **ImportError** if pynacl module is unavailable """ if not stem.prereq._is_pynacl_available(): raise ImportError('Certificate validation requires the pynacl module') import nacl.signing import nacl.encoding from nacl.exceptions import BadSignatureError descriptor_content = server_descriptor.get_bytes() signing_key = None if server_descriptor.ed25519_master_key: signing_key = nacl.signing.VerifyKey(stem.util.str_tools._to_bytes(server_descriptor.ed25519_master_key) + b'=', encoder = nacl.encoding.Base64Encoder) else: for extension in self.extensions: if extension.type == ExtensionType.HAS_SIGNING_KEY: signing_key = nacl.signing.VerifyKey(extension.data) break if not signing_key: raise ValueError('Server descriptor missing an ed25519 signing key') try: signing_key.verify(base64.b64decode(stem.util.str_tools._to_bytes(self.encoded))[:-ED25519_SIGNATURE_LENGTH], self.signature) except BadSignatureError as exc: raise ValueError('Ed25519KeyCertificate signing key is invalid (%s)' % exc) # ed25519 signature validates descriptor content up until the signature itself if b'router-sig-ed25519 ' not in descriptor_content: raise ValueError("Descriptor doesn't have a router-sig-ed25519 entry.") signed_content = descriptor_content[:descriptor_content.index(b'router-sig-ed25519 ') + 19] descriptor_sha256_digest = hashlib.sha256(ED25519_ROUTER_SIGNATURE_PREFIX + signed_content).digest() missing_padding = len(server_descriptor.ed25519_signature) % 4 signature_bytes = base64.b64decode(stem.util.str_tools._to_bytes(server_descriptor.ed25519_signature) + b'=' * missing_padding) try: verify_key = nacl.signing.VerifyKey(self.key) verify_key.verify(descriptor_sha256_digest, signature_bytes) except BadSignatureError as exc: raise ValueError('Descriptor Ed25519 certificate signature invalid (%s)' % exc) stem-1.7.1/stem/descriptor/reader.py0000664000175000017500000004477113411002341020156 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Utilities for reading descriptors from local directories and archives. This is mostly done through the :class:`~stem.descriptor.reader.DescriptorReader` class, which is an iterator for the descriptor data in a series of destinations. For example... :: my_descriptors = [ '/tmp/server-descriptors-2012-03.tar.bz2', '/tmp/archived_descriptors/', ] # prints the contents of all the descriptor files with DescriptorReader(my_descriptors) as reader: for descriptor in reader: print descriptor This ignores files that cannot be processed due to read errors or unparsable content. To be notified of skipped files you can register a listener with :func:`~stem.descriptor.reader.DescriptorReader.register_skip_listener`. The :class:`~stem.descriptor.reader.DescriptorReader` keeps track of the last modified timestamps for descriptor files that it has read so it can skip unchanged files if run again. This listing of processed files can also be persisted and applied to other :class:`~stem.descriptor.reader.DescriptorReader` instances. For example, the following prints descriptors as they're changed over the course of a minute, and picks up where it left off if run again... :: reader = DescriptorReader(['/tmp/descriptor_data']) try: processed_files = load_processed_files('/tmp/used_descriptors') reader.set_processed_files(processed_files) except: pass # could not load, maybe this is the first run start_time = time.time() while (time.time() - start_time) < 60: # prints any descriptors that have changed since last checked with reader: for descriptor in reader: print descriptor time.sleep(1) save_processed_files('/tmp/used_descriptors', reader.get_processed_files()) **Module Overview:** :: load_processed_files - Loads a listing of processed files save_processed_files - Saves a listing of processed files DescriptorReader - Iterator for descriptor data on the local file system |- get_processed_files - provides the listing of files that we've processed |- set_processed_files - sets our tracking of the files we have processed |- register_read_listener - adds a listener for when files are read |- register_skip_listener - adds a listener that's notified of skipped files |- start - begins reading descriptor data |- stop - stops reading descriptor data |- __enter__ / __exit__ - manages the descriptor reader thread in the context +- __iter__ - iterates over descriptor data in unread files FileSkipped - Base exception for a file that was skipped |- AlreadyRead - We've already read a file with this last modified timestamp |- ParsingFailure - Contents can't be parsed as descriptor data |- UnrecognizedType - File extension indicates non-descriptor data +- ReadFailed - Wraps an error that was raised while reading the file +- FileMissing - File does not exist """ import mimetypes import os import tarfile import threading try: import queue except ImportError: import Queue as queue import stem.descriptor import stem.prereq import stem.util import stem.util.str_tools import stem.util.system # flag to indicate when the reader thread is out of descriptor files to read FINISHED = 'DONE' class FileSkipped(Exception): "Base error when we can't provide descriptor data from a file." class AlreadyRead(FileSkipped): """ Already read a file with this 'last modified' timestamp or later. :param int last_modified: unix timestamp for when the file was last modified :param int last_modified_when_read: unix timestamp for the modification time when we last read this file """ def __init__(self, last_modified, last_modified_when_read): super(AlreadyRead, self).__init__('File has already been read since it was last modified. modification time: %s, last read: %s' % (last_modified, last_modified_when_read)) self.last_modified = last_modified self.last_modified_when_read = last_modified_when_read class ParsingFailure(FileSkipped): """ File contents could not be parsed as descriptor data. :param ValueError exception: issue that arose when parsing """ def __init__(self, parsing_exception): super(ParsingFailure, self).__init__(parsing_exception) self.exception = parsing_exception class UnrecognizedType(FileSkipped): """ File doesn't contain descriptor data. This could either be due to its file type or because it doesn't conform to a recognizable descriptor type. :param tuple mime_type: the (type, encoding) tuple provided by mimetypes.guess_type() """ def __init__(self, mime_type): super(UnrecognizedType, self).__init__('Unrecognized mime type: %s (%s)' % mime_type) self.mime_type = mime_type class ReadFailed(FileSkipped): """ An IOError occurred while trying to read the file. :param IOError exception: issue that arose when reading the file, **None** if this arose due to the file not being present """ def __init__(self, read_exception): super(ReadFailed, self).__init__(read_exception) self.exception = read_exception class FileMissing(ReadFailed): 'File does not exist.' def __init__(self): super(FileMissing, self).__init__('File does not exist') def load_processed_files(path): """ Loads a dictionary of 'path => last modified timestamp' mappings, as persisted by :func:`~stem.descriptor.reader.save_processed_files`, from a file. :param str path: location to load the processed files dictionary from :returns: **dict** of 'path (**str**) => last modified unix timestamp (**int**)' mappings :raises: * **IOError** if unable to read the file * **TypeError** if unable to parse the file's contents """ processed_files = {} with open(path, 'rb') as input_file: for line in input_file.readlines(): line = stem.util.str_tools._to_unicode(line.strip()) if not line: continue # skip blank lines if ' ' not in line: raise TypeError('Malformed line: %s' % line) path, timestamp = line.rsplit(' ', 1) if not os.path.isabs(path): raise TypeError("'%s' is not an absolute path" % path) elif not timestamp.isdigit(): raise TypeError("'%s' is not an integer timestamp" % timestamp) processed_files[path] = int(timestamp) return processed_files def save_processed_files(path, processed_files): """ Persists a dictionary of 'path => last modified timestamp' mappings (as provided by the DescriptorReader's :func:`~stem.descriptor.reader.DescriptorReader.get_processed_files` method) so that they can be loaded later and applied to another :class:`~stem.descriptor.reader.DescriptorReader`. :param str path: location to save the processed files dictionary to :param dict processed_files: 'path => last modified' mappings :raises: * **IOError** if unable to write to the file * **TypeError** if processed_files is of the wrong type """ # makes the parent directory if it doesn't already exist try: path_dir = os.path.dirname(path) if not os.path.exists(path_dir): os.makedirs(path_dir) except OSError as exc: raise IOError(exc) with open(path, 'w') as output_file: for path, timestamp in list(processed_files.items()): if not os.path.isabs(path): raise TypeError('Only absolute paths are acceptable: %s' % path) output_file.write('%s %i\n' % (path, timestamp)) class DescriptorReader(object): """ Iterator for the descriptor data on the local file system. This can process text files, tarball archives (gzip or bzip2), or recurse directories. By default this limits the number of descriptors that we'll read ahead before waiting for our caller to fetch some of them. This is included to avoid unbounded memory usage. Our persistence_path argument is a convenient method to persist the listing of files we have processed between runs, however it doesn't allow for error handling. If you want that then use the :func:`~stem.descriptor.reader.load_processed_files` and :func:`~stem.descriptor.reader.save_processed_files` functions instead. :param str,list target: path or list of paths for files or directories to be read from :param bool validate: checks the validity of the descriptor's content if **True**, skips these checks otherwise :param bool follow_links: determines if we'll follow symlinks when traversing directories (requires python 2.6) :param int buffer_size: descriptors we'll buffer before waiting for some to be read, this is unbounded if zero :param str persistence_path: if set we will load and save processed file listings from this path, errors are ignored :param stem.descriptor.__init__.DocumentHandler document_handler: method in which to parse :class:`~stem.descriptor.networkstatus.NetworkStatusDocument` :param dict kwargs: additional arguments for the descriptor constructor """ def __init__(self, target, validate = False, follow_links = False, buffer_size = 100, persistence_path = None, document_handler = stem.descriptor.DocumentHandler.ENTRIES, **kwargs): self._targets = [target] if stem.util._is_str(target) else target # expand any relative paths we got self._targets = list(map(os.path.abspath, self._targets)) self._validate = validate self._follow_links = follow_links self._persistence_path = persistence_path self._document_handler = document_handler self._kwargs = kwargs self._read_listeners = [] self._skip_listeners = [] self._processed_files = {} self._reader_thread = None self._reader_thread_lock = threading.RLock() self._iter_lock = threading.RLock() self._iter_notice = threading.Event() self._is_stopped = threading.Event() self._is_stopped.set() # Descriptors that we have read but not yet provided to the caller. A # FINISHED entry is used by the reading thread to indicate the end. self._unreturned_descriptors = queue.Queue(buffer_size) if self._persistence_path: try: processed_files = load_processed_files(self._persistence_path) self.set_processed_files(processed_files) except: pass def get_processed_files(self): """ For each file that we have read descriptor data from this provides a mapping of the form... :: absolute path (str) => last modified unix timestamp (int) This includes entries set through the :func:`~stem.descriptor.reader.DescriptorReader.set_processed_files` method. Each run resets this to only the files that were present during that run. :returns: **dict** with the absolute paths and unix timestamp for the last modified times of the files we have processed """ # make sure that we only provide back absolute paths return dict((os.path.abspath(k), v) for (k, v) in list(self._processed_files.items())) def set_processed_files(self, processed_files): """ Sets the listing of the files we have processed. Most often this is used with a newly created :class:`~stem.descriptor.reader.DescriptorReader` to pre-populate the listing of descriptor files that we have seen. :param dict processed_files: mapping of absolute paths (**str**) to unix timestamps for the last modified time (**int**) """ self._processed_files = dict(processed_files) def register_read_listener(self, listener): """ Registers a listener for when files are read. This is executed prior to processing files. Listeners are expected to be of the form... :: my_listener(path) :param functor listener: functor to be notified when files are read """ self._read_listeners.append(listener) def register_skip_listener(self, listener): """ Registers a listener for files that are skipped. This listener is expected to be a functor of the form... :: my_listener(path, exception) :param functor listener: functor to be notified of files that are skipped to read errors or because they couldn't be parsed as valid descriptor data """ self._skip_listeners.append(listener) def get_buffered_descriptor_count(self): """ Provides the number of descriptors that are waiting to be iterated over. This is limited to the buffer_size that we were constructed with. :returns: **int** for the estimated number of currently enqueued descriptors, this is not entirely reliable """ return self._unreturned_descriptors.qsize() def start(self): """ Starts reading our descriptor files. :raises: **ValueError** if we're already reading the descriptor files """ with self._reader_thread_lock: if self._reader_thread: raise ValueError('Already running, you need to call stop() first') else: self._is_stopped.clear() self._reader_thread = threading.Thread(target = self._read_descriptor_files, name='Descriptor reader') self._reader_thread.setDaemon(True) self._reader_thread.start() def stop(self): """ Stops further reading of descriptor files. """ with self._reader_thread_lock: self._is_stopped.set() self._iter_notice.set() # clears our queue to unblock enqueue calls try: while True: self._unreturned_descriptors.get_nowait() except queue.Empty: pass self._reader_thread.join() self._reader_thread = None if self._persistence_path: try: processed_files = self.get_processed_files() save_processed_files(self._persistence_path, processed_files) except: pass def _read_descriptor_files(self): new_processed_files = {} remaining_files = list(self._targets) while remaining_files and not self._is_stopped.is_set(): target = remaining_files.pop(0) if not os.path.exists(target): self._notify_skip_listeners(target, FileMissing()) continue if os.path.isdir(target): walker = os.walk(target, followlinks = self._follow_links) self._handle_walker(walker, new_processed_files) else: self._handle_file(target, new_processed_files) self._processed_files = new_processed_files if not self._is_stopped.is_set(): self._unreturned_descriptors.put(FINISHED) self._iter_notice.set() def __iter__(self): with self._iter_lock: while not self._is_stopped.is_set(): try: descriptor = self._unreturned_descriptors.get_nowait() if descriptor == FINISHED: break else: yield descriptor except queue.Empty: self._iter_notice.wait() self._iter_notice.clear() def _handle_walker(self, walker, new_processed_files): for root, _, files in walker: for filename in files: self._handle_file(os.path.join(root, filename), new_processed_files) # this can take a while if, say, we're including the root directory if self._is_stopped.is_set(): return def _handle_file(self, target, new_processed_files): # This is a file. Register its last modified timestamp and check if # it's a file that we should skip. try: last_modified = int(os.stat(target).st_mtime) last_used = self._processed_files.get(target) new_processed_files[target] = last_modified except OSError as exc: self._notify_skip_listeners(target, ReadFailed(exc)) return if last_used and last_used >= last_modified: self._notify_skip_listeners(target, AlreadyRead(last_modified, last_used)) return # Block devices and such are never descriptors, and can cause us to block # for quite a while so skipping anything that isn't a regular file. if not os.path.isfile(target): return # The mimetypes module only checks the file extension. To actually # check the content (like the 'file' command) we'd need something like # pymagic (https://github.com/cloudburst/pymagic). target_type = mimetypes.guess_type(target) if target_type[0] in (None, 'text/plain'): # either '.txt' or an unknown type self._handle_descriptor_file(target, target_type) elif stem.util.system.is_tarfile(target): # handles gzip, bz2, and decompressed tarballs among others self._handle_archive(target) else: self._notify_skip_listeners(target, UnrecognizedType(target_type)) def _handle_descriptor_file(self, target, mime_type): try: self._notify_read_listeners(target) with open(target, 'rb') as target_file: for desc in stem.descriptor.parse_file(target_file, validate = self._validate, document_handler = self._document_handler, **self._kwargs): if self._is_stopped.is_set(): return self._unreturned_descriptors.put(desc) self._iter_notice.set() except TypeError: self._notify_skip_listeners(target, UnrecognizedType(mime_type)) except ValueError as exc: self._notify_skip_listeners(target, ParsingFailure(exc)) except IOError as exc: self._notify_skip_listeners(target, ReadFailed(exc)) def _handle_archive(self, target): # TODO: When dropping python 2.6 support go back to using 'with' for # tarfiles... # # http://bugs.python.org/issue7232 tar_file = None try: self._notify_read_listeners(target) tar_file = tarfile.open(target) for tar_entry in tar_file: if tar_entry.isfile(): entry = tar_file.extractfile(tar_entry) try: for desc in stem.descriptor.parse_file(entry, validate = self._validate, document_handler = self._document_handler, **self._kwargs): if self._is_stopped.is_set(): return desc._set_path(os.path.abspath(target)) desc._set_archive_path(tar_entry.name) self._unreturned_descriptors.put(desc) self._iter_notice.set() except TypeError as exc: self._notify_skip_listeners(target, ParsingFailure(exc)) except ValueError as exc: self._notify_skip_listeners(target, ParsingFailure(exc)) finally: entry.close() except IOError as exc: self._notify_skip_listeners(target, ReadFailed(exc)) finally: if tar_file: tar_file.close() def _notify_read_listeners(self, path): for listener in self._read_listeners: listener(path) def _notify_skip_listeners(self, path, exception): for listener in self._skip_listeners: listener(path, exception) def __enter__(self): self.start() return self def __exit__(self, exit_type, value, traceback): self.stop() stem-1.7.1/stem/descriptor/networkstatus.py0000664000175000017500000021335713411002341021647 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Parsing for Tor network status documents. This supports both the v2 and v3 `dir-spec `_. Documents can be obtained from a few sources... * The 'cached-consensus' file in Tor's data directory. * Archived descriptors provided by `CollecTor `_. * Directory authorities and mirrors via their DirPort. ... and contain the following sections... * document header * list of :class:`stem.descriptor.networkstatus.DirectoryAuthority` * list of :class:`stem.descriptor.router_status_entry.RouterStatusEntry` * document footer **For a great graphical overview see** `Jordan Wright's chart describing the anatomy of the consensus `_. Of these, the router status entry section can be quite large (on the order of hundreds of kilobytes). As such we provide a couple of methods for reading network status documents through :func:`~stem.descriptor.__init__.parse_file`. For more information see :func:`~stem.descriptor.__init__.DocumentHandler`... :: from stem.descriptor import parse_file, DocumentHandler with open('.tor/cached-consensus', 'rb') as consensus_file: # Processes the routers as we read them in. The routers refer to a document # with an unset 'routers' attribute. for router in parse_file(consensus_file, 'network-status-consensus-3 1.0', document_handler = DocumentHandler.ENTRIES): print router.nickname **Module Overview:** :: NetworkStatusDocument - Network status document |- NetworkStatusDocumentV2 - Version 2 network status document |- NetworkStatusDocumentV3 - Version 3 network status document +- BridgeNetworkStatusDocument - Version 3 network status document for bridges KeyCertificate - Certificate used to authenticate an authority DocumentSignature - Signature of a document by a directory authority DirectoryAuthority - Directory authority as defined in a v3 network status document """ import collections import io import stem.descriptor.router_status_entry import stem.util.str_tools import stem.util.tor_tools import stem.version from stem.descriptor import ( PGP_BLOCK_END, Descriptor, DocumentHandler, _descriptor_content, _descriptor_components, _read_until_keywords, _value, _parse_simple_line, _parse_if_present, _parse_timestamp_line, _parse_forty_character_hex, _parse_protocol_line, _parse_key_block, _mappings_for, _random_nickname, _random_fingerprint, _random_ipv4_address, _random_date, _random_crypto_blob, ) from stem.descriptor.router_status_entry import ( RouterStatusEntryV2, RouterStatusEntryV3, RouterStatusEntryMicroV3, ) # Version 2 network status document fields, tuples of the form... # (keyword, is_mandatory) NETWORK_STATUS_V2_FIELDS = ( ('network-status-version', True), ('dir-source', True), ('fingerprint', True), ('contact', True), ('dir-signing-key', True), ('client-versions', False), ('server-versions', False), ('published', True), ('dir-options', False), ('directory-signature', True), ) # Network status document are either a 'vote' or 'consensus', with different # mandatory fields for each. Both though require that their fields appear in a # specific order. This is an ordered listing of the following... # # (field, in_votes, in_consensus, is_mandatory) HEADER_STATUS_DOCUMENT_FIELDS = ( ('network-status-version', True, True, True), ('vote-status', True, True, True), ('consensus-methods', True, False, False), ('consensus-method', False, True, False), ('published', True, False, True), ('valid-after', True, True, True), ('fresh-until', True, True, True), ('valid-until', True, True, True), ('voting-delay', True, True, True), ('client-versions', True, True, False), ('server-versions', True, True, False), ('package', True, True, False), ('known-flags', True, True, True), ('flag-thresholds', True, False, False), ('shared-rand-participate', True, False, False), ('shared-rand-commit', True, False, False), ('shared-rand-previous-value', True, True, False), ('shared-rand-current-value', True, True, False), ('bandwidth-file-headers', True, False, False), ('recommended-client-protocols', True, True, False), ('recommended-relay-protocols', True, True, False), ('required-client-protocols', True, True, False), ('required-relay-protocols', True, True, False), ('params', True, True, False), ) FOOTER_STATUS_DOCUMENT_FIELDS = ( ('directory-footer', True, True, False), ('bandwidth-weights', False, True, False), ('directory-signature', True, True, True), ) AUTH_START = 'dir-source' ROUTERS_START = 'r' FOOTER_START = 'directory-footer' V2_FOOTER_START = 'directory-signature' DEFAULT_PARAMS = { 'bwweightscale': 10000, 'cbtdisabled': 0, 'cbtnummodes': 3, 'cbtrecentcount': 20, 'cbtmaxtimeouts': 18, 'cbtmincircs': 100, 'cbtquantile': 80, 'cbtclosequantile': 95, 'cbttestfreq': 60, 'cbtmintimeout': 2000, 'cbtinitialtimeout': 60000, 'cbtlearntimeout': 180, 'cbtmaxopencircs': 10, 'UseOptimisticData': 1, 'Support022HiddenServices': 1, 'usecreatefast': 1, 'max-consensuses-age-to-cache-for-diff': 72, 'try-diff-for-consensus-newer-than': 72, 'onion-key-rotation-days': 28, 'onion-key-grace-period-days': 7, 'hs_service_max_rdv_failures': 2, 'circ_max_cell_queue_size': 50000, } # KeyCertificate fields, tuple is of the form... # (keyword, is_mandatory) KEY_CERTIFICATE_PARAMS = ( ('dir-key-certificate-version', True), ('dir-address', False), ('fingerprint', True), ('dir-identity-key', True), ('dir-key-published', True), ('dir-key-expires', True), ('dir-signing-key', True), ('dir-key-crosscert', False), ('dir-key-certification', True), ) # all parameters are constrained to int32 range MIN_PARAM, MAX_PARAM = -2147483648, 2147483647 PARAM_RANGE = { 'circwindow': (100, 1000), 'CircuitPriorityHalflifeMsec': (-1, MAX_PARAM), 'perconnbwrate': (-1, MAX_PARAM), 'perconnbwburst': (-1, MAX_PARAM), 'refuseunknownexits': (0, 1), 'bwweightscale': (1, MAX_PARAM), 'cbtdisabled': (0, 1), 'cbtnummodes': (1, 20), 'cbtrecentcount': (3, 1000), 'cbtmaxtimeouts': (3, 10000), 'cbtmincircs': (1, 10000), 'cbtquantile': (10, 99), 'cbtclosequantile': (MIN_PARAM, 99), 'cbttestfreq': (1, MAX_PARAM), 'cbtmintimeout': (500, MAX_PARAM), 'cbtlearntimeout': (10, 60000), 'cbtmaxopencircs': (0, 14), 'UseOptimisticData': (0, 1), 'Support022HiddenServices': (0, 1), 'usecreatefast': (0, 1), 'UseNTorHandshake': (0, 1), 'FastFlagMinThreshold': (4, MAX_PARAM), 'NumDirectoryGuards': (0, 10), 'NumEntryGuards': (1, 10), 'GuardLifetime': (2592000, 157766400), # min: 30 days, max: 1826 days 'NumNTorsPerTAP': (1, 100000), 'AllowNonearlyExtend': (0, 1), 'AuthDirNumSRVAgreements': (1, MAX_PARAM), 'max-consensuses-age-to-cache-for-diff': (0, 8192), 'try-diff-for-consensus-newer-than': (0, 8192), 'onion-key-rotation-days': (1, 90), 'onion-key-grace-period-days': (1, 90), # max is the highest onion-key-rotation-days 'hs_service_max_rdv_failures': (1, 10), 'circ_max_cell_queue_size': (1000, 4294967295), } class PackageVersion(collections.namedtuple('PackageVersion', ['name', 'version', 'url', 'digests'])): """ Latest recommended version of a package that's available. :var str name: name of the package :var str version: latest recommended version :var str url: package's url :var dict digests: mapping of digest types to their value """ class SharedRandomnessCommitment(collections.namedtuple('SharedRandomnessCommitment', ['version', 'algorithm', 'identity', 'commit', 'reveal'])): """ Directory authority's commitment for generating the next shared random value. :var int version: shared randomness protocol version :var str algorithm: hash algorithm used to make the commitment :var str identity: authority's sha1 identity fingerprint :var str commit: base64 encoded commitment hash to the shared random value :var str reveal: base64 encoded commitment to the shared random value, **None** of not provided """ def _parse_file(document_file, document_type = None, validate = False, is_microdescriptor = False, document_handler = DocumentHandler.ENTRIES, **kwargs): """ Parses a network status and iterates over the RouterStatusEntry in it. The document that these instances reference have an empty 'routers' attribute to allow for limited memory usage. :param file document_file: file with network status document content :param class document_type: NetworkStatusDocument subclass :param bool validate: checks the validity of the document's contents if **True**, skips these checks otherwise :param bool is_microdescriptor: **True** if this is for a microdescriptor consensus, **False** otherwise :param stem.descriptor.__init__.DocumentHandler document_handler: method in which to parse :class:`~stem.descriptor.networkstatus.NetworkStatusDocument` :param dict kwargs: additional arguments for the descriptor constructor :returns: :class:`stem.descriptor.networkstatus.NetworkStatusDocument` object :raises: * **ValueError** if the document_version is unrecognized or the contents is malformed and validate is **True** * **IOError** if the file can't be read """ # we can't properly default this since NetworkStatusDocumentV3 isn't defined yet if document_type is None: document_type = NetworkStatusDocumentV3 if document_type == NetworkStatusDocumentV2: document_type, router_type = NetworkStatusDocumentV2, RouterStatusEntryV2 elif document_type == NetworkStatusDocumentV3: router_type = RouterStatusEntryMicroV3 if is_microdescriptor else RouterStatusEntryV3 elif document_type == BridgeNetworkStatusDocument: document_type, router_type = BridgeNetworkStatusDocument, RouterStatusEntryV2 else: raise ValueError("Document type %i isn't recognized (only able to parse v2, v3, and bridge)" % document_type) if document_handler == DocumentHandler.DOCUMENT: yield document_type(document_file.read(), validate, **kwargs) return # getting the document without the routers section header = _read_until_keywords((ROUTERS_START, FOOTER_START, V2_FOOTER_START), document_file) if header and header[0].startswith(b'@type'): header = header[1:] routers_start = document_file.tell() _read_until_keywords((FOOTER_START, V2_FOOTER_START), document_file, skip = True) routers_end = document_file.tell() footer = document_file.readlines() document_content = bytes.join(b'', header + footer) if document_handler == DocumentHandler.BARE_DOCUMENT: yield document_type(document_content, validate, **kwargs) elif document_handler == DocumentHandler.ENTRIES: desc_iterator = stem.descriptor.router_status_entry._parse_file( document_file, validate, entry_class = router_type, entry_keyword = ROUTERS_START, start_position = routers_start, end_position = routers_end, extra_args = (document_type(document_content, validate),), **kwargs ) for desc in desc_iterator: yield desc else: raise ValueError('Unrecognized document_handler: %s' % document_handler) def _parse_file_key_certs(certificate_file, validate = False): """ Parses a file containing one or more authority key certificates. :param file certificate_file: file with key certificates :param bool validate: checks the validity of the certificate's contents if **True**, skips these checks otherwise :returns: iterator for :class:`stem.descriptor.networkstatus.KeyCertificate` instance in the file :raises: * **ValueError** if the key certificate content is invalid and validate is **True** * **IOError** if the file can't be read """ while True: keycert_content = _read_until_keywords('dir-key-certification', certificate_file) # we've reached the 'router-signature', now include the pgp style block block_end_prefix = PGP_BLOCK_END.split(' ', 1)[0] keycert_content += _read_until_keywords(block_end_prefix, certificate_file, True) if keycert_content: yield stem.descriptor.networkstatus.KeyCertificate(bytes.join(b'', keycert_content), validate = validate) else: break # done parsing file class NetworkStatusDocument(Descriptor): """ Common parent for network status documents. """ def _parse_version_line(keyword, attribute, expected_version): def _parse(descriptor, entries): value = _value(keyword, entries) if not value.isdigit(): raise ValueError('Document has a non-numeric version: %s %s' % (keyword, value)) setattr(descriptor, attribute, int(value)) if int(value) != expected_version: raise ValueError("Expected a version %i document, but got version '%s' instead" % (expected_version, value)) return _parse def _parse_dir_source_line(descriptor, entries): value = _value('dir-source', entries) dir_source_comp = value.split() if len(dir_source_comp) < 3: raise ValueError("The 'dir-source' line of a v2 network status document must have three values: dir-source %s" % value) if not dir_source_comp[0]: # https://trac.torproject.org/7055 raise ValueError("Authority's hostname can't be blank: dir-source %s" % value) elif not stem.util.connection.is_valid_ipv4_address(dir_source_comp[1]): raise ValueError("Authority's address isn't a valid IPv4 address: %s" % dir_source_comp[1]) elif not stem.util.connection.is_valid_port(dir_source_comp[2], allow_zero = True): raise ValueError("Authority's DirPort is invalid: %s" % dir_source_comp[2]) descriptor.hostname = dir_source_comp[0] descriptor.address = dir_source_comp[1] descriptor.dir_port = None if dir_source_comp[2] == '0' else int(dir_source_comp[2]) _parse_network_status_version_line = _parse_version_line('network-status-version', 'version', 2) _parse_fingerprint_line = _parse_forty_character_hex('fingerprint', 'fingerprint') _parse_contact_line = _parse_simple_line('contact', 'contact') _parse_dir_signing_key_line = _parse_key_block('dir-signing-key', 'signing_key', 'RSA PUBLIC KEY') _parse_client_versions_line = _parse_simple_line('client-versions', 'client_versions', func = lambda v: v.split(',')) _parse_server_versions_line = _parse_simple_line('server-versions', 'server_versions', func = lambda v: v.split(',')) _parse_published_line = _parse_timestamp_line('published', 'published') _parse_dir_options_line = _parse_simple_line('dir-options', 'options', func = lambda v: v.split()) _parse_directory_signature_line = _parse_key_block('directory-signature', 'signature', 'SIGNATURE', value_attribute = 'signing_authority') class NetworkStatusDocumentV2(NetworkStatusDocument): """ Version 2 network status document. These have been deprecated and are no longer generated by Tor. :var dict routers: fingerprints to :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV2` contained in the document :var int version: **\*** document version :var str hostname: **\*** hostname of the authority :var str address: **\*** authority's IP address :var int dir_port: **\*** authority's DirPort :var str fingerprint: **\*** authority's fingerprint :var str contact: **\*** authority's contact information :var str signing_key: **\*** authority's public signing key :var list client_versions: list of recommended client tor version strings :var list server_versions: list of recommended server tor version strings :var datetime published: **\*** time when the document was published :var list options: **\*** list of things that this authority decides :var str signing_authority: **\*** name of the authority signing the document :var str signature: **\*** authority's signature for the document **\*** attribute is either required when we're parsed with validation or has a default value, others are left as **None** if undefined """ ATTRIBUTES = { 'version': (None, _parse_network_status_version_line), 'hostname': (None, _parse_dir_source_line), 'address': (None, _parse_dir_source_line), 'dir_port': (None, _parse_dir_source_line), 'fingerprint': (None, _parse_fingerprint_line), 'contact': (None, _parse_contact_line), 'signing_key': (None, _parse_dir_signing_key_line), 'client_versions': ([], _parse_client_versions_line), 'server_versions': ([], _parse_server_versions_line), 'published': (None, _parse_published_line), 'options': ([], _parse_dir_options_line), 'signing_authority': (None, _parse_directory_signature_line), 'signatures': (None, _parse_directory_signature_line), } PARSER_FOR_LINE = { 'network-status-version': _parse_network_status_version_line, 'dir-source': _parse_dir_source_line, 'fingerprint': _parse_fingerprint_line, 'contact': _parse_contact_line, 'dir-signing-key': _parse_dir_signing_key_line, 'client-versions': _parse_client_versions_line, 'server-versions': _parse_server_versions_line, 'published': _parse_published_line, 'dir-options': _parse_dir_options_line, 'directory-signature': _parse_directory_signature_line, } @classmethod def content(cls, attr = None, exclude = (), sign = False): if sign: raise NotImplementedError('Signing of %s not implemented' % cls.__name__) return _descriptor_content(attr, exclude, ( ('network-status-version', '2'), ('dir-source', '%s %s 80' % (_random_ipv4_address(), _random_ipv4_address())), ('fingerprint', _random_fingerprint()), ('contact', 'arma at mit dot edu'), ('published', _random_date()), ('dir-signing-key', _random_crypto_blob('RSA PUBLIC KEY')), ), ( ('directory-signature', 'moria2' + _random_crypto_blob('SIGNATURE')), )) def __init__(self, raw_content, validate = False): super(NetworkStatusDocumentV2, self).__init__(raw_content, lazy_load = not validate) # Splitting the document from the routers. Unlike v3 documents we're not # bending over backwards on the validation by checking the field order or # that header/footer attributes aren't in the wrong section. This is a # deprecated descriptor type - patches welcome if you want those checks. document_file = io.BytesIO(raw_content) document_content = bytes.join(b'', _read_until_keywords((ROUTERS_START, V2_FOOTER_START), document_file)) router_iter = stem.descriptor.router_status_entry._parse_file( document_file, validate, entry_class = RouterStatusEntryV2, entry_keyword = ROUTERS_START, section_end_keywords = (V2_FOOTER_START,), extra_args = (self,), ) self.routers = dict((desc.fingerprint, desc) for desc in router_iter) entries = _descriptor_components(document_content + b'\n' + document_file.read(), validate) if validate: self._check_constraints(entries) self._parse(entries, validate) # 'client-versions' and 'server-versions' are only required if 'Versions' # is among the options if 'Versions' in self.options and not ('client-versions' in entries and 'server-versions' in entries): raise ValueError("Version 2 network status documents must have a 'client-versions' and 'server-versions' when 'Versions' is listed among its dir-options:\n%s" % str(self)) else: self._entries = entries def _check_constraints(self, entries): required_fields = [field for (field, is_mandatory) in NETWORK_STATUS_V2_FIELDS if is_mandatory] for keyword in required_fields: if keyword not in entries: raise ValueError("Network status document (v2) must have a '%s' line:\n%s" % (keyword, str(self))) # all recognized fields can only appear once single_fields = [field for (field, _) in NETWORK_STATUS_V2_FIELDS] for keyword in single_fields: if keyword in entries and len(entries[keyword]) > 1: raise ValueError("Network status document (v2) can only have a single '%s' line, got %i:\n%s" % (keyword, len(entries[keyword]), str(self))) if 'network-status-version' != list(entries.keys())[0]: raise ValueError("Network status document (v2) are expected to start with a 'network-status-version' line:\n%s" % str(self)) def _parse_header_network_status_version_line(descriptor, entries): # "network-status-version" version value = _value('network-status-version', entries) if ' ' in value: version, flavor = value.split(' ', 1) else: version, flavor = value, None if not version.isdigit(): raise ValueError('Network status document has a non-numeric version: network-status-version %s' % value) descriptor.version = int(version) descriptor.version_flavor = flavor descriptor.is_microdescriptor = flavor == 'microdesc' if descriptor.version != 3: raise ValueError("Expected a version 3 network status document, got version '%s' instead" % descriptor.version) def _parse_header_vote_status_line(descriptor, entries): # "vote-status" type # # The consensus-method and consensus-methods fields are optional since # they weren't included in version 1. Setting a default now that we # know if we're a vote or not. value = _value('vote-status', entries) if value == 'consensus': descriptor.is_consensus, descriptor.is_vote = True, False elif value == 'vote': descriptor.is_consensus, descriptor.is_vote = False, True else: raise ValueError("A network status document's vote-status line can only be 'consensus' or 'vote', got '%s' instead" % value) def _parse_header_consensus_methods_line(descriptor, entries): # "consensus-methods" IntegerList if descriptor._lazy_loading and descriptor.is_vote: descriptor.consensus_methods = [1] value, consensus_methods = _value('consensus-methods', entries), [] for entry in value.split(' '): if not entry.isdigit(): raise ValueError("A network status document's consensus-methods must be a list of integer values, but was '%s'" % value) consensus_methods.append(int(entry)) descriptor.consensus_methods = consensus_methods def _parse_header_consensus_method_line(descriptor, entries): # "consensus-method" Integer if descriptor._lazy_loading and descriptor.is_consensus: descriptor.consensus_method = 1 value = _value('consensus-method', entries) if not value.isdigit(): raise ValueError("A network status document's consensus-method must be an integer, but was '%s'" % value) descriptor.consensus_method = int(value) def _parse_header_voting_delay_line(descriptor, entries): # "voting-delay" VoteSeconds DistSeconds value = _value('voting-delay', entries) value_comp = value.split(' ') if len(value_comp) == 2 and value_comp[0].isdigit() and value_comp[1].isdigit(): descriptor.vote_delay = int(value_comp[0]) descriptor.dist_delay = int(value_comp[1]) else: raise ValueError("A network status document's 'voting-delay' line must be a pair of integer values, but was '%s'" % value) def _parse_versions_line(keyword, attribute): def _parse(descriptor, entries): value, entries = _value(keyword, entries), [] for entry in value.split(','): try: entries.append(stem.version._get_version(entry)) except ValueError: raise ValueError("Network status document's '%s' line had '%s', which isn't a parsable tor version: %s %s" % (keyword, entry, keyword, value)) setattr(descriptor, attribute, entries) return _parse def _parse_header_flag_thresholds_line(descriptor, entries): # "flag-thresholds" SP THRESHOLDS value, thresholds = _value('flag-thresholds', entries).strip(), {} for key, val in _mappings_for('flag-thresholds', value): try: if val.endswith('%'): # opting for string manipulation rather than just # 'float(entry_value) / 100' because floating point arithmetic # will lose precision thresholds[key] = float('0.' + val[:-1].replace('.', '', 1)) elif '.' in val: thresholds[key] = float(val) else: thresholds[key] = int(val) except ValueError: raise ValueError("Network status document's 'flag-thresholds' line is expected to have float values, got: flag-thresholds %s" % value) descriptor.flag_thresholds = thresholds def _parse_header_parameters_line(descriptor, entries): # "params" [Parameters] # Parameter ::= Keyword '=' Int32 # Int32 ::= A decimal integer between -2147483648 and 2147483647. # Parameters ::= Parameter | Parameters SP Parameter if descriptor._lazy_loading: descriptor.params = dict(DEFAULT_PARAMS) if descriptor._default_params else {} value = _value('params', entries) if value != '': descriptor.params = _parse_int_mappings('params', value, True) descriptor._check_params_constraints() def _parse_directory_footer_line(descriptor, entries): # nothing to parse, simply checking that we don't have a value value = _value('directory-footer', entries) if value: raise ValueError("A network status document's 'directory-footer' line shouldn't have any content, got 'directory-footer %s'" % value) def _parse_footer_directory_signature_line(descriptor, entries): signatures = [] for sig_value, block_type, block_contents in entries['directory-signature']: if sig_value.count(' ') not in (1, 2): raise ValueError("Authority signatures in a network status document are expected to be of the form 'directory-signature [METHOD] FINGERPRINT KEY_DIGEST', received: %s" % sig_value) if not block_contents or block_type != 'SIGNATURE': raise ValueError("'directory-signature' should be followed by a SIGNATURE block, but was a %s" % block_type) if sig_value.count(' ') == 1: method = 'sha1' # default if none was provided fingerprint, key_digest = sig_value.split(' ', 1) else: method, fingerprint, key_digest = sig_value.split(' ', 2) signatures.append(DocumentSignature(method, fingerprint, key_digest, block_contents, True)) descriptor.signatures = signatures def _parse_package_line(descriptor, entries): package_versions = [] for value, _, _ in entries['package']: value_comp = value.split(' ', 3) if len(value_comp) < 3: raise ValueError("'package' must at least have a 'PackageName Version URL': %s" % value) name, version, url = value_comp[:3] digests = {} if len(value_comp) == 4: for key, val in _mappings_for('package', value_comp[3]): digests[key] = val package_versions.append(PackageVersion(name, version, url, digests)) descriptor.packages = package_versions def _parsed_shared_rand_commit(descriptor, entries): # "shared-rand-commit" Version AlgName Identity Commit [Reveal] commitments = [] for value, _, _ in entries['shared-rand-commit']: value_comp = value.split() if len(value_comp) < 4: raise ValueError("'shared-rand-commit' must at least have a 'Version AlgName Identity Commit': %s" % value) version, algorithm, identity, commit = value_comp[:4] reveal = value_comp[4] if len(value_comp) >= 5 else None if not version.isdigit(): raise ValueError("The version on our 'shared-rand-commit' line wasn't an integer: %s" % value) commitments.append(SharedRandomnessCommitment(int(version), algorithm, identity, commit, reveal)) descriptor.shared_randomness_commitments = commitments def _parse_shared_rand_previous_value(descriptor, entries): # "shared-rand-previous-value" NumReveals Value value = _value('shared-rand-previous-value', entries) value_comp = value.split(' ') if len(value_comp) == 2 and value_comp[0].isdigit(): descriptor.shared_randomness_previous_reveal_count = int(value_comp[0]) descriptor.shared_randomness_previous_value = value_comp[1] else: raise ValueError("A network status document's 'shared-rand-previous-value' line must be a pair of values, the first an integer but was '%s'" % value) def _parse_shared_rand_current_value(descriptor, entries): # "shared-rand-current-value" NumReveals Value value = _value('shared-rand-current-value', entries) value_comp = value.split(' ') if len(value_comp) == 2 and value_comp[0].isdigit(): descriptor.shared_randomness_current_reveal_count = int(value_comp[0]) descriptor.shared_randomness_current_value = value_comp[1] else: raise ValueError("A network status document's 'shared-rand-current-value' line must be a pair of values, the first an integer but was '%s'" % value) def _parse_bandwidth_file_headers(descriptor, entries): # "bandwidth-file-headers" KeyValues # KeyValues ::= "" | KeyValue | KeyValues SP KeyValue # KeyValue ::= Keyword '=' Value # Value ::= ArgumentChar+ value = _value('bandwidth-file-headers', entries) results = {} for key, val in _mappings_for('bandwidth-file-headers', value): results[key] = val descriptor.bandwidth_file_headers = results _parse_header_valid_after_line = _parse_timestamp_line('valid-after', 'valid_after') _parse_header_fresh_until_line = _parse_timestamp_line('fresh-until', 'fresh_until') _parse_header_valid_until_line = _parse_timestamp_line('valid-until', 'valid_until') _parse_header_client_versions_line = _parse_versions_line('client-versions', 'client_versions') _parse_header_server_versions_line = _parse_versions_line('server-versions', 'server_versions') _parse_header_known_flags_line = _parse_simple_line('known-flags', 'known_flags', func = lambda v: [entry for entry in v.split(' ') if entry]) _parse_footer_bandwidth_weights_line = _parse_simple_line('bandwidth-weights', 'bandwidth_weights', func = lambda v: _parse_int_mappings('bandwidth-weights', v, True)) _parse_shared_rand_participate_line = _parse_if_present('shared-rand-participate', 'is_shared_randomness_participate') _parse_recommended_client_protocols_line = _parse_protocol_line('recommended-client-protocols', 'recommended_client_protocols') _parse_recommended_relay_protocols_line = _parse_protocol_line('recommended-relay-protocols', 'recommended_relay_protocols') _parse_required_client_protocols_line = _parse_protocol_line('required-client-protocols', 'required_client_protocols') _parse_required_relay_protocols_line = _parse_protocol_line('required-relay-protocols', 'required_relay_protocols') class NetworkStatusDocumentV3(NetworkStatusDocument): """ Version 3 network status document. This could be either a vote or consensus. :var dict routers: fingerprint to :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3` mapping for relays contained in the document :var int version: **\*** document version :var str version_flavor: **\*** flavor associated with the document (such as 'microdesc') :var bool is_consensus: **\*** **True** if the document is a consensus :var bool is_vote: **\*** **True** if the document is a vote :var bool is_microdescriptor: **\*** **True** if this is a microdescriptor flavored document, **False** otherwise :var datetime valid_after: **\*** time when the consensus became valid :var datetime fresh_until: **\*** time when the next consensus should be produced :var datetime valid_until: **\*** time when this consensus becomes obsolete :var int vote_delay: **\*** number of seconds allowed for collecting votes from all authorities :var int dist_delay: **\*** number of seconds allowed for collecting signatures from all authorities :var list client_versions: list of recommended client tor versions :var list server_versions: list of recommended server tor versions :var list packages: **\*** list of :data:`~stem.descriptor.networkstatus.PackageVersion` entries :var list known_flags: **\*** list of :data:`~stem.Flag` for the router's flags :var dict params: **\*** dict of parameter(**str**) => value(**int**) mappings :var list directory_authorities: **\*** list of :class:`~stem.descriptor.networkstatus.DirectoryAuthority` objects that have generated this document :var list signatures: **\*** :class:`~stem.descriptor.networkstatus.DocumentSignature` of the authorities that have signed the document **Consensus Attributes:** :var int consensus_method: method version used to generate this consensus :var dict bandwidth_weights: dict of weight(str) => value(int) mappings :var int shared_randomness_current_reveal_count: number of commitments used to generate the current shared random value :var str shared_randomness_current_value: base64 encoded current shared random value :var int shared_randomness_previous_reveal_count: number of commitments used to generate the last shared random value :var str shared_randomness_previous_value: base64 encoded last shared random value **Vote Attributes:** :var list consensus_methods: list of ints for the supported method versions :var datetime published: time when the document was published :var dict flag_thresholds: **\*** mapping of internal performance thresholds used while making the vote, values are **ints** or **floats** :var dict recommended_client_protocols: recommended protocols for clients :var dict recommended_relay_protocols: recommended protocols for relays :var dict required_client_protocols: required protocols for clients :var dict required_relay_protocols: required protocols for relays :var dict bandwidth_file_headers: headers from the bandwidth authority that generated this vote **\*** attribute is either required when we're parsed with validation or has a default value, others are left as None if undefined .. versionchanged:: 1.4.0 Added the packages attribute. .. versionchanged:: 1.5.0 Added the is_shared_randomness_participate, shared_randomness_commitments, shared_randomness_previous_reveal_count, shared_randomness_previous_value, shared_randomness_current_reveal_count, and shared_randomness_current_value attributes. .. versionchanged:: 1.6.0 Added the recommended_client_protocols, recommended_relay_protocols, required_client_protocols, and required_relay_protocols attributes. .. versionchanged:: 1.6.0 The is_shared_randomness_participate and shared_randomness_commitments were misdocumented in the tor spec and as such never set. They're now an attribute of votes in the **directory_authorities**. .. versionchanged:: 1.7.0 The shared_randomness_current_reveal_count and shared_randomness_previous_reveal_count attributes were undocumented and not provided properly if retrieved before their shred_randomness_*_value counterpart. .. versionchanged:: 1.7.0 Added the bandwidth_file_headers attributbute. """ ATTRIBUTES = { 'version': (None, _parse_header_network_status_version_line), 'version_flavor': (None, _parse_header_network_status_version_line), 'is_consensus': (True, _parse_header_vote_status_line), 'is_vote': (False, _parse_header_vote_status_line), 'is_microdescriptor': (False, _parse_header_network_status_version_line), 'consensus_methods': ([], _parse_header_consensus_methods_line), 'published': (None, _parse_published_line), 'consensus_method': (None, _parse_header_consensus_method_line), 'valid_after': (None, _parse_header_valid_after_line), 'fresh_until': (None, _parse_header_fresh_until_line), 'valid_until': (None, _parse_header_valid_until_line), 'vote_delay': (None, _parse_header_voting_delay_line), 'dist_delay': (None, _parse_header_voting_delay_line), 'client_versions': ([], _parse_header_client_versions_line), 'server_versions': ([], _parse_header_server_versions_line), 'packages': ([], _parse_package_line), 'known_flags': ([], _parse_header_known_flags_line), 'flag_thresholds': ({}, _parse_header_flag_thresholds_line), 'recommended_client_protocols': ({}, _parse_recommended_client_protocols_line), 'recommended_relay_protocols': ({}, _parse_recommended_relay_protocols_line), 'required_client_protocols': ({}, _parse_required_client_protocols_line), 'required_relay_protocols': ({}, _parse_required_relay_protocols_line), 'params': ({}, _parse_header_parameters_line), 'shared_randomness_previous_reveal_count': (None, _parse_shared_rand_previous_value), 'shared_randomness_previous_value': (None, _parse_shared_rand_previous_value), 'shared_randomness_current_reveal_count': (None, _parse_shared_rand_current_value), 'shared_randomness_current_value': (None, _parse_shared_rand_current_value), 'bandwidth_file_headers': ({}, _parse_bandwidth_file_headers), 'signatures': ([], _parse_footer_directory_signature_line), 'bandwidth_weights': ({}, _parse_footer_bandwidth_weights_line), } HEADER_PARSER_FOR_LINE = { 'network-status-version': _parse_header_network_status_version_line, 'vote-status': _parse_header_vote_status_line, 'consensus-methods': _parse_header_consensus_methods_line, 'consensus-method': _parse_header_consensus_method_line, 'published': _parse_published_line, 'valid-after': _parse_header_valid_after_line, 'fresh-until': _parse_header_fresh_until_line, 'valid-until': _parse_header_valid_until_line, 'voting-delay': _parse_header_voting_delay_line, 'client-versions': _parse_header_client_versions_line, 'server-versions': _parse_header_server_versions_line, 'package': _parse_package_line, 'known-flags': _parse_header_known_flags_line, 'flag-thresholds': _parse_header_flag_thresholds_line, 'recommended-client-protocols': _parse_recommended_client_protocols_line, 'recommended-relay-protocols': _parse_recommended_relay_protocols_line, 'required-client-protocols': _parse_required_client_protocols_line, 'required-relay-protocols': _parse_required_relay_protocols_line, 'params': _parse_header_parameters_line, 'shared-rand-previous-value': _parse_shared_rand_previous_value, 'shared-rand-current-value': _parse_shared_rand_current_value, 'bandwidth-file-headers': _parse_bandwidth_file_headers, } FOOTER_PARSER_FOR_LINE = { 'directory-footer': _parse_directory_footer_line, 'bandwidth-weights': _parse_footer_bandwidth_weights_line, 'directory-signature': _parse_footer_directory_signature_line, } @classmethod def content(cls, attr = None, exclude = (), sign = False, authorities = None, routers = None): if sign: raise NotImplementedError('Signing of %s not implemented' % cls.__name__) attr = {} if attr is None else dict(attr) is_vote = attr.get('vote-status') == 'vote' if is_vote: extra_defaults = {'consensus-methods': '1 9', 'published': _random_date()} else: extra_defaults = {'consensus-method': '9'} if is_vote and authorities is None: authorities = [DirectoryAuthority.create(is_vote = is_vote)] for k, v in extra_defaults.items(): if exclude and k in exclude: continue # explicitly excluding this field elif k not in attr: attr[k] = v desc_content = _descriptor_content(attr, exclude, ( ('network-status-version', '3'), ('vote-status', 'consensus'), ('consensus-methods', None), ('consensus-method', None), ('published', None), ('valid-after', _random_date()), ('fresh-until', _random_date()), ('valid-until', _random_date()), ('voting-delay', '300 300'), ('client-versions', None), ('server-versions', None), ('package', None), ('known-flags', 'Authority BadExit Exit Fast Guard HSDir Named Running Stable Unnamed V2Dir Valid'), ('params', None), ), ( ('directory-footer', ''), ('bandwidth-weights', None), ('directory-signature', '%s %s%s' % (_random_fingerprint(), _random_fingerprint(), _random_crypto_blob('SIGNATURE'))), )) # inject the authorities and/or routers between the header and footer if authorities: if b'directory-footer' in desc_content: footer_div = desc_content.find(b'\ndirectory-footer') + 1 elif b'directory-signature' in desc_content: footer_div = desc_content.find(b'\ndirectory-signature') + 1 else: if routers: desc_content += b'\n' footer_div = len(desc_content) + 1 authority_content = stem.util.str_tools._to_bytes('\n'.join([str(a) for a in authorities]) + '\n') desc_content = desc_content[:footer_div] + authority_content + desc_content[footer_div:] if routers: if b'directory-footer' in desc_content: footer_div = desc_content.find(b'\ndirectory-footer') + 1 elif b'directory-signature' in desc_content: footer_div = desc_content.find(b'\ndirectory-signature') + 1 else: if routers: desc_content += b'\n' footer_div = len(desc_content) + 1 router_content = stem.util.str_tools._to_bytes('\n'.join([str(r) for r in routers]) + '\n') desc_content = desc_content[:footer_div] + router_content + desc_content[footer_div:] return desc_content @classmethod def create(cls, attr = None, exclude = (), validate = True, sign = False, authorities = None, routers = None): return cls(cls.content(attr, exclude, sign, authorities, routers), validate = validate) def __init__(self, raw_content, validate = False, default_params = True): """ Parse a v3 network status document. :param str raw_content: raw network status document data :param bool validate: **True** if the document is to be validated, **False** otherwise :param bool default_params: includes defaults in our params dict, otherwise it just contains values from the document :raises: **ValueError** if the document is invalid """ super(NetworkStatusDocumentV3, self).__init__(raw_content, lazy_load = not validate) document_file = io.BytesIO(raw_content) # TODO: Tor misdocumented these as being in the header rather than the # authority section. As such these have never been set but we need the # attributes for stem 1.5 compatability. Drop these in 2.0. self.is_shared_randomness_participate = False self.shared_randomness_commitments = [] self._default_params = default_params self._header(document_file, validate) self.directory_authorities = tuple(stem.descriptor.router_status_entry._parse_file( document_file, validate, entry_class = DirectoryAuthority, entry_keyword = AUTH_START, section_end_keywords = (ROUTERS_START, FOOTER_START, V2_FOOTER_START), extra_args = (self.is_vote,), )) if validate and self.is_vote and len(self.directory_authorities) != 1: raise ValueError('Votes should only have an authority entry for the one that issued it, got %i: %s' % (len(self.directory_authorities), self.directory_authorities)) router_iter = stem.descriptor.router_status_entry._parse_file( document_file, validate, entry_class = RouterStatusEntryMicroV3 if self.is_microdescriptor else RouterStatusEntryV3, entry_keyword = ROUTERS_START, section_end_keywords = (FOOTER_START, V2_FOOTER_START), extra_args = (self,), ) self.routers = dict((desc.fingerprint, desc) for desc in router_iter) self._footer(document_file, validate) def validate_signatures(self, key_certs): """ Validates we're properly signed by the signing certificates. .. versionadded:: 1.6.0 :param list key_certs: :class:`~stem.descriptor.networkstatus.KeyCertificates` to validate the consensus against :raises: **ValueError** if an insufficient number of valid signatures are present. """ # sha1 hash of the body and header local_digest = self._digest_for_content(b'network-status-version', b'directory-signature ') valid_digests, total_digests = 0, 0 required_digests = len(self.signatures) / 2.0 signing_keys = dict([(cert.fingerprint, cert.signing_key) for cert in key_certs]) for sig in self.signatures: if sig.identity not in signing_keys: continue signed_digest = self._digest_for_signature(signing_keys[sig.identity], sig.signature) total_digests += 1 if signed_digest == local_digest: valid_digests += 1 if valid_digests < required_digests: raise ValueError('Network Status Document has %i valid signatures out of %i total, needed %i' % (valid_digests, total_digests, required_digests)) def get_unrecognized_lines(self): if self._lazy_loading: self._parse(self._header_entries, False, parser_for_line = self.HEADER_PARSER_FOR_LINE) self._parse(self._footer_entries, False, parser_for_line = self.FOOTER_PARSER_FOR_LINE) self._lazy_loading = False return super(NetworkStatusDocumentV3, self).get_unrecognized_lines() def meets_consensus_method(self, method): """ Checks if we meet the given consensus-method. This works for both votes and consensuses, checking our 'consensus-method' and 'consensus-methods' entries. :param int method: consensus-method to check for :returns: **True** if we meet the given consensus-method, and **False** otherwise """ if self.consensus_method is not None: return self.consensus_method >= method elif self.consensus_methods is not None: return bool([x for x in self.consensus_methods if x >= method]) else: return False # malformed document def _compare(self, other, method): if not isinstance(other, NetworkStatusDocumentV3): return False return method(str(self).strip(), str(other).strip()) def _header(self, document_file, validate): content = bytes.join(b'', _read_until_keywords((AUTH_START, ROUTERS_START, FOOTER_START), document_file)) entries = _descriptor_components(content, validate) header_fields = [attr[0] for attr in HEADER_STATUS_DOCUMENT_FIELDS] if validate: # all known header fields can only appear once except for keyword, values in list(entries.items()): if len(values) > 1 and keyword in header_fields and keyword != 'package' and keyword != 'shared-rand-commit': raise ValueError("Network status documents can only have a single '%s' line, got %i" % (keyword, len(values))) if self._default_params: self.params = dict(DEFAULT_PARAMS) self._parse(entries, validate, parser_for_line = self.HEADER_PARSER_FOR_LINE) # should only appear in consensus-method 7 or later if not self.meets_consensus_method(7) and 'params' in list(entries.keys()): raise ValueError("A network status document's 'params' line should only appear in consensus-method 7 or later") _check_for_missing_and_disallowed_fields(self, entries, HEADER_STATUS_DOCUMENT_FIELDS) # default consensus_method and consensus_methods based on if we're a consensus or vote if self.is_consensus and not self.consensus_method: self.consensus_method = 1 elif self.is_vote and not self.consensus_methods: self.consensus_methods = [1] else: self._header_entries = entries self._entries.update(entries) def _footer(self, document_file, validate): entries = _descriptor_components(document_file.read(), validate) footer_fields = [attr[0] for attr in FOOTER_STATUS_DOCUMENT_FIELDS] if validate: for keyword, values in list(entries.items()): # all known footer fields can only appear once except... # * 'directory-signature' in a consensus if len(values) > 1 and keyword in footer_fields: if not (keyword == 'directory-signature' and self.is_consensus): raise ValueError("Network status documents can only have a single '%s' line, got %i" % (keyword, len(values))) self._parse(entries, validate, parser_for_line = self.FOOTER_PARSER_FOR_LINE) # Check that the footer has the right initial line. Prior to consensus # method 9 it's a 'directory-signature' and after that footers start with # 'directory-footer'. if entries: if self.meets_consensus_method(9): if list(entries.keys())[0] != 'directory-footer': raise ValueError("Network status document's footer should start with a 'directory-footer' line in consensus-method 9 or later") else: if list(entries.keys())[0] != 'directory-signature': raise ValueError("Network status document's footer should start with a 'directory-signature' line prior to consensus-method 9") _check_for_missing_and_disallowed_fields(self, entries, FOOTER_STATUS_DOCUMENT_FIELDS) else: self._footer_entries = entries self._entries.update(entries) def _check_params_constraints(self): """ Checks that the params we know about are within their documented ranges. """ for key, value in self.params.items(): minimum, maximum = PARAM_RANGE.get(key, (MIN_PARAM, MAX_PARAM)) # there's a few dynamic parameter ranges if key == 'cbtclosequantile': minimum = self.params.get('cbtquantile', minimum) elif key == 'cbtinitialtimeout': minimum = self.params.get('cbtmintimeout', minimum) if value < minimum or value > maximum: raise ValueError("'%s' value on the params line must be in the range of %i - %i, was %i" % (key, minimum, maximum, value)) def __hash__(self): return hash(str(self).strip()) def __eq__(self, other): return self._compare(other, lambda s, o: s == o) def __ne__(self, other): return not self == other def __lt__(self, other): return self._compare(other, lambda s, o: s < o) def __le__(self, other): return self._compare(other, lambda s, o: s <= o) def _check_for_missing_and_disallowed_fields(document, entries, fields): """ Checks that we have mandatory fields for our type, and that we don't have any fields exclusive to the other (ie, no vote-only fields appear in a consensus or vice versa). :param NetworkStatusDocumentV3 document: network status document :param dict entries: ordered keyword/value mappings of the header or footer :param list fields: expected field attributes (either **HEADER_STATUS_DOCUMENT_FIELDS** or **FOOTER_STATUS_DOCUMENT_FIELDS**) :raises: **ValueError** if we're missing mandatory fields or have fields we shouldn't """ missing_fields, disallowed_fields = [], [] for field, in_votes, in_consensus, mandatory in fields: if mandatory and ((document.is_consensus and in_consensus) or (document.is_vote and in_votes)): # mandatory field, check that we have it if field not in entries.keys(): missing_fields.append(field) elif (document.is_consensus and not in_consensus) or (document.is_vote and not in_votes): # field we shouldn't have, check that we don't if field in entries.keys(): disallowed_fields.append(field) if missing_fields: raise ValueError('Network status document is missing mandatory field: %s' % ', '.join(missing_fields)) if disallowed_fields: raise ValueError("Network status document has fields that shouldn't appear in this document type or version: %s" % ', '.join(disallowed_fields)) def _parse_int_mappings(keyword, value, validate): # Parse a series of 'key=value' entries, checking the following: # - values are integers # - keys are sorted in lexical order results, seen_keys = {}, [] error_template = "Unable to parse network status document's '%s' line (%%s): %s'" % (keyword, value) for key, val in _mappings_for(keyword, value): if validate: # parameters should be in ascending order by their key for prior_key in seen_keys: if prior_key > key: raise ValueError(error_template % 'parameters must be sorted by their key') try: # the int() function accepts things like '+123', but we don't want to if val.startswith('+'): raise ValueError() results[key] = int(val) except ValueError: raise ValueError(error_template % ("'%s' is a non-numeric value" % val)) seen_keys.append(key) return results def _parse_dirauth_source_line(descriptor, entries): # "dir-source" nickname identity address IP dirport orport value = _value('dir-source', entries) dir_source_comp = value.split(' ') if len(dir_source_comp) < 6: raise ValueError("Authority entry's 'dir-source' line must have six values: dir-source %s" % value) if not stem.util.tor_tools.is_valid_nickname(dir_source_comp[0].rstrip('-legacy')): raise ValueError("Authority's nickname is invalid: %s" % dir_source_comp[0]) elif not stem.util.tor_tools.is_valid_fingerprint(dir_source_comp[1]): raise ValueError("Authority's v3ident is invalid: %s" % dir_source_comp[1]) elif not dir_source_comp[2]: # https://trac.torproject.org/7055 raise ValueError("Authority's hostname can't be blank: dir-source %s" % value) elif not stem.util.connection.is_valid_ipv4_address(dir_source_comp[3]): raise ValueError("Authority's address isn't a valid IPv4 address: %s" % dir_source_comp[3]) elif not stem.util.connection.is_valid_port(dir_source_comp[4], allow_zero = True): raise ValueError("Authority's DirPort is invalid: %s" % dir_source_comp[4]) elif not stem.util.connection.is_valid_port(dir_source_comp[5]): raise ValueError("Authority's ORPort is invalid: %s" % dir_source_comp[5]) descriptor.nickname = dir_source_comp[0] descriptor.v3ident = dir_source_comp[1] descriptor.hostname = dir_source_comp[2] descriptor.address = dir_source_comp[3] descriptor.dir_port = None if dir_source_comp[4] == '0' else int(dir_source_comp[4]) descriptor.or_port = int(dir_source_comp[5]) descriptor.is_legacy = descriptor.nickname.endswith('-legacy') _parse_legacy_dir_key_line = _parse_forty_character_hex('legacy-dir-key', 'legacy_dir_key') _parse_vote_digest_line = _parse_forty_character_hex('vote-digest', 'vote_digest') class DirectoryAuthority(Descriptor): """ Directory authority information obtained from a v3 network status document. Authorities can optionally use a legacy format. These are no longer found in practice, but have the following differences... * The authority's nickname ends with '-legacy'. * There's no **contact** or **vote_digest** attribute. :var str nickname: **\*** authority's nickname :var str v3ident: **\*** identity key fingerprint used to sign votes and consensus :var str hostname: **\*** hostname of the authority :var str address: **\*** authority's IP address :var int dir_port: **\*** authority's DirPort :var int or_port: **\*** authority's ORPort :var bool is_legacy: **\*** if the authority's using the legacy format :var str contact: contact information, this is included if is_legacy is **False** **Consensus Attributes:** :var str vote_digest: digest of the authority that contributed to the consensus, this is included if is_legacy is **False** **Vote Attributes:** :var str legacy_dir_key: fingerprint of and obsolete identity key :var stem.descriptor.networkstatus.KeyCertificate key_certificate: **\*** authority's key certificate :var bool is_shared_randomness_participate: **\*** **True** if this authority participates in establishing a shared random value, **False** otherwise :var list shared_randomness_commitments: **\*** list of :data:`~stem.descriptor.networkstatus.SharedRandomnessCommitment` entries :var int shared_randomness_previous_reveal_count: number of commitments used to generate the last shared random value :var str shared_randomness_previous_value: base64 encoded last shared random value :var int shared_randomness_current_reveal_count: number of commitments used to generate the current shared random value :var str shared_randomness_current_value: base64 encoded current shared random value **\*** mandatory attribute .. versionchanged:: 1.4.0 Renamed our 'fingerprint' attribute to 'v3ident' (prior attribute exists for backward compatability, but is deprecated). .. versionchanged:: 1.6.0 Added the is_shared_randomness_participate, shared_randomness_commitments, shared_randomness_previous_reveal_count, shared_randomness_previous_value, shared_randomness_current_reveal_count, and shared_randomness_current_value attributes. """ ATTRIBUTES = { 'nickname': (None, _parse_dirauth_source_line), 'v3ident': (None, _parse_dirauth_source_line), 'hostname': (None, _parse_dirauth_source_line), 'address': (None, _parse_dirauth_source_line), 'dir_port': (None, _parse_dirauth_source_line), 'or_port': (None, _parse_dirauth_source_line), 'is_legacy': (False, _parse_dirauth_source_line), 'contact': (None, _parse_contact_line), 'vote_digest': (None, _parse_vote_digest_line), 'legacy_dir_key': (None, _parse_legacy_dir_key_line), 'is_shared_randomness_participate': (False, _parse_shared_rand_participate_line), 'shared_randomness_commitments': ([], _parsed_shared_rand_commit), 'shared_randomness_previous_reveal_count': (None, _parse_shared_rand_previous_value), 'shared_randomness_previous_value': (None, _parse_shared_rand_previous_value), 'shared_randomness_current_reveal_count': (None, _parse_shared_rand_current_value), 'shared_randomness_current_value': (None, _parse_shared_rand_current_value), } PARSER_FOR_LINE = { 'dir-source': _parse_dirauth_source_line, 'contact': _parse_contact_line, 'legacy-dir-key': _parse_legacy_dir_key_line, 'vote-digest': _parse_vote_digest_line, 'shared-rand-participate': _parse_shared_rand_participate_line, 'shared-rand-commit': _parsed_shared_rand_commit, 'shared-rand-previous-value': _parse_shared_rand_previous_value, 'shared-rand-current-value': _parse_shared_rand_current_value, } @classmethod def content(cls, attr = None, exclude = (), sign = False, is_vote = False): if sign: raise NotImplementedError('Signing of %s not implemented' % cls.__name__) attr = {} if attr is None else dict(attr) # include mandatory 'vote-digest' if a consensus if not is_vote and not ('vote-digest' in attr or (exclude and 'vote-digest' in exclude)): attr['vote-digest'] = _random_fingerprint() content = _descriptor_content(attr, exclude, ( ('dir-source', '%s %s no.place.com %s 9030 9090' % (_random_nickname(), _random_fingerprint(), _random_ipv4_address())), ('contact', 'Mike Perry '), )) if is_vote: content += b'\n' + KeyCertificate.content() return content @classmethod def create(cls, attr = None, exclude = (), validate = True, sign = False, is_vote = False): return cls(cls.content(attr, exclude, sign, is_vote), validate = validate, is_vote = is_vote) def __init__(self, raw_content, validate = False, is_vote = False): """ Parse a directory authority entry in a v3 network status document. :param str raw_content: raw directory authority entry information :param bool validate: checks the validity of the content if True, skips these checks otherwise :param bool is_vote: True if this is for a vote, False if it's for a consensus :raises: ValueError if the descriptor data is invalid """ super(DirectoryAuthority, self).__init__(raw_content, lazy_load = not validate) content = stem.util.str_tools._to_unicode(raw_content) # separate the directory authority entry from its key certificate key_div = content.find('\ndir-key-certificate-version') if key_div != -1: self.key_certificate = KeyCertificate(content[key_div + 1:], validate) content = content[:key_div + 1] else: self.key_certificate = None entries = _descriptor_components(content, validate) if validate and 'dir-source' != list(entries.keys())[0]: raise ValueError("Authority entries are expected to start with a 'dir-source' line:\n%s" % (content)) # check that we have mandatory fields if validate: is_legacy, dir_source_entry = False, entries.get('dir-source') if dir_source_entry: is_legacy = dir_source_entry[0][0].split()[0].endswith('-legacy') required_fields, excluded_fields = ['dir-source'], [] if not is_legacy: required_fields += ['contact'] if is_vote: if not self.key_certificate: raise ValueError('Authority votes must have a key certificate:\n%s' % content) excluded_fields += ['vote-digest'] elif not is_vote: if self.key_certificate: raise ValueError("Authority consensus entries shouldn't have a key certificate:\n%s" % content) if not is_legacy: required_fields += ['vote-digest'] excluded_fields += ['legacy-dir-key'] for keyword in required_fields: if keyword not in entries: raise ValueError("Authority entries must have a '%s' line:\n%s" % (keyword, content)) for keyword in entries: if keyword in excluded_fields: type_label = 'votes' if is_vote else 'consensus entries' raise ValueError("Authority %s shouldn't have a '%s' line:\n%s" % (type_label, keyword, content)) # all known attributes can only appear at most once for keyword, values in list(entries.items()): if len(values) > 1 and keyword in ('dir-source', 'contact', 'legacy-dir-key', 'vote-digest'): raise ValueError("Authority entries can only have a single '%s' line, got %i:\n%s" % (keyword, len(values), content)) self._parse(entries, validate) else: self._entries = entries # TODO: Due to a bug we had a 'fingerprint' rather than 'v3ident' attribute # for a long while. Keeping this around for backward compatability, but # this will be dropped in stem's 2.0 release. self.fingerprint = self.v3ident def _compare(self, other, method): if not isinstance(other, DirectoryAuthority): return False return method(str(self).strip(), str(other).strip()) def __hash__(self): return hash(str(self).strip()) def __eq__(self, other): return self._compare(other, lambda s, o: s == o) def __ne__(self, other): return not self == other def __lt__(self, other): return self._compare(other, lambda s, o: s < o) def __le__(self, other): return self._compare(other, lambda s, o: s <= o) def _parse_dir_address_line(descriptor, entries): # "dir-address" IPPort value = _value('dir-address', entries) if ':' not in value: raise ValueError("Key certificate's 'dir-address' is expected to be of the form ADDRESS:PORT: dir-address %s" % value) address, dirport = value.rsplit(':', 1) if not stem.util.connection.is_valid_ipv4_address(address): raise ValueError("Key certificate's address isn't a valid IPv4 address: dir-address %s" % value) elif not stem.util.connection.is_valid_port(dirport): raise ValueError("Key certificate's dirport is invalid: dir-address %s" % value) descriptor.address = address descriptor.dir_port = int(dirport) _parse_dir_key_certificate_version_line = _parse_version_line('dir-key-certificate-version', 'version', 3) _parse_dir_key_published_line = _parse_timestamp_line('dir-key-published', 'published') _parse_dir_key_expires_line = _parse_timestamp_line('dir-key-expires', 'expires') _parse_identity_key_line = _parse_key_block('dir-identity-key', 'identity_key', 'RSA PUBLIC KEY') _parse_signing_key_line = _parse_key_block('dir-signing-key', 'signing_key', 'RSA PUBLIC KEY') _parse_dir_key_crosscert_line = _parse_key_block('dir-key-crosscert', 'crosscert', 'ID SIGNATURE') _parse_dir_key_certification_line = _parse_key_block('dir-key-certification', 'certification', 'SIGNATURE') class KeyCertificate(Descriptor): """ Directory key certificate for a v3 network status document. :var int version: **\*** version of the key certificate :var str address: authority's IP address :var int dir_port: authority's DirPort :var str fingerprint: **\*** authority's fingerprint :var str identity_key: **\*** long term authority identity key :var datetime published: **\*** time when this key was generated :var datetime expires: **\*** time after which this key becomes invalid :var str signing_key: **\*** directory server's public signing key :var str crosscert: signature made using certificate's signing key :var str certification: **\*** signature of this key certificate signed with the identity key **\*** mandatory attribute """ ATTRIBUTES = { 'version': (None, _parse_dir_key_certificate_version_line), 'address': (None, _parse_dir_address_line), 'dir_port': (None, _parse_dir_address_line), 'fingerprint': (None, _parse_fingerprint_line), 'identity_key': (None, _parse_identity_key_line), 'published': (None, _parse_dir_key_published_line), 'expires': (None, _parse_dir_key_expires_line), 'signing_key': (None, _parse_signing_key_line), 'crosscert': (None, _parse_dir_key_crosscert_line), 'certification': (None, _parse_dir_key_certification_line), } PARSER_FOR_LINE = { 'dir-key-certificate-version': _parse_dir_key_certificate_version_line, 'dir-address': _parse_dir_address_line, 'fingerprint': _parse_fingerprint_line, 'dir-key-published': _parse_dir_key_published_line, 'dir-key-expires': _parse_dir_key_expires_line, 'dir-identity-key': _parse_identity_key_line, 'dir-signing-key': _parse_signing_key_line, 'dir-key-crosscert': _parse_dir_key_crosscert_line, 'dir-key-certification': _parse_dir_key_certification_line, } @classmethod def content(cls, attr = None, exclude = (), sign = False): if sign: raise NotImplementedError('Signing of %s not implemented' % cls.__name__) return _descriptor_content(attr, exclude, ( ('dir-key-certificate-version', '3'), ('fingerprint', _random_fingerprint()), ('dir-key-published', _random_date()), ('dir-key-expires', _random_date()), ('dir-identity-key', _random_crypto_blob('RSA PUBLIC KEY')), ('dir-signing-key', _random_crypto_blob('RSA PUBLIC KEY')), ), ( ('dir-key-certification', _random_crypto_blob('SIGNATURE')), )) def __init__(self, raw_content, validate = False): super(KeyCertificate, self).__init__(raw_content, lazy_load = not validate) entries = _descriptor_components(raw_content, validate) if validate: if 'dir-key-certificate-version' != list(entries.keys())[0]: raise ValueError("Key certificates must start with a 'dir-key-certificate-version' line:\n%s" % (raw_content)) elif 'dir-key-certification' != list(entries.keys())[-1]: raise ValueError("Key certificates must end with a 'dir-key-certification' line:\n%s" % (raw_content)) # check that we have mandatory fields and that our known fields only # appear once for keyword, is_mandatory in KEY_CERTIFICATE_PARAMS: if is_mandatory and keyword not in entries: raise ValueError("Key certificates must have a '%s' line:\n%s" % (keyword, raw_content)) entry_count = len(entries.get(keyword, [])) if entry_count > 1: raise ValueError("Key certificates can only have a single '%s' line, got %i:\n%s" % (keyword, entry_count, raw_content)) self._parse(entries, validate) else: self._entries = entries def _compare(self, other, method): if not isinstance(other, KeyCertificate): return False return method(str(self).strip(), str(other).strip()) def __hash__(self): return hash(str(self).strip()) def __eq__(self, other): return self._compare(other, lambda s, o: s == o) def __ne__(self, other): return not self == other def __lt__(self, other): return self._compare(other, lambda s, o: s < o) def __le__(self, other): return self._compare(other, lambda s, o: s <= o) class DocumentSignature(object): """ Directory signature of a v3 network status document. :var str method: algorithm used to make the signature :var str identity: fingerprint of the authority that made the signature :var str key_digest: digest of the signing key :var str signature: document signature :param bool validate: checks validity if **True** :raises: **ValueError** if a validity check fails """ def __init__(self, method, identity, key_digest, signature, validate = False): # Checking that these attributes are valid. Technically the key # digest isn't a fingerprint, but it has the same characteristics. if validate: if not stem.util.tor_tools.is_valid_fingerprint(identity): raise ValueError('Malformed fingerprint (%s) in the document signature' % identity) if not stem.util.tor_tools.is_valid_fingerprint(key_digest): raise ValueError('Malformed key digest (%s) in the document signature' % key_digest) self.method = method self.identity = identity self.key_digest = key_digest self.signature = signature def _compare(self, other, method): if not isinstance(other, DocumentSignature): return False for attr in ('method', 'identity', 'key_digest', 'signature'): if getattr(self, attr) != getattr(other, attr): return method(getattr(self, attr), getattr(other, attr)) return method(True, True) # we're equal def __hash__(self): return hash(str(self).strip()) def __eq__(self, other): return self._compare(other, lambda s, o: s == o) def __ne__(self, other): return not self == other def __lt__(self, other): return self._compare(other, lambda s, o: s < o) def __le__(self, other): return self._compare(other, lambda s, o: s <= o) class BridgeNetworkStatusDocument(NetworkStatusDocument): """ Network status document containing bridges. This is only available through the metrics site. :var dict routers: fingerprint to :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3` mapping for relays contained in the document :var datetime published: time when the document was published """ def __init__(self, raw_content, validate = False): super(BridgeNetworkStatusDocument, self).__init__(raw_content) self.published = None document_file = io.BytesIO(raw_content) published_line = stem.util.str_tools._to_unicode(document_file.readline()) if published_line.startswith('published '): published_line = published_line.split(' ', 1)[1].strip() try: self.published = stem.util.str_tools._parse_timestamp(published_line) except ValueError: if validate: raise ValueError("Bridge network status document's 'published' time wasn't parsable: %s" % published_line) elif validate: raise ValueError("Bridge network status documents must start with a 'published' line:\n%s" % stem.util.str_tools._to_unicode(raw_content)) router_iter = stem.descriptor.router_status_entry._parse_file( document_file, validate, entry_class = RouterStatusEntryV2, extra_args = (self,), ) self.routers = dict((desc.fingerprint, desc) for desc in router_iter) stem-1.7.1/stem/descriptor/extrainfo_descriptor.py0000664000175000017500000012434713411002341023147 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Parsing for Tor extra-info descriptors. These are published by relays whenever their server descriptor is published and have a similar format. However, unlike server descriptors these don't contain information that Tor clients require to function and as such aren't fetched by default. Defined in section 2.1.2 of the `dir-spec `_, extra-info descriptors contain interesting but non-vital information such as usage statistics. Tor clients cannot request these documents for bridges. Extra-info descriptors are available from a few sources... * If you have 'DownloadExtraInfo 1' in your torrc... * control port via 'GETINFO extra-info/digest/\*' queries * the 'cached-extrainfo' file in tor's data directory * Archived descriptors provided by `CollecTor `_. * Directory authorities and mirrors via their DirPort. **Module Overview:** :: ExtraInfoDescriptor - Tor extra-info descriptor. |- RelayExtraInfoDescriptor - Extra-info descriptor for a relay. |- BridgeExtraInfoDescriptor - Extra-info descriptor for a bridge. | +- digest - calculates the upper-case hex digest value for our content .. data:: DirResponse (enum) Enumeration for known statuses for ExtraInfoDescriptor's dir_*_responses. =================== =========== DirResponse Description =================== =========== **OK** network status requests that were answered **NOT_ENOUGH_SIGS** network status wasn't signed by enough authorities **UNAVAILABLE** requested network status was unavailable **NOT_FOUND** requested network status was not found **NOT_MODIFIED** network status unmodified since If-Modified-Since time **BUSY** directory was busy =================== =========== .. data:: DirStat (enum) Enumeration for known stats for ExtraInfoDescriptor's dir_*_direct_dl and dir_*_tunneled_dl. ===================== =========== DirStat Description ===================== =========== **COMPLETE** requests that completed successfully **TIMEOUT** requests that didn't complete within a ten minute timeout **RUNNING** requests still in process when measurement's taken **MIN** smallest rate at which a descriptor was downloaded in B/s **MAX** largest rate at which a descriptor was downloaded in B/s **D1-4** and **D6-9** rate of the slowest x/10 download rates in B/s **Q1** and **Q3** rate of the slowest and fastest quarter download rates in B/s **MD** median download rate in B/s ===================== =========== """ import functools import hashlib import re import stem.prereq import stem.util.connection import stem.util.enum import stem.util.str_tools from stem.descriptor import ( PGP_BLOCK_END, Descriptor, create_signing_key, _descriptor_content, _read_until_keywords, _descriptor_components, _value, _values, _parse_simple_line, _parse_timestamp_line, _parse_forty_character_hex, _parse_key_block, _mappings_for, _append_router_signature, _random_nickname, _random_fingerprint, _random_date, _random_crypto_blob, ) if stem.prereq._is_lru_cache_available(): from functools import lru_cache else: from stem.util.lru_cache import lru_cache # known statuses for dirreq-v2-resp and dirreq-v3-resp... DirResponse = stem.util.enum.Enum( ('OK', 'ok'), ('NOT_ENOUGH_SIGS', 'not-enough-sigs'), ('UNAVAILABLE', 'unavailable'), ('NOT_FOUND', 'not-found'), ('NOT_MODIFIED', 'not-modified'), ('BUSY', 'busy'), ) # known stats for dirreq-v2/3-direct-dl and dirreq-v2/3-tunneled-dl... dir_stats = ['complete', 'timeout', 'running', 'min', 'max', 'q1', 'q3', 'md'] dir_stats += ['d%i' % i for i in range(1, 5)] dir_stats += ['d%i' % i for i in range(6, 10)] DirStat = stem.util.enum.Enum(*[(stat.upper(), stat) for stat in dir_stats]) # relay descriptors must have exactly one of the following REQUIRED_FIELDS = ( 'extra-info', 'published', 'router-signature', ) # optional entries that can appear at most once SINGLE_FIELDS = ( 'read-history', 'write-history', 'geoip-db-digest', 'geoip6-db-digest', 'bridge-stats-end', 'bridge-ips', 'dirreq-stats-end', 'dirreq-v2-ips', 'dirreq-v3-ips', 'dirreq-v2-reqs', 'dirreq-v3-reqs', 'dirreq-v2-share', 'dirreq-v3-share', 'dirreq-v2-resp', 'dirreq-v3-resp', 'dirreq-v2-direct-dl', 'dirreq-v3-direct-dl', 'dirreq-v2-tunneled-dl', 'dirreq-v3-tunneled-dl', 'dirreq-read-history', 'dirreq-write-history', 'entry-stats-end', 'entry-ips', 'cell-stats-end', 'cell-processed-cells', 'cell-queued-cells', 'cell-time-in-queue', 'cell-circuits-per-decile', 'conn-bi-direct', 'exit-stats-end', 'exit-kibibytes-written', 'exit-kibibytes-read', 'exit-streams-opened', ) _timestamp_re = re.compile('^(.*) \(([0-9]+) s\)( .*)?$') _locale_re = re.compile('^[a-zA-Z0-9\?]{2}$') def _parse_file(descriptor_file, is_bridge = False, validate = False, **kwargs): """ Iterates over the extra-info descriptors in a file. :param file descriptor_file: file with descriptor content :param bool is_bridge: parses the file as being a bridge descriptor :param bool validate: checks the validity of the descriptor's content if **True**, skips these checks otherwise :param dict kwargs: additional arguments for the descriptor constructor :returns: iterator for :class:`~stem.descriptor.extrainfo_descriptor.ExtraInfoDescriptor` instances in the file :raises: * **ValueError** if the contents is malformed and validate is **True** * **IOError** if the file can't be read """ while True: if not is_bridge: extrainfo_content = _read_until_keywords('router-signature', descriptor_file) # we've reached the 'router-signature', now include the pgp style block block_end_prefix = PGP_BLOCK_END.split(' ', 1)[0] extrainfo_content += _read_until_keywords(block_end_prefix, descriptor_file, True) else: extrainfo_content = _read_until_keywords('router-digest', descriptor_file, True) if extrainfo_content: if extrainfo_content[0].startswith(b'@type'): extrainfo_content = extrainfo_content[1:] if is_bridge: yield BridgeExtraInfoDescriptor(bytes.join(b'', extrainfo_content), validate, **kwargs) else: yield RelayExtraInfoDescriptor(bytes.join(b'', extrainfo_content), validate, **kwargs) else: break # done parsing file def _parse_timestamp_and_interval(keyword, content): """ Parses a 'YYYY-MM-DD HH:MM:SS (NSEC s) *' entry. :param str keyword: line's keyword :param str content: line content to be parsed :returns: **tuple** of the form (timestamp (**datetime**), interval (**int**), remaining content (**str**)) :raises: **ValueError** if the content is malformed """ line = '%s %s' % (keyword, content) content_match = _timestamp_re.match(content) if not content_match: raise ValueError('Malformed %s line: %s' % (keyword, line)) timestamp_str, interval, remainder = content_match.groups() if remainder: remainder = remainder[1:] # remove leading space if not interval.isdigit(): raise ValueError("%s line's interval wasn't a number: %s" % (keyword, line)) try: timestamp = stem.util.str_tools._parse_timestamp(timestamp_str) return timestamp, int(interval), remainder except ValueError: raise ValueError("%s line's timestamp wasn't parsable: %s" % (keyword, line)) def _parse_extra_info_line(descriptor, entries): # "extra-info" Nickname Fingerprint value = _value('extra-info', entries) extra_info_comp = value.split() if len(extra_info_comp) < 2: raise ValueError('Extra-info line must have two values: extra-info %s' % value) elif not stem.util.tor_tools.is_valid_nickname(extra_info_comp[0]): raise ValueError("Extra-info line entry isn't a valid nickname: %s" % extra_info_comp[0]) elif not stem.util.tor_tools.is_valid_fingerprint(extra_info_comp[1]): raise ValueError('Tor relay fingerprints consist of forty hex digits: %s' % extra_info_comp[1]) descriptor.nickname = extra_info_comp[0] descriptor.fingerprint = extra_info_comp[1] def _parse_transport_line(descriptor, entries): # "transport" transportname address:port [arglist] # Everything after the transportname is scrubbed in published bridge # descriptors, so we'll never see it in practice. # # These entries really only make sense for bridges, but have been seen # on non-bridges in the wild when the relay operator configured it this # way. transports = {} for value in _values('transport', entries): name, address, port, args = None, None, None, None if ' ' not in value: # scrubbed name = value else: # not scrubbed value_comp = value.split() if len(value_comp) < 1: raise ValueError('Transport line is missing its transport name: transport %s' % value) elif len(value_comp) < 2: raise ValueError('Transport line is missing its address:port value: transport %s' % value) elif ':' not in value_comp[1]: raise ValueError("Transport line's address:port entry is missing a colon: transport %s" % value) name = value_comp[0] address, port_str = value_comp[1].rsplit(':', 1) if not stem.util.connection.is_valid_ipv4_address(address) or \ stem.util.connection.is_valid_ipv6_address(address, allow_brackets = True): raise ValueError('Transport line has a malformed address: transport %s' % value) elif not stem.util.connection.is_valid_port(port_str): raise ValueError('Transport line has a malformed port: transport %s' % value) address.lstrip('[').rstrip(']') port = int(port_str) args = value_comp[2:] if len(value_comp) >= 3 else [] transports[name] = (address, port, args) descriptor.transport = transports def _parse_cell_circuits_per_decline_line(descriptor, entries): # "cell-circuits-per-decile" num value = _value('cell-circuits-per-decile', entries) if not value.isdigit(): raise ValueError('Non-numeric cell-circuits-per-decile value: %s' % value) elif int(value) < 0: raise ValueError('Negative cell-circuits-per-decile value: %s' % value) descriptor.cell_circuits_per_decile = int(value) def _parse_padding_counts_line(descriptor, entries): # "padding-counts" YYYY-MM-DD HH:MM:SS (NSEC s) key=val key=val... value = _value('padding-counts', entries) timestamp, interval, remainder = _parse_timestamp_and_interval('padding-counts', value) counts = {} for k, v in _mappings_for('padding-counts', remainder, require_value = True): counts[k] = int(v) if v.isdigit() else v setattr(descriptor, 'padding_counts_end', timestamp) setattr(descriptor, 'padding_counts_interval', interval) setattr(descriptor, 'padding_counts', counts) def _parse_dirreq_line(keyword, recognized_counts_attr, unrecognized_counts_attr, descriptor, entries): value = _value(keyword, entries) recognized_counts = {} unrecognized_counts = {} is_response_stats = keyword in ('dirreq-v2-resp', 'dirreq-v3-resp') key_set = DirResponse if is_response_stats else DirStat key_type = 'STATUS' if is_response_stats else 'STAT' for status, count in _mappings_for(keyword, value, divider = ','): if not count.isdigit(): raise ValueError('%s lines should contain %s=COUNT mappings: %s %s' % (keyword, key_type, keyword, value)) if status in key_set: recognized_counts[status] = int(count) else: unrecognized_counts[status] = int(count) setattr(descriptor, recognized_counts_attr, recognized_counts) setattr(descriptor, unrecognized_counts_attr, unrecognized_counts) def _parse_dirreq_share_line(keyword, attribute, descriptor, entries): value = _value(keyword, entries) if not value.endswith('%'): raise ValueError('%s lines should be a percentage: %s %s' % (keyword, keyword, value)) elif float(value[:-1]) < 0: raise ValueError('Negative percentage value: %s %s' % (keyword, value)) # bug means it might be above 100%: https://lists.torproject.org/pipermail/tor-dev/2012-June/003679.html setattr(descriptor, attribute, float(value[:-1]) / 100) def _parse_cell_line(keyword, attribute, descriptor, entries): # "" num,...,num value = _value(keyword, entries) entries, exc = [], None if value: for entry in value.split(','): try: # Values should be positive but as discussed in ticket #5849 # there was a bug around this. It was fixed in tor 0.2.2.1. entries.append(float(entry)) except ValueError: exc = ValueError('Non-numeric entry in %s listing: %s %s' % (keyword, keyword, value)) setattr(descriptor, attribute, entries) if exc: raise exc def _parse_timestamp_and_interval_line(keyword, end_attribute, interval_attribute, descriptor, entries): # "" YYYY-MM-DD HH:MM:SS (NSEC s) timestamp, interval, _ = _parse_timestamp_and_interval(keyword, _value(keyword, entries)) setattr(descriptor, end_attribute, timestamp) setattr(descriptor, interval_attribute, interval) def _parse_conn_bi_direct_line(descriptor, entries): # "conn-bi-direct" YYYY-MM-DD HH:MM:SS (NSEC s) BELOW,READ,WRITE,BOTH value = _value('conn-bi-direct', entries) timestamp, interval, remainder = _parse_timestamp_and_interval('conn-bi-direct', value) stats = remainder.split(',') if len(stats) != 4 or not (stats[0].isdigit() and stats[1].isdigit() and stats[2].isdigit() and stats[3].isdigit()): raise ValueError('conn-bi-direct line should end with four numeric values: conn-bi-direct %s' % value) descriptor.conn_bi_direct_end = timestamp descriptor.conn_bi_direct_interval = interval descriptor.conn_bi_direct_below = int(stats[0]) descriptor.conn_bi_direct_read = int(stats[1]) descriptor.conn_bi_direct_write = int(stats[2]) descriptor.conn_bi_direct_both = int(stats[3]) def _parse_history_line(keyword, end_attribute, interval_attribute, values_attribute, descriptor, entries): # "" YYYY-MM-DD HH:MM:SS (NSEC s) NUM,NUM,NUM,NUM,NUM... value = _value(keyword, entries) timestamp, interval, remainder = _parse_timestamp_and_interval(keyword, value) history_values = [] if remainder: try: history_values = [int(entry) for entry in remainder.split(',')] except ValueError: raise ValueError('%s line has non-numeric values: %s %s' % (keyword, keyword, value)) setattr(descriptor, end_attribute, timestamp) setattr(descriptor, interval_attribute, interval) setattr(descriptor, values_attribute, history_values) def _parse_port_count_line(keyword, attribute, descriptor, entries): # "" port=N,port=N,... value, port_mappings = _value(keyword, entries), {} for port, stat in _mappings_for(keyword, value, divider = ','): if (port != 'other' and not stem.util.connection.is_valid_port(port)) or not stat.isdigit(): raise ValueError('Entries in %s line should only be PORT=N entries: %s %s' % (keyword, keyword, value)) port = int(port) if port.isdigit() else port port_mappings[port] = int(stat) setattr(descriptor, attribute, port_mappings) def _parse_geoip_to_count_line(keyword, attribute, descriptor, entries): # "" CC=N,CC=N,... # # The maxmind geoip (https://www.maxmind.com/app/iso3166) has numeric # locale codes for some special values, for instance... # A1,"Anonymous Proxy" # A2,"Satellite Provider" # ??,"Unknown" value, locale_usage = _value(keyword, entries), {} for locale, count in _mappings_for(keyword, value, divider = ','): if not _locale_re.match(locale) or not count.isdigit(): raise ValueError('Entries in %s line should only be CC=N entries: %s %s' % (keyword, keyword, value)) locale_usage[locale] = int(count) setattr(descriptor, attribute, locale_usage) def _parse_bridge_ip_versions_line(descriptor, entries): value, ip_versions = _value('bridge-ip-versions', entries), {} for protocol, count in _mappings_for('bridge-ip-versions', value, divider = ','): if not count.isdigit(): raise stem.ProtocolError('IP protocol count was non-numeric (%s): bridge-ip-versions %s' % (count, value)) ip_versions[protocol] = int(count) descriptor.ip_versions = ip_versions def _parse_bridge_ip_transports_line(descriptor, entries): value, ip_transports = _value('bridge-ip-transports', entries), {} for protocol, count in _mappings_for('bridge-ip-transports', value, divider = ','): if not count.isdigit(): raise stem.ProtocolError('Transport count was non-numeric (%s): bridge-ip-transports %s' % (count, value)) ip_transports[protocol] = int(count) descriptor.ip_transports = ip_transports def _parse_hs_stats(keyword, stat_attribute, extra_attribute, descriptor, entries): # "" num key=val key=val... value, stat, extra = _value(keyword, entries), None, {} if value is None: pass # not in the descriptor elif value == '': raise ValueError("'%s' line was blank" % keyword) else: if ' ' in value: stat_value, remainder = value.split(' ', 1) else: stat_value, remainder = value, None try: stat = int(stat_value) except ValueError: raise ValueError("'%s' stat was non-numeric (%s): %s %s" % (keyword, stat_value, keyword, value)) for key, val in _mappings_for(keyword, remainder): extra[key] = val setattr(descriptor, stat_attribute, stat) setattr(descriptor, extra_attribute, extra) _parse_identity_ed25519_line = _parse_key_block('identity-ed25519', 'ed25519_certificate', 'ED25519 CERT') _parse_master_key_ed25519_line = _parse_simple_line('master-key-ed25519', 'ed25519_certificate_hash') _parse_geoip_db_digest_line = _parse_forty_character_hex('geoip-db-digest', 'geoip_db_digest') _parse_geoip6_db_digest_line = _parse_forty_character_hex('geoip6-db-digest', 'geoip6_db_digest') _parse_dirreq_v2_resp_line = functools.partial(_parse_dirreq_line, 'dirreq-v2-resp', 'dir_v2_responses', 'dir_v2_responses_unknown') _parse_dirreq_v3_resp_line = functools.partial(_parse_dirreq_line, 'dirreq-v3-resp', 'dir_v3_responses', 'dir_v3_responses_unknown') _parse_dirreq_v2_direct_dl_line = functools.partial(_parse_dirreq_line, 'dirreq-v2-direct-dl', 'dir_v2_direct_dl', 'dir_v2_direct_dl_unknown') _parse_dirreq_v3_direct_dl_line = functools.partial(_parse_dirreq_line, 'dirreq-v3-direct-dl', 'dir_v3_direct_dl', 'dir_v3_direct_dl_unknown') _parse_dirreq_v2_tunneled_dl_line = functools.partial(_parse_dirreq_line, 'dirreq-v2-tunneled-dl', 'dir_v2_tunneled_dl', 'dir_v2_tunneled_dl_unknown') _parse_dirreq_v3_tunneled_dl_line = functools.partial(_parse_dirreq_line, 'dirreq-v3-tunneled-dl', 'dir_v3_tunneled_dl', 'dir_v3_tunneled_dl_unknown') _parse_dirreq_v2_share_line = functools.partial(_parse_dirreq_share_line, 'dirreq-v2-share', 'dir_v2_share') _parse_dirreq_v3_share_line = functools.partial(_parse_dirreq_share_line, 'dirreq-v3-share', 'dir_v3_share') _parse_cell_processed_cells_line = functools.partial(_parse_cell_line, 'cell-processed-cells', 'cell_processed_cells') _parse_cell_queued_cells_line = functools.partial(_parse_cell_line, 'cell-queued-cells', 'cell_queued_cells') _parse_cell_time_in_queue_line = functools.partial(_parse_cell_line, 'cell-time-in-queue', 'cell_time_in_queue') _parse_published_line = _parse_timestamp_line('published', 'published') _parse_geoip_start_time_line = _parse_timestamp_line('geoip-start-time', 'geoip_start_time') _parse_cell_stats_end_line = functools.partial(_parse_timestamp_and_interval_line, 'cell-stats-end', 'cell_stats_end', 'cell_stats_interval') _parse_entry_stats_end_line = functools.partial(_parse_timestamp_and_interval_line, 'entry-stats-end', 'entry_stats_end', 'entry_stats_interval') _parse_exit_stats_end_line = functools.partial(_parse_timestamp_and_interval_line, 'exit-stats-end', 'exit_stats_end', 'exit_stats_interval') _parse_bridge_stats_end_line = functools.partial(_parse_timestamp_and_interval_line, 'bridge-stats-end', 'bridge_stats_end', 'bridge_stats_interval') _parse_dirreq_stats_end_line = functools.partial(_parse_timestamp_and_interval_line, 'dirreq-stats-end', 'dir_stats_end', 'dir_stats_interval') _parse_read_history_line = functools.partial(_parse_history_line, 'read-history', 'read_history_end', 'read_history_interval', 'read_history_values') _parse_write_history_line = functools.partial(_parse_history_line, 'write-history', 'write_history_end', 'write_history_interval', 'write_history_values') _parse_dirreq_read_history_line = functools.partial(_parse_history_line, 'dirreq-read-history', 'dir_read_history_end', 'dir_read_history_interval', 'dir_read_history_values') _parse_dirreq_write_history_line = functools.partial(_parse_history_line, 'dirreq-write-history', 'dir_write_history_end', 'dir_write_history_interval', 'dir_write_history_values') _parse_exit_kibibytes_written_line = functools.partial(_parse_port_count_line, 'exit-kibibytes-written', 'exit_kibibytes_written') _parse_exit_kibibytes_read_line = functools.partial(_parse_port_count_line, 'exit-kibibytes-read', 'exit_kibibytes_read') _parse_exit_streams_opened_line = functools.partial(_parse_port_count_line, 'exit-streams-opened', 'exit_streams_opened') _parse_hidden_service_stats_end_line = _parse_timestamp_line('hidserv-stats-end', 'hs_stats_end') _parse_hidden_service_rend_relayed_cells_line = functools.partial(_parse_hs_stats, 'hidserv-rend-relayed-cells', 'hs_rend_cells', 'hs_rend_cells_attr') _parse_hidden_service_dir_onions_seen_line = functools.partial(_parse_hs_stats, 'hidserv-dir-onions-seen', 'hs_dir_onions_seen', 'hs_dir_onions_seen_attr') _parse_dirreq_v2_ips_line = functools.partial(_parse_geoip_to_count_line, 'dirreq-v2-ips', 'dir_v2_ips') _parse_dirreq_v3_ips_line = functools.partial(_parse_geoip_to_count_line, 'dirreq-v3-ips', 'dir_v3_ips') _parse_dirreq_v2_reqs_line = functools.partial(_parse_geoip_to_count_line, 'dirreq-v2-reqs', 'dir_v2_requests') _parse_dirreq_v3_reqs_line = functools.partial(_parse_geoip_to_count_line, 'dirreq-v3-reqs', 'dir_v3_requests') _parse_geoip_client_origins_line = functools.partial(_parse_geoip_to_count_line, 'geoip-client-origins', 'geoip_client_origins') _parse_entry_ips_line = functools.partial(_parse_geoip_to_count_line, 'entry-ips', 'entry_ips') _parse_bridge_ips_line = functools.partial(_parse_geoip_to_count_line, 'bridge-ips', 'bridge_ips') _parse_router_sig_ed25519_line = _parse_simple_line('router-sig-ed25519', 'ed25519_signature') _parse_router_digest_sha256_line = _parse_simple_line('router-digest-sha256', 'router_digest_sha256') _parse_router_digest_line = _parse_forty_character_hex('router-digest', '_digest') _parse_router_signature_line = _parse_key_block('router-signature', 'signature', 'SIGNATURE') class ExtraInfoDescriptor(Descriptor): """ Extra-info descriptor document. :var str nickname: **\*** relay's nickname :var str fingerprint: **\*** identity key fingerprint :var datetime published: **\*** time in UTC when this descriptor was made :var str geoip_db_digest: sha1 of the geoIP database file for IPv4 addresses :var str geoip6_db_digest: sha1 of the geoIP database file for IPv6 addresses :var dict transport: **\*** mapping of transport methods to their (address, port, args) tuple, these usually appear on bridges in which case all of those are **None** **Bi-directional connection usage:** :var datetime conn_bi_direct_end: end of the sampling interval :var int conn_bi_direct_interval: seconds per interval :var int conn_bi_direct_below: connections that read/wrote less than 20 KiB :var int conn_bi_direct_read: connections that read at least 10x more than wrote :var int conn_bi_direct_write: connections that wrote at least 10x more than read :var int conn_bi_direct_both: remaining connections **Bytes read/written for relayed traffic:** :var datetime read_history_end: end of the sampling interval :var int read_history_interval: seconds per interval :var list read_history_values: bytes read during each interval :var datetime write_history_end: end of the sampling interval :var int write_history_interval: seconds per interval :var list write_history_values: bytes written during each interval **Cell relaying statistics:** :var datetime cell_stats_end: end of the period when stats were gathered :var int cell_stats_interval: length in seconds of the interval :var list cell_processed_cells: measurement of processed cells per circuit :var list cell_queued_cells: measurement of queued cells per circuit :var list cell_time_in_queue: mean enqueued time in milliseconds for cells :var int cell_circuits_per_decile: mean number of circuits in a decile **Directory Mirror Attributes:** :var datetime dir_stats_end: end of the period when stats were gathered :var int dir_stats_interval: length in seconds of the interval :var dict dir_v2_ips: mapping of locales to rounded count of requester ips :var dict dir_v3_ips: mapping of locales to rounded count of requester ips :var float dir_v2_share: percent of total directory traffic it expects to serve :var float dir_v3_share: percent of total directory traffic it expects to serve :var dict dir_v2_requests: mapping of locales to rounded count of requests :var dict dir_v3_requests: mapping of locales to rounded count of requests :var dict dir_v2_responses: mapping of :data:`~stem.descriptor.extrainfo_descriptor.DirResponse` to their rounded count :var dict dir_v3_responses: mapping of :data:`~stem.descriptor.extrainfo_descriptor.DirResponse` to their rounded count :var dict dir_v2_responses_unknown: mapping of unrecognized statuses to their count :var dict dir_v3_responses_unknown: mapping of unrecognized statuses to their count :var dict dir_v2_direct_dl: mapping of :data:`~stem.descriptor.extrainfo_descriptor.DirStat` to measurement over DirPort :var dict dir_v3_direct_dl: mapping of :data:`~stem.descriptor.extrainfo_descriptor.DirStat` to measurement over DirPort :var dict dir_v2_direct_dl_unknown: mapping of unrecognized stats to their measurement :var dict dir_v3_direct_dl_unknown: mapping of unrecognized stats to their measurement :var dict dir_v2_tunneled_dl: mapping of :data:`~stem.descriptor.extrainfo_descriptor.DirStat` to measurement over ORPort :var dict dir_v3_tunneled_dl: mapping of :data:`~stem.descriptor.extrainfo_descriptor.DirStat` to measurement over ORPort :var dict dir_v2_tunneled_dl_unknown: mapping of unrecognized stats to their measurement :var dict dir_v3_tunneled_dl_unknown: mapping of unrecognized stats to their measurement **Bytes read/written for directory mirroring:** :var datetime dir_read_history_end: end of the sampling interval :var int dir_read_history_interval: seconds per interval :var list dir_read_history_values: bytes read during each interval :var datetime dir_write_history_end: end of the sampling interval :var int dir_write_history_interval: seconds per interval :var list dir_write_history_values: bytes read during each interval **Guard Attributes:** :var datetime entry_stats_end: end of the period when stats were gathered :var int entry_stats_interval: length in seconds of the interval :var dict entry_ips: mapping of locales to rounded count of unique user ips **Exit Attributes:** :var datetime exit_stats_end: end of the period when stats were gathered :var int exit_stats_interval: length in seconds of the interval :var dict exit_kibibytes_written: traffic per port (keys are ints or 'other') :var dict exit_kibibytes_read: traffic per port (keys are ints or 'other') :var dict exit_streams_opened: streams per port (keys are ints or 'other') **Hidden Service Attributes:** :var datetime hs_stats_end: end of the sampling interval :var int hs_rend_cells: rounded count of the RENDEZVOUS1 cells seen :var int hs_rend_cells_attr: **\*** attributes provided for the hs_rend_cells :var int hs_dir_onions_seen: rounded count of the identities seen :var int hs_dir_onions_seen_attr: **\*** attributes provided for the hs_dir_onions_seen **Padding Count Attributes:** :var dict padding_counts: **\*** padding parameters :var datetime padding_counts_end: end of the period when padding data is being collected :var int padding_counts_interval: length in seconds of the interval **Bridge Attributes:** :var datetime bridge_stats_end: end of the period when stats were gathered :var int bridge_stats_interval: length in seconds of the interval :var dict bridge_ips: mapping of locales to rounded count of unique user ips :var datetime geoip_start_time: replaced by bridge_stats_end (deprecated) :var dict geoip_client_origins: replaced by bridge_ips (deprecated) :var dict ip_versions: mapping of ip protocols to a rounded count for the number of users :var dict ip_versions: mapping of ip transports to a count for the number of users **\*** attribute is either required when we're parsed with validation or has a default value, others are left as **None** if undefined .. versionchanged:: 1.4.0 Added the hs_stats_end, hs_rend_cells, hs_rend_cells_attr, hs_dir_onions_seen, and hs_dir_onions_seen_attr attributes. .. versionchanged:: 1.6.0 Added the padding_counts, padding_counts_end, and padding_counts_interval attributes. """ ATTRIBUTES = { 'nickname': (None, _parse_extra_info_line), 'fingerprint': (None, _parse_extra_info_line), 'published': (None, _parse_published_line), 'geoip_db_digest': (None, _parse_geoip_db_digest_line), 'geoip6_db_digest': (None, _parse_geoip6_db_digest_line), 'transport': ({}, _parse_transport_line), 'conn_bi_direct_end': (None, _parse_conn_bi_direct_line), 'conn_bi_direct_interval': (None, _parse_conn_bi_direct_line), 'conn_bi_direct_below': (None, _parse_conn_bi_direct_line), 'conn_bi_direct_read': (None, _parse_conn_bi_direct_line), 'conn_bi_direct_write': (None, _parse_conn_bi_direct_line), 'conn_bi_direct_both': (None, _parse_conn_bi_direct_line), 'read_history_end': (None, _parse_read_history_line), 'read_history_interval': (None, _parse_read_history_line), 'read_history_values': (None, _parse_read_history_line), 'write_history_end': (None, _parse_write_history_line), 'write_history_interval': (None, _parse_write_history_line), 'write_history_values': (None, _parse_write_history_line), 'cell_stats_end': (None, _parse_cell_stats_end_line), 'cell_stats_interval': (None, _parse_cell_stats_end_line), 'cell_processed_cells': (None, _parse_cell_processed_cells_line), 'cell_queued_cells': (None, _parse_cell_queued_cells_line), 'cell_time_in_queue': (None, _parse_cell_time_in_queue_line), 'cell_circuits_per_decile': (None, _parse_cell_circuits_per_decline_line), 'dir_stats_end': (None, _parse_dirreq_stats_end_line), 'dir_stats_interval': (None, _parse_dirreq_stats_end_line), 'dir_v2_ips': (None, _parse_dirreq_v2_ips_line), 'dir_v3_ips': (None, _parse_dirreq_v3_ips_line), 'dir_v2_share': (None, _parse_dirreq_v2_share_line), 'dir_v3_share': (None, _parse_dirreq_v3_share_line), 'dir_v2_requests': (None, _parse_dirreq_v2_reqs_line), 'dir_v3_requests': (None, _parse_dirreq_v3_reqs_line), 'dir_v2_responses': (None, _parse_dirreq_v2_resp_line), 'dir_v3_responses': (None, _parse_dirreq_v3_resp_line), 'dir_v2_responses_unknown': (None, _parse_dirreq_v2_resp_line), 'dir_v3_responses_unknown': (None, _parse_dirreq_v3_resp_line), 'dir_v2_direct_dl': (None, _parse_dirreq_v2_direct_dl_line), 'dir_v3_direct_dl': (None, _parse_dirreq_v3_direct_dl_line), 'dir_v2_direct_dl_unknown': (None, _parse_dirreq_v2_direct_dl_line), 'dir_v3_direct_dl_unknown': (None, _parse_dirreq_v3_direct_dl_line), 'dir_v2_tunneled_dl': (None, _parse_dirreq_v2_tunneled_dl_line), 'dir_v3_tunneled_dl': (None, _parse_dirreq_v3_tunneled_dl_line), 'dir_v2_tunneled_dl_unknown': (None, _parse_dirreq_v2_tunneled_dl_line), 'dir_v3_tunneled_dl_unknown': (None, _parse_dirreq_v3_tunneled_dl_line), 'dir_read_history_end': (None, _parse_dirreq_read_history_line), 'dir_read_history_interval': (None, _parse_dirreq_read_history_line), 'dir_read_history_values': (None, _parse_dirreq_read_history_line), 'dir_write_history_end': (None, _parse_dirreq_write_history_line), 'dir_write_history_interval': (None, _parse_dirreq_write_history_line), 'dir_write_history_values': (None, _parse_dirreq_write_history_line), 'entry_stats_end': (None, _parse_entry_stats_end_line), 'entry_stats_interval': (None, _parse_entry_stats_end_line), 'entry_ips': (None, _parse_entry_ips_line), 'exit_stats_end': (None, _parse_exit_stats_end_line), 'exit_stats_interval': (None, _parse_exit_stats_end_line), 'exit_kibibytes_written': (None, _parse_exit_kibibytes_written_line), 'exit_kibibytes_read': (None, _parse_exit_kibibytes_read_line), 'exit_streams_opened': (None, _parse_exit_streams_opened_line), 'hs_stats_end': (None, _parse_hidden_service_stats_end_line), 'hs_rend_cells': (None, _parse_hidden_service_rend_relayed_cells_line), 'hs_rend_cells_attr': ({}, _parse_hidden_service_rend_relayed_cells_line), 'hs_dir_onions_seen': (None, _parse_hidden_service_dir_onions_seen_line), 'hs_dir_onions_seen_attr': ({}, _parse_hidden_service_dir_onions_seen_line), 'padding_counts': ({}, _parse_padding_counts_line), 'padding_counts_end': (None, _parse_padding_counts_line), 'padding_counts_interval': (None, _parse_padding_counts_line), 'bridge_stats_end': (None, _parse_bridge_stats_end_line), 'bridge_stats_interval': (None, _parse_bridge_stats_end_line), 'bridge_ips': (None, _parse_bridge_ips_line), 'geoip_start_time': (None, _parse_geoip_start_time_line), 'geoip_client_origins': (None, _parse_geoip_client_origins_line), 'ip_versions': (None, _parse_bridge_ip_versions_line), 'ip_transports': (None, _parse_bridge_ip_transports_line), } PARSER_FOR_LINE = { 'extra-info': _parse_extra_info_line, 'geoip-db-digest': _parse_geoip_db_digest_line, 'geoip6-db-digest': _parse_geoip6_db_digest_line, 'transport': _parse_transport_line, 'cell-circuits-per-decile': _parse_cell_circuits_per_decline_line, 'dirreq-v2-resp': _parse_dirreq_v2_resp_line, 'dirreq-v3-resp': _parse_dirreq_v3_resp_line, 'dirreq-v2-direct-dl': _parse_dirreq_v2_direct_dl_line, 'dirreq-v3-direct-dl': _parse_dirreq_v3_direct_dl_line, 'dirreq-v2-tunneled-dl': _parse_dirreq_v2_tunneled_dl_line, 'dirreq-v3-tunneled-dl': _parse_dirreq_v3_tunneled_dl_line, 'dirreq-v2-share': _parse_dirreq_v2_share_line, 'dirreq-v3-share': _parse_dirreq_v3_share_line, 'cell-processed-cells': _parse_cell_processed_cells_line, 'cell-queued-cells': _parse_cell_queued_cells_line, 'cell-time-in-queue': _parse_cell_time_in_queue_line, 'published': _parse_published_line, 'geoip-start-time': _parse_geoip_start_time_line, 'cell-stats-end': _parse_cell_stats_end_line, 'entry-stats-end': _parse_entry_stats_end_line, 'exit-stats-end': _parse_exit_stats_end_line, 'bridge-stats-end': _parse_bridge_stats_end_line, 'dirreq-stats-end': _parse_dirreq_stats_end_line, 'conn-bi-direct': _parse_conn_bi_direct_line, 'read-history': _parse_read_history_line, 'write-history': _parse_write_history_line, 'dirreq-read-history': _parse_dirreq_read_history_line, 'dirreq-write-history': _parse_dirreq_write_history_line, 'exit-kibibytes-written': _parse_exit_kibibytes_written_line, 'exit-kibibytes-read': _parse_exit_kibibytes_read_line, 'exit-streams-opened': _parse_exit_streams_opened_line, 'hidserv-stats-end': _parse_hidden_service_stats_end_line, 'hidserv-rend-relayed-cells': _parse_hidden_service_rend_relayed_cells_line, 'hidserv-dir-onions-seen': _parse_hidden_service_dir_onions_seen_line, 'padding-counts': _parse_padding_counts_line, 'dirreq-v2-ips': _parse_dirreq_v2_ips_line, 'dirreq-v3-ips': _parse_dirreq_v3_ips_line, 'dirreq-v2-reqs': _parse_dirreq_v2_reqs_line, 'dirreq-v3-reqs': _parse_dirreq_v3_reqs_line, 'geoip-client-origins': _parse_geoip_client_origins_line, 'entry-ips': _parse_entry_ips_line, 'bridge-ips': _parse_bridge_ips_line, 'bridge-ip-versions': _parse_bridge_ip_versions_line, 'bridge-ip-transports': _parse_bridge_ip_transports_line, } def __init__(self, raw_contents, validate = False): """ Extra-info descriptor constructor. By default this validates the descriptor's content as it's parsed. This validation can be disabled to either improve performance or be accepting of malformed data. :param str raw_contents: extra-info content provided by the relay :param bool validate: checks the validity of the extra-info descriptor if **True**, skips these checks otherwise :raises: **ValueError** if the contents is malformed and validate is True """ super(ExtraInfoDescriptor, self).__init__(raw_contents, lazy_load = not validate) entries = _descriptor_components(raw_contents, validate) if validate: for keyword in self._required_fields(): if keyword not in entries: raise ValueError("Extra-info descriptor must have a '%s' entry" % keyword) for keyword in self._required_fields() + SINGLE_FIELDS: if keyword in entries and len(entries[keyword]) > 1: raise ValueError("The '%s' entry can only appear once in an extra-info descriptor" % keyword) expected_first_keyword = self._first_keyword() if expected_first_keyword and expected_first_keyword != list(entries.keys())[0]: raise ValueError("Extra-info descriptor must start with a '%s' entry" % expected_first_keyword) expected_last_keyword = self._last_keyword() if expected_last_keyword and expected_last_keyword != list(entries.keys())[-1]: raise ValueError("Descriptor must end with a '%s' entry" % expected_last_keyword) self._parse(entries, validate) else: self._entries = entries def digest(self): """ Provides the upper-case hex encoded sha1 of our content. This value is part of the server descriptor entry for this relay. :returns: **str** with the upper-case hex digest value for this server descriptor """ raise NotImplementedError('Unsupported Operation: this should be implemented by the ExtraInfoDescriptor subclass') def _required_fields(self): return REQUIRED_FIELDS def _first_keyword(self): return 'extra-info' def _last_keyword(self): return 'router-signature' class RelayExtraInfoDescriptor(ExtraInfoDescriptor): """ Relay extra-info descriptor, constructed from data such as that provided by 'GETINFO extra-info/digest/\*', cached descriptors, and metrics (`specification `_). :var ed25519_certificate str: base64 encoded ed25519 certificate :var ed25519_signature str: signature of this document using ed25519 :var str signature: **\*** signature for this extrainfo descriptor **\*** attribute is required when we're parsed with validation .. versionchanged:: 1.5.0 Added the ed25519_certificate and ed25519_signature attributes. """ ATTRIBUTES = dict(ExtraInfoDescriptor.ATTRIBUTES, **{ 'ed25519_certificate': (None, _parse_identity_ed25519_line), 'ed25519_signature': (None, _parse_router_sig_ed25519_line), 'signature': (None, _parse_router_signature_line), }) PARSER_FOR_LINE = dict(ExtraInfoDescriptor.PARSER_FOR_LINE, **{ 'identity-ed25519': _parse_identity_ed25519_line, 'router-sig-ed25519': _parse_router_sig_ed25519_line, 'router-signature': _parse_router_signature_line, }) @classmethod def content(cls, attr = None, exclude = (), sign = False, signing_key = None): base_header = ( ('extra-info', '%s %s' % (_random_nickname(), _random_fingerprint())), ('published', _random_date()), ) if signing_key: sign = True if sign: if attr and 'router-signature' in attr: raise ValueError('Cannot sign the descriptor if a router-signature has been provided') if signing_key is None: signing_key = create_signing_key() content = _descriptor_content(attr, exclude, base_header) + b'\nrouter-signature\n' return _append_router_signature(content, signing_key.private) else: return _descriptor_content(attr, exclude, base_header, ( ('router-signature', _random_crypto_blob('SIGNATURE')), )) @classmethod def create(cls, attr = None, exclude = (), validate = True, sign = False, signing_key = None): return cls(cls.content(attr, exclude, sign, signing_key), validate = validate) @lru_cache() def digest(self): # our digest is calculated from everything except our signature raw_content, ending = str(self), '\nrouter-signature\n' raw_content = raw_content[:raw_content.find(ending) + len(ending)] return hashlib.sha1(stem.util.str_tools._to_bytes(raw_content)).hexdigest().upper() class BridgeExtraInfoDescriptor(ExtraInfoDescriptor): """ Bridge extra-info descriptor (`bridge descriptor specification `_) :var str ed25519_certificate_hash: sha256 hash of the original identity-ed25519 :var str router_digest_sha256: sha256 digest of this document .. versionchanged:: 1.5.0 Added the ed25519_certificate_hash and router_digest_sha256 attributes. """ ATTRIBUTES = dict(ExtraInfoDescriptor.ATTRIBUTES, **{ 'ed25519_certificate_hash': (None, _parse_master_key_ed25519_line), 'router_digest_sha256': (None, _parse_router_digest_sha256_line), '_digest': (None, _parse_router_digest_line), }) PARSER_FOR_LINE = dict(ExtraInfoDescriptor.PARSER_FOR_LINE, **{ 'master-key-ed25519': _parse_master_key_ed25519_line, 'router-digest-sha256': _parse_router_digest_sha256_line, 'router-digest': _parse_router_digest_line, }) @classmethod def content(cls, attr = None, exclude = (), sign = False): if sign: raise NotImplementedError('Signing of %s not implemented' % cls.__name__) return _descriptor_content(attr, exclude, ( ('extra-info', 'ec2bridgereaac65a3 %s' % _random_fingerprint()), ('published', _random_date()), ), ( ('router-digest', _random_fingerprint()), )) def digest(self): return self._digest def _required_fields(self): excluded_fields = [ 'router-signature', ] included_fields = [ 'router-digest', ] return tuple(included_fields + [f for f in REQUIRED_FIELDS if f not in excluded_fields]) def _last_keyword(self): return None stem-1.7.1/stem/descriptor/hidden_service_descriptor.py0000664000175000017500000004055013411002341024114 0ustar atagaratagar00000000000000# Copyright 2015-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Parsing for Tor hidden service descriptors as described in Tor's `rend-spec `_. Unlike other descriptor types these describe a hidden service rather than a relay. They're created by the service, and can only be fetched via relays with the HSDir flag. These are only available through the Controller's :func:`~stem.control.get_hidden_service_descriptor` method. **Module Overview:** :: HiddenServiceDescriptor - Tor hidden service descriptor. .. versionadded:: 1.4.0 """ import base64 import binascii import collections import hashlib import io import stem.prereq import stem.util.connection import stem.util.str_tools from stem.descriptor import ( PGP_BLOCK_END, Descriptor, _descriptor_content, _descriptor_components, _read_until_keywords, _bytes_for_block, _value, _parse_simple_line, _parse_timestamp_line, _parse_key_block, _random_date, _random_crypto_blob, ) if stem.prereq._is_lru_cache_available(): from functools import lru_cache else: from stem.util.lru_cache import lru_cache REQUIRED_FIELDS = ( 'rendezvous-service-descriptor', 'version', 'permanent-key', 'secret-id-part', 'publication-time', 'protocol-versions', 'signature', ) INTRODUCTION_POINTS_ATTR = { 'identifier': None, 'address': None, 'port': None, 'onion_key': None, 'service_key': None, 'intro_authentication': [], } # introduction-point fields that can only appear once SINGLE_INTRODUCTION_POINT_FIELDS = [ 'introduction-point', 'ip-address', 'onion-port', 'onion-key', 'service-key', ] BASIC_AUTH = 1 STEALTH_AUTH = 2 class IntroductionPoints(collections.namedtuple('IntroductionPoints', INTRODUCTION_POINTS_ATTR.keys())): """ :var str identifier: hash of this introduction point's identity key :var str address: address of this introduction point :var int port: port where this introduction point is listening :var str onion_key: public key for communicating with this introduction point :var str service_key: public key for communicating with this hidden service :var list intro_authentication: tuples of the form (auth_type, auth_data) for establishing a connection """ class DecryptionFailure(Exception): """ Failure to decrypt the hidden service descriptor's introduction-points. """ def _parse_file(descriptor_file, validate = False, **kwargs): """ Iterates over the hidden service descriptors in a file. :param file descriptor_file: file with descriptor content :param bool validate: checks the validity of the descriptor's content if **True**, skips these checks otherwise :param dict kwargs: additional arguments for the descriptor constructor :returns: iterator for :class:`~stem.descriptor.hidden_service_descriptor.HiddenServiceDescriptor` instances in the file :raises: * **ValueError** if the contents is malformed and validate is **True** * **IOError** if the file can't be read """ while True: descriptor_content = _read_until_keywords('signature', descriptor_file) # we've reached the 'signature', now include the pgp style block block_end_prefix = PGP_BLOCK_END.split(' ', 1)[0] descriptor_content += _read_until_keywords(block_end_prefix, descriptor_file, True) if descriptor_content: if descriptor_content[0].startswith(b'@type'): descriptor_content = descriptor_content[1:] yield HiddenServiceDescriptor(bytes.join(b'', descriptor_content), validate, **kwargs) else: break # done parsing file def _parse_version_line(descriptor, entries): value = _value('version', entries) if value.isdigit(): descriptor.version = int(value) else: raise ValueError('version line must have a positive integer value: %s' % value) def _parse_protocol_versions_line(descriptor, entries): value = _value('protocol-versions', entries) try: versions = [int(entry) for entry in value.split(',')] except ValueError: raise ValueError('protocol-versions line has non-numeric versoins: protocol-versions %s' % value) for v in versions: if v <= 0: raise ValueError('protocol-versions must be positive integers: %s' % value) descriptor.protocol_versions = versions def _parse_introduction_points_line(descriptor, entries): _, block_type, block_contents = entries['introduction-points'][0] if not block_contents or block_type != 'MESSAGE': raise ValueError("'introduction-points' should be followed by a MESSAGE block, but was a %s" % block_type) descriptor.introduction_points_encoded = block_contents descriptor.introduction_points_auth = [] # field was never implemented in tor (#15190) try: descriptor.introduction_points_content = _bytes_for_block(block_contents) except TypeError: raise ValueError("'introduction-points' isn't base64 encoded content:\n%s" % block_contents) _parse_rendezvous_service_descriptor_line = _parse_simple_line('rendezvous-service-descriptor', 'descriptor_id') _parse_permanent_key_line = _parse_key_block('permanent-key', 'permanent_key', 'RSA PUBLIC KEY') _parse_secret_id_part_line = _parse_simple_line('secret-id-part', 'secret_id_part') _parse_publication_time_line = _parse_timestamp_line('publication-time', 'published') _parse_signature_line = _parse_key_block('signature', 'signature', 'SIGNATURE') class HiddenServiceDescriptor(Descriptor): """ Hidden service descriptor. :var str descriptor_id: **\*** identifier for this descriptor, this is a base32 hash of several fields :var int version: **\*** hidden service descriptor version :var str permanent_key: **\*** long term key of the hidden service :var str secret_id_part: **\*** hash of the time period, cookie, and replica values so our descriptor_id can be validated :var datetime published: **\*** time in UTC when this descriptor was made :var list protocol_versions: **\*** list of **int** versions that are supported when establishing a connection :var str introduction_points_encoded: raw introduction points blob :var list introduction_points_auth: **\*** tuples of the form (auth_method, auth_data) for our introduction_points_content (**deprecated**, always **[]**) :var bytes introduction_points_content: decoded introduction-points content without authentication data, if using cookie authentication this is encrypted :var str signature: signature of the descriptor content **\*** attribute is either required when we're parsed with validation or has a default value, others are left as **None** if undefined .. versionchanged:: 1.6.0 Moved from the deprecated `pycrypto `_ module to `cryptography `_ for validating signatures. .. versionchanged:: 1.6.0 Added the **skip_crypto_validation** constructor argument. """ ATTRIBUTES = { 'descriptor_id': (None, _parse_rendezvous_service_descriptor_line), 'version': (None, _parse_version_line), 'permanent_key': (None, _parse_permanent_key_line), 'secret_id_part': (None, _parse_secret_id_part_line), 'published': (None, _parse_publication_time_line), 'protocol_versions': ([], _parse_protocol_versions_line), 'introduction_points_encoded': (None, _parse_introduction_points_line), 'introduction_points_auth': ([], _parse_introduction_points_line), 'introduction_points_content': (None, _parse_introduction_points_line), 'signature': (None, _parse_signature_line), } PARSER_FOR_LINE = { 'rendezvous-service-descriptor': _parse_rendezvous_service_descriptor_line, 'version': _parse_version_line, 'permanent-key': _parse_permanent_key_line, 'secret-id-part': _parse_secret_id_part_line, 'publication-time': _parse_publication_time_line, 'protocol-versions': _parse_protocol_versions_line, 'introduction-points': _parse_introduction_points_line, 'signature': _parse_signature_line, } @classmethod def content(cls, attr = None, exclude = (), sign = False): if sign: raise NotImplementedError('Signing of %s not implemented' % cls.__name__) return _descriptor_content(attr, exclude, ( ('rendezvous-service-descriptor', 'y3olqqblqw2gbh6phimfuiroechjjafa'), ('version', '2'), ('permanent-key', _random_crypto_blob('RSA PUBLIC KEY')), ('secret-id-part', 'e24kgecavwsznj7gpbktqsiwgvngsf4e'), ('publication-time', _random_date()), ('protocol-versions', '2,3'), ('introduction-points', '\n-----BEGIN MESSAGE-----\n-----END MESSAGE-----'), ), ( ('signature', _random_crypto_blob('SIGNATURE')), )) @classmethod def create(cls, attr = None, exclude = (), validate = True, sign = False): return cls(cls.content(attr, exclude, sign), validate = validate, skip_crypto_validation = not sign) def __init__(self, raw_contents, validate = False, skip_crypto_validation = False): super(HiddenServiceDescriptor, self).__init__(raw_contents, lazy_load = not validate) entries = _descriptor_components(raw_contents, validate, non_ascii_fields = ('introduction-points')) if validate: for keyword in REQUIRED_FIELDS: if keyword not in entries: raise ValueError("Hidden service descriptor must have a '%s' entry" % keyword) elif keyword in entries and len(entries[keyword]) > 1: raise ValueError("The '%s' entry can only appear once in a hidden service descriptor" % keyword) if 'rendezvous-service-descriptor' != list(entries.keys())[0]: raise ValueError("Hidden service descriptor must start with a 'rendezvous-service-descriptor' entry") elif 'signature' != list(entries.keys())[-1]: raise ValueError("Hidden service descriptor must end with a 'signature' entry") self._parse(entries, validate) if not skip_crypto_validation and stem.prereq.is_crypto_available(): signed_digest = self._digest_for_signature(self.permanent_key, self.signature) content_digest = self._digest_for_content(b'rendezvous-service-descriptor ', b'\nsignature\n') if signed_digest != content_digest: raise ValueError('Decrypted digest does not match local digest (calculated: %s, local: %s)' % (signed_digest, content_digest)) else: self._entries = entries @lru_cache() def introduction_points(self, authentication_cookie = None): """ Provided this service's introduction points. :returns: **list** of :class:`~stem.descriptor.hidden_service_descriptor.IntroductionPoints` :raises: * **ValueError** if the our introduction-points is malformed * **DecryptionFailure** if unable to decrypt this field """ content = self.introduction_points_content if not content: return [] elif authentication_cookie: if not stem.prereq.is_crypto_available(): raise DecryptionFailure('Decrypting introduction-points requires the cryptography module') try: missing_padding = len(authentication_cookie) % 4 authentication_cookie = base64.b64decode(stem.util.str_tools._to_bytes(authentication_cookie) + b'=' * missing_padding) except TypeError as exc: raise DecryptionFailure('authentication_cookie must be a base64 encoded string (%s)' % exc) authentication_type = int(binascii.hexlify(content[0:1]), 16) if authentication_type == BASIC_AUTH: content = HiddenServiceDescriptor._decrypt_basic_auth(content, authentication_cookie) elif authentication_type == STEALTH_AUTH: content = HiddenServiceDescriptor._decrypt_stealth_auth(content, authentication_cookie) else: raise DecryptionFailure("Unrecognized authentication type '%s', currently we only support basic auth (%s) and stealth auth (%s)" % (authentication_type, BASIC_AUTH, STEALTH_AUTH)) if not content.startswith(b'introduction-point '): raise DecryptionFailure('Unable to decrypt the introduction-points, maybe this is the wrong key?') elif not content.startswith(b'introduction-point '): raise DecryptionFailure('introduction-points content is encrypted, you need to provide its authentication_cookie') return HiddenServiceDescriptor._parse_introduction_points(content) @staticmethod def _decrypt_basic_auth(content, authentication_cookie): from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend try: client_blocks = int(binascii.hexlify(content[1:2]), 16) except ValueError: raise DecryptionFailure("When using basic auth the content should start with a number of blocks but wasn't a hex digit: %s" % binascii.hexlify(content[1:2])) # parse the client id and encrypted session keys client_entries_length = client_blocks * 16 * 20 client_entries = content[2:2 + client_entries_length] client_keys = [(client_entries[i:i + 4], client_entries[i + 4:i + 20]) for i in range(0, client_entries_length, 4 + 16)] iv = content[2 + client_entries_length:2 + client_entries_length + 16] encrypted = content[2 + client_entries_length + 16:] client_id = hashlib.sha1(authentication_cookie + iv).digest()[:4] for entry_id, encrypted_session_key in client_keys: if entry_id != client_id: continue # not the session key for this client # try decrypting the session key cipher = Cipher(algorithms.AES(authentication_cookie), modes.CTR(b'\x00' * len(iv)), default_backend()) decryptor = cipher.decryptor() session_key = decryptor.update(encrypted_session_key) + decryptor.finalize() # attempt to decrypt the intro points with the session key cipher = Cipher(algorithms.AES(session_key), modes.CTR(iv), default_backend()) decryptor = cipher.decryptor() decrypted = decryptor.update(encrypted) + decryptor.finalize() # check if the decryption looks correct if decrypted.startswith(b'introduction-point '): return decrypted return content # nope, unable to decrypt the content @staticmethod def _decrypt_stealth_auth(content, authentication_cookie): from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend # byte 1 = authentication type, 2-17 = input vector, 18 on = encrypted content iv, encrypted = content[1:17], content[17:] cipher = Cipher(algorithms.AES(authentication_cookie), modes.CTR(iv), default_backend()) decryptor = cipher.decryptor() return decryptor.update(encrypted) + decryptor.finalize() @staticmethod def _parse_introduction_points(content): """ Provides the parsed list of IntroductionPoints for the unencrypted content. """ introduction_points = [] content_io = io.BytesIO(content) while True: content = b''.join(_read_until_keywords('introduction-point', content_io, ignore_first = True)) if not content: break # reached the end attr = dict(INTRODUCTION_POINTS_ATTR) entries = _descriptor_components(content, False) for keyword, values in list(entries.items()): value, block_type, block_contents = values[0] if keyword in SINGLE_INTRODUCTION_POINT_FIELDS and len(values) > 1: raise ValueError("'%s' can only appear once in an introduction-point block, but appeared %i times" % (keyword, len(values))) if keyword == 'introduction-point': attr['identifier'] = value elif keyword == 'ip-address': if not stem.util.connection.is_valid_ipv4_address(value): raise ValueError("'%s' is an invalid IPv4 address" % value) attr['address'] = value elif keyword == 'onion-port': if not stem.util.connection.is_valid_port(value): raise ValueError("'%s' is an invalid port" % value) attr['port'] = int(value) elif keyword == 'onion-key': attr['onion_key'] = block_contents elif keyword == 'service-key': attr['service_key'] = block_contents elif keyword == 'intro-authentication': auth_entries = [] for auth_value, _, _ in values: if ' ' not in auth_value: raise ValueError("We expected 'intro-authentication [auth_type] [auth_data]', but had '%s'" % auth_value) auth_type, auth_data = auth_value.split(' ')[:2] auth_entries.append((auth_type, auth_data)) introduction_points.append(IntroductionPoints(**attr)) return introduction_points stem-1.7.1/stem/descriptor/export.py0000664000175000017500000001010413344455475020245 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Toolkit for exporting descriptors to other formats. **Module Overview:** :: export_csv - Exports descriptors to a CSV export_csv_file - Writes exported CSV output to a file .. deprecated:: 1.7.0 This module will likely be removed in Stem 2.0 due to lack of usage. If you use this modle please `let me know `_. """ import csv try: from cStringIO import StringIO except ImportError: from io import StringIO import stem.descriptor import stem.prereq class _ExportDialect(csv.excel): lineterminator = '\n' def export_csv(descriptors, included_fields = (), excluded_fields = (), header = True): """ Provides a newline separated CSV for one or more descriptors. If simply provided with descriptors then the CSV contains all of its attributes, labeled with a header row. Either 'included_fields' or 'excluded_fields' can be used for more granular control over its attributes and the order. :param Descriptor,list descriptors: either a :class:`~stem.descriptor.Descriptor` or list of descriptors to be exported :param list included_fields: attributes to include in the csv :param list excluded_fields: attributes to exclude from the csv :param bool header: if **True** then the first line will be a comma separated list of the attribute names (**only supported in python 2.7 and higher**) :returns: **str** of the CSV for the descriptors, one per line :raises: **ValueError** if descriptors contain more than one descriptor type """ output_buffer = StringIO() export_csv_file(output_buffer, descriptors, included_fields, excluded_fields, header) return output_buffer.getvalue() def export_csv_file(output_file, descriptors, included_fields = (), excluded_fields = (), header = True): """ Similar to :func:`stem.descriptor.export.export_csv`, except that the CSV is written directly to a file. :param file output_file: file to be written to :param Descriptor,list descriptors: either a :class:`~stem.descriptor.Descriptor` or list of descriptors to be exported :param list included_fields: attributes to include in the csv :param list excluded_fields: attributes to exclude from the csv :param bool header: if **True** then the first line will be a comma separated list of the attribute names (**only supported in python 2.7 and higher**) :returns: **str** of the CSV for the descriptors, one per line :raises: **ValueError** if descriptors contain more than one descriptor type """ if isinstance(descriptors, stem.descriptor.Descriptor): descriptors = (descriptors,) if not descriptors: return descriptor_type = type(descriptors[0]) descriptor_type_label = descriptor_type.__name__ included_fields = list(included_fields) # If the user didn't specify the fields to include then export everything, # ordered alphabetically. If they did specify fields then make sure that # they exist. desc_attr = sorted(vars(descriptors[0]).keys()) if included_fields: for field in included_fields: if field not in desc_attr: raise ValueError("%s does not have a '%s' attribute, valid fields are: %s" % (descriptor_type_label, field, ', '.join(desc_attr))) else: included_fields = [attr for attr in desc_attr if not attr.startswith('_')] for field in excluded_fields: try: included_fields.remove(field) except ValueError: pass writer = csv.DictWriter(output_file, included_fields, dialect = _ExportDialect(), extrasaction='ignore') if header and not stem.prereq._is_python_26(): writer.writeheader() for desc in descriptors: if not isinstance(desc, stem.descriptor.Descriptor): raise ValueError('Unable to export a descriptor CSV since %s is not a descriptor.' % type(desc).__name__) elif descriptor_type != type(desc): raise ValueError('To export a descriptor CSV all of the descriptors must be of the same type. First descriptor was a %s but we later got a %s.' % (descriptor_type_label, type(desc))) writer.writerow(vars(desc)) stem-1.7.1/stem/descriptor/router_status_entry.py0000664000175000017500000006044213411002341023051 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Parsing for router status entries, the information for individual routers within a network status document. This information is provided from a few sources... * control port via 'GETINFO ns/\*' and 'GETINFO md/\*' queries * router entries in a network status document, like the cached-consensus **Module Overview:** :: RouterStatusEntry - Common parent for router status entries |- RouterStatusEntryV2 - Entry for a network status v2 document |- RouterStatusEntryV3 - Entry for a network status v3 document +- RouterStatusEntryMicroV3 - Entry for a microdescriptor flavored v3 document """ import base64 import binascii import stem.exit_policy import stem.prereq import stem.util.str_tools from stem.descriptor import ( KEYWORD_LINE, Descriptor, _descriptor_content, _value, _values, _descriptor_components, _parse_protocol_line, _read_until_keywords, _random_nickname, _random_ipv4_address, _random_date, ) _parse_pr_line = _parse_protocol_line('pr', 'protocols') def _parse_file(document_file, validate, entry_class, entry_keyword = 'r', start_position = None, end_position = None, section_end_keywords = (), extra_args = ()): """ Reads a range of the document_file containing some number of entry_class instances. We deliminate the entry_class entries by the keyword on their first line (entry_keyword). When finished the document is left at the end_position. Either an end_position or section_end_keywords must be provided. :param file document_file: file with network status document content :param bool validate: checks the validity of the document's contents if **True**, skips these checks otherwise :param class entry_class: class to construct instance for :param str entry_keyword: first keyword for the entry instances :param int start_position: start of the section, default is the current position :param int end_position: end of the section :param tuple section_end_keywords: keyword(s) that deliminate the end of the section if no end_position was provided :param tuple extra_args: extra arguments for the entry_class (after the content and validate flag) :returns: iterator over entry_class instances :raises: * **ValueError** if the contents is malformed and validate is **True** * **IOError** if the file can't be read """ if start_position: document_file.seek(start_position) else: start_position = document_file.tell() # check if we're starting at the end of the section (ie, there's no entries to read) if section_end_keywords: first_keyword = None line_match = KEYWORD_LINE.match(stem.util.str_tools._to_unicode(document_file.readline())) if line_match: first_keyword = line_match.groups()[0] document_file.seek(start_position) if first_keyword in section_end_keywords: return while end_position is None or document_file.tell() < end_position: desc_lines, ending_keyword = _read_until_keywords( (entry_keyword,) + section_end_keywords, document_file, ignore_first = True, end_position = end_position, include_ending_keyword = True ) desc_content = bytes.join(b'', desc_lines) if desc_content: yield entry_class(desc_content, validate, *extra_args) # check if we stopped at the end of the section if ending_keyword in section_end_keywords: break else: break def _parse_r_line(descriptor, entries): # Parses a RouterStatusEntry's 'r' line. They're very nearly identical for # all current entry types (v2, v3, and microdescriptor v3) with one little # wrinkle: only the microdescriptor flavor excludes a 'digest' field. # # For v2 and v3 router status entries: # "r" nickname identity digest publication IP ORPort DirPort # example: r mauer BD7xbfsCFku3+tgybEZsg8Yjhvw itcuKQ6PuPLJ7m/Oi928WjO2j8g 2012-06-22 13:19:32 80.101.105.103 9001 0 # # For v3 microdescriptor router status entries: # "r" nickname identity publication IP ORPort DirPort # example: r Konata ARIJF2zbqirB9IwsW0mQznccWww 2012-09-24 13:40:40 69.64.48.168 9001 9030 value = _value('r', entries) include_digest = not isinstance(descriptor, RouterStatusEntryMicroV3) r_comp = value.split(' ') # inject a None for the digest to normalize the field positioning if not include_digest: r_comp.insert(2, None) if len(r_comp) < 8: expected_field_count = 'eight' if include_digest else 'seven' raise ValueError("%s 'r' line must have %s values: r %s" % (descriptor._name(), expected_field_count, value)) if not stem.util.tor_tools.is_valid_nickname(r_comp[0]): raise ValueError("%s nickname isn't valid: %s" % (descriptor._name(), r_comp[0])) elif not stem.util.connection.is_valid_ipv4_address(r_comp[5]): raise ValueError("%s address isn't a valid IPv4 address: %s" % (descriptor._name(), r_comp[5])) elif not stem.util.connection.is_valid_port(r_comp[6]): raise ValueError('%s ORPort is invalid: %s' % (descriptor._name(), r_comp[6])) elif not stem.util.connection.is_valid_port(r_comp[7], allow_zero = True): raise ValueError('%s DirPort is invalid: %s' % (descriptor._name(), r_comp[7])) descriptor.nickname = r_comp[0] descriptor.fingerprint = _base64_to_hex(r_comp[1]) if include_digest: descriptor.digest = _base64_to_hex(r_comp[2]) descriptor.address = r_comp[5] descriptor.or_port = int(r_comp[6]) descriptor.dir_port = None if r_comp[7] == '0' else int(r_comp[7]) try: published = '%s %s' % (r_comp[3], r_comp[4]) descriptor.published = stem.util.str_tools._parse_timestamp(published) except ValueError: raise ValueError("Publication time time wasn't parsable: r %s" % value) def _parse_a_line(descriptor, entries): # "a" SP address ":" portlist # example: a [2001:888:2133:0:82:94:251:204]:9001 or_addresses = [] for value in _values('a', entries): if ':' not in value: raise ValueError("%s 'a' line must be of the form '[address]:[ports]': a %s" % (descriptor._name(), value)) address, port = value.rsplit(':', 1) if not stem.util.connection.is_valid_ipv4_address(address) and not stem.util.connection.is_valid_ipv6_address(address, allow_brackets = True): raise ValueError("%s 'a' line must start with an IPv6 address: a %s" % (descriptor._name(), value)) if stem.util.connection.is_valid_port(port): or_addresses.append((address.lstrip('[').rstrip(']'), int(port), stem.util.connection.is_valid_ipv6_address(address, allow_brackets = True))) else: raise ValueError("%s 'a' line had an invalid port (%s): a %s" % (descriptor._name(), port, value)) descriptor.or_addresses = or_addresses def _parse_s_line(descriptor, entries): # "s" Flags # example: s Named Running Stable Valid value = _value('s', entries) flags = [] if value == '' else value.split(' ') descriptor.flags = flags for flag in flags: if flags.count(flag) > 1: raise ValueError('%s had duplicate flags: s %s' % (descriptor._name(), value)) elif flag == '': raise ValueError("%s had extra whitespace on its 's' line: s %s" % (descriptor._name(), value)) def _parse_v_line(descriptor, entries): # "v" version # example: v Tor 0.2.2.35 # # The spec says that if this starts with "Tor " then what follows is a # tor version. If not then it has "upgraded to a more sophisticated # protocol versioning system". value = _value('v', entries) descriptor.version_line = value if value.startswith('Tor '): try: descriptor.version = stem.version._get_version(value[4:]) except ValueError as exc: raise ValueError('%s has a malformed tor version (%s): v %s' % (descriptor._name(), exc, value)) def _parse_w_line(descriptor, entries): # "w" "Bandwidth=" INT ["Measured=" INT] ["Unmeasured=1"] # example: w Bandwidth=7980 value = _value('w', entries) w_comp = value.split(' ') if len(w_comp) < 1: raise ValueError("%s 'w' line is blank: w %s" % (descriptor._name(), value)) elif not w_comp[0].startswith('Bandwidth='): raise ValueError("%s 'w' line needs to start with a 'Bandwidth=' entry: w %s" % (descriptor._name(), value)) bandwidth = None measured = None is_unmeasured = False unrecognized_bandwidth_entries = [] for w_entry in w_comp: if '=' in w_entry: w_key, w_value = w_entry.split('=', 1) else: w_key, w_value = w_entry, None if w_key == 'Bandwidth': if not (w_value and w_value.isdigit()): raise ValueError("%s 'Bandwidth=' entry needs to have a numeric value: w %s" % (descriptor._name(), value)) bandwidth = int(w_value) elif w_key == 'Measured': if not (w_value and w_value.isdigit()): raise ValueError("%s 'Measured=' entry needs to have a numeric value: w %s" % (descriptor._name(), value)) measured = int(w_value) elif w_key == 'Unmeasured': if w_value != '1': raise ValueError("%s 'Unmeasured=' should only have the value of '1': w %s" % (descriptor._name(), value)) is_unmeasured = True else: unrecognized_bandwidth_entries.append(w_entry) descriptor.bandwidth = bandwidth descriptor.measured = measured descriptor.is_unmeasured = is_unmeasured descriptor.unrecognized_bandwidth_entries = unrecognized_bandwidth_entries def _parse_p_line(descriptor, entries): # "p" ("accept" / "reject") PortList # # examples: # # p accept 80,110,143,443,993,995,6660-6669,6697,7000-7001 # p reject 1-65535 value = _value('p', entries) try: descriptor.exit_policy = stem.exit_policy.MicroExitPolicy(value) except ValueError as exc: raise ValueError('%s exit policy is malformed (%s): p %s' % (descriptor._name(), exc, value)) def _parse_id_line(descriptor, entries): # "id" "ed25519" ed25519-identity # # examples: # # id ed25519 none # id ed25519 8RH34kO07Pp+XYwzdoATVyCibIvmbslUjRkAm7J4IA8 value = _value('id', entries) if value: if descriptor.document and not descriptor.document.is_vote: raise ValueError("%s 'id' line should only appear in votes: id %s" % (descriptor._name(), value)) value_comp = value.split() if len(value_comp) >= 2: descriptor.identifier_type = value_comp[0] descriptor.identifier = value_comp[1] else: raise ValueError("'id' lines should contain both the key type and digest: id %s" % value) def _parse_m_line(descriptor, entries): # "m" methods 1*(algorithm "=" digest) # example: m 8,9,10,11,12 sha256=g1vx9si329muxV3tquWIXXySNOIwRGMeAESKs/v4DWs all_hashes = [] for value in _values('m', entries): m_comp = value.split(' ') if not (descriptor.document and descriptor.document.is_vote): vote_status = 'vote' if descriptor.document else '' raise ValueError("%s 'm' line should only appear in votes (appeared in a %s): m %s" % (descriptor._name(), vote_status, value)) elif len(m_comp) < 1: raise ValueError("%s 'm' line needs to start with a series of methods: m %s" % (descriptor._name(), value)) try: methods = [int(entry) for entry in m_comp[0].split(',')] except ValueError: raise ValueError('%s microdescriptor methods should be a series of comma separated integers: m %s' % (descriptor._name(), value)) hashes = {} for entry in m_comp[1:]: if '=' not in entry: raise ValueError("%s can only have a series of 'algorithm=digest' mappings after the methods: m %s" % (descriptor._name(), value)) hash_name, digest = entry.split('=', 1) hashes[hash_name] = digest all_hashes.append((methods, hashes)) descriptor.microdescriptor_hashes = all_hashes def _parse_microdescriptor_m_line(descriptor, entries): # "m" digest # example: m aiUklwBrua82obG5AsTX+iEpkjQA2+AQHxZ7GwMfY70 descriptor.digest = _base64_to_hex(_value('m', entries), check_if_fingerprint = False) def _base64_to_hex(identity, check_if_fingerprint = True): """ Decodes a base64 value to hex. For example... :: >>> _base64_to_hex('p1aag7VwarGxqctS7/fS0y5FU+s') 'A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB' :param str identity: encoded fingerprint from the consensus :param bool check_if_fingerprint: asserts that the result is a fingerprint if **True** :returns: **str** with the uppercase hex encoding of the relay's fingerprint :raises: **ValueError** if the result isn't a valid fingerprint """ # trailing equal signs were stripped from the identity missing_padding = len(identity) % 4 identity += '=' * missing_padding try: identity_decoded = base64.b64decode(stem.util.str_tools._to_bytes(identity)) except (TypeError, binascii.Error): raise ValueError("Unable to decode identity string '%s'" % identity) fingerprint = binascii.hexlify(identity_decoded).upper() if stem.prereq.is_python_3(): fingerprint = stem.util.str_tools._to_unicode(fingerprint) if check_if_fingerprint: if not stem.util.tor_tools.is_valid_fingerprint(fingerprint): raise ValueError("Decoded '%s' to be '%s', which isn't a valid fingerprint" % (identity, fingerprint)) return fingerprint class RouterStatusEntry(Descriptor): """ Information about an individual router stored within a network status document. This is the common parent for concrete status entry types. :var stem.descriptor.networkstatus.NetworkStatusDocument document: **\*** document that this descriptor came from :var str nickname: **\*** router's nickname :var str fingerprint: **\*** router's fingerprint :var datetime published: **\*** router's publication :var str address: **\*** router's IP address :var int or_port: **\*** router's ORPort :var int dir_port: **\*** router's DirPort :var list flags: **\*** list of :data:`~stem.Flag` associated with the relay :var stem.version.Version version: parsed version of tor, this is **None** if the relay's using a new versioning scheme :var str version_line: versioning information reported by the relay """ ATTRIBUTES = { 'nickname': (None, _parse_r_line), 'fingerprint': (None, _parse_r_line), 'published': (None, _parse_r_line), 'address': (None, _parse_r_line), 'or_port': (None, _parse_r_line), 'dir_port': (None, _parse_r_line), 'flags': (None, _parse_s_line), 'version_line': (None, _parse_v_line), 'version': (None, _parse_v_line), } PARSER_FOR_LINE = { 'r': _parse_r_line, 's': _parse_s_line, 'v': _parse_v_line, } def __init__(self, content, validate = False, document = None): """ Parse a router descriptor in a network status document. :param str content: router descriptor content to be parsed :param NetworkStatusDocument document: document this descriptor came from :param bool validate: checks the validity of the content if **True**, skips these checks otherwise :raises: **ValueError** if the descriptor data is invalid """ super(RouterStatusEntry, self).__init__(content, lazy_load = not validate) self.document = document entries = _descriptor_components(content, validate) if validate: for keyword in self._required_fields(): if keyword not in entries: raise ValueError("%s must have a '%s' line:\n%s" % (self._name(True), keyword, str(self))) for keyword in self._single_fields(): if keyword in entries and len(entries[keyword]) > 1: raise ValueError("%s can only have a single '%s' line, got %i:\n%s" % (self._name(True), keyword, len(entries[keyword]), str(self))) if 'r' != list(entries.keys())[0]: raise ValueError("%s are expected to start with a 'r' line:\n%s" % (self._name(True), str(self))) self._parse(entries, validate) else: self._entries = entries def _name(self, is_plural = False): """ Name for this descriptor type. """ return 'Router status entries' if is_plural else 'Router status entry' def _required_fields(self): """ Provides lines that must appear in the descriptor. """ return () def _single_fields(self): """ Provides lines that can only appear in the descriptor once. """ return () def _compare(self, other, method): if not isinstance(other, RouterStatusEntry): return False return method(str(self).strip(), str(other).strip()) def __hash__(self): return hash(str(self).strip()) def __eq__(self, other): return self._compare(other, lambda s, o: s == o) def __ne__(self, other): return not self == other def __lt__(self, other): return self._compare(other, lambda s, o: s < o) def __le__(self, other): return self._compare(other, lambda s, o: s <= o) class RouterStatusEntryV2(RouterStatusEntry): """ Information about an individual router stored within a version 2 network status document. :var str digest: **\*** router's upper-case hex digest **\*** attribute is either required when we're parsed with validation or has a default value, others are left as **None** if undefined """ ATTRIBUTES = dict(RouterStatusEntry.ATTRIBUTES, **{ 'digest': (None, _parse_r_line), }) @classmethod def content(cls, attr = None, exclude = (), sign = False): if sign: raise NotImplementedError('Signing of %s not implemented' % cls.__name__) return _descriptor_content(attr, exclude, ( ('r', '%s p1aag7VwarGxqctS7/fS0y5FU+s oQZFLYe9e4A7bOkWKR7TaNxb0JE %s %s 9001 0' % (_random_nickname(), _random_date(), _random_ipv4_address())), )) def _name(self, is_plural = False): return 'Router status entries (v2)' if is_plural else 'Router status entry (v2)' def _required_fields(self): return ('r') def _single_fields(self): return ('r', 's', 'v') def _compare(self, other, method): if not isinstance(other, RouterStatusEntryV2): return False return method(str(self).strip(), str(other).strip()) def __hash__(self): return hash(str(self).strip()) def __eq__(self, other): return self._compare(other, lambda s, o: s == o) def __ne__(self, other): return not self == other def __lt__(self, other): return self._compare(other, lambda s, o: s < o) def __le__(self, other): return self._compare(other, lambda s, o: s <= o) class RouterStatusEntryV3(RouterStatusEntry): """ Information about an individual router stored within a version 3 network status document. :var list or_addresses: **\*** relay's OR addresses, this is a tuple listing of the form (address (**str**), port (**int**), is_ipv6 (**bool**)) :var str identifier_type: identity digest key type :var str identifier: base64 encoded identity digest :var str digest: **\*** router's upper-case hex digest :var int bandwidth: bandwidth measured to be available by the relay, this is a unit-less heuristic generated by the Bandwidth authoritites to weight relay selection :var int measured: *bandwidth* vote provided by a bandwidth authority :var bool is_unmeasured: *bandwidth* measurement isn't based on three or more measurements :var list unrecognized_bandwidth_entries: **\*** bandwidth weighting information that isn't yet recognized :var stem.exit_policy.MicroExitPolicy exit_policy: router's exit policy :var dict protocols: mapping of protocols to their supported versions :var list microdescriptor_hashes: **\*** tuples of two values, the list of consensus methods for generating a set of digests and the 'algorithm => digest' mappings **\*** attribute is either required when we're parsed with validation or has a default value, others are left as **None** if undefined .. versionchanged:: 1.5.0 Added the identifier and identifier_type attributes. .. versionchanged:: 1.6.0 Added the protocols attribute. """ ATTRIBUTES = dict(RouterStatusEntry.ATTRIBUTES, **{ 'digest': (None, _parse_r_line), 'or_addresses': ([], _parse_a_line), 'identifier_type': (None, _parse_id_line), 'identifier': (None, _parse_id_line), 'bandwidth': (None, _parse_w_line), 'measured': (None, _parse_w_line), 'is_unmeasured': (False, _parse_w_line), 'unrecognized_bandwidth_entries': ([], _parse_w_line), 'exit_policy': (None, _parse_p_line), 'protocols': ({}, _parse_pr_line), 'microdescriptor_hashes': ([], _parse_m_line), }) PARSER_FOR_LINE = dict(RouterStatusEntry.PARSER_FOR_LINE, **{ 'a': _parse_a_line, 'w': _parse_w_line, 'p': _parse_p_line, 'pr': _parse_pr_line, 'id': _parse_id_line, 'm': _parse_m_line, }) @classmethod def content(cls, attr = None, exclude = (), sign = False): if sign: raise NotImplementedError('Signing of %s not implemented' % cls.__name__) return _descriptor_content(attr, exclude, ( ('r', '%s p1aag7VwarGxqctS7/fS0y5FU+s oQZFLYe9e4A7bOkWKR7TaNxb0JE %s %s 9001 0' % (_random_nickname(), _random_date(), _random_ipv4_address())), ('s', 'Fast Named Running Stable Valid'), )) def _name(self, is_plural = False): return 'Router status entries (v3)' if is_plural else 'Router status entry (v3)' def _required_fields(self): return ('r', 's') def _single_fields(self): return ('r', 's', 'v', 'w', 'p', 'pr') def _compare(self, other, method): if not isinstance(other, RouterStatusEntryV3): return False return method(str(self).strip(), str(other).strip()) def __hash__(self): return hash(str(self).strip()) def __eq__(self, other): return self._compare(other, lambda s, o: s == o) def __ne__(self, other): return not self == other def __lt__(self, other): return self._compare(other, lambda s, o: s < o) def __le__(self, other): return self._compare(other, lambda s, o: s <= o) class RouterStatusEntryMicroV3(RouterStatusEntry): """ Information about an individual router stored within a microdescriptor flavored network status document. :var list or_addresses: **\*** relay's OR addresses, this is a tuple listing of the form (address (**str**), port (**int**), is_ipv6 (**bool**)) :var int bandwidth: bandwidth claimed by the relay (in kb/s) :var int measured: bandwidth measured to be available by the relay :var bool is_unmeasured: bandwidth measurement isn't based on three or more measurements :var list unrecognized_bandwidth_entries: **\*** bandwidth weighting information that isn't yet recognized :var dict protocols: mapping of protocols to their supported versions :var str digest: **\*** router's hex encoded digest of our corresponding microdescriptor .. versionchanged:: 1.6.0 Added the protocols attribute. .. versionchanged:: 1.7.0 Added the or_addresses attribute. **\*** attribute is either required when we're parsed with validation or has a default value, others are left as **None** if undefined """ ATTRIBUTES = dict(RouterStatusEntry.ATTRIBUTES, **{ 'or_addresses': ([], _parse_a_line), 'bandwidth': (None, _parse_w_line), 'measured': (None, _parse_w_line), 'is_unmeasured': (False, _parse_w_line), 'unrecognized_bandwidth_entries': ([], _parse_w_line), 'protocols': ({}, _parse_pr_line), 'digest': (None, _parse_microdescriptor_m_line), }) PARSER_FOR_LINE = dict(RouterStatusEntry.PARSER_FOR_LINE, **{ 'a': _parse_a_line, 'w': _parse_w_line, 'm': _parse_microdescriptor_m_line, 'pr': _parse_pr_line, }) @classmethod def content(cls, attr = None, exclude = (), sign = False): if sign: raise NotImplementedError('Signing of %s not implemented' % cls.__name__) return _descriptor_content(attr, exclude, ( ('r', '%s ARIJF2zbqirB9IwsW0mQznccWww %s %s 9001 9030' % (_random_nickname(), _random_date(), _random_ipv4_address())), ('m', 'aiUklwBrua82obG5AsTX+iEpkjQA2+AQHxZ7GwMfY70'), ('s', 'Fast Guard HSDir Named Running Stable V2Dir Valid'), )) def _name(self, is_plural = False): return 'Router status entries (micro v3)' if is_plural else 'Router status entry (micro v3)' def _required_fields(self): return ('r', 's', 'm') def _single_fields(self): return ('r', 's', 'v', 'w', 'm', 'pr') def _compare(self, other, method): if not isinstance(other, RouterStatusEntryMicroV3): return False return method(str(self).strip(), str(other).strip()) def __hash__(self): return hash(str(self).strip()) def __eq__(self, other): return self._compare(other, lambda s, o: s == o) def __ne__(self, other): return not self == other def __lt__(self, other): return self._compare(other, lambda s, o: s < o) def __le__(self, other): return self._compare(other, lambda s, o: s <= o) stem-1.7.1/stem/descriptor/tordnsel.py0000664000175000017500000000754613411002341020545 0ustar atagaratagar00000000000000# Copyright 2013-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Parsing for `TorDNSEL `_ exit list files. :: TorDNSEL - Exit list provided by TorDNSEL """ import stem.util.connection import stem.util.str_tools import stem.util.tor_tools from stem.descriptor import ( Descriptor, _read_until_keywords, _descriptor_components, ) def _parse_file(tordnsel_file, validate = False, **kwargs): """ Iterates over a tordnsel file. :returns: iterator for :class:`~stem.descriptor.tordnsel.TorDNSEL` instances in the file :raises: * **ValueError** if the contents is malformed and validate is **True** * **IOError** if the file can't be read """ # skip content prior to the first ExitNode _read_until_keywords('ExitNode', tordnsel_file, skip = True) while True: contents = _read_until_keywords('ExitAddress', tordnsel_file) contents += _read_until_keywords('ExitNode', tordnsel_file) if contents: yield TorDNSEL(bytes.join(b'', contents), validate, **kwargs) else: break # done parsing file class TorDNSEL(Descriptor): """ TorDNSEL descriptor (`exitlist specification `_) :var str fingerprint: **\*** authority's fingerprint :var datetime published: **\*** time in UTC when this descriptor was made :var datetime last_status: **\*** time in UTC when the relay was seen in a v2 network status :var list exit_addresses: **\*** list of (str address, datetime date) tuples consisting of the found IPv4 exit address and the time **\*** attribute is either required when we're parsed with validation or has a default value, others are left as **None** if undefined """ def __init__(self, raw_contents, validate): super(TorDNSEL, self).__init__(raw_contents) raw_contents = stem.util.str_tools._to_unicode(raw_contents) entries = _descriptor_components(raw_contents, validate) self.fingerprint = None self.published = None self.last_status = None self.exit_addresses = [] self._parse(entries, validate) def _parse(self, entries, validate): for keyword, values in list(entries.items()): value, block_type, block_content = values[0] if validate and block_content: raise ValueError('Unexpected block content: %s' % block_content) if keyword == 'ExitNode': if validate and not stem.util.tor_tools.is_valid_fingerprint(value): raise ValueError('Tor relay fingerprints consist of forty hex digits: %s' % value) self.fingerprint = value elif keyword == 'Published': try: self.published = stem.util.str_tools._parse_timestamp(value) except ValueError: if validate: raise ValueError("Published time wasn't parsable: %s" % value) elif keyword == 'LastStatus': try: self.last_status = stem.util.str_tools._parse_timestamp(value) except ValueError: if validate: raise ValueError("LastStatus time wasn't parsable: %s" % value) elif keyword == 'ExitAddress': for value, block_type, block_content in values: address, date = value.split(' ', 1) if validate: if not stem.util.connection.is_valid_ipv4_address(address): raise ValueError("ExitAddress isn't a valid IPv4 address: %s" % address) elif block_content: raise ValueError('Unexpected block content: %s' % block_content) try: date = stem.util.str_tools._parse_timestamp(date) self.exit_addresses.append((address, date)) except ValueError: if validate: raise ValueError("ExitAddress found time wasn't parsable: %s" % value) elif validate: raise ValueError('Unrecognized keyword: %s' % keyword) stem-1.7.1/stem/descriptor/__init__.py0000664000175000017500000013155113411002341020444 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Package for parsing and processing descriptor data. **Module Overview:** :: parse_file - Parses the descriptors in a file. create - Creates a new custom descriptor. create_signing_key - Cretes a signing key that can be used for creating descriptors. Descriptor - Common parent for all descriptor file types. |- get_path - location of the descriptor on disk if it came from a file |- get_archive_path - location of the descriptor within the archive it came from |- get_bytes - similar to str(), but provides our original bytes content |- get_unrecognized_lines - unparsed descriptor content +- __str__ - string that the descriptor was made from .. data:: DocumentHandler (enum) Ways in which we can parse a :class:`~stem.descriptor.networkstatus.NetworkStatusDocument`. Both **ENTRIES** and **BARE_DOCUMENT** have a 'thin' document, which doesn't have a populated **routers** attribute. This allows for lower memory usage and upfront runtime. However, if read time and memory aren't a concern then **DOCUMENT** can provide you with a fully populated document. Handlers don't change the fact that most methods that provide descriptors return an iterator. In the case of **DOCUMENT** and **BARE_DOCUMENT** that iterator would have just a single item - the document itself. Simple way to handle this is to call **next()** to get the iterator's one and only value... :: import stem.descriptor.remote from stem.descriptor import DocumentHandler consensus = next(stem.descriptor.remote.get_consensus( document_handler = DocumentHandler.BARE_DOCUMENT, ) =================== =========== DocumentHandler Description =================== =========== **ENTRIES** Iterates over the contained :class:`~stem.descriptor.router_status_entry.RouterStatusEntry`. Each has a reference to the bare document it came from (through its **document** attribute). **DOCUMENT** :class:`~stem.descriptor.networkstatus.NetworkStatusDocument` with the :class:`~stem.descriptor.router_status_entry.RouterStatusEntry` it contains (through its **routers** attribute). **BARE_DOCUMENT** :class:`~stem.descriptor.networkstatus.NetworkStatusDocument` **without** a reference to its contents (the :class:`~stem.descriptor.router_status_entry.RouterStatusEntry` are unread). =================== =========== """ import base64 import codecs import collections import copy import hashlib import os import random import re import string import tarfile import stem.prereq import stem.util import stem.util.enum import stem.util.str_tools import stem.util.system try: # added in python 2.7 from collections import OrderedDict except ImportError: from stem.util.ordereddict import OrderedDict __all__ = [ 'export', 'reader', 'remote', 'extrainfo_descriptor', 'server_descriptor', 'microdescriptor', 'networkstatus', 'router_status_entry', 'tordnsel', 'parse_file', 'Descriptor', ] UNSEEKABLE_MSG = """\ File object isn't seekable. Try wrapping it with a BytesIO instead... content = my_file.read() parsed_descriptors = stem.descriptor.parse_file(io.BytesIO(content)) """ KEYWORD_CHAR = 'a-zA-Z0-9-' WHITESPACE = ' \t' KEYWORD_LINE = re.compile('^([%s]+)(?:[%s]+(.*))?$' % (KEYWORD_CHAR, WHITESPACE)) SPECIFIC_KEYWORD_LINE = '^(%%s)(?:[%s]+(.*))?$' % WHITESPACE PGP_BLOCK_START = re.compile('^-----BEGIN ([%s%s]+)-----$' % (KEYWORD_CHAR, WHITESPACE)) PGP_BLOCK_END = '-----END %s-----' EMPTY_COLLECTION = ([], {}, set()) DIGEST_TYPE_INFO = b'\x00\x01' DIGEST_PADDING = b'\xFF' DIGEST_SEPARATOR = b'\x00' CRYPTO_BLOB = """ MIGJAoGBAJv5IIWQ+WDWYUdyA/0L8qbIkEVH/cwryZWoIaPAzINfrw1WfNZGtBmg skFtXhOHHqTRN4GPPrZsAIUOQGzQtGb66IQgT4tO/pj+P6QmSCCdTfhvGfgTCsC+ WPi4Fl2qryzTb3QO5r5x7T8OsG2IBUET1bLQzmtbC560SYR49IvVAgMBAAE= """ DocumentHandler = stem.util.enum.UppercaseEnum( 'ENTRIES', 'DOCUMENT', 'BARE_DOCUMENT', ) class SigningKey(collections.namedtuple('SigningKey', ['private', 'public', 'public_digest'])): """ Key used by relays to sign their server and extrainfo descriptors. .. versionadded:: 1.6.0 :var cryptography.hazmat.backends.openssl.rsa._RSAPrivateKey private: private key :var cryptography.hazmat.backends.openssl.rsa._RSAPublicKey public: public key :var bytes public_digest: block that can be used for the a server descrptor's 'signing-key' field """ def parse_file(descriptor_file, descriptor_type = None, validate = False, document_handler = DocumentHandler.ENTRIES, normalize_newlines = None, **kwargs): """ Simple function to read the descriptor contents from a file, providing an iterator for its :class:`~stem.descriptor.__init__.Descriptor` contents. If you don't provide a **descriptor_type** argument then this automatically tries to determine the descriptor type based on the following... * The @type annotation on the first line. These are generally only found in the `CollecTor archives `_. * The filename if it matches something from tor's data directory. For instance, tor's 'cached-descriptors' contains server descriptors. This is a handy function for simple usage, but if you're reading multiple descriptor files you might want to consider the :class:`~stem.descriptor.reader.DescriptorReader`. Descriptor types include the following, including further minor versions (ie. if we support 1.1 then we also support everything from 1.0 and most things from 1.2, but not 2.0)... ========================================= ===== Descriptor Type Class ========================================= ===== server-descriptor 1.0 :class:`~stem.descriptor.server_descriptor.RelayDescriptor` extra-info 1.0 :class:`~stem.descriptor.extrainfo_descriptor.RelayExtraInfoDescriptor` microdescriptor 1.0 :class:`~stem.descriptor.microdescriptor.Microdescriptor` directory 1.0 **unsupported** network-status-2 1.0 :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV2` (with a :class:`~stem.descriptor.networkstatus.NetworkStatusDocumentV2`) dir-key-certificate-3 1.0 :class:`~stem.descriptor.networkstatus.KeyCertificate` network-status-consensus-3 1.0 :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3` (with a :class:`~stem.descriptor.networkstatus.NetworkStatusDocumentV3`) network-status-vote-3 1.0 :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3` (with a :class:`~stem.descriptor.networkstatus.NetworkStatusDocumentV3`) network-status-microdesc-consensus-3 1.0 :class:`~stem.descriptor.router_status_entry.RouterStatusEntryMicroV3` (with a :class:`~stem.descriptor.networkstatus.NetworkStatusDocumentV3`) bridge-network-status 1.0 :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3` (with a :class:`~stem.descriptor.networkstatus.BridgeNetworkStatusDocument`) bridge-server-descriptor 1.0 :class:`~stem.descriptor.server_descriptor.BridgeDescriptor` bridge-extra-info 1.1 or 1.2 :class:`~stem.descriptor.extrainfo_descriptor.BridgeExtraInfoDescriptor` torperf 1.0 **unsupported** bridge-pool-assignment 1.0 **unsupported** tordnsel 1.0 :class:`~stem.descriptor.tordnsel.TorDNSEL` hidden-service-descriptor 1.0 :class:`~stem.descriptor.hidden_service_descriptor.HiddenServiceDescriptor` ========================================= ===== If you're using **python 3** then beware that the open() function defaults to using text mode. **Binary mode** is strongly suggested because it's both faster (by my testing by about 33x) and doesn't do universal newline translation which can make us misparse the document. :: my_descriptor_file = open(descriptor_path, 'rb') :param str,file,tarfile descriptor_file: path or opened file with the descriptor contents :param str descriptor_type: `descriptor type `_, this is guessed if not provided :param bool validate: checks the validity of the descriptor's content if **True**, skips these checks otherwise :param stem.descriptor.__init__.DocumentHandler document_handler: method in which to parse the :class:`~stem.descriptor.networkstatus.NetworkStatusDocument` :param bool normalize_newlines: converts windows newlines (CRLF), this is the default when reading data directories on windows :param dict kwargs: additional arguments for the descriptor constructor :returns: iterator for :class:`~stem.descriptor.__init__.Descriptor` instances in the file :raises: * **ValueError** if the contents is malformed and validate is True * **TypeError** if we can't match the contents of the file to a descriptor type * **IOError** if unable to read from the descriptor_file """ # Delegate to a helper if this is a path or tarfile. handler = None if stem.util._is_str(descriptor_file): if stem.util.system.is_tarfile(descriptor_file): handler = _parse_file_for_tar_path else: handler = _parse_file_for_path elif isinstance(descriptor_file, tarfile.TarFile): handler = _parse_file_for_tarfile if handler: for desc in handler(descriptor_file, descriptor_type, validate, document_handler, **kwargs): yield desc return # Not all files are seekable. If unseekable then advising the user. # # Python 3.x adds an io.seekable() method, but not an option with python 2.x # so using an experimental call to tell() to determine this. try: descriptor_file.tell() except IOError: raise IOError(UNSEEKABLE_MSG) # The tor descriptor specifications do not provide a reliable method for # identifying a descriptor file's type and version so we need to guess # based on its filename. Metrics descriptors, however, can be identified # by an annotation on their first line... # https://trac.torproject.org/5651 initial_position = descriptor_file.tell() first_line = stem.util.str_tools._to_unicode(descriptor_file.readline().strip()) metrics_header_match = re.match('^@type (\S+) (\d+).(\d+)$', first_line) if not metrics_header_match: descriptor_file.seek(initial_position) descriptor_path = getattr(descriptor_file, 'name', None) filename = '' if descriptor_path is None else os.path.basename(descriptor_file.name) def parse(descriptor_file): if normalize_newlines: descriptor_file = NewlineNormalizer(descriptor_file) if descriptor_type is not None: descriptor_type_match = re.match('^(\S+) (\d+).(\d+)$', descriptor_type) if descriptor_type_match: desc_type, major_version, minor_version = descriptor_type_match.groups() return _parse_metrics_file(desc_type, int(major_version), int(minor_version), descriptor_file, validate, document_handler, **kwargs) else: raise ValueError("The descriptor_type must be of the form ' .'") elif metrics_header_match: # Metrics descriptor handling desc_type, major_version, minor_version = metrics_header_match.groups() return _parse_metrics_file(desc_type, int(major_version), int(minor_version), descriptor_file, validate, document_handler, **kwargs) else: # Cached descriptor handling. These contain multiple descriptors per file. if normalize_newlines is None and stem.util.system.is_windows(): descriptor_file = NewlineNormalizer(descriptor_file) if filename == 'cached-descriptors' or filename == 'cached-descriptors.new': return stem.descriptor.server_descriptor._parse_file(descriptor_file, validate = validate, **kwargs) elif filename == 'cached-extrainfo' or filename == 'cached-extrainfo.new': return stem.descriptor.extrainfo_descriptor._parse_file(descriptor_file, validate = validate, **kwargs) elif filename == 'cached-microdescs' or filename == 'cached-microdescs.new': return stem.descriptor.microdescriptor._parse_file(descriptor_file, validate = validate, **kwargs) elif filename == 'cached-consensus': return stem.descriptor.networkstatus._parse_file(descriptor_file, validate = validate, document_handler = document_handler, **kwargs) elif filename == 'cached-microdesc-consensus': return stem.descriptor.networkstatus._parse_file(descriptor_file, is_microdescriptor = True, validate = validate, document_handler = document_handler, **kwargs) else: raise TypeError("Unable to determine the descriptor's type. filename: '%s', first line: '%s'" % (filename, first_line)) for desc in parse(descriptor_file): if descriptor_path is not None: desc._set_path(os.path.abspath(descriptor_path)) yield desc def _parse_file_for_path(descriptor_file, *args, **kwargs): with open(descriptor_file, 'rb') as desc_file: for desc in parse_file(desc_file, *args, **kwargs): yield desc def _parse_file_for_tar_path(descriptor_file, *args, **kwargs): # TODO: use 'with' for tarfile after dropping python 2.6 support tar_file = tarfile.open(descriptor_file) try: for desc in parse_file(tar_file, *args, **kwargs): desc._set_path(os.path.abspath(descriptor_file)) yield desc finally: if tar_file: tar_file.close() def _parse_file_for_tarfile(descriptor_file, *args, **kwargs): for tar_entry in descriptor_file: if tar_entry.isfile(): entry = descriptor_file.extractfile(tar_entry) if tar_entry.size == 0: continue try: for desc in parse_file(entry, *args, **kwargs): desc._set_archive_path(entry.name) yield desc finally: entry.close() def _parse_metrics_file(descriptor_type, major_version, minor_version, descriptor_file, validate, document_handler, **kwargs): # Parses descriptor files from metrics, yielding individual descriptors. This # throws a TypeError if the descriptor_type or version isn't recognized. if descriptor_type == 'server-descriptor' and major_version == 1: for desc in stem.descriptor.server_descriptor._parse_file(descriptor_file, is_bridge = False, validate = validate, **kwargs): yield desc elif descriptor_type == 'bridge-server-descriptor' and major_version == 1: for desc in stem.descriptor.server_descriptor._parse_file(descriptor_file, is_bridge = True, validate = validate, **kwargs): yield desc elif descriptor_type == 'extra-info' and major_version == 1: for desc in stem.descriptor.extrainfo_descriptor._parse_file(descriptor_file, is_bridge = False, validate = validate, **kwargs): yield desc elif descriptor_type == 'microdescriptor' and major_version == 1: for desc in stem.descriptor.microdescriptor._parse_file(descriptor_file, validate = validate, **kwargs): yield desc elif descriptor_type == 'bridge-extra-info' and major_version == 1: # version 1.1 introduced a 'transport' field... # https://trac.torproject.org/6257 for desc in stem.descriptor.extrainfo_descriptor._parse_file(descriptor_file, is_bridge = True, validate = validate, **kwargs): yield desc elif descriptor_type == 'network-status-2' and major_version == 1: document_type = stem.descriptor.networkstatus.NetworkStatusDocumentV2 for desc in stem.descriptor.networkstatus._parse_file(descriptor_file, document_type, validate = validate, document_handler = document_handler, **kwargs): yield desc elif descriptor_type == 'dir-key-certificate-3' and major_version == 1: for desc in stem.descriptor.networkstatus._parse_file_key_certs(descriptor_file, validate = validate, **kwargs): yield desc elif descriptor_type in ('network-status-consensus-3', 'network-status-vote-3') and major_version == 1: document_type = stem.descriptor.networkstatus.NetworkStatusDocumentV3 for desc in stem.descriptor.networkstatus._parse_file(descriptor_file, document_type, validate = validate, document_handler = document_handler, **kwargs): yield desc elif descriptor_type == 'network-status-microdesc-consensus-3' and major_version == 1: document_type = stem.descriptor.networkstatus.NetworkStatusDocumentV3 for desc in stem.descriptor.networkstatus._parse_file(descriptor_file, document_type, is_microdescriptor = True, validate = validate, document_handler = document_handler, **kwargs): yield desc elif descriptor_type == 'bridge-network-status' and major_version == 1: document_type = stem.descriptor.networkstatus.BridgeNetworkStatusDocument for desc in stem.descriptor.networkstatus._parse_file(descriptor_file, document_type, validate = validate, document_handler = document_handler, **kwargs): yield desc elif descriptor_type == 'tordnsel' and major_version == 1: document_type = stem.descriptor.tordnsel.TorDNSEL for desc in stem.descriptor.tordnsel._parse_file(descriptor_file, validate = validate, **kwargs): yield desc elif descriptor_type == 'hidden-service-descriptor' and major_version == 1: document_type = stem.descriptor.hidden_service_descriptor.HiddenServiceDescriptor for desc in stem.descriptor.hidden_service_descriptor._parse_file(descriptor_file, validate = validate, **kwargs): yield desc else: raise TypeError("Unrecognized metrics descriptor format. type: '%s', version: '%i.%i'" % (descriptor_type, major_version, minor_version)) def _descriptor_content(attr = None, exclude = (), header_template = (), footer_template = ()): """ Constructs a minimal descriptor with the given attributes. The content we provide back is of the form... * header_template (with matching attr filled in) * unused attr entries * footer_template (with matching attr filled in) So for instance... :: _descriptor_content( attr = {'nickname': 'caerSidi', 'contact': 'atagar'}, header_template = ( ('nickname', 'foobar'), ('fingerprint', '12345'), ), ) ... would result in... :: nickname caerSidi fingerprint 12345 contact atagar :param dict attr: keyword/value mappings to be included in the descriptor :param list exclude: mandatory keywords to exclude from the descriptor :param tuple header_template: key/value pairs for mandatory fields before unrecognized content :param tuple footer_template: key/value pairs for mandatory fields after unrecognized content :returns: bytes with the requested descriptor content """ header_content, footer_content = [], [] attr = {} if attr is None else OrderedDict(attr) # shallow copy since we're destructive for content, template in ((header_content, header_template), (footer_content, footer_template)): for keyword, value in template: if keyword in exclude: continue value = stem.util.str_tools._to_unicode(attr.pop(keyword, value)) if value is None: continue elif isinstance(value, (tuple, list)): for v in value: content.append('%s %s' % (keyword, v)) elif value == '': content.append(keyword) elif value.startswith('\n'): # some values like crypto follow the line instead content.append('%s%s' % (keyword, value)) else: content.append('%s %s' % (keyword, value)) remainder = [] for k, v in attr.items(): if isinstance(v, (tuple, list)): remainder += ['%s %s' % (k, entry) for entry in v] else: remainder.append('%s %s' % (k, v)) return stem.util.str_tools._to_bytes('\n'.join(header_content + remainder + footer_content)) def _value(line, entries): return entries[line][0][0] def _values(line, entries): return [entry[0] for entry in entries[line]] def _parse_simple_line(keyword, attribute, func = None): def _parse(descriptor, entries): value = _value(keyword, entries) setattr(descriptor, attribute, func(value) if func else value) return _parse def _parse_if_present(keyword, attribute): return lambda descriptor, entries: setattr(descriptor, attribute, keyword in entries) def _parse_bytes_line(keyword, attribute): def _parse(descriptor, entries): line_match = re.search(stem.util.str_tools._to_bytes('^(opt )?%s(?:[%s]+(.*))?$' % (keyword, WHITESPACE)), descriptor.get_bytes(), re.MULTILINE) result = None if line_match: value = line_match.groups()[1] result = b'' if value is None else value setattr(descriptor, attribute, result) return _parse def _parse_timestamp_line(keyword, attribute): # "" YYYY-MM-DD HH:MM:SS def _parse(descriptor, entries): value = _value(keyword, entries) try: setattr(descriptor, attribute, stem.util.str_tools._parse_timestamp(value)) except ValueError: raise ValueError("Timestamp on %s line wasn't parsable: %s %s" % (keyword, keyword, value)) return _parse def _parse_forty_character_hex(keyword, attribute): # format of fingerprints, sha1 digests, etc def _parse(descriptor, entries): value = _value(keyword, entries) if not stem.util.tor_tools.is_hex_digits(value, 40): raise ValueError('%s line had an invalid value (should be 40 hex characters): %s %s' % (keyword, keyword, value)) setattr(descriptor, attribute, value) return _parse def _parse_protocol_line(keyword, attribute): def _parse(descriptor, entries): # parses 'protocol' entries like: Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 value = _value(keyword, entries) protocols = OrderedDict() for k, v in _mappings_for(keyword, value): versions = [] if not v: continue for entry in v.split(','): if '-' in entry: min_value, max_value = entry.split('-', 1) else: min_value = max_value = entry if not min_value.isdigit() or not max_value.isdigit(): raise ValueError('Protocol values should be a number or number range, but was: %s %s' % (keyword, value)) versions += range(int(min_value), int(max_value) + 1) protocols[k] = versions setattr(descriptor, attribute, protocols) return _parse def _parse_key_block(keyword, attribute, expected_block_type, value_attribute = None): def _parse(descriptor, entries): value, block_type, block_contents = entries[keyword][0] if not block_contents or block_type != expected_block_type: raise ValueError("'%s' should be followed by a %s block, but was a %s" % (keyword, expected_block_type, block_type)) setattr(descriptor, attribute, block_contents) if value_attribute: setattr(descriptor, value_attribute, value) return _parse def _mappings_for(keyword, value, require_value = False, divider = ' '): """ Parses an attribute as a series of 'key=value' mappings. Unlike _parse_* functions this is a helper, returning the attribute value rather than setting a descriptor field. This way parsers can perform additional validations. :param str keyword: descriptor field being parsed :param str value: 'attribute => values' mappings to parse :param str divider: separator between the key/value mappings :param bool require_value: validates that values are not empty :returns: **generator** with the key/value of the map attribute :raises: **ValueError** if descriptor content is invalid """ if value is None: return # no descripoter value to process elif value == '': return # descriptor field was present, but blank for entry in value.split(divider): if '=' not in entry: raise ValueError("'%s' should be a series of 'key=value' pairs but was: %s" % (keyword, value)) k, v = entry.split('=', 1) if require_value and not v: raise ValueError("'%s' line's %s mapping had a blank value: %s" % (keyword, k, value)) yield k, v def _copy(default): if default is None or isinstance(default, (bool, stem.exit_policy.ExitPolicy)): return default # immutable elif default in EMPTY_COLLECTION: return type(default)() # collection construction tad faster than copy else: return copy.copy(default) class Descriptor(object): """ Common parent for all types of descriptors. """ ATTRIBUTES = {} # mapping of 'attribute' => (default_value, parsing_function) PARSER_FOR_LINE = {} # line keyword to its associated parsing function def __init__(self, contents, lazy_load = False): self._path = None self._archive_path = None self._raw_contents = contents self._lazy_loading = lazy_load self._entries = {} self._unrecognized_lines = [] @classmethod def content(cls, attr = None, exclude = (), sign = False): """ Creates descriptor content with the given attributes. Mandatory fields are filled with dummy information unless data is supplied. This doesn't yet create a valid signature. .. versionadded:: 1.6.0 :param dict attr: keyword/value mappings to be included in the descriptor :param list exclude: mandatory keywords to exclude from the descriptor, this results in an invalid descriptor :param bool sign: includes cryptographic signatures and digests if True :returns: **str** with the content of a descriptor :raises: * **ImportError** if cryptography is unavailable and sign is True * **NotImplementedError** if not implemented for this descriptor type """ raise NotImplementedError("The create and content methods haven't been implemented for %s" % cls.__name__) @classmethod def create(cls, attr = None, exclude = (), validate = True, sign = False): """ Creates a descriptor with the given attributes. Mandatory fields are filled with dummy information unless data is supplied. This doesn't yet create a valid signature. .. versionadded:: 1.6.0 :param dict attr: keyword/value mappings to be included in the descriptor :param list exclude: mandatory keywords to exclude from the descriptor, this results in an invalid descriptor :param bool validate: checks the validity of the descriptor's content if **True**, skips these checks otherwise :param bool sign: includes cryptographic signatures and digests if True :returns: :class:`~stem.descriptor.Descriptor` subclass :raises: * **ValueError** if the contents is malformed and validate is True * **ImportError** if cryptography is unavailable and sign is True * **NotImplementedError** if not implemented for this descriptor type """ return cls(cls.content(attr, exclude, sign), validate = validate) def get_path(self): """ Provides the absolute path that we loaded this descriptor from. :returns: **str** with the absolute path of the descriptor source """ return self._path def get_archive_path(self): """ If this descriptor came from an archive then provides its path within the archive. This is only set if the descriptor came from a :class:`~stem.descriptor.reader.DescriptorReader`, and is **None** if this descriptor didn't come from an archive. :returns: **str** with the descriptor's path within the archive """ return self._archive_path def get_bytes(self): """ Provides the ASCII **bytes** of the descriptor. This only differs from **str()** if you're running python 3.x, in which case **str()** provides a **unicode** string. :returns: **bytes** for the descriptor's contents """ return self._raw_contents def get_unrecognized_lines(self): """ Provides a list of lines that were either ignored or had data that we did not know how to process. This is most common due to new descriptor fields that this library does not yet know how to process. Patches welcome! :returns: **list** of lines of unrecognized content """ if self._lazy_loading: # we need to go ahead and parse the whole document to figure this out self._parse(self._entries, False) self._lazy_loading = False return list(self._unrecognized_lines) def _parse(self, entries, validate, parser_for_line = None): """ Parses a series of 'keyword => (value, pgp block)' mappings and applies them as attributes. :param dict entries: descriptor contents to be applied :param bool validate: checks the validity of descriptor content if True :param dict parsers: mapping of lines to the function for parsing it :raises: **ValueError** if an error occurs in validation """ if parser_for_line is None: parser_for_line = self.PARSER_FOR_LINE for keyword, values in list(entries.items()): try: if keyword in parser_for_line: parser_for_line[keyword](self, entries) else: for value, block_type, block_contents in values: line = '%s %s' % (keyword, value) if block_contents: line += '\n%s' % block_contents self._unrecognized_lines.append(line) except ValueError: if validate: raise def _set_path(self, path): self._path = path def _set_archive_path(self, path): self._archive_path = path def _name(self, is_plural = False): return str(type(self)) def _digest_for_signature(self, signing_key, signature): """ Provides the signed digest we should have given this key and signature. :param str signing_key: key block used to make this signature :param str signature: signed digest for this descriptor content :returns: the digest string encoded in uppercase hex :raises: ValueError if unable to provide a validly signed digest """ if not stem.prereq.is_crypto_available(): raise ValueError('Generating the signed digest requires the cryptography module') from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives.serialization import load_der_public_key from cryptography.utils import int_to_bytes, int_from_bytes key = load_der_public_key(_bytes_for_block(signing_key), default_backend()) modulus = key.public_numbers().n public_exponent = key.public_numbers().e sig_as_bytes = _bytes_for_block(signature) sig_as_long = int_from_bytes(sig_as_bytes, byteorder='big') # convert signature to an int blocksize = len(sig_as_bytes) # 256B for NetworkStatusDocuments, 128B for others # use the public exponent[e] & the modulus[n] to decrypt the int decrypted_int = pow(sig_as_long, public_exponent, modulus) # convert the int to a byte array decrypted_bytes = int_to_bytes(decrypted_int, blocksize) ############################################################################ # The decrypted bytes should have a structure exactly along these lines. # 1 byte - [null '\x00'] # 1 byte - [block type identifier '\x01'] - Should always be 1 # N bytes - [padding '\xFF' ] # 1 byte - [separator '\x00' ] # M bytes - [message] # Total - 128 bytes # More info here http://www.ietf.org/rfc/rfc2313.txt # esp the Notes in section 8.1 ############################################################################ try: if decrypted_bytes.index(DIGEST_TYPE_INFO) != 0: raise ValueError('Verification failed, identifier missing') except ValueError: raise ValueError('Verification failed, malformed data') try: identifier_offset = 2 # find the separator seperator_index = decrypted_bytes.index(DIGEST_SEPARATOR, identifier_offset) except ValueError: raise ValueError('Verification failed, seperator not found') digest_hex = codecs.encode(decrypted_bytes[seperator_index + 1:], 'hex_codec') return stem.util.str_tools._to_unicode(digest_hex.upper()) def _digest_for_content(self, start, end): """ Provides the digest of our descriptor's content in a given range. :param bytes start: start of the range to generate a digest for :param bytes end: end of the range to generate a digest for :returns: the digest string encoded in uppercase hex :raises: ValueError if the digest canot be calculated """ raw_descriptor = self.get_bytes() start_index = raw_descriptor.find(start) end_index = raw_descriptor.find(end, start_index) if start_index == -1: raise ValueError("Digest is for the range starting with '%s' but that isn't in our descriptor" % start) elif end_index == -1: raise ValueError("Digest is for the range ending with '%s' but that isn't in our descriptor" % end) digest_content = raw_descriptor[start_index:end_index + len(end)] digest_hash = hashlib.sha1(stem.util.str_tools._to_bytes(digest_content)) return stem.util.str_tools._to_unicode(digest_hash.hexdigest().upper()) def __getattr__(self, name): # We can't use standard hasattr() since it calls this function, recursing. # Doing so works since it stops recursing after several dozen iterations # (not sure why), but horrible in terms of performance. def has_attr(attr): try: super(Descriptor, self).__getattribute__(attr) return True except: return False # If an attribute we should have isn't present it means either... # # a. we still need to lazy load this # b. we read the whole descriptor but it wasn't present, so needs the default if name in self.ATTRIBUTES and not has_attr(name): default, parsing_function = self.ATTRIBUTES[name] if self._lazy_loading: try: parsing_function(self, self._entries) except (ValueError, KeyError): # Set defaults for anything the parsing function should've covered. # Despite having a validation failure some attributes might be set in # which case we keep them. for attr_name, (attr_default, attr_parser) in self.ATTRIBUTES.items(): if parsing_function == attr_parser and not has_attr(attr_name): setattr(self, attr_name, _copy(attr_default)) else: setattr(self, name, _copy(default)) return super(Descriptor, self).__getattribute__(name) def __str__(self): if stem.prereq.is_python_3(): return stem.util.str_tools._to_unicode(self._raw_contents) else: return self._raw_contents class NewlineNormalizer(object): """ File wrapper that normalizes CRLF line endings. """ def __init__(self, wrapped_file): self._wrapped_file = wrapped_file self.name = getattr(wrapped_file, 'name', None) def read(self, *args): return self._wrapped_file.read(*args).replace(b'\r\n', b'\n') def readline(self, *args): return self._wrapped_file.readline(*args).replace(b'\r\n', b'\n') def readlines(self, *args): return [line.rstrip(b'\r') for line in self._wrapped_file.readlines(*args)] def seek(self, *args): return self._wrapped_file.seek(*args) def tell(self, *args): return self._wrapped_file.tell(*args) def _read_until_keywords(keywords, descriptor_file, inclusive = False, ignore_first = False, skip = False, end_position = None, include_ending_keyword = False): """ Reads from the descriptor file until we get to one of the given keywords or reach the end of the file. :param str,list keywords: keyword(s) we want to read until :param file descriptor_file: file with the descriptor content :param bool inclusive: includes the line with the keyword if True :param bool ignore_first: doesn't check if the first line read has one of the given keywords :param bool skip: skips buffering content, returning None :param int end_position: end if we reach this point in the file :param bool include_ending_keyword: provides the keyword we broke on if **True** :returns: **list** with the lines until we find one of the keywords, this is a two value tuple with the ending keyword if include_ending_keyword is **True** """ content = None if skip else [] ending_keyword = None if stem.util._is_str(keywords): keywords = (keywords,) if ignore_first: first_line = descriptor_file.readline() if first_line and content is not None: content.append(first_line) keyword_match = re.compile(SPECIFIC_KEYWORD_LINE % '|'.join(keywords)) while True: last_position = descriptor_file.tell() if end_position and last_position >= end_position: break line = descriptor_file.readline() if not line: break # EOF line_match = keyword_match.match(stem.util.str_tools._to_unicode(line)) if line_match: ending_keyword = line_match.groups()[0] if not inclusive: descriptor_file.seek(last_position) elif content is not None: content.append(line) break elif content is not None: content.append(line) if include_ending_keyword: return (content, ending_keyword) else: return content def _bytes_for_block(content): """ Provides the base64 decoded content of a pgp-style block. :param str content: block to be decoded :returns: decoded block content :raises: **TypeError** if this isn't base64 encoded content """ # strip the '-----BEGIN RSA PUBLIC KEY-----' header and footer content = ''.join(content.split('\n')[1:-1]) return base64.b64decode(stem.util.str_tools._to_bytes(content)) def _get_pseudo_pgp_block(remaining_contents): """ Checks if given contents begins with a pseudo-Open-PGP-style block and, if so, pops it off and provides it back to the caller. :param list remaining_contents: lines to be checked for a public key block :returns: **tuple** of the (block_type, content) or None if it doesn't exist :raises: **ValueError** if the contents starts with a key block but it's malformed (for instance, if it lacks an ending line) """ if not remaining_contents: return None # nothing left block_match = PGP_BLOCK_START.match(remaining_contents[0]) if block_match: block_type = block_match.groups()[0] block_lines = [] end_line = PGP_BLOCK_END % block_type while True: if not remaining_contents: raise ValueError("Unterminated pgp style block (looking for '%s'):\n%s" % (end_line, '\n'.join(block_lines))) line = remaining_contents.pop(0) block_lines.append(line) if line == end_line: return (block_type, '\n'.join(block_lines)) else: return None def create_signing_key(private_key = None): """ Serializes a signing key if we have one. Otherwise this creates a new signing key we can use to create descriptors. .. versionadded:: 1.6.0 :param cryptography.hazmat.backends.openssl.rsa._RSAPrivateKey private_key: private key :returns: :class:`~stem.descriptor.__init__.SigningKey` that can be used to create descriptors :raises: **ImportError** if the cryptography module is unavailable """ if not stem.prereq.is_crypto_available(): raise ImportError('Signing requires the cryptography module') from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import rsa if private_key is None: private_key = rsa.generate_private_key( public_exponent = 65537, key_size = 1024, backend = default_backend(), ) # When signing the cryptography module includes a constant indicating # the hash algorithm used. Tor doesn't. This causes signature # validation failures and unfortunately cryptography have no nice way # of excluding these so we need to mock out part of their internals... # # https://github.com/pyca/cryptography/issues/3713 def no_op(*args, **kwargs): return 1 private_key._backend._lib.EVP_PKEY_CTX_set_signature_md = no_op private_key._backend.openssl_assert = no_op public_key = private_key.public_key() public_digest = b'\n' + public_key.public_bytes( encoding = serialization.Encoding.PEM, format = serialization.PublicFormat.PKCS1, ).strip() return SigningKey(private_key, public_key, public_digest) def _append_router_signature(content, private_key): """ Appends a router signature to a server or extrainfo descriptor. :param bytes content: descriptor content up through 'router-signature\\n' :param cryptography.hazmat.backends.openssl.rsa._RSAPrivateKey private_key: private relay signing key :returns: **bytes** with the signed descriptor content """ if not stem.prereq.is_crypto_available(): raise ImportError('Signing requires the cryptography module') from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import padding signature = base64.b64encode(private_key.sign(content, padding.PKCS1v15(), hashes.SHA1())) return content + b'\n'.join([b'-----BEGIN SIGNATURE-----'] + stem.util.str_tools._split_by_length(signature, 64) + [b'-----END SIGNATURE-----\n']) def _random_nickname(): return ('Unnamed%i' % random.randint(0, 100000000000000))[:19] def _random_fingerprint(): return ('%040x' % random.randrange(16 ** 40)).upper() def _random_ipv4_address(): return '%i.%i.%i.%i' % (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) def _random_date(): return '%i-%02i-%02i %02i:%02i:%02i' % (random.randint(2000, 2015), random.randint(1, 12), random.randint(1, 20), random.randint(0, 23), random.randint(0, 59), random.randint(0, 59)) def _random_crypto_blob(block_type = None): """ Provides a random string that can be used for crypto blocks. """ random_base64 = stem.util.str_tools._to_unicode(base64.b64encode(os.urandom(140))) crypto_blob = '\n'.join(stem.util.str_tools._split_by_length(random_base64, 64)) if block_type: return '\n-----BEGIN %s-----\n%s\n-----END %s-----' % (block_type, crypto_blob, block_type) else: return crypto_blob def _descriptor_components(raw_contents, validate, extra_keywords = (), non_ascii_fields = ()): """ Initial breakup of the server descriptor contents to make parsing easier. A descriptor contains a series of 'keyword lines' which are simply a keyword followed by an optional value. Lines can also be followed by a signature block. To get a sub-listing with just certain keywords use extra_keywords. This can be useful if we care about their relative ordering with respect to each other. For instance, we care about the ordering of 'accept' and 'reject' entries because this influences the resulting exit policy, but for everything else in server descriptors the order does not matter. :param str raw_contents: descriptor content provided by the relay :param bool validate: checks the validity of the descriptor's content if True, skips these checks otherwise :param list extra_keywords: entity keywords to put into a separate listing with ordering intact :param list non_ascii_fields: fields containing non-ascii content :returns: **collections.OrderedDict** with the 'keyword => (value, pgp key) entries' mappings. If a extra_keywords was provided then this instead provides a two value tuple, the second being a list of those entries. """ if isinstance(raw_contents, bytes): raw_contents = stem.util.str_tools._to_unicode(raw_contents) entries = OrderedDict() extra_entries = [] # entries with a keyword in extra_keywords remaining_lines = raw_contents.split('\n') while remaining_lines: line = remaining_lines.pop(0) # V2 network status documents explicitly can contain blank lines... # # "Implementations MAY insert blank lines for clarity between sections; # these blank lines are ignored." # # ... and server descriptors end with an extra newline. But other documents # don't say how blank lines should be handled so globally ignoring them. if not line: continue # Some lines have an 'opt ' for backward compatibility. They should be # ignored. This prefix is being removed in... # https://trac.torproject.org/projects/tor/ticket/5124 if line.startswith('opt '): line = line[4:] line_match = KEYWORD_LINE.match(line) if not line_match: if not validate: continue raise ValueError('Line contains invalid characters: %s' % line) keyword, value = line_match.groups() if value is None: value = '' try: block_attr = _get_pseudo_pgp_block(remaining_lines) if block_attr: block_type, block_contents = block_attr else: block_type, block_contents = None, None except ValueError: if not validate: continue raise if validate and keyword not in non_ascii_fields: try: value.encode('ascii') except UnicodeError: replaced = ''.join([(char if char in string.printable else '?') for char in value]) raise ValueError("'%s' line had non-ascii content: %s" % (keyword, replaced)) if keyword in extra_keywords: extra_entries.append('%s %s' % (keyword, value)) else: entries.setdefault(keyword, []).append((value, block_type, block_contents)) if extra_keywords: return entries, extra_entries else: return entries # importing at the end to avoid circular dependencies on our Descriptor class import stem.descriptor.server_descriptor import stem.descriptor.extrainfo_descriptor import stem.descriptor.networkstatus import stem.descriptor.microdescriptor import stem.descriptor.tordnsel import stem.descriptor.hidden_service_descriptor stem-1.7.1/stem/descriptor/server_descriptor.py0000664000175000017500000012512213411002341022446 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Parsing for Tor server descriptors, which contains the infrequently changing information about a Tor relay (contact information, exit policy, public keys, etc). This information is provided from a few sources... * The control port via 'GETINFO desc/\*' queries. * The 'cached-descriptors' file in Tor's data directory. * Archived descriptors provided by `CollecTor `_. * Directory authorities and mirrors via their DirPort. **Module Overview:** :: ServerDescriptor - Tor server descriptor. |- RelayDescriptor - Server descriptor for a relay. | +- make_router_status_entry - Creates a router status entry for this descriptor. | |- BridgeDescriptor - Scrubbed server descriptor for a bridge. | |- is_scrubbed - checks if our content has been properly scrubbed | +- get_scrubbing_issues - description of issues with our scrubbing | |- digest - calculates the upper-case hex digest value for our content |- get_annotations - dictionary of content prior to the descriptor entry +- get_annotation_lines - lines that provided the annotations .. data:: BridgeDistribution (enum) Preferred method of distributing this relay if a bridge. .. versionadded:: 1.6.0 ===================== =========== BridgeDistribution Description ===================== =========== **ANY** No proference, BridgeDB will pick how the bridge is distributed. **HTTPS** Provided via the `web interface `_. **EMAIL** Provided in response to emails to bridges@torproject.org. **MOAT** Provided in interactive menus within Tor Browser. **HYPHAE** Provided via a cryptographic invitation-based system. ===================== =========== """ import base64 import binascii import functools import hashlib import re import stem.descriptor.certificate import stem.descriptor.extrainfo_descriptor import stem.exit_policy import stem.prereq import stem.util.connection import stem.util.enum import stem.util.str_tools import stem.util.tor_tools import stem.version from stem.descriptor.router_status_entry import RouterStatusEntryV3 from stem.descriptor import ( PGP_BLOCK_END, Descriptor, create_signing_key, _descriptor_content, _descriptor_components, _read_until_keywords, _bytes_for_block, _value, _values, _parse_simple_line, _parse_if_present, _parse_bytes_line, _parse_timestamp_line, _parse_forty_character_hex, _parse_protocol_line, _parse_key_block, _append_router_signature, _random_nickname, _random_ipv4_address, _random_date, _random_crypto_blob, ) if stem.prereq._is_lru_cache_available(): from functools import lru_cache else: from stem.util.lru_cache import lru_cache # relay descriptors must have exactly one of the following REQUIRED_FIELDS = ( 'router', 'bandwidth', 'published', 'onion-key', 'signing-key', 'router-signature', ) # optional entries that can appear at most once SINGLE_FIELDS = ( 'identity-ed25519', 'master-key-ed25519', 'platform', 'fingerprint', 'hibernating', 'uptime', 'contact', 'read-history', 'write-history', 'eventdns', 'bridge-distribution-request', 'family', 'caches-extra-info', 'extra-info-digest', 'hidden-service-dir', 'protocols', 'allow-single-hop-exits', 'tunnelled-dir-server', 'proto', 'onion-key-crosscert', 'ntor-onion-key', 'ntor-onion-key-crosscert', 'router-sig-ed25519', ) BridgeDistribution = stem.util.enum.Enum( ('ANY', 'any'), ('HTTPS', 'https'), ('EMAIL', 'email'), ('MOAT', 'moat'), ('HYPHAE', 'hyphae'), ) DEFAULT_IPV6_EXIT_POLICY = stem.exit_policy.MicroExitPolicy('reject 1-65535') REJECT_ALL_POLICY = stem.exit_policy.ExitPolicy('reject *:*') DEFAULT_BRIDGE_DISTRIBUTION = 'any' def _truncated_b64encode(content): return stem.util.str_tools._to_unicode(base64.b64encode(content).rstrip(b'=')) def _parse_file(descriptor_file, is_bridge = False, validate = False, **kwargs): """ Iterates over the server descriptors in a file. :param file descriptor_file: file with descriptor content :param bool is_bridge: parses the file as being a bridge descriptor :param bool validate: checks the validity of the descriptor's content if **True**, skips these checks otherwise :param dict kwargs: additional arguments for the descriptor constructor :returns: iterator for ServerDescriptor instances in the file :raises: * **ValueError** if the contents is malformed and validate is True * **IOError** if the file can't be read """ # Handler for relay descriptors # # Cached descriptors consist of annotations followed by the descriptor # itself. For instance... # # @downloaded-at 2012-03-14 16:31:05 # @source "145.53.65.130" # router caerSidi 71.35.143.157 9001 0 0 # platform Tor 0.2.1.30 on Linux x86_64 # # router-signature # -----BEGIN SIGNATURE----- # # -----END SIGNATURE----- # # Metrics descriptor files are the same, but lack any annotations. The # following simply does the following... # # - parse as annotations until we get to 'router' # - parse as descriptor content until we get to 'router-signature' followed # by the end of the signature block # - construct a descriptor and provide it back to the caller # # Any annotations after the last server descriptor is ignored (never provided # to the caller). while True: annotations = _read_until_keywords('router', descriptor_file) if not is_bridge: descriptor_content = _read_until_keywords('router-signature', descriptor_file) # we've reached the 'router-signature', now include the pgp style block block_end_prefix = PGP_BLOCK_END.split(' ', 1)[0] descriptor_content += _read_until_keywords(block_end_prefix, descriptor_file, True) else: descriptor_content = _read_until_keywords('router-digest', descriptor_file, True) if descriptor_content: if descriptor_content[0].startswith(b'@type'): descriptor_content = descriptor_content[1:] # strip newlines from annotations annotations = list(map(bytes.strip, annotations)) descriptor_text = bytes.join(b'', descriptor_content) if is_bridge: yield BridgeDescriptor(descriptor_text, validate, annotations, **kwargs) else: yield RelayDescriptor(descriptor_text, validate, annotations, **kwargs) else: if validate and annotations: orphaned_annotations = stem.util.str_tools._to_unicode(b'\n'.join(annotations)) raise ValueError('Content conform to being a server descriptor:\n%s' % orphaned_annotations) break # done parsing descriptors def _parse_router_line(descriptor, entries): # "router" nickname address ORPort SocksPort DirPort value = _value('router', entries) router_comp = value.split() if len(router_comp) < 5: raise ValueError('Router line must have five values: router %s' % value) elif not stem.util.tor_tools.is_valid_nickname(router_comp[0]): raise ValueError("Router line entry isn't a valid nickname: %s" % router_comp[0]) elif not stem.util.connection.is_valid_ipv4_address(router_comp[1]): raise ValueError("Router line entry isn't a valid IPv4 address: %s" % router_comp[1]) elif not stem.util.connection.is_valid_port(router_comp[2], allow_zero = True): raise ValueError("Router line's ORPort is invalid: %s" % router_comp[2]) elif not stem.util.connection.is_valid_port(router_comp[3], allow_zero = True): raise ValueError("Router line's SocksPort is invalid: %s" % router_comp[3]) elif not stem.util.connection.is_valid_port(router_comp[4], allow_zero = True): raise ValueError("Router line's DirPort is invalid: %s" % router_comp[4]) descriptor.nickname = router_comp[0] descriptor.address = router_comp[1] descriptor.or_port = int(router_comp[2]) descriptor.socks_port = None if router_comp[3] == '0' else int(router_comp[3]) descriptor.dir_port = None if router_comp[4] == '0' else int(router_comp[4]) def _parse_bandwidth_line(descriptor, entries): # "bandwidth" bandwidth-avg bandwidth-burst bandwidth-observed value = _value('bandwidth', entries) bandwidth_comp = value.split() if len(bandwidth_comp) < 3: raise ValueError('Bandwidth line must have three values: bandwidth %s' % value) elif not bandwidth_comp[0].isdigit(): raise ValueError("Bandwidth line's average rate isn't numeric: %s" % bandwidth_comp[0]) elif not bandwidth_comp[1].isdigit(): raise ValueError("Bandwidth line's burst rate isn't numeric: %s" % bandwidth_comp[1]) elif not bandwidth_comp[2].isdigit(): raise ValueError("Bandwidth line's observed rate isn't numeric: %s" % bandwidth_comp[2]) descriptor.average_bandwidth = int(bandwidth_comp[0]) descriptor.burst_bandwidth = int(bandwidth_comp[1]) descriptor.observed_bandwidth = int(bandwidth_comp[2]) def _parse_platform_line(descriptor, entries): # "platform" string _parse_bytes_line('platform', 'platform')(descriptor, entries) # The platform attribute was set earlier. This line can contain any # arbitrary data, but tor seems to report its version followed by the # os like the following... # # platform Tor 0.2.2.35 (git-73ff13ab3cc9570d) on Linux x86_64 # # There's no guarantee that we'll be able to pick these out the # version, but might as well try to save our caller the effort. value = _value('platform', entries) platform_match = re.match('^(?:node-)?Tor (\S*).* on (.*)$', value) if platform_match: version_str, descriptor.operating_system = platform_match.groups() try: descriptor.tor_version = stem.version._get_version(version_str) except ValueError: pass def _parse_fingerprint_line(descriptor, entries): # This is forty hex digits split into space separated groups of four. # Checking that we match this pattern. value = _value('fingerprint', entries) fingerprint = value.replace(' ', '') for grouping in value.split(' '): if len(grouping) != 4: raise ValueError('Fingerprint line should have groupings of four hex digits: %s' % value) if not stem.util.tor_tools.is_valid_fingerprint(fingerprint): raise ValueError('Tor relay fingerprints consist of forty hex digits: %s' % value) descriptor.fingerprint = fingerprint def _parse_extrainfo_digest_line(descriptor, entries): value = _value('extra-info-digest', entries) digest_comp = value.split(' ') if not stem.util.tor_tools.is_hex_digits(digest_comp[0], 40): raise ValueError('extra-info-digest should be 40 hex characters: %s' % digest_comp[0]) descriptor.extra_info_digest = digest_comp[0] descriptor.extra_info_sha256_digest = digest_comp[1] if len(digest_comp) >= 2 else None def _parse_hibernating_line(descriptor, entries): # "hibernating" 0|1 (in practice only set if one) value = _value('hibernating', entries) if value not in ('0', '1'): raise ValueError('Hibernating line had an invalid value, must be zero or one: %s' % value) descriptor.hibernating = value == '1' def _parse_uptime_line(descriptor, entries): # We need to be tolerant of negative uptimes to accommodate a past tor # bug... # # Changes in version 0.1.2.7-alpha - 2007-02-06 # - If our system clock jumps back in time, don't publish a negative # uptime in the descriptor. Also, don't let the global rate limiting # buckets go absurdly negative. # # After parsing all of the attributes we'll double check that negative # uptimes only occurred prior to this fix. value = _value('uptime', entries) try: descriptor.uptime = int(value) except ValueError: raise ValueError('Uptime line must have an integer value: %s' % value) def _parse_protocols_line(descriptor, entries): value = _value('protocols', entries) protocols_match = re.match('^Link (.*) Circuit (.*)$', value) if not protocols_match: raise ValueError('Protocols line did not match the expected pattern: protocols %s' % value) link_versions, circuit_versions = protocols_match.groups() descriptor.link_protocols = link_versions.split(' ') descriptor.circuit_protocols = circuit_versions.split(' ') def _parse_or_address_line(descriptor, entries): all_values = _values('or-address', entries) or_addresses = [] for entry in all_values: line = 'or-address %s' % entry if ':' not in entry: raise ValueError('or-address line missing a colon: %s' % line) address, port = entry.rsplit(':', 1) if not stem.util.connection.is_valid_ipv4_address(address) and not stem.util.connection.is_valid_ipv6_address(address, allow_brackets = True): raise ValueError('or-address line has a malformed address: %s' % line) if not stem.util.connection.is_valid_port(port): raise ValueError('or-address line has a malformed port: %s' % line) or_addresses.append((address.lstrip('[').rstrip(']'), int(port), stem.util.connection.is_valid_ipv6_address(address, allow_brackets = True))) descriptor.or_addresses = or_addresses def _parse_history_line(keyword, history_end_attribute, history_interval_attribute, history_values_attribute, descriptor, entries): value = _value(keyword, entries) timestamp, interval, remainder = stem.descriptor.extrainfo_descriptor._parse_timestamp_and_interval(keyword, value) try: if remainder: history_values = [int(entry) for entry in remainder.split(',')] else: history_values = [] except ValueError: raise ValueError('%s line has non-numeric values: %s %s' % (keyword, keyword, value)) setattr(descriptor, history_end_attribute, timestamp) setattr(descriptor, history_interval_attribute, interval) setattr(descriptor, history_values_attribute, history_values) def _parse_exit_policy(descriptor, entries): if hasattr(descriptor, '_unparsed_exit_policy'): if descriptor._unparsed_exit_policy and stem.util.str_tools._to_unicode(descriptor._unparsed_exit_policy[0]) == 'reject *:*': descriptor.exit_policy = REJECT_ALL_POLICY else: descriptor.exit_policy = stem.exit_policy.ExitPolicy(*descriptor._unparsed_exit_policy) del descriptor._unparsed_exit_policy def _parse_identity_ed25519_line(descriptor, entries): _parse_key_block('identity-ed25519', 'ed25519_certificate', 'ED25519 CERT')(descriptor, entries) if descriptor.ed25519_certificate: cert_lines = descriptor.ed25519_certificate.split('\n') if cert_lines[0] == '-----BEGIN ED25519 CERT-----' and cert_lines[-1] == '-----END ED25519 CERT-----': descriptor.certificate = stem.descriptor.certificate.Ed25519Certificate.parse(''.join(cert_lines[1:-1])) _parse_master_key_ed25519_line = _parse_simple_line('master-key-ed25519', 'ed25519_master_key') _parse_master_key_ed25519_for_hash_line = _parse_simple_line('master-key-ed25519', 'ed25519_certificate_hash') _parse_contact_line = _parse_bytes_line('contact', 'contact') _parse_published_line = _parse_timestamp_line('published', 'published') _parse_read_history_line = functools.partial(_parse_history_line, 'read-history', 'read_history_end', 'read_history_interval', 'read_history_values') _parse_write_history_line = functools.partial(_parse_history_line, 'write-history', 'write_history_end', 'write_history_interval', 'write_history_values') _parse_ipv6_policy_line = _parse_simple_line('ipv6-policy', 'exit_policy_v6', func = lambda v: stem.exit_policy.MicroExitPolicy(v)) _parse_allow_single_hop_exits_line = _parse_if_present('allow-single-hop-exits', 'allow_single_hop_exits') _parse_tunneled_dir_server_line = _parse_if_present('tunnelled-dir-server', 'allow_tunneled_dir_requests') _parse_proto_line = _parse_protocol_line('proto', 'protocols') _parse_hidden_service_dir_line = _parse_if_present('hidden-service-dir', 'is_hidden_service_dir') _parse_caches_extra_info_line = _parse_if_present('caches-extra-info', 'extra_info_cache') _parse_bridge_distribution_request_line = _parse_simple_line('bridge-distribution-request', 'bridge_distribution') _parse_family_line = _parse_simple_line('family', 'family', func = lambda v: set(v.split(' '))) _parse_eventdns_line = _parse_simple_line('eventdns', 'eventdns', func = lambda v: v == '1') _parse_onion_key_line = _parse_key_block('onion-key', 'onion_key', 'RSA PUBLIC KEY') _parse_onion_key_crosscert_line = _parse_key_block('onion-key-crosscert', 'onion_key_crosscert', 'CROSSCERT') _parse_signing_key_line = _parse_key_block('signing-key', 'signing_key', 'RSA PUBLIC KEY') _parse_router_signature_line = _parse_key_block('router-signature', 'signature', 'SIGNATURE') _parse_ntor_onion_key_line = _parse_simple_line('ntor-onion-key', 'ntor_onion_key') _parse_ntor_onion_key_crosscert_line = _parse_key_block('ntor-onion-key-crosscert', 'ntor_onion_key_crosscert', 'ED25519 CERT', 'ntor_onion_key_crosscert_sign') _parse_router_sig_ed25519_line = _parse_simple_line('router-sig-ed25519', 'ed25519_signature') _parse_router_digest_sha256_line = _parse_simple_line('router-digest-sha256', 'router_digest_sha256') _parse_router_digest_line = _parse_forty_character_hex('router-digest', '_digest') class ServerDescriptor(Descriptor): """ Common parent for server descriptors. :var str nickname: **\*** relay's nickname :var str fingerprint: identity key fingerprint :var datetime published: **\*** time in UTC when this descriptor was made :var str address: **\*** IPv4 address of the relay :var int or_port: **\*** port used for relaying :var int socks_port: **\*** port used as client (**deprecated**, always **None**) :var int dir_port: **\*** port used for descriptor mirroring :var bytes platform: line with operating system and tor version :var stem.version.Version tor_version: version of tor :var str operating_system: operating system :var int uptime: uptime when published in seconds :var bytes contact: contact information :var stem.exit_policy.ExitPolicy exit_policy: **\*** stated exit policy :var stem.exit_policy.MicroExitPolicy exit_policy_v6: **\*** exit policy for IPv6 :var BridgeDistribution bridge_distribution: **\*** preferred method of providing this relay's address if a bridge :var set family: **\*** nicknames or fingerprints of declared family :var int average_bandwidth: **\*** average rate it's willing to relay in bytes/s :var int burst_bandwidth: **\*** burst rate it's willing to relay in bytes/s :var int observed_bandwidth: **\*** estimated capacity based on usage in bytes/s :var list link_protocols: link protocols supported by the relay :var list circuit_protocols: circuit protocols supported by the relay :var bool is_hidden_service_dir: **\*** indicates if the relay serves hidden service descriptors :var bool hibernating: **\*** hibernating when published :var bool allow_single_hop_exits: **\*** flag if single hop exiting is allowed :var bool allow_tunneled_dir_requests: **\*** flag if tunneled directory requests are accepted :var bool extra_info_cache: **\*** flag if a mirror for extra-info documents :var str extra_info_digest: upper-case hex encoded digest of our extra-info document :var str extra_info_sha256_digest: base64 encoded sha256 digest of our extra-info document :var bool eventdns: flag for evdns backend (**deprecated**, always unset) :var str ntor_onion_key: base64 key used to encrypt EXTEND in the ntor protocol :var list or_addresses: **\*** alternative for our address/or_port attributes, each entry is a tuple of the form (address (**str**), port (**int**), is_ipv6 (**bool**)) :var dict protocols: mapping of protocols to their supported versions **Deprecated**, moved to extra-info descriptor... :var datetime read_history_end: end of the sampling interval :var int read_history_interval: seconds per interval :var list read_history_values: bytes read during each interval :var datetime write_history_end: end of the sampling interval :var int write_history_interval: seconds per interval :var list write_history_values: bytes written during each interval **\*** attribute is either required when we're parsed with validation or has a default value, others are left as **None** if undefined .. versionchanged:: 1.5.0 Added the allow_tunneled_dir_requests attribute. .. versionchanged:: 1.6.0 Added the extra_info_sha256_digest, protocols, and bridge_distribution attributes. .. versionchanged:: 1.7.0 Added the is_hidden_service_dir attribute. .. versionchanged:: 1.7.0 Deprecated the hidden_service_dir field, it's never been populated (:spec:`43c2f78`). This field will be removed in Stem 2.0. """ ATTRIBUTES = { 'nickname': (None, _parse_router_line), 'fingerprint': (None, _parse_fingerprint_line), 'contact': (None, _parse_contact_line), 'published': (None, _parse_published_line), 'exit_policy': (None, _parse_exit_policy), 'address': (None, _parse_router_line), 'or_port': (None, _parse_router_line), 'socks_port': (None, _parse_router_line), 'dir_port': (None, _parse_router_line), 'platform': (None, _parse_platform_line), 'tor_version': (None, _parse_platform_line), 'operating_system': (None, _parse_platform_line), 'uptime': (None, _parse_uptime_line), 'exit_policy_v6': (DEFAULT_IPV6_EXIT_POLICY, _parse_ipv6_policy_line), 'bridge_distribution': (DEFAULT_BRIDGE_DISTRIBUTION, _parse_bridge_distribution_request_line), 'family': (set(), _parse_family_line), 'average_bandwidth': (None, _parse_bandwidth_line), 'burst_bandwidth': (None, _parse_bandwidth_line), 'observed_bandwidth': (None, _parse_bandwidth_line), 'link_protocols': (None, _parse_protocols_line), 'circuit_protocols': (None, _parse_protocols_line), 'is_hidden_service_dir': (False, _parse_hidden_service_dir_line), 'hibernating': (False, _parse_hibernating_line), 'allow_single_hop_exits': (False, _parse_allow_single_hop_exits_line), 'allow_tunneled_dir_requests': (False, _parse_tunneled_dir_server_line), 'protocols': ({}, _parse_proto_line), 'extra_info_cache': (False, _parse_caches_extra_info_line), 'extra_info_digest': (None, _parse_extrainfo_digest_line), 'extra_info_sha256_digest': (None, _parse_extrainfo_digest_line), 'eventdns': (None, _parse_eventdns_line), 'ntor_onion_key': (None, _parse_ntor_onion_key_line), 'or_addresses': ([], _parse_or_address_line), 'read_history_end': (None, _parse_read_history_line), 'read_history_interval': (None, _parse_read_history_line), 'read_history_values': (None, _parse_read_history_line), 'write_history_end': (None, _parse_write_history_line), 'write_history_interval': (None, _parse_write_history_line), 'write_history_values': (None, _parse_write_history_line), } PARSER_FOR_LINE = { 'router': _parse_router_line, 'bandwidth': _parse_bandwidth_line, 'platform': _parse_platform_line, 'published': _parse_published_line, 'fingerprint': _parse_fingerprint_line, 'contact': _parse_contact_line, 'hibernating': _parse_hibernating_line, 'extra-info-digest': _parse_extrainfo_digest_line, 'hidden-service-dir': _parse_hidden_service_dir_line, 'uptime': _parse_uptime_line, 'protocols': _parse_protocols_line, 'ntor-onion-key': _parse_ntor_onion_key_line, 'or-address': _parse_or_address_line, 'read-history': _parse_read_history_line, 'write-history': _parse_write_history_line, 'ipv6-policy': _parse_ipv6_policy_line, 'allow-single-hop-exits': _parse_allow_single_hop_exits_line, 'tunnelled-dir-server': _parse_tunneled_dir_server_line, 'proto': _parse_proto_line, 'caches-extra-info': _parse_caches_extra_info_line, 'bridge-distribution-request': _parse_bridge_distribution_request_line, 'family': _parse_family_line, 'eventdns': _parse_eventdns_line, } def __init__(self, raw_contents, validate = False, annotations = None): """ Server descriptor constructor, created from an individual relay's descriptor content (as provided by 'GETINFO desc/*', cached descriptors, and metrics). By default this validates the descriptor's content as it's parsed. This validation can be disables to either improve performance or be accepting of malformed data. :param str raw_contents: descriptor content provided by the relay :param bool validate: checks the validity of the descriptor's content if **True**, skips these checks otherwise :param list annotations: lines that appeared prior to the descriptor :raises: **ValueError** if the contents is malformed and validate is True """ super(ServerDescriptor, self).__init__(raw_contents, lazy_load = not validate) self._annotation_lines = annotations if annotations else [] # A descriptor contains a series of 'keyword lines' which are simply a # keyword followed by an optional value. Lines can also be followed by a # signature block. # # We care about the ordering of 'accept' and 'reject' entries because this # influences the resulting exit policy, but for everything else the order # does not matter so breaking it into key / value pairs. entries, self._unparsed_exit_policy = _descriptor_components(stem.util.str_tools._to_unicode(raw_contents), validate, extra_keywords = ('accept', 'reject'), non_ascii_fields = ('contact', 'platform')) # TODO: Remove the following field in Stem 2.0. It has never been populated... # # https://gitweb.torproject.org/torspec.git/commit/?id=43c2f78 self.hidden_service_dir = ['2'] if validate: self._parse(entries, validate) _parse_exit_policy(self, entries) # if we have a negative uptime and a tor version that shouldn't exhibit # this bug then fail validation if validate and self.uptime and self.tor_version: if self.uptime < 0 and self.tor_version >= stem.version.Version('0.1.2.7'): raise ValueError("Descriptor for version '%s' had a negative uptime value: %i" % (self.tor_version, self.uptime)) self._check_constraints(entries) else: self._entries = entries def digest(self): """ Provides the hex encoded sha1 of our content. This value is part of the network status entry for this relay. :returns: **unicode** with the upper-case hex digest value for this server descriptor """ raise NotImplementedError('Unsupported Operation: this should be implemented by the ServerDescriptor subclass') @lru_cache() def get_annotations(self): """ Provides content that appeared prior to the descriptor. If this comes from the cached-descriptors file then this commonly contains content like... :: @downloaded-at 2012-03-18 21:18:29 @source "173.254.216.66" :returns: **dict** with the key/value pairs in our annotations """ annotation_dict = {} for line in self._annotation_lines: if b' ' in line: key, value = line.split(b' ', 1) annotation_dict[key] = value else: annotation_dict[line] = None return annotation_dict def get_annotation_lines(self): """ Provides the lines of content that appeared prior to the descriptor. This is the same as the :func:`~stem.descriptor.server_descriptor.ServerDescriptor.get_annotations` results, but with the unparsed lines and ordering retained. :returns: **list** with the lines of annotation that came before this descriptor """ return self._annotation_lines def _check_constraints(self, entries): """ Does a basic check that the entries conform to this descriptor type's constraints. :param dict entries: keyword => (value, pgp key) entries :raises: **ValueError** if an issue arises in validation """ for keyword in self._required_fields(): if keyword not in entries: raise ValueError("Descriptor must have a '%s' entry" % keyword) for keyword in self._single_fields(): if keyword in entries and len(entries[keyword]) > 1: raise ValueError("The '%s' entry can only appear once in a descriptor" % keyword) expected_first_keyword = self._first_keyword() if expected_first_keyword and expected_first_keyword != list(entries.keys())[0]: raise ValueError("Descriptor must start with a '%s' entry" % expected_first_keyword) expected_last_keyword = self._last_keyword() if expected_last_keyword and expected_last_keyword != list(entries.keys())[-1]: raise ValueError("Descriptor must end with a '%s' entry" % expected_last_keyword) if 'identity-ed25519' in entries.keys(): if 'router-sig-ed25519' not in entries.keys(): raise ValueError('Descriptor must have router-sig-ed25519 entry to accompany identity-ed25519') elif 'router-sig-ed25519' not in list(entries.keys())[-2:]: raise ValueError("Descriptor must have 'router-sig-ed25519' as the next-to-last entry") if not self.exit_policy: raise ValueError("Descriptor must have at least one 'accept' or 'reject' entry") # Constraints that the descriptor must meet to be valid. These can be None if # not applicable. def _required_fields(self): return REQUIRED_FIELDS def _single_fields(self): return REQUIRED_FIELDS + SINGLE_FIELDS def _first_keyword(self): return 'router' def _last_keyword(self): return 'router-signature' class RelayDescriptor(ServerDescriptor): """ Server descriptor (`descriptor specification `_) :var stem.certificate.Ed25519Certificate certificate: ed25519 certificate :var str ed25519_certificate: base64 encoded ed25519 certificate :var str ed25519_master_key: base64 encoded master key for our ed25519 certificate :var str ed25519_signature: signature of this document using ed25519 :var str onion_key: **\*** key used to encrypt EXTEND cells :var str onion_key_crosscert: signature generated using the onion_key :var str ntor_onion_key_crosscert: signature generated using the ntor-onion-key :var str ntor_onion_key_crosscert_sign: sign of the corresponding ed25519 public key :var str signing_key: **\*** relay's long-term identity key :var str signature: **\*** signature for this descriptor **\*** attribute is required when we're parsed with validation .. versionchanged:: 1.5.0 Added the ed25519_certificate, ed25519_master_key, ed25519_signature, onion_key_crosscert, ntor_onion_key_crosscert, and ntor_onion_key_crosscert_sign attributes. .. versionchanged:: 1.6.0 Moved from the deprecated `pycrypto `_ module to `cryptography `_ for validating signatures. .. versionchanged:: 1.6.0 Added the certificate attribute. .. deprecated:: 1.6.0 Our **ed25519_certificate** is deprecated in favor of our new **certificate** attribute. The base64 encoded certificate is available via the certificate's **encoded** attribute. .. versionchanged:: 1.6.0 Added the **skip_crypto_validation** constructor argument. """ ATTRIBUTES = dict(ServerDescriptor.ATTRIBUTES, **{ 'certificate': (None, _parse_identity_ed25519_line), 'ed25519_certificate': (None, _parse_identity_ed25519_line), 'ed25519_master_key': (None, _parse_master_key_ed25519_line), 'ed25519_signature': (None, _parse_router_sig_ed25519_line), 'onion_key': (None, _parse_onion_key_line), 'onion_key_crosscert': (None, _parse_onion_key_crosscert_line), 'ntor_onion_key_crosscert': (None, _parse_ntor_onion_key_crosscert_line), 'ntor_onion_key_crosscert_sign': (None, _parse_ntor_onion_key_crosscert_line), 'signing_key': (None, _parse_signing_key_line), 'signature': (None, _parse_router_signature_line), }) PARSER_FOR_LINE = dict(ServerDescriptor.PARSER_FOR_LINE, **{ 'identity-ed25519': _parse_identity_ed25519_line, 'master-key-ed25519': _parse_master_key_ed25519_line, 'router-sig-ed25519': _parse_router_sig_ed25519_line, 'onion-key': _parse_onion_key_line, 'onion-key-crosscert': _parse_onion_key_crosscert_line, 'ntor-onion-key-crosscert': _parse_ntor_onion_key_crosscert_line, 'signing-key': _parse_signing_key_line, 'router-signature': _parse_router_signature_line, }) def __init__(self, raw_contents, validate = False, annotations = None, skip_crypto_validation = False): super(RelayDescriptor, self).__init__(raw_contents, validate, annotations) if validate: if self.fingerprint: key_hash = hashlib.sha1(_bytes_for_block(self.signing_key)).hexdigest() if key_hash != self.fingerprint.lower(): raise ValueError('Fingerprint does not match the hash of our signing key (fingerprint: %s, signing key hash: %s)' % (self.fingerprint.lower(), key_hash)) if not skip_crypto_validation and stem.prereq.is_crypto_available(): signed_digest = self._digest_for_signature(self.signing_key, self.signature) if signed_digest != self.digest(): raise ValueError('Decrypted digest does not match local digest (calculated: %s, local: %s)' % (signed_digest, self.digest())) if self.onion_key_crosscert and stem.prereq.is_crypto_available(): onion_key_crosscert_digest = self._digest_for_signature(self.onion_key, self.onion_key_crosscert) if onion_key_crosscert_digest != self._onion_key_crosscert_digest(): raise ValueError('Decrypted onion-key-crosscert digest does not match local digest (calculated: %s, local: %s)' % (onion_key_crosscert_digest, self._onion_key_crosscert_digest())) if stem.prereq._is_pynacl_available() and self.certificate: self.certificate.validate(self) @classmethod def content(cls, attr = None, exclude = (), sign = False, signing_key = None): if signing_key: sign = True if attr is None: attr = {} base_header = ( ('router', '%s %s 9001 0 0' % (_random_nickname(), _random_ipv4_address())), ('published', _random_date()), ('bandwidth', '153600 256000 104590'), ('reject', '*:*'), ('onion-key', _random_crypto_blob('RSA PUBLIC KEY')), ('signing-key', _random_crypto_blob('RSA PUBLIC KEY')), ) if sign: if attr and 'signing-key' in attr: raise ValueError('Cannot sign the descriptor if a signing-key has been provided') elif attr and 'router-signature' in attr: raise ValueError('Cannot sign the descriptor if a router-signature has been provided') if signing_key is None: signing_key = create_signing_key() if 'fingerprint' not in attr: fingerprint = hashlib.sha1(_bytes_for_block(stem.util.str_tools._to_unicode(signing_key.public_digest.strip()))).hexdigest().upper() attr['fingerprint'] = ' '.join(stem.util.str_tools._split_by_length(fingerprint, 4)) attr['signing-key'] = signing_key.public_digest content = _descriptor_content(attr, exclude, base_header) + b'\nrouter-signature\n' return _append_router_signature(content, signing_key.private) else: return _descriptor_content(attr, exclude, base_header, ( ('router-sig-ed25519', None), ('router-signature', _random_crypto_blob('SIGNATURE')), )) @classmethod def create(cls, attr = None, exclude = (), validate = True, sign = False, signing_key = None): return cls(cls.content(attr, exclude, sign, signing_key), validate = validate, skip_crypto_validation = not sign) @lru_cache() def digest(self): """ Provides the digest of our descriptor's content. :returns: the digest string encoded in uppercase hex :raises: ValueError if the digest cannot be calculated """ return self._digest_for_content(b'router ', b'\nrouter-signature\n') def make_router_status_entry(self): """ Provides a RouterStatusEntryV3 for this descriptor content. .. versionadded:: 1.6.0 :returns: :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3` that would be in the consensus """ if not self.fingerprint: raise ValueError('Server descriptor lacks a fingerprint. This is an optional field, but required to make a router status entry.') attr = { 'r': ' '.join([ self.nickname, _truncated_b64encode(binascii.unhexlify(stem.util.str_tools._to_bytes(self.fingerprint))), _truncated_b64encode(binascii.unhexlify(stem.util.str_tools._to_bytes(self.digest()))), self.published.strftime('%Y-%m-%d %H:%M:%S'), self.address, str(self.or_port), str(self.dir_port) if self.dir_port else '0', ]), 'w': 'Bandwidth=%i' % self.average_bandwidth, 'p': self.exit_policy.summary().replace(', ', ','), } if self.tor_version: attr['v'] = 'Tor %s' % self.tor_version if self.or_addresses: attr['a'] = ['%s:%s' % (addr, port) for addr, port, _ in self.or_addresses] if self.certificate: attr['id'] = 'ed25519 %s' % _truncated_b64encode(self.certificate.key) return RouterStatusEntryV3.create(attr) @lru_cache() def _onion_key_crosscert_digest(self): """ Provides the digest of the onion-key-crosscert data. This consists of the RSA identity key sha1 and ed25519 identity key. :returns: **unicode** digest encoded in uppercase hex :raises: ValueError if the digest cannot be calculated """ signing_key_digest = hashlib.sha1(_bytes_for_block(self.signing_key)).digest() data = signing_key_digest + base64.b64decode(stem.util.str_tools._to_bytes(self.ed25519_master_key) + b'=') return stem.util.str_tools._to_unicode(binascii.hexlify(data).upper()) def _compare(self, other, method): if not isinstance(other, RelayDescriptor): return False return method(str(self).strip(), str(other).strip()) def _check_constraints(self, entries): super(RelayDescriptor, self)._check_constraints(entries) if self.ed25519_certificate: if not self.onion_key_crosscert: raise ValueError("Descriptor must have a 'onion-key-crosscert' when identity-ed25519 is present") elif not self.ed25519_signature: raise ValueError("Descriptor must have a 'router-sig-ed25519' when identity-ed25519 is present") def __hash__(self): return hash(str(self).strip()) def __eq__(self, other): return self._compare(other, lambda s, o: s == o) def __ne__(self, other): return not self == other def __lt__(self, other): return self._compare(other, lambda s, o: s < o) def __le__(self, other): return self._compare(other, lambda s, o: s <= o) class BridgeDescriptor(ServerDescriptor): """ Bridge descriptor (`bridge descriptor specification `_) :var str ed25519_certificate_hash: sha256 hash of the original identity-ed25519 :var str router_digest_sha256: sha256 digest of this document .. versionchanged:: 1.5.0 Added the ed25519_certificate_hash and router_digest_sha256 attributes. Also added ntor_onion_key (previously this only belonged to unsanitized descriptors). """ ATTRIBUTES = dict(ServerDescriptor.ATTRIBUTES, **{ 'ed25519_certificate_hash': (None, _parse_master_key_ed25519_for_hash_line), 'router_digest_sha256': (None, _parse_router_digest_sha256_line), '_digest': (None, _parse_router_digest_line), }) PARSER_FOR_LINE = dict(ServerDescriptor.PARSER_FOR_LINE, **{ 'master-key-ed25519': _parse_master_key_ed25519_for_hash_line, 'router-digest-sha256': _parse_router_digest_sha256_line, 'router-digest': _parse_router_digest_line, }) @classmethod def content(cls, attr = None, exclude = (), sign = False): if sign: raise NotImplementedError('Signing of %s not implemented' % cls.__name__) return _descriptor_content(attr, exclude, ( ('router', '%s %s 9001 0 0' % (_random_nickname(), _random_ipv4_address())), ('router-digest', '006FD96BA35E7785A6A3B8B75FE2E2435A13BDB4'), ('published', _random_date()), ('bandwidth', '409600 819200 5120'), ('reject', '*:*'), )) def digest(self): return self._digest def is_scrubbed(self): """ Checks if we've been properly scrubbed in accordance with the `bridge descriptor specification `_. Validation is a moving target so this may not be fully up to date. :returns: **True** if we're scrubbed, **False** otherwise """ return self.get_scrubbing_issues() == [] @lru_cache() def get_scrubbing_issues(self): """ Provides issues with our scrubbing. :returns: **list** of strings which describe issues we have with our scrubbing, this list is empty if we're properly scrubbed """ issues = [] if not self.address.startswith('10.'): issues.append("Router line's address should be scrubbed to be '10.x.x.x': %s" % self.address) if self.contact and self.contact != 'somebody': issues.append("Contact line should be scrubbed to be 'somebody', but instead had '%s'" % self.contact) for address, _, is_ipv6 in self.or_addresses: if not is_ipv6 and not address.startswith('10.'): issues.append("or-address line's address should be scrubbed to be '10.x.x.x': %s" % address) elif is_ipv6 and not address.startswith('fd9f:2e19:3bcf::'): # TODO: this check isn't quite right because we aren't checking that # the next grouping of hex digits contains 1-2 digits issues.append("or-address line's address should be scrubbed to be 'fd9f:2e19:3bcf::xx:xxxx': %s" % address) for line in self.get_unrecognized_lines(): if line.startswith('onion-key '): issues.append('Bridge descriptors should have their onion-key scrubbed: %s' % line) elif line.startswith('signing-key '): issues.append('Bridge descriptors should have their signing-key scrubbed: %s' % line) elif line.startswith('router-signature '): issues.append('Bridge descriptors should have their signature scrubbed: %s' % line) return issues def _required_fields(self): # bridge required fields are the same as a relay descriptor, minus items # excluded according to the format page excluded_fields = [ 'onion-key', 'signing-key', 'router-signature', ] included_fields = [ 'router-digest', ] return tuple(included_fields + [f for f in REQUIRED_FIELDS if f not in excluded_fields]) def _single_fields(self): return self._required_fields() + SINGLE_FIELDS def _last_keyword(self): return None def _compare(self, other, method): if not isinstance(other, BridgeDescriptor): return False return method(str(self).strip(), str(other).strip()) def __hash__(self): return hash(str(self).strip()) def __eq__(self, other): return self._compare(other, lambda s, o: s == o) def __ne__(self, other): return not self == other def __lt__(self, other): return self._compare(other, lambda s, o: s < o) def __le__(self, other): return self._compare(other, lambda s, o: s <= o) stem-1.7.1/stem/descriptor/remote.py0000664000175000017500000010315113411002341020173 0ustar atagaratagar00000000000000# Copyright 2013-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Module for remotely retrieving descriptors from directory authorities and mirrors. This is the simplest method for getting current tor descriptor information... :: import stem.descriptor.remote for desc in stem.descriptor.remote.get_server_descriptors(): if desc.exit_policy.is_exiting_allowed(): print(' %s (%s)' % (desc.nickname, desc.fingerprint)) More custom downloading behavior can be done through the :class:`~stem.descriptor.remote.DescriptorDownloader` class, which issues :class:`~stem.descriptor.remote.Query` instances to get you descriptor content. For example... :: from stem.descriptor.remote import DescriptorDownloader downloader = DescriptorDownloader( use_mirrors = True, timeout = 10, ) query = downloader.get_server_descriptors() print('Exit Relays:') try: for desc in query.run(): if desc.exit_policy.is_exiting_allowed(): print(' %s (%s)' % (desc.nickname, desc.fingerprint)) print print('Query took %0.2f seconds' % query.runtime) except Exception as exc: print('Unable to retrieve the server descriptors: %s' % exc) :: get_instance - Provides a singleton DescriptorDownloader used for... |- their_server_descriptor - provides the server descriptor of the relay we download from |- get_server_descriptors - provides present server descriptors |- get_extrainfo_descriptors - provides present extrainfo descriptors +- get_consensus - provides the present consensus or router status entries Query - Asynchronous request to download tor descriptors |- start - issues the query if it isn't already running +- run - blocks until the request is finished and provides the results DescriptorDownloader - Configurable class for issuing queries |- use_directory_mirrors - use directory mirrors to download future descriptors |- their_server_descriptor - provides the server descriptor of the relay we download from |- get_server_descriptors - provides present server descriptors |- get_extrainfo_descriptors - provides present extrainfo descriptors |- get_consensus - provides the present consensus or router status entries |- get_key_certificates - provides present authority key certificates +- query - request an arbitrary descriptor resource .. versionadded:: 1.1.0 .. data:: MAX_FINGERPRINTS Maximum number of descriptors that can requested at a time by their fingerprints. .. data:: MAX_MICRODESCRIPTOR_HASHES Maximum number of microdescriptors that can requested at a time by their hashes. .. data:: Compression (enum) Compression when downloading descriptors. .. versionadded:: 1.7.0 =============== =========== Compression Description =============== =========== **PLAINTEXT** Uncompressed data. **GZIP** `GZip compression `_. **ZSTD** `Zstandard compression `_, this requires the `zstandard module `_. **LZMA** `LZMA compression `_, this requires the 'lzma module `_. =============== =========== """ import io import random import sys import threading import time import zlib import stem import stem.client import stem.descriptor import stem.directory import stem.prereq import stem.util.enum from stem.client.datatype import RelayCommand from stem.util import log, str_tools try: # account for urllib's change between python 2.x and 3.x import urllib.request as urllib except ImportError: import urllib2 as urllib Compression = stem.util.enum.Enum( ('PLAINTEXT', 'identity'), ('GZIP', 'gzip'), # can also be 'deflate' ('ZSTD', 'x-zstd'), ('LZMA', 'x-tor-lzma'), ) # Tor has a limited number of descriptors we can fetch explicitly by their # fingerprint or hashes due to a limit on the url length by squid proxies. MAX_FINGERPRINTS = 96 MAX_MICRODESCRIPTOR_HASHES = 90 SINGLETON_DOWNLOADER = None def get_instance(): """ Provides the singleton :class:`~stem.descriptor.remote.DescriptorDownloader` used for the following functions... * :func:`stem.descriptor.remote.get_server_descriptors` * :func:`stem.descriptor.remote.get_extrainfo_descriptors` * :func:`stem.descriptor.remote.get_consensus` .. versionadded:: 1.5.0 :returns: singleton :class:`~stem.descriptor.remote.DescriptorDownloader` instance """ global SINGLETON_DOWNLOADER if SINGLETON_DOWNLOADER is None: SINGLETON_DOWNLOADER = DescriptorDownloader() return SINGLETON_DOWNLOADER def their_server_descriptor(**query_args): """ Provides the server descriptor of the relay we're downloading from. .. versionadded:: 1.7.0 :param query_args: additional arguments for the :class:`~stem.descriptor.remote.Query` constructor :returns: :class:`~stem.descriptor.remote.Query` for the server descriptors """ return get_instance().their_server_descriptor(**query_args) def get_server_descriptors(fingerprints = None, **query_args): """ Shorthand for :func:`~stem.descriptor.remote.DescriptorDownloader.get_server_descriptors` on our singleton instance. .. versionadded:: 1.5.0 """ return get_instance().get_server_descriptors(fingerprints, **query_args) def get_extrainfo_descriptors(fingerprints = None, **query_args): """ Shorthand for :func:`~stem.descriptor.remote.DescriptorDownloader.get_extrainfo_descriptors` on our singleton instance. .. versionadded:: 1.5.0 """ return get_instance().get_extrainfo_descriptors(fingerprints, **query_args) def get_consensus(authority_v3ident = None, microdescriptor = False, **query_args): """ Shorthand for :func:`~stem.descriptor.remote.DescriptorDownloader.get_consensus` on our singleton instance. .. versionadded:: 1.5.0 """ return get_instance().get_consensus(authority_v3ident, microdescriptor, **query_args) class Query(object): """ Asynchronous request for descriptor content from a directory authority or mirror. These can either be made through the :class:`~stem.descriptor.remote.DescriptorDownloader` or directly for more advanced usage. To block on the response and get results either call :func:`~stem.descriptor.remote.Query.run` or iterate over the Query. The :func:`~stem.descriptor.remote.Query.run` method pass along any errors that arise... :: from stem.descriptor.remote import Query query = Query( '/tor/server/all', block = True, timeout = 30, ) print('Current relays:') if not query.error: for desc in query: print(desc.fingerprint) else: print('Unable to retrieve the server descriptors: %s' % query.error) ... while iterating fails silently... :: print('Current relays:') for desc in Query('/tor/server/all', 'server-descriptor 1.0'): print(desc.fingerprint) In either case exceptions are available via our 'error' attribute. Tor provides quite a few different descriptor resources via its directory protocol (see section 4.2 and later of the `dir-spec `_). Commonly useful ones include... =============================================== =========== Resource Description =============================================== =========== /tor/server/all all present server descriptors /tor/server/fp/++ server descriptors with the given fingerprints /tor/extra/all all present extrainfo descriptors /tor/extra/fp/++ extrainfo descriptors with the given fingerprints /tor/micro/d/- microdescriptors with the given hashes /tor/status-vote/current/consensus present consensus /tor/status-vote/current/consensus-microdesc present microdescriptor consensus /tor/keys/all key certificates for the authorities /tor/keys/fp/+ key certificates for specific authorities =============================================== =========== **ZSTD** compression requires `zstandard `_, and **LZMA** requires the `lzma module `_. For legacy reasons if our resource has a '.z' suffix then our **compression** argument is overwritten with Compression.GZIP. .. versionchanged:: 1.7.0 Added support for downloading from ORPorts. .. versionchanged:: 1.7.0 Added the compression argument. .. versionchanged:: 1.7.0 Added the reply_headers attribute. The class this provides changed between Python versions. In python2 this was called httplib.HTTPMessage, whereas in python3 the class was renamed to http.client.HTTPMessage. .. versionchanged:: 1.7.0 Endpoints are now expected to be :class:`~stem.DirPort` or :class:`~stem.ORPort` instances. Usage of tuples for this argument is deprecated and will be removed in the future. .. versionchanged:: 1.7.0 Avoid downloading from tor26. This directory authority throttles its DirPort to such an extent that requests either time out or take on the order of minutes. .. versionchanged:: 1.7.0 Avoid downloading from Bifroest. This is the bridge authority so it doesn't vote in the consensus, and apparently times out frequently. :var str resource: resource being fetched, such as '/tor/server/all' :var str descriptor_type: type of descriptors being fetched (for options see :func:`~stem.descriptor.__init__.parse_file`), this is guessed from the resource if **None** :var list endpoints: :class:`~stem.DirPort` or :class:`~stem.ORPort` of the authority or mirror we're querying, this uses authorities if undefined :var list compression: list of :data:`stem.descriptor.remote.Compression` we're willing to accept, when none are mutually supported downloads fall back to Compression.PLAINTEXT :var int retries: number of times to attempt the request if downloading it fails :var bool fall_back_to_authority: when retrying request issues the last request to a directory authority if **True** :var str content: downloaded descriptor content :var Exception error: exception if a problem occured :var bool is_done: flag that indicates if our request has finished :var float start_time: unix timestamp when we first started running :var http.client.HTTPMessage reply_headers: headers provided in the response, **None** if we haven't yet made our request :var float runtime: time our query took, this is **None** if it's not yet finished :var bool validate: checks the validity of the descriptor's content if **True**, skips these checks otherwise :var stem.descriptor.__init__.DocumentHandler document_handler: method in which to parse a :class:`~stem.descriptor.networkstatus.NetworkStatusDocument` :var dict kwargs: additional arguments for the descriptor constructor Following are only applicable when downloading from a :class:`~stem.DirPort`... :var float timeout: duration before we'll time out our request :var str download_url: last url used to download the descriptor, this is unset until we've actually made a download attempt :param bool start: start making the request when constructed (default is **True**) :param bool block: only return after the request has been completed, this is the same as running **query.run(True)** (default is **False**) """ def __init__(self, resource, descriptor_type = None, endpoints = None, compression = None, retries = 2, fall_back_to_authority = False, timeout = None, start = True, block = False, validate = False, document_handler = stem.descriptor.DocumentHandler.ENTRIES, **kwargs): if not resource.startswith('/'): raise ValueError("Resources should start with a '/': %s" % resource) if resource.endswith('.z'): compression = [Compression.GZIP] resource = resource[:-2] elif compression is None: compression = [Compression.PLAINTEXT] else: if isinstance(compression, str): compression = [compression] # caller provided only a single option if Compression.ZSTD in compression and not stem.prereq.is_zstd_available(): compression.remove(Compression.ZSTD) if Compression.LZMA in compression and not stem.prereq.is_lzma_available(): compression.remove(Compression.LZMA) if not compression: compression = [Compression.PLAINTEXT] if descriptor_type: self.descriptor_type = descriptor_type else: self.descriptor_type = _guess_descriptor_type(resource) self.endpoints = [] if endpoints: for endpoint in endpoints: if isinstance(endpoint, tuple) and len(endpoint) == 2: self.endpoints.append(stem.DirPort(endpoint[0], endpoint[1])) # TODO: remove this in stem 2.0 elif isinstance(endpoint, (stem.ORPort, stem.DirPort)): self.endpoints.append(endpoint) else: raise ValueError("Endpoints must be an stem.ORPort, stem.DirPort, or two value tuple. '%s' is a %s." % (endpoint, type(endpoint).__name__)) self.resource = resource self.compression = compression self.retries = retries self.fall_back_to_authority = fall_back_to_authority self.content = None self.error = None self.is_done = False self.download_url = None self.start_time = None self.timeout = timeout self.runtime = None self.validate = validate self.document_handler = document_handler self.reply_headers = None self.kwargs = kwargs self._downloader_thread = None self._downloader_thread_lock = threading.RLock() if start: self.start() if block: self.run(True) def start(self): """ Starts downloading the scriptors if we haven't started already. """ with self._downloader_thread_lock: if self._downloader_thread is None: self._downloader_thread = threading.Thread( name = 'Descriptor query', target = self._download_descriptors, args = (self.retries, self.timeout) ) self._downloader_thread.setDaemon(True) self._downloader_thread.start() def run(self, suppress = False): """ Blocks until our request is complete then provides the descriptors. If we haven't yet started our request then this does so. :param bool suppress: avoids raising exceptions if **True** :returns: list for the requested :class:`~stem.descriptor.__init__.Descriptor` instances :raises: Using the iterator can fail with the following if **suppress** is **False**... * **ValueError** if the descriptor contents is malformed * **socket.timeout** if our request timed out * **urllib2.URLError** for most request failures Note that the urllib2 module may fail with other exception types, in which case we'll pass it along. """ return list(self._run(suppress)) def _run(self, suppress): with self._downloader_thread_lock: self.start() self._downloader_thread.join() if self.error: if suppress: return raise self.error else: if self.content is None: if suppress: return raise ValueError('BUG: _download_descriptors() finished without either results or an error') try: results = stem.descriptor.parse_file( io.BytesIO(self.content), self.descriptor_type, validate = self.validate, document_handler = self.document_handler, **self.kwargs ) for desc in results: yield desc except ValueError as exc: self.error = exc # encountered a parsing error if suppress: return raise self.error def __iter__(self): for desc in self._run(True): yield desc def _pick_endpoint(self, use_authority = False): """ Provides an endpoint to query. If we have multiple endpoints then one is picked at random. :param bool use_authority: ignores our endpoints and uses a directory authority instead :returns: **str** for the url being queried by this request """ if use_authority or not self.endpoints: picked = random.choice([auth for auth in stem.directory.Authority.from_cache().values() if auth.nickname not in ('tor26', 'Bifroest')]) return stem.DirPort(picked.address, picked.dir_port) else: return random.choice(self.endpoints) def _download_descriptors(self, retries, timeout): try: self.start_time = time.time() endpoint = self._pick_endpoint(use_authority = retries == 0 and self.fall_back_to_authority) if isinstance(endpoint, stem.ORPort): self.content, self.reply_headers = _download_from_orport(endpoint, self.compression, self.resource) elif isinstance(endpoint, stem.DirPort): self.download_url = 'http://%s:%i/%s' % (endpoint.address, endpoint.port, self.resource.lstrip('/')) self.content, self.reply_headers = _download_from_dirport(self.download_url, self.compression, timeout) else: raise ValueError("BUG: endpoints can only be ORPorts or DirPorts, '%s' was a %s" % (endpoint, type(endpoint).__name__)) self.runtime = time.time() - self.start_time log.trace("Descriptors retrieved from '%s' in %0.2fs" % (self.download_url, self.runtime)) except: exc = sys.exc_info()[1] if timeout is not None: timeout -= time.time() - self.start_time if retries > 0 and (timeout is None or timeout > 0): log.debug("Unable to download descriptors from '%s' (%i retries remaining): %s" % (self.download_url, retries, exc)) return self._download_descriptors(retries - 1, timeout) else: log.debug("Unable to download descriptors from '%s': %s" % (self.download_url, exc)) self.error = exc finally: self.is_done = True class DescriptorDownloader(object): """ Configurable class that issues :class:`~stem.descriptor.remote.Query` instances on your behalf. :param bool use_mirrors: downloads the present consensus and uses the directory mirrors to fetch future requests, this fails silently if the consensus cannot be downloaded :param default_args: default arguments for the :class:`~stem.descriptor.remote.Query` constructor """ def __init__(self, use_mirrors = False, **default_args): self._default_args = default_args directories = list(stem.directory.Authority.from_cache().values()) self._endpoints = [(directory.address, directory.dir_port) for directory in directories] if use_mirrors: try: start_time = time.time() self.use_directory_mirrors() log.debug('Retrieved directory mirrors (took %0.2fs)' % (time.time() - start_time)) except Exception as exc: log.debug('Unable to retrieve directory mirrors: %s' % exc) def use_directory_mirrors(self): """ Downloads the present consensus and configures ourselves to use directory mirrors, in addition to authorities. :returns: :class:`~stem.descriptor.networkstatus.NetworkStatusDocumentV3` from which we got the directory mirrors :raises: **Exception** if unable to determine the directory mirrors """ directories = stem.directory.Authority.from_cache().values() new_endpoints = set([(directory.address, directory.dir_port) for directory in directories]) consensus = list(self.get_consensus(document_handler = stem.descriptor.DocumentHandler.DOCUMENT).run())[0] for desc in consensus.routers.values(): if stem.Flag.V2DIR in desc.flags: new_endpoints.add((desc.address, desc.dir_port)) # we need our endpoints to be a list rather than set for random.choice() self._endpoints = list(new_endpoints) return consensus def their_server_descriptor(self, **query_args): """ Provides the server descriptor of the relay we're downloading from. .. versionadded:: 1.7.0 :param query_args: additional arguments for the :class:`~stem.descriptor.remote.Query` constructor :returns: :class:`~stem.descriptor.remote.Query` for the server descriptors """ return self.query('/tor/server/authority', **query_args) def get_server_descriptors(self, fingerprints = None, **query_args): """ Provides the server descriptors with the given fingerprints. If no fingerprints are provided then this returns all descriptors known by the relay. :param str,list fingerprints: fingerprint or list of fingerprints to be retrieved, gets all descriptors if **None** :param query_args: additional arguments for the :class:`~stem.descriptor.remote.Query` constructor :returns: :class:`~stem.descriptor.remote.Query` for the server descriptors :raises: **ValueError** if we request more than 96 descriptors by their fingerprints (this is due to a limit on the url length by squid proxies). """ resource = '/tor/server/all' if isinstance(fingerprints, str): fingerprints = [fingerprints] if fingerprints: if len(fingerprints) > MAX_FINGERPRINTS: raise ValueError('Unable to request more than %i descriptors at a time by their fingerprints' % MAX_FINGERPRINTS) resource = '/tor/server/fp/%s' % '+'.join(fingerprints) return self.query(resource, **query_args) def get_extrainfo_descriptors(self, fingerprints = None, **query_args): """ Provides the extrainfo descriptors with the given fingerprints. If no fingerprints are provided then this returns all descriptors in the present consensus. :param str,list fingerprints: fingerprint or list of fingerprints to be retrieved, gets all descriptors if **None** :param query_args: additional arguments for the :class:`~stem.descriptor.remote.Query` constructor :returns: :class:`~stem.descriptor.remote.Query` for the extrainfo descriptors :raises: **ValueError** if we request more than 96 descriptors by their fingerprints (this is due to a limit on the url length by squid proxies). """ resource = '/tor/extra/all' if isinstance(fingerprints, str): fingerprints = [fingerprints] if fingerprints: if len(fingerprints) > MAX_FINGERPRINTS: raise ValueError('Unable to request more than %i descriptors at a time by their fingerprints' % MAX_FINGERPRINTS) resource = '/tor/extra/fp/%s' % '+'.join(fingerprints) return self.query(resource, **query_args) # TODO: drop in stem 2.x def get_microdescriptors(self, hashes, **query_args): """ Provides the microdescriptors with the given hashes. To get these see the 'microdescriptor_hashes' attribute of :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3`. Note that these are only provided via a microdescriptor consensus (such as 'cached-microdesc-consensus' in your data directory). .. deprecated:: 1.5.0 This function has never worked, as it was never implemented in tor (:trac:`9271`). :param str,list hashes: microdescriptor hash or list of hashes to be retrieved :param query_args: additional arguments for the :class:`~stem.descriptor.remote.Query` constructor :returns: :class:`~stem.descriptor.remote.Query` for the microdescriptors :raises: **ValueError** if we request more than 92 microdescriptors by their hashes (this is due to a limit on the url length by squid proxies). """ if isinstance(hashes, str): hashes = [hashes] if len(hashes) > MAX_MICRODESCRIPTOR_HASHES: raise ValueError('Unable to request more than %i microdescriptors at a time by their hashes' % MAX_MICRODESCRIPTOR_HASHES) return self.query('/tor/micro/d/%s' % '-'.join(hashes), **query_args) def get_consensus(self, authority_v3ident = None, microdescriptor = False, **query_args): """ Provides the present router status entries. .. versionchanged:: 1.5.0 Added the microdescriptor argument. :param str authority_v3ident: fingerprint of the authority key for which to get the consensus, see `'v3ident' in tor's config.c `_ for the values. :param bool microdescriptor: provides the microdescriptor consensus if **True**, standard consensus otherwise :param query_args: additional arguments for the :class:`~stem.descriptor.remote.Query` constructor :returns: :class:`~stem.descriptor.remote.Query` for the router status entries """ if microdescriptor: resource = '/tor/status-vote/current/consensus-microdesc' else: resource = '/tor/status-vote/current/consensus' if authority_v3ident: resource += '/%s' % authority_v3ident consensus_query = self.query(resource, **query_args) # if we're performing validation then check that it's signed by the # authority key certificates if consensus_query.validate and consensus_query.document_handler == stem.descriptor.DocumentHandler.DOCUMENT and stem.prereq.is_crypto_available(): consensus = list(consensus_query.run())[0] key_certs = self.get_key_certificates(**query_args).run() consensus.validate_signatures(key_certs) return consensus_query def get_vote(self, authority, **query_args): """ Provides the present vote for a given directory authority. :param stem.directory.Authority authority: authority for which to retrieve a vote for :param query_args: additional arguments for the :class:`~stem.descriptor.remote.Query` constructor :returns: :class:`~stem.descriptor.remote.Query` for the router status entries """ resource = '/tor/status-vote/current/authority' if 'endpoint' not in query_args: query_args['endpoints'] = [(authority.address, authority.dir_port)] return self.query(resource, **query_args) def get_key_certificates(self, authority_v3idents = None, **query_args): """ Provides the key certificates for authorities with the given fingerprints. If no fingerprints are provided then this returns all present key certificates. :param str authority_v3idents: fingerprint or list of fingerprints of the authority keys, see `'v3ident' in tor's config.c `_ for the values. :param query_args: additional arguments for the :class:`~stem.descriptor.remote.Query` constructor :returns: :class:`~stem.descriptor.remote.Query` for the key certificates :raises: **ValueError** if we request more than 96 key certificates by their identity fingerprints (this is due to a limit on the url length by squid proxies). """ resource = '/tor/keys/all' if isinstance(authority_v3idents, str): authority_v3idents = [authority_v3idents] if authority_v3idents: if len(authority_v3idents) > MAX_FINGERPRINTS: raise ValueError('Unable to request more than %i key certificates at a time by their identity fingerprints' % MAX_FINGERPRINTS) resource = '/tor/keys/fp/%s' % '+'.join(authority_v3idents) return self.query(resource, **query_args) def query(self, resource, **query_args): """ Issues a request for the given resource. .. versionchanged:: 1.7.0 The **fall_back_to_authority** default when using this method is now **False**, like the :class:`~stem.descriptor.Query` class. :param str resource: resource being fetched, such as '/tor/server/all' :param query_args: additional arguments for the :class:`~stem.descriptor.remote.Query` constructor :returns: :class:`~stem.descriptor.remote.Query` for the descriptors :raises: **ValueError** if resource is clearly invalid or the descriptor type can't be determined when 'descriptor_type' is **None** """ args = dict(self._default_args) args.update(query_args) if 'endpoints' not in args: args['endpoints'] = self._endpoints return Query(resource, **args) def _download_from_orport(endpoint, compression, resource): """ Downloads descriptors from the given orport. Payload is just like an http response (headers and all)... :: HTTP/1.0 200 OK Date: Mon, 23 Apr 2018 18:43:47 GMT Content-Type: text/plain X-Your-Address-Is: 216.161.254.25 Content-Encoding: identity Expires: Wed, 25 Apr 2018 18:43:47 GMT router dannenberg 193.23.244.244 443 0 80 identity-ed25519 ... rest of the descriptor content... :param stem.ORPort endpoint: endpoint to download from :param list compression: compression methods for the request :param str resource: descriptor resource to download :returns: two value tuple of the form (data, reply_headers) :raises: * :class:`stem.ProtocolError` if not a valid descriptor response * :class:`stem.SocketError` if unable to establish a connection """ link_protocols = endpoint.link_protocols if endpoint.link_protocols else [3] with stem.client.Relay.connect(endpoint.address, endpoint.port, link_protocols) as relay: with relay.create_circuit() as circ: request = '\r\n'.join(( 'GET %s HTTP/1.0' % resource, 'Accept-Encoding: %s' % ', '.join(compression), 'User-Agent: %s' % stem.USER_AGENT, )) + '\r\n\r\n' circ.send(RelayCommand.BEGIN_DIR, stream_id = 1) response = b''.join([cell.data for cell in circ.send(RelayCommand.DATA, request, stream_id = 1)]) first_line, data = response.split(b'\r\n', 1) header_data, body_data = data.split(b'\r\n\r\n', 1) if not first_line.startswith(b'HTTP/1.0 2'): raise stem.ProtocolError("Response should begin with HTTP success, but was '%s'" % str_tools._to_unicode(first_line)) headers = {} for line in str_tools._to_unicode(header_data).splitlines(): if ': ' not in line: raise stem.ProtocolError("'%s' is not a HTTP header:\n\n%s" % line) key, value = line.split(': ', 1) headers[key] = value return _decompress(body_data, headers.get('Content-Encoding')), headers def _download_from_dirport(url, compression, timeout): """ Downloads descriptors from the given url. :param str url: dirport url from which to download from :param list compression: compression methods for the request :param float timeout: duration before we'll time out our request :returns: two value tuple of the form (data, reply_headers) :raises: * **socket.timeout** if our request timed out * **urllib2.URLError** for most request failures """ response = urllib.urlopen( urllib.Request( url, headers = { 'Accept-Encoding': ', '.join(compression), 'User-Agent': stem.USER_AGENT, } ), timeout = timeout, ) return _decompress(response.read(), response.headers.get('Content-Encoding')), response.headers def _decompress(data, encoding): """ Decompresses descriptor data. Tor doesn't include compression headers. As such when using gzip we need to include '32' for automatic header detection... https://stackoverflow.com/questions/3122145/zlib-error-error-3-while-decompressing-incorrect-header-check/22310760#22310760 ... and with zstd we need to use the streaming API. :param bytes data: data we received :param str encoding: 'Content-Encoding' header of the response :raises: * **ValueError** if encoding is unrecognized * **ImportError** if missing the decompression module """ if encoding == Compression.PLAINTEXT: return data.strip() elif encoding in (Compression.GZIP, 'deflate'): return zlib.decompress(data, zlib.MAX_WBITS | 32).strip() elif encoding == Compression.ZSTD: if not stem.prereq.is_zstd_available(): raise ImportError('Decompressing zstd data requires https://pypi.python.org/pypi/zstandard') import zstd output_buffer = io.BytesIO() with zstd.ZstdDecompressor().write_to(output_buffer) as decompressor: decompressor.write(data) return output_buffer.getvalue().strip() elif encoding == Compression.LZMA: if not stem.prereq.is_lzma_available(): raise ImportError('Decompressing lzma data requires https://docs.python.org/3/library/lzma.html') import lzma return lzma.decompress(data).strip() else: raise ValueError("'%s' isn't a recognized type of encoding" % encoding) def _guess_descriptor_type(resource): # Attempts to determine the descriptor type based on the resource url. This # raises a ValueError if the resource isn't recognized. if resource.startswith('/tor/server/'): return 'server-descriptor 1.0' elif resource.startswith('/tor/extra/'): return 'extra-info 1.0' elif resource.startswith('/tor/micro/'): return 'microdescriptor 1.0' elif resource.startswith('/tor/status-vote/current/consensus-microdesc'): return 'network-status-microdesc-consensus-3 1.0' elif resource.startswith('/tor/status-vote/'): return 'network-status-consensus-3 1.0' elif resource.startswith('/tor/keys/'): return 'dir-key-certificate-3 1.0' else: raise ValueError("Unable to determine the descriptor type for '%s'" % resource) def get_authorities(): """ Provides cached Tor directory authority information. The directory information hardcoded into Tor and occasionally changes, so the information this provides might not necessarily match your version of tor. .. deprecated:: 1.7.0 Use stem.directory.Authority.from_cache() instead. :returns: **dict** of **str** nicknames to :class:`~stem.directory.Authority` instances """ return DirectoryAuthority.from_cache() # TODO: drop aliases in stem 2.0 Directory = stem.directory.Directory DirectoryAuthority = stem.directory.Authority FallbackDirectory = stem.directory.Fallback stem-1.7.1/stem/descriptor/microdescriptor.py0000664000175000017500000002606013411002341022113 0ustar atagaratagar00000000000000# Copyright 2013-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Parsing for Tor microdescriptors, which contain a distilled version of a relay's server descriptor. As of Tor version 0.2.3.3-alpha Tor no longer downloads server descriptors by default, opting for microdescriptors instead. Unlike most descriptor documents these aren't available on the metrics site (since they don't contain any information that the server descriptors don't). The limited information in microdescriptors make them rather clunky to use compared with server descriptors. For instance microdescriptors lack the relay's fingerprint, making it difficut to use them to look up the relay's other descriptors. To do so you need to match the microdescriptor's digest against its corresponding router status entry. For added fun as of this writing the controller doesn't even surface those router status entries (:trac:`7953`). For instance, here's an example that prints the nickname and fingerprints of the exit relays. :: import os from stem.control import Controller from stem.descriptor import parse_file with Controller.from_port(port = 9051) as controller: controller.authenticate() exit_digests = set() data_dir = controller.get_conf('DataDirectory') for desc in controller.get_microdescriptors(): if desc.exit_policy.is_exiting_allowed(): exit_digests.add(desc.digest) print 'Exit Relays:' for desc in parse_file(os.path.join(data_dir, 'cached-microdesc-consensus')): if desc.digest in exit_digests: print ' %s (%s)' % (desc.nickname, desc.fingerprint) Doing the same is trivial with server descriptors... :: from stem.descriptor import parse_file print 'Exit Relays:' for desc in parse_file('/home/atagar/.tor/cached-descriptors'): if desc.exit_policy.is_exiting_allowed(): print ' %s (%s)' % (desc.nickname, desc.fingerprint) **Module Overview:** :: Microdescriptor - Tor microdescriptor. """ import hashlib import stem.exit_policy import stem.prereq from stem.descriptor import ( Descriptor, _descriptor_content, _descriptor_components, _read_until_keywords, _values, _parse_simple_line, _parse_protocol_line, _parse_key_block, _random_crypto_blob, ) from stem.descriptor.router_status_entry import ( _parse_a_line, _parse_p_line, ) if stem.prereq._is_lru_cache_available(): from functools import lru_cache else: from stem.util.lru_cache import lru_cache REQUIRED_FIELDS = ( 'onion-key', ) SINGLE_FIELDS = ( 'onion-key', 'ntor-onion-key', 'family', 'p', 'p6', 'pr', ) def _parse_file(descriptor_file, validate = False, **kwargs): """ Iterates over the microdescriptors in a file. :param file descriptor_file: file with descriptor content :param bool validate: checks the validity of the descriptor's content if **True**, skips these checks otherwise :param dict kwargs: additional arguments for the descriptor constructor :returns: iterator for Microdescriptor instances in the file :raises: * **ValueError** if the contents is malformed and validate is True * **IOError** if the file can't be read """ while True: annotations = _read_until_keywords('onion-key', descriptor_file) # read until we reach an annotation or onion-key line descriptor_lines = [] # read the onion-key line, done if we're at the end of the document onion_key_line = descriptor_file.readline() if onion_key_line: descriptor_lines.append(onion_key_line) else: break while True: last_position = descriptor_file.tell() line = descriptor_file.readline() if not line: break # EOF elif line.startswith(b'@') or line.startswith(b'onion-key'): descriptor_file.seek(last_position) break else: descriptor_lines.append(line) if descriptor_lines: if descriptor_lines[0].startswith(b'@type'): descriptor_lines = descriptor_lines[1:] # strip newlines from annotations annotations = list(map(bytes.strip, annotations)) descriptor_text = bytes.join(b'', descriptor_lines) yield Microdescriptor(descriptor_text, validate, annotations, **kwargs) else: break # done parsing descriptors def _parse_id_line(descriptor, entries): identities = {} for entry in _values('id', entries): entry_comp = entry.split() if len(entry_comp) >= 2: key_type, key_value = entry_comp[0], entry_comp[1] if key_type in identities: raise ValueError("There can only be one 'id' line per a key type, but '%s' appeared multiple times" % key_type) descriptor.identifier_type = key_type descriptor.identifier = key_value identities[key_type] = key_value else: raise ValueError("'id' lines should contain both the key type and digest: id %s" % entry) descriptor.identifiers = identities def _parse_digest(descriptor, entries): setattr(descriptor, 'digest', hashlib.sha256(descriptor.get_bytes()).hexdigest().upper()) _parse_onion_key_line = _parse_key_block('onion-key', 'onion_key', 'RSA PUBLIC KEY') _parse_ntor_onion_key_line = _parse_simple_line('ntor-onion-key', 'ntor_onion_key') _parse_family_line = _parse_simple_line('family', 'family', func = lambda v: v.split(' ')) _parse_p6_line = _parse_simple_line('p6', 'exit_policy_v6', func = lambda v: stem.exit_policy.MicroExitPolicy(v)) _parse_pr_line = _parse_protocol_line('pr', 'protocols') class Microdescriptor(Descriptor): """ Microdescriptor (`descriptor specification `_) :var str digest: **\*** hex digest for this microdescriptor, this can be used to match against the corresponding digest attribute of a :class:`~stem.descriptor.router_status_entry.RouterStatusEntryMicroV3` :var str onion_key: **\*** key used to encrypt EXTEND cells :var str ntor_onion_key: base64 key used to encrypt EXTEND in the ntor protocol :var list or_addresses: **\*** alternative for our address/or_port attributes, each entry is a tuple of the form (address (**str**), port (**int**), is_ipv6 (**bool**)) :var list family: **\*** nicknames or fingerprints of declared family :var stem.exit_policy.MicroExitPolicy exit_policy: **\*** relay's exit policy :var stem.exit_policy.MicroExitPolicy exit_policy_v6: **\*** exit policy for IPv6 :var hash identifiers: mapping of key types (like rsa1024 or ed25519) to their base64 encoded identity, this is only used for collision prevention (:trac:`11743`) :var dict protocols: mapping of protocols to their supported versions :var str identifier: base64 encoded identity digest (**deprecated**, use identifiers instead) :var str identifier_type: identity digest key type (**deprecated**, use identifiers instead) **\*** attribute is required when we're parsed with validation .. versionchanged:: 1.1.0 Added the identifier and identifier_type attributes. .. versionchanged:: 1.5.0 Added the identifiers attribute, and deprecated identifier and identifier_type since the field can now appear multiple times. .. versionchanged:: 1.6.0 Added the protocols attribute. """ ATTRIBUTES = { 'onion_key': (None, _parse_onion_key_line), 'ntor_onion_key': (None, _parse_ntor_onion_key_line), 'or_addresses': ([], _parse_a_line), 'family': ([], _parse_family_line), 'exit_policy': (stem.exit_policy.MicroExitPolicy('reject 1-65535'), _parse_p_line), 'exit_policy_v6': (None, _parse_p6_line), 'identifier_type': (None, _parse_id_line), # deprecated in favor of identifiers 'identifier': (None, _parse_id_line), # deprecated in favor of identifiers 'identifiers': ({}, _parse_id_line), 'protocols': ({}, _parse_pr_line), 'digest': (None, _parse_digest), } PARSER_FOR_LINE = { 'onion-key': _parse_onion_key_line, 'ntor-onion-key': _parse_ntor_onion_key_line, 'a': _parse_a_line, 'family': _parse_family_line, 'p': _parse_p_line, 'p6': _parse_p6_line, 'pr': _parse_pr_line, 'id': _parse_id_line, } @classmethod def content(cls, attr = None, exclude = (), sign = False): if sign: raise NotImplementedError('Signing of %s not implemented' % cls.__name__) return _descriptor_content(attr, exclude, ( ('onion-key', _random_crypto_blob('RSA PUBLIC KEY')), )) def __init__(self, raw_contents, validate = False, annotations = None): super(Microdescriptor, self).__init__(raw_contents, lazy_load = not validate) self._annotation_lines = annotations if annotations else [] entries = _descriptor_components(raw_contents, validate) if validate: self.digest = hashlib.sha256(self.get_bytes()).hexdigest().upper() self._parse(entries, validate) self._check_constraints(entries) else: self._entries = entries @lru_cache() def get_annotations(self): """ Provides content that appeared prior to the descriptor. If this comes from the cached-microdescs then this commonly contains content like... :: @last-listed 2013-02-24 00:18:30 :returns: **dict** with the key/value pairs in our annotations """ annotation_dict = {} for line in self._annotation_lines: if b' ' in line: key, value = line.split(b' ', 1) annotation_dict[key] = value else: annotation_dict[line] = None return annotation_dict def get_annotation_lines(self): """ Provides the lines of content that appeared prior to the descriptor. This is the same as the :func:`~stem.descriptor.microdescriptor.Microdescriptor.get_annotations` results, but with the unparsed lines and ordering retained. :returns: **list** with the lines of annotation that came before this descriptor """ return self._annotation_lines def _check_constraints(self, entries): """ Does a basic check that the entries conform to this descriptor type's constraints. :param dict entries: keyword => (value, pgp key) entries :raises: **ValueError** if an issue arises in validation """ for keyword in REQUIRED_FIELDS: if keyword not in entries: raise ValueError("Microdescriptor must have a '%s' entry" % keyword) for keyword in SINGLE_FIELDS: if keyword in entries and len(entries[keyword]) > 1: raise ValueError("The '%s' entry can only appear once in a microdescriptor" % keyword) if 'onion-key' != list(entries.keys())[0]: raise ValueError("Microdescriptor must start with a 'onion-key' entry") def _name(self, is_plural = False): return 'microdescriptors' if is_plural else 'microdescriptor' def _compare(self, other, method): if not isinstance(other, Microdescriptor): return False return method(str(self).strip(), str(other).strip()) def __hash__(self): return hash(str(self).strip()) def __eq__(self, other): return self._compare(other, lambda s, o: s == o) def __ne__(self, other): return not self == other def __lt__(self, other): return self._compare(other, lambda s, o: s < o) def __le__(self, other): return self._compare(other, lambda s, o: s <= o) stem-1.7.1/stem/version.py0000664000175000017500000003426413411002341016217 0ustar atagaratagar00000000000000# Copyright 2011-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Tor versioning information and requirements for its features. These can be easily parsed and compared, for instance... :: >>> from stem.version import get_system_tor_version, Requirement >>> my_version = get_system_tor_version() >>> print(my_version) 0.2.1.30 >>> my_version >= Requirement.TORRC_CONTROL_SOCKET True **Module Overview:** :: get_system_tor_version - gets the version of our system's tor installation Version - Tor versioning information .. data:: Requirement (enum) Enumerations for the version requirements of features. .. deprecated:: 1.6.0 Requirement entries belonging to tor versions which have been obsolete for at least six months will be removed when we break backward compatibility in the 2.x stem release. ===================================== =========== Requirement Description ===================================== =========== **AUTH_SAFECOOKIE** SAFECOOKIE authentication method **DESCRIPTOR_COMPRESSION** `Expanded compression support for ZSTD and LZMA `_ **DROPGUARDS** DROPGUARDS requests **EVENT_AUTHDIR_NEWDESCS** AUTHDIR_NEWDESC events **EVENT_BUILDTIMEOUT_SET** BUILDTIMEOUT_SET events **EVENT_CIRC_MINOR** CIRC_MINOR events **EVENT_CLIENTS_SEEN** CLIENTS_SEEN events **EVENT_CONF_CHANGED** CONF_CHANGED events **EVENT_DESCCHANGED** DESCCHANGED events **EVENT_GUARD** GUARD events **EVENT_HS_DESC_CONTENT** HS_DESC_CONTENT events **EVENT_NETWORK_LIVENESS** NETWORK_LIVENESS events **EVENT_NEWCONSENSUS** NEWCONSENSUS events **EVENT_NS** NS events **EVENT_SIGNAL** SIGNAL events **EVENT_STATUS** STATUS_GENERAL, STATUS_CLIENT, and STATUS_SERVER events **EVENT_STREAM_BW** STREAM_BW events **EVENT_TRANSPORT_LAUNCHED** TRANSPORT_LAUNCHED events **EVENT_CONN_BW** CONN_BW events **EVENT_CIRC_BW** CIRC_BW events **EVENT_CELL_STATS** CELL_STATS events **EVENT_TB_EMPTY** TB_EMPTY events **EVENT_HS_DESC** HS_DESC events **EXTENDCIRCUIT_PATH_OPTIONAL** EXTENDCIRCUIT queries can omit the path if the circuit is zero **FEATURE_EXTENDED_EVENTS** 'EXTENDED_EVENTS' optional feature **FEATURE_VERBOSE_NAMES** 'VERBOSE_NAMES' optional feature **GETINFO_CONFIG_TEXT** 'GETINFO config-text' query **GETINFO_GEOIP_AVAILABLE** 'GETINFO ip-to-country/ipv4-available' query and its ipv6 counterpart **GETINFO_MICRODESCRIPTORS** 'GETINFO md/all' query **HIDDEN_SERVICE_V3** Support for v3 hidden services **HSFETCH** HSFETCH requests **HSPOST** HSPOST requests **ADD_ONION** ADD_ONION and DEL_ONION requests **ADD_ONION_BASIC_AUTH** ADD_ONION supports basic authentication **ADD_ONION_NON_ANONYMOUS** ADD_ONION supports non-anonymous mode **ADD_ONION_MAX_STREAMS** ADD_ONION support for MaxStreamsCloseCircuit **LOADCONF** LOADCONF requests **MICRODESCRIPTOR_IS_DEFAULT** Tor gets microdescriptors by default rather than server descriptors **SAVECONF_FORCE** Added the 'FORCE' flag to SAVECONF **TAKEOWNERSHIP** TAKEOWNERSHIP requests **TORRC_CONTROL_SOCKET** 'ControlSocket ' config option **TORRC_PORT_FORWARDING** 'PortForwarding' config option **TORRC_DISABLE_DEBUGGER_ATTACHMENT** 'DisableDebuggerAttachment' config option **TORRC_VIA_STDIN** Allow torrc options via 'tor -f -' (:trac:`13865`) ===================================== =========== """ import os import re import stem.prereq import stem.util import stem.util.enum import stem.util.system if stem.prereq._is_lru_cache_available(): from functools import lru_cache else: from stem.util.lru_cache import lru_cache # cache for the get_system_tor_version function VERSION_CACHE = {} VERSION_PATTERN = re.compile(r'^([0-9]+)\.([0-9]+)\.([0-9]+)(\.[0-9]+)?(-\S*)?(( \(\S*\))*)$') def get_system_tor_version(tor_cmd = 'tor'): """ Queries tor for its version. This is os dependent, only working on linux, osx, and bsd. :param str tor_cmd: command used to run tor :returns: :class:`~stem.version.Version` provided by the tor command :raises: **IOError** if unable to query or parse the version """ if tor_cmd not in VERSION_CACHE: version_cmd = '%s --version' % tor_cmd try: version_output = stem.util.system.call(version_cmd) except OSError as exc: # make the error message nicer if this is due to tor being unavialable if 'No such file or directory' in str(exc): if os.path.isabs(tor_cmd): exc = "Unable to check tor's version. '%s' doesn't exist." % tor_cmd else: exc = "Unable to run '%s'. Maybe tor isn't in your PATH?" % version_cmd raise IOError(exc) if version_output: # output example: # Oct 21 07:19:27.438 [notice] Tor v0.2.1.30. This is experimental software. Do not rely on it for strong anonymity. (Running on Linux i686) # Tor version 0.2.1.30. last_line = version_output[-1] if last_line.startswith('Tor version ') and last_line.endswith('.'): try: version_str = last_line[12:-1] VERSION_CACHE[tor_cmd] = Version(version_str) except ValueError as exc: raise IOError(exc) else: raise IOError("Unexpected response from '%s': %s" % (version_cmd, last_line)) else: raise IOError("'%s' didn't have any output" % version_cmd) return VERSION_CACHE[tor_cmd] @lru_cache() def _get_version(version_str): return Version(version_str) class Version(object): """ Comparable tor version. These are constructed from strings that conform to the 'new' style in the `tor version-spec `_, such as "0.1.4" or "0.2.2.23-alpha (git-7dcd105be34a4f44)". .. versionchanged:: 1.6.0 Added all_extra parameter. :var int major: major version :var int minor: minor version :var int micro: micro version :var int patch: patch level (**None** if undefined) :var str status: status tag such as 'alpha' or 'beta-dev' (**None** if undefined) :var str extra: first extra information without its parentheses such as 'git-8be6058d8f31e578' (**None** if undefined) :var list all_extra: all extra information entries, without their parentheses :var str git_commit: git commit id (**None** if it wasn't provided) :param str version_str: version to be parsed :raises: **ValueError** if input isn't a valid tor version """ def __init__(self, version_str): self.version_str = version_str version_parts = VERSION_PATTERN.match(version_str) if version_parts: major, minor, micro, patch, status, extra_str, _ = version_parts.groups() # The patch and status matches are optional (may be None) and have an extra # proceeding period or dash if they exist. Stripping those off. if patch: patch = int(patch[1:]) if status: status = status[1:] self.major = int(major) self.minor = int(minor) self.micro = int(micro) self.patch = patch self.status = status self.all_extra = [entry[1:-1] for entry in extra_str.strip().split()] if extra_str else [] self.extra = self.all_extra[0] if self.all_extra else None self.git_commit = None for extra in self.all_extra: if extra and re.match('^git-[0-9a-f]{16}$', extra): self.git_commit = extra[4:] break else: raise ValueError("'%s' isn't a properly formatted tor version" % version_str) def __str__(self): """ Provides the string used to construct the version. """ return self.version_str def _compare(self, other, method): """ Compares version ordering according to the spec. """ if not isinstance(other, Version): return False for attr in ('major', 'minor', 'micro', 'patch'): my_version = getattr(self, attr) other_version = getattr(other, attr) if my_version is None: my_version = 0 if other_version is None: other_version = 0 if my_version != other_version: return method(my_version, other_version) # According to the version spec... # # If we *do* encounter two versions that differ only by status tag, we # compare them lexically as ASCII byte strings. my_status = self.status if self.status else '' other_status = other.status if other.status else '' return method(my_status, other_status) def __hash__(self): return stem.util._hash_attr(self, 'major', 'minor', 'micro', 'patch', 'status', cache = True) def __eq__(self, other): return self._compare(other, lambda s, o: s == o) def __ne__(self, other): return not self == other def __gt__(self, other): """ Checks if this version meets the requirements for a given feature. We can be compared to either a :class:`~stem.version.Version` or :class:`~stem.version._VersionRequirements`. """ if isinstance(other, _VersionRequirements): for rule in other.rules: if rule(self): return True return False return self._compare(other, lambda s, o: s > o) def __ge__(self, other): if isinstance(other, _VersionRequirements): for rule in other.rules: if rule(self): return True return False return self._compare(other, lambda s, o: s >= o) class _VersionRequirements(object): """ Series of version constraints that can be compared to. For instance, this allows for comparisons like 'if I'm greater than version X in the 0.2.2 series, or greater than version Y in the 0.2.3 series'. This is a logical 'or' of the series of rules. """ def __init__(self): self.rules = [] def greater_than(self, version, inclusive = True): """ Adds a constraint that we're greater than the given version. :param stem.version.Version version: version we're checking against :param bool inclusive: if comparison is inclusive or not """ if inclusive: self.rules.append(lambda v: version <= v) else: self.rules.append(lambda v: version < v) def less_than(self, version, inclusive = True): """ Adds a constraint that we're less than the given version. :param stem.version.Version version: version we're checking against :param bool inclusive: if comparison is inclusive or not """ if inclusive: self.rules.append(lambda v: version >= v) else: self.rules.append(lambda v: version > v) def in_range(self, from_version, to_version, from_inclusive = True, to_inclusive = False): """ Adds constraint that we're within the range from one version to another. :param stem.version.Version from_version: beginning of the comparison range :param stem.version.Version to_version: end of the comparison range :param bool from_inclusive: if comparison is inclusive with the starting version :param bool to_inclusive: if comparison is inclusive with the ending version """ def new_rule(v): if from_inclusive and to_inclusive: return from_version <= v <= to_version elif from_inclusive: return from_version <= v < to_version else: return from_version < v < to_version self.rules.append(new_rule) safecookie_req = _VersionRequirements() safecookie_req.in_range(Version('0.2.2.36'), Version('0.2.3.0')) safecookie_req.greater_than(Version('0.2.3.13')) Requirement = stem.util.enum.Enum( ('AUTH_SAFECOOKIE', safecookie_req), ('DESCRIPTOR_COMPRESSION', Version('0.3.1.1-alpha')), ('DROPGUARDS', Version('0.2.5.1-alpha')), ('EVENT_AUTHDIR_NEWDESCS', Version('0.1.1.10-alpha')), ('EVENT_BUILDTIMEOUT_SET', Version('0.2.2.7-alpha')), ('EVENT_CIRC_MINOR', Version('0.2.3.11-alpha')), ('EVENT_CLIENTS_SEEN', Version('0.2.1.10-alpha')), ('EVENT_CONF_CHANGED', Version('0.2.3.3-alpha')), ('EVENT_DESCCHANGED', Version('0.1.2.2-alpha')), ('EVENT_GUARD', Version('0.1.2.5-alpha')), ('EVENT_HS_DESC_CONTENT', Version('0.2.7.1-alpha')), ('EVENT_NS', Version('0.1.2.3-alpha')), ('EVENT_NETWORK_LIVENESS', Version('0.2.7.2-alpha')), ('EVENT_NEWCONSENSUS', Version('0.2.1.13-alpha')), ('EVENT_SIGNAL', Version('0.2.3.1-alpha')), ('EVENT_STATUS', Version('0.1.2.3-alpha')), ('EVENT_STREAM_BW', Version('0.1.2.8-beta')), ('EVENT_TRANSPORT_LAUNCHED', Version('0.2.5.0-alpha')), ('EVENT_CONN_BW', Version('0.2.5.2-alpha')), ('EVENT_CIRC_BW', Version('0.2.5.2-alpha')), ('EVENT_CELL_STATS', Version('0.2.5.2-alpha')), ('EVENT_TB_EMPTY', Version('0.2.5.2-alpha')), ('EVENT_HS_DESC', Version('0.2.5.2-alpha')), ('EXTENDCIRCUIT_PATH_OPTIONAL', Version('0.2.2.9')), ('FEATURE_EXTENDED_EVENTS', Version('0.2.2.1-alpha')), ('FEATURE_VERBOSE_NAMES', Version('0.2.2.1-alpha')), ('GETINFO_CONFIG_TEXT', Version('0.2.2.7-alpha')), ('GETINFO_GEOIP_AVAILABLE', Version('0.3.2.1-alpha')), ('GETINFO_MICRODESCRIPTORS', Version('0.3.5.1-alpha')), ('HIDDEN_SERVICE_V3', Version('0.3.3.1-alpha')), ('HSFETCH', Version('0.2.7.1-alpha')), ('HSPOST', Version('0.2.7.1-alpha')), ('ADD_ONION', Version('0.2.7.1-alpha')), ('ADD_ONION_BASIC_AUTH', Version('0.2.9.1-alpha')), ('ADD_ONION_NON_ANONYMOUS', Version('0.2.9.3-alpha')), ('ADD_ONION_MAX_STREAMS', Version('0.2.7.2-alpha')), ('LOADCONF', Version('0.2.1.1')), ('MICRODESCRIPTOR_IS_DEFAULT', Version('0.2.3.3')), ('SAVECONF_FORCE', Version('0.3.1.1-alpha')), ('TAKEOWNERSHIP', Version('0.2.2.28-beta')), ('TORRC_CONTROL_SOCKET', Version('0.2.0.30')), ('TORRC_PORT_FORWARDING', Version('0.2.3.1-alpha')), ('TORRC_DISABLE_DEBUGGER_ATTACHMENT', Version('0.2.3.9')), ('TORRC_VIA_STDIN', Version('0.2.6.3-alpha')), ) stem-1.7.1/stem/client/0000775000175000017500000000000013411004021015422 5ustar atagaratagar00000000000000stem-1.7.1/stem/client/datatype.py0000664000175000017500000004277413356507530017652 0ustar atagaratagar00000000000000# Copyright 2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Support for `Tor's ORPort protocol `_. **This module only consists of low level components, and is not intended for users.** See our :class:`~stem.client.Relay` the API you probably want. .. versionadded:: 1.7.0 :: split - splits bytes into substrings LinkProtocol - ORPort protocol version. Field - Packable and unpackable datatype. |- Size - Field of a static size. |- Address - Relay address. |- Certificate - Relay certificate. | |- pack - encodes content |- unpack - decodes content +- pop - decodes content with remainder KDF - KDF-TOR derivatived attributes +- from_value - parses key material .. data:: AddrType (enum) Form an address takes. ===================== =========== AddressType Description ===================== =========== **HOSTNAME** relay hostname **IPv4** IPv4 address **IPv6** IPv6 address **ERROR_TRANSIENT** temporarily error retrieving address **ERROR_PERMANENT** permanent error retrieving address **UNKNOWN** unrecognized address type ===================== =========== .. data:: RelayCommand (enum) Command concerning streams and circuits we've established with a relay. Commands have two characteristics... * **forward/backward**: **forward** commands are issued from the orgin, whereas **backward** come from the relay * **stream/circuit**: **steam** commands concern an individual steam, whereas **circuit** concern the entire circuit we've established with a relay ===================== =========== RelayCommand Description ===================== =========== **BEGIN** begin a stream (**forward**, **stream**) **DATA** transmit data (**forward/backward**, **stream**) **END** end a stream (**forward/backward**, **stream**) **CONNECTED** BEGIN reply (**backward**, **stream**) **SENDME** ready to accept more cells (**forward/backward**, **stream/circuit**) **EXTEND** extend the circuit through another relay (**forward**, **circuit**) **EXTENDED** EXTEND reply (**backward**, **circuit**) **TRUNCATE** remove last circuit hop (**forward**, **circuit**) **TRUNCATED** TRUNCATE reply (**backward**, **circuit**) **DROP** ignorable no-op (**forward/backward**, **circuit**) **RESOLVE** request DNS resolution (**forward**, **stream**) **RESOLVED** RESOLVE reply (**backward**, **stream**) **BEGIN_DIR** request descriptor (**forward**, **steam**) **EXTEND2** ntor EXTEND request (**forward**, **circuit**) **EXTENDED2** EXTEND2 reply (**backward**, **circuit**) **UNKNOWN** unrecognized command ===================== =========== .. data:: CertType (enum) Relay certificate type. ===================== =========== CertType Description ===================== =========== **LINK** link key certificate certified by RSA1024 identity **IDENTITY** RSA1024 Identity certificate **AUTHENTICATE** RSA1024 AUTHENTICATE cell link certificate **UNKNOWN** unrecognized certificate type ===================== =========== .. data:: CloseReason (enum) Reason a relay is closed. ===================== =========== CloseReason Description ===================== =========== **NONE** no reason given **PROTOCOL** tor protocol violation **INTERNAL** internal error **REQUESTED** client sent a TRUNCATE command **HIBERNATING** relay suspended, trying to save bandwidth **RESOURCELIMIT** out of memory, sockets, or circuit IDs **CONNECTFAILED** unable to reach relay **OR_IDENTITY** connected, but its OR identity was not as expected **OR_CONN_CLOSED** connection that was carrying this circuit died **FINISHED** circuit has expired for being dirty or old **TIMEOUT** circuit construction took too long **DESTROYED** circuit was destroyed without a client TRUNCATE **NOSUCHSERVICE** request was for an unknown hidden service **UNKNOWN** unrecognized reason ===================== =========== """ import collections import hashlib import struct import stem.client.cell import stem.prereq import stem.util import stem.util.connection import stem.util.enum ZERO = b'\x00' HASH_LEN = 20 KEY_LEN = 16 class _IntegerEnum(stem.util.enum.Enum): """ Integer backed enumeration. Enumerations of this type always have an implicit **UNKNOWN** value for integer values that lack a mapping. """ def __init__(self, *args): self._enum_to_int = {} self._int_to_enum = {} parent_args = [] for entry in args: if len(entry) == 2: enum, int_val = entry str_val = enum elif len(entry) == 3: enum, str_val, int_val = entry else: raise ValueError('IntegerEnums can only be constructed with two or three value tuples: %s' % repr(entry)) self._enum_to_int[str_val] = int_val self._int_to_enum[int_val] = str_val parent_args.append((enum, str_val)) parent_args.append(('UNKNOWN', 'UNKNOWN')) super(_IntegerEnum, self).__init__(*parent_args) def get(self, val): """ Provides the (enum, int_value) tuple for a given value. """ if stem.util._is_int(val): return self._int_to_enum.get(val, self.UNKNOWN), val elif val in self: return val, self._enum_to_int.get(val, val) else: raise ValueError("Invalid enumeration '%s', options are %s" % (val, ', '.join(self))) AddrType = _IntegerEnum( ('HOSTNAME', 0), ('IPv4', 4), ('IPv6', 6), ('ERROR_TRANSIENT', 16), ('ERROR_PERMANENT', 17), ) RelayCommand = _IntegerEnum( ('BEGIN', 'RELAY_BEGIN', 1), ('DATA', 'RELAY_DATA', 2), ('END', 'RELAY_END', 3), ('CONNECTED', 'RELAY_CONNECTED', 4), ('SENDME', 'RELAY_SENDME', 5), ('EXTEND', 'RELAY_EXTEND', 6), ('EXTENDED', 'RELAY_EXTENDED', 7), ('TRUNCATE', 'RELAY_TRUNCATE', 8), ('TRUNCATED', 'RELAY_TRUNCATED', 9), ('DROP', 'RELAY_DROP', 10), ('RESOLVE', 'RELAY_RESOLVE', 11), ('RESOLVED', 'RELAY_RESOLVED', 12), ('BEGIN_DIR', 'RELAY_BEGIN_DIR', 13), ('EXTEND2', 'RELAY_EXTEND2', 14), ('EXTENDED2', 'RELAY_EXTENDED2', 15), ) CertType = _IntegerEnum( ('LINK', 1), ('IDENTITY', 2), ('AUTHENTICATE', 3), ) CloseReason = _IntegerEnum( ('NONE', 0), ('PROTOCOL', 1), ('INTERNAL', 2), ('REQUESTED', 3), ('HIBERNATING', 4), ('RESOURCELIMIT', 5), ('CONNECTFAILED', 6), ('OR_IDENTITY', 7), ('OR_CONN_CLOSED', 8), ('FINISHED', 9), ('TIMEOUT', 10), ('DESTROYED', 11), ('NOSUCHSERVICE', 12), ) def split(content, size): """ Simple split of bytes into two substrings. :param bytes content: string to split :param int size: index to split the string on :returns: two value tuple with the split bytes """ return content[:size], content[size:] class LinkProtocol(int): """ Constants that vary by our link protocol version. :var int version: link protocol version :var stem.client.datatype.Size circ_id_size: circuit identifier field size :var int fixed_cell_length: size of cells with a fixed length :var int first_circ_id: When creating circuits we pick an unused identifier from a range that's determined by our link protocol. """ def __new__(cls, version): if isinstance(version, LinkProtocol): return version # already a LinkProtocol protocol = int.__new__(cls, version) protocol.version = version protocol.circ_id_size = Size.LONG if version > 3 else Size.SHORT protocol.first_circ_id = 0x80000000 if version > 3 else 0x01 cell_header_size = protocol.circ_id_size.size + 1 # circuit id (2 or 4 bytes) + command (1 byte) protocol.fixed_cell_length = cell_header_size + stem.client.cell.FIXED_PAYLOAD_LEN return protocol def __hash__(self): # All LinkProtocol attributes can be derived from our version, so that's # all we need in our hash. Offsetting by our type so we don't hash conflict # with ints. return self.version * hash(str(type(self))) def __eq__(self, other): if isinstance(other, int): return self.version == other elif isinstance(other, LinkProtocol): return hash(self) == hash(other) else: return False def __ne__(self, other): return not self == other def __int__(self): return self.version class Field(object): """ Packable and unpackable datatype. """ def pack(self): """ Encodes field into bytes. :returns: **bytes** that can be communicated over Tor's ORPort :raises: **ValueError** if incorrect type or size """ raise NotImplementedError('Not yet available') @classmethod def unpack(cls, packed): """ Decodes bytes into a field of this type. :param bytes packed: content to decode :returns: instance of this class :raises: **ValueError** if packed data is malformed """ unpacked, remainder = cls.pop(packed) if remainder: raise ValueError('%s is the wrong size for a %s field' % (repr(packed), cls.__name__)) return unpacked @staticmethod def pop(packed): """ Decodes bytes as this field type, providing it and the remainder. :param bytes packed: content to decode :returns: tuple of the form (unpacked, remainder) :raises: **ValueError** if packed data is malformed """ raise NotImplementedError('Not yet available') def __eq__(self, other): return hash(self) == hash(other) if isinstance(other, Field) else False def __ne__(self, other): return not self == other class Size(Field): """ Unsigned `struct.pack format ` for network-order fields. ==================== =========== Pack Description ==================== =========== CHAR Unsigned char (1 byte) SHORT Unsigned short (2 bytes) LONG Unsigned long (4 bytes) LONG_LONG Unsigned long long (8 bytes) ==================== =========== """ def __init__(self, name, size, pack_format): self.name = name self.size = size self.format = pack_format @staticmethod def pop(packed): raise NotImplementedError("Use our constant's unpack() and pop() instead") def pack(self, content): # TODO: Python 2.6's struct module behaves a little differently in a couple # respsects... # # * Invalid types raise a TypeError rather than a struct.error. # # * Negative values are happily packed despite being unsigned fields with # a message printed to stdout (!) that says... # # stem/client/datatype.py:362: DeprecationWarning: struct integer overflow masking is deprecated # packed = struct.pack(self.format, content) # stem/client/datatype.py:362: DeprecationWarning: 'B' format requires 0 <= number <= 255 # packed = struct.pack(self.format, content) # # Rather than adjust this method to account for these differences doing # duplicate upfront checks just for python 2.6. When we drop 2.6 support # this can obviously be dropped. if stem.prereq._is_python_26(): if not stem.util._is_int(content): raise ValueError('Size.pack encodes an integer, but was a %s' % type(content).__name__) elif content < 0: raise ValueError('Packed values must be positive (attempted to pack %i as a %s)' % (content, self.name)) try: packed = struct.pack(self.format, content) except struct.error: if not stem.util._is_int(content): raise ValueError('Size.pack encodes an integer, but was a %s' % type(content).__name__) elif content < 0: raise ValueError('Packed values must be positive (attempted to pack %i as a %s)' % (content, self.name)) else: raise # some other struct exception if self.size != len(packed): raise ValueError('%s is the wrong size for a %s field' % (repr(packed), self.name)) return packed def unpack(self, packed): if self.size != len(packed): raise ValueError('%s is the wrong size for a %s field' % (repr(packed), self.name)) return struct.unpack(self.format, packed)[0] def pop(self, packed): to_unpack, remainder = split(packed, self.size) return self.unpack(to_unpack), remainder def __hash__(self): return stem.util._hash_attr(self, 'name', 'size', 'format', cache = True) class Address(Field): """ Relay address. :var stem.client.AddrType type: address type :var int type_int: integer value of the address type :var unicode value: address value :var bytes value_bin: encoded address value """ def __init__(self, value, addr_type = None): if addr_type is None: if stem.util.connection.is_valid_ipv4_address(value): addr_type = AddrType.IPv4 elif stem.util.connection.is_valid_ipv6_address(value): addr_type = AddrType.IPv6 else: raise ValueError("'%s' isn't an IPv4 or IPv6 address" % value) self.type, self.type_int = AddrType.get(addr_type) if self.type == AddrType.IPv4: if stem.util.connection.is_valid_ipv4_address(value): self.value = value self.value_bin = b''.join([Size.CHAR.pack(int(v)) for v in value.split('.')]) else: if len(value) != 4: raise ValueError('Packed IPv4 addresses should be four bytes, but was: %s' % repr(value)) self.value = '.'.join([str(Size.CHAR.unpack(value[i:i + 1])) for i in range(4)]) self.value_bin = value elif self.type == AddrType.IPv6: if stem.util.connection.is_valid_ipv6_address(value): self.value = stem.util.connection.expand_ipv6_address(value).lower() self.value_bin = b''.join([Size.SHORT.pack(int(v, 16)) for v in self.value.split(':')]) else: if len(value) != 16: raise ValueError('Packed IPv6 addresses should be sixteen bytes, but was: %s' % repr(value)) self.value = ':'.join(['%04x' % Size.SHORT.unpack(value[i * 2:(i + 1) * 2]) for i in range(8)]) self.value_bin = value else: # The spec doesn't really tell us what form to expect errors to be. For # now just leaving the value unset so we can fill it in later when we # know what would be most useful. self.value = None self.value_bin = value def pack(self): cell = bytearray() cell += Size.CHAR.pack(self.type_int) cell += Size.CHAR.pack(len(self.value_bin)) cell += self.value_bin return bytes(cell) @staticmethod def pop(content): addr_type, content = Size.CHAR.pop(content) addr_length, content = Size.CHAR.pop(content) if len(content) < addr_length: raise ValueError('Address specified a payload of %i bytes, but only had %i' % (addr_length, len(content))) addr_value, content = split(content, addr_length) return Address(addr_value, addr_type), content def __hash__(self): return stem.util._hash_attr(self, 'type_int', 'value_bin', cache = True) class Certificate(Field): """ Relay certificate as defined in tor-spec section 4.2. :var stem.client.CertType type: certificate type :var int type_int: integer value of the certificate type :var bytes value: certificate value """ def __init__(self, cert_type, value): self.type, self.type_int = CertType.get(cert_type) self.value = value def pack(self): cell = bytearray() cell += Size.CHAR.pack(self.type_int) cell += Size.SHORT.pack(len(self.value)) cell += self.value return bytes(cell) @staticmethod def pop(content): cert_type, content = Size.CHAR.pop(content) cert_size, content = Size.SHORT.pop(content) if cert_size > len(content): raise ValueError('CERTS cell should have a certificate with %i bytes, but only had %i remaining' % (cert_size, len(content))) cert_bytes, content = split(content, cert_size) return Certificate(cert_type, cert_bytes), content def __hash__(self): return stem.util._hash_attr(self, 'type_int', 'value') class KDF(collections.namedtuple('KDF', ['key_hash', 'forward_digest', 'backward_digest', 'forward_key', 'backward_key'])): """ Computed KDF-TOR derived values for TAP, CREATE_FAST handshakes, and hidden service protocols as defined tor-spec section 5.2.1. :var bytes key_hash: hash that proves knowledge of our shared key :var bytes forward_digest: forward digest hash seed :var bytes backward_digest: backward digest hash seed :var bytes forward_key: forward encryption key :var bytes backward_key: backward encryption key """ @staticmethod def from_value(key_material): # Derived key material, as per... # # K = H(K0 | [00]) | H(K0 | [01]) | H(K0 | [02]) | ... derived_key = b'' counter = 0 while len(derived_key) < KEY_LEN * 2 + HASH_LEN * 3: derived_key += hashlib.sha1(key_material + Size.CHAR.pack(counter)).digest() counter += 1 key_hash, derived_key = split(derived_key, HASH_LEN) forward_digest, derived_key = split(derived_key, HASH_LEN) backward_digest, derived_key = split(derived_key, HASH_LEN) forward_key, derived_key = split(derived_key, KEY_LEN) backward_key, derived_key = split(derived_key, KEY_LEN) return KDF(key_hash, forward_digest, backward_digest, forward_key, backward_key) setattr(Size, 'CHAR', Size('CHAR', 1, '!B')) setattr(Size, 'SHORT', Size('SHORT', 2, '!H')) setattr(Size, 'LONG', Size('LONG', 4, '!L')) setattr(Size, 'LONG_LONG', Size('LONG_LONG', 8, '!Q')) stem-1.7.1/stem/client/__init__.py0000664000175000017500000002366113356173024017565 0ustar atagaratagar00000000000000# Copyright 2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Interaction with a Tor relay's ORPort. :class:`~stem.client.Relay` is a wrapper for :class:`~stem.socket.RelaySocket`, much the same way as :class:`~stem.control.Controller` provides higher level functions for :class:`~stem.socket.ControlSocket`. .. versionadded:: 1.7.0 :: Relay - Connection with a tor relay's ORPort. | +- connect - Establishes a connection with a relay. | |- is_alive - reports if our connection is open or closed |- connection_time - time when we last connected or disconnected |- close - shuts down our connection | +- create_circuit - establishes a new circuit Circuit - Circuit we've established through a relay. |- send - sends a message through this circuit +- close - closes this circuit """ import hashlib import threading import stem import stem.client.cell import stem.socket import stem.util.connection from stem.client.datatype import ZERO, LinkProtocol, Address, KDF, split __all__ = [ 'cell', 'datatype', ] DEFAULT_LINK_PROTOCOLS = (3, 4, 5) class Relay(object): """ Connection with a Tor relay's ORPort. :var int link_protocol: link protocol version we established """ def __init__(self, orport, link_protocol): self.link_protocol = LinkProtocol(link_protocol) self._orport = orport self._orport_lock = threading.RLock() self._circuits = {} @staticmethod def connect(address, port, link_protocols = DEFAULT_LINK_PROTOCOLS): """ Establishes a connection with the given ORPort. :param str address: ip address of the relay :param int port: ORPort of the relay :param tuple link_protocols: acceptable link protocol versions :raises: * **ValueError** if address or port are invalid * :class:`stem.SocketError` if we're unable to establish a connection """ relay_addr = Address(address) if not stem.util.connection.is_valid_port(port): raise ValueError("'%s' isn't a valid port" % port) elif not link_protocols: raise ValueError("Connection can't be established without a link protocol.") try: conn = stem.socket.RelaySocket(address, port) except stem.SocketError as exc: if 'Connection refused' in str(exc): raise stem.SocketError("Failed to connect to %s:%i. Maybe it isn't an ORPort?" % (address, port)) # If not an ORPort (for instance, mistakenly connecting to a ControlPort # instead) we'll likely fail during SSL negotiation. This can result # in a variety of responses so normalizing what we can... # # Debian 9.5: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:661) # Ubuntu 16.04: [SSL: UNKNOWN_PROTOCOL] unknown protocol (_ssl.c:590) # Ubuntu 12.04: [Errno 1] _ssl.c:504: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol if 'unknown protocol' in str(exc) or 'wrong version number' in str(exc): raise stem.SocketError("Failed to SSL authenticate to %s:%i. Maybe it isn't an ORPort?" % (address, port)) raise # To negotiate our link protocol the first VERSIONS cell is expected to use # a circuit ID field size from protocol version 1-3 for backward # compatibility... # # The first VERSIONS cell, and any cells sent before the # first VERSIONS cell, always have CIRCID_LEN == 2 for backward # compatibility. conn.send(stem.client.cell.VersionsCell(link_protocols).pack(2)) response = conn.recv() # Link negotiation ends right away if we lack a common protocol # version. (#25139) if not response: conn.close() raise stem.SocketError('Unable to establish a common link protocol with %s:%i' % (address, port)) versions_reply = stem.client.cell.Cell.pop(response, 2)[0] common_protocols = set(link_protocols).intersection(versions_reply.versions) if not common_protocols: conn.close() raise stem.SocketError('Unable to find a common link protocol. We support %s but %s:%i supports %s.' % (', '.join(link_protocols), address, port, ', '.join(versions_reply.versions))) # Establishing connections requires sending a NETINFO, but including our # address is optional. We can revisit including it when we have a usecase # where it would help. link_protocol = max(common_protocols) conn.send(stem.client.cell.NetinfoCell(relay_addr, []).pack(link_protocol)) return Relay(conn, link_protocol) def is_alive(self): """ Checks if our socket is currently connected. This is a pass-through for our socket's :func:`~stem.socket.BaseSocket.is_alive` method. :returns: **bool** that's **True** if our socket is connected and **False** otherwise """ return self._orport.is_alive() def connection_time(self): """ Provides the unix timestamp for when our socket was either connected or disconnected. That is to say, the time we connected if we're currently connected and the time we disconnected if we're not connected. :returns: **float** for when we last connected or disconnected, zero if we've never connected """ return self._orport.connection_time() def close(self): """ Closes our socket connection. This is a pass-through for our socket's :func:`~stem.socket.BaseSocket.close` method. """ with self._orport_lock: return self._orport.close() def create_circuit(self): """ Establishes a new circuit. """ with self._orport_lock: circ_id = max(self._circuits) + 1 if self._circuits else self.link_protocol.first_circ_id create_fast_cell = stem.client.cell.CreateFastCell(circ_id) self._orport.send(create_fast_cell.pack(self.link_protocol)) response = stem.client.cell.Cell.unpack(self._orport.recv(), self.link_protocol) created_fast_cells = filter(lambda cell: isinstance(cell, stem.client.cell.CreatedFastCell), response) if not created_fast_cells: raise ValueError('We should get a CREATED_FAST response from a CREATE_FAST request') created_fast_cell = list(created_fast_cells)[0] kdf = KDF.from_value(create_fast_cell.key_material + created_fast_cell.key_material) if created_fast_cell.derivative_key != kdf.key_hash: raise ValueError('Remote failed to prove that it knows our shared key') circ = Circuit(self, circ_id, kdf) self._circuits[circ.id] = circ return circ def __iter__(self): with self._orport_lock: for circ in self._circuits.values(): yield circ def __enter__(self): return self def __exit__(self, exit_type, value, traceback): self.close() class Circuit(object): """ Circuit through which requests can be made of a `Tor relay's ORPort `_. :var stem.client.Relay relay: relay through which this circuit has been established :var int id: circuit id :var hashlib.sha1 forward_digest: digest for forward integrity check :var hashlib.sha1 backward_digest: digest for backward integrity check :var bytes forward_key: forward encryption key :var bytes backward_key: backward encryption key """ def __init__(self, relay, circ_id, kdf): if not stem.prereq.is_crypto_available(): raise ImportError('Circuit construction requires the cryptography module') from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend ctr = modes.CTR(ZERO * (algorithms.AES.block_size // 8)) self.relay = relay self.id = circ_id self.forward_digest = hashlib.sha1(kdf.forward_digest) self.backward_digest = hashlib.sha1(kdf.backward_digest) self.forward_key = Cipher(algorithms.AES(kdf.forward_key), ctr, default_backend()).encryptor() self.backward_key = Cipher(algorithms.AES(kdf.backward_key), ctr, default_backend()).decryptor() def send(self, command, data = '', stream_id = 0): """ Sends a message over the circuit. :param stem.client.datatype.RelayCommand command: command to be issued :param bytes data: message payload :param int stream_id: specific stream this concerns :returns: **list** of :class:`~stem.client.cell.RelayCell` responses """ with self.relay._orport_lock: # Encrypt and send the cell. Our digest/key only updates if the cell is # successfully sent. cell = stem.client.cell.RelayCell(self.id, command, data, stream_id = stream_id) payload, forward_key, forward_digest = cell.encrypt(self.relay.link_protocol, self.forward_key, self.forward_digest) self.relay._orport.send(payload) self.forward_digest = forward_digest self.forward_key = forward_key # Decrypt relay cells received in response. Again, our digest/key only # updates when handled successfully. reply = self.relay._orport.recv() reply_cells = [] if len(reply) % self.relay.link_protocol.fixed_cell_length != 0: raise stem.ProtocolError('Circuit response should be a series of RELAY cells, but received an unexpected size for a response: %i' % len(reply)) while reply: encrypted_cell, reply = split(reply, self.relay.link_protocol.fixed_cell_length) decrypted_cell, backward_key, backward_digest = stem.client.cell.RelayCell.decrypt(self.relay.link_protocol, encrypted_cell, self.backward_key, self.backward_digest) if self.id != decrypted_cell.circ_id: raise stem.ProtocolError('Response should be for circuit id %i, not %i' % (self.id, decrypted_cell.circ_id)) self.backward_digest = backward_digest self.backward_key = backward_key reply_cells.append(decrypted_cell) return reply_cells def close(self): with self.relay._orport_lock: self.relay._orport.send(stem.client.cell.DestroyCell(self.id).pack(self.relay.link_protocol)) del self.relay._circuits[self.id] def __enter__(self): return self def __exit__(self, exit_type, value, traceback): self.close() stem-1.7.1/stem/client/cell.py0000664000175000017500000006511013341474573016747 0ustar atagaratagar00000000000000# Copyright 2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Messages communicated over a Tor relay's ORPort. .. versionadded:: 1.7.0 **Module Overview:** :: Cell - Base class for ORPort messages. |- CircuitCell - Circuit management. | |- CreateCell - Create a circuit. (section 5.1) | |- CreatedCell - Acknowledge create. (section 5.1) | |- RelayCell - End-to-end data. (section 6.1) | |- DestroyCell - Stop using a circuit. (section 5.4) | |- CreateFastCell - Create a circuit, no PK. (section 5.1) | |- CreatedFastCell - Circuit created, no PK. (section 5.1) | |- RelayEarlyCell - End-to-end data; limited. (section 5.6) | |- Create2Cell - Extended CREATE cell. (section 5.1) | +- Created2Cell - Extended CREATED cell. (section 5.1) | |- PaddingCell - Padding negotiation. (section 7.2) |- VersionsCell - Negotiate proto version. (section 4) |- NetinfoCell - Time and address info. (section 4.5) |- PaddingNegotiateCell - Padding negotiation. (section 7.2) |- VPaddingCell - Variable-length padding. (section 7.2) |- CertsCell - Relay certificates. (section 4.2) |- AuthChallengeCell - Challenge value. (section 4.3) |- AuthenticateCell - Client authentication. (section 4.5) |- AuthorizeCell - Client authorization. (not yet used) | |- pack - encodes cell into bytes |- unpack - decodes series of cells +- pop - decodes cell with remainder """ import copy import datetime import inspect import os import sys import stem.util from stem import UNDEFINED from stem.client.datatype import HASH_LEN, ZERO, LinkProtocol, Address, Certificate, CloseReason, RelayCommand, Size, split from stem.util import datetime_to_unix, str_tools FIXED_PAYLOAD_LEN = 509 # PAYLOAD_LEN, per tor-spec section 0.2 AUTH_CHALLENGE_SIZE = 32 RELAY_DIGEST_SIZE = Size.LONG STREAM_ID_REQUIRED = ( RelayCommand.BEGIN, RelayCommand.DATA, RelayCommand.END, RelayCommand.CONNECTED, RelayCommand.RESOLVE, RelayCommand.RESOLVED, RelayCommand.BEGIN_DIR, ) STREAM_ID_DISALLOWED = ( RelayCommand.EXTEND, RelayCommand.EXTENDED, RelayCommand.TRUNCATE, RelayCommand.TRUNCATED, RelayCommand.DROP, RelayCommand.EXTEND2, RelayCommand.EXTENDED2, ) class Cell(object): """ Metadata for ORPort cells. Unused padding are **not** used in equality checks or hashing. If two cells differ only in their *unused* attribute they are functionally equal. The following cell types explicitly don't have *unused* content: * PaddingCell (we consider all content part of payload) * VersionsCell (all content is unpacked and treated as a version specification) * VPaddingCell (we consider all content part of payload) :var bytes unused: unused filler that padded the cell to the expected size """ NAME = 'UNKNOWN' VALUE = -1 IS_FIXED_SIZE = False def __init__(self, unused = b''): super(Cell, self).__init__() self.unused = unused @staticmethod def by_name(name): """ Provides cell attributes by its name. :param str name: cell command to fetch :raises: **ValueError** if cell type is invalid """ for _, cls in inspect.getmembers(sys.modules[__name__]): if name == getattr(cls, 'NAME', UNDEFINED): return cls raise ValueError("'%s' isn't a valid cell type" % name) @staticmethod def by_value(value): """ Provides cell attributes by its value. :param int value: cell value to fetch :raises: **ValueError** if cell type is invalid """ for _, cls in inspect.getmembers(sys.modules[__name__]): if value == getattr(cls, 'VALUE', UNDEFINED): return cls raise ValueError("'%s' isn't a valid cell value" % value) def pack(self, link_protocol): raise NotImplementedError('Packing not yet implemented for %s cells' % type(self).NAME) @staticmethod def unpack(content, link_protocol): """ Unpacks all cells from a response. :param bytes content: payload to decode :param int link_protocol: link protocol version :returns: :class:`~stem.client.cell.Cell` generator :raises: * ValueError if content is malformed * NotImplementedError if unable to unpack any of the cell types """ while content: cell, content = Cell.pop(content, link_protocol) yield cell @staticmethod def pop(content, link_protocol): """ Unpacks the first cell. :param bytes content: payload to decode :param int link_protocol: link protocol version :returns: (:class:`~stem.client.cell.Cell`, remainder) tuple :raises: * ValueError if content is malformed * NotImplementedError if unable to unpack this cell type """ link_protocol = LinkProtocol(link_protocol) circ_id, content = link_protocol.circ_id_size.pop(content) command, content = Size.CHAR.pop(content) cls = Cell.by_value(command) if cls.IS_FIXED_SIZE: payload_len = FIXED_PAYLOAD_LEN else: payload_len, content = Size.SHORT.pop(content) if len(content) < payload_len: raise ValueError('%s cell should have a payload of %i bytes, but only had %i' % (cls.NAME, payload_len, len(content))) payload, content = split(content, payload_len) return cls._unpack(payload, circ_id, link_protocol), content @classmethod def _pack(cls, link_protocol, payload, unused = b'', circ_id = None): """ Provides bytes that can be used on the wire for these cell attributes. Format of a properly packed cell depends on if it's fixed or variable sized... :: Fixed: [ CircuitID ][ Command ][ Payload ][ Padding ] Variable: [ CircuitID ][ Command ][ Size ][ Payload ] :param str name: cell command :param int link_protocol: link protocol version :param bytes payload: cell payload :param int circ_id: circuit id, if a CircuitCell :returns: **bytes** with the encoded payload :raises: **ValueError** if cell type invalid or payload makes cell too large """ if issubclass(cls, CircuitCell): if circ_id is None: raise ValueError('%s cells require a circuit identifier' % cls.NAME) elif circ_id < 1: raise ValueError('Circuit identifiers must a positive integer, not %s' % circ_id) else: if circ_id is not None: raise ValueError('%s cells should not specify a circuit identifier' % cls.NAME) circ_id = 0 # cell doesn't concern a circuit, default field to zero link_protocol = LinkProtocol(link_protocol) cell = bytearray() cell += link_protocol.circ_id_size.pack(circ_id) cell += Size.CHAR.pack(cls.VALUE) cell += b'' if cls.IS_FIXED_SIZE else Size.SHORT.pack(len(payload) + len(unused)) cell += payload # include the unused portion (typically from unpacking) cell += unused # pad fixed sized cells to the required length if cls.IS_FIXED_SIZE: if len(cell) > link_protocol.fixed_cell_length: raise ValueError('Cell of type %s is too large (%i bytes), must not be more than %i. Check payload size (was %i bytes)' % (cls.NAME, len(cell), link_protocol.fixed_cell_length, len(payload))) cell += ZERO * (link_protocol.fixed_cell_length - len(cell)) return bytes(cell) @classmethod def _unpack(cls, content, circ_id, link_protocol): """ Subclass implementation for unpacking cell content. :param bytes content: payload to decode :param stem.client.datatype.LinkProtocol link_protocol: link protocol version :param int circ_id: circuit id cell is for :returns: instance of this cell type :raises: **ValueError** if content is malformed """ raise NotImplementedError('Unpacking not yet implemented for %s cells' % cls.NAME) def __eq__(self, other): return hash(self) == hash(other) if isinstance(other, Cell) else False def __ne__(self, other): return not self == other class CircuitCell(Cell): """ Cell concerning circuits. :var int circ_id: circuit id """ def __init__(self, circ_id, unused = b''): super(CircuitCell, self).__init__(unused) self.circ_id = circ_id class PaddingCell(Cell): """ Randomized content to either keep activity going on a circuit. :var bytes payload: randomized payload """ NAME = 'PADDING' VALUE = 0 IS_FIXED_SIZE = True def __init__(self, payload = None): if not payload: payload = os.urandom(FIXED_PAYLOAD_LEN) elif len(payload) != FIXED_PAYLOAD_LEN: raise ValueError('Padding payload should be %i bytes, but was %i' % (FIXED_PAYLOAD_LEN, len(payload))) super(PaddingCell, self).__init__() self.payload = payload def pack(self, link_protocol): return PaddingCell._pack(link_protocol, self.payload) @classmethod def _unpack(cls, content, circ_id, link_protocol): return PaddingCell(content) def __hash__(self): return stem.util._hash_attr(self, 'payload', cache = True) class CreateCell(CircuitCell): NAME = 'CREATE' VALUE = 1 IS_FIXED_SIZE = True def __init__(self): super(CreateCell, self).__init__() # TODO: implement class CreatedCell(CircuitCell): NAME = 'CREATED' VALUE = 2 IS_FIXED_SIZE = True def __init__(self): super(CreatedCell, self).__init__() # TODO: implement class RelayCell(CircuitCell): """ Command concerning a relay circuit. Our 'recognized' attribute provides a cheap (but incomplete) check for if our cell payload is encrypted. If non-zero our payload *IS* encrypted, but if zero we're *PROBABLY* fully decrypted. This uncertainty is because encrypted cells have a small chance of coincidently producing zero for this value as well. :var stem.client.RelayCommand command: command to be issued :var int command_int: integer value of our command :var bytes data: payload of the cell :var int recognized: non-zero if payload is encrypted :var int digest: running digest held with the relay :var int stream_id: specific stream this concerns """ NAME = 'RELAY' VALUE = 3 IS_FIXED_SIZE = True def __init__(self, circ_id, command, data, digest = 0, stream_id = 0, recognized = 0, unused = b''): if 'HASH' in str(type(digest)): # Unfortunately hashlib generates from a dynamic private class so # isinstance() isn't such a great option. With python2/python3 the # name is 'hashlib.HASH' whereas PyPy calls it just 'HASH'. digest_packed = digest.digest()[:RELAY_DIGEST_SIZE.size] digest = RELAY_DIGEST_SIZE.unpack(digest_packed) elif stem.util._is_str(digest): digest_packed = digest[:RELAY_DIGEST_SIZE.size] digest = RELAY_DIGEST_SIZE.unpack(digest_packed) elif stem.util._is_int(digest): pass else: raise ValueError('RELAY cell digest must be a hash, string, or int but was a %s' % type(digest).__name__) super(RelayCell, self).__init__(circ_id, unused) self.command, self.command_int = RelayCommand.get(command) self.recognized = recognized self.stream_id = stream_id self.digest = digest self.data = str_tools._to_bytes(data) if digest == 0: if not stream_id and self.command in STREAM_ID_REQUIRED: raise ValueError('%s relay cells require a stream id' % self.command) elif stream_id and self.command in STREAM_ID_DISALLOWED: raise ValueError('%s relay cells concern the circuit itself and cannot have a stream id' % self.command) def pack(self, link_protocol): payload = bytearray() payload += Size.CHAR.pack(self.command_int) payload += Size.SHORT.pack(self.recognized) payload += Size.SHORT.pack(self.stream_id) payload += Size.LONG.pack(self.digest) payload += Size.SHORT.pack(len(self.data)) payload += self.data return RelayCell._pack(link_protocol, bytes(payload), self.unused, self.circ_id) @staticmethod def decrypt(link_protocol, content, key, digest): """ Decrypts content as a relay cell addressed to us. This provides back a tuple of the form... :: (cell (RelayCell), new_key (CipherContext), new_digest (HASH)) :param int link_protocol: link protocol version :param bytes content: cell content to be decrypted :param cryptography.hazmat.primitives.ciphers.CipherContext key: key established with the relay we received this cell from :param HASH digest: running digest held with the relay :returns: **tuple** with our decrypted cell and updated key/digest :raises: :class:`stem.ProtocolError` if content doesn't belong to a relay cell """ new_key = copy.copy(key) new_digest = digest.copy() if len(content) != link_protocol.fixed_cell_length: raise stem.ProtocolError('RELAY cells should be %i bytes, but received %i' % (link_protocol.fixed_cell_length, len(content))) circ_id, content = link_protocol.circ_id_size.pop(content) command, encrypted_payload = Size.CHAR.pop(content) if command != RelayCell.VALUE: raise stem.ProtocolError('Cannot decrypt as a RELAY cell. This had command %i instead.' % command) payload = new_key.update(encrypted_payload) cell = RelayCell._unpack(payload, circ_id, link_protocol) # TODO: Implement our decryption digest. It is used to support relaying # within multi-hop circuits. On first glance this should go something # like... # # # Our updated digest is calculated based on this cell with a blanked # # digest field. # # digest_cell = RelayCell(self.circ_id, self.command, self.data, 0, self.stream_id, self.recognized, self.unused) # new_digest.update(digest_cell.pack(link_protocol)) # # is_encrypted == cell.recognized != 0 or self.digest == new_digest # # ... or something like that. Until we attempt to support relaying this is # both moot and difficult to exercise in order to ensure we get it right. return cell, new_key, new_digest def encrypt(self, link_protocol, key, digest): """ Encrypts our cell content to be sent with the given key. This provides back a tuple of the form... :: (payload (bytes), new_key (CipherContext), new_digest (HASH)) :param int link_protocol: link protocol version :param cryptography.hazmat.primitives.ciphers.CipherContext key: key established with the relay we're sending this cell to :param HASH digest: running digest held with the relay :returns: **tuple** with our encrypted payload and updated key/digest """ new_key = copy.copy(key) new_digest = digest.copy() # Digests are computed from our payload, not including our header's circuit # id (2 or 4 bytes) and command (1 byte). header_size = link_protocol.circ_id_size.size + 1 payload_without_digest = self.pack(link_protocol)[header_size:] new_digest.update(payload_without_digest) # Pack a copy of ourselves with our newly calculated digest, and encrypt # the payload. Header remains plaintext. cell = RelayCell(self.circ_id, self.command, self.data, new_digest, self.stream_id, self.recognized, self.unused) header, payload = split(cell.pack(link_protocol), header_size) return header + new_key.update(payload), new_key, new_digest @classmethod def _unpack(cls, content, circ_id, link_protocol): command, content = Size.CHAR.pop(content) recognized, content = Size.SHORT.pop(content) # 'recognized' field stream_id, content = Size.SHORT.pop(content) digest, content = Size.LONG.pop(content) data_len, content = Size.SHORT.pop(content) data, unused = split(content, data_len) if len(data) != data_len: raise ValueError('%s cell said it had %i bytes of data, but only had %i' % (cls.NAME, data_len, len(data))) return RelayCell(circ_id, command, data, digest, stream_id, recognized, unused) def __hash__(self): return stem.util._hash_attr(self, 'command_int', 'stream_id', 'digest', 'data', cache = True) class DestroyCell(CircuitCell): """ Closes the given circuit. :var stem.client.CloseReason reason: reason the circuit is being closed :var int reason_int: integer value of our closure reason """ NAME = 'DESTROY' VALUE = 4 IS_FIXED_SIZE = True def __init__(self, circ_id, reason = CloseReason.NONE, unused = b''): super(DestroyCell, self).__init__(circ_id, unused) self.reason, self.reason_int = CloseReason.get(reason) def pack(self, link_protocol): return DestroyCell._pack(link_protocol, Size.CHAR.pack(self.reason_int), self.unused, self.circ_id) @classmethod def _unpack(cls, content, circ_id, link_protocol): reason, unused = Size.CHAR.pop(content) return DestroyCell(circ_id, reason, unused) def __hash__(self): return stem.util._hash_attr(self, 'circ_id', 'reason_int', cache = True) class CreateFastCell(CircuitCell): """ Create a circuit with our first hop. This is lighter weight than further hops because we've already established the relay's identity and secret key. :var bytes key_material: randomized key material """ NAME = 'CREATE_FAST' VALUE = 5 IS_FIXED_SIZE = True def __init__(self, circ_id, key_material = None, unused = b''): if not key_material: key_material = os.urandom(HASH_LEN) elif len(key_material) != HASH_LEN: raise ValueError('Key material should be %i bytes, but was %i' % (HASH_LEN, len(key_material))) super(CreateFastCell, self).__init__(circ_id, unused) self.key_material = key_material def pack(self, link_protocol): return CreateFastCell._pack(link_protocol, self.key_material, self.unused, self.circ_id) @classmethod def _unpack(cls, content, circ_id, link_protocol): key_material, unused = split(content, HASH_LEN) if len(key_material) != HASH_LEN: raise ValueError('Key material should be %i bytes, but was %i' % (HASH_LEN, len(key_material))) return CreateFastCell(circ_id, key_material, unused) def __hash__(self): return stem.util._hash_attr(self, 'circ_id', 'key_material', cache = True) class CreatedFastCell(CircuitCell): """ CREATE_FAST reply. :var bytes key_material: randomized key material :var bytes derivative_key: hash proving the relay knows our shared key """ NAME = 'CREATED_FAST' VALUE = 6 IS_FIXED_SIZE = True def __init__(self, circ_id, derivative_key, key_material = None, unused = b''): if not key_material: key_material = os.urandom(HASH_LEN) elif len(key_material) != HASH_LEN: raise ValueError('Key material should be %i bytes, but was %i' % (HASH_LEN, len(key_material))) if len(derivative_key) != HASH_LEN: raise ValueError('Derivatived key should be %i bytes, but was %i' % (HASH_LEN, len(derivative_key))) super(CreatedFastCell, self).__init__(circ_id, unused) self.key_material = key_material self.derivative_key = derivative_key def pack(self, link_protocol): return CreatedFastCell._pack(link_protocol, self.key_material + self.derivative_key, self.unused, self.circ_id) @classmethod def _unpack(cls, content, circ_id, link_protocol): if len(content) < HASH_LEN * 2: raise ValueError('Key material and derivatived key should be %i bytes, but was %i' % (HASH_LEN * 2, len(content))) key_material, content = split(content, HASH_LEN) derivative_key, content = split(content, HASH_LEN) return CreatedFastCell(circ_id, derivative_key, key_material, content) def __hash__(self): return stem.util._hash_attr(self, 'circ_id', 'derivative_key', 'key_material', cache = True) class VersionsCell(Cell): """ Link version negotiation cell. :var list versions: link versions """ NAME = 'VERSIONS' VALUE = 7 IS_FIXED_SIZE = False def __init__(self, versions): super(VersionsCell, self).__init__() self.versions = versions def pack(self, link_protocol): payload = b''.join([Size.SHORT.pack(v) for v in self.versions]) return VersionsCell._pack(link_protocol, payload) @classmethod def _unpack(cls, content, circ_id, link_protocol): link_protocols = [] while content: version, content = Size.SHORT.pop(content) link_protocols.append(version) return VersionsCell(link_protocols) def __hash__(self): return stem.util._hash_attr(self, 'versions', cache = True) class NetinfoCell(Cell): """ Information relays exchange about each other. :var datetime timestamp: current time :var stem.client.Address receiver_address: receiver's OR address :var list sender_addresses: sender's OR addresses """ NAME = 'NETINFO' VALUE = 8 IS_FIXED_SIZE = True def __init__(self, receiver_address, sender_addresses, timestamp = None, unused = b''): super(NetinfoCell, self).__init__(unused) self.timestamp = timestamp if timestamp else datetime.datetime.now() self.receiver_address = receiver_address self.sender_addresses = sender_addresses def pack(self, link_protocol): payload = bytearray() payload += Size.LONG.pack(int(datetime_to_unix(self.timestamp))) payload += self.receiver_address.pack() payload += Size.CHAR.pack(len(self.sender_addresses)) for addr in self.sender_addresses: payload += addr.pack() return NetinfoCell._pack(link_protocol, bytes(payload), self.unused) @classmethod def _unpack(cls, content, circ_id, link_protocol): timestamp, content = Size.LONG.pop(content) receiver_address, content = Address.pop(content) sender_addresses = [] sender_addr_count, content = Size.CHAR.pop(content) for i in range(sender_addr_count): addr, content = Address.pop(content) sender_addresses.append(addr) return NetinfoCell(receiver_address, sender_addresses, datetime.datetime.utcfromtimestamp(timestamp), unused = content) def __hash__(self): return stem.util._hash_attr(self, 'timestamp', 'receiver_address', 'sender_addresses', cache = True) class RelayEarlyCell(CircuitCell): NAME = 'RELAY_EARLY' VALUE = 9 IS_FIXED_SIZE = True def __init__(self): super(RelayEarlyCell, self).__init__() # TODO: implement class Create2Cell(CircuitCell): NAME = 'CREATE2' VALUE = 10 IS_FIXED_SIZE = True def __init__(self): super(Create2Cell, self).__init__() # TODO: implement class Created2Cell(Cell): NAME = 'CREATED2' VALUE = 11 IS_FIXED_SIZE = True def __init__(self): super(Created2Cell, self).__init__() # TODO: implement class PaddingNegotiateCell(Cell): NAME = 'PADDING_NEGOTIATE' VALUE = 12 IS_FIXED_SIZE = True def __init__(self): super(PaddingNegotiateCell, self).__init__() # TODO: implement class VPaddingCell(Cell): """ Variable length randomized content to either keep activity going on a circuit. :var bytes payload: randomized payload """ NAME = 'VPADDING' VALUE = 128 IS_FIXED_SIZE = False def __init__(self, size = None, payload = None): if size is None and payload is None: raise ValueError('VPaddingCell constructor must specify payload or size') elif size is not None and size < 0: raise ValueError('VPaddingCell size (%s) cannot be negative' % size) elif size is not None and payload is not None and size != len(payload): raise ValueError('VPaddingCell constructor specified both a size of %i bytes and payload of %i bytes' % (size, len(payload))) super(VPaddingCell, self).__init__() self.payload = payload if payload is not None else os.urandom(size) def pack(self, link_protocol): return VPaddingCell._pack(link_protocol, self.payload) @classmethod def _unpack(cls, content, circ_id, link_protocol): return VPaddingCell(payload = content) def __hash__(self): return stem.util._hash_attr(self, 'payload', cache = True) class CertsCell(Cell): """ Certificate held by the relay we're communicating with. :var list certificates: :class:`~stem.client.Certificate` of the relay """ NAME = 'CERTS' VALUE = 129 IS_FIXED_SIZE = False def __init__(self, certs, unused = b''): super(CertsCell, self).__init__(unused) self.certificates = certs def pack(self, link_protocol): return CertsCell._pack(link_protocol, Size.CHAR.pack(len(self.certificates)) + b''.join([cert.pack() for cert in self.certificates]), self.unused) @classmethod def _unpack(cls, content, circ_id, link_protocol): cert_count, content = Size.CHAR.pop(content) certs = [] for i in range(cert_count): if not content: raise ValueError('CERTS cell indicates it should have %i certificates, but only contained %i' % (cert_count, len(certs))) cert, content = Certificate.pop(content) certs.append(cert) return CertsCell(certs, unused = content) def __hash__(self): return stem.util._hash_attr(self, 'certificates', cache = True) class AuthChallengeCell(Cell): """ First step of the authentication handshake. :var bytes challenge: random bytes for us to sign to authenticate :var list methods: authentication methods supported by the relay we're communicating with """ NAME = 'AUTH_CHALLENGE' VALUE = 130 IS_FIXED_SIZE = False def __init__(self, methods, challenge = None, unused = b''): if not challenge: challenge = os.urandom(AUTH_CHALLENGE_SIZE) elif len(challenge) != AUTH_CHALLENGE_SIZE: raise ValueError('AUTH_CHALLENGE must be %i bytes, but was %i' % (AUTH_CHALLENGE_SIZE, len(challenge))) super(AuthChallengeCell, self).__init__(unused) self.challenge = challenge self.methods = methods def pack(self, link_protocol): payload = bytearray() payload += self.challenge payload += Size.SHORT.pack(len(self.methods)) for method in self.methods: payload += Size.SHORT.pack(method) return AuthChallengeCell._pack(link_protocol, bytes(payload), self.unused) @classmethod def _unpack(cls, content, circ_id, link_protocol): min_size = AUTH_CHALLENGE_SIZE + Size.SHORT.size if len(content) < min_size: raise ValueError('AUTH_CHALLENGE payload should be at least %i bytes, but was %i' % (min_size, len(content))) challenge, content = split(content, AUTH_CHALLENGE_SIZE) method_count, content = Size.SHORT.pop(content) if len(content) < method_count * Size.SHORT.size: raise ValueError('AUTH_CHALLENGE should have %i methods, but only had %i bytes for it' % (method_count, len(content))) methods = [] for i in range(method_count): method, content = Size.SHORT.pop(content) methods.append(method) return AuthChallengeCell(methods, challenge, unused = content) def __hash__(self): return stem.util._hash_attr(self, 'challenge', 'methods', cache = True) class AuthenticateCell(Cell): NAME = 'AUTHENTICATE' VALUE = 131 IS_FIXED_SIZE = False def __init__(self): super(AuthenticateCell, self).__init__() # TODO: implement class AuthorizeCell(Cell): NAME = 'AUTHORIZE' VALUE = 132 IS_FIXED_SIZE = False def __init__(self): super(AuthorizeCell, self).__init__() # TODO: implement stem-1.7.1/stem/interpreter/0000775000175000017500000000000013411004021016507 5ustar atagaratagar00000000000000stem-1.7.1/stem/interpreter/help.py0000664000175000017500000000730313341474573020045 0ustar atagaratagar00000000000000# Copyright 2014-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Provides our /help responses. """ import stem.prereq from stem.interpreter import ( STANDARD_OUTPUT, BOLD_OUTPUT, ERROR_OUTPUT, msg, uses_settings, ) from stem.util.term import format if stem.prereq._is_lru_cache_available(): from functools import lru_cache else: from stem.util.lru_cache import lru_cache def response(controller, arg): """ Provides our /help response. :param stem.control.Controller controller: tor control connection :param str arg: controller or interpreter command to provide help output for :returns: **str** with our help response """ # Normalizing inputs first so we can better cache responses. return _response(controller, _normalize(arg)) def _normalize(arg): arg = arg.upper() # If there's multiple arguments then just take the first. This is # particularly likely if they're trying to query a full command (for # instance "/help GETINFO version") arg = arg.split(' ')[0] # strip slash if someone enters an interpreter command (ex. "/help /help") if arg.startswith('/'): arg = arg[1:] return arg @lru_cache() @uses_settings def _response(controller, arg, config): if not arg: return _general_help() usage_info = config.get('help.usage', {}) if arg not in usage_info: return format("No help information available for '%s'..." % arg, *ERROR_OUTPUT) output = format(usage_info[arg] + '\n', *BOLD_OUTPUT) description = config.get('help.description.%s' % arg.lower(), '') for line in description.splitlines(): output += format(' ' + line, *STANDARD_OUTPUT) + '\n' output += '\n' if arg == 'GETINFO': results = controller.get_info('info/names', None) if results: for line in results.splitlines(): if ' -- ' in line: opt, summary = line.split(' -- ', 1) output += format('%-33s' % opt, *BOLD_OUTPUT) output += format(' - %s' % summary, *STANDARD_OUTPUT) + '\n' elif arg == 'GETCONF': results = controller.get_info('config/names', None) if results: options = [opt.split(' ', 1)[0] for opt in results.splitlines()] for i in range(0, len(options), 2): line = '' for entry in options[i:i + 2]: line += '%-42s' % entry output += format(line.rstrip(), *STANDARD_OUTPUT) + '\n' elif arg == 'SIGNAL': signal_options = config.get('help.signal.options', {}) for signal, summary in signal_options.items(): output += format('%-15s' % signal, *BOLD_OUTPUT) output += format(' - %s' % summary, *STANDARD_OUTPUT) + '\n' elif arg == 'SETEVENTS': results = controller.get_info('events/names', None) if results: entries = results.split() # displays four columns of 20 characters for i in range(0, len(entries), 4): line = '' for entry in entries[i:i + 4]: line += '%-20s' % entry output += format(line.rstrip(), *STANDARD_OUTPUT) + '\n' elif arg == 'USEFEATURE': results = controller.get_info('features/names', None) if results: output += format(results, *STANDARD_OUTPUT) + '\n' elif arg in ('LOADCONF', 'POSTDESCRIPTOR'): # gives a warning that this option isn't yet implemented output += format(msg('msg.multiline_unimplemented_notice'), *ERROR_OUTPUT) + '\n' return output.rstrip() def _general_help(): lines = [] for line in msg('help.general').splitlines(): div = line.find(' - ') if div != -1: cmd, description = line[:div], line[div:] lines.append(format(cmd, *BOLD_OUTPUT) + format(description, *STANDARD_OUTPUT)) else: lines.append(format(line, *BOLD_OUTPUT)) return '\n'.join(lines) stem-1.7.1/stem/interpreter/arguments.py0000664000175000017500000000536513341034346021116 0ustar atagaratagar00000000000000# Copyright 2015-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Commandline argument parsing for our interpreter prompt. """ import collections import getopt import os import stem.interpreter import stem.util.connection DEFAULT_ARGS = { 'control_address': '127.0.0.1', 'control_port': 'default', 'user_provided_port': False, 'control_socket': '/var/run/tor/control', 'user_provided_socket': False, 'tor_path': 'tor', 'run_cmd': None, 'run_path': None, 'disable_color': False, 'print_help': False, } OPT = 'i:s:h' OPT_EXPANDED = ['interface=', 'socket=', 'tor=', 'run=', 'no-color', 'help'] def parse(argv): """ Parses our arguments, providing a named tuple with their values. :param list argv: input arguments to be parsed :returns: a **named tuple** with our parsed arguments :raises: **ValueError** if we got an invalid argument """ args = dict(DEFAULT_ARGS) try: recognized_args, unrecognized_args = getopt.getopt(argv, OPT, OPT_EXPANDED) if unrecognized_args: error_msg = "aren't recognized arguments" if len(unrecognized_args) > 1 else "isn't a recognized argument" raise getopt.GetoptError("'%s' %s" % ("', '".join(unrecognized_args), error_msg)) except Exception as exc: raise ValueError('%s (for usage provide --help)' % exc) for opt, arg in recognized_args: if opt in ('-i', '--interface'): if ':' in arg: address, port = arg.rsplit(':', 1) else: address, port = None, arg if address is not None: if not stem.util.connection.is_valid_ipv4_address(address): raise ValueError("'%s' isn't a valid IPv4 address" % address) args['control_address'] = address if not stem.util.connection.is_valid_port(port): raise ValueError("'%s' isn't a valid port number" % port) args['control_port'] = int(port) args['user_provided_port'] = True elif opt in ('-s', '--socket'): args['control_socket'] = arg args['user_provided_socket'] = True elif opt in ('--tor'): args['tor_path'] = arg elif opt in ('--run'): if os.path.exists(arg): args['run_path'] = arg else: args['run_cmd'] = arg elif opt == '--no-color': args['disable_color'] = True elif opt in ('-h', '--help'): args['print_help'] = True # translates our args dict into a named tuple Args = collections.namedtuple('Args', args.keys()) return Args(**args) def get_help(): """ Provides our --help usage information. :returns: **str** with our usage information """ return stem.interpreter.msg( 'msg.help', address = DEFAULT_ARGS['control_address'], port = DEFAULT_ARGS['control_port'], socket = DEFAULT_ARGS['control_socket'], ) stem-1.7.1/stem/interpreter/commands.py0000664000175000017500000002754513341034346020716 0ustar atagaratagar00000000000000# Copyright 2014-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Handles making requests and formatting the responses. """ import code import contextlib import socket import sys import stem import stem.control import stem.descriptor.remote import stem.interpreter.help import stem.util.connection import stem.util.str_tools import stem.util.tor_tools from stem.interpreter import STANDARD_OUTPUT, BOLD_OUTPUT, ERROR_OUTPUT, uses_settings, msg from stem.util.term import format try: from cStringIO import StringIO except ImportError: from io import StringIO MAX_EVENTS = 100 def _get_fingerprint(arg, controller): """ Resolves user input into a relay fingerprint. This accepts... * Fingerprints * Nicknames * IPv4 addresses, either with or without an ORPort * Empty input, which is resolved to ourselves if we're a relay :param str arg: input to be resolved to a relay fingerprint :param stem.control.Controller controller: tor control connection :returns: **str** for the relay fingerprint :raises: **ValueError** if we're unable to resolve the input to a relay """ if not arg: try: return controller.get_info('fingerprint') except: raise ValueError("We aren't a relay, no information to provide") elif stem.util.tor_tools.is_valid_fingerprint(arg): return arg elif stem.util.tor_tools.is_valid_nickname(arg): try: return controller.get_network_status(arg).fingerprint except: raise ValueError("Unable to find a relay with the nickname of '%s'" % arg) elif ':' in arg or stem.util.connection.is_valid_ipv4_address(arg): if ':' in arg: address, port = arg.rsplit(':', 1) if not stem.util.connection.is_valid_ipv4_address(address): raise ValueError("'%s' isn't a valid IPv4 address" % address) elif port and not stem.util.connection.is_valid_port(port): raise ValueError("'%s' isn't a valid port" % port) port = int(port) else: address, port = arg, None matches = {} for desc in controller.get_network_statuses(): if desc.address == address: if not port or desc.or_port == port: matches[desc.or_port] = desc.fingerprint if len(matches) == 0: raise ValueError('No relays found at %s' % arg) elif len(matches) == 1: return list(matches.values())[0] else: response = "There's multiple relays at %s, include a port to specify which.\n\n" % arg for i, or_port in enumerate(matches): response += ' %i. %s:%s, fingerprint: %s\n' % (i + 1, address, or_port, matches[or_port]) raise ValueError(response) else: raise ValueError("'%s' isn't a fingerprint, nickname, or IP address" % arg) @contextlib.contextmanager def redirect(stdout, stderr): original = sys.stdout, sys.stderr sys.stdout, sys.stderr = stdout, stderr try: yield finally: sys.stdout, sys.stderr = original class ControlInterpreter(code.InteractiveConsole): """ Handles issuing requests and providing nicely formed responses, with support for special irc style subcommands. """ def __init__(self, controller): self._received_events = [] code.InteractiveConsole.__init__(self, { 'stem': stem, 'stem.control': stem.control, 'controller': controller, 'events': self.get_events, }) self._controller = controller self._run_python_commands = True # Indicates if we're processing a multiline command, such as conditional # block or loop. self.is_multiline_context = False # Intercept events our controller hears about at a pretty low level since # the user will likely be requesting them by direct 'SETEVENTS' calls. handle_event_real = self._controller._handle_event def handle_event_wrapper(event_message): handle_event_real(event_message) self._received_events.insert(0, event_message) if len(self._received_events) > MAX_EVENTS: self._received_events.pop() self._controller._handle_event = handle_event_wrapper def get_events(self, *event_types): events = list(self._received_events) event_types = list(map(str.upper, event_types)) # make filtering case insensitive if event_types: events = [e for e in events if e.type in event_types] return events def do_help(self, arg): """ Performs the '/help' operation, giving usage information for the given argument or a general summary if there wasn't one. """ return stem.interpreter.help.response(self._controller, arg) def do_events(self, arg): """ Performs the '/events' operation, dumping the events that we've received belonging to the given types. If no types are specified then this provides all buffered events. If the user runs '/events clear' then this clears the list of events we've received. """ event_types = arg.upper().split() if 'CLEAR' in event_types: del self._received_events[:] return format('cleared event backlog', *STANDARD_OUTPUT) return '\n'.join([format(str(e), *STANDARD_OUTPUT) for e in self.get_events(*event_types)]) def do_info(self, arg): """ Performs the '/info' operation, looking up a relay by fingerprint, IP address, or nickname and printing its descriptor and consensus entries in a pretty fashion. """ try: fingerprint = _get_fingerprint(arg, self._controller) except ValueError as exc: return format(str(exc), *ERROR_OUTPUT) ns_desc = self._controller.get_network_status(fingerprint, None) server_desc = self._controller.get_server_descriptor(fingerprint, None) extrainfo_desc = None micro_desc = self._controller.get_microdescriptor(fingerprint, None) # We'll mostly rely on the router status entry. Either the server # descriptor or microdescriptor will be missing, so we'll treat them as # being optional. if not ns_desc: return format('Unable to find consensus information for %s' % fingerprint, *ERROR_OUTPUT) # More likely than not we'll have the microdescriptor but not server and # extrainfo descriptors. If so then fetching them. downloader = stem.descriptor.remote.DescriptorDownloader(timeout = 5) server_desc_query = downloader.get_server_descriptors(fingerprint) extrainfo_desc_query = downloader.get_extrainfo_descriptors(fingerprint) for desc in server_desc_query: server_desc = desc for desc in extrainfo_desc_query: extrainfo_desc = desc address_extrainfo = [] try: address_extrainfo.append(socket.gethostbyaddr(ns_desc.address)[0]) except: pass try: address_extrainfo.append(self._controller.get_info('ip-to-country/%s' % ns_desc.address)) except: pass address_extrainfo_label = ' (%s)' % ', '.join(address_extrainfo) if address_extrainfo else '' if server_desc: exit_policy_label = str(server_desc.exit_policy) elif micro_desc: exit_policy_label = str(micro_desc.exit_policy) else: exit_policy_label = 'Unknown' lines = [ '%s (%s)' % (ns_desc.nickname, fingerprint), format('address: ', *BOLD_OUTPUT) + '%s:%s%s' % (ns_desc.address, ns_desc.or_port, address_extrainfo_label), ] if server_desc: lines.append(format('tor version: ', *BOLD_OUTPUT) + str(server_desc.tor_version)) lines.append(format('flags: ', *BOLD_OUTPUT) + ', '.join(ns_desc.flags)) lines.append(format('exit policy: ', *BOLD_OUTPUT) + exit_policy_label) if server_desc and server_desc.contact: contact = stem.util.str_tools._to_unicode(server_desc.contact) # clears up some highly common obscuring for alias in (' at ', ' AT '): contact = contact.replace(alias, '@') for alias in (' dot ', ' DOT '): contact = contact.replace(alias, '.') lines.append(format('contact: ', *BOLD_OUTPUT) + contact) descriptor_section = [ ('Server Descriptor:', server_desc), ('Extrainfo Descriptor:', extrainfo_desc), ('Microdescriptor:', micro_desc), ('Router Status Entry:', ns_desc), ] div = format('-' * 80, *STANDARD_OUTPUT) for label, desc in descriptor_section: if desc: lines += ['', div, format(label, *BOLD_OUTPUT), div, ''] lines += [format(l, *STANDARD_OUTPUT) for l in str(desc).splitlines()] return '\n'.join(lines) def do_python(self, arg): """ Performs the '/python' operation, toggling if we accept python commands or not. """ if not arg: status = 'enabled' if self._run_python_commands else 'disabled' return format('Python support is currently %s.' % status, *STANDARD_OUTPUT) elif arg.lower() == 'enable': self._run_python_commands = True elif arg.lower() == 'disable': self._run_python_commands = False else: return format("'%s' is not recognized. Please run either '/python enable' or '/python disable'." % arg, *ERROR_OUTPUT) if self._run_python_commands: response = "Python support enabled, we'll now run non-interpreter commands as python." else: response = "Python support disabled, we'll now pass along all commands to tor." return format(response, *STANDARD_OUTPUT) @uses_settings def run_command(self, command, config, print_response = False): """ Runs the given command. Requests starting with a '/' are special commands to the interpreter, and anything else is sent to the control port. :param stem.control.Controller controller: tor control connection :param str command: command to be processed :param bool print_response: prints the response to stdout if true :returns: **list** out output lines, each line being a list of (msg, format) tuples :raises: **stem.SocketClosed** if the control connection has been severed """ # Commands fall into three categories: # # * Interpreter commands. These start with a '/'. # # * Controller commands stem knows how to handle. We use our Controller's # methods for these to take advantage of caching and present nicer # output. # # * Other tor commands. We pass these directly on to the control port. cmd, arg = command.strip(), '' if ' ' in cmd: cmd, arg = cmd.split(' ', 1) output = '' if cmd.startswith('/'): cmd = cmd.lower() if cmd == '/quit': raise stem.SocketClosed() elif cmd == '/events': output = self.do_events(arg) elif cmd == '/info': output = self.do_info(arg) elif cmd == '/python': output = self.do_python(arg) elif cmd == '/help': output = self.do_help(arg) else: output = format("'%s' isn't a recognized command" % command, *ERROR_OUTPUT) else: cmd = cmd.upper() # makes commands uppercase to match the spec if cmd.replace('+', '') in ('LOADCONF', 'POSTDESCRIPTOR'): # provides a notice that multi-line controller input isn't yet implemented output = format(msg('msg.multiline_unimplemented_notice'), *ERROR_OUTPUT) elif cmd == 'QUIT': self._controller.msg(command) raise stem.SocketClosed() else: is_tor_command = cmd in config.get('help.usage', {}) and cmd.lower() != 'events' if self._run_python_commands and not is_tor_command: console_output = StringIO() with redirect(console_output, console_output): self.is_multiline_context = code.InteractiveConsole.push(self, command) output = console_output.getvalue().strip() else: try: output = format(self._controller.msg(command).raw_content().strip(), *STANDARD_OUTPUT) except stem.ControllerError as exc: if isinstance(exc, stem.SocketClosed): raise else: output = format(str(exc), *ERROR_OUTPUT) if output: output += '\n' # give ourselves an extra line before the next prompt if print_response: print(output) return output stem-1.7.1/stem/interpreter/__init__.py0000664000175000017500000001366113341474573020660 0ustar atagaratagar00000000000000# Copyright 2015-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Interactive interpreter for interacting with Tor directly. This adds usability features such as tab completion, history, and IRC-style functions (like /help). """ import os import sys import stem import stem.connection import stem.prereq import stem.process import stem.util.conf import stem.util.system import stem.util.term from stem.util.term import Attr, Color, format __all__ = [ 'arguments', 'autocomplete', 'commands', 'help', ] PROMPT = format('>>> ', Color.GREEN, Attr.BOLD, Attr.READLINE_ESCAPE) STANDARD_OUTPUT = (Color.BLUE, Attr.LINES) BOLD_OUTPUT = (Color.BLUE, Attr.BOLD, Attr.LINES) HEADER_OUTPUT = (Color.GREEN, Attr.LINES) HEADER_BOLD_OUTPUT = (Color.GREEN, Attr.BOLD, Attr.LINES) ERROR_OUTPUT = (Attr.BOLD, Color.RED, Attr.LINES) settings_path = os.path.join(os.path.dirname(__file__), 'settings.cfg') uses_settings = stem.util.conf.uses_settings('stem_interpreter', settings_path) @uses_settings def msg(message, config, **attr): return config.get(message).format(**attr) def main(): import readline import stem.interpreter.arguments import stem.interpreter.autocomplete import stem.interpreter.commands try: args = stem.interpreter.arguments.parse(sys.argv[1:]) except ValueError as exc: print(exc) sys.exit(1) if args.print_help: print(stem.interpreter.arguments.get_help()) sys.exit() if args.disable_color or not sys.stdout.isatty(): global PROMPT stem.util.term.DISABLE_COLOR_SUPPORT = True PROMPT = '>>> ' # If the user isn't connecting to something in particular then offer to start # tor if it isn't running. if not (args.user_provided_port or args.user_provided_socket): is_tor_running = stem.util.system.is_running('tor') or stem.util.system.is_running('tor.real') if not is_tor_running: if args.tor_path == 'tor' and not stem.util.system.is_available('tor'): print(format(msg('msg.tor_unavailable'), *ERROR_OUTPUT)) sys.exit(1) else: if not args.run_cmd and not args.run_path: print(format(msg('msg.starting_tor'), *HEADER_OUTPUT)) control_port = '9051' if args.control_port == 'default' else str(args.control_port) try: stem.process.launch_tor_with_config( config = { 'SocksPort': '0', 'ControlPort': control_port, 'CookieAuthentication': '1', 'ExitPolicy': 'reject *:*', }, tor_cmd = args.tor_path, completion_percent = 5, take_ownership = True, ) except OSError as exc: print(format(msg('msg.unable_to_start_tor', error = exc), *ERROR_OUTPUT)) sys.exit(1) control_port = (args.control_address, args.control_port) control_socket = args.control_socket # If the user explicitely specified an endpoint then just try to connect to # that. if args.user_provided_socket and not args.user_provided_port: control_port = None elif args.user_provided_port and not args.user_provided_socket: control_socket = None controller = stem.connection.connect( control_port = control_port, control_socket = control_socket, password_prompt = True, ) if controller is None: sys.exit(1) with controller: autocompleter = stem.interpreter.autocomplete.Autocompleter(controller) readline.parse_and_bind('tab: complete') readline.set_completer(autocompleter.complete) readline.set_completer_delims('\n') interpreter = stem.interpreter.commands.ControlInterpreter(controller) showed_close_confirmation = False if args.run_cmd: if args.run_cmd.upper().startswith('SETEVENTS '): # TODO: we can use a lambda here when dropping python 2.x support, but # until then print's status as a keyword prevents it from being used in # lambdas def handle_event(event_message): print(format(str(event_message), *STANDARD_OUTPUT)) controller._handle_event = handle_event if sys.stdout.isatty(): events = args.run_cmd.upper().split(' ', 1)[1] print(format('Listening to %s events. Press any key to quit.\n' % events, *HEADER_BOLD_OUTPUT)) controller.msg(args.run_cmd) try: raw_input() except (KeyboardInterrupt, stem.SocketClosed): pass else: interpreter.run_command(args.run_cmd, print_response = True) elif args.run_path: try: for line in open(args.run_path).readlines(): interpreter.run_command(line.strip(), print_response = True) except IOError as exc: print(format(msg('msg.unable_to_read_file', path = args.run_path, error = exc), *ERROR_OUTPUT)) sys.exit(1) else: for line in msg('msg.startup_banner').splitlines(): line_format = HEADER_BOLD_OUTPUT if line.startswith(' ') else HEADER_OUTPUT print(format(line, *line_format)) print('') while True: try: prompt = '... ' if interpreter.is_multiline_context else PROMPT user_input = input(prompt) if stem.prereq.is_python_3() else raw_input(prompt) interpreter.run_command(user_input, print_response = True) except stem.SocketClosed: if showed_close_confirmation: print(format('Unable to run tor commands. The control connection has been closed.', *ERROR_OUTPUT)) else: prompt = format("Tor's control port has closed. Do you want to continue this interpreter? (y/n) ", *HEADER_BOLD_OUTPUT) user_input = input(prompt) if stem.prereq.is_python_3() else raw_input(prompt) print('') # blank line if user_input.lower() in ('y', 'yes'): showed_close_confirmation = True else: break except (KeyboardInterrupt, EOFError, stem.SocketClosed): print('') # move cursor to the following line break stem-1.7.1/stem/interpreter/settings.cfg0000664000175000017500000003014113341034346021046 0ustar atagaratagar00000000000000################################################################################ # # Configuration data used by Stem's interpreter prompt. # ################################################################################ ################## # GENERAL MESSAGES # ################## msg.multiline_unimplemented_notice Multi-line control options like this are not yet implemented. msg.help |Interactive interpreter for Tor. This provides you with direct access |to Tor's control interface via either python or direct requests. | | -i, --interface [ADDRESS:]PORT change control interface from {address}:{port} | -s, --socket SOCKET_PATH attach using unix domain socket if present, | SOCKET_PATH defaults to: {socket} | --tor PATH tor binary if tor isn't already running | --run executes the given command or file of commands | --no-color disables colorized output | -h, --help presents this help | msg.startup_banner |Welcome to Stem's interpreter prompt. This provides you with direct access to |Tor's control interface. | |This acts like a standard python interpreter with a Tor connection available |via your 'controller' variable... | | >>> controller.get_info('version') | '0.2.5.1-alpha-dev (git-245ecfff36c0cecc)' | |You can also issue requests directly to Tor... | | >>> GETINFO version | 250-version=0.2.5.1-alpha-dev (git-245ecfff36c0cecc) | 250 OK | |For more information run '/help'. | msg.tor_unavailable Tor isn't running and the command currently isn't in your PATH. msg.unable_to_start_tor Unable to start tor: {error} msg.unable_to_read_file Unable to read {path}: {error} msg.starting_tor |Tor isn't running. Starting a temporary Tor instance for our interpreter to |interact with. This will have a minimal non-relaying configuration, and be |shut down when you're done. | |-------------------------------------------------------------------------------- | ################# # OUTPUT OF /HELP # ################# # Response for the '/help' command without any arguments. help.general |Interpreter commands include: | /help - provides information for interpreter and tor commands | /events - prints events that we've received | /info - general information for a relay | /python - enable or disable support for running python commands | /quit - shuts down the interpreter | |Tor commands include: | GETINFO - queries information from tor | GETCONF, SETCONF, RESETCONF - show or edit a configuration option | SIGNAL - issues control signal to the process (for resetting, stopping, etc) | SETEVENTS - configures the events tor will notify us of | | USEFEATURE - enables custom behavior for the controller | SAVECONF - writes tor's current configuration to our torrc | LOADCONF - loads the given input like it was part of our torrc | MAPADDRESS - replaces requests for one address with another | POSTDESCRIPTOR - adds a relay descriptor to our cache | EXTENDCIRCUIT - create or extend a tor circuit | SETCIRCUITPURPOSE - configures the purpose associated with a circuit | CLOSECIRCUIT - closes the given circuit | ATTACHSTREAM - associates an application's stream with a tor circuit | REDIRECTSTREAM - sets a stream's destination | CLOSESTREAM - closes the given stream | ADD_ONION - create a new hidden service | DEL_ONION - delete a hidden service that was created with ADD_ONION | HSFETCH - retrieve a hidden service descriptor, providing it in a HS_DESC_CONTENT event | HSPOST - uploads a hidden service descriptor | RESOLVE - issues an asynchronous dns or rdns request over tor | TAKEOWNERSHIP - instructs tor to quit when this control connection is closed | PROTOCOLINFO - queries version and controller authentication information | QUIT - disconnect the control connection | |For more information use '/help [OPTION]'. # Usage of tor and interpreter commands. help.usage HELP => /help [OPTION] help.usage EVENTS => /events [types] help.usage INFO => /info [relay fingerprint, nickname, or IP address] help.usage PYTHON => /python [enable,disable] help.usage QUIT => /quit help.usage GETINFO => GETINFO OPTION help.usage GETCONF => GETCONF OPTION help.usage SETCONF => SETCONF PARAM[=VALUE] help.usage RESETCONF => RESETCONF PARAM[=VALUE] help.usage SIGNAL => SIGNAL SIG help.usage SETEVENTS => SETEVENTS [EXTENDED] [EVENTS] help.usage USEFEATURE => USEFEATURE OPTION help.usage SAVECONF => SAVECONF help.usage LOADCONF => LOADCONF... help.usage MAPADDRESS => MAPADDRESS SOURCE_ADDR=DESTINATION_ADDR help.usage POSTDESCRIPTOR => POSTDESCRIPTOR [purpose=general/controller/bridge] [cache=yes/no]... help.usage EXTENDCIRCUIT => EXTENDCIRCUIT CircuitID [PATH] [purpose=general/controller] help.usage SETCIRCUITPURPOSE => SETCIRCUITPURPOSE CircuitID purpose=general/controller help.usage CLOSECIRCUIT => CLOSECIRCUIT CircuitID [IfUnused] help.usage ATTACHSTREAM => ATTACHSTREAM StreamID CircuitID [HOP=HopNum] help.usage REDIRECTSTREAM => REDIRECTSTREAM StreamID Address [Port] help.usage CLOSESTREAM => CLOSESTREAM StreamID Reason [Flag] help.usage ADD_ONION => KeyType:KeyBlob [Flags=Flag] (Port=Port [,Target])... help.usage DEL_ONION => ServiceID help.usage HSFETCH => HSFETCH (HSAddress/v2-DescId) [SERVER=Server]... help.usage HSPOST => [SERVER=Server] DESCRIPTOR help.usage RESOLVE => RESOLVE [mode=reverse] address help.usage TAKEOWNERSHIP => TAKEOWNERSHIP help.usage PROTOCOLINFO => PROTOCOLINFO [ProtocolVersion] # Longer description of what tor and interpreter commands do. help.description.help |Provides usage information for the given interpreter, tor command, or tor |configuration option. | |Example: | /help info # provides a description of the '/info' option | /help GETINFO # usage information for tor's GETINFO controller option help.description.events |Provides events that we've received belonging to the given event types. If |no types are specified then this provides all the messages that we've |received. | |You can also run '/events clear' to clear the backlog of events we've |received. help.description.info |Provides information for a relay that's currently in the consensus. If no |relay is specified then this provides information on ourselves. help.description.python |Enables or disables support for running python commands. This determines how |we treat commands this interpreter doesn't recognize... | |* If enabled then unrecognized commands are executed as python. |* If disabled then unrecognized commands are passed along to tor. help.description.quit |Terminates the interpreter. help.description.getinfo |Queries the tor process for information. Options are... | help.description.getconf |Provides the current value for a given configuration value. Options include... | help.description.setconf |Sets the given configuration parameters. Values can be quoted or non-quoted |strings, and reverts the option to 0 or NULL if not provided. | |Examples: | * Sets a contact address and resets our family to NULL | SETCONF MyFamily ContactInfo=foo@bar.com | | * Sets an exit policy that only includes port 80/443 | SETCONF ExitPolicy=\"accept *:80, accept *:443, reject *:*\"\ help.description.resetconf |Reverts the given configuration options to their default values. If a value |is provided then this behaves in the same way as SETCONF. | |Examples: | * Returns both of our accounting parameters to their defaults | RESETCONF AccountingMax AccountingStart | | * Uses the default exit policy and sets our nickname to be 'Goomba' | RESETCONF ExitPolicy Nickname=Goomba help.description.signal |Issues a signal that tells the tor process to reload its torrc, dump its |stats, halt, etc. help.description.setevents |Sets the events that we will receive. This turns off any events that aren't |listed so sending 'SETEVENTS' without any values will turn off all event reporting. | |For Tor versions between 0.1.1.9 and 0.2.2.1 adding 'EXTENDED' causes some |events to give us additional information. After version 0.2.2.1 this is |always on. | |Events include... | help.description.usefeature |Customizes the behavior of the control port. Options include... | help.description.saveconf |Writes Tor's current configuration to its torrc. help.description.loadconf |Reads the given text like it belonged to our torrc. | |Example: | +LOADCONF | # sets our exit policy to just accept ports 80 and 443 | ExitPolicy accept *:80 | ExitPolicy accept *:443 | ExitPolicy reject *:* | . help.description.mapaddress |Replaces future requests for one address with another. | |Example: | MAPADDRESS 0.0.0.0=torproject.org 1.2.3.4=tor.freehaven.net help.description.postdescriptor |Simulates getting a new relay descriptor. help.description.extendcircuit |Extends the given circuit or create a new one if the CircuitID is zero. The |PATH is a comma separated list of fingerprints. If it isn't set then this |uses Tor's normal path selection. help.description.setcircuitpurpose |Sets the purpose attribute for a circuit. help.description.closecircuit |Closes the given circuit. If "IfUnused" is included then this only closes |the circuit if it isn't currently being used. help.description.attachstream |Attaches a stream with the given built circuit (tor picks one on its own if |CircuitID is zero). If HopNum is given then this hop is used to exit the |circuit, otherwise the last relay is used. help.description.redirectstream |Sets the destination for a given stream. This can only be done after a |stream is created but before it's attached to a circuit. help.description.closestream |Closes the given stream, the reason being an integer matching a reason as |per section 6.3 of the tor-spec. help.description.add_onion |Creates a new hidden service. Unlike 'SETCONF HiddenServiceDir...' this |doesn't persist the service to disk. help.description.del_onion |Delete a hidden service that was created with ADD_ONION. help.description.hsfetch |Retrieves the descriptor for a hidden service. This is an asynchronous |request, with the descriptor provided by a HS_DESC_CONTENT event. help.description.hspost |Uploads a descriptor to a hidden service directory. help.description.resolve |Performs IPv4 DNS resolution over tor, doing a reverse lookup instead if |"mode=reverse" is included. This request is processed in the background and |results in a ADDRMAP event with the response. help.description.takeownership |Instructs Tor to gracefully shut down when this control connection is closed. help.description.protocolinfo |Provides bootstrapping information that a controller might need when first |starting, like Tor's version and controller authentication. This can be done |before authenticating to the control port. help.signal.options RELOAD / HUP => reload our torrc help.signal.options SHUTDOWN / INT => gracefully shut down, waiting 30 seconds if we're a relay help.signal.options DUMP / USR1 => logs information about open connections and circuits help.signal.options DEBUG / USR2 => makes us log at the DEBUG runlevel help.signal.options HALT / TERM => immediately shut down help.signal.options CLEARDNSCACHE => clears any cached DNS results help.signal.options NEWNYM => clears the DNS cache and uses new circuits for future connections ################ # TAB COMPLETION # ################ # Commands we'll autocomplete when the user hits tab. This is just the start of # our autocompletion list - more are determined dynamically by checking what # tor supports. autocomplete /help autocomplete /events autocomplete /info autocomplete /quit autocomplete SAVECONF autocomplete MAPADDRESS autocomplete EXTENDCIRCUIT autocomplete SETCIRCUITPURPOSE autocomplete SETROUTERPURPOSE autocomplete ATTACHSTREAM #autocomplete +POSTDESCRIPTOR # TODO: needs multi-line support autocomplete REDIRECTSTREAM autocomplete CLOSESTREAM autocomplete CLOSECIRCUIT autocomplete QUIT autocomplete RESOLVE autocomplete PROTOCOLINFO #autocomplete +LOADCONF # TODO: needs multi-line support autocomplete TAKEOWNERSHIP autocomplete AUTHCHALLENGE autocomplete DROPGUARDS autocomplete ADD_ONION NEW:BEST autocomplete ADD_ONION NEW:RSA1024 autocomplete ADD_ONION NEW:ED25519-V3 autocomplete ADD_ONION RSA1024: autocomplete ADD_ONION ED25519-V3: autocomplete DEL_ONION autocomplete HSFETCH autocomplete HSPOST stem-1.7.1/stem/interpreter/autocomplete.py0000664000175000017500000000574313341474573021624 0ustar atagaratagar00000000000000# Copyright 2014-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Tab completion for our interpreter prompt. """ import stem.prereq from stem.interpreter import uses_settings if stem.prereq._is_lru_cache_available(): from functools import lru_cache else: from stem.util.lru_cache import lru_cache @uses_settings def _get_commands(controller, config): """ Provides commands recognized by tor. """ commands = config.get('autocomplete', []) if controller is None: return commands # GETINFO commands. Lines are of the form '[option] -- [description]'. This # strips '*' from options that accept values. results = controller.get_info('info/names', None) if results: for line in results.splitlines(): option = line.split(' ', 1)[0].rstrip('*') commands.append('GETINFO %s' % option) else: commands.append('GETINFO ') # GETCONF, SETCONF, and RESETCONF commands. Lines are of the form # '[option] [type]'. results = controller.get_info('config/names', None) if results: for line in results.splitlines(): option = line.split(' ', 1)[0] commands.append('GETCONF %s' % option) commands.append('SETCONF %s' % option) commands.append('RESETCONF %s' % option) else: commands += ['GETCONF ', 'SETCONF ', 'RESETCONF '] # SETEVENT, USEFEATURE, and SIGNAL commands. For each of these the GETINFO # results are simply a space separated lists of the values they can have. options = ( ('SETEVENTS ', 'events/names'), ('USEFEATURE ', 'features/names'), ('SIGNAL ', 'signal/names'), ) for prefix, getinfo_cmd in options: results = controller.get_info(getinfo_cmd, None) if results: commands += [prefix + value for value in results.split()] else: commands.append(prefix) # Adds /help commands. usage_info = config.get('help.usage', {}) for cmd in usage_info.keys(): commands.append('/help ' + cmd) return commands class Autocompleter(object): def __init__(self, controller): self._commands = _get_commands(controller) @lru_cache() def matches(self, text): """ Provides autocompletion matches for the given text. :param str text: text to check for autocompletion matches with :returns: **list** with possible matches """ lowercase_text = text.lower() return [cmd for cmd in self._commands if cmd.lower().startswith(lowercase_text)] def complete(self, text, state): """ Provides case insensetive autocompletion options, acting as a functor for the readlines set_completer function. :param str text: text to check for autocompletion matches with :param int state: index of result to be provided, readline fetches matches until this function provides None :returns: **str** with the autocompletion match, **None** if eithe none exists or state is higher than our number of matches """ try: return self.matches(text)[state] except IndexError: return None stem-1.7.1/stem/cached_fallbacks.cfg0000664000175000017500000014336713341034346020073 0ustar atagaratagar00000000000000tor_commit a42e52dded44a2c58a7200511e27a5c0e01cd78b stem_commit 4d7cc882b5b8966f69232d8489bb5b07226abc81 header.timestamp 20180106205601 header.version 2.0.0 header.type fallback 001524DD403D729F08F7E5D77813EF12756CFA8D.address 185.13.39.197 001524DD403D729F08F7E5D77813EF12756CFA8D.or_port 443 001524DD403D729F08F7E5D77813EF12756CFA8D.dir_port 80 001524DD403D729F08F7E5D77813EF12756CFA8D.nickname Neldoreth 001524DD403D729F08F7E5D77813EF12756CFA8D.has_extrainfo false 0111BA9B604669E636FFD5B503F382A4B7AD6E80.address 176.10.104.240 0111BA9B604669E636FFD5B503F382A4B7AD6E80.or_port 443 0111BA9B604669E636FFD5B503F382A4B7AD6E80.dir_port 80 0111BA9B604669E636FFD5B503F382A4B7AD6E80.nickname DigiGesTor1e1 0111BA9B604669E636FFD5B503F382A4B7AD6E80.has_extrainfo false 025B66CEBC070FCB0519D206CF0CF4965C20C96E.address 185.100.85.61 025B66CEBC070FCB0519D206CF0CF4965C20C96E.or_port 443 025B66CEBC070FCB0519D206CF0CF4965C20C96E.dir_port 80 025B66CEBC070FCB0519D206CF0CF4965C20C96E.nickname nibbana 025B66CEBC070FCB0519D206CF0CF4965C20C96E.has_extrainfo false 0756B7CD4DFC8182BE23143FAC0642F515182CEB.address 5.9.110.236 0756B7CD4DFC8182BE23143FAC0642F515182CEB.or_port 9001 0756B7CD4DFC8182BE23143FAC0642F515182CEB.dir_port 9030 0756B7CD4DFC8182BE23143FAC0642F515182CEB.nickname rueckgrat 0756B7CD4DFC8182BE23143FAC0642F515182CEB.has_extrainfo true 0756B7CD4DFC8182BE23143FAC0642F515182CEB.orport6_address 2a01:4f8:162:51e2::2 0756B7CD4DFC8182BE23143FAC0642F515182CEB.orport6_port 9001 0B85617241252517E8ECF2CFC7F4C1A32DCD153F.address 163.172.149.155 0B85617241252517E8ECF2CFC7F4C1A32DCD153F.or_port 443 0B85617241252517E8ECF2CFC7F4C1A32DCD153F.dir_port 80 0B85617241252517E8ECF2CFC7F4C1A32DCD153F.nickname niij02 0B85617241252517E8ECF2CFC7F4C1A32DCD153F.has_extrainfo false 0BEA4A88D069753218EAAAD6D22EA87B9A1319D6.address 5.39.92.199 0BEA4A88D069753218EAAAD6D22EA87B9A1319D6.or_port 443 0BEA4A88D069753218EAAAD6D22EA87B9A1319D6.dir_port 80 0BEA4A88D069753218EAAAD6D22EA87B9A1319D6.nickname BaelorTornodePw 0BEA4A88D069753218EAAAD6D22EA87B9A1319D6.has_extrainfo false 0BEA4A88D069753218EAAAD6D22EA87B9A1319D6.orport6_address 2001:41d0:8:b1c7::1 0BEA4A88D069753218EAAAD6D22EA87B9A1319D6.orport6_port 443 0CF8F3E6590F45D50B70F2F7DA6605ECA6CD408F.address 163.172.25.118 0CF8F3E6590F45D50B70F2F7DA6605ECA6CD408F.or_port 22 0CF8F3E6590F45D50B70F2F7DA6605ECA6CD408F.dir_port 80 0CF8F3E6590F45D50B70F2F7DA6605ECA6CD408F.nickname torpidsFRonline4 0CF8F3E6590F45D50B70F2F7DA6605ECA6CD408F.has_extrainfo false 0D3EBA17E1C78F1E9900BABDB23861D46FCAF163.address 178.62.197.82 0D3EBA17E1C78F1E9900BABDB23861D46FCAF163.or_port 443 0D3EBA17E1C78F1E9900BABDB23861D46FCAF163.dir_port 80 0D3EBA17E1C78F1E9900BABDB23861D46FCAF163.nickname HY100 0D3EBA17E1C78F1E9900BABDB23861D46FCAF163.has_extrainfo false 0E8C0C8315B66DB5F703804B3889A1DD66C67CE0.address 185.100.86.100 0E8C0C8315B66DB5F703804B3889A1DD66C67CE0.or_port 443 0E8C0C8315B66DB5F703804B3889A1DD66C67CE0.dir_port 80 0E8C0C8315B66DB5F703804B3889A1DD66C67CE0.nickname saveyourprivacyex1 0E8C0C8315B66DB5F703804B3889A1DD66C67CE0.has_extrainfo false 11DF0017A43AF1F08825CD5D973297F81AB00FF3.address 37.120.174.249 11DF0017A43AF1F08825CD5D973297F81AB00FF3.or_port 443 11DF0017A43AF1F08825CD5D973297F81AB00FF3.dir_port 80 11DF0017A43AF1F08825CD5D973297F81AB00FF3.nickname gGDHjdcC6zAlM8k08lX 11DF0017A43AF1F08825CD5D973297F81AB00FF3.has_extrainfo false 11DF0017A43AF1F08825CD5D973297F81AB00FF3.orport6_address 2a03:4000:6:724c:df98:15f9:b34d:443 11DF0017A43AF1F08825CD5D973297F81AB00FF3.orport6_port 443 12AD30E5D25AA67F519780E2111E611A455FDC89.address 193.11.114.43 12AD30E5D25AA67F519780E2111E611A455FDC89.or_port 9001 12AD30E5D25AA67F519780E2111E611A455FDC89.dir_port 9030 12AD30E5D25AA67F519780E2111E611A455FDC89.nickname mdfnet1 12AD30E5D25AA67F519780E2111E611A455FDC89.has_extrainfo false 12AD30E5D25AA67F519780E2111E611A455FDC89.orport6_address 2001:6b0:30:1000::99 12AD30E5D25AA67F519780E2111E611A455FDC89.orport6_port 9050 12FD624EE73CEF37137C90D38B2406A66F68FAA2.address 37.157.195.87 12FD624EE73CEF37137C90D38B2406A66F68FAA2.or_port 443 12FD624EE73CEF37137C90D38B2406A66F68FAA2.dir_port 8030 12FD624EE73CEF37137C90D38B2406A66F68FAA2.nickname thanatosCZ 12FD624EE73CEF37137C90D38B2406A66F68FAA2.has_extrainfo false 136F9299A5009A4E0E96494E723BDB556FB0A26B.address 178.16.208.59 136F9299A5009A4E0E96494E723BDB556FB0A26B.or_port 443 136F9299A5009A4E0E96494E723BDB556FB0A26B.dir_port 80 136F9299A5009A4E0E96494E723BDB556FB0A26B.nickname bakunin2 136F9299A5009A4E0E96494E723BDB556FB0A26B.has_extrainfo false 136F9299A5009A4E0E96494E723BDB556FB0A26B.orport6_address 2a00:1c20:4089:1234:bff6:e1bb:1ce3:8dc6 136F9299A5009A4E0E96494E723BDB556FB0A26B.orport6_port 443 16102E458460349EE45C0901DAA6C30094A9BBEA.address 163.172.138.22 16102E458460349EE45C0901DAA6C30094A9BBEA.or_port 443 16102E458460349EE45C0901DAA6C30094A9BBEA.dir_port 80 16102E458460349EE45C0901DAA6C30094A9BBEA.nickname mkultra 16102E458460349EE45C0901DAA6C30094A9BBEA.has_extrainfo false 16102E458460349EE45C0901DAA6C30094A9BBEA.orport6_address 2001:bc8:4400:2100::1:3 16102E458460349EE45C0901DAA6C30094A9BBEA.orport6_port 443 175921396C7C426309AB03775A9930B6F611F794.address 178.62.60.37 175921396C7C426309AB03775A9930B6F611F794.or_port 443 175921396C7C426309AB03775A9930B6F611F794.dir_port 80 175921396C7C426309AB03775A9930B6F611F794.nickname lovejoy 175921396C7C426309AB03775A9930B6F611F794.has_extrainfo false 185663B7C12777F052B2C2D23D7A239D8DA88A0F.address 171.25.193.25 185663B7C12777F052B2C2D23D7A239D8DA88A0F.or_port 443 185663B7C12777F052B2C2D23D7A239D8DA88A0F.dir_port 80 185663B7C12777F052B2C2D23D7A239D8DA88A0F.nickname DFRI5 185663B7C12777F052B2C2D23D7A239D8DA88A0F.has_extrainfo false 185663B7C12777F052B2C2D23D7A239D8DA88A0F.orport6_address 2001:67c:289c::25 185663B7C12777F052B2C2D23D7A239D8DA88A0F.orport6_port 443 1938EBACBB1A7BFA888D9623C90061130E63BB3F.address 149.56.141.138 1938EBACBB1A7BFA888D9623C90061130E63BB3F.or_port 9001 1938EBACBB1A7BFA888D9623C90061130E63BB3F.dir_port 9030 1938EBACBB1A7BFA888D9623C90061130E63BB3F.nickname Aerodynamik04 1938EBACBB1A7BFA888D9623C90061130E63BB3F.has_extrainfo false 1AE039EE0B11DB79E4B4B29CBA9F752864A0259E.address 81.7.14.253 1AE039EE0B11DB79E4B4B29CBA9F752864A0259E.or_port 443 1AE039EE0B11DB79E4B4B29CBA9F752864A0259E.dir_port 9001 1AE039EE0B11DB79E4B4B29CBA9F752864A0259E.nickname Ichotolot60 1AE039EE0B11DB79E4B4B29CBA9F752864A0259E.has_extrainfo false 1C90D3AEADFF3BCD079810632C8B85637924A58E.address 163.172.53.84 1C90D3AEADFF3BCD079810632C8B85637924A58E.or_port 21 1C90D3AEADFF3BCD079810632C8B85637924A58E.dir_port 143 1C90D3AEADFF3BCD079810632C8B85637924A58E.nickname Multivac 1C90D3AEADFF3BCD079810632C8B85637924A58E.has_extrainfo false 1C90D3AEADFF3BCD079810632C8B85637924A58E.orport6_address 2001:bc8:24f8:: 1C90D3AEADFF3BCD079810632C8B85637924A58E.orport6_port 21 1DBAED235E3957DE1ABD25B4206BE71406FB61F8.address 46.101.151.222 1DBAED235E3957DE1ABD25B4206BE71406FB61F8.or_port 443 1DBAED235E3957DE1ABD25B4206BE71406FB61F8.dir_port 80 1DBAED235E3957DE1ABD25B4206BE71406FB61F8.nickname flanders 1DBAED235E3957DE1ABD25B4206BE71406FB61F8.has_extrainfo false 1ECD73B936CB6E6B3CD647CC204F108D9DF2C9F7.address 91.219.237.229 1ECD73B936CB6E6B3CD647CC204F108D9DF2C9F7.or_port 443 1ECD73B936CB6E6B3CD647CC204F108D9DF2C9F7.dir_port 80 1ECD73B936CB6E6B3CD647CC204F108D9DF2C9F7.nickname JakeDidNothingWrong 1ECD73B936CB6E6B3CD647CC204F108D9DF2C9F7.has_extrainfo false 1F6ABD086F40B890A33C93CC4606EE68B31C9556.address 199.184.246.250 1F6ABD086F40B890A33C93CC4606EE68B31C9556.or_port 443 1F6ABD086F40B890A33C93CC4606EE68B31C9556.dir_port 80 1F6ABD086F40B890A33C93CC4606EE68B31C9556.nickname dao 1F6ABD086F40B890A33C93CC4606EE68B31C9556.has_extrainfo false 1F6ABD086F40B890A33C93CC4606EE68B31C9556.orport6_address 2620:124:1009:1::171 1F6ABD086F40B890A33C93CC4606EE68B31C9556.orport6_port 443 1FA8F638298645BE58AC905276680889CB795A94.address 185.129.249.124 1FA8F638298645BE58AC905276680889CB795A94.or_port 9001 1FA8F638298645BE58AC905276680889CB795A94.dir_port 9030 1FA8F638298645BE58AC905276680889CB795A94.nickname treadstone 1FA8F638298645BE58AC905276680889CB795A94.has_extrainfo false 20462CBA5DA4C2D963567D17D0B7249718114A68.address 212.47.229.2 20462CBA5DA4C2D963567D17D0B7249718114A68.or_port 9001 20462CBA5DA4C2D963567D17D0B7249718114A68.dir_port 9030 20462CBA5DA4C2D963567D17D0B7249718114A68.nickname scaletor 20462CBA5DA4C2D963567D17D0B7249718114A68.has_extrainfo false 20462CBA5DA4C2D963567D17D0B7249718114A68.orport6_address 2001:bc8:4400:2100::f03 20462CBA5DA4C2D963567D17D0B7249718114A68.orport6_port 9001 204DFD2A2C6A0DC1FA0EACB495218E0B661704FD.address 77.247.181.164 204DFD2A2C6A0DC1FA0EACB495218E0B661704FD.or_port 443 204DFD2A2C6A0DC1FA0EACB495218E0B661704FD.dir_port 80 204DFD2A2C6A0DC1FA0EACB495218E0B661704FD.nickname HaveHeart 204DFD2A2C6A0DC1FA0EACB495218E0B661704FD.has_extrainfo false 230A8B2A8BA861210D9B4BA97745AEC217A94207.address 163.172.176.167 230A8B2A8BA861210D9B4BA97745AEC217A94207.or_port 443 230A8B2A8BA861210D9B4BA97745AEC217A94207.dir_port 80 230A8B2A8BA861210D9B4BA97745AEC217A94207.nickname niij01 230A8B2A8BA861210D9B4BA97745AEC217A94207.has_extrainfo false 231C2B9C8C31C295C472D031E06964834B745996.address 37.200.98.5 231C2B9C8C31C295C472D031E06964834B745996.or_port 443 231C2B9C8C31C295C472D031E06964834B745996.dir_port 80 231C2B9C8C31C295C472D031E06964834B745996.nickname torpidsDEdomainf 231C2B9C8C31C295C472D031E06964834B745996.has_extrainfo false 231C2B9C8C31C295C472D031E06964834B745996.orport6_address 2a00:1158:3::11a 231C2B9C8C31C295C472D031E06964834B745996.orport6_port 993 2BA2C8E96B2590E1072AECE2BDB5C48921BF8510.address 138.201.250.33 2BA2C8E96B2590E1072AECE2BDB5C48921BF8510.or_port 9011 2BA2C8E96B2590E1072AECE2BDB5C48921BF8510.dir_port 9012 2BA2C8E96B2590E1072AECE2BDB5C48921BF8510.nickname storm 2BA2C8E96B2590E1072AECE2BDB5C48921BF8510.has_extrainfo false 2CDCFED0142B28B002E89D305CBA2E26063FADE2.address 178.16.208.56 2CDCFED0142B28B002E89D305CBA2E26063FADE2.or_port 443 2CDCFED0142B28B002E89D305CBA2E26063FADE2.dir_port 80 2CDCFED0142B28B002E89D305CBA2E26063FADE2.nickname jaures 2CDCFED0142B28B002E89D305CBA2E26063FADE2.has_extrainfo false 2CDCFED0142B28B002E89D305CBA2E26063FADE2.orport6_address 2a00:1c20:4089:1234:cd49:b58a:9ebe:67ec 2CDCFED0142B28B002E89D305CBA2E26063FADE2.orport6_port 443 2F0F32AB1E5B943CA7D062C03F18960C86E70D94.address 97.74.237.196 2F0F32AB1E5B943CA7D062C03F18960C86E70D94.or_port 9001 2F0F32AB1E5B943CA7D062C03F18960C86E70D94.dir_port 9030 2F0F32AB1E5B943CA7D062C03F18960C86E70D94.nickname Minotaur 2F0F32AB1E5B943CA7D062C03F18960C86E70D94.has_extrainfo false 30C19B81981F450C402306E2E7CFB6C3F79CB6B2.address 64.113.32.29 30C19B81981F450C402306E2E7CFB6C3F79CB6B2.or_port 9001 30C19B81981F450C402306E2E7CFB6C3F79CB6B2.dir_port 9030 30C19B81981F450C402306E2E7CFB6C3F79CB6B2.nickname Libero 30C19B81981F450C402306E2E7CFB6C3F79CB6B2.has_extrainfo false 328E54981C6DDD7D89B89E418724A4A7881E3192.address 80.127.117.180 328E54981C6DDD7D89B89E418724A4A7881E3192.or_port 443 328E54981C6DDD7D89B89E418724A4A7881E3192.dir_port 80 328E54981C6DDD7D89B89E418724A4A7881E3192.nickname sjc01 328E54981C6DDD7D89B89E418724A4A7881E3192.has_extrainfo false 328E54981C6DDD7D89B89E418724A4A7881E3192.orport6_address 2001:985:e77:10::4 328E54981C6DDD7D89B89E418724A4A7881E3192.orport6_port 443 330CD3DB6AD266DC70CDB512B036957D03D9BC59.address 185.100.84.212 330CD3DB6AD266DC70CDB512B036957D03D9BC59.or_port 443 330CD3DB6AD266DC70CDB512B036957D03D9BC59.dir_port 80 330CD3DB6AD266DC70CDB512B036957D03D9BC59.nickname TeamTardis 330CD3DB6AD266DC70CDB512B036957D03D9BC59.has_extrainfo false 330CD3DB6AD266DC70CDB512B036957D03D9BC59.orport6_address 2a06:1700:0:7::1 330CD3DB6AD266DC70CDB512B036957D03D9BC59.orport6_port 443 33DA0CAB7C27812EFF2E22C9705630A54D101FEB.address 163.172.13.165 33DA0CAB7C27812EFF2E22C9705630A54D101FEB.or_port 9001 33DA0CAB7C27812EFF2E22C9705630A54D101FEB.dir_port 9030 33DA0CAB7C27812EFF2E22C9705630A54D101FEB.nickname mullbinde9 33DA0CAB7C27812EFF2E22C9705630A54D101FEB.has_extrainfo false 33DA0CAB7C27812EFF2E22C9705630A54D101FEB.orport6_address 2001:bc8:38cb:201::8 33DA0CAB7C27812EFF2E22C9705630A54D101FEB.orport6_port 9001 3711E80B5B04494C971FB0459D4209AB7F2EA799.address 91.121.23.100 3711E80B5B04494C971FB0459D4209AB7F2EA799.or_port 9001 3711E80B5B04494C971FB0459D4209AB7F2EA799.dir_port 9030 3711E80B5B04494C971FB0459D4209AB7F2EA799.nickname 0x3d002 3711E80B5B04494C971FB0459D4209AB7F2EA799.has_extrainfo false 379FB450010D17078B3766C2273303C358C3A442.address 176.126.252.12 379FB450010D17078B3766C2273303C358C3A442.or_port 8080 379FB450010D17078B3766C2273303C358C3A442.dir_port 21 379FB450010D17078B3766C2273303C358C3A442.nickname aurora 379FB450010D17078B3766C2273303C358C3A442.has_extrainfo true 379FB450010D17078B3766C2273303C358C3A442.orport6_address 2a02:59e0:0:7::12 379FB450010D17078B3766C2273303C358C3A442.orport6_port 81 387B065A38E4DAA16D9D41C2964ECBC4B31D30FF.address 62.210.92.11 387B065A38E4DAA16D9D41C2964ECBC4B31D30FF.or_port 9101 387B065A38E4DAA16D9D41C2964ECBC4B31D30FF.dir_port 9130 387B065A38E4DAA16D9D41C2964ECBC4B31D30FF.nickname redjohn1 387B065A38E4DAA16D9D41C2964ECBC4B31D30FF.has_extrainfo false 387B065A38E4DAA16D9D41C2964ECBC4B31D30FF.orport6_address 2001:bc8:338c::1 387B065A38E4DAA16D9D41C2964ECBC4B31D30FF.orport6_port 9101 39F096961ED2576975C866D450373A9913AFDC92.address 198.50.191.95 39F096961ED2576975C866D450373A9913AFDC92.or_port 443 39F096961ED2576975C866D450373A9913AFDC92.dir_port 80 39F096961ED2576975C866D450373A9913AFDC92.nickname thomas 39F096961ED2576975C866D450373A9913AFDC92.has_extrainfo false 3B33F6FCA645AD4E91428A3AF7DC736AD9FB727B.address 164.132.77.175 3B33F6FCA645AD4E91428A3AF7DC736AD9FB727B.or_port 9001 3B33F6FCA645AD4E91428A3AF7DC736AD9FB727B.dir_port 9030 3B33F6FCA645AD4E91428A3AF7DC736AD9FB727B.nickname rofltor1 3B33F6FCA645AD4E91428A3AF7DC736AD9FB727B.has_extrainfo false 3C79699D4FBC37DE1A212D5033B56DAE079AC0EF.address 212.83.154.33 3C79699D4FBC37DE1A212D5033B56DAE079AC0EF.or_port 443 3C79699D4FBC37DE1A212D5033B56DAE079AC0EF.dir_port 8888 3C79699D4FBC37DE1A212D5033B56DAE079AC0EF.nickname bauruine203 3C79699D4FBC37DE1A212D5033B56DAE079AC0EF.has_extrainfo false 3D7E274A87D9A89AF064C13D1EE4CA1F184F2600.address 176.10.107.180 3D7E274A87D9A89AF064C13D1EE4CA1F184F2600.or_port 9001 3D7E274A87D9A89AF064C13D1EE4CA1F184F2600.dir_port 9030 3D7E274A87D9A89AF064C13D1EE4CA1F184F2600.nickname schokomilch 3D7E274A87D9A89AF064C13D1EE4CA1F184F2600.has_extrainfo false 3E53D3979DB07EFD736661C934A1DED14127B684.address 217.79.179.177 3E53D3979DB07EFD736661C934A1DED14127B684.or_port 9001 3E53D3979DB07EFD736661C934A1DED14127B684.dir_port 9030 3E53D3979DB07EFD736661C934A1DED14127B684.nickname Unnamed 3E53D3979DB07EFD736661C934A1DED14127B684.has_extrainfo false 3E53D3979DB07EFD736661C934A1DED14127B684.orport6_address 2001:4ba0:fff9:131:6c4f::90d3 3E53D3979DB07EFD736661C934A1DED14127B684.orport6_port 9001 4061C553CA88021B8302F0814365070AAE617270.address 185.100.85.101 4061C553CA88021B8302F0814365070AAE617270.or_port 9001 4061C553CA88021B8302F0814365070AAE617270.dir_port 9030 4061C553CA88021B8302F0814365070AAE617270.nickname TorExitRomania 4061C553CA88021B8302F0814365070AAE617270.has_extrainfo false 40E7D6CE5085E4CDDA31D51A29D1457EB53F12AD.address 199.249.223.61 40E7D6CE5085E4CDDA31D51A29D1457EB53F12AD.or_port 443 40E7D6CE5085E4CDDA31D51A29D1457EB53F12AD.dir_port 80 40E7D6CE5085E4CDDA31D51A29D1457EB53F12AD.nickname Quintex12 40E7D6CE5085E4CDDA31D51A29D1457EB53F12AD.has_extrainfo false 41C59606AFE1D1AA6EC6EF6719690B856F0B6587.address 178.17.170.156 41C59606AFE1D1AA6EC6EF6719690B856F0B6587.or_port 9001 41C59606AFE1D1AA6EC6EF6719690B856F0B6587.dir_port 9030 41C59606AFE1D1AA6EC6EF6719690B856F0B6587.nickname TorExitMoldova2 41C59606AFE1D1AA6EC6EF6719690B856F0B6587.has_extrainfo false 439D0447772CB107B886F7782DBC201FA26B92D1.address 178.62.86.96 439D0447772CB107B886F7782DBC201FA26B92D1.or_port 9001 439D0447772CB107B886F7782DBC201FA26B92D1.dir_port 9030 439D0447772CB107B886F7782DBC201FA26B92D1.nickname pablobm001 439D0447772CB107B886F7782DBC201FA26B92D1.has_extrainfo false 439D0447772CB107B886F7782DBC201FA26B92D1.orport6_address 2a03:b0c0:1:d0::3cf:7001 439D0447772CB107B886F7782DBC201FA26B92D1.orport6_port 9050 4623A9EC53BFD83155929E56D6F7B55B5E718C24.address 163.172.157.213 4623A9EC53BFD83155929E56D6F7B55B5E718C24.or_port 443 4623A9EC53BFD83155929E56D6F7B55B5E718C24.dir_port 8080 4623A9EC53BFD83155929E56D6F7B55B5E718C24.nickname Cotopaxi 4623A9EC53BFD83155929E56D6F7B55B5E718C24.has_extrainfo false 46791D156C9B6C255C2665D4D8393EC7DBAA7798.address 31.31.78.49 46791D156C9B6C255C2665D4D8393EC7DBAA7798.or_port 443 46791D156C9B6C255C2665D4D8393EC7DBAA7798.dir_port 80 46791D156C9B6C255C2665D4D8393EC7DBAA7798.nickname KrigHaBandolo 46791D156C9B6C255C2665D4D8393EC7DBAA7798.has_extrainfo false 484A10BA2B8D48A5F0216674C8DD50EF27BC32F3.address 193.70.43.76 484A10BA2B8D48A5F0216674C8DD50EF27BC32F3.or_port 9001 484A10BA2B8D48A5F0216674C8DD50EF27BC32F3.dir_port 9030 484A10BA2B8D48A5F0216674C8DD50EF27BC32F3.nickname Aerodynamik03 484A10BA2B8D48A5F0216674C8DD50EF27BC32F3.has_extrainfo false 489D94333DF66D57FFE34D9D59CC2D97E2CB0053.address 37.187.102.186 489D94333DF66D57FFE34D9D59CC2D97E2CB0053.or_port 9001 489D94333DF66D57FFE34D9D59CC2D97E2CB0053.dir_port 9030 489D94333DF66D57FFE34D9D59CC2D97E2CB0053.nickname txtfileTorNode65536 489D94333DF66D57FFE34D9D59CC2D97E2CB0053.has_extrainfo false 489D94333DF66D57FFE34D9D59CC2D97E2CB0053.orport6_address 2001:41d0:a:26ba::1 489D94333DF66D57FFE34D9D59CC2D97E2CB0053.orport6_port 9001 4CC9CC9195EC38645B699A33307058624F660CCF.address 51.254.101.242 4CC9CC9195EC38645B699A33307058624F660CCF.or_port 9001 4CC9CC9195EC38645B699A33307058624F660CCF.dir_port 9002 4CC9CC9195EC38645B699A33307058624F660CCF.nickname devsum 4CC9CC9195EC38645B699A33307058624F660CCF.has_extrainfo false 4F0DB7E687FC7C0AE55C8F243DA8B0EB27FBF1F2.address 108.53.208.157 4F0DB7E687FC7C0AE55C8F243DA8B0EB27FBF1F2.or_port 443 4F0DB7E687FC7C0AE55C8F243DA8B0EB27FBF1F2.dir_port 80 4F0DB7E687FC7C0AE55C8F243DA8B0EB27FBF1F2.nickname Binnacle 4F0DB7E687FC7C0AE55C8F243DA8B0EB27FBF1F2.has_extrainfo true 50586E25BE067FD1F739998550EDDCB1A14CA5B2.address 212.51.134.123 50586E25BE067FD1F739998550EDDCB1A14CA5B2.or_port 9001 50586E25BE067FD1F739998550EDDCB1A14CA5B2.dir_port 9030 50586E25BE067FD1F739998550EDDCB1A14CA5B2.nickname Jans 50586E25BE067FD1F739998550EDDCB1A14CA5B2.has_extrainfo false 51E1CF613FD6F9F11FE24743C91D6F9981807D82.address 81.7.16.182 51E1CF613FD6F9F11FE24743C91D6F9981807D82.or_port 443 51E1CF613FD6F9F11FE24743C91D6F9981807D82.dir_port 80 51E1CF613FD6F9F11FE24743C91D6F9981807D82.nickname torpidsDEisppro3 51E1CF613FD6F9F11FE24743C91D6F9981807D82.has_extrainfo false 51E1CF613FD6F9F11FE24743C91D6F9981807D82.orport6_address 2a02:180:1:1::517:10b6 51E1CF613FD6F9F11FE24743C91D6F9981807D82.orport6_port 993 52BFADA8BEAA01BA46C8F767F83C18E2FE50C1B9.address 85.25.159.65 52BFADA8BEAA01BA46C8F767F83C18E2FE50C1B9.or_port 80 52BFADA8BEAA01BA46C8F767F83C18E2FE50C1B9.dir_port 995 52BFADA8BEAA01BA46C8F767F83C18E2FE50C1B9.nickname BeastieJoy63 52BFADA8BEAA01BA46C8F767F83C18E2FE50C1B9.has_extrainfo false 587E0A9552E4274B251F29B5B2673D38442EE4BF.address 95.130.12.119 587E0A9552E4274B251F29B5B2673D38442EE4BF.or_port 443 587E0A9552E4274B251F29B5B2673D38442EE4BF.dir_port 80 587E0A9552E4274B251F29B5B2673D38442EE4BF.nickname Nuath 587E0A9552E4274B251F29B5B2673D38442EE4BF.has_extrainfo false 58ED9C9C35E433EE58764D62892B4FFD518A3CD0.address 185.21.100.50 58ED9C9C35E433EE58764D62892B4FFD518A3CD0.or_port 9001 58ED9C9C35E433EE58764D62892B4FFD518A3CD0.dir_port 9030 58ED9C9C35E433EE58764D62892B4FFD518A3CD0.nickname SamAAdams2 58ED9C9C35E433EE58764D62892B4FFD518A3CD0.has_extrainfo false 58ED9C9C35E433EE58764D62892B4FFD518A3CD0.orport6_address 2a00:1158:2:cd00:0:74:6f:72 58ED9C9C35E433EE58764D62892B4FFD518A3CD0.orport6_port 443 5E56738E7F97AA81DEEF59AF28494293DFBFCCDF.address 172.98.193.43 5E56738E7F97AA81DEEF59AF28494293DFBFCCDF.or_port 443 5E56738E7F97AA81DEEF59AF28494293DFBFCCDF.dir_port 80 5E56738E7F97AA81DEEF59AF28494293DFBFCCDF.nickname Backplane 5E56738E7F97AA81DEEF59AF28494293DFBFCCDF.has_extrainfo false 5F4CD12099AF20FAF9ADFDCEC65316A376D0201C.address 199.249.223.74 5F4CD12099AF20FAF9ADFDCEC65316A376D0201C.or_port 443 5F4CD12099AF20FAF9ADFDCEC65316A376D0201C.dir_port 80 5F4CD12099AF20FAF9ADFDCEC65316A376D0201C.nickname QuintexAirVPN7 5F4CD12099AF20FAF9ADFDCEC65316A376D0201C.has_extrainfo false 616081EC829593AF4232550DE6FFAA1D75B37A90.address 95.128.43.164 616081EC829593AF4232550DE6FFAA1D75B37A90.or_port 443 616081EC829593AF4232550DE6FFAA1D75B37A90.dir_port 80 616081EC829593AF4232550DE6FFAA1D75B37A90.nickname AquaRayTerminus 616081EC829593AF4232550DE6FFAA1D75B37A90.has_extrainfo false 616081EC829593AF4232550DE6FFAA1D75B37A90.orport6_address 2a02:ec0:209:10::4 616081EC829593AF4232550DE6FFAA1D75B37A90.orport6_port 443 68F175CCABE727AA2D2309BCD8789499CEE36ED7.address 163.172.139.104 68F175CCABE727AA2D2309BCD8789499CEE36ED7.or_port 443 68F175CCABE727AA2D2309BCD8789499CEE36ED7.dir_port 8080 68F175CCABE727AA2D2309BCD8789499CEE36ED7.nickname Pichincha 68F175CCABE727AA2D2309BCD8789499CEE36ED7.has_extrainfo false 6A7551EEE18F78A9813096E82BF84F740D32B911.address 85.214.62.48 6A7551EEE18F78A9813096E82BF84F740D32B911.or_port 443 6A7551EEE18F78A9813096E82BF84F740D32B911.dir_port 80 6A7551EEE18F78A9813096E82BF84F740D32B911.nickname TorMachine 6A7551EEE18F78A9813096E82BF84F740D32B911.has_extrainfo false 6EF897645B79B6CB35E853B32506375014DE3621.address 80.127.137.19 6EF897645B79B6CB35E853B32506375014DE3621.or_port 443 6EF897645B79B6CB35E853B32506375014DE3621.dir_port 80 6EF897645B79B6CB35E853B32506375014DE3621.nickname d6relay 6EF897645B79B6CB35E853B32506375014DE3621.has_extrainfo false 6EF897645B79B6CB35E853B32506375014DE3621.orport6_address 2001:981:47c1:1::6 6EF897645B79B6CB35E853B32506375014DE3621.orport6_port 443 72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE.address 85.235.250.88 72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE.or_port 443 72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE.dir_port 80 72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE.nickname TykRelay01 72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE.has_extrainfo false 7600680249A22080ECC6173FBBF64D6FCF330A61.address 81.7.14.31 7600680249A22080ECC6173FBBF64D6FCF330A61.or_port 443 7600680249A22080ECC6173FBBF64D6FCF330A61.dir_port 9001 7600680249A22080ECC6173FBBF64D6FCF330A61.nickname Ichotolot62 7600680249A22080ECC6173FBBF64D6FCF330A61.has_extrainfo false 763C9556602BD6207771A7A3D958091D44C43228.address 134.119.36.135 763C9556602BD6207771A7A3D958091D44C43228.or_port 443 763C9556602BD6207771A7A3D958091D44C43228.dir_port 80 763C9556602BD6207771A7A3D958091D44C43228.nickname torpidsDEdomainf2 763C9556602BD6207771A7A3D958091D44C43228.has_extrainfo false 763C9556602BD6207771A7A3D958091D44C43228.orport6_address 2a00:1158:3::2a8 763C9556602BD6207771A7A3D958091D44C43228.orport6_port 993 774555642FDC1E1D4FDF2E0C31B7CA9501C5C9C7.address 188.166.133.133 774555642FDC1E1D4FDF2E0C31B7CA9501C5C9C7.or_port 9001 774555642FDC1E1D4FDF2E0C31B7CA9501C5C9C7.dir_port 9030 774555642FDC1E1D4FDF2E0C31B7CA9501C5C9C7.nickname dropsy 774555642FDC1E1D4FDF2E0C31B7CA9501C5C9C7.has_extrainfo false 774555642FDC1E1D4FDF2E0C31B7CA9501C5C9C7.orport6_address 2a03:b0c0:2:d0::26c0:1 774555642FDC1E1D4FDF2E0C31B7CA9501C5C9C7.orport6_port 9001 775B0FAFDE71AADC23FFC8782B7BEB1D5A92733E.address 5.196.23.64 775B0FAFDE71AADC23FFC8782B7BEB1D5A92733E.or_port 9001 775B0FAFDE71AADC23FFC8782B7BEB1D5A92733E.dir_port 9030 775B0FAFDE71AADC23FFC8782B7BEB1D5A92733E.nickname Aerodynamik01 775B0FAFDE71AADC23FFC8782B7BEB1D5A92733E.has_extrainfo false 789EA6C9AE9ADDD8760903171CFA9AC5741B0C70.address 81.30.158.213 789EA6C9AE9ADDD8760903171CFA9AC5741B0C70.or_port 9001 789EA6C9AE9ADDD8760903171CFA9AC5741B0C70.dir_port 9030 789EA6C9AE9ADDD8760903171CFA9AC5741B0C70.nickname dumpster 789EA6C9AE9ADDD8760903171CFA9AC5741B0C70.has_extrainfo false 789EA6C9AE9ADDD8760903171CFA9AC5741B0C70.orport6_address 2001:4ba0:cafe:e84::1 789EA6C9AE9ADDD8760903171CFA9AC5741B0C70.orport6_port 9001 78E2BE744A53631B4AAB781468E94C52AB73968B.address 104.200.20.46 78E2BE744A53631B4AAB781468E94C52AB73968B.or_port 9001 78E2BE744A53631B4AAB781468E94C52AB73968B.dir_port 80 78E2BE744A53631B4AAB781468E94C52AB73968B.nickname bynumlawtor 78E2BE744A53631B4AAB781468E94C52AB73968B.has_extrainfo false 79E169B25E4C7CE99584F6ED06F379478F23E2B8.address 62.210.129.246 79E169B25E4C7CE99584F6ED06F379478F23E2B8.or_port 443 79E169B25E4C7CE99584F6ED06F379478F23E2B8.dir_port 80 79E169B25E4C7CE99584F6ED06F379478F23E2B8.nickname MilesPrower 79E169B25E4C7CE99584F6ED06F379478F23E2B8.has_extrainfo false 7A32C9519D80CA458FC8B034A28F5F6815649A98.address 82.223.21.74 7A32C9519D80CA458FC8B034A28F5F6815649A98.or_port 9001 7A32C9519D80CA458FC8B034A28F5F6815649A98.dir_port 9030 7A32C9519D80CA458FC8B034A28F5F6815649A98.nickname silentrocket 7A32C9519D80CA458FC8B034A28F5F6815649A98.has_extrainfo false 7A32C9519D80CA458FC8B034A28F5F6815649A98.orport6_address 2001:470:53e0::cafe 7A32C9519D80CA458FC8B034A28F5F6815649A98.orport6_port 9050 7BB70F8585DFC27E75D692970C0EEB0F22983A63.address 51.254.136.195 7BB70F8585DFC27E75D692970C0EEB0F22983A63.or_port 443 7BB70F8585DFC27E75D692970C0EEB0F22983A63.dir_port 80 7BB70F8585DFC27E75D692970C0EEB0F22983A63.nickname torproxy02 7BB70F8585DFC27E75D692970C0EEB0F22983A63.has_extrainfo false 7BFB908A3AA5B491DA4CA72CCBEE0E1F2A939B55.address 77.247.181.162 7BFB908A3AA5B491DA4CA72CCBEE0E1F2A939B55.or_port 443 7BFB908A3AA5B491DA4CA72CCBEE0E1F2A939B55.dir_port 80 7BFB908A3AA5B491DA4CA72CCBEE0E1F2A939B55.nickname sofia 7BFB908A3AA5B491DA4CA72CCBEE0E1F2A939B55.has_extrainfo false 7D05A38E39FC5D29AFE6BE487B9B4DC9E635D09E.address 185.100.84.82 7D05A38E39FC5D29AFE6BE487B9B4DC9E635D09E.or_port 443 7D05A38E39FC5D29AFE6BE487B9B4DC9E635D09E.dir_port 80 7D05A38E39FC5D29AFE6BE487B9B4DC9E635D09E.nickname saveyourprivacyexit 7D05A38E39FC5D29AFE6BE487B9B4DC9E635D09E.has_extrainfo false 7FA8E7E44F1392A4E40FFC3B69DB3B00091B7FD3.address 199.249.223.69 7FA8E7E44F1392A4E40FFC3B69DB3B00091B7FD3.or_port 443 7FA8E7E44F1392A4E40FFC3B69DB3B00091B7FD3.dir_port 80 7FA8E7E44F1392A4E40FFC3B69DB3B00091B7FD3.nickname Quintex20 7FA8E7E44F1392A4E40FFC3B69DB3B00091B7FD3.has_extrainfo false 80AAF8D5956A43C197104CEF2550CD42D165C6FB.address 193.11.114.45 80AAF8D5956A43C197104CEF2550CD42D165C6FB.or_port 9002 80AAF8D5956A43C197104CEF2550CD42D165C6FB.dir_port 9031 80AAF8D5956A43C197104CEF2550CD42D165C6FB.nickname mdfnet2 80AAF8D5956A43C197104CEF2550CD42D165C6FB.has_extrainfo false 8456DFA94161CDD99E480C2A2992C366C6564410.address 62.210.254.132 8456DFA94161CDD99E480C2A2992C366C6564410.or_port 443 8456DFA94161CDD99E480C2A2992C366C6564410.dir_port 80 8456DFA94161CDD99E480C2A2992C366C6564410.nickname turingmachine 8456DFA94161CDD99E480C2A2992C366C6564410.has_extrainfo false 855BC2DABE24C861CD887DB9B2E950424B49FC34.address 85.230.184.93 855BC2DABE24C861CD887DB9B2E950424B49FC34.or_port 443 855BC2DABE24C861CD887DB9B2E950424B49FC34.dir_port 9030 855BC2DABE24C861CD887DB9B2E950424B49FC34.nickname Logforme 855BC2DABE24C861CD887DB9B2E950424B49FC34.has_extrainfo false 8567AD0A6369ED08527A8A8533A5162AC00F7678.address 72.52.75.27 8567AD0A6369ED08527A8A8533A5162AC00F7678.or_port 9001 8567AD0A6369ED08527A8A8533A5162AC00F7678.dir_port 9030 8567AD0A6369ED08527A8A8533A5162AC00F7678.nickname piecoopdotnet 8567AD0A6369ED08527A8A8533A5162AC00F7678.has_extrainfo false 86C281AD135058238D7A337D546C902BE8505DDE.address 185.96.88.29 86C281AD135058238D7A337D546C902BE8505DDE.or_port 443 86C281AD135058238D7A337D546C902BE8505DDE.dir_port 80 86C281AD135058238D7A337D546C902BE8505DDE.nickname TykRelay05 86C281AD135058238D7A337D546C902BE8505DDE.has_extrainfo false 88487BDD980BF6E72092EE690E8C51C0AA4A538C.address 176.10.104.243 88487BDD980BF6E72092EE690E8C51C0AA4A538C.or_port 443 88487BDD980BF6E72092EE690E8C51C0AA4A538C.dir_port 80 88487BDD980BF6E72092EE690E8C51C0AA4A538C.nickname DigiGesTor2e1 88487BDD980BF6E72092EE690E8C51C0AA4A538C.has_extrainfo false 8C00FA7369A7A308F6A137600F0FA07990D9D451.address 163.172.194.53 8C00FA7369A7A308F6A137600F0FA07990D9D451.or_port 9001 8C00FA7369A7A308F6A137600F0FA07990D9D451.dir_port 9030 8C00FA7369A7A308F6A137600F0FA07990D9D451.nickname GrmmlLitavis 8C00FA7369A7A308F6A137600F0FA07990D9D451.has_extrainfo false 8C00FA7369A7A308F6A137600F0FA07990D9D451.orport6_address 2001:bc8:225f:142:6c69:7461:7669:73 8C00FA7369A7A308F6A137600F0FA07990D9D451.orport6_port 9001 8D79F73DCD91FC4F5017422FAC70074D6DB8DD81.address 5.189.169.190 8D79F73DCD91FC4F5017422FAC70074D6DB8DD81.or_port 8080 8D79F73DCD91FC4F5017422FAC70074D6DB8DD81.dir_port 8030 8D79F73DCD91FC4F5017422FAC70074D6DB8DD81.nickname thanatosDE 8D79F73DCD91FC4F5017422FAC70074D6DB8DD81.has_extrainfo false 9007C1D8E4F03D506A4A011B907A9E8D04E3C605.address 151.80.42.103 9007C1D8E4F03D506A4A011B907A9E8D04E3C605.or_port 9001 9007C1D8E4F03D506A4A011B907A9E8D04E3C605.dir_port 9030 9007C1D8E4F03D506A4A011B907A9E8D04E3C605.nickname matlink 9007C1D8E4F03D506A4A011B907A9E8D04E3C605.has_extrainfo false 9007C1D8E4F03D506A4A011B907A9E8D04E3C605.orport6_address 2001:41d0:e:f67::114 9007C1D8E4F03D506A4A011B907A9E8D04E3C605.orport6_port 9001 91D23D8A539B83D2FB56AA67ECD4D75CC093AC55.address 37.187.20.59 91D23D8A539B83D2FB56AA67ECD4D75CC093AC55.or_port 443 91D23D8A539B83D2FB56AA67ECD4D75CC093AC55.dir_port 80 91D23D8A539B83D2FB56AA67ECD4D75CC093AC55.nickname torpidsFRovh 91D23D8A539B83D2FB56AA67ECD4D75CC093AC55.has_extrainfo false 91D23D8A539B83D2FB56AA67ECD4D75CC093AC55.orport6_address 2001:41d0:a:143b::1 91D23D8A539B83D2FB56AA67ECD4D75CC093AC55.orport6_port 993 9285B22F7953D7874604EEE2B470609AD81C74E9.address 62.138.7.171 9285B22F7953D7874604EEE2B470609AD81C74E9.or_port 8001 9285B22F7953D7874604EEE2B470609AD81C74E9.dir_port 8030 9285B22F7953D7874604EEE2B470609AD81C74E9.nickname 0x3d005 9285B22F7953D7874604EEE2B470609AD81C74E9.has_extrainfo false 92CFD9565B24646CAC2D172D3DB503D69E777B8A.address 178.16.208.57 92CFD9565B24646CAC2D172D3DB503D69E777B8A.or_port 443 92CFD9565B24646CAC2D172D3DB503D69E777B8A.dir_port 80 92CFD9565B24646CAC2D172D3DB503D69E777B8A.nickname bakunin 92CFD9565B24646CAC2D172D3DB503D69E777B8A.has_extrainfo false 92CFD9565B24646CAC2D172D3DB503D69E777B8A.orport6_address 2a00:1c20:4089:1234:7825:2c5d:1ecd:c66f 92CFD9565B24646CAC2D172D3DB503D69E777B8A.orport6_port 443 92ECC9E0E2AF81BB954719B189AC362E254AD4A5.address 91.219.237.244 92ECC9E0E2AF81BB954719B189AC362E254AD4A5.or_port 443 92ECC9E0E2AF81BB954719B189AC362E254AD4A5.dir_port 80 92ECC9E0E2AF81BB954719B189AC362E254AD4A5.nickname lewwerDuarUesSlaav 92ECC9E0E2AF81BB954719B189AC362E254AD4A5.has_extrainfo false 9772EFB535397C942C3AB8804FB35CFFAD012438.address 37.153.1.10 9772EFB535397C942C3AB8804FB35CFFAD012438.or_port 9001 9772EFB535397C942C3AB8804FB35CFFAD012438.dir_port 9030 9772EFB535397C942C3AB8804FB35CFFAD012438.nickname smallsweatnode 9772EFB535397C942C3AB8804FB35CFFAD012438.has_extrainfo false 998BF3ED7F70E33D1C307247B9626D9E7573C438.address 163.172.223.200 998BF3ED7F70E33D1C307247B9626D9E7573C438.or_port 443 998BF3ED7F70E33D1C307247B9626D9E7573C438.dir_port 80 998BF3ED7F70E33D1C307247B9626D9E7573C438.nickname Outfall2 998BF3ED7F70E33D1C307247B9626D9E7573C438.has_extrainfo false 9A0D54D3A6D2E0767596BF1515E6162A75B3293F.address 91.229.20.27 9A0D54D3A6D2E0767596BF1515E6162A75B3293F.or_port 9001 9A0D54D3A6D2E0767596BF1515E6162A75B3293F.dir_port 9030 9A0D54D3A6D2E0767596BF1515E6162A75B3293F.nickname gordonkeybag 9A0D54D3A6D2E0767596BF1515E6162A75B3293F.has_extrainfo false 9A68B85A02318F4E7E87F2828039FBD5D75B0142.address 66.111.2.20 9A68B85A02318F4E7E87F2828039FBD5D75B0142.or_port 9001 9A68B85A02318F4E7E87F2828039FBD5D75B0142.dir_port 9030 9A68B85A02318F4E7E87F2828039FBD5D75B0142.nickname NYCBUG0 9A68B85A02318F4E7E87F2828039FBD5D75B0142.has_extrainfo false 9B31F1F1C1554F9FFB3455911F82E818EF7C7883.address 185.100.86.128 9B31F1F1C1554F9FFB3455911F82E818EF7C7883.or_port 9001 9B31F1F1C1554F9FFB3455911F82E818EF7C7883.dir_port 9030 9B31F1F1C1554F9FFB3455911F82E818EF7C7883.nickname TorExitFinland 9B31F1F1C1554F9FFB3455911F82E818EF7C7883.has_extrainfo false 9EC5E097663862DF861A18C32B37C5F82284B27D.address 146.185.177.103 9EC5E097663862DF861A18C32B37C5F82284B27D.or_port 9030 9EC5E097663862DF861A18C32B37C5F82284B27D.dir_port 80 9EC5E097663862DF861A18C32B37C5F82284B27D.nickname Winter 9EC5E097663862DF861A18C32B37C5F82284B27D.has_extrainfo false 9F2856F6D2B89AD4EF6D5723FAB167DB5A53519A.address 199.249.223.64 9F2856F6D2B89AD4EF6D5723FAB167DB5A53519A.or_port 443 9F2856F6D2B89AD4EF6D5723FAB167DB5A53519A.dir_port 80 9F2856F6D2B89AD4EF6D5723FAB167DB5A53519A.nickname Quintex15 9F2856F6D2B89AD4EF6D5723FAB167DB5A53519A.has_extrainfo false 9F7D6E6420183C2B76D3CE99624EBC98A21A967E.address 46.28.110.244 9F7D6E6420183C2B76D3CE99624EBC98A21A967E.or_port 443 9F7D6E6420183C2B76D3CE99624EBC98A21A967E.dir_port 80 9F7D6E6420183C2B76D3CE99624EBC98A21A967E.nickname Nivrim 9F7D6E6420183C2B76D3CE99624EBC98A21A967E.has_extrainfo false 9FBEB75E8BC142565F12CBBE078D63310236A334.address 91.121.84.137 9FBEB75E8BC142565F12CBBE078D63310236A334.or_port 4052 9FBEB75E8BC142565F12CBBE078D63310236A334.dir_port 4952 9FBEB75E8BC142565F12CBBE078D63310236A334.nickname lindon 9FBEB75E8BC142565F12CBBE078D63310236A334.has_extrainfo false A0F06C2FADF88D3A39AA3072B406F09D7095AC9E.address 46.165.230.5 A0F06C2FADF88D3A39AA3072B406F09D7095AC9E.or_port 443 A0F06C2FADF88D3A39AA3072B406F09D7095AC9E.dir_port 80 A0F06C2FADF88D3A39AA3072B406F09D7095AC9E.nickname Dhalgren A0F06C2FADF88D3A39AA3072B406F09D7095AC9E.has_extrainfo true A10C4F666D27364036B562823E5830BC448E046A.address 171.25.193.77 A10C4F666D27364036B562823E5830BC448E046A.or_port 443 A10C4F666D27364036B562823E5830BC448E046A.dir_port 80 A10C4F666D27364036B562823E5830BC448E046A.nickname DFRI1 A10C4F666D27364036B562823E5830BC448E046A.has_extrainfo false A10C4F666D27364036B562823E5830BC448E046A.orport6_address 2001:67c:289c:3::77 A10C4F666D27364036B562823E5830BC448E046A.orport6_port 443 A2E6BB5C391CD46B38C55B4329C35304540771F1.address 81.7.3.67 A2E6BB5C391CD46B38C55B4329C35304540771F1.or_port 443 A2E6BB5C391CD46B38C55B4329C35304540771F1.dir_port 993 A2E6BB5C391CD46B38C55B4329C35304540771F1.nickname BeastieJoy62 A2E6BB5C391CD46B38C55B4329C35304540771F1.has_extrainfo false A478E421F83194C114F41E94F95999672AED51FE.address 171.25.193.78 A478E421F83194C114F41E94F95999672AED51FE.or_port 443 A478E421F83194C114F41E94F95999672AED51FE.dir_port 80 A478E421F83194C114F41E94F95999672AED51FE.nickname DFRI4 A478E421F83194C114F41E94F95999672AED51FE.has_extrainfo false A478E421F83194C114F41E94F95999672AED51FE.orport6_address 2001:67c:289c:3::78 A478E421F83194C114F41E94F95999672AED51FE.orport6_port 443 A4C98CEA3F34E05299417E9F885A642C88EF6029.address 178.16.208.58 A4C98CEA3F34E05299417E9F885A642C88EF6029.or_port 443 A4C98CEA3F34E05299417E9F885A642C88EF6029.dir_port 80 A4C98CEA3F34E05299417E9F885A642C88EF6029.nickname jaures2 A4C98CEA3F34E05299417E9F885A642C88EF6029.has_extrainfo false A4C98CEA3F34E05299417E9F885A642C88EF6029.orport6_address 2a00:1c20:4089:1234:cdae:1b3e:cc38:3d45 A4C98CEA3F34E05299417E9F885A642C88EF6029.orport6_port 443 A9406A006D6E7B5DA30F2C6D4E42A338B5E340B2.address 163.172.149.122 A9406A006D6E7B5DA30F2C6D4E42A338B5E340B2.or_port 443 A9406A006D6E7B5DA30F2C6D4E42A338B5E340B2.dir_port 80 A9406A006D6E7B5DA30F2C6D4E42A338B5E340B2.nickname niij03 A9406A006D6E7B5DA30F2C6D4E42A338B5E340B2.has_extrainfo false AC66FFA4AB35A59EBBF5BF4C70008BF24D8A7A5C.address 195.154.164.243 AC66FFA4AB35A59EBBF5BF4C70008BF24D8A7A5C.or_port 443 AC66FFA4AB35A59EBBF5BF4C70008BF24D8A7A5C.dir_port 80 AC66FFA4AB35A59EBBF5BF4C70008BF24D8A7A5C.nickname torpidsFRonline3 AC66FFA4AB35A59EBBF5BF4C70008BF24D8A7A5C.has_extrainfo false ACD889D86E02EDDAB1AFD81F598C0936238DC6D0.address 86.59.119.88 ACD889D86E02EDDAB1AFD81F598C0936238DC6D0.or_port 443 ACD889D86E02EDDAB1AFD81F598C0936238DC6D0.dir_port 80 ACD889D86E02EDDAB1AFD81F598C0936238DC6D0.nickname ph3x ACD889D86E02EDDAB1AFD81F598C0936238DC6D0.has_extrainfo false ACDD9E85A05B127BA010466C13C8C47212E8A38F.address 185.129.62.62 ACDD9E85A05B127BA010466C13C8C47212E8A38F.or_port 9001 ACDD9E85A05B127BA010466C13C8C47212E8A38F.dir_port 9030 ACDD9E85A05B127BA010466C13C8C47212E8A38F.nickname kramse ACDD9E85A05B127BA010466C13C8C47212E8A38F.has_extrainfo false ACDD9E85A05B127BA010466C13C8C47212E8A38F.orport6_address 2a06:d380:0:3700::62 ACDD9E85A05B127BA010466C13C8C47212E8A38F.orport6_port 9001 AD19490C7DBB26D3A68EFC824F67E69B0A96E601.address 188.40.128.246 AD19490C7DBB26D3A68EFC824F67E69B0A96E601.or_port 9001 AD19490C7DBB26D3A68EFC824F67E69B0A96E601.dir_port 9030 AD19490C7DBB26D3A68EFC824F67E69B0A96E601.nickname sputnik AD19490C7DBB26D3A68EFC824F67E69B0A96E601.has_extrainfo false AD19490C7DBB26D3A68EFC824F67E69B0A96E601.orport6_address 2a01:4f8:221:1ac1:dead:beef:7005:9001 AD19490C7DBB26D3A68EFC824F67E69B0A96E601.orport6_port 9001 B0279A521375F3CB2AE210BDBFC645FDD2E1973A.address 176.126.252.11 B0279A521375F3CB2AE210BDBFC645FDD2E1973A.or_port 9001 B0279A521375F3CB2AE210BDBFC645FDD2E1973A.dir_port 443 B0279A521375F3CB2AE210BDBFC645FDD2E1973A.nickname chulak B0279A521375F3CB2AE210BDBFC645FDD2E1973A.has_extrainfo true B0279A521375F3CB2AE210BDBFC645FDD2E1973A.orport6_address 2a02:59e0:0:7::11 B0279A521375F3CB2AE210BDBFC645FDD2E1973A.orport6_port 9003 B0553175AADB0501E5A61FC61CEA3970BE130FF2.address 5.9.147.226 B0553175AADB0501E5A61FC61CEA3970BE130FF2.or_port 9001 B0553175AADB0501E5A61FC61CEA3970BE130FF2.dir_port 9030 B0553175AADB0501E5A61FC61CEA3970BE130FF2.nickname zwiubel B0553175AADB0501E5A61FC61CEA3970BE130FF2.has_extrainfo false B0553175AADB0501E5A61FC61CEA3970BE130FF2.orport6_address 2a01:4f8:190:30e1::2 B0553175AADB0501E5A61FC61CEA3970BE130FF2.orport6_port 9001 B06F093A3D4DFAD3E923F4F28A74901BD4F74EB1.address 178.17.174.14 B06F093A3D4DFAD3E923F4F28A74901BD4F74EB1.or_port 9001 B06F093A3D4DFAD3E923F4F28A74901BD4F74EB1.dir_port 9030 B06F093A3D4DFAD3E923F4F28A74901BD4F74EB1.nickname TorExitMoldova B06F093A3D4DFAD3E923F4F28A74901BD4F74EB1.has_extrainfo false B0CD9F9B5B60651ADC5919C0F1EAA87DBA1D9249.address 199.249.223.40 B0CD9F9B5B60651ADC5919C0F1EAA87DBA1D9249.or_port 443 B0CD9F9B5B60651ADC5919C0F1EAA87DBA1D9249.dir_port 80 B0CD9F9B5B60651ADC5919C0F1EAA87DBA1D9249.nickname Quintex31 B0CD9F9B5B60651ADC5919C0F1EAA87DBA1D9249.has_extrainfo false B143D439B72D239A419F8DCE07B8A8EB1B486FA7.address 212.129.62.232 B143D439B72D239A419F8DCE07B8A8EB1B486FA7.or_port 443 B143D439B72D239A419F8DCE07B8A8EB1B486FA7.dir_port 80 B143D439B72D239A419F8DCE07B8A8EB1B486FA7.nickname wardsback B143D439B72D239A419F8DCE07B8A8EB1B486FA7.has_extrainfo false B291D30517D23299AD7CEE3E60DFE60D0E3A4664.address 136.243.214.137 B291D30517D23299AD7CEE3E60DFE60D0E3A4664.or_port 443 B291D30517D23299AD7CEE3E60DFE60D0E3A4664.dir_port 80 B291D30517D23299AD7CEE3E60DFE60D0E3A4664.nickname TorKIT B291D30517D23299AD7CEE3E60DFE60D0E3A4664.has_extrainfo false B4CAFD9CBFB34EC5DAAC146920DC7DFAFE91EA20.address 212.47.233.86 B4CAFD9CBFB34EC5DAAC146920DC7DFAFE91EA20.or_port 9001 B4CAFD9CBFB34EC5DAAC146920DC7DFAFE91EA20.dir_port 9030 B4CAFD9CBFB34EC5DAAC146920DC7DFAFE91EA20.nickname netimanmu B4CAFD9CBFB34EC5DAAC146920DC7DFAFE91EA20.has_extrainfo false B5212DB685A2A0FCFBAE425738E478D12361710D.address 93.115.97.242 B5212DB685A2A0FCFBAE425738E478D12361710D.or_port 9001 B5212DB685A2A0FCFBAE425738E478D12361710D.dir_port 9030 B5212DB685A2A0FCFBAE425738E478D12361710D.nickname firstor B5212DB685A2A0FCFBAE425738E478D12361710D.has_extrainfo false B6904ADD4C0D10CDA7179E051962350A69A63243.address 81.2.209.10 B6904ADD4C0D10CDA7179E051962350A69A63243.or_port 80 B6904ADD4C0D10CDA7179E051962350A69A63243.dir_port 443 B6904ADD4C0D10CDA7179E051962350A69A63243.nickname torzabehlice B6904ADD4C0D10CDA7179E051962350A69A63243.has_extrainfo false B6904ADD4C0D10CDA7179E051962350A69A63243.orport6_address 2001:15e8:201:1::d10a B6904ADD4C0D10CDA7179E051962350A69A63243.orport6_port 80 B83DC1558F0D34353BB992EF93AFEAFDB226A73E.address 193.11.114.46 B83DC1558F0D34353BB992EF93AFEAFDB226A73E.or_port 9003 B83DC1558F0D34353BB992EF93AFEAFDB226A73E.dir_port 9032 B83DC1558F0D34353BB992EF93AFEAFDB226A73E.nickname mdfnet3 B83DC1558F0D34353BB992EF93AFEAFDB226A73E.has_extrainfo false B86137AE9681701901C6720E55C16805B46BD8E3.address 81.7.11.186 B86137AE9681701901C6720E55C16805B46BD8E3.or_port 443 B86137AE9681701901C6720E55C16805B46BD8E3.dir_port 1080 B86137AE9681701901C6720E55C16805B46BD8E3.nickname BeastieJoy60 B86137AE9681701901C6720E55C16805B46BD8E3.has_extrainfo false BC630CBBB518BE7E9F4E09712AB0269E9DC7D626.address 197.231.221.211 BC630CBBB518BE7E9F4E09712AB0269E9DC7D626.or_port 443 BC630CBBB518BE7E9F4E09712AB0269E9DC7D626.dir_port 9030 BC630CBBB518BE7E9F4E09712AB0269E9DC7D626.nickname IPredator BC630CBBB518BE7E9F4E09712AB0269E9DC7D626.has_extrainfo false BCEDF6C193AA687AE471B8A22EBF6BC57C2D285E.address 198.96.155.3 BCEDF6C193AA687AE471B8A22EBF6BC57C2D285E.or_port 5001 BCEDF6C193AA687AE471B8A22EBF6BC57C2D285E.dir_port 8080 BCEDF6C193AA687AE471B8A22EBF6BC57C2D285E.nickname gurgle BCEDF6C193AA687AE471B8A22EBF6BC57C2D285E.has_extrainfo false BCEF908195805E03E92CCFE669C48738E556B9C5.address 128.199.55.207 BCEF908195805E03E92CCFE669C48738E556B9C5.or_port 9001 BCEF908195805E03E92CCFE669C48738E556B9C5.dir_port 9030 BCEF908195805E03E92CCFE669C48738E556B9C5.nickname EldritchReaper BCEF908195805E03E92CCFE669C48738E556B9C5.has_extrainfo false BCEF908195805E03E92CCFE669C48738E556B9C5.orport6_address 2a03:b0c0:2:d0::158:3001 BCEF908195805E03E92CCFE669C48738E556B9C5.orport6_port 9001 BD552C165E2ED2887D3F1CCE9CFF155DDA2D86E6.address 213.141.138.174 BD552C165E2ED2887D3F1CCE9CFF155DDA2D86E6.or_port 9001 BD552C165E2ED2887D3F1CCE9CFF155DDA2D86E6.dir_port 9030 BD552C165E2ED2887D3F1CCE9CFF155DDA2D86E6.nickname Schakalium BD552C165E2ED2887D3F1CCE9CFF155DDA2D86E6.has_extrainfo false BF735F669481EE1CCC348F0731551C933D1E2278.address 104.192.5.248 BF735F669481EE1CCC348F0731551C933D1E2278.or_port 9001 BF735F669481EE1CCC348F0731551C933D1E2278.dir_port 9030 BF735F669481EE1CCC348F0731551C933D1E2278.nickname Freeway11 BF735F669481EE1CCC348F0731551C933D1E2278.has_extrainfo false C2AAB088555850FC434E68943F551072042B85F1.address 31.185.104.21 C2AAB088555850FC434E68943F551072042B85F1.or_port 443 C2AAB088555850FC434E68943F551072042B85F1.dir_port 80 C2AAB088555850FC434E68943F551072042B85F1.nickname Digitalcourage3ip3 C2AAB088555850FC434E68943F551072042B85F1.has_extrainfo false C37BC191AC389179674578C3E6944E925FE186C2.address 213.239.217.18 C37BC191AC389179674578C3E6944E925FE186C2.or_port 1337 C37BC191AC389179674578C3E6944E925FE186C2.dir_port 1338 C37BC191AC389179674578C3E6944E925FE186C2.nickname xzdsb C37BC191AC389179674578C3E6944E925FE186C2.has_extrainfo false C37BC191AC389179674578C3E6944E925FE186C2.orport6_address 2a01:4f8:a0:746a:101:1:1:1 C37BC191AC389179674578C3E6944E925FE186C2.orport6_port 1337 C414F28FD2BEC1553024299B31D4E726BEB8E788.address 188.138.112.60 C414F28FD2BEC1553024299B31D4E726BEB8E788.or_port 1521 C414F28FD2BEC1553024299B31D4E726BEB8E788.dir_port 1433 C414F28FD2BEC1553024299B31D4E726BEB8E788.nickname zebra620 C414F28FD2BEC1553024299B31D4E726BEB8E788.has_extrainfo false C5A53BCC174EF8FD0DCB223E4AA929FA557DEDB2.address 199.249.223.66 C5A53BCC174EF8FD0DCB223E4AA929FA557DEDB2.or_port 443 C5A53BCC174EF8FD0DCB223E4AA929FA557DEDB2.dir_port 80 C5A53BCC174EF8FD0DCB223E4AA929FA557DEDB2.nickname Quintex17 C5A53BCC174EF8FD0DCB223E4AA929FA557DEDB2.has_extrainfo false CE47F0356D86CF0A1A2008D97623216D560FB0A8.address 85.25.213.211 CE47F0356D86CF0A1A2008D97623216D560FB0A8.or_port 80 CE47F0356D86CF0A1A2008D97623216D560FB0A8.dir_port 465 CE47F0356D86CF0A1A2008D97623216D560FB0A8.nickname BeastieJoy61 CE47F0356D86CF0A1A2008D97623216D560FB0A8.has_extrainfo false CED527EAC230E7B56E5B363F839671829C3BA01B.address 51.15.13.245 CED527EAC230E7B56E5B363F839671829C3BA01B.or_port 9001 CED527EAC230E7B56E5B363F839671829C3BA01B.dir_port 9030 CED527EAC230E7B56E5B363F839671829C3BA01B.nickname 0x3d006 CED527EAC230E7B56E5B363F839671829C3BA01B.has_extrainfo false D30E9D4D639068611D6D96861C95C2099140B805.address 46.38.237.221 D30E9D4D639068611D6D96861C95C2099140B805.or_port 9001 D30E9D4D639068611D6D96861C95C2099140B805.dir_port 9030 D30E9D4D639068611D6D96861C95C2099140B805.nickname mine D30E9D4D639068611D6D96861C95C2099140B805.has_extrainfo false D3E5EDDBE5159388704D6785BE51930AAFACEC6F.address 31.171.155.108 D3E5EDDBE5159388704D6785BE51930AAFACEC6F.or_port 9001 D3E5EDDBE5159388704D6785BE51930AAFACEC6F.dir_port 9030 D3E5EDDBE5159388704D6785BE51930AAFACEC6F.nickname TorNodeAlbania D3E5EDDBE5159388704D6785BE51930AAFACEC6F.has_extrainfo false D64366987CB39F61AD21DBCF8142FA0577B92811.address 37.221.162.226 D64366987CB39F61AD21DBCF8142FA0577B92811.or_port 9001 D64366987CB39F61AD21DBCF8142FA0577B92811.dir_port 9030 D64366987CB39F61AD21DBCF8142FA0577B92811.nickname kasperskytor01 D64366987CB39F61AD21DBCF8142FA0577B92811.has_extrainfo false D760C5B436E42F93D77EF2D969157EEA14F9B39C.address 46.101.169.151 D760C5B436E42F93D77EF2D969157EEA14F9B39C.or_port 9001 D760C5B436E42F93D77EF2D969157EEA14F9B39C.dir_port 9030 D760C5B436E42F93D77EF2D969157EEA14F9B39C.nickname DanWin1210 D760C5B436E42F93D77EF2D969157EEA14F9B39C.has_extrainfo false D760C5B436E42F93D77EF2D969157EEA14F9B39C.orport6_address 2a03:b0c0:3:d0::74f:a001 D760C5B436E42F93D77EF2D969157EEA14F9B39C.orport6_port 9001 D8B7A3A6542AA54D0946B9DC0257C53B6C376679.address 85.10.201.47 D8B7A3A6542AA54D0946B9DC0257C53B6C376679.or_port 9001 D8B7A3A6542AA54D0946B9DC0257C53B6C376679.dir_port 9030 D8B7A3A6542AA54D0946B9DC0257C53B6C376679.nickname sif D8B7A3A6542AA54D0946B9DC0257C53B6C376679.has_extrainfo false D8B7A3A6542AA54D0946B9DC0257C53B6C376679.orport6_address 2a01:4f8:a0:43eb::beef D8B7A3A6542AA54D0946B9DC0257C53B6C376679.orport6_port 9001 DAA39FC00B196B353C2A271459C305C429AF09E4.address 193.35.52.53 DAA39FC00B196B353C2A271459C305C429AF09E4.or_port 9001 DAA39FC00B196B353C2A271459C305C429AF09E4.dir_port 9030 DAA39FC00B196B353C2A271459C305C429AF09E4.nickname Arne DAA39FC00B196B353C2A271459C305C429AF09E4.has_extrainfo false DD823AFB415380A802DCAEB9461AE637604107FB.address 178.33.183.251 DD823AFB415380A802DCAEB9461AE637604107FB.or_port 443 DD823AFB415380A802DCAEB9461AE637604107FB.dir_port 80 DD823AFB415380A802DCAEB9461AE637604107FB.nickname grenouille DD823AFB415380A802DCAEB9461AE637604107FB.has_extrainfo false DD823AFB415380A802DCAEB9461AE637604107FB.orport6_address 2001:41d0:2:a683::251 DD823AFB415380A802DCAEB9461AE637604107FB.orport6_port 443 DD8BD7307017407FCC36F8D04A688F74A0774C02.address 171.25.193.20 DD8BD7307017407FCC36F8D04A688F74A0774C02.or_port 443 DD8BD7307017407FCC36F8D04A688F74A0774C02.dir_port 80 DD8BD7307017407FCC36F8D04A688F74A0774C02.nickname DFRI0 DD8BD7307017407FCC36F8D04A688F74A0774C02.has_extrainfo false DD8BD7307017407FCC36F8D04A688F74A0774C02.orport6_address 2001:67c:289c::20 DD8BD7307017407FCC36F8D04A688F74A0774C02.orport6_port 443 DED6892FF89DBD737BA689698A171B2392EB3E82.address 92.222.38.67 DED6892FF89DBD737BA689698A171B2392EB3E82.or_port 443 DED6892FF89DBD737BA689698A171B2392EB3E82.dir_port 80 DED6892FF89DBD737BA689698A171B2392EB3E82.nickname ThorExit DED6892FF89DBD737BA689698A171B2392EB3E82.has_extrainfo false E3DB2E354B883B59E8DC56B3E7A353DDFD457812.address 166.70.207.2 E3DB2E354B883B59E8DC56B3E7A353DDFD457812.or_port 9001 E3DB2E354B883B59E8DC56B3E7A353DDFD457812.dir_port 9030 E3DB2E354B883B59E8DC56B3E7A353DDFD457812.nickname xmission E3DB2E354B883B59E8DC56B3E7A353DDFD457812.has_extrainfo false E480D577F58E782A5BC4FA6F49A6650E9389302F.address 199.249.223.43 E480D577F58E782A5BC4FA6F49A6650E9389302F.or_port 443 E480D577F58E782A5BC4FA6F49A6650E9389302F.dir_port 80 E480D577F58E782A5BC4FA6F49A6650E9389302F.nickname Quintex34 E480D577F58E782A5BC4FA6F49A6650E9389302F.has_extrainfo false E589316576A399C511A9781A73DA4545640B479D.address 46.252.26.2 E589316576A399C511A9781A73DA4545640B479D.or_port 49991 E589316576A399C511A9781A73DA4545640B479D.dir_port 45212 E589316576A399C511A9781A73DA4545640B479D.nickname marlen E589316576A399C511A9781A73DA4545640B479D.has_extrainfo false E781F4EC69671B3F1864AE2753E0890351506329.address 176.31.180.157 E781F4EC69671B3F1864AE2753E0890351506329.or_port 22 E781F4EC69671B3F1864AE2753E0890351506329.dir_port 143 E781F4EC69671B3F1864AE2753E0890351506329.nickname armbrust E781F4EC69671B3F1864AE2753E0890351506329.has_extrainfo false E781F4EC69671B3F1864AE2753E0890351506329.orport6_address 2001:41d0:8:eb9d::1 E781F4EC69671B3F1864AE2753E0890351506329.orport6_port 22 E81EF60A73B3809F8964F73766B01BAA0A171E20.address 212.47.244.38 E81EF60A73B3809F8964F73766B01BAA0A171E20.or_port 443 E81EF60A73B3809F8964F73766B01BAA0A171E20.dir_port 8080 E81EF60A73B3809F8964F73766B01BAA0A171E20.nickname Chimborazo E81EF60A73B3809F8964F73766B01BAA0A171E20.has_extrainfo false EFEACD781604EB80FBC025EDEDEA2D523AEAAA2F.address 217.182.75.181 EFEACD781604EB80FBC025EDEDEA2D523AEAAA2F.or_port 9001 EFEACD781604EB80FBC025EDEDEA2D523AEAAA2F.dir_port 9030 EFEACD781604EB80FBC025EDEDEA2D523AEAAA2F.nickname Aerodynamik02 EFEACD781604EB80FBC025EDEDEA2D523AEAAA2F.has_extrainfo false F4263275CF54A6836EE7BD527B1328836A6F06E1.address 37.187.102.108 F4263275CF54A6836EE7BD527B1328836A6F06E1.or_port 443 F4263275CF54A6836EE7BD527B1328836A6F06E1.dir_port 80 F4263275CF54A6836EE7BD527B1328836A6F06E1.nickname EvilMoe F4263275CF54A6836EE7BD527B1328836A6F06E1.has_extrainfo false F4263275CF54A6836EE7BD527B1328836A6F06E1.orport6_address 2001:41d0:a:266c::1 F4263275CF54A6836EE7BD527B1328836A6F06E1.orport6_port 443 F70B7C5CD72D74C7F9F2DC84FA9D20D51BA13610.address 46.28.109.231 F70B7C5CD72D74C7F9F2DC84FA9D20D51BA13610.or_port 9001 F70B7C5CD72D74C7F9F2DC84FA9D20D51BA13610.dir_port 9030 F70B7C5CD72D74C7F9F2DC84FA9D20D51BA13610.nickname wedostor F70B7C5CD72D74C7F9F2DC84FA9D20D51BA13610.has_extrainfo false F70B7C5CD72D74C7F9F2DC84FA9D20D51BA13610.orport6_address 2a02:2b88:2:1::4205:1 F70B7C5CD72D74C7F9F2DC84FA9D20D51BA13610.orport6_port 9001 F93D8F37E35C390BCAD9F9069E13085B745EC216.address 185.96.180.29 F93D8F37E35C390BCAD9F9069E13085B745EC216.or_port 443 F93D8F37E35C390BCAD9F9069E13085B745EC216.dir_port 80 F93D8F37E35C390BCAD9F9069E13085B745EC216.nickname TykRelay06 F93D8F37E35C390BCAD9F9069E13085B745EC216.has_extrainfo false FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B.address 86.59.119.83 FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B.or_port 443 FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B.dir_port 80 FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B.nickname ph3x FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B.has_extrainfo false FE296180018833AF03A8EACD5894A614623D3F76.address 149.56.45.200 FE296180018833AF03A8EACD5894A614623D3F76.or_port 9001 FE296180018833AF03A8EACD5894A614623D3F76.dir_port 9030 FE296180018833AF03A8EACD5894A614623D3F76.nickname PiotrTorpotkinOne FE296180018833AF03A8EACD5894A614623D3F76.has_extrainfo false FE296180018833AF03A8EACD5894A614623D3F76.orport6_address 2607:5300:201:3000::17d3 FE296180018833AF03A8EACD5894A614623D3F76.orport6_port 9002 stem-1.7.1/stem/connection.py0000664000175000017500000013475613341034346016714 0ustar atagaratagar00000000000000# Copyright 2011-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Functions for connecting and authenticating to the tor process. The :func:`~stem.connection.connect` function give an easy, one line method for getting an authenticated control connection. This is handy for CLI applications and the python interactive interpreter, but does several things that makes it undesirable for applications (uses stdin/stdout, suppresses exceptions, etc). :: import sys from stem.connection import connect if __name__ == '__main__': controller = connect() if not controller: sys.exit(1) # unable to get a connection print 'Tor is running version %s' % controller.get_version() controller.close() :: % python example.py Tor is running version 0.2.4.10-alpha-dev (git-8be6058d8f31e578) ... or if Tor isn't running... :: % python example.py [Errno 111] Connection refused The :func:`~stem.connection.authenticate` function, however, gives easy but fine-grained control over the authentication process. For instance... :: import sys import getpass import stem.connection import stem.socket try: control_socket = stem.socket.ControlPort(port = 9051) except stem.SocketError as exc: print 'Unable to connect to port 9051 (%s)' % exc sys.exit(1) try: stem.connection.authenticate(control_socket) except stem.connection.IncorrectSocketType: print 'Please check in your torrc that 9051 is the ControlPort.' print 'Maybe you configured it to be the ORPort or SocksPort instead?' sys.exit(1) except stem.connection.MissingPassword: controller_password = getpass.getpass('Controller password: ') try: stem.connection.authenticate_password(control_socket, controller_password) except stem.connection.PasswordAuthFailed: print 'Unable to authenticate, password is incorrect' sys.exit(1) except stem.connection.AuthenticationFailure as exc: print 'Unable to authenticate: %s' % exc sys.exit(1) **Module Overview:** :: connect - Simple method for getting authenticated control connection authenticate - Main method for authenticating to a control socket authenticate_none - Authenticates to an open control socket authenticate_password - Authenticates to a socket supporting password auth authenticate_cookie - Authenticates to a socket supporting cookie auth authenticate_safecookie - Authenticates to a socket supporting safecookie auth get_protocolinfo - Issues a PROTOCOLINFO query AuthenticationFailure - Base exception raised for authentication failures |- UnrecognizedAuthMethods - Authentication methods are unsupported |- IncorrectSocketType - Socket does not speak the tor control protocol | |- OpenAuthFailed - Failure when authenticating by an open socket | +- OpenAuthRejected - Tor rejected this method of authentication | |- PasswordAuthFailed - Failure when authenticating by a password | |- PasswordAuthRejected - Tor rejected this method of authentication | |- IncorrectPassword - Password was rejected | +- MissingPassword - Socket supports password auth but wasn't attempted | |- CookieAuthFailed - Failure when authenticating by a cookie | |- CookieAuthRejected - Tor rejected this method of authentication | |- IncorrectCookieValue - Authentication cookie was rejected | |- IncorrectCookieSize - Size of the cookie file is incorrect | |- UnreadableCookieFile - Unable to read the contents of the auth cookie | +- AuthChallengeFailed - Failure completing the authchallenge request | |- AuthChallengeUnsupported - Tor doesn't recognize the AUTHCHALLENGE command | |- AuthSecurityFailure - Server provided the wrong nonce credentials | |- InvalidClientNonce - The client nonce is invalid | +- UnrecognizedAuthChallengeMethod - AUTHCHALLENGE does not support the given methods. | +- MissingAuthInfo - Unexpected PROTOCOLINFO response, missing auth info |- NoAuthMethods - Missing any methods for authenticating +- NoAuthCookie - Supports cookie auth but doesn't have its path .. data:: AuthMethod (enum) Enumeration of PROTOCOLINFO responses for supported authentication methods. ============== =========== AuthMethod Description ============== =========== **NONE** No authentication required. **PASSWORD** Password required, see tor's HashedControlPassword option. **COOKIE** Contents of the cookie file required, see tor's CookieAuthentication option. **SAFECOOKIE** Need to reply to a hmac challenge using the contents of the cookie file. **UNKNOWN** Tor provided one or more authentication methods that we don't recognize, probably something new. ============== =========== """ import binascii import getpass import os import stem.control import stem.response import stem.socket import stem.util.connection import stem.util.enum import stem.util.str_tools import stem.util.system import stem.version from stem.util import log AuthMethod = stem.util.enum.Enum('NONE', 'PASSWORD', 'COOKIE', 'SAFECOOKIE', 'UNKNOWN') CLIENT_HASH_CONSTANT = b'Tor safe cookie authentication controller-to-server hash' SERVER_HASH_CONSTANT = b'Tor safe cookie authentication server-to-controller hash' MISSING_PASSWORD_BUG_MSG = """ BUG: You provided a password but despite this stem reported that it was missing. This shouldn't happen - please let us know about it! http://bugs.torproject.org """ UNRECOGNIZED_AUTH_TYPE_MSG = """ Tor is using a type of authentication we do not recognize... {auth_methods} Please check that stem is up to date and if there is an existing issue on 'http://bugs.torproject.org'. If there isn't one then let us know! """ UNREADABLE_COOKIE_FILE_MSG = """ We were unable to read tor's authentication cookie... Path: {path} Issue: {issue} """ WRONG_PORT_TYPE_MSG = """ Please check in your torrc that {port} is the ControlPort. Maybe you configured it to be the ORPort or SocksPort instead? """ WRONG_SOCKET_TYPE_MSG = """ Unable to connect to tor. Are you sure the interface you specified belongs to tor? """ CONNECT_MESSAGES = { 'general_auth_failure': 'Unable to authenticate: {error}', 'incorrect_password': 'Incorrect password', 'no_control_port': "Unable to connect to tor. Maybe it's running without a ControlPort?", 'password_prompt': 'Tor controller password:', 'needs_password': 'Tor requires a password to authenticate', 'socket_doesnt_exist': "The socket file you specified ({path}) doesn't exist", 'tor_isnt_running': "Unable to connect to tor. Are you sure it's running?", 'unable_to_use_port': 'Unable to connect to {address}:{port}: {error}', 'unable_to_use_socket': "Unable to connect to '{path}': {error}", 'missing_password_bug': MISSING_PASSWORD_BUG_MSG.strip(), 'uncrcognized_auth_type': UNRECOGNIZED_AUTH_TYPE_MSG.strip(), 'unreadable_cookie_file': UNREADABLE_COOKIE_FILE_MSG.strip(), 'wrong_port_type': WRONG_PORT_TYPE_MSG.strip(), 'wrong_socket_type': WRONG_SOCKET_TYPE_MSG.strip(), } COMMON_TOR_COMMANDS = ( 'tor', 'tor.real', # TBB command ran '/usr/local/bin/tor', # FreeBSD expands the whole path, this is the default location ) def connect(control_port = ('127.0.0.1', 'default'), control_socket = '/var/run/tor/control', password = None, password_prompt = False, chroot_path = None, controller = stem.control.Controller): """ Convenience function for quickly getting a control connection. This is very handy for debugging or CLI setup, handling setup and prompting for a password if necessary (and none is provided). If any issues arise this prints a description of the problem and returns **None**. If both a **control_port** and **control_socket** are provided then the **control_socket** is tried first, and this provides a generic error message if they're both unavailable. In much the same vein as git porcelain commands, users should not rely on details of how this works. Messages and details of this function's behavior could change in the future. If the **port** is **'default'** then this checks on both 9051 (default for relays) and 9151 (default for the Tor Browser). This default may change in the future. .. versionadded:: 1.2.0 .. versionchanged:: 1.5.0 Use both port 9051 and 9151 by default. :param tuple contol_port: address and port tuple, for instance **('127.0.0.1', 9051)** :param str path: path where the control socket is located :param str password: passphrase to authenticate to the socket :param bool password_prompt: prompt for the controller password if it wasn't supplied :param str chroot_path: path prefix if in a chroot environment :param Class controller: :class:`~stem.control.BaseController` subclass to be returned, this provides a :class:`~stem.socket.ControlSocket` if **None** :returns: authenticated control connection, the type based on the controller argument :raises: **ValueError** if given an invalid control_port, or both **control_port** and **control_socket** are **None** """ if control_port is None and control_socket is None: raise ValueError('Neither a control port nor control socket were provided. Nothing to connect to.') elif control_port: if len(control_port) != 2: raise ValueError('The control_port argument for connect() should be an (address, port) tuple.') elif not stem.util.connection.is_valid_ipv4_address(control_port[0]): raise ValueError("'%s' isn't a vaid IPv4 address" % control_port[0]) elif control_port[1] != 'default' and not stem.util.connection.is_valid_port(control_port[1]): raise ValueError("'%s' isn't a valid port" % control_port[1]) control_connection, error_msg = None, '' if control_socket: if os.path.exists(control_socket): try: control_connection = stem.socket.ControlSocketFile(control_socket) except stem.SocketError as exc: error_msg = CONNECT_MESSAGES['unable_to_use_socket'].format(path = control_socket, error = exc) else: error_msg = CONNECT_MESSAGES['socket_doesnt_exist'].format(path = control_socket) if control_port and not control_connection: address, port = control_port try: if port == 'default': control_connection = _connection_for_default_port(address) else: control_connection = stem.socket.ControlPort(address, int(port)) except stem.SocketError as exc: error_msg = CONNECT_MESSAGES['unable_to_use_port'].format(address = address, port = port, error = exc) # If unable to connect to either a control socket or port then finally fail # out. If we only attempted to connect to one of them then provide the error # output from that. Otherwise we provide a more generic error message. if not control_connection: if control_socket and control_port: is_tor_running = stem.util.system.is_running(COMMON_TOR_COMMANDS) error_msg = CONNECT_MESSAGES['no_control_port'] if is_tor_running else CONNECT_MESSAGES['tor_isnt_running'] print(error_msg) return None return _connect_auth(control_connection, password, password_prompt, chroot_path, controller) def connect_port(address = '127.0.0.1', port = 9051, password = None, chroot_path = None, controller = stem.control.Controller): """ Convenience function for quickly getting a control connection. This is very handy for debugging or CLI setup, handling setup and prompting for a password if necessary (and none is provided). If any issues arise this prints a description of the problem and returns **None**. .. deprecated:: 1.2.0 Use :func:`~stem.connection.connect` instead. :param str address: ip address of the controller :param int port: port number of the controller :param str password: passphrase to authenticate to the socket :param str chroot_path: path prefix if in a chroot environment :param Class controller: :class:`~stem.control.BaseController` subclass to be returned, this provides a :class:`~stem.socket.ControlSocket` if **None** :returns: authenticated control connection, the type based on the controller argument """ try: control_port = stem.socket.ControlPort(address, port) except stem.SocketError as exc: print(exc) return None return _connect_auth(control_port, password, True, chroot_path, controller) def connect_socket_file(path = '/var/run/tor/control', password = None, chroot_path = None, controller = stem.control.Controller): """ Convenience function for quickly getting a control connection. For more information see the :func:`~stem.connection.connect_port` function. In much the same vein as git porcelain commands, users should not rely on details of how this works. Messages or details of this function's behavior might change in the future. .. deprecated:: 1.2.0 Use :func:`~stem.connection.connect` instead. :param str path: path where the control socket is located :param str password: passphrase to authenticate to the socket :param str chroot_path: path prefix if in a chroot environment :param Class controller: :class:`~stem.control.BaseController` subclass to be returned, this provides a :class:`~stem.socket.ControlSocket` if **None** :returns: authenticated control connection, the type based on the controller argument """ try: control_socket = stem.socket.ControlSocketFile(path) except stem.SocketError as exc: print(exc) return None return _connect_auth(control_socket, password, True, chroot_path, controller) def _connect_auth(control_socket, password, password_prompt, chroot_path, controller): """ Helper for the connect_* functions that authenticates the socket and constructs the controller. :param stem.socket.ControlSocket control_socket: socket being authenticated to :param str password: passphrase to authenticate to the socket :param bool password_prompt: prompt for the controller password if it wasn't supplied :param str chroot_path: path prefix if in a chroot environment :param Class controller: :class:`~stem.control.BaseController` subclass to be returned, this provides a :class:`~stem.socket.ControlSocket` if **None** :returns: authenticated control connection, the type based on the controller argument """ try: authenticate(control_socket, password, chroot_path) if controller is None: return control_socket else: return controller(control_socket, is_authenticated = True) except IncorrectSocketType: if isinstance(control_socket, stem.socket.ControlPort): print(CONNECT_MESSAGES['wrong_port_type'].format(port = control_socket.port)) else: print(CONNECT_MESSAGES['wrong_socket_type']) control_socket.close() return None except UnrecognizedAuthMethods as exc: print(CONNECT_MESSAGES['uncrcognized_auth_type'].format(auth_methods = ', '.join(exc.unknown_auth_methods))) control_socket.close() return None except IncorrectPassword: print(CONNECT_MESSAGES['incorrect_password']) control_socket.close() return None except MissingPassword: if password is not None: control_socket.close() raise ValueError(CONNECT_MESSAGES['missing_password_bug']) if password_prompt: try: password = getpass.getpass(CONNECT_MESSAGES['password_prompt'] + ' ') except KeyboardInterrupt: control_socket.close() return None return _connect_auth(control_socket, password, password_prompt, chroot_path, controller) else: print(CONNECT_MESSAGES['needs_password']) control_socket.close() return None except UnreadableCookieFile as exc: print(CONNECT_MESSAGES['unreadable_cookie_file'].format(path = exc.cookie_path, issue = str(exc))) control_socket.close() return None except AuthenticationFailure as exc: print(CONNECT_MESSAGES['general_auth_failure'].format(error = exc)) control_socket.close() return None def authenticate(controller, password = None, chroot_path = None, protocolinfo_response = None): """ Authenticates to a control socket using the information provided by a PROTOCOLINFO response. In practice this will often be all we need to authenticate, raising an exception if all attempts to authenticate fail. All exceptions are subclasses of AuthenticationFailure so, in practice, callers should catch the types of authentication failure that they care about, then have a :class:`~stem.connection.AuthenticationFailure` catch-all at the end. This can authenticate to either a :class:`~stem.control.BaseController` or :class:`~stem.socket.ControlSocket`. :param controller: tor controller or socket to be authenticated :param str password: passphrase to present to the socket if it uses password authentication (skips password auth if **None**) :param str chroot_path: path prefix if in a chroot environment :param stem.response.protocolinfo.ProtocolInfoResponse protocolinfo_response: tor protocolinfo response, this is retrieved on our own if **None** :raises: If all attempts to authenticate fails then this will raise a :class:`~stem.connection.AuthenticationFailure` subclass. Since this may try multiple authentication methods it may encounter multiple exceptions. If so then the exception this raises is prioritized as follows... * :class:`stem.connection.IncorrectSocketType` The controller does not speak the tor control protocol. Most often this happened because the user confused the SocksPort or ORPort with the ControlPort. * :class:`stem.connection.UnrecognizedAuthMethods` All of the authentication methods tor will accept are new and unrecognized. Please upgrade stem and, if that doesn't work, file a ticket on 'trac.torproject.org' and I'd be happy to add support. * :class:`stem.connection.MissingPassword` We were unable to authenticate but didn't attempt password authentication because none was provided. You should prompt the user for a password and try again via 'authenticate_password'. * :class:`stem.connection.IncorrectPassword` We were provided with a password but it was incorrect. * :class:`stem.connection.IncorrectCookieSize` Tor allows for authentication by reading it a cookie file, but that file is the wrong size to be an authentication cookie. * :class:`stem.connection.UnreadableCookieFile` Tor allows for authentication by reading it a cookie file, but we can't read that file (probably due to permissions). * **\***:class:`stem.connection.IncorrectCookieValue` Tor allows for authentication by reading it a cookie file, but rejected the contents of that file. * **\***:class:`stem.connection.AuthChallengeUnsupported` Tor doesn't recognize the AUTHCHALLENGE command. This is probably a Tor version prior to SAFECOOKIE being implement, but this exception shouldn't arise because we won't attempt SAFECOOKIE auth unless Tor claims to support it. * **\***:class:`stem.connection.UnrecognizedAuthChallengeMethod` Tor couldn't recognize the AUTHCHALLENGE method Stem sent to it. This shouldn't happen at all. * **\***:class:`stem.connection.InvalidClientNonce` Tor says that the client nonce provided by Stem during the AUTHCHALLENGE process is invalid. * **\***:class:`stem.connection.AuthSecurityFailure` Nonce value provided by the server was invalid. * **\***:class:`stem.connection.OpenAuthRejected` Tor says that it allows for authentication without any credentials, but then rejected our authentication attempt. * **\***:class:`stem.connection.MissingAuthInfo` Tor provided us with a PROTOCOLINFO reply that is technically valid, but missing the information we need to authenticate. * **\***:class:`stem.connection.AuthenticationFailure` There are numerous other ways that authentication could have failed including socket failures, malformed controller responses, etc. These mostly constitute transient failures or bugs. **\*** In practice it is highly unusual for this to occur, being more of a theoretical possibility rather than something you should expect. It's fine to treat these as errors. If you have a use case where this commonly happens, please file a ticket on 'trac.torproject.org'. In the future new :class:`~stem.connection.AuthenticationFailure` subclasses may be added to allow for better error handling. """ if not protocolinfo_response: try: protocolinfo_response = get_protocolinfo(controller) except stem.ProtocolError: raise IncorrectSocketType('unable to use the control socket') except stem.SocketError as exc: raise AuthenticationFailure('socket connection failed (%s)' % exc) auth_methods = list(protocolinfo_response.auth_methods) auth_exceptions = [] if len(auth_methods) == 0: raise NoAuthMethods('our PROTOCOLINFO response did not have any methods for authenticating') # remove authentication methods that are either unknown or for which we don't # have an input if AuthMethod.UNKNOWN in auth_methods: auth_methods.remove(AuthMethod.UNKNOWN) unknown_methods = protocolinfo_response.unknown_auth_methods plural_label = 's' if len(unknown_methods) > 1 else '' methods_label = ', '.join(unknown_methods) # we... er, can't do anything with only unrecognized auth types if not auth_methods: exc_msg = 'unrecognized authentication method%s (%s)' % (plural_label, methods_label) auth_exceptions.append(UnrecognizedAuthMethods(exc_msg, unknown_methods)) else: log.debug('Authenticating to a socket with unrecognized auth method%s, ignoring them: %s' % (plural_label, methods_label)) if protocolinfo_response.cookie_path is None: for cookie_auth_method in (AuthMethod.COOKIE, AuthMethod.SAFECOOKIE): if cookie_auth_method in auth_methods: auth_methods.remove(cookie_auth_method) exc_msg = 'our PROTOCOLINFO response did not have the location of our authentication cookie' auth_exceptions.append(NoAuthCookie(exc_msg, cookie_auth_method == AuthMethod.SAFECOOKIE)) if AuthMethod.PASSWORD in auth_methods and password is None: auth_methods.remove(AuthMethod.PASSWORD) auth_exceptions.append(MissingPassword('no passphrase provided')) # iterating over AuthMethods so we can try them in this order for auth_type in (AuthMethod.NONE, AuthMethod.PASSWORD, AuthMethod.SAFECOOKIE, AuthMethod.COOKIE): if auth_type not in auth_methods: continue try: if auth_type == AuthMethod.NONE: authenticate_none(controller, False) elif auth_type == AuthMethod.PASSWORD: authenticate_password(controller, password, False) elif auth_type in (AuthMethod.COOKIE, AuthMethod.SAFECOOKIE): cookie_path = protocolinfo_response.cookie_path if chroot_path: cookie_path = os.path.join(chroot_path, cookie_path.lstrip(os.path.sep)) if auth_type == AuthMethod.SAFECOOKIE: authenticate_safecookie(controller, cookie_path, False) else: authenticate_cookie(controller, cookie_path, False) if isinstance(controller, stem.control.BaseController): controller._post_authentication() return # success! except OpenAuthRejected as exc: auth_exceptions.append(exc) except IncorrectPassword as exc: auth_exceptions.append(exc) except PasswordAuthRejected as exc: # Since the PROTOCOLINFO says password auth is available we can assume # that if PasswordAuthRejected is raised it's being raised in error. log.debug('The authenticate_password method raised a PasswordAuthRejected when password auth should be available. Stem may need to be corrected to recognize this response: %s' % exc) auth_exceptions.append(IncorrectPassword(str(exc))) except AuthSecurityFailure as exc: log.info('Tor failed to provide the nonce expected for safecookie authentication. (%s)' % exc) auth_exceptions.append(exc) except (InvalidClientNonce, UnrecognizedAuthChallengeMethod, AuthChallengeFailed) as exc: auth_exceptions.append(exc) except (IncorrectCookieSize, UnreadableCookieFile, IncorrectCookieValue) as exc: auth_exceptions.append(exc) except CookieAuthRejected as exc: auth_func = 'authenticate_safecookie' if exc.is_safecookie else 'authenticate_cookie' log.debug('The %s method raised a CookieAuthRejected when cookie auth should be available. Stem may need to be corrected to recognize this response: %s' % (auth_func, exc)) auth_exceptions.append(IncorrectCookieValue(str(exc), exc.cookie_path, exc.is_safecookie)) except stem.ControllerError as exc: auth_exceptions.append(AuthenticationFailure(str(exc))) # All authentication attempts failed. Raise the exception that takes priority # according to our pydocs. for exc_type in AUTHENTICATE_EXCEPTIONS: for auth_exc in auth_exceptions: if isinstance(auth_exc, exc_type): raise auth_exc # We really, really shouldn't get here. It means that auth_exceptions is # either empty or contains something that isn't an AuthenticationFailure. raise AssertionError('BUG: Authentication failed without providing a recognized exception: %s' % str(auth_exceptions)) def authenticate_none(controller, suppress_ctl_errors = True): """ Authenticates to an open control socket. All control connections need to authenticate before they can be used, even if tor hasn't been configured to use any authentication. If authentication fails tor will disconnect and we'll make a best effort attempt to re-establish the connection. This may not succeed, so check :func:`~stem.socket.ControlSocket.is_alive` before using the socket further. This can authenticate to either a :class:`~stem.control.BaseController` or :class:`~stem.socket.ControlSocket`. For general usage use the :func:`~stem.connection.authenticate` function instead. :param controller: tor controller or socket to be authenticated :param bool suppress_ctl_errors: reports raised :class:`~stem.ControllerError` as authentication rejection if **True**, otherwise they're re-raised :raises: :class:`stem.connection.OpenAuthRejected` if the empty authentication credentials aren't accepted """ try: auth_response = _msg(controller, 'AUTHENTICATE') # if we got anything but an OK response then error if str(auth_response) != 'OK': try: controller.connect() except: pass raise OpenAuthRejected(str(auth_response), auth_response) except stem.ControllerError as exc: try: controller.connect() except: pass if not suppress_ctl_errors: raise else: raise OpenAuthRejected('Socket failed (%s)' % exc) def authenticate_password(controller, password, suppress_ctl_errors = True): """ Authenticates to a control socket that uses a password (via the HashedControlPassword torrc option). Quotes in the password are escaped. If authentication fails tor will disconnect and we'll make a best effort attempt to re-establish the connection. This may not succeed, so check :func:`~stem.socket.ControlSocket.is_alive` before using the socket further. If you use this function directly, rather than :func:`~stem.connection.authenticate`, we may mistakenly raise a PasswordAuthRejected rather than IncorrectPassword. This is because we rely on tor's error messaging which is liable to change in future versions (:trac:`4817`). This can authenticate to either a :class:`~stem.control.BaseController` or :class:`~stem.socket.ControlSocket`. For general usage use the :func:`~stem.connection.authenticate` function instead. :param controller: tor controller or socket to be authenticated :param str password: passphrase to present to the socket :param bool suppress_ctl_errors: reports raised :class:`~stem.ControllerError` as authentication rejection if **True**, otherwise they're re-raised :raises: * :class:`stem.connection.PasswordAuthRejected` if the socket doesn't accept password authentication * :class:`stem.connection.IncorrectPassword` if the authentication credentials aren't accepted """ # Escapes quotes. Tor can include those in the password hash, in which case # it expects escaped quotes from the controller. For more information see... # https://trac.torproject.org/projects/tor/ticket/4600 password = password.replace('"', '\\"') try: auth_response = _msg(controller, 'AUTHENTICATE "%s"' % password) # if we got anything but an OK response then error if str(auth_response) != 'OK': try: controller.connect() except: pass # all we have to go on is the error message from tor... # Password did not match HashedControlPassword value value from configuration... # Password did not match HashedControlPassword *or*... if 'Password did not match HashedControlPassword' in str(auth_response): raise IncorrectPassword(str(auth_response), auth_response) else: raise PasswordAuthRejected(str(auth_response), auth_response) except stem.ControllerError as exc: try: controller.connect() except: pass if not suppress_ctl_errors: raise else: raise PasswordAuthRejected('Socket failed (%s)' % exc) def authenticate_cookie(controller, cookie_path, suppress_ctl_errors = True): """ Authenticates to a control socket that uses the contents of an authentication cookie (generated via the CookieAuthentication torrc option). This does basic validation that this is a cookie before presenting the contents to the socket. The :class:`~stem.connection.IncorrectCookieSize` and :class:`~stem.connection.UnreadableCookieFile` exceptions take precedence over the other types. If authentication fails tor will disconnect and we'll make a best effort attempt to re-establish the connection. This may not succeed, so check :func:`~stem.socket.ControlSocket.is_alive` before using the socket further. If you use this function directly, rather than :func:`~stem.connection.authenticate`, we may mistakenly raise a :class:`~stem.connection.CookieAuthRejected` rather than :class:`~stem.connection.IncorrectCookieValue`. This is because we rely on tor's error messaging which is liable to change in future versions (:trac:`4817`). This can authenticate to either a :class:`~stem.control.BaseController` or :class:`~stem.socket.ControlSocket`. For general usage use the :func:`~stem.connection.authenticate` function instead. :param controller: tor controller or socket to be authenticated :param str cookie_path: path of the authentication cookie to send to tor :param bool suppress_ctl_errors: reports raised :class:`~stem.ControllerError` as authentication rejection if **True**, otherwise they're re-raised :raises: * :class:`stem.connection.IncorrectCookieSize` if the cookie file's size is wrong * :class:`stem.connection.UnreadableCookieFile` if the cookie file doesn't exist or we're unable to read it * :class:`stem.connection.CookieAuthRejected` if cookie authentication is attempted but the socket doesn't accept it * :class:`stem.connection.IncorrectCookieValue` if the cookie file's value is rejected """ cookie_data = _read_cookie(cookie_path, False) try: # binascii.b2a_hex() takes a byte string and returns one too. With python 3 # this is a problem because string formatting for byte strings includes the # b'' wrapper... # # >>> "AUTHENTICATE %s" % b'content' # "AUTHENTICATE b'content'" # # This seems dumb but oh well. Converting the result to unicode so it won't # misbehave. auth_token_hex = binascii.b2a_hex(stem.util.str_tools._to_bytes(cookie_data)) msg = 'AUTHENTICATE %s' % stem.util.str_tools._to_unicode(auth_token_hex) auth_response = _msg(controller, msg) # if we got anything but an OK response then error if str(auth_response) != 'OK': try: controller.connect() except: pass # all we have to go on is the error message from tor... # ... Authentication cookie did not match expected value. # ... *or* authentication cookie. if '*or* authentication cookie.' in str(auth_response) or \ 'Authentication cookie did not match expected value.' in str(auth_response): raise IncorrectCookieValue(str(auth_response), cookie_path, False, auth_response) else: raise CookieAuthRejected(str(auth_response), cookie_path, False, auth_response) except stem.ControllerError as exc: try: controller.connect() except: pass if not suppress_ctl_errors: raise else: raise CookieAuthRejected('Socket failed (%s)' % exc, cookie_path, False) def authenticate_safecookie(controller, cookie_path, suppress_ctl_errors = True): """ Authenticates to a control socket using the safe cookie method, which is enabled by setting the CookieAuthentication torrc option on Tor client's which support it. Authentication with this is a two-step process... 1. send a nonce to the server and receives a challenge from the server for the cookie's contents 2. generate a hash digest using the challenge received in the first step, and use it to authenticate the controller The :class:`~stem.connection.IncorrectCookieSize` and :class:`~stem.connection.UnreadableCookieFile` exceptions take precedence over the other exception types. The :class:`~stem.connection.AuthChallengeUnsupported`, :class:`~stem.connection.UnrecognizedAuthChallengeMethod`, :class:`~stem.connection.InvalidClientNonce` and :class:`~stem.connection.CookieAuthRejected` exceptions are next in the order of precedence. Depending on the reason, one of these is raised if the first (AUTHCHALLENGE) step fails. In the second (AUTHENTICATE) step, :class:`~stem.connection.IncorrectCookieValue` or :class:`~stem.connection.CookieAuthRejected` maybe raised. If authentication fails tor will disconnect and we'll make a best effort attempt to re-establish the connection. This may not succeed, so check :func:`~stem.socket.ControlSocket.is_alive` before using the socket further. For general usage use the :func:`~stem.connection.authenticate` function instead. :param controller: tor controller or socket to be authenticated :param str cookie_path: path of the authentication cookie to send to tor :param bool suppress_ctl_errors: reports raised :class:`~stem.ControllerError` as authentication rejection if **True**, otherwise they're re-raised :raises: * :class:`stem.connection.IncorrectCookieSize` if the cookie file's size is wrong * :class:`stem.connection.UnreadableCookieFile` if the cookie file doesn't exist or we're unable to read it * :class:`stem.connection.CookieAuthRejected` if cookie authentication is attempted but the socket doesn't accept it * :class:`stem.connection.IncorrectCookieValue` if the cookie file's value is rejected * :class:`stem.connection.UnrecognizedAuthChallengeMethod` if the Tor client fails to recognize the AuthChallenge method * :class:`stem.connection.AuthChallengeUnsupported` if AUTHCHALLENGE is unimplemented, or if unable to parse AUTHCHALLENGE response * :class:`stem.connection.AuthSecurityFailure` if AUTHCHALLENGE's response looks like a security attack * :class:`stem.connection.InvalidClientNonce` if stem's AUTHCHALLENGE client nonce is rejected for being invalid """ cookie_data = _read_cookie(cookie_path, True) client_nonce = os.urandom(32) try: client_nonce_hex = stem.util.str_tools._to_unicode(binascii.b2a_hex(client_nonce)) authchallenge_response = _msg(controller, 'AUTHCHALLENGE SAFECOOKIE %s' % client_nonce_hex) if not authchallenge_response.is_ok(): try: controller.connect() except: pass authchallenge_response_str = str(authchallenge_response) if 'Authentication required.' in authchallenge_response_str: raise AuthChallengeUnsupported("SAFECOOKIE authentication isn't supported", cookie_path) elif 'AUTHCHALLENGE only supports' in authchallenge_response_str: raise UnrecognizedAuthChallengeMethod(authchallenge_response_str, cookie_path) elif 'Invalid base16 client nonce' in authchallenge_response_str: raise InvalidClientNonce(authchallenge_response_str, cookie_path) elif 'Cookie authentication is disabled' in authchallenge_response_str: raise CookieAuthRejected(authchallenge_response_str, cookie_path, True) else: raise AuthChallengeFailed(authchallenge_response, cookie_path) except stem.ControllerError as exc: try: controller.connect() except: pass if not suppress_ctl_errors: raise else: raise AuthChallengeFailed('Socket failed (%s)' % exc, cookie_path, True) try: stem.response.convert('AUTHCHALLENGE', authchallenge_response) except stem.ProtocolError as exc: if not suppress_ctl_errors: raise else: raise AuthChallengeFailed('Unable to parse AUTHCHALLENGE response: %s' % exc, cookie_path) expected_server_hash = stem.util.connection._hmac_sha256( SERVER_HASH_CONSTANT, cookie_data + client_nonce + authchallenge_response.server_nonce) if not stem.util.connection._cryptovariables_equal(authchallenge_response.server_hash, expected_server_hash): raise AuthSecurityFailure('Tor provided the wrong server nonce', cookie_path) try: client_hash = stem.util.connection._hmac_sha256( CLIENT_HASH_CONSTANT, cookie_data + client_nonce + authchallenge_response.server_nonce) auth_response = _msg(controller, 'AUTHENTICATE %s' % stem.util.str_tools._to_unicode(binascii.b2a_hex(client_hash))) except stem.ControllerError as exc: try: controller.connect() except: pass if not suppress_ctl_errors: raise else: raise CookieAuthRejected('Socket failed (%s)' % exc, cookie_path, True, auth_response) # if we got anything but an OK response then err if not auth_response.is_ok(): try: controller.connect() except: pass # all we have to go on is the error message from tor... # ... Safe cookie response did not match expected value # ... *or* authentication cookie. if '*or* authentication cookie.' in str(auth_response) or \ 'Safe cookie response did not match expected value' in str(auth_response): raise IncorrectCookieValue(str(auth_response), cookie_path, True, auth_response) else: raise CookieAuthRejected(str(auth_response), cookie_path, True, auth_response) def get_protocolinfo(controller): """ Issues a PROTOCOLINFO query to a control socket, getting information about the tor process running on it. If the socket is already closed then it is first reconnected. This can authenticate to either a :class:`~stem.control.BaseController` or :class:`~stem.socket.ControlSocket`. :param controller: tor controller or socket to be queried :returns: :class:`~stem.response.protocolinfo.ProtocolInfoResponse` provided by tor :raises: * :class:`stem.ProtocolError` if the PROTOCOLINFO response is malformed * :class:`stem.SocketError` if problems arise in establishing or using the socket """ try: protocolinfo_response = _msg(controller, 'PROTOCOLINFO 1') except: protocolinfo_response = None # Tor hangs up on sockets after receiving a PROTOCOLINFO query if it isn't # next followed by authentication. Transparently reconnect if that happens. if not protocolinfo_response or str(protocolinfo_response) == 'Authentication required.': controller.connect() try: protocolinfo_response = _msg(controller, 'PROTOCOLINFO 1') except stem.SocketClosed as exc: raise stem.SocketError(exc) stem.response.convert('PROTOCOLINFO', protocolinfo_response) return protocolinfo_response def _msg(controller, message): """ Sends and receives a message with either a :class:`~stem.socket.ControlSocket` or :class:`~stem.control.BaseController`. """ if isinstance(controller, stem.socket.ControlSocket): controller.send(message) return controller.recv() else: return controller.msg(message) def _connection_for_default_port(address): """ Attempts to provide a controller connection for either port 9051 (default for relays) or 9151 (default for Tor Browser). If both fail then this raises the exception for port 9051. :param str address: address to connect to :returns: :class:`~stem.socket.ControlPort` for the controller conneciton :raises: :class:`stem.SocketError` if we're unable to establish a connection """ try: return stem.socket.ControlPort(address, 9051) except stem.SocketError as exc: try: return stem.socket.ControlPort(address, 9151) except stem.SocketError: raise exc def _read_cookie(cookie_path, is_safecookie): """ Provides the contents of a given cookie file. :param str cookie_path: absolute path of the cookie file :param bool is_safecookie: **True** if this was for SAFECOOKIE authentication, **False** if for COOKIE :raises: * :class:`stem.connection.UnreadableCookieFile` if the cookie file is unreadable * :class:`stem.connection.IncorrectCookieSize` if the cookie size is incorrect (not 32 bytes) """ if not os.path.exists(cookie_path): exc_msg = "Authentication failed: '%s' doesn't exist" % cookie_path raise UnreadableCookieFile(exc_msg, cookie_path, is_safecookie) # Abort if the file isn't 32 bytes long. This is to avoid exposing arbitrary # file content to the port. # # Without this a malicious socket could, for instance, claim that # '~/.bash_history' or '~/.ssh/id_rsa' was its authentication cookie to trick # us into reading it for them with our current permissions. # # https://trac.torproject.org/projects/tor/ticket/4303 auth_cookie_size = os.path.getsize(cookie_path) if auth_cookie_size != 32: exc_msg = "Authentication failed: authentication cookie '%s' is the wrong size (%i bytes instead of 32)" % (cookie_path, auth_cookie_size) raise IncorrectCookieSize(exc_msg, cookie_path, is_safecookie) try: with open(cookie_path, 'rb', 0) as f: return f.read() except IOError as exc: exc_msg = "Authentication failed: unable to read '%s' (%s)" % (cookie_path, exc) raise UnreadableCookieFile(exc_msg, cookie_path, is_safecookie) class AuthenticationFailure(Exception): """ Base error for authentication failures. :var stem.socket.ControlMessage auth_response: AUTHENTICATE response from the control socket, **None** if one wasn't received """ def __init__(self, message, auth_response = None): super(AuthenticationFailure, self).__init__(message) self.auth_response = auth_response class UnrecognizedAuthMethods(AuthenticationFailure): """ All methods for authenticating aren't recognized. :var list unknown_auth_methods: authentication methods that weren't recognized """ def __init__(self, message, unknown_auth_methods): super(UnrecognizedAuthMethods, self).__init__(message) self.unknown_auth_methods = unknown_auth_methods class IncorrectSocketType(AuthenticationFailure): 'Socket does not speak the control protocol.' class OpenAuthFailed(AuthenticationFailure): 'Failure to authenticate to an open socket.' class OpenAuthRejected(OpenAuthFailed): 'Attempt to connect to an open control socket was rejected.' class PasswordAuthFailed(AuthenticationFailure): 'Failure to authenticate with a password.' class PasswordAuthRejected(PasswordAuthFailed): 'Socket does not support password authentication.' class IncorrectPassword(PasswordAuthFailed): 'Authentication password incorrect.' class MissingPassword(PasswordAuthFailed): "Password authentication is supported but we weren't provided with one." class CookieAuthFailed(AuthenticationFailure): """ Failure to authenticate with an authentication cookie. :param str cookie_path: location of the authentication cookie we attempted :param bool is_safecookie: **True** if this was for SAFECOOKIE authentication, **False** if for COOKIE :param stem.response.ControlMessage auth_response: reply to our authentication attempt """ def __init__(self, message, cookie_path, is_safecookie, auth_response = None): super(CookieAuthFailed, self).__init__(message, auth_response) self.is_safecookie = is_safecookie self.cookie_path = cookie_path class CookieAuthRejected(CookieAuthFailed): 'Socket does not support password authentication.' class IncorrectCookieValue(CookieAuthFailed): 'Authentication cookie value was rejected.' class IncorrectCookieSize(CookieAuthFailed): 'Aborted because the cookie file is the wrong size.' class UnreadableCookieFile(CookieAuthFailed): 'Error arose in reading the authentication cookie.' class AuthChallengeFailed(CookieAuthFailed): """ AUTHCHALLENGE command has failed. """ def __init__(self, message, cookie_path): super(AuthChallengeFailed, self).__init__(message, cookie_path, True) class AuthChallengeUnsupported(AuthChallengeFailed): """ AUTHCHALLENGE isn't implemented. """ class UnrecognizedAuthChallengeMethod(AuthChallengeFailed): """ Tor couldn't recognize our AUTHCHALLENGE method. :var str authchallenge_method: AUTHCHALLENGE method that Tor couldn't recognize """ def __init__(self, message, cookie_path, authchallenge_method): super(UnrecognizedAuthChallengeMethod, self).__init__(message, cookie_path) self.authchallenge_method = authchallenge_method class AuthSecurityFailure(AuthChallengeFailed): 'AUTHCHALLENGE response is invalid.' class InvalidClientNonce(AuthChallengeFailed): 'AUTHCHALLENGE request contains an invalid client nonce.' class MissingAuthInfo(AuthenticationFailure): """ The PROTOCOLINFO response didn't have enough information to authenticate. These are valid control responses but really shouldn't happen in practice. """ class NoAuthMethods(MissingAuthInfo): "PROTOCOLINFO response didn't have any methods for authenticating." class NoAuthCookie(MissingAuthInfo): """ PROTOCOLINFO response supports cookie auth but doesn't have its path. :param bool is_safecookie: **True** if this was for SAFECOOKIE authentication, **False** if for COOKIE """ def __init__(self, message, is_safecookie): super(NoAuthCookie, self).__init__(message) self.is_safecookie = is_safecookie # authentication exceptions ordered as per the authenticate function's pydocs AUTHENTICATE_EXCEPTIONS = ( IncorrectSocketType, UnrecognizedAuthMethods, MissingPassword, IncorrectPassword, IncorrectCookieSize, UnreadableCookieFile, IncorrectCookieValue, AuthChallengeUnsupported, UnrecognizedAuthChallengeMethod, InvalidClientNonce, AuthSecurityFailure, OpenAuthRejected, MissingAuthInfo, AuthenticationFailure ) stem-1.7.1/stem/cached_manual.sqlite0000644000175000017500000073400013355717377020175 0ustar atagaratagar00000000000000SQLite format 3@ î-ñ¸ 6 ÌÂ>™ÿj‘åÌf ‚ tabletorrctorrc CREATE TABLE torrc(key TEXT PRIMARY KEY, name TEXT, category TEXT, usage TEXT, summary TEXT, description TEXT, position INTEGER)) =indexsqlite_autoindex_torrc_1torrc RtablefilesfilesCREATE TABLE files(name TEXT PRIMARY KEY, description TEXT))=indexsqlite_autoindex_files_1files XtablesignalssignalsCREATE TABLE signals(name TEXT PRIMARY KEY, description TEXT)-Aindexsqlite_autoindex_signals_1signalsd##tablecommandlinecommandlineCREATE TABLE commandline(name TEXT PRIMARY KEY, description TEXT)5I#indexsqlite_autoindex_commandline_1commandlineUtablemetadatametadataCREATE TABLE metadata(name TEXT, synopsis TEXT, description TEXT, man_commit TEXT, stem_commit TEXT)<UtableschemaschemaCREATE TABLE schema(version INTEGER) üü ’’‡r]7I]]tor - The second-generation onion routertor [OPTION value]...Tor is a connection-oriented anonym ñûöñ  <RlJڻņ¬AÞúu -gõ< -h, -help=--hash-password PASSWORD --version6q--service install [--options command-line options]5--list-torrc-options5--keygen [--newpass] ;--passphrase-fd FILEDES )--quiet|--hush C--service remove|start|stop +--verify-config %--nt-service7--allow-missing-torrc7--defaults-torrc FILE1--list-fingerprint?--list-deprecated-optionsA--key-expiration [purpose]9--ignore-missing-torrc  -f FILE {^õ7QË{NSIGXFSZIf this signal exists on your platform, Tor catches and ignores it.QSIGTERMTor will catch this, clean up and sync to disk if necessary, and exit.1IGPIPETor catches this signal and ignores it.cƒ?SIGINTTor clients behave as with SIGTERM; but Tor servers will do a controlled slow shutdown, closing listeners and waiting 30 seconds before exiting. (The delay can be configured with the ShutdownWaitLength config option.)V#SIGUSR1Log statistics about current connections, past connections, and throughput.d?SIGCHLDTor receives this signal when one of its helper processes has exited, so it can clean up.gESIGUSR2Switch all logs to loglevel debug. You can go back to the old loglevels by sending a SIGHUP.‚7SIGHUPThe signal instructs Tor to reload its configuration (including closing and reopening logs), and kill and restart its helper processes if applicable. £ÞöÇ»¯Òê£ SIGXFSZ SIGTERM SIGPIPE SIGINT SIGUSR1 SIGCHLD SIGUSR2  SIGHUP ÉûöñìçâÝØÓÎÉ/,)&   ××$MDataDirectory/stats/buffer-stats úÑúÐU Éê;ãÂý #rÉZÂ/aTESTINGCLIENTCONSENSUSDOWNLOADINITIALDELAY"y!EHIDDENSERVICEEXPORTCIRCUITID)OPTIMISTICDATA:)CELLSTATISTICSɽ½Ö+TRUNCATELOGFILEB¯3RELAYBANDWIDTHBURSTÍÍÍÍÓÂÞ5KEEPBINDCAPABILITIESGU;EXITPOLICYREJECTPRIVATE­;5COOKIEAUTHENTICATIONizing communication service. Users choose a source-routed path through a set of nodes, and negotiate a "virtual circuit" through the network, in which each node knows its predecessor and successor, but no others. Traffic flowing down the circuit is unwrapped by a symmetric key at each node, which reveals the downstream node. Basically, Tor provides a distributed network of servers or relays ("onion routers"). Users bounce their TCP streams -- web traffic, ftp, ssh, etc. -- around the network, and recipients, observers, and even the relays themselves have difficulty tracking the source of the stream. By default, tor will act as a client only. To help the network by providing bandwidth as a relay, change the ORPort configuration option -- see below. Please also consult the documentation on the Tor Project's website.9767cf8cc091d0c9dd062fbfce258188841ec3319127379850ed898e1a52b4a6c962cdd05b3ddb80 gGgƒ]A‡ --key-expiration [purpose]The purpose specifies which type of key certificate to determine the expiration of. The only currently recognised purpose is "sign". Running "tor --key-expiration sign" will attempt to find your signing key certificate and will output, both in the logs as well as to stdout, the signing key certificate's expiration time in ISO-8601 format. For example, the output sent to stdout will be of the form: "signing-cert-expiry: 2017-07-25 08:30:15 UTC"S9‚--ignore-missing-torrcSpecifies that Tor should treat a missing torrc file as though it were empty. Ordinarily, Tor does this for missing default torrc files, but not for those specified on the command line.`ƒ7-f FILESpecify a new configuration file to contain further Tor configuration options OR pass - to make Tor read its configuration from standard input. (Default: @CONFDIR@/torrc, or $HOME/.torrc if that file is not found) Ôk §g,ÔV C}--service remove|start|stopRemove, start, or stop a configured Tor Windows service.9 +[--verify-configVerify the configuration file is valid.>%k--nt-serviceUsed internally to implement a Windows service.w7I--allow-missing-torrcDo not require that configuration file specified by -f exist if default torrc can be accessed.t7ƒC--defaults-torrc FILESpecify a file in which to find default values for Tor options. The contents of this file are overridden by those in the regular configuration file, and by those on the command line. (Default: @CONFDIR@/torrc-defaults.)R1--list-fingerprintGenerate your keys and output your nickname and fingerprint.?w--list-deprecated-optionsList all valid options that are scheduled to become obsolete in a future version. (This is a warning, not a promise.) §BJ×§.5;--list-torrc-optionsList all valid options.ˆh 5‘---keygen [--newpass]Running "tor --keygen" creates a new ed25519 master identity key for a relay, or onlu ;ƒA--passphrase-fd FILEDESFiledescriptor to read the passphrase from. Note that unlike with the tor-gencert program, the entire file contents are read and used as the passphrase, including any trailing newlines. Default: read from the terminal.ƒ; )†_--quiet|--hushOverride the default console log. By default, Tor starts out logging messages at level "notice" and higher to the console. It stops doing so after it parses its configuration, if the configuration tells it to log anywhere else. You can override this behavior with the --hush option, which tells Tor to only send warnings and errors to the console, or with the --quiet option, which tells Tor not to log to the console at all.y a fresh temporary signing key and certificate, if you already have a master key. Optionally you can encrypt the master identity key with a passphrase: Tor will ask you for one. If you don't want to encrypt the master key, just don't enter any passphrase when asked. The --newpass option should be used with --keygen only when you need to add, change, or remove a passphrase on an existing ed25519 master identity key. You will be prompted for the old passphase (if any), and the new passphrase (if any). When generating a master key, you will probably want to use --DataDirectory to control where the keys and certificates will be stored, and --SigningKeyLifetime to control their lifetimes. Their behavior is as documented in the server options section below. (You must have write access to the specified DataDirectory.) To use the generated files, you must copy them to the DataDirectory/keys directory of your Tor daemon, and make sure that they are owned by the user actually running the Tor daemon on your system. lñ l2Y-h, -helpDisplay a short help message and exit.O=u--hash-password PASSWORDGenerates a hashed password for control port access.)G--versionDisplay Tor version and exit.aq‚c--service install [--options command-line options]Install an instance of Tor as a Windows service, with the provided command-line options. Current instructions can be found at https://www.torproject.org/docs/faq#NTService <,zê>í<.S‚CacheDirectory/unverified-consensusThis file contains a network consensus document that has been downloaded, but which we didn't have the right certificates to check yet.O+@CONFDIR@/torrcThe configuration file, which contains "option value" pairs.)M‚DataDirectory/hashed-fingerprintOnly used by bridges. Holds the hashed fingerprint of the bridge's identity key. (That is, the hash of the hash of the identity key.) M_DataDirectory/stats/dirreq-statsOnly used by directory caches and authorities. This file is used to collect directory request statistics./1‚?DataDirectory/lockThis file is used to prevent two Tor instances from using same data directory. If access to this file is locked, data directory is already in use by Tor.Qg‚MCacheDirectory/unverified-microdesc-consensusThis file contains a microdescriptor-flavored network consensus document that has been downloaded, but which we didn't have the right certificates to check yet. Pg¶P‚c }„[CacheDirectory/cached-extrainfo and cached-extrainfo.newAs "cached-descriptors", but holds optionally-downloaded "extra-info" documents. Relays use these documents to send inessential information about statistics, bandwidth history, and network health to the authorities. They aren't fetched by default; see the DownloadExtraInfo option for more info..C‚+CacheDirectory/cached-certsThis file holds downloaded directory key certificates that are used to verify authenticity of documents generated by Tor directory authorities.OoKeyDirectory/ed25519_signing_certThe certificate which authenticates "ed25519_signing_secret_key" as having been signed by the Ed25519 master key. Z³ÈZl MDataDirectory/stats/buffer-statsOnly used by servers. This file is used to collect buffer usage history.‚J „#CacheDirectory/cached-microdescs and cached-microdescs.newThese files hold downloaded microdescriptors. Lines beginning with @-signs are annotations that contain more information about a given router. The ".new" file is an append-only journal; when it gets too large, all entries are merged into a new cached-microdescs file. G‚DataDirectory/v3-status-votesOnly for v3 authoritative directory servers. This file contains status votes from all the authoritative directory servers.‚J O„WDataDirectory/key-pinning-journalUsed by authorities. A line-based file that records mappings between RSA1024 identity keys and Ed25519 identity keys. Authorities enforce these mappings, so that once a relay has picked an Ed25519 key, stealing or factoring the RSA1024 key will no longer let an attacker impersonate the relay. pF¶éîp|Q9HiddenServiceDirectory/client_keysAuthorization data for a hidden service that is only accessible by authorized clients.KgKeyDirectory/legacy_certificateAs authority_certificate: used only when V3AuthUseLegacyKey is set. See documentation for V3AuthUseLegacyKey.f?DataDirectory/fingerprintOnly used by servers. Holds the fingerprint of the server's identity key.JQ‚UKeyDirectory/authority_signing_keyA v3 directory authority's signing key, used to sign votes and consensuses. Only directory authorities use this file. Corresponds to the authority_certificate cert. IcDataDirectory/approved-routersAuthorities only. This file is used to configure which relays are known to be valid, invalid, and so forth.7u‚ CacheDirectory/cached-routers and cached-routers.newObsolete versions of cached-descriptors and cached-descriptors.new. When Tor can't find the newer files, it looks here instead. %tÔ‡Û°%KWDataDirectory/stats/entry-statsOnly used by servers. This file is used to collect incoming connection statistics by Tor entry nodes.‚(S„KeyDirectory/authority_identity_keyA v3 directory authority's master identity key, used to authenticate its signing key. Tor doesn't use this while it's running. The tor-gencert program uses this. If you're running an authority, you should keep this key offline, and not actually put it here.)A‚#KeyDirectory/secret_id_keyA relay's RSA1024 permanent identity key, including private and public components. Used to sign router descriptors, and to sign other keys.K=m@LOCALSTATEDIR@/lib/tor/The tor process stores keys and other data here.I‚DataDirectory/stats/conn-statsOnly used by servers. This file is used to collect approximate connection history (number of active connections over time). I[DataDirectory/unparseable-descOnion server descriptors that Tor was unable to parse are dumped to this file. Only used for debugging. \ïÛ¾žW½Ú¡ƒ[*\éÄž‡_<‚$ÿ%ODataDirectory/control_auth_cookie/9DataDirectory/sr-state-CDataDirectory/bw_accounting,ACacheDirectory/cached-descriptors and cached-descriptors.new+$MDataDirectory/stats/bridge-stats'3DataDirectory/state("IDataDirectory/router-stability'SDataDirectory/networkstatus-bridges"1DataDirectory/lock%ODataDirectory/key-pinning-journal $MDataDirectory/hashed-fingerprint?DataDirectory/fingerprint"IDataDirectory/approved-routers0g CacheDirectory/unverified-microdesc-consensus'SCacheDirectory/unverified-consensus?CacheDirectory/diff-cache*8uCacheDirectory/cached-routers and cached-routers.new?CacheDirectory/cached-microdescs and cached-microdescs.new <}CacheDirectory/cached-extrainfo and cached-extrainfo.new FCacheDirectory/cached-consensus and/or cached-microdesc-consensus&CCacheDirectory/cached-certs=@LOCALSTATEDIR@/lib/tor/+@CONFDIR@/torrc%$HOME/.torrc Qݸ”QqO(uó*àÙŲ³™Qpw*#KKeyDirectory/legacy_signing_key0#KHiddenServiceDirectory/hostname.+[KeyDirectory/ed25519_signing_secret_key)-_KeyDirectory/ed25519_master_id_public_key%6qHiddenServiceDirectory/onion_service_non_anonymous$&QHiddenServiceDirectory/private_key#%ODataDirectory/stats/hidserv-stats!:yKeyDirectory/secret_onion_key and secret_onion_key.old-_KeyDirectory/ed25519_master_id_secret_key&QKeyDirectory/authority_certificate"IDataDirectory/stats/exit-statsE KeyDirectory/secret_onion_key_ntor and secret_onion_key_ntor.oldAKeyDirectory/secret_id_key#KKeyDirectory/legacy_certificate%OKeyDirectory/ed25519_signing_cert&QKeyDirectory/authority_signing_key'SKeyDirectory/authority_identity_key&QHiddenServiceDirectory/client_keys!GDataDirectory/v3-status-votes "IDataDirectory/unparseable-desc#KDataDirectory/stats/entry-stats$MDataDirectory/stats/dirreq-stats"IDataDirectory/stats/conn-stats K»0KbQƒKeyDirectory/authority_certificateA v3 directory authority's certificate, which authenticates the authority's current vote- and consensus-signing key using its master identity key. Only directory authorities use this file.IYDataDirectory/stats/exit-statsOnly used by servers. This file is used to collect outgoing connection statistics by Tor exit routers.‚B „KeyDirectory/secret_onion_key_ntor and secret_onion_key_ntor.oldA relay's Curve25519 short-term onion key. Used to handle modern ("ntor") circuit extension requests. The ".old" file holds the previously generated key, which the relay uses to handle any requests that were made by clients that didn't have the new one. S¯u¢SM %$HOME/.torrcFallback location for torrc, if @CONFDIR@/torrc is not found.PI‚iDataDirectory/router-stabilityOnly used by authoritative directory servers. Tracks measurements for router mean-time-between-failures so that authorities have a good idea of how to set their Stable flags.‚7y„KeyDirectory/secret_onion_key and secret_onion_key.oldA relay's RSA1024 short-term onion key. Used to decrypt old-style ("TAP") circuit extension requests. The ".old" file holds the previously generated key, which the relay uses to handle any requests that were made by clients that didn't have the new one.‚N_„OKeyDirectory/ed25519_master_id_secret_keyThe private part of a relay's Ed25519 permanent identity key. This key is used to sign the medium-term ed25519 signing key. This file can be kept offline, or kept encrypted. If so, Tor will not be able to generate new signing keys itself; you'll need to use tor --keygen yourself to do so. ~Wu ~ &CacheDirectory/cached-consensus and/or cached-microdesc-consensusThe most recent consensus network status document we've downloaded.i%_KeyDirectory/ed25519_master_id_public_keyThe public part of a relay's Ed25519 permanent identity key.$qAHiddenServiceDirectory/onion_service_non_anonymousThis file is present if a hidden service key was created in HiddenServiceNonAnonymousMode.M#Q]HiddenServiceDirectory/private_keyThe private key for this hidden service.4"S‚'DataDirectory/networkstatus-bridgesOnly used by authoritative bridge directories. Contains information about bridges that have self-reported themselves to the bridge authority.o!Oƒ!DataDirectory/stats/hidserv-statsOnly used by servers. This file is used to collect approximate counts of what fraction of the traffic is hidden service rendezvous traffic, and approximately how many hidden services the relay has seen. xj)[ƒ KeyDirectory/ed25519_signing_secret_keyThe private and public components of a relay's medium-term Ed25519 signing key. This key is authenticated by the Ed25519 master key, in turn authenticates other keys (and router descriptors).‚n(3…;DataDirectory/stateA set of persistent key-value mappings. These are documented in the file. These include: o The current entry guards and their status. o The current bandwidth accounting values. o When the file was last written o What version of Tor generated the state file o A short history of bandwidth usage, as produced in the server descriptors.'MODataDirectory/stats/bridge-statsOnly used by servers. This file is used to collect incoming connection statistics by Tor bridges. ¾y,CƒADataDirectory/bw_accountingUsed to track bandwidth accounting values (when the current period starts and ends; how much has been read and written so far this period). This file is obsolete, and the data is now stored in the 'state' file instead.ƒ++…aCacheDirectory/cached-descriptors and cached-descriptors.newThese files hold downloaded router statuses. Some routers may appear more than once; if so, the most recently published descriptor is used. Lines beginning with @-signs are annotations that contain more information about a given router. The ".new" file is an append-only journal; when it gets too large, all entries are merged into a new cached-descriptors file.‚?*?„QCacheDirectory/diff-cacheDirectory cache only. Holds older consensuses, and diffs from older consensuses to the most recent consensus of each type, compressed in various ways. Each file contains a set of key-value arguments describing its contents, followed by a single NUL byte, followed by the main file contents. ‚l“‚‚/Oƒ_DataDirectory/control_auth_cookieUsed for cookie authentication with the controller. Location can be overridden by the CookieAuthFile config option. Regenerated on startup. See control-spec.txt in torspec for details. Only used when cookie authentication is enabled.ƒV.K†sHiddenServiceDirectory/hostnameThe .onion domain name for this hidden service. If the hidden service is restricted to authorized clients only, this file also contains authorization data for all clients. Note that clients will ignore any extra subdomains prepended to a hidden service hostname. So if you have "xyz.onion" as your hostname, you can tell clients to connect to "www.xyz.onion" or "irc.xyz.onion" for virtual-hosting purposes.-9{DataDirectory/sr-stateAuthority only. State file used to record information about the current status of the shared-random-value voting state. mm0KgKeyDirectory/legacy_signing_keyAs authority_signing_key: used only when V3AuthUseLegacyKey is set. See documentation for V3AuthUseLegacyKey.he average outgoing bandwidth usage to that same value. If you want to run a relay in the public network, this needs to be at the very least 75 KBytes for a relay (that is, 600 kbits) or 50 KBytes for a bridge (400 kbits) -- but of course, more is better; we recommend at least 250 KBytes (2 mbits) if possible. (Default: 1 GByte) Note that this option, and other bandwidth-limiting options, apply to TCP data only: They do not count TCP headers or DNS traffic. With this option, and in other options that take arguments in bytes, KBytes, and so on, other formats are also supported. Notably, "KBytes" can also be written as "kilobytes" or "kb"; "MBytes" can be written as "megabytes" or "MB"; "kbits" can be written as "kilobits"; and so forth. Tor also accepts "byte" and "bit" in the singular. The prefixes "tera" and "T" are also recognized. If no units are given, we default to bytes. To avoid confusion, we recommend writing "bytes" or "bits" explicitly, since it's easy to forget that "B" means bytes, not bits. ôüô‚ ))G‚ BANDWIDTHBURSTBandwidthBurstGeneralN bytes|KBytes|MBytes|GBytes|TBytes|KBits|MBits|GBits|TBitsMaximum bandwidth usage limitLimit the maximum token bucket size (also known as the burst) to the given number of bytes in each direction. (Default: 1 GByte)‰y ''G‘yBANDWIDTHRATEBandwidthRateGeneralN bytes|KBytes|MBytes|GBytes|TBytes|KBits|MBits|GBits|TBitsAverage bandwidth usage limitA token bucket limits the average incoming bandwidth usage on this node to the specified number of bytes per second, and t öö„ 99…MAXADVERTISEDBANDWIDTHMaxAdvertisedBandwidthGeneralN bytes|KBytes|MBytes|GBytes|TBytes|KBits|MBits|GBits|TBitsLimit for the bandwidth we advertise as being available for relayingIf set, we will not advertise more than this amount of bandwidth for our BandwidthRate. Server operators who want to reduce the number of clients who ask to build circuits through them (since this is proportional to advertised bandwidth rate) can thus reduce the CPU demands on their server without impacting network performance. ~~„ 11a‡URELAYBANDWIDTHRATERelayBandwidthRateGeneralN bytes|KBytes|MBytes|GBytes|TBytes|KBits|MBits|GBits|TBitsAverage bandwidth usage limit for relayingIf not 0, a separate token bucket limits the average incoming bandwidth usage for _relayed traffic_ on this node to the specified number of bytes per second, and the average outgoing bandwidth usage to that same value. Relayed traffic currently is calculated to include answers to directory requests, but that may change in future versions. They do not include directory fetches by the relay (from authority or other relays), because that is considered "client" activity. (Default: 0) C‚> ''i‚_PERCONNBWRATEPerConnBWRateGeneralN bytes|KBytes|MBytes|GBytes|TBytes|KBits|MBits|GBits|TBitsAverage relayed bandwidth limit per connectionIf this option is set manually, or via the "perconnbwrate" consensus field, Tor will use it for separate rate limiting for each connection from a non-relay. (Default: 0)ƒ: 33a„GRELAYBANDWIDTHBURSTRelayBandwidthBurstGeneralN bytes|KBytes|MBytes|GBytes|TBytes|KBits|MBits|GBits|TBitsMaximum bandwidth usage limit for relayingIf not 0, limit the maximum token bucket size (also known as the burst) for _relayed traffic_ to the given number of bytes in each direction. They do not include directory fetches by the relay (from authority or other relays), because that is considered "client" activity. (Default: 0) ¼¼‚A ))i‚aPERCONNBWBURSTPerConnBWBurstGeneralN bytes|KBytes|MBytes|GBytes|TBytes|KBits|MBits|GBits|TBitsMaximum relayed bandwidth limit per connectionIf this option is set manually, or via the "perconnbwburst" consensus field, Tor will use it for separate rate limiting for each connection from a non-relay. (Default: 0) ÔÔ†) 77Ia‰WCLIENTTRANSPORTPLUGINClientTransportPluginGeneraltransport socks4|socks5 IP:PORT, ClientTransportPlugin transport exec path-to-binary [options]Proxy when establishing bridge connectionsIn its first form, when set along with a corresponding Bridge line, the Tor client forwards its traffic to a SOCKS-speaking proxy on "IP:PORT". (IPv4 addresses should written as-is; IPv6 addresses should be wrapped in square brackets.) It's the duty of that proxy to properly forward the traffic to the bridge. In its second form, when set along with a corresponding Bridge line, the Tor client launches the pluggable transport proxy executable in path-to-binary using options as its command-line options, and forwards its traffic to it. It's the duty of that proxy to properly forward the traffic to the bridge. _Ì_‚j ??/kƒ[SERVERTRANSPORTLISTENADDRServerTransportListenAddrGeneraltransport IP:PORTEndpoint for bridge's pluggable transport proxyWhen this option is set, Tor will suggest IP:PORT as the listening address of any pluggable transport proxy that tries to launch transport. (IPv4 addresses should written as-is; IPv6 addresses should be wrapped in square brackets.) ‚1 77[[‚]SERVERTRANSPORTPLUGINServerTransportPluginGeneraltransport exec path-to-binary [options]Proxy when servicing bridge connectionsThe Tor relay launches the pluggable transport proxy in path-to-binary using options as its command-line options, and expects to receive proxied client traffic from it. ´¬ó´‚< ;;oƒEXTORPORTCOOKIEAUTHFILEExtORPortCookieAuthFileGeneralPathLocation of the ExtORPort's authentication cookieIf set, this option overrides the default location and file name for the Extended ORPort's cookie file -- the cookie file is needed for pluggable transports to communicate through the Extended ORPort. 6 3]=EXTORPORTExtORPortGeneral[address:]port|autoEndpoint for extended ORPort connectionsOpen this port to listen for Extended ORPort connections from your pluggable transports. ‚Q 997[ƒ=SERVERTRANSPORTOPTIONSServerTransportOptionsGeneraltransport k=v k=v ...Additional arguments for bridge's proxyWhen this option is set, Tor will pass the k=v parameters to any pluggable transport proxy that tries to launch transport. (Example: ServerTransportOptions obfs45 shared-secret=bridgepasswd cache=/var/lib/tor/cache) //ƒN UU „oEXTORPORTCOOKIEAUTHFILEGROUPREADABLEExtORPortCookieAuthFileGroupReadableGeneral0|1Group read permissions for the ExtORPort's authentication cookieIf this option is set to 0, don't allow the filesystem group to read the Extended OR Port cookie file. If the option is set to 1, make the cookie file readable by the default GID. [Making the file readable by other groups is not yet implemented; let us know if you need this for some reason.] (Default: 0) ‹‹†r sŒ?CONNLIMITConnLimitGeneralNUMMinimum number of file descriptors for Tor to startThe minimum number of file descriptors that must be available to the Tor process before it will start. Tor will ask the OS for as many file descriptors as the OS will allow (you can find this by "ulimit -H -n"). If this number is less than ConnLimit, then Tor will refuse to start. Tor relays need thousands of sockets, to connect to every other relay. If you are running a private bridge, you can reduce the number of sockets that Tor uses. For example, to limit Tor to 500 sockets, run "ulimit -n 500" in a shell. Then start tor in the same shell, with ConnLimit 500. You may also need to set DisableOOSCheck 0. Unless you have severely limited sockets, you probably don't need to adjust ConnLimit itself. It has no effect on Windows, since that platform lacks getrlimit(). (Default: 1000) K™K‚K 33)yƒ-CONSTRAINEDSOCKSIZEConstrainedSockSizeGeneralN bytes|KBytesLimit for the received and transmit buffers of socketsWhen ConstrainedSockets is enabled the receive and transmit buffers for all sockets will be set to this limit. Must be a value between 2048 and 262144, in 1024 byte increments. Default of 8192 is recommended.ˆ? 11YOCONSTRAINEDSOCKETSConstrainedSocketsGeneral0|1Shrinks sockets to ConstrainedSockSizeIf set, To,ƒv ))[†KDISABLENETWORKDisableNetworkGeneral0|1Don't accept non-controller connectionsWhen this option is set, we don't listen for or accept any connections other than controller connections, and we close (and don't reattempt) any outbound connections. Controllers sometimes use this option to avoid using the network until Tor is fully configured. Tor will make still certain network-related calls (like DNS lookups) as a part of its configuration process, even if DisableNetwork is set. (Default: 0)r will tell the kernel to attempt to shrink the buffers for all sockets to the size specified in ConstrainedSockSize. This is useful for virtual servers and other environments where system level TCP buffers may be limited. If you're on a virtual server, and you encounter the "Error creating network socket: No buffer space available" message, you are likely experiencing this problem. The preferred solution is to have the admin increase the buffer pool for the host itself via /proc/sys/net/ipv4/tcp_mem or equivalent facility; this configuration option is a second-resort. The DirPort option should also not be used if TCP buffers are scarce. The cached directory requests consume additional sockets which exacerbates the problem. You should not enable this feature unless you encounter the "no buffer space available" issue. Reducing the TCP buffers affects window size for the TCP stream and will reduce throughput in proportion to round trip time on long paths. (Default: 0)set, Tor will accept connections on this port and allow those connections to control the Tor process using the Tor Control Protocol (described in control-spec.txt in torspec). Note: unless you also specify one or more of HashedControlPassword or CookieAuthentication, setting this option will cause Tor to allow any process on the local host to control it. (Setting both authentication methods means either method is sufficient to authenticate to Tor.) This option is required for many Tor controllers; most use the value of 9051. If a unix domain socket is used, you may quote the path using standard C escape sequences. Set it to "auto" to have Tor pick a port for you. (Default: 0) Recognized flags are... GroupWritable Unix domain sockets only: makes the socket get created as group-writable. WorldWritable Unix domain sockets only: makes the socket get created as world-writable. RelaxDirModeCheck Unix domain sockets only: Do not insist that the directory that holds the socket be read-restricted. 4x‰4‚R CCgƒCCONTROLSOCKETSGROUPWRITABLEControlSocketsGroupWritableGeneral0|1Group read permissions for the control socketIf this option is set to 0, don't allow the filesystem group to read and write unix sockets (e.g. ControlSocket). If the option is set to 1, make the control socket readable and writable by the default GID. (Default: 0)l ''Q‚CCONTROLSOCKETControlSocketGeneralPathSocket providing controller accessLike ControlPort, but listens on a Unix domain socket, rather than a TCP socket. 0 disables ControlSocket. (Unix and Unix-like systems only.) (Default: 0)ˆ} ##C CONTROLPORTControlPortGeneralPORT|unix:path|auto [flags]Port providing access to tor controllers (nyx, vidalia, etc)If - Å\Ń 55i„aCOOKIEAUTHENTICATIONCookieAuthenticationGeneral0|1If set, authenticates controllers via a cookieIf this option is set to 1, allow connections on the control port when the connecting process knows the contents of a file named "control_auth_cookie", which Tor will create in its data directory. This authentication method should only be used on systems with good filesystem security. (Default: 0)ƒ! 77+„CHASHEDCONTROLPASSWORDHashedControlPasswordGeneralhashed_passwordHash of the password for authenticating to the control portAllow connections on the control port if they present the password whose one-way hash is hashed_password. You can compute the hash of a password by running "tor --hash-password password". You can provide several acceptable passwords by using more than one HashedControlPassword line. d.d‚& 99y‚kCONTROLPORTWRITETOFILEControlPortWriteToFileGeneralPathPath for a file tor writes containing its control portIf set, Tor writes the address and port of any control port it opens to this address. Usable by controllers to learn the actual control port when ControlPort is set to "auto".ƒ CCu„MCOOKIEAUTHFILEGROUPREADABLECookieAuthFileGroupReadableGeneral0|1Group read permissions for the authentication cookieIf this option is set to 0, don't allow the filesystem group to read the cookie file. If the option is set to 1, make the cookie file readable by the default GID. [Making the file readable by other groups is not yet implemented; let us know if you need this for some reason.] (Default: 0)O ))WCOOKIEAUTHFILECookieAuthFileGeneralPathLocation of the authentication cookieIf set, this option overrides the default location and file name for Tor's cookie file. (See CookieAuthentication above.) dÆd‚( AAg‚sDATADIRECTORYGROUPREADABLEDataDirectoryGroupReadableGeneral0|1Group read permissions for the data directoryIf this option is set to 0, don't allow the filesystem group to read the DataDirectory. If the option is set to 1, make the DataDirectory readable by the default GID. (Default: 0)‚4 ''uƒ1DATADIRECTORYDataDirectoryGeneralDIRLocation for storing runtime data (state, keys, etc)Store working data in DIR. Can not be changed while tor is running. (Default: ~/.tor if your home directory is not /; otherwise, @LOCALSTATEDIR@/lib/tor. On Windows, the default is your ApplicationData folder.)‚7 EEmƒCONTROLPORTFILEGROUPREADABLEControlPortFileGroupReadableGeneral0|1Group read permissions for the control port fileIf this option is set to 0, don't allow the filesystem group to read the control port file. If the option is set to 1, make the control port file readable by the default GID. (Default: 0) ]0]ƒP CCi…3CACHEDIRECTORYGROUPREADABLECacheDirectoryGroupReadableGeneral0|1|autoGroup read permissions for the cache directoryIf this option is set to 0, don't allow the filesystem group to read the CacheDirectory. If the option is set to 1, make the CacheDirectory readable by the default GID. If the option is "auto", then we use the setting for DataDirectoryGroupReadable when the CacheDirectory is the same as the DataDirectory, and 0 otherwise. (Default: auto)M ))W}CACHEDIRECTORYCacheDirectoryGeneralDIRDirectory where information is cachedStore cached directory data in DIR. Can not be changed while tor is running. (Default: uses the value of DataDirectory.) …w ##5{‰FALLBACKDIRFallbackDirGeneralipv4address:port orport=port id=fingerprint [weight=num] [ipv6=[ipv6address]:orport]Fallback when unable to retrieve descriptor informationWhen we're unable to connect to any directory cache for directory info (usually because we don't know about any yet) we try a directory authority. Clients also simultaneously try a FallbackDir, to avoid hangs on client startup if a directory authority is down. Clients retry FallbackDirs more often than directory authorities, to reduce the load on the directory authorities. By default, the directory authorities are also FallbackDirs. Specifying a FallbackDir replaces Tor's default hard-coded FallbackDirs (if any). (See the DirAuthority entry for an explanation of each flag.) ‚;! 99ƒUSEDEFAULTFALLBACKDIRSUseDefaultFallbackDirsGeneral0|1Use hard-coded fallback directory authorities when neededUse Tor's default hard-coded FallbackDirs (if any). (When a FallbackDir line is present, it replaces the hard-coded FallbackDirs, regardless of the value of UseDefaultFallbackDirs.) (Default: 1) rserver. If a flag "weight=num" is given, then the directory server is chosen randomly with probability proportional to that weight (default 1.0). If a flag "v3ident=fp" is given, the dirserver is a v3 directory authority whose v3 long-term signing key has the fingerprint fp. Lastly, if an "ipv6=[ipv6address]:orport" flag is present, then the directory authority is listening for IPv6 connections on the indicated IPv6 address and OR Port. Tor will contact the authority at ipv4address to download directory documents. The provided port value is a dirport; clients ignore this in favor of the specified "orport=" value. If an IPv6 ORPort is supplied, Tor will also download directory documents at the IPv6 ORPort. If no DirAuthority line is given, Tor will use the default directory authorities. NOTE: this option is intended for setting up a private Tor network with its own directory authorities. If you use it, you will be distinguishable from other users, because you won't believe the same authorities they do.! !!T" %%kO™CDIRAUTHORITYDirAuthorityGeneral[nickname] [flags] ipv4address:port fingerprintAlternative directory authoritiesUse a nonstandard authoritative directory server at the provided address and port, with the specified key fingerprint. This option can be repeated many times, for multiple authoritative directory servers. Flags are separated by spaces, and determine what kind of an authority this directory is. By default, an authority is not authoritative for any directory style or version unless an appropriate flag is given. Tor will use this authority as a bridge authoritative directory if the "bridge" flag is set. If a flag "orport=port" is given, Tor will use the given port when opening encrypted tunnels to the di5 ÉgÉ$77kq ALTERNATEDIRAUTHORITYAlternateDirAuthorityGeneral[nickname] [flags] ipv4address:port fingerprintAlternative directory authorities (consensus only)#ƒ# ==[„cDIRAUTHORITYFALLBACKRATEDirAuthorityFallbackRateGeneralNUMRate at which to use fallback directoryWhen configured to use both directory authorities and fallback directories, the directory authorities also work as fallbacks. They are chosen with their regular weights, multiplied by this number, which should be 1.0 or less. The default is less than 1, to reduce load on authorities. (Default: 0.1)" ƒz% ==mm…?ALTERNATEBRIDGEAUTHORITYAlternateBridgeAuthorityGeneral[nickname] [flags] ipv4address:port fingerprintAlternative directory authorities (bridges only)These options behave as DirAuthority, but they replace fewer of the default directory authorities. Using AlternateDirAuthority replaces the default Tor directory authorities, but leaves the default bridge authorities in place. Similarly, AlternateBridgeAuthority replaces the default bridge authority, but leaves the directory authorities alone.$ ÅW‚5( //ƒFETCHDIRINFOEARLYFetchDirInfoEarlyGeneral0|1Keeps consensus information up to date, even if unnecessaryIf set to 1, Tor will always fetch directory information like other directory caches, even if you don't meet the normal criteria for fetching early. Normal users should leave it off. (Default: 0)'ˆG' ??DISABLEDEBUGGERATTACHMENTDisableDebuggerAttachmentGeneral0|1Limit information applications ca<„8& ))w‡3DISABLEALLSWAPDisableAllSwapGeneral0|1Locks all allocated memory so they can't be paged outIf set to 1, Tor will attempt to lock all current and future memory pages, so that memory cannot be paged out. Windows, OS X and Solaris are currently not supported. We believe that this feature works on modern Gnu/Linux distributions, and that it should work on *BSD systems (untested). This option requires that you start your Tor as root, and you should use the User option to properly reduce Tor's privileges. Can not be changed while tor is running. (Default: 0)% y'`óåÒ¾©œbH1ñ»žQÝÆ`ÕŠ³(fL8% íÕôµ¤‘qE3AUTHDIRLISTBADEXITSïE)AUTHDIRPINKEYSó;AUTHDIRGUARDBWGUARANTEEò5AUTHDIRFASTGUARANTEEñ=AUTHDIRMAXSERVERSPERADDRð)BRIDGEPASSWORDöAAUTHDIRTESTED25519LINKKEYSõ;AUTHDIRSHAREDRANDOMNESSô AAUTHDIRHASIPV6CONNECTIVITYýCCACHEDIRECTORYGROUPREADABLE)CACHEDIRECTORY#BRIDGERELAY¨ABRIDGERECORDUSAGEBYCOUNTRYÅ1BRIDGEDISTRIBUTION©9BRIDGEAUTHORITATIVEDIRä BRIDGES' BANDWIDTHRATE)BANDWIDTHBURST+AVOIDDISKWRITESK5AUTOMAPHOSTSSUFFIXESˆ7AUTOMAPHOSTSONRESOLVE‡9AUTHORITATIVEDIRECTORYÞ-AUTHDIRREJECTCCSî'AUTHDIRREJECTë/AUTHDIRINVALIDCCSí)AUTHDIRINVALIDê/AUTHDIRBADEXITCCSì)AUTHDIRBADEXITé+ASSUMEREACHABLE§1ANDROIDIDENTITYTAGD7ALTERNATEDIRAUTHORITY$=ALTERNATEBRIDGEAUTHORITY%;ALLOWNONRFC953HOSTNAMES‚ ADDRESS¦+ACCOUNTINGSTART½)ACCOUNTINGRULE¼'ACCOUNTINGMAX» ACCELNAMEI ACCELDIRJ ¶è̯–[ⲌufI- ðÝÊ­—‰t]E4$èÖ¶ŠjPuCLIECCONTROLSOCKETSGROUPWRITABLE'CONTROLSOCKET9CONTROLPORTWRITETOFILE ECONTROLPORTFILEGROUPREADABLE#CONTROLPORT#CONTACTINFOª3CONSTRAINEDSOCKSIZE1CONSTRAINEDSOCKETS+CONSENSUSPARAMSç CONNLIMIT/CONNECTIONPADDINGY;CONNDIRECTIONSTATISTICSÎ'CLIENTUSEIPV6ž'CLIENTUSEIPV47CLIENTTRANSPORTPLUGIN"GCLIENTREJECTINTERNALADDRESSES‹9CLIENTPREFERIPV6ORPORT ;CLIENTPREFERIPV6DIRPORTŸ!CLIENTONLYX1CLIENTONIONAUTHDIRg%MCLIENTDNSREJECTINTERNALADDRESSESŠ/aCLIENTBOOTSTRAPCONSENSUSMAXINPROGRESSTRIES¥9uCLIENTBOOTSTRAPCONSENSUSFALLBACKDOWNLOADINITIALDELAY£>CLIENTBOOTSTRAPCONSENSUSAUTHORITYONLYDOWNLOADINITIALDELAY¤:wCLIENTBOOTSTRAPCONSENSUSAUTHORITYDOWNLOADINITIALDELAY¢5CIRCUITSTREAMTIMEOUTW=CIRCUITSAVAILABLETIMEOUTV;CIRCUITPRIORITYHALFLIFEL3CIRCUITBUILDTIMEOUTUn retrieve about the processIf set to 1, Tor will attempt to prevent basic debugging attachment attempts by other processes. This may also keep Tor from generating core files if it crashes. It has no impact for users who wish to attach if they have CAP_SYS_PTRACE or if they are root. We believe that this feature works on modern Gnu/Linux distributions, and that it may also work on *BSD systems (untested). Some modern Gnu/Linux systems such as Ubuntu have the kernel.yama.ptrace_scope sysctl and by default enable it as an attempt to limit the PTRACE scope for all user processes by default. This feature will attempt to limit the PTRACE scope for Tor specifically - it will not attempt to alter the system wide ptrace scope as it may not even exist. If you wish to attach to Tor with a debugger such as gdb or strace you will want to set this to 0 for the duration of your debugging. Normal users should leave it on. Disabling this option while Tor is running is prohibited. (Default: 1)& E¨E‚`* ;;ƒ;FETCHHIDSERVDESCRIPTORSFetchHidServDescriptorsGeneral0|1Toggles if hidden service descriptors are fetched automatically or notIf set to 0, Tor will never fetch any hidden service descriptors from the rendezvous directories. This option is only useful if you're using a Tor controller that handles hidden service fetches for you. (Default: 1))‚U) 99{ƒIFETCHDIRINFOEXTRAEARLYFetchDirInfoExtraEarlyGeneral0|1Updates consensus information when it's first availableIf set to 1, Tor will fetch directory information before other directory caches. It will attempt to download directory information closer to the start of the consensus period. Normal users should leave it off. (Default: 0)( ¤6‚+- #MƒGHTTPPROXYHTTPProxyGeneralhost[:port]HTTP proxy for connecting to torTor will make all its directory requests through this host:port (or host:80 if port is not specified), rather than connecting directly to any directory servers. (DEPRECATED: As of 0.3.1.0-alpha you should use HTTPSProxy.),ˆM, ;;% FETCHUSELESSDESCRIPTORSFetchUselessDescriptorsGeneral0|1Toggles if relay descriptors are fetc?‚Y+ 99}ƒOFETCHSERVERDESCRIPTORSFetchServerDescriptorsGeneral0|1Toggles if the consensus is fetched automatically or notIf set to 0, Tor will never fetch any network status summaries or server descriptors from the directory servers. This option is only useful if you're using a Tor controller that handles directory fetches for you. (Default: 1)*hed when they aren't strictly necessaryIf set to 1, Tor will fetch every consensus flavor, and all server descriptors and authority certificates referenced by those consensuses, except for extra info descriptors. When this option is 1, Tor will also keep fetching descriptors, even when idle. If set to 0, Tor will avoid fetching useless descriptors: flavors that it is not using to build circuits, and authority certificates it does not trust. When Tor hasn't built any application circuits, it will go idle, and stop fetching descriptors. This option is useful if you're using a tor client with an external parser that uses a full consensus. This option fetches all documents except extrainfo descriptors, DirCache fetches and serves all documents except extrainfo descriptors, DownloadExtraInfo* fetches extrainfo documents, and serves them if DirCache is on, and UseMicrodescriptors changes the flavour of consensues and descriptors that is fetched and used for building circuits. (Default: 0)+ ¸K¸ƒ/ !!#K…HTTPSPROXYHTTPSProxyGeneralhost[:port]SSL proxy for connecting to torTor will make all its OR (SSL) connections through this host:port (or host:443 if port is not specified), via HTTP CONNECT rather than connecting directly to servers. You may want to set FascistFirewall to restrict the set of ports you might try to connect to, if your HTTPS proxy only allows connecting to certain ports..ƒ2. 99/]…HTTPPROXYAUTHENTICATORHTTPProxyAuthenticatorGeneralusername:passwordAuthentication credentials for HTTPProxyIf defined, Tor will use this username:password for Basic HTTP proxy authentication, as in RFC 2617. This is currently the only form of HTTP proxy authentication that Tor supports; feel free to submit a patch if you want it to support others. (DEPRECATED: As of 0.3.1.0-alpha you should use HTTPSProxyAuthenticator.)- ‚m0 ;;/_ƒuHTTPSPROXYAUTHENTICATORHTTPSProxyAuthenticatorGeneralusername:passwordAuthentication credentials for HTTPSProxyIf defined, Tor will use this username:password for Basic HTTPS proxy authentication, as in RFC 2617. This is currently the only form of HTTPS proxy authentication that Tor supports; feel free to submit a patch if you want it to support others./ ‡O‡E2 ###SmSOCKS4PROXYSocks4ProxyGeneralhost[:port]SOCKS 4 proxy for connecting to torTor will make all OR connections through the SOCKS 4 proxy at host:port (or host:1080 if port is not specified).1….1 E‰mSANDBOXSandboxGeneral0|1Run within a syscall sandboxIf set to 1, Tor will run securely through the use of a syscall sandbox. Otherwise the sandbox will be disabled. The option is currently an experimental feature. It only works on Linux-based operating systems, and only when Tor has been built with the libseccomp library. This option can not be changed while tor is running. When the Sandbox is 1, the following options can not be changed when tor is running: Address ConnLimit CookieAuthFile DirPortFrontPage ExtORPortCookieAuthFile Logs ServerDNSResolvConfFile Tor must remain in client or server mode (some changes to ClientOnly and ORPort are not allowed). (Default: 0)0 y>ÔÂy‚F6 99eƒAUNIXSOCKSGROUPWRITABLEUnixSocksGroupWritableGeneral0|1Group write permissions for the socks socketIf this option is set to 0, don't allow the filesystem group to read and write unix sockets (e.g. SocksPort unix:). If the option is set to 1, make the Unix socket readable and writable by the default GID. (Default: 0)5‚5 33a‚YSOCKS5PROXYPASSWORDSocks5ProxyPasswordGeneralpasswordPassword for connecting to the Socks5ProxyIf defined, authenticate to the SOCKS 5 server using username and password in accordance to RFC 1929. Both username and password must be between 1 and 255 characters.4h433a SOCKS5PROXYUSERNAMESocks5ProxyUsernameGeneralusernameUsername for connecting to the Socks5Proxy3?3 ###GmSOCKS5PROXYSocks5ProxyGeneralhost[:port]SOCKS 5 for connecting to torTor will make all OR connections through the SOCKS 5 proxy at host:port (or host:1080 if port is not specified).2 ³­ܳ‚&9 //[ƒLOGMESSAGEDOMAINSLogMessageDomainsGeneral0|1Includes a domain when logging messagesIf 1, Tor includes message domains with each log message. Every log message currently has at least one domain; most currently have exactly one. This doesn't affect controller log messages. (Default: 0)8‰F8  Y‘!LOGLogGeneral[domain,...]minSeverity[-maxSeverity] ... stderr|stdout|syslogRunlevels and location for tor loggingAs above, but select messages by range of log severity and by a set of "loggingE‚P7 ++[ƒ{KEEPALIVEPERIODKeepalivePeriodGeneralNUMRate at which to send keepalive packetsTo keep firewalls from expiring connections, send a padding keepalive cell every NUM seconds on open connections that are in use. If the connection has no open circuits, it will instead be closed after NUM seconds of idleness. (Default: 5 minutes)6 domains". Each logging domain corresponds to an area of functionality inside Tor. You can specify any number of severity ranges for a single log statement, each of them prefixed by a comma-separated list of logging domains. You can prefix a domain with ~ to indicate negation, and use * to indicate "all domains". If you specify a severity range without a list of domains, it matches all domains. This is an advanced feature which is most useful for debugging one or two of Tor's subsystems at a time. The currently recognized domains are: general, crypto, net, config, fs, protocol, mm, http, app, control, circ, rend, bug, dir, dirserv, or, edge, acct, hist, handshake, heartbeat, channel, sched, guard, consdiff, and dos. Domain names are case-insensitive. For example, "Log [handshake]debug [~net,~mm]info notice stdout" sends to stdout: all handshake messages of any severity, all info-and-higher messages from domains other than networking and memory management, and all messages of severity notice or higher.7 ÿÿƒ~: CCSw…KMAXUNPARSEABLEDESCSIZETOLOGMaxUnparseableDescSizeToLogGeneralN bytes|KBytes|MBytes|GBytes|TBytesSize of the dedicated log for unparseable descriptorsUnparseable descriptors (e.g. for votes, consensuses, routers) are logged in separate files by hash, up to the specified size in total. Note that only files logged during the lifetime of this Tor process count toward the total; this is intended to be used to debug problems without opening live servers to resource exhaustion attacks. (Default: 10 MB)9 ÀÀ„=; 33Y‡IOUTBOUNDBINDADDRESSOutboundBindAddressGeneralIPSets the IP used for connecting to torMake all outbound connections originate from the IP address specified. This is only useful when you have multiple network interfaces, and you want all of Tor's outgoing connections to use a single one. This option may be used twice, once with an IPv4 address and once with an IPv6 address. IPv6 addresses should be wrapped in square brackets. This setting will be ignored for connections to the loopback addresses (127.0.0.0/8 and ::1), and is not used for DNS requests as well.: òò„ < 77 †+OUTBOUNDBINDADDRESSOROutboundBindAddressORGeneralIPMake outbound non-exit connections originate from this addressMake all outbound non-exit (relay and other) connections originate from the IP address specified. This option overrides OutboundBindAddress for the same IP version. This option may be used twice, once with an IPv4 address and once with an IPv6 address. IPv6 addresses should be wrapped in square brackets. This setting will be ignored for connections to the loopback addresses (127.0.0.0/8 and ::1).; 4C4‚ ? --k‚_PROTOCOLWARNINGSProtocolWarningsGeneral0|1Toggles if protocol errors give warnings or notIf 1, Tor will log with severity 'warn' various cases of other parties not following the Tor specification. Otherwise, they are logged with severity 'info'. (Default: 0)>B> ucPIDFILEPidFileGeneralFILEPath for a file tor writes containing its process idOn startup, write our PID to FILE. On clean shutdown, remove FILE. Can not be changed while tor is running.=ƒu= ;;…OUTBOUNDBINDADDRESSEXITOutboundBindAddressExitGeneralIPMake outbound exit connections originate from this addressMake all outbound exit connections originate from the IP address specified. This option overrides OutboundBindAddress for the same IP version. This option may be used twice, once with an IPv4 address and once with an IPv6 address. IPv6 addresses should be wrapped in square brackets. This setting will be ignored for connections to the loopback addresses (127.0.0.0/8 and ::1).< åååƒ}A 11e†?LOGTIMEGRANULARITYLogTimeGranularityGeneralNUMlimits granularity of log message timestampsSet the resolution of timestamps in Tor's logs to NUM milliseconds. NUM must be positive and either a divisor or a multiple of 1 second. Note that this option only controls the granularity written by Tor to a file or console log. Tor does not (for example) "batch up" log messages to affect times logged by a controller, times attached to syslog messages, or the mtime fields on log files. (Default: 1 second)@‚@ ##[ƒRUNASDAEMONRunAsDaemonGeneral0|1Toggles if tor runs as a daemon processIf 1, Tor forks and daemonizes to the background. This option has no effect on Windows; instead you should use the --service command-line option. Can not be changed while tor is running. (Default: 0)? ýý‚D 11W‚wANDROIDIDENTITYTAGAndroidIdentityTagGeneraltagTag when logging to android subsystemWhen logging to Android's logging subsystem, adds a tag to the log identity such that log entries are marked with "Tor-tag". Can not be changed while tor is running. (Default: none)C‚ C //o‚SSYSLOGIDENTITYTAGSyslogIdentityTagGeneraltagTag logs appended to the syslog as being from torWhen logging to syslog, adds a tag to the syslog identity such that log entries are marked with "Tor-tag". Can not be changed while tor is running. (Default: none)B^B ++}uTRUNCATELOGFILETruncateLogFileGeneral0|1Overwrites log file rather than appending when restartedIf 1, Tor will overwrite logs at startup and in response to a HUP signal, instead of appending to them. (Default: 0)A nn,F McUSERUserGeneralUsernameUID for the process when startedOn startup, setuid to this user and setgid to their primary group. Can not be changed while tor is running.E…`E ##wŠSAFELOGGINGSafeLoggingGeneral0|1|relayToggles if logs are scrubbed of sensitive informationTor can scrub potentially sensitive strings from log messages (e.g. addresses) by replacing them with the string [scrubbed]. This way logs can still be useful, but they don't leave behind personally identifying information about what sites a user might have visited. If this option is set to 0, Tor will not perform any scrubbing, if it is set to 1, all potentially sensitive strings are replaced. If it is set to relay, all log messages generated when acting as a relay are sanitized, but all messages generated when acting as a client are not. Note: Tor may not heed this option when logging at log levels below Notice. (Default: 1)D ÿðÿnH ''u‚%HARDWAREACCELHardwareAccelGeneral0|1Toggles if tor attempts to use hardware accelerationIf non-zero, try to use built-in (static) crypto hardware acceleration when available. Can not be changed while tor is running. (Default: 0)G„ G 55o†CKEEPBINDCAPABILITIESKeepBindCapabilitiesGeneral0|1|autoRetain permission for binding to low valued portsOn Linux, when we are started as root and we switch our identity using the User option, the KeepBindCapabilities option tells us whether to try to retain our ability to bind to low ports. If this value is 1, we try to keep the capability; if it is 0 we do not; and if it is auto, we keep the capability only if we are configured to listen on a low port. Can not be changed while tor is running. (Default: auto.)F ‘¸¶‘‚"K ++mƒ AVOIDDISKWRITESAvoidDiskWritesGeneral0|1Toggles if tor avoids frequently writing to diskIf non-zero, try to write to disk less frequently than we would otherwise. This is useful when running on flash memory or other media that support only a limited number of writes. (Default: 0)JJ MƒACCELDIRAccelDirGeneralDIRCrypto acceleration library pathSpecify this option if using dynamic hardware acceleration and the engine implementation library resides somewhere other than the OpenSSL default. Can not be changed while tor is running.I‚EI cƒsACCELNAMEAccelNameGeneralNAMEOpenSSL engine name for crypto accelerationWhen using OpenSSL hardware crypto acceleration attempt to load the dynamic engine of this name. This must be used for any dynamic hardware engine. Names can be verified with the openssl engine command. Can not be changed while tor is running.H YY…$L ;;ˆICIRCUITPRIORITYHALFLIFECircuitPriorityHalflifeGeneralNUMOverwrite method for prioritizing traffic among relayed connectionsIf this value is set, we override the default algorithm for choosing which circuit's cell to deliver or relay next. It is delivered first to the circuit that has the lowest weighted cell count, where cells are weighted exponentially according to this value (in seconds). If the value is -1, it is taken from the consensus if possible else it will fallback to the default value of 30. Minimum: 1, Maximum: 2147483647. This can be defined as a float value. This is an advanced option; you generally shouldn't have to mess with it. (Default: -1)K ²ƒ*N //q…EXTENDBYED25519IDExtendByEd25519IDGeneral0|1|autoInclude Ed25519 identifier when extending circuitsIf this option is set to 1, we always try to include a relay's Ed25519 ID when telling the proceeding relay in a circuit to extend to it. If this option is set to 0, we never include Ed25519 IDs when extending circuits. If the option is set to "default", we obey a parameter in the consensus document. (Default: auto)M‚KM 77gƒMCOUNTPRIVATEBANDWIDTHCountPrivateBandwidthGeneral0|1Applies rate limiting to private IP addressesIf this option is set, then Tor's rate-limiting applies not only to remote connections, but also to connections to private addresses like 127.0.0.1 or 10.0.0.1. This is mostly useful for debugging rate-limiting. (Default: 0)L ü¹ü‹2P !!7s•SCHEDULERSSchedulersGeneralKIST|KISTLite|VanillaScheduling algorithm by which to send outbound dataSpecify the scheduler type that tor should use. The scheduler is responsible for moving data around within a Tor process. This is an ordered list by priority which means that the first value will be tried first and if unavailable, the second one is tried and so on. It is possible to change these values at runtime. This option moR‚DO ]„NOEXECNoExecGeneral0|1Prevents any launch of other executablesIf this option is set to 1, then Tor will never launch another executable, regardless of the settings of ClientTransportPlugin or ServerTransportPlugin. Once this option has been set to 1, it cannot be set back to 0 without restarting Tor. (Default: 0)Nstly effects relays, and most operators should leave it set to its default value. (Default: KIST,KISTLite,Vanilla) The possible scheduler types are: KIST: Kernel-Informed Socket Transport. Tor will use TCP information from the kernel to make informed decisions regarding how much data to send and when to send it. KIST also handles traffic in batches (see KISTSchedRunInterval) in order to improve traffic prioritization decisions. As implemented, KIST will only work on Linux kernel version 2.6.39 or higher. KISTLite: Same as KIST but without kernel support. Tor will use all the same mechanics as with KIST, including the batching, but its decisions regarding how much data to send will not be as good. KISTLite will work on all kernels and operating systems, and the majority of the benefits of KIST are still realized with KISTLite. Vanilla: The scheduler that Tor used before KIST was implemented. It sends as much data as possible, as soon as possible. Vanilla will work on all kernels and operating systems.O o–(o6T ==iLEARNCIRCUITBUILDTIMEOUTLearnCircuitBuildTimeoutClient0|1Toggles adaptive timeouts for circuit creationIf 0, CircuitBuildTimeout adaptive learning is disabled. (Default: 1)SˆIS S/BRIDGEBridgeClient[transport] IP:ORPort [fingerprint]Available bridgesWhen set along with UseBThR 77g‚KISTSOCKBUFSIZEFACTORKISTSockBufSizeFactorGeneralNUMMultiplier for per-socket limit if using KISTIf KIST is used in Schedulers, this is a multiplier of the per-socket limit calculation of the KIST algorithm. (Default: 1.0)Q‚|Q 55O„AKISTSCHEDRUNINTERVALKISTSchedRunIntervalGeneralNUM msecScheduling interval if using KISTIf KIST or KISTLite is used in the Schedulers option, this controls at which interval the scheduler tick is. If the value is 0 msec, the value is taken from the consensus if possible else it will fallback to the default 10 msec. Maximum possible value is 100 msec. (Default: 0 msec)Pridges, instructs Tor to use the relay at "IP:ORPort" as a "bridge" relaying into the Tor network. If "fingerprint" is provided (using the same format as for DirAuthority), we will verify that the relay running at that location has the right fingerprint. We also use fingerprint to look up the bridge descriptor at the bridge authority, if it's provided and if UpdateBridgesFromAuthority is set too. If "transport" is provided, it must match a ClientTransportPlugin line. We then use that pluggable transport's proxy to transfer data to the bridge, rather than connecting to the bridge directly. Some transports use a transport-specific method to work out the remote address to connect to. These transports typically ignore the "IP:ORPort" specified in the bridge line. Tor passes any "key=val" settings to the pluggable transport proxy as per-connection arguments when connecting to the bridge. Consult the documentation of the pluggable transport for details of what arguments it supports.R ¥%X‰iO=áò•‡xkU?,ûæÙ¼|Xw[à#þ¸D)ðßÑÁœµ¥{"GDOSCIRCUITCREATIONDEFENSETYPE(SDOSCIRCUITCREATIONDEFENSETIMEPERIOD'QDOSREFUSESINGLEHOPCLIENTRENDEZVOUS=DOSCONNECTIONDEFENSETYPE$KDOSCONNECTIONMAXCONCURRENTCOUNT5DOSCONNECTIONENABLED'DATADIRECTORY7COUNTPRIVATEBANDWIDTHMCCOOKIEAUTHFILEGROUPREADABLE)COOKIEAUTHFILE$KEXITPOLICYREJECTLOCALINTERFACES®!EXITPOLICY¬ EXITNODES^%EXCLUDENODES[-EXCLUDEEXITNODES\+ENTRYSTATISTICSÌ!ENTRYNODES_9ENFORCEDISTINCTSUBNETSn/DOWNLOADEXTRAINFOŒ9DOSCIRCUITCREATIONRATE%MDOSCIRCUITCREATIONMINCONNECTIONS?DOSCIRCUITCREATIONENABLED ;DOSCIRCUITCREATIONBURST DNSPORT‰+DISABLEOOSCHECKÓ)DISABLENETWORK?DISABLEDEBUGGERATTACHMENT')DISABLEALLSWAP&-DIRREQSTATISTICSË-DIRPORTFRONTPAGEÙ DIRPORTÚDIRPOLICYÛ DIRCACHEÜ=DIRAUTHORITYFALLBACKRATE#%DIRAUTHORITY"=DIRALLOWPRIVATEADDRESSESèADATADIRECTORYGROUPREADABLE nnƒU 33U„qCIRCUITBUILDTIMEOUTCircuitBuildTimeoutClientNUMInitial timeout for circuit creationTry for at most NUM seconds when building circuits. If the circuit isn't open in that time, give up on it. If LearnCircuitBuildTimeout is 1, this value serves as the initial value to use before a timeout is learned. If LearnCircuitBuildTimeout is 0, this value is the only value used. (Default: 60 seconds)T 5•5‚]W 55cƒ{CIRCUITSTREAMTIMEOUTCircuitStreamTimeoutClientNUMTimeout for shifting streams among circuitsIf non-zero, this option overrides our internal timeout schedule for how many seconds until we detach a stream from a circuit and try a new circuit. If your network is particularly slow, you might want to set this to a number like 60. (Default: 0)V„hV ==_ˆCIRCUITSAVAILABLETIMEOUTCircuitsAvailableTimeoutClientNUMTime to keep circuits open and unused forTor will attempt to keep at least one open, unused circuit available for this amount of time. This option governs how long idle circuits are kept open, as well as the amount of time Tor will keep a circuit open to each of the recently used ports. This way when the Tor client is entirely idle, it can expire all of its circuits, and then expire its TLS connections. Note that the actual timeout value is uniformly randomized from the specified value to twice that amount. (Default: 30 minutes; Max: 24 hours)U ïï„X !!†eCLIENTONLYClientOnlyClient0|1Ensures that we aren't used as a relay or directory mirrorIf set to 1, Tor will not run as a relay or serve directory requests, even if the ORPort, ExtORPort, or DirPort options are set. (This config option is mostly unnecessary: we added it back when we were considering having Tor clients auto-promote themselves to being relays if they were stable and fast enough. The current behavior is simply that Tor is a client unless ORPort, ExtORPort, or DirPort are configured.) (Default: 0)W ¬ƒZ ==„REDUCEDCONNECTIONPADDINGReducedConnectionPaddingClient0|1Reduce padding and increase circuit cycling for low bandidth connectionsIf set to 1, Tor will not not hold OR connections open for very long, and will send less padding on these connections. Only clients may set this option. This option should be offered via the UI to mobile users for use where bandwidth may be expensive. (Default: 0)Y„QY //k‡]CONNECTIONPADDINGConnectionPaddingClient0|1|autoPad traffic to help prevent correlation attacksThis option governs Tor's use of padding to defend against some forms of traffic analysis. If it is set to auto, Tor will send padding only if both the client and the relay support it. If it is set to 0, Tor will not send any padding cells. If it is set to 1, Tor will still send padding for client connections regardless of relay support. Only clients may set this option. This option should be offered via the UI to mobile users for use where bandwidth may be expensive. (Default: auto)X ISO3166 codes, and must be wrapped in braces; fingerprints may be preceded by a dollar sign. (Example: ExcludeNodes ABCD1234CDEF5678ABCD1234CDEF5678ABCD1234, {cc}, 255.254.0.0/8) By default, this option is treated as a preference that Tor is allowed to override in order to keep working. For example, if you try to connect to a hidden service, but you have excluded all of the hidden service's introduction points, Tor will connect to one of them anyway. If you do not want this behavior, set the StrictNodes option (documented below). Note also that if you are a relay, this (and the other node selection options below) only affects your own circuits that Tor builds for you. Clients can still build circuits through you to any node. Controllers can tell Tor to build circuits through any node. Country codes are case-insensitive. The code "{??}" refers to nodes whose country can't be identified. No country code, including {??}, works if no GeoIPFile can be loaded. See also the GeoIPExcludeUnknown option below.Z  „ \ --'e†MEXCLUDEEXITNODESExcludeExitNodesClientnode,node,...Relays or locales never to be used for exitsA list of identity fingerprints, country codes, and address patterns of nodes to never use when picking an exit node---that is, a node that delivers traffic for you outside the Tor network. Note that any node listed in ExcludeNodes is automatically considered to be part of this list too. See the ExcludeNodes option for more information on how to specify nodes. See also the caveats on the "ExitNodes" option below.[‰h[ %%'i’EXCLUDENODESExcludeNodesClientnode,node,...Relays or locales never to be used in circuitsA list of identity fingerprints, country codes, and address patterns of nodes to avoid when building a circuit. Country codes are 2-letterZ põpˆz^ 'McEXITNODESExitNodesClientnode,node,...Preferred final hop for circuitsA list of identity fingerprints, country codes, ]„] 33s†;GEOIPEXCLUDEUNKNOWNGeoIPExcludeUnknownClient0|1|autoDon't use relays with an unknown locale in circuitsIf this option is set to auto, then whenever any country code is set in ExcludeNodes or ExcludeExitNodes, all nodes with unknown country ({??} and possibly {A1}) are treated as excluded as well. If this option is set to 1, then all unknown countries are treated as excluded in ExcludeNodes and ExcludeExitNodes. This option has no effect when a GeoIP file isn't configured or can't be found. (Default: auto)\and address patterns of nodes to use as exit node---that is, a node that delivers traffic for you outside the Tor network. See the ExcludeNodes option for more information on how to specify nodes. Note that if you list too few nodes here, or if you exclude too many exit nodes with ExcludeExitNodes, you can degrade functionality. For example, if none of the exits you list allows traffic on port 80 or 443, you won't be able to browse the web. Note also that not every circuit is used to deliver traffic outside of the Tor network. It is normal to see non-exit circuits (such as those used to connect to hidden services, those that do directory fetches, those used for relay reachability self-tests, and so on) that end at a non-exit node. To keep a node from being used entirely, see ExcludeNodes and StrictNodes. The ExcludeNodes option overrides this option: any node listed in both ExitNodes and ExcludeNodes is treated as excluded. The .exit address notation, if enabled via MapAddress, overrides this option.] ™™„d_ !!'Oˆ1ENTRYNODESEntryNodesClientnode,node,...Preferred first hops for circuitsA list of identity fingerprints and country codes of nodes to use for the first hop in your normal circuits. Normal circuits include all circuits except for direct connections to directory servers. The Bridge option overrides this option; if you have configured bridges and UseBridges is 1, the Bridges are used as your entry nodes. The ExcludeNodes option overrides this option: any node listed in both EntryNodes and ExcludeNodes is treated as excluded. See the ExcludeNodes option for more information on how to specify nodes.^ ââ†` ##c‹STRICTNODESStrictNodesClient0|1Never uses notes outside of Entry/ExitNodesIf StrictNodes is set to 1, Tor will treat solely the ExcludeNodes option as a requirement to follow for all the circuits you generate, even if doing so will break functionality for you (StrictNodes applies to neither ExcludeExitNodes nor to ExitNodes). If StrictNodes is set to 0, Tor will still try to avoid nodes in the ExcludeNodes list, but it will err on the side of avoiding unexpected errors. Specifically, StrictNodes 0 tells Tor that it is okay to use an excluded node when it is necessary to perform relay reachability self-tests, connect to a hidden service, provide a hidden service to a client, fulfill a .exit request, upload directory information, or download directory information. (Default: 0)_ ,,,}b ''G‚oFIREWALLPORTSFirewallPortsClientPORTSPorts used by FascistFirewallA list of ports that your firewall allows you to connect to. Only used when FascistFirewall is set. This option is deprecated; use ReachableAddresses instead. (Default: 80, 443)aƒQa ++k…oFASCISTFIREWALLFascistFirewallClient0|1Only make outbound connections on FirewallPortsIf 1, Tor will only create outgoing connections to ORs running on ports that your firewall allows (defaults to 80 and 443; see FirewallPorts). This will allow you to run Tor as a client behind a firewall with restrictive policies, but will not allow you to run as a server behind such a firewall. If you prefer more fine-grained control, use ReachableAddresses instead.` ¯¯„Nc 113Y‡OREACHABLEADDRESSESReachableAddressesClientIP[/MASK][:PORT]...Rules for bypassing the local firewallA comma-separated list of IP addresses and ports that your firewall allows you to connect to. The format is as for the addresses in ExitPolicy, except that "accept" is understood unless "reject" is explicitly provided. For example, 'ReachableAddresses 99.0.0.0/8, reject 18.0.0.0/8:80, accept *:80' means that your firewall allows connections to everything inside net 99, rejects port 80 connections to net 18, and accepts connections to port 80 otherwise. (Default: 'accept *:*'.)b ƒmd 773…WREACHABLEDIRADDRESSESReachableDirAddressesClientIP[/MASK][:PORT]...Rules for bypassing the local firewall (directory fetches)Like ReachableAddresses, a list of addresses and ports. Tor will obey these restrictions when fetching directory information, using standard HTTP GET requests. If not set explicitly then the value of ReachableAddresses is used. If HTTPProxy is set then these connections will go through that proxy. (DEPRECATED: This option has had no effect for some time.)c …xe 553{‰yREACHABLEORADDRESSESReachableORAddressesClientIP[/MASK][:PORT]...Rules for bypassing the local firewall (OR connections)Like ReachableAddresses, a list of addresses and ports. Tor will obey these restrictions when connecting to Onion Routers, using TLS/SSL. If not set explicitly then the value of ReachableAddresses is used. If HTTPSProxy is set then these connections will go through that proxy. The separation between ReachableORAddresses and ReachableDirAddresses is only interesting when you are connecting through proxies (see HTTPProxy and HTTPSProxy). Most proxies limit TLS connections (which Tor uses to connect to Onion Routers) to port 443, and some limit HTTP GET requests (which Tor uses for fetching directory information) to port 80.d \\…!f ##]ˆ7HIDSERVAUTHHidServAuthClientonion-address auth-cookie [service-name]Authentication credentials for connecting to a hidden serviceClient authorization for a hidden service. Valid onion addresses contain 16 characters in a-z2-7 plus ".onion", and valid auth cookies contain 22 characters in A-Za-z0-9+/. The service name is only used for internal purposes, e.g., for Tor controllers. This option may be used multiple times for different hidden services. If a hidden service uses authorization and this option is not set, the hidden service is not accessible. Hidden services can be configured to require authorization using the HiddenServiceAuthorizeClient option.e 11ƒLg 11q…QCLIENTONIONAUTHDIRClientOnionAuthDirClientpathPath containing hidden service authorization filesPath to the directory containing the hidden service authorization file. The files MUST have the suffix ".auth_private". Each file is for a single onion address and their format is: :descriptor:x25519: The MUST NOT have the ".onion" suffix. See the rend-spec-v3.txt Appendix G for more information.f ÅÅ„8h ))Y‡OLONGLIVEDPORTSLongLivedPortsClientPORTSPorts requiring highly reliable relaysA list of ports for services that tend to have long-running connections (e.g. chat and interactive shells). Circuits for streams that use these ports will contain only high-uptime nodes, to reduce the chance that a node will go down before the stream is finished. Note that the list is also honored for circuits (both client and service side) involving hidden services whose virtual port is in this list. (Default: 21, 22, 706, 1863, 5050, 5190, 5222, 5223, 6523, 6667, 6697, 8300)g part of the directive.) You can also redirect all subdomains of a domain to a single address. For example, "MapAddress *.example.com www.example.com". NOTES: 1. When evaluating MapAddress expressions Tor stops when it hits the most recently added expression that matches the requested address. So if you have the following in your torrc, www.torproject.org will map to 1.1.1.1: MapAddress www.torproject.org 2.2.2.2 MapAddress www.torproject.org 1.1.1.1 2. Tor evaluates the MapAddress configuration until it finds no matches. So if you have the following in your torrc, www.torproject.org will map to 2.2.2.2: MapAddress 1.1.1.1 2.2.2.2 MapAddress www.torproject.org 1.1.1.1 3. The following MapAddress expression is invalid (and will be ignored) because you cannot map from a specific address to a wildcard address: MapAddress www.torproject.org *.torproject.org.torserver.exit 4. Using a wildcard to match only part of a string (as in *ample.com) is also invalid.h ƒ<ƒ6j --s-NEWCIRCUITPERIODNewCircuitPeriodClientNUMPeriod for considering the creation of new circuitsEvery NUM seconds consider whether to build a new circuit. (Default: 30 seconds)i9i !!1S™MMAPADDRESSMapAddressClientaddress newaddressAlias mappings for address requestsWhen a request for address arrives to Tor, it will transform to newaddress before processing it. For example, if you always want connections to www.example.com to exit via torserver (where torserver is the fingerprint of the server), use "MapAddress www.example.com www.example.com.torserver.exit". If the value is prefixed with a "*.", matches an entire domain. For example, if you always want connections to example.com and any if its subdomains to exit via torserver (where torserver is the fingerprint of the server), use "MapAddress *.example.com *.example.com.torserver.exit". (Note the leading "*." in eachg ›䛂Fl ==yƒ'MAXCLIENTCIRCUITSPENDINGMaxClientCircuitsPendingClientNUMNumber of circuits that can be in construction at onceDo not allow more than NUM circuits to be pending at a time for handling client streams. A circuit is pending if we have begun constructing it, but it has not yet been completely constructed. (Default: 32)k„k 33_†{MAXCIRCUITDIRTINESSMaxCircuitDirtinessClientNUMDuration for reusing constructed circuitsFeel free to reuse a circuit that was first used at most NUM seconds ago, but never attach a new stream to a circuit that is too old. For hidden services, this applies to the last time a circuit was used, not the first. Circuits with streams constructed with SOCKS authentication via SocksPorts that have KeepAliveIsolateSOCKSAuth also remain alive for MaxCircuitDirtiness seconds after carrying the last such stream. (Default: 10 minutes)j hžh‚3n 99 ‚sENFORCEDISTINCTSUBNETSEnforceDistinctSubnetsClient0|1Prevent use of multiple relays from the same subnet on a circuitIf 1, Tor will not put two servers whose IP addresses are "too close" on the same circuit. Currently, two addresses are "too close" if they lie in the same /16 range. (Default: 1)m„_m !!'YˆNODEFAMILYNodeFamilyClientnode,node,...Define relays as belonging to a familyThe Tor servers, defined by their identity fingerprints, constitute a "family" of similar or co-administered servers, so never use any two of them in the same circuit. Defining a NodeFamily is only needed when a server doesn't list the family itself (with MyFamily). This option can be used multiple times; each instance defines a separate family. In addition to nodes, you can also list IP address and ranges and country codes in {curly braces}. See the ExcludeNodes option for more information on how to specify nodes.lle can be specified multiple times to bind to multiple addresses/ports. If a unix domain socket is used, you may quote the path using standard C escape sequences. (Default: 9050) NOTE: Although this option allows you to specify an IP address other than localhost, you should do so only with extreme caution. The SOCKS protocol is unencrypted and (as we use it) unauthenticated, so exposing it in this way could leak your information to anybody watching your network, and allow anybody to use your computer as an open proxy. The isolation flags arguments give Tor rules for which streams received on this SocksPort are allowed to share circuits with one another. Recognized isolation flags are: IsolateClientAddr Don't share circuits with streams from a different client address. (On by default and strongly recommended when supported; you can disable it with NoIsolateClientAddr. Unsupported and force-disabled when using Unix domain sockets.) IsolateSOCKSAuth Don't share circuits with streams for which diffmerent SOCKS authentication was provided. (For HTTPTunnelPort connections, this option looks at the Proxy-Authorization and X-Tor-Stream-Isolation headers. On by default; you can disable it with NoIsolateSOCKSAuth.) IsolateClientProtocol Don't share circuits with streams using a different protocol. (SOCKS 4, SOCKS 5, TransPort connections, NATDPort connections, and DNSPort requests are all considered to be different protocols.) IsolateDestPort Don't share circuits with streams targeting a different destination port. IsolateDestAddr Don't share circuits with streams targeting a different destination address. KeepAliveIsolateSOCKSAuth If IsolateSOCKSAuth is enabled, keep alive circuits while they have at least one stream with SOCKS authentication active. After such a circuit is idle for more than MaxCircuitDirtiness seconds, it can be closed. SessionGroup=INT If no other isolation rules would prevent it, allow streams on this port to share circuits with streams from every other port nwith the same session group. (By default, streams received on different SocksPorts, TransPorts, etc are always isolated from one another. This option overrides that behavior.) Other recognized flags for a SocksPort are: NoIPv4Traffic Tell exits to not connect to IPv4 addresses in response to SOCKS requests on this connection. IPv6Traffic Tell exits to allow IPv6 addresses in response to SOCKS requests on this connection, so long as SOCKS5 is in use. (SOCKS4 can't handle IPv6.) PreferIPv6 Tells exits that, if a host has both an IPv4 and an IPv6 address, we would prefer to connect to it via IPv6. (IPv4 is the default.) NoDNSRequest Do not ask exits to resolve DNS addresses in SOCKS5 requests. Tor will connect to IPv4 addresses, IPv6 addresses (if IPv6Traffic is set) and .onion addresses. NoOnionTraffic Do not connect to .onion addresses in SOCKS5 requests. OnionTrafficOnly Tell the tor client to only connect to .onion addresses in response to SOCKS5 requests on this connectiono. This is equivalent to NoDNSRequest, NoIPv4Traffic, NoIPv6Traffic. The corresponding NoOnionTrafficOnly flag is not supported. CacheIPv4DNS Tells the client to remember IPv4 DNS answers we receive from exit nodes via this connection. CacheIPv6DNS Tells the client to remember IPv6 DNS answers we receive from exit nodes via this connection. GroupWritable Unix domain sockets only: makes the socket get created as group-writable. WorldWritable Unix domain sockets only: makes the socket get created as world-writable. CacheDNS Tells the client to remember all DNS answers we receive from exit nodes via this connection. UseIPv4Cache Tells the client to use any cached IPv4 DNS answers we have when making requests via this connection. (NOTE: This option, or UseIPv6Cache or UseDNSCache, can harm your anonymity, and probably won't help performance as much as you might expect. Use with care!) UseIPv6Cache Tells the client to use any cached IPv6 DNS answers we have when making requests via this connection. UseDNSCache Tells the client to use any cached DNS answers we have when making requests via this connection. PreferIPv6Automap When serving a hostname lookup request on this port that should get automapped (according to AutomapHostsOnResolve), if we could return either an IPv4 or an IPv6 answer, prefer an IPv6 answer. (On by default.) PreferSOCKSNoAuth Ordinarily, when an application offers both "username/password authentication" and "no authentication" to Tor via SOCKS5, Tor selects username/password authentication so that IsolateSOCKSAuth can work. This can confuse some applications, if they offer a username/password combination then get confused when asked for one. You can disable this behavior, so that Tor will select "No authentication" when IsolateSOCKSAuth is disabled, or when this option is set. Flags are processed left to right. If flags conflict, the last flag on the line is used, and all earlier flags are ignored. No error is issued for conflicting flags.n A¨HA‚q %%‚CSOCKSTIMEOUTSocksTimeoutClientNUMTime until idle or unestablished socks connections are closedLet a socks connection wait NUM seconds handshaking, and NUM seconds unattached waiting for an appropriate circuit, before we fail it. (Default: 2 minutes)p‚]p ##/M„SOCKSPOLICYSocksPolicyClientpolicy,policy,...Access policy for the pocks portSet an entrance policy for this server, to limit who can connect to the SocksPort and DNSPort ports. The policies have the same form as exit policies below, except that port specifiers are ignored. Any address not matched by some entry in the policy is accepted.oª=o {SÓSOCKSPORTSocksPortClient[address:]port|unix:path|auto [flags] [isolation flags]Port for using tor as a Socks proxyOpen this port to listen for connections from SOCKS-speaking applications. Set this to 0 if you don't want to allow application connections via SOCKS. Set it to "auto" to have Tor pick a port for you. This directivk nn…r ??/‡{TOKENBUCKETREFILLINTERVALTokenBucketRefillIntervalClientNUM [msec|second]Frequency at which exhausted connections are checked for new trafficSet the refill delay interval of Tor's token bucket to NUM milliseconds. NUM must be between 1 and 1000, inclusive. When Tor is out of bandwidth, on a connection or globally, it will wait up to this long before it tries to use that connection again. Note that bandwidth limits are still expressed in bytes per second: this option only affects the frequency with which Tor checks to see whether previously exhausted connections may read again. Can not be changed while tor is running. (Default: 100 msec)q µµ†Hs ))-‹TRACKHOSTEXITSTrackHostExitsClienthost,.domain,...Maintains use of the same exit whenever connecting to this destinationFor each value in the comma separated list, Tor will track recent connections to hosts that match this value and attempt to reuse the same exit node for each. If the value is prepended with a '.', it is treated as matching an entire domain. If one of the values is just a '.', it means match everything. This option is useful if you frequently connect to sites that will expire all your authentication cookies (i.e. log you out) if your IP address changes. Note that this option does have the disadvantage of making it more clear that a given history is associated with a single user. However, most people who would wish to observe this will observe it through cookies or other protocol-specific means anyhow.r ¥î“¥kv !!I‚YUSEBRIDGESUseBridgesClient0|1Make use of configured bridgesWhen set, Tor will fetch descriptors for each bridge listed in the "Bridge" config lines, and use these relays as both entry guards and directory guards. (Default: 0)u‚Xu AA}ƒ?UPDATEBRIDGESFROMAUTHORITYUpdateBridgesFromAuthorityClient0|1Toggles fetching bridge descriptors from the authoritiesWhen set (along with UseBridges), Tor will try to fetch bridge descriptors from the configured bridge authorities when feasible. It will fall back to a direct request if the authority responds with a 404. (Default: 0)t‚t 55i‚YTRACKHOSTEXITSEXPIRETrackHostExitsExpireClientNUMTime until use of an exit for tracking expiresSince exit servers go up and down, it is desirable to expire the association between host and exit server after NUM seconds. The default is 1800 seconds (30 minutes).s 5‚x //{‚]GUARDFRACTIONFILEGuardfractionFileClientFILENAMEFile containing information with duration of our guardsV3 authoritative directories only. Configures the location of the guardfraction file which contains information about how long relays have been guards. (Default: unset)wƒHw ))I†USEENTRYGUARDSUseEntryGuardsClient0|1Use guard relays for first hopIf this option is set to 1, we pick a few long-term entry servers, and try to stick with them. This is desirable because constantly changing servers increases the odds that an adversary who owns some servers will observe a fraction of your paths. Entry Guards can not be used by Directory Authorities or Single Onion Services. In these cases, this option is ignored. (Default: 1)v -¢-‚rz ))c„=NUMENTRYGUARDSNumEntryGuardsClientNUMPool size of guard relays we'll select fromIf UseEntryGuards is set to 1, we will try to pick a total of NUM routers as long-term entries for our circuits. If NUM is 0, we try to learn the number from the guard-n-primary-guards-to-use consensus parameter, and default to 1 if the consensus parameter isn't set. (Default: 0)y‚[y --qƒoUSEGUARDFRACTIONUseGuardFractionClient0|1|autoTake guardfraction into account for path selectionThis option specifies whether clients should use the guardfraction information found in the consensus during path selection. If it's set to auto, clients will do what the UseGuardFraction consensus parameter tells them to do. (Default: auto)x »=»‚| 11k„?NUMDIRECTORYGUARDSNumDirectoryGuardsClientNUMPool size of directory guards we'll select fromIf UseEntryGuards is set to 1, we try to make sure we have at least NUM routers to use as directory guards. If this option is set to 0, use the value from the guard-n-primary-dir-guards-to-use consensus parameter, and default to 3 if the consensus parameter isn't set. (Default: 0){ƒ@{ -- …)NUMPRIMARYGUARDSNumPrimaryGuardsClientNUMPool size of strongly preferred guard relays we'll select fromIf UseEntryGuards is set to 1, we will try to pick NUM routers for our primary guard list, which is the set of routers we strongly prefer when connecting to the Tor network. If NUM is 0, we try to learn the number from the guard-n-primary-guards consensus parameter, and default to 3 if the consensus parameter isn't set. (Default: 0)z Šƒ~ {„USAFESOCKSSafeSocksClient0|1Toggles rejecting unsafe variants of the socks protocolWhen this option is enabled, Tor will reject application connections that use unsafe variants of the socks protocol -- ones that only provide an IP address, meaning the application is doing a DNS resolve first. Specifically, these are socks4 and socks5 when not doing remote DNS. (Default: 0)}‚s} ''3O„7GUARDLIFETIMEGuardLifetimeClientN days|weeks|monthsMinimum time to keep entry guardsIf nonzero, and UseEntryGuards is set, minimum time to keep a guard before picking a new one. If zero, we use the GuardLifetime parameter from the consensus directory. No value here may be less than 1 month or greater than 5 years; out-of-range values are clamped. (Default: 0)| ZPÉZ‡{ 991}uVIRTUALADDRNETWORKIPV6VirtualAddrNetworkIPv6Client[IPv6Address]/bitsIPv6 address range to use z99-} VIRTUALADDRNETWORKIPV4VirtualAddrNetworkIPv4ClientIPv4Address/bitsIPv4 address range to use when needing a virtual addressƒ- #…TESTSOCKSTestSocksClient0|1Provide notices for if socks connections are of the safe or unsafe variantsWhen this option is enabled, Tor will make a notice-level log entry for each connection to the Socks port indicating whether the request used a safe socks protocol or an unsafe one (see above entry on SafeSocks). This helps to determine whether an application using Tor is possibly leaking DNS requests. (Default: 0)~ šiíÞ½§Ò¶tdP„iN3èÙȲ Žt_;àôæË¼ Œ~jˆuf(SHIDDEN9FETCHDIRINFOEXTRAEARLY)/FETCHDIRINFOEARLY(j /EXTENDBYED25519IDN CEXTENDALLOWPRIVATEADDRESSESÑEXITRELAY«1EXITPORTSTATISTICSÍ'FIREWALLPORTSb;FETCHUSELESSDESCRIPTORS,9FETCHSERVERDESCRIPTORS+;FETCHHIDSERVDESCRIPTORS*æ+FASCISTFIREWALLa#FALLBACKDIR 3EXTRAINFOSTATISTICSÐ(UEXTORPORTCOOKIEAUTHFILEGROUPREADABLE;EXTORPORTCOOKIEAUTHFILE EXTORPORT "GHIDDENSERVICEDIRGROUPREADABLE -HIDDENSERVICEDIRÿ!EHIDDENSERVICEAUTHORIZECLIENT#IHIDDENSERVICEALLOWUNKNOWNPORTS+HEARTBEATPERIOD¹7HASHEDCONTROLPASSWORD'HARDWAREACCELH'GUARDLIFETIME}/GUARDFRACTIONFILEx#GEOIPV6FILEÈGEOIPFILEÇ3GEOIPEXCLUDEUNKNOWN]when needing a virtual addressWhen Tor needs to assign a virtual (unused) address because of a MAPADDRESS command from the controller or the AutomapHostsOnResolve feature, Tor picks an unassigned address from this range. (Defaults: 127.192.0.0/10 and [FE80::]/10 respectively.) When providing proxy server service to a network of computers using a tool like dns-proxy-tor, change the IPv4 network to "10.192.0.0/10" or "172.16.0.0/12" and change the IPv6 network to "[FC00::]/7". The default VirtualAddrNetwork address ranges on a properly configured machine will route to the loopback or link-local interface. The maximum number of bits for the network prefix is set to 104 for IPv6 and 16 for IPv4. However, a wider network - smaller prefix length o is preferable since it reduces the chances for an attacker to guess the used IP. For local use, no change to the default VirtualAddrNetwork setting is needed.€ Ÿ›Ÿƒx ))Wo…wHTTPTUNNELPORTHTTPTunnelPortClient[address:]port|auto [isolation flags]Port on which to allow 'HTTP CONNECT' connectionsOpen this port to listen for proxy connections using the "HTTP CONNECT" protocol instead of SOCKS. Set this to 0 if you don't want to allow "HTTP CONNECT" connections. Set the port to "auto" to have Tor pick a port for you. This directive can be specified multiple times to bind to multiple addresses/ports. See SOCKSPort for an explanation of isolation flags. (Default: 0)‚‚a ;;ƒUALLOWNONRFC953HOSTNAMESAllowNonRFC953HostnamesClient0|1Toggles blocking invalid characters in hostname resolutionWhen this option is disabled, Tor blocks hostnames containing illegal characters (like @ and :) rather than sending them to an exit node to be resolved. This helps trap accidental attempts to resolve URLs and so on. (Default: 0) Ð?Ј( ))G7TRANSPROXYTYPETransProxyTypeClientdefault|TPROXY|ipfw|pf-divertProxy type to be usedTransProxy}…= Ws‰TRANSPORTTransPortClient[address:]port|auto [isolation flags]Port for transparent proxying if the OS supports itOpen this port to listen for transparent proxy connections. Set this to 0 if you don't want to allow transparent proxy connections. Set the port to "auto" to have Tor pick a port for you. This directive can be specified multiple times to bind to multiple addresses/ports. See SOCKSPort for an explanation of isolation flags. TransPort requires OS support for transparent proxies, such as BSDs' pf or Linux's IPTables. If you're planning to use Tor as a transparent proxy for a network, you'll want to examine and change VirtualAddrNetwork from the default setting. (Default: 0)ƒType may only be enabled when there is transparent proxy listener enabled. Set this to "TPROXY" if you wish to be able to use the TPROXY Linux module to transparently proxy connections that are configured using the TransPort option. Detailed information on how to configure the TPROXY feature can be found in the Linux kernel source tree in the file Documentation/networking/tproxy.txt. Set this option to "ipfw" to use the FreeBSD ipfw interface. On *BSD operating systems when using pf, set this to "pf-divert" to take advantage of divert-to rules, which do not modify the packets like rdr-to rules do. Detailed information on how to configure pf to use divert-to rules can be found in the pf.conf(5) manual page. On OpenBSD, divert-to is available to use on versions greater than or equal to OpenBSD 4.4. Set this to "default", or leave it unconfigured, to use regular IPTables on Linux, or to use pf rdr-to rules on *BSD systems. (Default: "default")„ ÉÉ„3 W_‡NATDPORTNATDPortClient[address:]port|auto [isolation flags]Port for forwarding ipfw NATD connectionsOpen this port to listen for connections from old versions of ipfw (as included in old versions of FreeBSD, etc) using the NATD protocol. Use 0 if you don't want to allow NATD connections. Set the port to "auto" to have Tor pick a port for you. This directive can be specified multiple times to bind to multiple addresses/ports. See SocksPort for an explanation of isolation flags. This option is only for people who cannot use TransPort. (Default: 0)… %‚  55/u‚+AUTOMAPHOSTSSUFFIXESAutomapHostsSuffixesClientSUFFIX,SUFFIX,...Address suffixes recognized by AutomapHostsOnResolveA comma-separated list of suffixes to use with AutomapHostsOnResolve. The "." suffix is equivalent to "all addresses." (Default: .exit,.onion).‡ƒW 77 …?AUTOMAPHOSTSONRESOLVEAutomapHostsOnResolveClient0|1Map addresses ending with special suffixes to virtual addressesWhen this option is enabled, and we get a request to resolve an address that ends with one of the suffixes in AutomapHostsSuffixes, we map an unused virtual address to that address, and return the new virtual address. This is handy for making ".onion" addresses work with applications that resolve an address and then connect to it. (Default: 0)† P÷Pƒ# MM„9CLIENTDNSREJECTINTERNALADDRESSESClientDNSRejectInternalAddressesClient0|1Disregards anonymous DNS responses for internal addressesIf true, Tor does not believe any anonymously retrieved DNS answer that tells it that an address resolves to an internal address (like 127.0.0.1 or 192.168.0.1). This option prevents certain browser-based attacks; it is not allowed to be set on the default network. (Default: 1)‰„ W}†DNSPORTDNSPortClient[address:]port|auto [isolation flags]Port from which DNS responses are fetched instead of torIf non-zero, open this port to listen for UDP DNS requests, and resolve them anonymously. This port only handles A, AAAA, and PTR requests---it doesn't handle arbitrary DNS request types. Set the port to "auto" to have Tor pick a port for you. This directive can be specified multiple times to bind to multiple addresses/ports. See SocksPort for an explanation of isolation flags. (Default: 0)ˆ ¢.¢ƒ //q„MDOWNLOADEXTRAINFODownloadExtraInfoClient0|1Toggles fetching of extra information about relaysIf true, Tor downloads and caches "extra-info" documents. These documents contain information about servers other than the information in their regular server descriptors. Tor does not use this information for anything itself; to save bandwidth, leave this option turned off. (Default: 0)‹ƒN GGe…5CLIENTREJECTINTERNALADDRESSESClientRejectInternalAddressesClient0|1Disables use of Tor for internal connectionsIf true, Tor does not try to fulfill requests to connect to an internal address (like 127.0.0.1 or 192.168.0.1) unless an exit node is specifically requested (for example, via a .exit hostname, or a controller request). If true, multicast DNS hostnames for machines on the local network (of the form *.local) are also rejected. (Default: 1)Š ¾±¾o 55'S‚REJECTPLAINTEXTPORTSRejectPlaintextPortsClientport,port,...Prevents connections on risky portsLike WarnPlaintextPorts, but instead of warning about risky port uses, Tor will instead refuse to make the connection. (Default: None)‚K 11'YƒSWARNPLAINTEXTPORTSWarnPlaintextPortsClientport,port,...Toggles warnings for using risky portsTells Tor to issue a warnings whenever the user tries to make an anonymous connection to one of these ports. This option is designed to alert users to services that risk sending passwords in the clear. (Default: 23,109,110,143)Œ ˆàZˆ‘B '''s¡;HSLAYER3NODESHSLayer3NodesClientnode,node,...permissible relays for the third hop of HS circuitsA list of identity fingerprints, nicknames, country codes, and address patterns of nodes that are†v '''u !HSLAYER2NODESHSLayer2NodesClientnode,node,...permissible relays for the second hop of HS circuitsA list of identity f„„ )) †[OPTIMISTICDATAOptimisticDataClient0|1|autoUse exits without confirmation that prior connections succeededWhen this option is set, and Tor is using an exit node that supports the feature, it will try optimistically to send data to the exit node without waiting for the exit node to report whether the connection succeeded. This can save a round-trip time for protocols like HTTP where the client talks first. If OptimisticData is set to auto, Tor will look at the UseOptimisticData parameter in the networkstatus. (Default: auto)Ž…ingerprints, nicknames, country codes, and address patterns of nodes that are allowed to be used as the second hop in all client or service-side Onion Service circuits. This option mitigates attacks where the adversary runs middle nodes and induces your client or service to create many circuits, in order to discover your primary guard node. (Default: Any node in the network may be used in the second hop.) (Example: HSLayer2Nodes ABCD1234CDEF5678ABCD1234CDEF5678ABCD1234, {cc}, 255.254.0.0/8) When this is set, the resulting hidden service paths will look like: C - G - L2 - M - Rend C - G - L2 - M - HSDir C - G - L2 - M - Intro S - G - L2 - M - Rend S - G - L2 - M - HSDir S - G - L2 - M - Intro where C is this client, S is the service, G is the Guard node, L2 is a node from this option, and M is a random middle node. Rend, HSDir, and Intro point selection is not affected by this option. This option may be combined with HSLayer3Nodes to create paths of the form: C - G - L2 - L3 - Rend C - G - L2 - L3 - M - HSDir C - G - L2 - L3 - M - Intro S - G - L2 - L3 - M - Rend S - G - L2 - L3 - HSDir S - G - L2 - L3 - Intro ExcludeNodes have higher priority than HSLayer2Nodes, which means that nodes specified in ExcludeNodes will not be picked. When either this option or HSLayer3Nodes are set, the /16 subnet and node family restrictions are removed for hidden service circuits. Additionally, we allow the guard node to be present as the Rend, HSDir, and IP node, and as the hop before it. This is done to prevent the adversary from inferring information about our guard, layer2, and layer3 node choices at later points in the path. This option is meant to be managed by a Tor controller such as https://github.com/mikeperry-tor/vanguards that selects and updates this set of nodes for you. Hence it does not do load balancing if fewer than 20 nodes are selected, and if no nodes in HSLayer2Nodes are currently available for use, Tor will not work. Please use extreme care if you are setting this option manually.‡ allowed to be used as the third hop in all client and service-side Onion Service circuits. This option mitigates attacks where the adversary runs middle nodes and induces your client or service to create many circuits, in order to discover your primary or Layer2 guard nodes. (Default: Any node in the network may be used in the third hop.) (Example: HSLayer3Nodes ABCD1234CDEF5678ABCD1234CDEF5678ABCD1234, {cc}, 255.254.0.0/8) When this is set by itself, the resulting hidden service paths will look like: C - G - M - L3 - Rend C - G - M - L3 - M - HSDir C - G - M - L3 - M - Intro S - G - M - L3 - M - Rend S - G - M - L3 - HSDir S - G - M - L3 - Intro where C is this client, S is the service, G is the Guard node, L2 is a node from this option, and M is a random middle node. Rend, HSDir, and Intro point selection is not affected by this option. While it is possible to use this option by itself, it should be combined with HSLayer2Nodes to create paths of the form: C - G - L2 - L3 - Rend C - G - L2 - L3 - M - HSDir C - G - L2 - L3 - M - Intro S - G - L2 - L3 - M - Rend S - G - L2 - L3 - HSDir S - G - L2 - L3 - Intro ExcludeNodes have higher priority than HSLayer3Nodes, which means that nodes specified in ExcludeNodes will not be picked. When either this option or HSLayer2Nodes are set, the /16 subnet and node family restrictions are removed for hidden service circuits. Additionally, we allow the guard node to be present as the Rend, HSDir, and IP node, and as the hop before it. This is done to prevent the adversary from inferring information about our guard, layer2, and layer3 node choices at later points in the path. This option is meant to be managed by a Tor controller such as https://github.com/mikeperry-tor/vanguards that selects and updates this set of nodes for you. Hence it does not do load balancing if fewer than 20 nodes are selected, and if no nodes in HSLayer3Nodes are currently available for use, Tor will not work. Please use extreme care if you are setting this option manually. väeìvs -- PATHBIASWARNRATEPathBiasWarnRateClientNUMFraction of circuits that must succeed before logging a warning”v 11 PATHBIASNOTICERATEPathBiasNoticeRateClientNUMFraction of circuits that must succeed before logging a notice“| 77 PATHBIASCIRCTHRESHOLDPathBiasCircThresholdClientNUMNumber of circuits through a guard before applying bias checks’„ 33}†OUSEMICRODESCRIPTORSUseMicrodescriptorsClient0|1|autoRetrieve microdescriptors rather than server descriptorsMicrodescriptors are a smaller version of the information that Tor needs in order to build its circuits. Using microdescriptors makes Tor clients download less directory information, thus saving bandwidth. Directory caches need to fetch regular descriptors and microdescriptors, so this option doesn't save any bandwidth for them. For legacy reasons, auto is accepted, but it has the same effect as 1. (Default: auto)‘ ¾…":¼>¾} 99 PATHBIASEXTREMEUSERATEPathBiasExtremeUseRateClientNUMFraction of streams that must succeed before logging an errorš{ 77 PATHBIASNOTICEUSERATEPathBiasNoticeUseRateClientNUMFraction of streams that must succeed before logging a notice™{ 55 PATHBIASUSETHRESHOLDPathBiasUseThresholdClientNUMNumber of streams through a circuit before applying bias checks˜‰\ 99 ‘GPATHBIASSCALETHRESHOLDPathBiasScaleThresholdClientNUMCircuits through a guard before scaling past observations downThese options override the default behavior of Tor's (currently experimental) path bias detection aŠ`11_ PATHBIASDROPGUARDSPathBiasDropGuardsClientNUMDrop guards failing to establish circuits–x 33 PATHBIASEXTREMERATEPathBiasExtremeRateClientNUMFraction of circuits that must succeed before logging an error•lgorithm. To try to find broken or misbehaving guard nodes, Tor looks for nodes where more than a certain fraction of circuits through that guard fail to get built. The PathBiasCircThreshold option controls how many circuits we need to build through a guard before we make these checks. The PathBiasNoticeRate, PathBiasWarnRate and PathBiasExtremeRate options control what fraction of circuits must succeed through a guard so we won't write log messages. If less than PathBiasExtremeRate circuits succeed and PathBiasDropGuards is set to 1, we disable use of that guard. When we have seen more than PathBiasScaleThreshold circuits through a guard, we scale our observations by 0.5 (governed by the consensus) so that new observations don't get swamped by old ones. By default, or if a negative value is provided for one of these options, Tor uses reasonable defaults from the networkstatus consensus document. If no defaults are available there, these options default to 150, .70, .50, .30, 0, and 300 respectively.— oo‡  ?? ŒPATHBIASSCALEUSETHRESHOLDPathBiasScaleUseThresholdClientNUMStreams through a circuit before scaling past observations downSimilar to the above options, these options override the default behavior of Tor's (currently experimental) path use bias detection algorithm. Where as the path bias parameters govern thresholds for successfully building circuits, these four path use bias parameters govern thresholds only for circuit usage. Circuits which receive no stream usage are not counted by this detection algorithm. A used circuit is considered successful if it is capable of carrying streams or otherwise receiving well-formed responses to RELAY cells. By default, or if a negative value is provided for one of these options, Tor uses reasonable defaults from the networkstatus consensus document. If no defaults are available there, these options default to 20, .80, .60, and 100, respectively.› Ë˃> ''{…?CLIENTUSEIPV6ClientUseIPv6Client0|1Allow IPv6 connections to guards and fetching consensusIf this option is set to 1, Tor might connect to directory servers or entry nodes over IPv6. For IPv6 only hosts, you need to also set ClientUseIPv4 to 0 to disable IPv4. Note that clients configured with an IPv6 address in a Bridge, proxy, or pluggable transportline will try connecting over IPv6 even if ClientUseIPv6 is set to 0. (Default: 0)‚o ''{„!CLIENTUSEIPV4ClientUseIPv4Client0|1Allow IPv4 connections to guards and fetching consensusIf this option is set to 0, Tor will avoid connecting to directory servers and entry nodes over IPv4. Note that clients with an IPv4 address in a Bridge, proxy, or pluggable transport line will try connecting over IPv4 even if ClientUseIPv4 is set to 0. (Default: 1)œ ÔÔ„( ;;k†qCLIENTPREFERIPV6DIRPORTClientPreferIPv6DirPortClient0|1|autoPerfer relays with IPv6 when fetching consensusIf this option is set to 1, Tor prefers a directory port with an IPv6 address over one with IPv4, for direct connections, if a given directory server has both. (Tor also prefers an IPv6 DirPort if IPv4Client is set to 0.) If this option is set to auto, clients prefer IPv4. Other things may influence the choice. This option breaks a tie to the favor of IPv6. (Default: auto) (DEPRECATED: This option has had no effect for some time.)ž ôô„ 99k†5CLIENTPREFERIPV6ORPORTClientPreferIPv6ORPortClient0|1|autoPrefer a guard's IPv6 rather than IPv4 endpointIf this option is set to 1, Tor prefers an OR port with an IPv6 address over one with IPv4 if a given entry node has both. (Tor also prefers an IPv6 ORPort if IPv4Client is set to 0.) If this option is set to auto, Tor bridge clients prefer the configured bridge address, and other clients prefer IPv4. Other things may influence the choice. This option breaks a tie to the favor of IPv6. (Default: auto)Ÿ ²²†J! AA‹ PATHSNEEDEDTOBUILDCIRCUITSPathsNeededToBuildCircuitsClientNUMPortion of relays to require information for before making circuitsTor clients don't build circuits for user traffic until they know about enough of the network so that they could potentially construct enough of the possible paths through the network. If this option is set to a fraction between 0.25 and 0.95, Tor won't build circuits until it has enough descriptors or microdescriptors to construct that fraction of possible paths. Note that setting this option too low can make your Tor client less anonymous, and setting it too high can prevent your Tor client from bootstrapping. If this option is negative, Tor will use a default value chosen by the directory authorities. If the directory authorities do not choose a value, Tor will default to 0.6. (Default: -1)  ‡f–£ŠpSŽ=&ñÖ× ï$±‘¨fƒu`RC8íØÂɪzZG5)RVDIRE CMINUPTIMEHIDSERVDIRECTORYV2åÉLOG8%KEYDIRECTORYÖ,[MINMEASUREDBWSFORAUTHTOIGNOREADVERTISEDþ9MAXADVERTISEDBANDWIDTH!MAPADDRESSi'MAINLOOPSTATSº)LONGLIVEDPORTSh1LOGTIMEGRANULARITYA/LOGMESSAGEDOMAINS9=LEARNCIRCUITBUILDTIMEOUTT7KISTSOCKBUFSIZEFACTORR5KISTSCHEDRUNINTERVALQ?KEYDIRECTORYGROUPREADABLE×-OFFLINEMASTERKEYÕ-NUMPRIMARYGUARDS{)NUMENTRYGUARDSz1NUMDIRECTORYGUARDS| NUMCPUS´)MAXMEMINQUEUESÒ NOEXECO!NODEFAMILYm NICKNAME³-NEWCIRCUITPERIODj NATDPORT† MYFAMILY²CMAXUNPARSEABLEDESCSIZETOLOG:1MAXONIONQUEUEDELAY±)3MAXCIRCUITDIRTINESSk;MAXCONSENSUSAGEFORDIFFSÝ=MAXCLIENTCIRCUITSPENDINGl× ££„Y" ww†5CLIENTBOOTSTRAPCONSENSUSAUTHORITYDOWNLOADINITIALDELAYClientBootstrapConsensusAuthorityDownloadInitialDelayClientNDelay when bootstrapping before downloading descriptors from authoritiesInitial delay in seconds for when clients should download consensuses from authorities if they are bootstrapping (that is, they don't have a usable, reasonably live consensus). Only used by clients fetching from a list of fallback directory mirrors. This schedule is advanced by (potentially concurrent) connection attempts, unlike other schedules, which are advanced by connection failures. (Default: 6)¡ ˜˜„d# uu†SCLIENTBOOTSTRAPCONSENSUSFALLBACKDOWNLOADINITIALDELAYClientBootstrapConsensusFallbackDownloadInitialDelayClientNDelay when bootstrapping before downloading descriptors from fallbacksInitial delay in seconds for when clients should download consensuses from fallback directory mirrors if they are bootstrapping (that is, they don't have a usable, reasonably live consensus). Only used by clients fetching from a list of fallback directory mirrors. This schedule is advanced by (potentially concurrent) connection attempts, unlike other schedules, which are advanced by connection failures. (Default: 0)¢ ;n;‚/% aa ‚CLIENTBOOTSTRAPCONSENSUSMAXINPROGRESSTRIESClientBootstrapConsensusMaxInProgressTriesClientNUMNumber of consensus download requests to allow in-flight at onceTry this many simultaneous connections to download a consensus before waiting for one to complete, timeout, or error out. (Default: 3)¤…$ I†cCLIENTBOOTSTRAPCONSENSUSAUTHORITYONLYDOWNLOADINITIALDELAYClientBootstrapConsensusAuthorityOnlyDownloadInitialDelayClientNDelay when bootstrapping before downloading descriptors from authorities if fallbacks disabledInitial delay in seconds for when clients should download consensuses from authorities if they are bootstrapping (that is, they don't have a usable, reasonably live consensus). Only used by clients which don't have or won't fetch from a list of fallback directory mirrors. This schedule is advanced by (potentially concurrent) connection attempts, unlike other schedules, which are advanced by connection failures. (Default: 0)£ kükƒ ' ++Q…ASSUMEREACHABLEAssumeReachableRelay0|1Skips reachability test at startupThis option is used when bootstrapping a new Tor network. If set to 1, don't do self-reachability testing; just upload your server descriptor immediately. If AuthoritativeDirectory is also set, this option instructs the dirserver to bypass remote reachability testing too and list all connected servers as running.¦„& y†WADDRESSAddressRelayaddressOverwrites address others will use to reach this relayThe IPv4 address of this server, or a fully qualified domain name of this server that resolves to an IPv4 address. You can leave this unset, and Tor will try to guess your IPv4 address. This IPv4 address is the one used to tell clients and other servers where to find your Tor server; it doesn't affect the address that your server binds to. To bind to a different address, use the ORPort and OutboundBindAddress options.¥ nnƒ( ##+…9BRIDGERELAYBridgeRelayRelay0|1Act as a bridgeSets the relay to act as a "bridge" with respect to relaying connections from bridge users to the Tor network. It mainly causes Tor to publish a server descriptor to the bridge database, rather than to the public directory authorities. Note: make sure that no MyFamily lines are present in your torrc when relay is configured in bridge mode.§ ““„i) 11‡yBRIDGEDISTRIBUTIONBridgeDistributionRelaystringDistribution method BrideDB should provide our address byIf set along with BridgeRelay, Tor will include a new line in its bridge descriptor which indicates to the BridgeDB service how it would like its bridge address to be given out. Set it to "none" if you want BridgeDB to avoid distributing your bridge address, or "any" to let BridgeDB decide. (Default: any) Note: as of Oct 2017, the BridgeDB part of this option is not yet implemented. Until BridgeDB is updated to obey this option, your bridge will make this request, but it will not (yet) be obeyed.¨ ss… * ##'QˆuCONTACTINFOContactInfoRelayemail_addressContact information for this relayAdministrative contact information for this relay or bridge. This line can be used to contact you if your relay or bridge is misconfigured or something else goes wrong. Note that we archive and publish all descriptors containing these lines and that Google indexes them, so spammers might also collect them. You may want to obscure the fact that it's an email address and/or generate a new address for this purpose. ContactInfo must be set to a working address if you run more than one relay or bridge. (Really, everybody running a relay or bridge should set it.)© ­­„O+ IˆEXITRELAYExitRelayRelay0|1|autoAllow relaying of exit trafficTells Tor whether to run as an exit relay. If Tor is running as a non-bridge server, and ExitRelay is set to 1, then Tor allows traffic to exit according to the ExitPolicy option (or the default ExitPolicy if none is specified). If ExitRelay is set to 0, no traffic is allowed to exit, and the ExitPolicy option is ignored. If ExitRelay is set to "auto", then Tor behaves as if it were set to 1, but warns the user if this would cause traffic to exit. In a future version, the default value will be 0. (Default: auto)ªšccept any other IPv4 or IPv6 traffic. Tor also allows IPv6 exit policy entries. For instance, "reject6 [FC00::]/7:*" rejects all destinations that share 7 most significant bit prefix with address FC00::. Respectively, "accept6 [C000::]/3:*" accepts all destinations that share 3 most significant bit prefix with address C000::. accept6 and reject6 only produce IPv6 exit policy entries. Using an IPv4 address with accept6 or reject6 is ignored and generates a warning. accept/reject allows either IPv4 or IPv6 addresses. Use *4 as an IPv4 wildcard address, and *6 as an IPv6 wildcard address. accept/reject * expands to matching IPv4 and IPv6 wildcard address rules. To specify all IPv4 and IPv6 internal and link-local networks (including 0.0.0.0/8, 169.254.0.0/16, 127.0.0.0/8, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, [::]/8, [FC00::]/7, [FE80::]/10, [FEC0::]/10, [FF00::]/8, and [::]/127), you can use the "private" alias instead of an address. ("private" always produces rules for IPv4 and IPv6 addresses, even› when used with accept6/reject6.) Private addresses are rejected by default (at the beginning of your exit policy), along with any configured primary public IPv4 and IPv6 addresses. These private addresses are rejected unless you set the ExitPolicyRejectPrivate config option to 0. For example, once you've done that, you could allow HTTP to 127.0.0.1 and block all other connections to internal networks with "accept 127.0.0.1:80,reject private:*", though that may also allow connections to your own computer that are addressed to its public (external) IP address. See RFC 1918 and RFC 3330 for more details about internal and reserved IP address space. See ExitPolicyRejectLocalInterfaces if you want to block every address on the relay, even those that aren't advertised in the descriptor. This directive can be specified multiple times so you don't have to put it all on one line. Policies are considered first to last, and the first match wins. If you want to allow the same ports on IPv4 and IPv6, write your rules using accept/reject *. If you want to allow different ports on IPv4 and IPv6, write your IPv6 rules using accept6/reject6 *6, and your IPv4 rules using accept/reject *4. If you want to _replace_ the default exit policy, end your exit policy with either a reject *:* or an accept *:*. Otherwise, you're _augmenting_ (prepending to) the default exit policy. If you want to use a reduced exit policy rather than the default exit policy, set "ReducedExitPolicy 1". If you want to replace the default exit policy with your custom exit policy, end your exit policy with either a reject : or an accept :. Otherwise, you're augmenting (prepending to) the default or reduced exit policy. The default exit policy is: reject *:25 reject *:119 reject *:135-139 reject *:445 reject *:563 reject *:1214 reject *:4661-4666 reject *:6346-6429 reject *:6699 reject *:6881-6999 accept *:* Since the default exit policy uses accept/reject *, it applies to both IPv4 and IPv6 addresses.«  . ‚- ;;U‚}EXITPOLICYREJECTPRIVATEExitPolicyRejectPrivateRelay0|1Prevent exiting on the local networkReject all private (local) networks, along with the relay's advertised public IPv4 and IPv6 addresses, at the beginning of your exit policy. See above entry on ExitPolicy. (Default: 1)¬>, !!/q¹;EXITPOLICYExitPolicyRelaypolicy,policy,...Traffic destinations that can exit from this relaySet an exit policy for this server. Each policy is of the form "accept[6]|reject[6] ADDR[/MASK][:PORT]". If /MASK is omitted then this policy just applies to the host given. Instead of giving a host or network you can also use "*" to denote the universe (0.0.0.0/0 and ::/0), or *4 to denote all IPv4 addresses, and *6 to denote all IPv6 addresses. PORT can be a single port number, an interval of ports "FROM_PORT-TO_PORT", or "*". If PORT is omitted, that means "*". For example, "accept 18.7.22.69:*,reject 18.0.0.0/8:*,accept *:*" would reject any IPv4 traffic destined for MIT except for web.mit.edu, and a™ MM…/. KKˆWEXITPOLICYREJECTLOCALINTERFACESExitPolicyRejectLocalInterfacesRelay0|1More extensive prevention of exiting on the local networkReject all IPv4 and IPv6 addresses that the relay knows about, at the beginning of your exit policy. This includes any OutboundBindAddress, the bind addresses of any port options, such as ControlPort or DNSPort, and any public IPv4 and IPv6 addresses on any interface on the relay. (If IPv6Exit is not set, all IPv6 addresses will be rejected anyway.) See above entry on ExitPolicy. This option is off by default, because it lists all public relay IP addresses in the ExitPolicy, even those relay operators might prefer not to disclose. (Default: 0)­02-904 accept *:981 accept *:989-990 accept *:991 accept *:992 accept *:993 accept *:994 accept *:995 accept *:1194 accept *:1220 accept *:1293 accept *:1500 accept *:1533 accept *:1677 accept *:1723 accept *:1755 accept *:1863 accept *:2082 accept *:2083 accept *:2086-2087 accept *:2095-2096 accept *:2102-2104 accept *:3128 accept *:3389 accept *:3690 accept *:4321 accept *:4643 accept *:5050 accept *:5190 accept *:5222-5223 accept *:5228 accept *:5900 accept *:6660-6669 accept *:6679 accept *:6697 accept *:8000 accept *:8008 accept *:8074 accept *:8080 accept *:8082 accept *:8087-8088 accept *:8232-8233 accept *:8332-8333 accept *:8443 accept *:8888 accept *:9418 accept *:9999 accept *:10000 accept *:11371 accept *:19294 accept *:19638 accept *:50002 accept *:64738 reject *:* (Default: 0)® dd/ //IREDUCEDEXITPOLICYReducedExitPolicyRelay0|1Customized reduced exit policyIf set, use a reduced exit policy rather than the default one. The reduced exit policy is an alternative to the default exit policy. It allows as many Internet services as possible while still blocking the majority of TCP ports. Currently, the policy allows approximately 65 ports. This reduces the odds that your node will be used for peer-to-peer applications. The reduced exit policy is: accept *:20-21 accept *:22 accept *:23 accept *:43 accept *:53 accept *:79 accept *:80-81 accept *:88 accept *:110 accept *:143 accept *:194 accept *:220 accept *:389 accept *:443 accept *:464 accept *:465 accept *:531 accept *:543-544 accept *:554 accept *:563 accept *:587 accept *:636 accept *:706 accept *:749 accept *:873 accept *:9ž ŸZIÚŸ‚73 ?„NICKNAMENicknameRelaynameIdentifier for this relaySet the server's nickname to 'name'. Nicknames must be between 1 and 19 characters inclusive, and must contain only the characters [a-zA-Z0-9]. If not set, Unnamed will be used. Relays can always be uniquely identified by their identity fingerprints.²ˆ2 CYMYFAMILYMyFamilyRelayfingerprint,fingerprint,...Other relays this operator administersDeclare ¡‚ 1 11/‚MAXONIONQUEUEDELAYMaxOnionQueueDelayRelayNUM [msec|second]Duration to reject new onionskins if we have more than we can processIf we have more onionskins queued for processing than we can process in this amount of time, reject new ones. (Default: 1750 msec)°"0 ];IPV6EXITIPv6ExitRelay0|1Allow clients to use us for IPv6 trafficIf set, and we are an exit node, allow clients to use us for IPv6 traffic. (Default: 0)¯that this Tor relay is controlled or administered by a group or organization identical or similar to that of the other relays, defined by their (possibly $-prefixed) identity fingerprints. This option can be repeated many times, for convenience in defining large families: all fingerprints in all MyFamily lines are merged into one list. When two relays both declare that they are in the same 'family', Tor clients will not use them in the same circuit. (Each relay only needs to list the other servers in its family; it doesn't need to list itself, but it won't hurt if it does.) Do not list any bridge relay as it would compromise its concealment. When listing a node, it's better to list it by fingerprint than by nickname: fingerprints are more reliable. If you run more than one relay, the MyFamily option on each relay must list all other relays, as described above. Note: do not use MyFamily when configuring your Tor instance as a brigde.± ¾Þ¾Š5 CO“ORPORTORPortRelay[address:]PORT|auto [flags]Port used to accept relay trafficAdvertise this port to listen for connections from Tor clients and servers. This option is required to be a Tor server. Set it to "auto" to have Tor pick a port for you. Set it to 0 to not run a£‚4 aƒ3NUMCPUSNumCPUsRelaynumNumber of processes spawned for decryptionHow many processes to use at once for decrypting onionskins and other parallelizable operations. If this is set to 0, Tor will try to detect how many CPUs you have, defaulting to 1 if it can't tell. (Default: 0)³n ORPort at all. This option can occur more than once. (Default: 0) Tor recognizes these flags on each ORPort: NoAdvertise By default, we bind to a port and tell our users about it. If NoAdvertise is specified, we don't advertise, but listen anyway. This can be useful if the port everybody will be connecting to (for example, one that's opened on our firewall) is somewhere else. NoListen By default, we bind to a port and tell our users about it. If NoListen is specified, we don't bind, but advertise anyway. This can be useful if something else (for example, a firewall's port forwarding configuration) is causing connections to reach us. IPv4Only If the address is absent, or resolves to both an IPv4 and an IPv6 address, only listen to the IPv4 address. IPv6Only If the address is absent, or resolves to both an IPv4 and an IPv6 address, only listen to the IPv6 address. For obvious reasons, NoAdvertise and NoListen are mutually exclusive, and IPv4Only and IPv6Only are mutually exclusive.´ ôô†6 ;;/IŠCPUBLISHSERVERDESCRIPTORPublishServerDescriptorRelay0|1|v3|bridge,...Types of descriptors publishedThis option specifies which descriptors Tor will publish when acting as a relay. You can choose multiple arguments, separated by commas. If this option is set to 0, Tor will not publish its descriptors to any directories. (This is useful if you're testing out your server, or if you're using a Tor controller that handles directory publishing for you.) Otherwise, Tor will publish its descriptors of all type(s) specified. The default is "1", which means "if running as a relay or bridge, publish descriptors to the appropriate authorities". Other possibilities are "v3", meaning "publish as if you're a relay", and "bridge", meaning "publish as if you're a bridge".µ šºš‚8 ))AO‚wSSLKEYLIFETIMESSLKeyLifetimeRelayN minutes|hours|days|weeksLifetime for our link certificateWhen creating a link certificate for our outermost SSL handshake, set its lifetime to this amount of time. If set to 0, Tor will choose some reasonable random defaults. (Default: 0)·‚B7 11wƒ9SHUTDOWNWAITLENGTHShutdownWaitLengthRelayNUMDelay before quitting after receiving a SIGINT signalWhen we get a SIGINT and we're a server, we begin shutting down: we close listeners and start refusing new circuits. After NUM seconds, we exit. If we get a second SIGINT, we exit immediately. (Default: 30 seconds)¶ KgK‚: ''‚]MAINLOOPSTATSMainloopStatsRelay0|1Include development information from the main loop with heartbeatsLog main loop statistics every HeartbeatPeriod seconds. This is a log level notice message designed to help developers instrumenting Tor's main event loop. (Default: 0)¹ƒ9 ++Aw„=HEARTBEATPERIODHeartbeatPeriodRelayN minutes|hours|days|weeksRate at which an INFO level heartbeat message is sentLog a heartbeat message every HeartbeatPeriod seconds. This is a log level notice message, designed to let you know your Tor server is still alive and doing useful things. Settings this to 0 will disable the heartbeat. Otherwise, it must be at least 30 minutes. (Default: 6 hours)¸idth. By default, the number used for calculation is the max of either the bytes sent or received. For example, with AccountingMax set to 1 GByte, a server could send 900 MBytes and receive 800 MBytes and continue running. It will only hibernate once one of the two reaches 1 GByte. This can be changed to use the sum of the both bytes received and sent by setting the AccountingRule option to "sum" (total bandwidth in/out). When the number of bytes remaining gets low, Tor will stop accepting new connections and circuits. When the number of bytes is exhausted, Tor will hibernate until some time in the next accounting period. To prevent all servers from waking at the same time, Tor will also wait until a random point in each period before waking up. If you have bandwidth cost issues, enabling hibernation is preferable to setting a low bandwidth, since it provides users with a collection of fast servers that are up some of the time, which is more useful than a set of slow servers that are always "available".º ž®ž„ < )))}†AACCOUNTINGRULEAccountingRuleRelaysum|max|in|outMethod to determine when the accounting limit is reachedHow we determine when our AccountingMax has been reached (when we should hibernate) during a time interval. Set to "max" to calculate using the higher of either the sent or received bytes (this is the default functionality). Set to "sum" to calculate using the sent plus received bytes. Set to "in" to calculate using only the received bytes. Set to "out" to calculate using only the sent bytes. (Default: max)»ŠF; ''U“ACCOUNTINGMAXAccountingMaxRelayN bytes|KBytes|MBytes|GBytes|TBytes|KBits|MBits|GBits|TBitsAmount of traffic before hibernatingLimits the max number of bytes sent and received within a set time period using a given calculation rule (see: AccountingStart, AccountingRule). Useful if you need to stay under a specific bandw§ ëë†= ++AMŠ_ACCOUNTINGSTARTAccountingStartRelayday|week|month [day] HH:MMDuration of an accounting periodSpecify how long accounting periods last. If month is given, each accounting period runs from the time HH:MM on the dayth day of one month to the same day and time of the next. The relay will go at full speed, use all the quota you specify, then hibernate for the rest of the period. (The day must be between 1 and 28.) If week is given, each accounting period runs from the time HH:MM of the dayth day of one week to the same day and time of the next week, with Monday as day 1 and Sunday as day 7. If day is given, each accounting period runs from the time HH:MM each day to the same time on the next day. All times are local, and given in 24-hour time. (Default: "month 1 0:00")¼ ‚:‚ƒ4? ;;w„SERVERDNSRESOLVCONFFILEServerDNSResolvConfFileRelayfilenameOverriding resolver config for DNS queries we provideOverrides the default DNS configuration with the configuration in filename. The file format is the same as the standard Unix "resolv.conf" file (7). This option, like all other ServerDNS options, only affects name lookups that your server does on behalf of clients. (Defaults to use the system DNS configuration.)¾ƒB> 11…REFUSEUNKNOWNEXITSRefuseUnknownExitsRelay0|1|autoPrevents relays not in the consensus from using us as an exitPrevent nodes that don't appear in the consensus from exiting using this relay. If the option is 1, we always block exit attempts from such nodes; if it's 0, we never do, and if the option is "auto", then we do whatever the authorities suggest in the consensus (and block if the consensus is quiet on the issue). (Default: auto)½ £{£ƒTA 99…/SERVERDNSSEARCHDOMAINSServerDNSSearchDomainsRelay0|1Toggles if our DNS queries search for addresses in the local domainIf set to 1, then we will search for addresses in the local search domain. For example, if this system is configured to believe it is in "example.com", and a client tries to connect to "www", the client will be connected to "www.example.com". This option only affects name lookups that your server does on behalf of clients. (Default: 0)Àƒ@ AAƒ}SERVERDNSALLOWBROKENCONFIGServerDNSAllowBrokenConfigRelay0|1Toggles if we persist despite configuration parsing errors or notIf this option is false, Tor exits immediately if there are problems parsing the system DNS configuration or connecting to nameservers. Otherwise, Tor continues to periodically retry the system nameservers until it eventually succeeds. (Default: 1)¿ \S\ƒsC 997 …OSERVERDNSTESTADDRESSESServerDNSTestAddressesRelayhostname,hostname,...Addresses to test to see if valid DNS queries are being hijackedWhen we're detecting DNS hijacking, make sure that these valid addresses aren't getting redirected. If they are, then our DNS is completely useless, and we'll reset our exit policy to "reject *:*". This option only affects name lookups that your server does on behalf of clients. (Default: "www.google.com, www.mit.edu, www.yahoo.com, www.slashdot.org")ƒ)B ==O…SERVERDNSDETECTHIJACKINGServerDNSDetectHijackingRelay0|1Toggles testing for DNS hijackingWhen this option is set to 1, we will test periodically to determine whether our local nameservers have been configured to hijack failing DNS requests (usually to an advertising site). If they are, we will attempt to correct this. This option only affects name lookups that your server does on behalf of clients. (Default: 1)Á ¯*¯‚wE AA]„BRIDGERECORDUSAGEBYCOUNTRYBridgeRecordUsageByCountryRelay0|1Tracks geoip information on bridge usageWhen this option is enabled and BridgeRelay is also enabled, and we have GeoIP data, Tor keeps a per-country count of how many client addresses have contacted it so that it can help the bridge authority guess which countries have blocked access to it. (Default: 1)ăRD MM}…SERVERDNSALLOWNONRFC953HOSTNAMESServerDNSAllowNonRFC953HostnamesRelay0|1Toggles if we reject DNS queries with invalid charactersWhen this option is disabled, Tor does not try to resolve hostnames containing illegal characters (like @ and :) rather than sending them to an exit node to be resolved. This helps trap accidental attempts to resolve URLs and so on. This option only affects name lookups that your server does on behalf of clients. (Default: 0)à ²\²&H ##i!GEOIPV6FILEGeoIPv6FileRelayfilenamePath to file containing IPv6 geoip informationA filename containing IPv6 GeoIP data, for use with by-country statistics.Ç"G i!GEOIPFILEGeoIPFileRelayfilenamePath to file containing IPv4 geoip informationA filename containing IPv4 GeoIP data, for use with by-country statistics.ƃzF 99U†;SERVERDNSRANDOMIZECASEServerDNSRandomizeCaseRelay0|1Toggles DNS query case randomizationWhen this option is set, Tor sets the case of each character randomly in outgoing DNS requests, and makes sure that the case matches in DNS replies. This so-called "0x20 hack" helps resist some types of DNS poisoning attack. For more information, see "Increased DNS Forgery Resistance through 0x20-Bit Encoding". This option only affects name lookups that your server does on behalf of clients. (Default: 1)Å !ÇôÜÀ¦t\C'ôعŸ‰iVD8#çж~eF-ùáǯ˜„n^5REJECTPLAINTEXTPORTSŽ1REFUSEUNKNOWNEXITS¾/REDUCEDEXITPOLICY¯=REDUCEDCONNECTIONPADDINGZ3RECOMMENDEDVERSIONSá?RECOMMENDEDSERVERVERSIONSæ3RECOMMENDEDPACKAGESâ?RECOMMENDEDCLIENTVERSIONSã5REACHABLEORADDRESSESe7REACHABLEDIRADDRESSESd1REACHABLEADDRESSESc;PUBLISHSERVERDESCRIPTOR¶?PUBLISHHIDSERVDESCRIPTORS-PROTOCOLWARNINGS? PIDFILE>'PERCONNBWRATE)PERCONNBWBURSTAPATHSNEEDEDTOBUILDCIRCUITS¡-PATHBIASWARNRATE•5PATHBIASUSETHRESHOLD™?PATHBIASSCALEUSETHRESHOLDœ9PATHBIASSCALETHRESHOLD˜7PATHBIASNOTICEUSERATEš1PATHBIASNOTICERATE”9PATHBIASEXTREMEUSERATE›3PATHBIASEXTREMERATE–1PATHBIASDROPGUARDS—7PATHBIASCIRCTHRESHOLD“/PADDINGSTATISTICSÊ7OUTBOUNDBINDADDRESSOR<;OUTBOUNDBINDADDRESSEXIT=3OUTBOUNDBINDADDRESS; ORPORTµ óƒ\J //I†PADDINGSTATISTICSPaddingStatisticsRelay0|1Toggles storing padding countsRelays only. When this option is enabled, Tor collects statistics for padding cells sent and received by this relay, in addition to total cell counts. These statistics are rounded, and omitted if traffic is low. This information is important for load balancing decisions related to padding. If ExtraInfoStatistics is enabled, it will be published as a part of extra-info document. (Default: 1)É„ I ))i†eCELLSTATISTICSCellStatisticsRelay0|1Toggles storing circuit queue duration to diskRelays only. When this option is enabled, Tor collects statistics about cell processing (i.e. mean time a cell is spending in a queue, mean number of cells in a queue and mean number of processed cells per circuit) and writes them into disk every 24 hours. Onion router operators may use the statistics for performance monitoring. If ExtraInfoStatistics is enabled, it will published as part of extra-info document. (Default: 0)È ƒgL ++m†ENTRYSTATISTICSEntryStatisticsRelay0|1Toggles storing client connection counts to diskRelays only. When this option is enabled, Tor writes statistics on the number of directly connecting clients to disk every 24 hours. Enables relay operators to monitor how much inbound traffic that originates from Tor clients passes through their server to go further down the Tor network. If ExtraInfoStatistics is enabled, it will be published as part of extra-info document. (Default: 0)˃vK --†DIRREQSTATISTICSDirReqStatisticsRelay0|1Toggles storing network status counts and performance to diskRelays and bridges only. When this option is enabled, a Tor directory writes statistics on the number and response time of network status requests to disk every 24 hours. Enables relay and bridge operators to monitor how much their server is being used by clients to learn about Tor network. If ExtraInfoStatistics is enabled, it will published as part of extra-info document. (Default: 1)Ê JJƒLN ;;Y…WCONNDIRECTIONSTATISTICSConnDirectionStatisticsRelay0|1Toggles storing connection use to diskRelays only. When this option is enabled, Tor writes statistics on the amounts of traffic it passes between itself and other relays to disk every 24 hours. Enables relay operators to monitor how much their relay is being used as middle node in the circuit. If ExtraInfoStatistics is enabled, it will be published as part of extra-info document. (Default: 0)̓bM 11s…}EXITPORTSTATISTICSExitPortStatisticsRelay0|1Toggles storing traffic and port usage data to diskExit relays only. When this option is enabled, Tor writes statistics on the number of relayed bytes and opened stream per exit port to disk every 24 hours. Enables exit relay operators to measure and monitor amounts of traffic that leaves Tor network through their exit node. If ExtraInfoStatistics is enabled, it will be published as part of extra-info document. (Default: 0)Ì JZJ‚ P 33u‚KEXTRAINFOSTATISTICSExtraInfoStatisticsRelay0|1Publishes statistic data in the extra-info documentsWhen this option is enabled, Tor includes previously gathered statistics in its extra-info documents that it uploads to the directory authorities. (Default: 1)σ"O ;;e„wHIDDENSERVICESTATISTICSHiddenServiceStatisticsRelay0|1Toggles storing hidden service stats to diskRelays only. When this option is enabled, a Tor relay writes obfuscated statistics on its role as hidden-service directory, introduction point, or rendezvous point to disk every 24 hours. If ExtraInfoStatistics is also enabled, these statistics are further published to the directory authorities. (Default: 1)Î ÔÔ„(Q CCq†gEXTENDALLOWPRIVATEADDRESSESExtendAllowPrivateAddressesRelay0|1Allow circuits to be extended to the local networkWhen this option is enabled, Tor will connect to relays on localhost, RFC1918 addresses, and so on. In particular, Tor will make direct OR connections, and Tor routers allow EXTEND requests, to these private addresses. (Tor will always allow connections to bridges, proxies, and pluggable transports configured on private addresses.) Enabling this option can create security issues; you should probably leave it off. (Default: 0)Ð JJ…2R ))-'ˆ]MAXMEMINQUEUESMaxMemInQueuesRelayN bytes|KB|MB|GBThreshold at which tor will terminate circuits to avoid running out of memoryThis option configures a threshold above which Tor will assume that it needs to stop queueing or buffering data because it's about to run out of memory. If it hits this threshold, it will begin killing circuits until it has recovered at least 10% of this memory. Do not set this option too low, or your relay may be unreliable under load. This option only affects some queues, so the actual process size will be larger than this. If this option is set to 0, Tor will try to pick a reasonable default based on your system's physical memory. (Default: 0)Ñ 6¤6‚jT 113gƒySIGNINGKEYLIFETIMESigningKeyLifetimeRelayN days|weeks|monthsDuration the Ed25519 signing key is valid forFor how long should each Ed25519 signing key be valid? Tor uses a permanent master identity key that can be kept offline, and periodically generates new "signing" keys that it uses online. This option configures their lifetime. (Default: 30 days)Ó‚XS ++sƒuDISABLEOOSCHECKDisableOOSCheckRelay0|1Don't close connections when running out of socketsThis option disables the code that closes connections when Tor notices that it is running low on sockets. Right now, it is on by default, since the existing out-of-sockets mechanism tends to kill OR connections more than it should. (Default: 1)Ò ¯¥ݯ‚*W ??s‚qKEYDIRECTORYGROUPREADABLEKeyDirectoryGroupReadableRelay0|1Group read permissions for the secret key directoryIf this option is set to 0, don't allow the filesystem group to read the KeywDirectory. If the option is set to 1, make the KeyDirectory readable by the default GID. (Default: 0)ÖDV %%Q{KEYDIRECTORYKeyDirectoryRelayDIRDirectory where secret keys resideStore secret keys in DIR. Can not be changed while tor is running. (Default: the "keys" subdirectory of DataDirectory.)Õ‚WU --U„ OFFLINEMASTERKEYOfflineMasterKeyRelay0|1Don't generate the master secret keyIf non-zero, the Tor relay will never generate or load its master secret key. Instead, you'll have to use "tor --keygen" to manage the permanent ed25519 master identity key, as well as the corresponding temporary signing keys and certificates. (Default: 0)Ô M±M‚`Y --W„ DIRPORTFRONTPAGEDirPortFrontPageDirectoryFILENAMEPublish this html file on the DirPortWhen this option is set, it takes an HTML file and publishes it as "/" on the DirPort. Now relay operators can provide a disclaimer without needing to set up a separate webserver. There's a sample disclaimer in contrib/operator-tools/tor-exit-notice.html.Ø‚KX --Qkƒ!REPHISTTRACKTIMERephistTrackTimeRelayN seconds|minutes|hours|days|weeksDiscards old, unchanged reliability informationTells an authority, or other node tracking node reliability and history, that fine-grained information about nodes can be discarded when it hasn't changed for a given amount of time. (Default: 24 hours)× ýOý‚N[ /G„DIRPOLICYDirPolicyDirectorypolicy,policy,...Access policy for the DirPortSet an entrance policy for this server, to limit who can connect to the directory ports. The policies have the same form as exit policies above, except that port specifiers are ignored. Any address not matched by some entry in the policy is accepted.Úƒ-Z CI…1DIRPORTDirPortDirectory[address:]PORT|auto [flags]Port for directory connectionsIf this option is nonzero, advertise the directory service on this port. Set it to "auto" to have Tor pick a port for you. This option can occur more than once, but only one advertised DirPort is supported: all but one DirPort must have the NoAdvertise flag set. (Default: 0) The same flags are supported here as are supported by ORPort.Ù   ƒo\ }†-DIRCACHEDirCacheDirectory0|1Provide cached descriptor information to other tor usersWhen this option is set, Tor caches all current directory documents except extra info documents, and accepts client requests for them. If DownloadExtraInfo is set, cached extra info documents are also cached. Setting DirPort is not required for DirCache, because clients connect via the ORPort by default. Setting either DirPort or BridgeRelay and setting DirCache to 0 is not supported. (Default: 1)Û 'À'ƒ^ 99E„yAUTHORITATIVEDIRECTORYAuthoritativeDirectoryAuthority0|1Act as a directory authorityWhen this option is set to 1, Tor operates as an authoritative directory server. Instead of caching the directory, it generates its own list of good servers, signs it, and sends that to the clients. Unless the clients already have you listed as a trusted directory, you probably do not want to set this option.Ý„<] ;;AW‡MAXCONSENSUSAGEFORDIFFSMaxConsensusAgeForDiffsDirectoryN minutes|hours|days|weeksTime to generate consensus caches forWhen this option is nonzero, Tor caches will not try to generate consensus diffs for any consensus older than this amount of time. If this option is set to zero, Tor will pick a reasonable default from the current networkstatus document. You should not set this option unless your cache is severely low on disk space or CPU. If you need to set it, keeping it above 3 or 4 hours will help clients much more than setting it to zero. (Default: 0)Ü Ð®ÐƒZ` MMm…3VERSIONINGAUTHORITATIVEDIRECTORYVersioningAuthoritativeDirectoryAuthority0|1Provides opinions on recommended versions of torWhen this option is set to 1, Tor adds information on which versions of Tor are still believed safe for use to the published directory. Each version 1 authority is automatically a versioning authority; version 2 authorities provide this service optionally. See RecommendedVersions, RecommendedClientVersions, and RecommendedServerVersions.ß‚N_ ==Kƒ]V3AUTHORITATIVEDIRECTORYV3AuthoritativeDirectoryAuthority0|1Generates a version 3 consensusWhen this option is set in addition to AuthoritativeDirectory, Tor generates version 3 network statuses and serves descriptors, etc as described in dir-spec.txt file of torspec (for Tor clients and servers running at least 0.2.0.x).Þ ž:žƒb 33_o„RECOMMENDEDPACKAGESRecommendedPackagesAuthorityPACKAGENAME VERSION URL DIGESTTYPE=DIGESTSuggested versions of applications other than torAdds "package" line to the directory authority's vote. This information is used to vote on the correct URL and digest for the released versions of different Tor-related packages, so that the consensus can certify them. This line may appear any number of times.áƒBa 33?…_RECOMMENDEDVERSIONSRecommendedVersionsAuthoritySTRINGSuggested versions of torSTRING is a comma-separated list of Tor versions currently believed to be safe. The list is included in each directory, and nodes which pull down the directory learn whether they need to upgrade. This option can appear multiple times: the values from multiple lines are spliced together. When this is set then VersioningAuthoritativeDirectory should be set too.à ._.‚-d 99Aƒ-BRIDGEAUTHORITATIVEDIRBridgeAuthoritativeDirAuthority0|1Acts as a bridge authorityWhen this option is set in addition to AuthoritativeDirectory, Tor accepts and serves server descriptors, but it caches and serves the main networkstatus documents rather than generating its own. (Default: 0)ãƒc ??e„WRECOMMENDEDCLIENTVERSIONSRecommendedClientVersionsAuthoritySTRINGTor versions believed to be safe for clientsSTRING is a comma-separated list of Tor versions currently believed to be safe for clients to use. This information is included in version 2 directories. If this is not set then the value of RecommendedVersions is used. When this is set then VersioningAuthoritativeDirectory should be set too.â dß?dWg ++YCONSENSUSPARAMSConsensusParamsAuthoritySTRINGParams entry of the networkstatus voteSTRING is a space-separated list of key=value pairs that Tor will include in the "params" line of its networkstatus vote.æƒf ??c„WRECOMMENDEDSERVERVERSIONSRecommendedServerVersionsAuthoritySTRINGTor versions believed to be safe for relaysSTRING is a comma-separated list of Tor versions currently believed to be safe for servers to use. This information is included in version 2 directories. If this is not set then the value of RecommendedVersions is used. When this is set then VersioningAuthoritativeDirectory should be set too.å‚e CCQ}MINUPTIMEHIDSERVDIRECTORYV2MinUptimeHidServDirectoryV2AuthorityN seconds|minutes|hours|days|weeksRequired uptime before accepting hidden service directoryMinimum uptime of a v2 hidden service directory to be accepted as such by authoritative directories. (Default: 25 hours)ä l@lƒPi ))/O…iAUTHDIRBADEXITAuthDirBadExitAuthorityAddressPattern...Relays to be flagged as bad exitsAuthoritative directories only. A set of address patterns for servers that will be listed as bad exits in any network status document this authority publishes, if AuthDirListBadExits is set. (The address pattern syntax here and in the options below is the same as for exit policies, except that you don't need to say "accept" or "reject", and ports are not needed.)èƒ identity keypair. In all cases, Tor records every keypair it accepts in a journal if it is new, or if it differs from the most recently accepted pinning for one of the keys it contains. (Default: 1)ò 2-2ƒwv ))a†7BRIDGEPASSWORDBridgePasswordAuthorityPasswordPassword for requesting bridge informationIf set, contains an HTTP authenticator that tells a bridge authority to serve all requested bridge information. Used by the (only partially implemented) "bridge community" design, where a community of bridge relay operators all use an alternate bridge directory authority, and their target user audience can periodically fetch the list of available community bridges to stay up-to-date. (Default: not set)õƒOu AAk…7AUTHDIRTESTED25519LINKKEYSAuthDirTestEd25519LinkKeysAuthority0|1Require proper Ed25519 key for the Running flagAuthoritative directories only. If this option is set to 0, then we treat relays as "Running" if their RSA key is correct when we probe them, regardless of their Ed25519 key. We should only ever set this option to 0 if there is some major bug in Ed25519 link authentication that causes us to label all the relays as not Running. (Default: 1)ô ôŽôƒx +++k„YV3AUTHVOTEDELAYV3AuthVoteDelayAuthorityN minutes|hoursWait time to collect votes of other authoritiesV3 authoritative directories only. Configures the server's preferred delay between publishing its vote and assuming it has all the votes from all the other authorities. Note that the actual time used is not the server's preferred time, but the consensus of all preferences. (Default: 5 minutes)÷‚nw 55+?„!V3AUTHVOTINGINTERVALV3AuthVotingIntervalAuthorityN minutes|hoursConsensus voting intervalV3 authoritative directories only. Configures the server's preferred voting interval. Note that voting will actually happen at an interval chosen by consensus from all the authorities' preferred intervals. This time SHOULD divide evenly into a day. (Default: 1 hour)ö KEKƒvz 77s†V3AUTHNINTERVALSVALIDV3AuthNIntervalsValidAuthorityNUMNumber of voting intervals a consensus is valid forV3 authoritative directories only. Configures the number of VotingIntervals for which each consensus should be valid for. Choosing high numbers increases network partitioning risks; choosing low numbers increases directory traffic. Note that the actual number of intervals used is not the server's preferred number, but the consensus of all preferences. Must be at least 2. (Default: 3)ùƒ7y +++}… V3AUTHDISTDELAYV3AuthDistDelayAuthorityN minutes|hoursWait time to collect the signatures of other authoritiesV3 authoritative directories only. Configures the server's preferred delay between publishing its consensus and signature and assuming it has all the signatures from all the other authorities. Note that the actual time used is not the server's preferred time, but the consensus of all preferences. (Default: 5 minutes)ø è`è‚t| 11w„V3AUTHUSELEGACYKEYV3AuthUseLegacyKeyAuthority0|1Signs consensus with both the current and legacy keysIf set, the directory authority will sign consensuses not only with its own signing key, but also with a "legacy" key and certificate with a different identity. This feature is used to migrate directory authority keys in the event of a compromise. (Default: 0)ûƒ{ --s„gV3BANDWIDTHSFILEV3BandwidthsFileAuthorityFILENAMEPath to a file containing measured relay bandwidthsV3 authoritative directories only. Configures the location of the bandwidth-authority generated file storing information on relays' measured bandwidth capacities. To avoid inconsistent reads, bandwidth data should be written to temporary file, then renamed to the configured filename. (Default: unset)úe relay. If the reachability test fails, the authority does not vote for the IPv6 ORPort, and does not vote Running (Default: 0) The content of the consensus depends on the number of voting authorities that set AuthDirHasIPv6Connectivity: If no authorities set AuthDirHasIPv6Connectivity 1, there will be no IPv6 ORPorts in the consensus. If a minority of authorities set AuthDirHasIPv6Connectivity 1, unreachable IPv6 ORPorts will be removed from the consensus. But the majority of IPv4-only authorities will still vote the relay as Running. Reachable IPv6 ORPort lines will be included in the consensus If a majority of voting authorities set AuthDirHasIPv6Connectivity 1, relays with unreachable IPv6 ORPorts will not be listed as Running. Reachable IPv6 ORPort lines will be included in the consensus (To ensure that any valid majority will vote relays with unreachable IPv6 ORPorts not Running, 75% of authorities must set AuthDirHasIPv6Connectivity 1.)ü ¼H¼ƒ~ [[#ƒ?MINMEASUREDBWSFORAUTHTOIGNOREADVERTISEDMinMeasuredBWsForAuthToIgnoreAdvertisedAuthorityNTotal measured value before advertised bandwidths are treated as unreliableA total value, in abstract bandwidth units, describing how much measured total bandwidth an authority should have observed on the network before it will treat advertised bandwidths as wholly unreliable. (Default: 500)ý‹,} AA”SAUTHDIRHASIPV6CONNECTIVITYAuthDirHasIPv6ConnectivityAuthority0|1Descriptors can be retrieved over the authority's IPv6 ORPortAuthoritative directories only. When set to 0, OR ports with an IPv6 address are not included in the authority's votes. When set to 1, IPv6 OR ports are tested for reachability like IPv4 OR ports. If the reachability test succeeds, the authority votes for the IPv6 ORPort, and votes Running for thÊ ´´„H --)_‡GHIDDENSERVICEDIRHiddenServiceDirHidden ServiceDIRECTORYDirectory contents for the hidden serviceStore data files for a hidden service in DIRECTORY. Every hidden service must have a separate directory. You may use this option multiple times to specify multiple services. If DIRECTORY does not exist, Tor will create it. (Note: in current versions of Tor, if DIRECTORY is a relative path, it will be relative to the current working directory of Tor instance, not to its DataDirectory. Do not rely on this behavior; it is not guaranteed to remain the same in future versions.)þ ØØ†$‚ //)/YŠqHIDDENSERVICEPORTHiddenServicePortHidden ServiceVIRTPORT [TARGET]Port the hidden service is provided onConfigure a virtual port VIRTPORT for a hidden service. You may use this option multiple times; each time applies to the service using the most recent HiddenServiceDir. By default, this option maps the virtual port to the same port on 127.0.0.1 over TCP. You may override the target port, address, or both by specifying a target of addr, port, addr:port, or unix:path. (You can specify an IPv6 target as [addr]:port. Unix paths may be quoted, and may use standard C escapes.) You may also have multiple lines with the same VIRTPORT: when a user connects to that VIRTPORT, one of the TARGETs from those lines will be chosen at random. Note that address-port pairs have to be comma-separated.ÿ uxu‚ 55)m‚#HIDDENSERVICEVERSIONHiddenServiceVersionHidden Service2|3Version for published hidden service descriptorsA list of rendezvous service descriptor versions to publish for the hidden service. Currently, versions 2 and 3 are supported. (Default: 3)ƒ‚ ??))ƒ[PUBLISHHIDSERVDESCRIPTORSPublishHidServDescriptorsHidden Service0|1Toggles automated publishing of the hidden service to the rendezvous directoryIf set to 0, Tor will run any hidden services you configure, but it won't advertise them to the rendezvous directory. This option is only useful if you're using a Tor controller that handles hidserv publishing for you. (Default: 1) ‚‚†z‚ EE)WY‹IHIDDENSERVICEAUTHORIZECLIENTHiddenServiceAuthorizeClientHidden Serviceauth-type client-name,client-name,...Restricts access to the hidden serviceIf configured, the hidden service is accessible for authorized clients only. The auth-type can either be 'basic' for a general-purpose authorization protocol or 'stealth' for a less scalable protocol that also hides service activity from unauthorized clients. Only clients that are listed here are authorized to access the hidden service. Valid client names are 1 to 16 characters long and only use characters in A-Za-z0-9+-_ (no spaces). If this option is set, the hidden service is not accessible for clients without authorization any more. Generated authorization data can be found in the hostname file. Clients need to put this authorization data in their configuration file using HidServAuth. This option is only for v2 services.H”ûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’ˆƒ~ytoje`[VQLGB=83.)$ ü÷òíèãÞÙÔÏÊÅÀ»¶±¬¦ š”Žˆ‚|vpjd^XRLF@:4.(" þøòìæàÚÔÎȼ¶°ª¤ž˜’Œ†€ztnhb\VPJD>82,& ~|{xw~v|uztxsvrsqrpqjnilhjfhegdfcebdac`b_`^_\^[\YZXXWWVUSTQPPNOLNKMHLFKDJAI?H<G;F:D9C6B2A0@/>-=*9(8%7$6"4!3 210/.+*)( ' &%$#"!VüîúôîèâÜÖÐÊľ¸²¬¦ š”Žˆ‚|vpjd^XRLF@:4.(" þøòìæàÚÔÎȼ¶°ª¤ž˜’Œ†€ztnhb\VPJD>82,& üí‚2ì‚.ë‚+é‚)è‚'ç‚%æ‚#å‚ ä‚ã‚â‚à‚߂݂܂ۂڂ Ù‚ ׂ Õ‚ Ô‚Ò‚Ï‚΂Í‚ÌË~É|ÈzÇxÆvÅtÄrÃoÁmÀi¿g¾d½b¼`»^º\¹[¸Y·W¶TµR´Q³P²N±L°J®H­E¬C«Aª?©=¨<¦:¥8¤6¢5 3Ÿ/.œ-˜+—*–)•(”'“%’#‘"!Ž Œ‹‰ˆƒ‚ € ÞwÞ‹ ‚ EE){”HIDDENSERVICEEXPORTCIRCUITIDHiddenServiceExportCircuitIDHidden ServiceprotocolExposes incoming client circuits via the given protocolThe onion service will use the given protocol to expose the global circuit identifier of each inbound client circuit via the selected protocol. The only protocol supported right now 'haproxy'. This option is only for v3 services. (Default: none) The haproxy Óƒ‚ II)k„ HIDDENSERVICEALLOWUNKNOWNPORTSHiddenServiceAllowUnknownPortsHidden Service0|1Allow rendezvous circuits on unrecognized portsIf set to 1, then connections to unrecognized ports do not cause the current hidden service to close rendezvous circuits. (Setting this to 0 is not an authorization mechanism; it is instead meant to be a mild inconvenience to port-scanners.) (Default: 0)option works in the following way: when the feature is enabled, the Tor process will write a header line when a client is connecting to the onion service. The header will look like this: "PROXY TCP6 fc00:dead:beef:4dad::ffff:ffff ::1 65535 42\r\n" We encode the "global circuit identifier" as the last 32-bits of the first IPv6 address. All other values in the header can safely be ignored. You can compute the global circuit identifier using the following formula given the IPv6 address "fc00:dead:beef:4dad::AABB:CCDD": global_circuit_id = (0xAA << 24) + (0xBB << 16) + (0xCC << 8) + 0xDD; In the case above, where the last 32-bit is 0xffffffff, the global circuit identifier would be 4294967295. You can use this value together with Tor's control port where it is possible to terminate a circuit given the global circuit identifier. For more information about this see controls-spec.txt. The HAProxy version 1 proxy protocol is described in detail at https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt DÁD‚y‚ SS)ƒ1HIDDENSERVICEMAXSTREAMSCLOSECIRCUITHiddenServiceMaxStreamsCloseCircuitHidden Service0|1Closes rendezvous circuits that exceed the maximum number of streamsIf set to 1, then exceeding HiddenServiceMaxStreams will cause the offending rendezvous circuit to be torn down, as opposed to stream creation requests that exceed the limit being silently ignored. (Default: 0)‚;‚ ;;)Yƒ'HIDDENSERVICEMAXSTREAMSHiddenServiceMaxStreamsHidden ServiceNMaximum streams per rendezvous circuitThe maximum number of simultaneous streams (connections) per rendezvous circuit. The maximum value allowed is 65535. (Setting this to 0 will allow an unlimited number of simultaneous streams.) (Default: 0) ÎH΂v‚ GG){ƒ_HIDDENSERVICEDIRGROUPREADABLEHiddenServiceDirGroupReadableHidden Service0|1Group read permissions for the hidden service directoryIf this option is set to 1, allow the filesystem group to read the hidden service directory and hostname file. If the option is set to 0, only owner is able to read the hidden service directory. (Default: 0) Has no effect on Windows.ƒ4‚ )))Q „ERENDPOSTPERIODRendPostPeriodHidden ServiceN seconds|minutes|hours|days|weeksPeriod at which the rendezvous service descriptors are refreshedEvery time the specified period elapses, Tor uploads any rendezvous service descriptors to the directory servers. This information is also uploaded whenever it changes. Minimum value allowed is 10 minutes and maximum is 3.5 days. This option is only for v2 services. (Default: 1 hour) LâÆ¢…`!ü>½ÞÑgœ°€YLBüÔ°¢„qXI5È¢†j7TESTINGSIGNINGKEYSLOP41TESTINGLINKKEYSLOP2;TESTINGLINKCERTLIFETIME0 CTESTINGMINEXITFLAGTHRESHOLD/ CTESTINGENABLECELLSTATSEVENT.=TESTINGENABLECONNBWEVENT-$KTESTINGDIRAUTHVOTEHSDIRISSTRICT,;TESTINGDIRAUTHVOTEHSDIR+!ETESTINGDIRCONNECTIONMAXSTALL&$KTESTINGDIRAUTHVOTEGUARDISSTRICT*;TESTINGDIRAUTHVOTEGUARD)#ITESTINGDIRAUTHVOTEEXITISSTRICT(9TESTINGDIRAUTHVOTEEXIT'+YTESTINGCLIENTMAXINTERVALWITHOUTREQUEST%&OTESTINGCLIENTDOWNLOADINITIALDELAY )TRANSPROXYTYPE…TRANSPORT„5TRACKHOSTEXITSEXPIREt)TRACKHOSTEXITSs?TOKENBUCKETREFILLINTERVALr TESTSOCKS#ITESTINGV3AUTHVOTINGSTARTOFFSET'QTESTINGV3AUTHINITIALVOTINGINTERVAL"GTESTINGV3AUTHINITIALVOTEDELAY"GTESTINGV3AUTHINITIALDISTDELAY/TESTINGTORNETWORK&OTESTINGSERVERDOWNLOADINITIALDELAY/aTESTINGSERVERCONSENSUSDOWNLOADINITIALDELAY! CTESTINGMINFASTFLAGTHRESHOLD._TESTINGESTIMATEDDESCRIPTORPROPAGATIONTIME ðßð‹c‚ AA)i•WHIDDENSERVICESINGLEHOPMODEHiddenServiceSingleHopModeHidden Service0|1Allow non-anonymous single hop hidden servicesExperimental - Non Anonymous Hidden Services on a tor instance in HiddenServiceSingleHopMode make one-hop (direct) circuits between the onion service server, and the introduction and rendezvous points. (Onion service descriptors are still posted using 3-hop paths, to avoid onion service directories blocking the service.) This option makes every hidden service iØ‚‚ QQ)‚HIDDENSERVICENUMINTRODUCTIONPOINTSHiddenServiceNumIntroductionPointsHidden ServiceNUMNumber of introduction points the hidden service will haveNumber of introduction points the hidden service will have. You can't have more than 10 for v2 service and 20 for v3. (Default: 3) nstance hosted by a tor instance a Single Onion Service. One-hop circuits make Single Onion servers easily locatable, but clients remain location-anonymous. However, the fact that a client is accessing a Single Onion rather than a Hidden Service may be statistically distinguishable. WARNING: Once a hidden service directory has been used by a tor instance in HiddenServiceSingleHopMode, it can NEVER be used again for a hidden service. It is best practice to create a new hidden service directory, key, and address for each new Single Onion Service and Hidden Service. It is not possible to run Single Onion Services and Hidden Services from the same tor instance: they should be run on different servers with different IP addresses. HiddenServiceSingleHopMode requires HiddenServiceNonAnonymousMode to be set to 1. Since a Single Onion service is non-anonymous, you can not configure a SOCKSPort on a tor instance that is running in HiddenServiceSingleHopMode. Can not be changed while tor is running. (Default: 0)   ƒr‚ GG)e…mHIDDENSERVICENONANONYMOUSMODEHiddenServiceNonAnonymousModeHidden Service0|1Enables HiddenServiceSingleHopMode to be setMakes hidden services non-anonymous on this tor instance. Allows the non-anonymous HiddenServiceSingleHopMode. Enables direct connections in the server-side hidden service protocol. If you are using this option, you need to disable all client-side services on your Tor instance, including setting SOCKSPort to "0". Can not be changed while tor is running. (Default: 0) ½½„?‚ ??/[‡DOSCIRCUITCREATIONENABLEDDoSCircuitCreationEnabledDenial Of Service0|1|autoEnables circuit creation DoS mitigationEnable circuit creation DoS mitigation. If set to 1 (enabled), tor will cache client IPs along with statistics in order to detect circuit DoS attacks. If an address is positively identified, tor will activate defenses against the address. See the DoSCircuitCreationDefenseType option for more details. This is a client to relay detection only. "auto" means use the consensus parameter. If not defined in the consensus, the value is 0. (Default: auto) ×ׂ-‚ 99/Uƒ DOSCIRCUITCREATIONRATEDoSCircuitCreationRateDenial Of ServiceNUMAcceptable rate for circuit creationThe allowed circuit creation rate per second applied per client IP address. If this option is 0, it obeys a consensus parameter. If not defined in the consensus, the value is 3. (Default: 0)ƒt‚ MM/m…WDOSCIRCUITCREATIONMINCONNECTIONSDoSCircuitCreationMinConnectionsDenial Of ServiceNUMConnection rate when clients are a suspected DoSMinimum threshold of concurrent connections before a client address can be flagged as executing a circuit creation DoS. In other words, once a client address reaches the circuit rate and has a minimum of NUM concurrent connections, a detection is positive. "0" means use the consensus parameter. If not defined in the consensus, the value is 3. (Default: 0) Êyʃ+‚ GG/a„]DOSCIRCUITCREATIONDEFENSETYPEDoSCircuitCreationDefenseTypeDenial Of ServiceNUMMethod for mitigating circuit creation DoSThis is the type of defense applied to a detected client address. The possible values are: 1: No defense. 2: Refuse circuit creation for the DoSCircuitCreationDefenseTimePeriod period of time. "0" means use the consensus parameter. If not defined in the consensus, the value is 2. (Default: 0)ƒ‚ ;;/m„DOSCIRCUITCREATIONBURSTDoSCircuitCreationBurstDenial Of ServiceNUMAccept burst of circuit creation up to this rateThe allowed circuit creation burst per client IP address. If the circuit rate and the burst are reached, a client is marked as executing a circuit creation DoS. "0" means use the consensus parameter. If not defined in the consensus, the value is 90. (Default: 0) Â[ƒ‚ 55/O„]DOSCONNECTIONENABLEDDoSConnectionEnabledDenial Of Service0|1|autoEnables connection DoS mitigationEnable the connection DoS mitigation. If set to 1 (enabled), for client address only, this allows tor to mitigate against large number of concurrent connections made by a single IP address. "auto" means use the consensus parameter. If not defined in the consensus, the value is 0. (Default: auto)ƒ!‚ SS/;A„)DOSCIRCUITCREATIONDEFENSETIMEPERIODDoSCircuitCreationDefenseTimePeriodDenial Of ServiceN seconds|minutes|hoursDuration of DoS mitigationThe base time period in seconds that the DoS defense is activated for. The actual value is selected randomly for each activation from N+1 to 3/2 * N. "0" means use the consensus parameter. If not defined in the consensus, the value is 3600 seconds (1 hour). (Default: 0) A㺗oX8ñÞ˽¢“wcUA+KEEPALIVEPERIOD7 IPV6EXIT°)HTTPTUNNELPORTƒ;HTTPSPROXYAUTHENTICATOR0!HTTPSPROXY/9HTTPPROXYAUTHENTICATOR. HTTPPROXY-'HSLAYER3NODES‘'HSLAYER2NODES#HIDSERVAUTHf5HIDDENSERVICEVERSION;HIDDENSERVICESTATISTICSÏAHIDDENSERVICESINGLEHOPMODE /HIDDENSERVICEPORT'QHIDDENSERVICENUMINTRODUCTIONPOINTS "GHIDDENSERVICENONANONYMOUSMODE (SHIDDENSERVICEMAXSTREAMSCLOSECIRCUIT;HIDDENSERVICEMAXSTREAMS ÷ƒ÷ƒ‚ ==/U„7DOSCONNECTIONDEFENSETYPEDoSConnectionDefenseTypeDenial Of ServiceNUMMethod for mitigating connection DoSThis is the type of defense applied to a detected client address for the connection mitigation. The possible values are: 1: No defense. 2: Immediately close new connections. "0" means use the consensus parameter. If not defined in the consensus, the value is 2. (Default: 0)‚y‚ KK/M„DOSCONNECTIONMAXCONCURRENTCOUNTDoSConnectionMaxConcurrentCountDenial Of ServiceNUMAcceptable number of connectionsThe maximum threshold of concurrent connection from a client IP address. Above this limit, a defense selected by DoSConnectionDefenseType is applied. "0" means use the consensus parameter. If not defined in the consensus, the value is 100. (Default: 0) 88ƒD‚ QQ/w„[DOSREFUSESINGLEHOPCLIENTRENDEZVOUSDoSRefuseSingleHopClientRendezvousDenial Of Service0|1|autoPrevent establishment of single hop rendezvous pointsRefuse establishment of rendezvous points for single hop clients. In other words, if a client directly connects to the relay and sends an ESTABLISH_RENDEZVOUS cell, it is silently dropped. "auto" means use the consensus parameter. If not defined in the consensus, the value is 0. (Default: auto)AuthorityOnlyDownloadInitialDelay 0 ClientDNSRejectInternalAddresses 0 ClientRejectInternalAddresses 0 CountPrivateBandwidth 1 ExitPolicyRejectPrivate 0 ExtendAllowPrivateAddresses 1 V3AuthVotingInterval 5 minutes V3AuthVoteDelay 20 seconds V3AuthDistDelay 20 seconds MinUptimeHidServDirectoryV2 0 seconds TestingV3AuthInitialVotingInterval 5 minutes TestingV3AuthInitialVoteDelay 20 seconds TestingV3AuthInitialDistDelay 20 seconds TestingAuthDirTimeToLearnReachability 0 minutes TestingEstimatedDescriptorPropagationTime 0 minutes TestingServerDownloadInitialDelay 0 TestingClientDownloadInitialDelay 0 TestingServerConsensusDownloadInitialDelay 0 TestingClientConsensusDownloadInitialDelay 0 TestingBridgeDownloadInitialDelay 10 TestingBridgeBootstrapDownloadInitialDelay 0 TestingClientMaxIntervalWithoutRequest 5 seconds TestingDirConnectionMaxStall 30 seconds TestingEnableConnBwEvent 1 TestingEnableCellStatsEvent 1 YY‚ //k˜wTESTINGTORNETWORKTestingTorNetworkTesting0|1Overrides other options to be a testing networkIf set to 1, Tor adjusts default values of the configuration options below, so that it is easier to set up a testing Tor network. May only be set if non-default set of DirAuthorities is set. Cannot be unset while Tor is running. (Default: 0) ServerDNSAllowBrokenConfig 1 DirAllowPrivateAddresses 1 EnforceDistinctSubnets 0 AssumeReachable 1 AuthDirMaxServersPerAddr 0 AuthDirMaxServersPerAuthAddr 0 ClientBootstrapConsensusAuthorityDownloadInitialDelay 0 ClientBootstrapConsensusFallbackDownloadInitialDelay 0 ClientBootstrapConsensusá ®b‚H‚ GG+ ‚gTESTINGV3AUTHINITIALDISTDELAYTestingV3AuthInitialDistDelayTestingN minutes|hoursOverrides TestingV3AuthInitialDistDelay for the first consensusLike V3AuthDistDelay, but for initial voting interval before the first consensus has been created. Changing this requires that TestingTorNetwork is set. (Default: 5 minutes)‚H‚ GG+ ‚gTESTINGV3AUTHINITIALVOTEDELAYTestingV3AuthInitialVoteDelayTestingN minutes|hoursOverrides TestingV3AuthInitialVoteDelay for the first consensusLike V3AuthVoteDelay, but for initial voting interval before the first consensus has been created. Changing this requires that TestingTorNetwork is set. (Default: 5 minutes)‚N‚ QQ+y‚sTESTINGV3AUTHINITIALVOTINGINTERVALTestingV3AuthInitialVotingIntervalTestingN minutes|hoursOverrides V3AuthVotingInterval for the first consensusLike V3AuthVotingInterval, but for initial voting interval before the first consensus has been created. Changing this requires that TestingTorNetwork is set. (Default: 30 minutes) çr‚X‚ __+‚GTESTINGESTIMATEDDESCRIPTORPROPAGATIONTIMETestingEstimatedDescriptorPropagationTimeTestingN minutes|hoursDelay before clients attempt to fetch descriptors from directory cachesClients try downloading server descriptors from directory caches after this time. Changing this requires that TestingTorNetwork is set. (Default: 10 minutes)‚q‚ WW+ƒTESTINGAUTHDIRTIMETOLEARNREACHABILITYTestingAuthDirTimeToLearnReachabilityTestingN minutes|hoursDelay until opinions are given about which relays are running or notAfter starting as an authority, do not make claims about whether routers are Running until this much time has passed. Changing this requires that TestingTorNetwork is set. (Default: 30 minutes)‚‚ II;o‚ TESTINGV3AUTHVOTINGSTARTOFFSETTestingV3AuthVotingStartOffsetTestingN seconds|minutes|hoursOffset for the point at which the authority votesDirectory authorities offset voting start time by this much. Changing this requires that TestingTorNetwork is set. (Default: 0) ¢Ô½¢‚‚ OOs‚+TESTINGCLIENTDOWNLOADINITIALDELAYTestingClientDownloadInitialDelayTestingNDelay before downloading resources for client usageInitial delay in seconds for when clients should download things in general. Changing this requires that TestingTorNetwork is set. (Default: 0)‚‚ OOk‚+TESTINGSERVERDOWNLOADINITIALDELAYTestingServerDownloadInitialDelayTestingNDelay before downloading resources for relayingInitial delay in seconds for when servers should download things in general. Changing this requires that TestingTorNetwork is set. (Default: 0)‚(‚ CCK‚TESTINGMINFASTFLAGTHRESHOLDTestingMinFastFlagThresholdTestingN bytes|KBytes|MBytes|GBytes|TBytes|KBits|MBits|GBits|TBitsMinimum value for the Fast flagMinimum value for the Fast flag. Overrides the ordinary minimum taken from the consensus when TestingTorNetwork is set. (Default: 0.) NÛ²N‚`‚# OOcƒMTESTINGBRIDGEDOWNLOADINITIALDELAYTestingBridgeDownloadInitialDelayTestingNDelay before downloading bridge descriptorsInitial delay in seconds for when clients should download each bridge descriptor when they know that one or more of their configured bridges are running. Changing this requires that TestingTorNetwork is set. (Default: 10800)"‚%‚" aaw‚TESTINGCLIENTCONSENSUSDOWNLOADINITIALDELAYTestingClientConsensusDownloadInitialDelayTestingNDelay before downloading descriptors for client usageInitial delay in seconds for when clients should download consensuses. Changing this requires that TestingTorNetwork is set. (Default: 0)!‚!‚! aao‚TESTINGSERVERCONSENSUSDOWNLOADINITIALDELAYTestingServerConsensusDownloadInitialDelayTestingNDelay before downloading descriptors for relayingInitial delay in seconds for when servers should download consensuses. Changing this requires that TestingTorNetwork is set. (Default: 0) ès胂% YY/ ƒ?TESTINGCLIENTMAXINTERVALWITHOUTREQUESTTestingClientMaxIntervalWithoutRequestTestingN seconds|minutesMaximum time to wait to batch requests for missing descriptorsWhen directory clients have only a few descriptors to request, they batch them until they have more, or until this amount of time has passed. Changing this requires that TestingTorNetwork is set. (Default: 10 minutes)$ƒ ‚$ aa ƒSTESTINGBRIDGEBOOTSTRAPDOWNLOADINITIALDELAYTestingBridgeBootstrapDownloadInitialDelayTestingNDelay before downloading bridge descriptors when first startedInitial delay in seconds for when clients should download each bridge descriptor when they have just started, or when they can not contact any of their bridges. Changing this requires that TestingTorNetwork is set. (Default: 0)# ôÚôƒb‚' 99'K…}TESTINGDIRAUTHVOTEEXITTestingDirAuthVoteExitTestingnode,node,...Relays to give the Exit flag toA list of identity fingerprints, country codes, and address patterns of nodes to vote Exit for regardless of their uptime, bandwidth, or exit policy. See the ExcludeNodes option for more information on how to specify nodes. In order for this option to have any effect, TestingTorNetwork has to be set. See the ExcludeNodes option for more information on how to specify nodes.&‚"‚& EE/‚TESTINGDIRCONNECTIONMAXSTALLTestingDirConnectionMaxStallTestingN seconds|minutesDuration to let directory connections stall before timing outLet a directory connection stall this long before expiring it. Changing this requires that TestingTorNetwork is set. (Default: 5 minutes)% ßt߃‚) ;;'M„UTESTINGDIRAUTHVOTEGUARDTestingDirAuthVoteGuardTestingnode,node,...Relays to give the Guard flag toA list of identity fingerprints and country codes and address patterns of nodes to vote Guard for regardless of their uptime and bandwidth. See the ExcludeNodes option for more information on how to specify nodes. In order for this option to have any effect, TestingTorNetwork has to be set.(ƒ‚( IIƒsTESTINGDIRAUTHVOTEEXITISSTRICTTestingDirAuthVoteExitIsStrictTesting0|1Only grant the Exit flag to relays listed by TestingDirAuthVoteExitIf True (1), a node will never receive the Exit flag unless it is specified in the TestingDirAuthVoteExit list, regardless of its uptime, bandwidth, or exit policy. In order for this option to have any effect, TestingTorNetwork has to be set.' 1寷œ‰t[R="ì×½§eI11WARNPLAINTEXTPORTS9VIRTUALADDRNETWORKIPV69VIRTUALADDRNETWORKIPV4€%MVERSIONINGAUTHORITATIVEDIRECTORYà-V3BANDWIDTHSFILEû5V3AUTHVOTINGINTERVAL÷+V3AUTHVOTEDELAYø1V3AUTHUSELEGACYKEYü=V3AUTHORITATIVEDIRECTORYß7V3AUTHNINTERVALSVALIDú+V3AUTHDISTDELAYùUSERF3USEMICRODESCRIPTORS’-USEGUARDFRACTIONy)USEENTRYGUARDSw9USEDEFAULTFALLBACKDIRS!!USEBRIDGESvAUPDATEBRIDGESFROMAUTHORITYu9UNIXSOCKSGROUPWRITABLE6 ê{êƒ ‚+ ;;'M„MTESTINGDIRAUTHVOTEHSDIRTestingDirAuthVoteHSDirTestingnode,node,...Relays to give the HSDir flag toA list of identity fingerprints and country codes and address patterns of nodes to vote HSDir for regardless of their uptime and DirPort. See the ExcludeNodes option for more information on how to specify nodes. In order for this option to have any effect, TestingTorNetwork must be set.*ƒ‚* KKƒ]TESTINGDIRAUTHVOTEGUARDISSTRICTTestingDirAuthVoteGuardIsStrictTesting0|1Only grant the Guard flag to relays listed by TestingDirAuthVoteGuardIf True (1), a node will never receive the Guard flag unless it is specified in the TestingDirAuthVoteGuard list, regardless of its uptime and bandwidth. In order for this option to have any effect, TestingTorNetwork has to be set.) k}zk‚ ‚. CCi‚1TESTINGENABLECELLSTATSEVENTTestingEnableCellStatsEventTesting0|1Allow controllers to request CELL_STATS eventsIf this option is set, then Tor controllers may register for CELL_STATS events. Changing this requires that TestingTorNetwork is set. (Default: 0)-‚- ==c‚+TESTINGENABLECONNBWEVENTTestingEnableConnBwEventTesting0|1Allow controllers to request CONN_BW eventsIf this option is set, then Tor controllers may register for CONN_BW events. Changing this requires that TestingTorNetwork is set. (Default: 0),‚‚, KKƒYTESTINGDIRAUTHVOTEHSDIRISSTRICTTestingDirAuthVoteHSDirIsStrictTesting0|1Only grant the HSDir flag to relays listed by TestingDirAuthVoteHSDirIf True (1), a node will never receive the HSDir flag unless it is specified in the TestingDirAuthVoteHSDir list, regardless of its uptime and DirPort. In order for this option to have any effect, TestingTorNetwork has to be set.+ !ºŸ­!‚2 11; TESTINGLINKKEYSLOPTestingLinkKeySlopTestingN seconds|minutes|hoursTime before expiration that we replace our ed25519 link key1n‚1 99_USTESTINGAUTHKEYLIFETIMETestingAuthKeyLifetimeTestingN seconds|minutes|hours|days|weeks|monthsDuration for our ed25519 signing keyOverrides the default lifetime for a signing Ed25519 TLS Link authentication key. (Default: 2 days)0‚‚0 ;;_S‚#TESTINGLINKCERTLIFETIMETestingLinkCertLifetimeTestingN seconds|minutes|hours|days|weeks|monthsDuration of our ed25519 certificateOverrides the default lifetime for the certificates used to authenticate our X509 link cert with our ed25519 signing key. (Default: 2 days)/‚B‚/ CCw[‚ITESTINGMINEXITFLAGTHRESHOLDTestingMinExitFlagThresholdTestingN KBytes|MBytes|GBytes|TBytes|KBits|MBits|GBits|TBitsLower bound for assigning the Exit flagSets a lower-bound for assigning an exit flag when running as an authority on a testing network. Overrides the usual default lower bound of 4 KB. (Default: 0). 1j1‚5‚4 77; ‚STESTINGSIGNINGKEYSLOPTestingSigningKeySlopTestingN seconds|minutes|hoursTime before expiration that we replace our ed25519 signing keyHow early before the official expiration of a an Ed25519 signing key do we replace it and issue a new key? (Default: 3 hours for link and auth; 1 day for signing.)3‚3 11; TESTINGAUTHKEYSLOPTestingAuthKeySlopTestingN seconds|minutes|hoursTime before expiration that we replace our ed25519 authentication key2stem-1.7.1/stem/prereq.py0000664000175000017500000001623213341474573016051 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Checks for stem dependencies. We require python 2.6 or greater (including the 3.x series), but note we'll be bumping our requirements to python 2.7 in stem 2.0. Other requirements for complete functionality are... * cryptography module * validating descriptor signature integrity :: check_requirements - checks for minimum requirements for running stem is_python_3 - checks if python 3.0 or later is available is_sqlite_available - checks if the sqlite3 module is available is_crypto_available - checks if the cryptography module is available is_zstd_available - checks if the zstd module is available is_lzma_available - checks if the lzma module is available is_mock_available - checks if the mock module is available """ import functools import inspect import platform import sys CRYPTO_UNAVAILABLE = "Unable to import the cryptography module. Because of this we'll be unable to verify descriptor signature integrity. You can get cryptography from: https://pypi.python.org/pypi/cryptography" ZSTD_UNAVAILABLE = 'ZSTD compression requires the zstandard module (https://pypi.python.org/pypi/zstandard)' LZMA_UNAVAILABLE = 'LZMA compression requires the lzma module (https://docs.python.org/3/library/lzma.html)' PYNACL_UNAVAILABLE = "Unable to import the pynacl module. Because of this we'll be unable to verify descriptor ed25519 certificate integrity. You can get pynacl from https://pypi.python.org/pypi/PyNaCl/" def check_requirements(): """ Checks that we meet the minimum requirements to run stem. If we don't then this raises an ImportError with the issue. :raises: **ImportError** with the problem if we don't meet stem's requirements """ major_version, minor_version = sys.version_info[0:2] if major_version < 2 or (major_version == 2 and minor_version < 6): raise ImportError('stem requires python version 2.6 or greater') def _is_python_26(): """ Checks if we're running python 2.6. This isn't for users as it'll be removed in stem 2.0 (when python 2.6 support goes away). :returns: **True** if we're running python 2.6, **False** otherwise """ major_version, minor_version = sys.version_info[0:2] return major_version == 2 and minor_version == 6 def is_python_27(): """ Checks if we're running python 2.7 or above (including the 3.x series). .. deprecated:: 1.5.0 Function lacks much utility and will be eventually removed. :returns: **True** if we meet this requirement and **False** otherwise """ major_version, minor_version = sys.version_info[0:2] return major_version > 2 or (major_version == 2 and minor_version >= 7) def is_python_3(): """ Checks if we're in the 3.0 - 3.x range. :returns: **True** if we meet this requirement and **False** otherwise """ return sys.version_info[0] == 3 def is_pypy(): """ Checks if we're running PyPy. .. versionadded:: 1.7.0 :returns: **True** if running pypy, **False** otherwise """ return platform.python_implementation() == 'PyPy' def is_sqlite_available(): """ Checks if the sqlite3 module is available. Usually this is built in, but some platforms such as FreeBSD and Gentoo exclude it by default. .. versionadded:: 1.6.0 :returns: **True** if we can use the sqlite3 module and **False** otherwise """ try: import sqlite3 return True except ImportError: return False def is_crypto_available(): """ Checks if the cryptography functions we use are available. This is used for verifying relay descriptor signatures. :returns: **True** if we can use the cryptography module and **False** otherwise """ try: from cryptography.utils import int_from_bytes, int_to_bytes from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.primitives.serialization import load_der_public_key if not hasattr(rsa.RSAPrivateKey, 'sign'): raise ImportError() return True except ImportError: from stem.util import log log.log_once('stem.prereq.is_crypto_available', log.INFO, CRYPTO_UNAVAILABLE) return False def is_zstd_available(): """ Checks if the `zstd module `_ is available. .. versionadded:: 1.7.0 :returns: **True** if we can use the zstd module and **False** otherwise """ try: # Unfortunately the zstandard module uses the same namespace as another # zstd module (https://pypi.python.org/pypi/zstd), so we need to # differentiate them. import zstd return hasattr(zstd, 'ZstdDecompressor') except ImportError: from stem.util import log log.log_once('stem.prereq.is_zstd_available', log.INFO, ZSTD_UNAVAILABLE) return False def is_lzma_available(): """ Checks if the `lzma module `_ is available. This was added as a builtin in Python 3.3. .. versionadded:: 1.7.0 :returns: **True** if we can use the lzma module and **False** otherwise """ try: import lzma return True except ImportError: from stem.util import log log.log_once('stem.prereq.is_lzma_available', log.INFO, LZMA_UNAVAILABLE) return False def is_mock_available(): """ Checks if the mock module is available. In python 3.3 and up it is a builtin unittest module, but before this it needed to be `installed separately `_. Imports should be as follows.... :: try: # added in python 3.3 from unittest.mock import Mock except ImportError: from mock import Mock :returns: **True** if the mock module is available and **False** otherwise """ try: # checks for python 3.3 version import unittest.mock return True except ImportError: pass try: import mock # check for mock's patch.dict() which was introduced in version 0.7.0 if not hasattr(mock.patch, 'dict'): raise ImportError() # check for mock's new_callable argument for patch() which was introduced in version 0.8.0 if 'new_callable' not in inspect.getargspec(mock.patch).args: raise ImportError() return True except ImportError: return False def _is_lru_cache_available(): """ Functools added lru_cache to the standard library in Python 3.2. Prior to this using a bundled implementation. We're also using this with Python 3.5 due to a buggy implementation. (:trac:`26412`) """ major_version, minor_version = sys.version_info[0:2] if major_version == 3 and minor_version == 5: return False else: return hasattr(functools, 'lru_cache') def _is_pynacl_available(): """ Checks if the pynacl functions we use are available. This is used for verifying ed25519 certificates in relay descriptor signatures. :returns: **True** if we can use pynacl and **False** otherwise """ from stem.util import log try: from nacl import encoding from nacl import signing return True except ImportError: log.log_once('stem.prereq._is_pynacl_available', log.INFO, PYNACL_UNAVAILABLE) return False stem-1.7.1/stem/response/0000775000175000017500000000000013411004021016002 5ustar atagaratagar00000000000000stem-1.7.1/stem/response/add_onion.py0000664000175000017500000000346113341034346020331 0ustar atagaratagar00000000000000# Copyright 2015-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information import stem.response class AddOnionResponse(stem.response.ControlMessage): """ ADD_ONION response. :var str service_id: hidden service address without the '.onion' suffix :var str private_key: base64 encoded hidden service private key :var str private_key_type: crypto used to generate the hidden service private key (such as RSA1024) :var dict client_auth: newly generated client credentials the service accepts """ def _parse_message(self): # Example: # 250-ServiceID=gfzprpioee3hoppz # 250-PrivateKey=RSA1024:MIICXgIBAAKBgQDZvYVxv... # 250-ClientAuth=bob:l4BT016McqV2Oail+Bwe6w # 250 OK self.service_id = None self.private_key = None self.private_key_type = None self.client_auth = {} if not self.is_ok(): raise stem.ProtocolError("ADD_ONION response didn't have an OK status: %s" % self) if not str(self).startswith('ServiceID='): raise stem.ProtocolError('ADD_ONION response should start with the service id: %s' % self) for line in list(self): if '=' in line: key, value = line.split('=', 1) if key == 'ServiceID': self.service_id = value elif key == 'PrivateKey': if ':' not in value: raise stem.ProtocolError("ADD_ONION PrivateKey lines should be of the form 'PrivateKey=[type]:[key]: %s" % self) self.private_key_type, self.private_key = value.split(':', 1) elif key == 'ClientAuth': if ':' not in value: raise stem.ProtocolError("ADD_ONION ClientAuth lines should be of the form 'ClientAuth=[username]:[credential]: %s" % self) username, credential = value.split(':', 1) self.client_auth[username] = credential stem-1.7.1/stem/response/getinfo.py0000664000175000017500000000535413341474573020047 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information import stem.response import stem.socket class GetInfoResponse(stem.response.ControlMessage): """ Reply for a GETINFO query. :var dict entries: mapping between the queried options and their bytes values """ def _parse_message(self): # Example: # 250-version=0.2.3.11-alpha-dev (git-ef0bc7f8f26a917c) # 250+config-text= # ControlPort 9051 # DataDirectory /home/atagar/.tor # ExitPolicy reject *:* # Log notice stdout # Nickname Unnamed # ORPort 9050 # . # 250 OK self.entries = {} remaining_lines = [content for (code, div, content) in self.content(get_bytes = True)] if not self.is_ok() or not remaining_lines.pop() == b'OK': unrecognized_keywords = [] error_code, error_msg = None, None for code, _, line in self.content(): if code != '250': error_code = code error_msg = line if code == '552' and line.startswith('Unrecognized key "') and line.endswith('"'): unrecognized_keywords.append(line[18:-1]) if unrecognized_keywords: raise stem.InvalidArguments('552', 'GETINFO request contained unrecognized keywords: %s\n' % ', '.join(unrecognized_keywords), unrecognized_keywords) elif error_code: raise stem.OperationFailed(error_code, error_msg) else: raise stem.ProtocolError("GETINFO response didn't have an OK status:\n%s" % self) while remaining_lines: try: key, value = remaining_lines.pop(0).split(b'=', 1) except ValueError: raise stem.ProtocolError('GETINFO replies should only contain parameter=value mappings:\n%s' % self) if stem.prereq.is_python_3(): key = stem.util.str_tools._to_unicode(key) # if the value is a multiline value then it *must* be of the form # '=\n' if b'\n' in value: if not value.startswith(b'\n'): raise stem.ProtocolError("GETINFO response contained a multi-line value that didn't start with a newline:\n%s" % self) value = value[1:] self.entries[key] = value def _assert_matches(self, params): """ Checks if we match a given set of parameters, and raise a ProtocolError if not. :param set params: parameters to assert that we contain :raises: * :class:`stem.ProtocolError` if parameters don't match this response """ reply_params = set(self.entries.keys()) if params != reply_params: requested_label = ', '.join(params) reply_label = ', '.join(reply_params) raise stem.ProtocolError("GETINFO reply doesn't match the parameters that we requested. Queried '%s' but got '%s'." % (requested_label, reply_label)) stem-1.7.1/stem/response/getconf.py0000664000175000017500000000354713341034346020031 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information import stem.response import stem.socket class GetConfResponse(stem.response.ControlMessage): """ Reply for a GETCONF query. Note that configuration parameters won't match what we queried for if it's one of the special mapping options (ex. 'HiddenServiceOptions'). :var dict entries: mapping between the config parameter (**str**) and their values (**list** of **str**) """ def _parse_message(self): # Example: # 250-CookieAuthentication=0 # 250-ControlPort=9100 # 250-DataDirectory=/home/neena/.tor # 250 DirPort self.entries = {} remaining_lines = list(self) if self.content() == [('250', ' ', 'OK')]: return if not self.is_ok(): unrecognized_keywords = [] for code, _, line in self.content(): if code == '552' and line.startswith('Unrecognized configuration key "') and line.endswith('"'): unrecognized_keywords.append(line[32:-1]) if unrecognized_keywords: raise stem.InvalidArguments('552', 'GETCONF request contained unrecognized keywords: %s' % ', '.join(unrecognized_keywords), unrecognized_keywords) else: raise stem.ProtocolError('GETCONF response contained a non-OK status code:\n%s' % self) while remaining_lines: line = remaining_lines.pop(0) if line.is_next_mapping(): key, value = line.split('=', 1) else: key, value = (line.pop(), None) # Tor's CommaList and RouterList have a bug where they map to an empty # string when undefined rather than None... # # https://trac.torproject.org/projects/tor/ticket/18263 if value == '': value = None if key not in self.entries: self.entries[key] = [] if value is not None: self.entries[key].append(value) stem-1.7.1/stem/response/protocolinfo.py0000664000175000017500000001236713341034346021121 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information import sys import stem.prereq import stem.response import stem.socket import stem.version import stem.util.str_tools from stem.connection import AuthMethod from stem.util import log class ProtocolInfoResponse(stem.response.ControlMessage): """ Version one PROTOCOLINFO query response. The protocol_version is the only mandatory data for a valid PROTOCOLINFO response, so all other values are None if undefined or empty if a collection. :var int protocol_version: protocol version of the response :var stem.version.Version tor_version: version of the tor process :var tuple auth_methods: :data:`stem.connection.AuthMethod` types that tor will accept :var tuple unknown_auth_methods: strings of unrecognized auth methods :var str cookie_path: path of tor's authentication cookie """ def _parse_message(self): # Example: # 250-PROTOCOLINFO 1 # 250-AUTH METHODS=COOKIE COOKIEFILE="/home/atagar/.tor/control_auth_cookie" # 250-VERSION Tor="0.2.1.30" # 250 OK self.protocol_version = None self.tor_version = None self.auth_methods = () self.unknown_auth_methods = () self.cookie_path = None auth_methods, unknown_auth_methods = [], [] remaining_lines = list(self) if not self.is_ok() or not remaining_lines.pop() == 'OK': raise stem.ProtocolError("PROTOCOLINFO response didn't have an OK status:\n%s" % self) # sanity check that we're a PROTOCOLINFO response if not remaining_lines[0].startswith('PROTOCOLINFO'): raise stem.ProtocolError('Message is not a PROTOCOLINFO response:\n%s' % self) while remaining_lines: line = remaining_lines.pop(0) line_type = line.pop() if line_type == 'PROTOCOLINFO': # Line format: # FirstLine = "PROTOCOLINFO" SP PIVERSION CRLF # PIVERSION = 1*DIGIT if line.is_empty(): raise stem.ProtocolError("PROTOCOLINFO response's initial line is missing the protocol version: %s" % line) try: self.protocol_version = int(line.pop()) except ValueError: raise stem.ProtocolError('PROTOCOLINFO response version is non-numeric: %s' % line) # The piversion really should be '1' but, according to the spec, tor # does not necessarily need to provide the PROTOCOLINFO version that we # requested. Log if it's something we aren't expecting but still make # an effort to parse like a v1 response. if self.protocol_version != 1: log.info("We made a PROTOCOLINFO version 1 query but got a version %i response instead. We'll still try to use it, but this may cause problems." % self.protocol_version) elif line_type == 'AUTH': # Line format: # AuthLine = "250-AUTH" SP "METHODS=" AuthMethod *("," AuthMethod) # *(SP "COOKIEFILE=" AuthCookieFile) CRLF # AuthMethod = "NULL" / "HASHEDPASSWORD" / "COOKIE" # AuthCookieFile = QuotedString # parse AuthMethod mapping if not line.is_next_mapping('METHODS'): raise stem.ProtocolError("PROTOCOLINFO response's AUTH line is missing its mandatory 'METHODS' mapping: %s" % line) for method in line.pop_mapping()[1].split(','): if method == 'NULL': auth_methods.append(AuthMethod.NONE) elif method == 'HASHEDPASSWORD': auth_methods.append(AuthMethod.PASSWORD) elif method == 'COOKIE': auth_methods.append(AuthMethod.COOKIE) elif method == 'SAFECOOKIE': auth_methods.append(AuthMethod.SAFECOOKIE) else: unknown_auth_methods.append(method) message_id = 'stem.response.protocolinfo.unknown_auth_%s' % method log.log_once(message_id, log.INFO, "PROTOCOLINFO response included a type of authentication that we don't recognize: %s" % method) # our auth_methods should have a single AuthMethod.UNKNOWN entry if # any unknown authentication methods exist if AuthMethod.UNKNOWN not in auth_methods: auth_methods.append(AuthMethod.UNKNOWN) # parse optional COOKIEFILE mapping (quoted and can have escapes) if line.is_next_mapping('COOKIEFILE', True, True): self.cookie_path = line.pop_mapping(True, True, get_bytes = True)[1].decode(sys.getfilesystemencoding()) if stem.prereq.is_python_3(): self.cookie_path = stem.util.str_tools._to_unicode(self.cookie_path) # normalize back to str elif line_type == 'VERSION': # Line format: # VersionLine = "250-VERSION" SP "Tor=" TorVersion OptArguments CRLF # TorVersion = QuotedString if not line.is_next_mapping('Tor', True): raise stem.ProtocolError("PROTOCOLINFO response's VERSION line is missing its mandatory tor version mapping: %s" % line) try: self.tor_version = stem.version.Version(line.pop_mapping(True)[1]) except ValueError as exc: raise stem.ProtocolError(exc) else: log.debug("Unrecognized PROTOCOLINFO line type '%s', ignoring it: %s" % (line_type, line)) self.auth_methods = tuple(auth_methods) self.unknown_auth_methods = tuple(unknown_auth_methods) stem-1.7.1/stem/response/__init__.py0000664000175000017500000004430113341474573020146 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Parses replies from the control socket. **Module Overview:** :: convert - translates a ControlMessage into a particular response subclass ControlMessage - Message that's read from the control socket. |- SingleLineResponse - Simple tor response only including a single line of information. | |- from_str - provides a ControlMessage for the given string |- is_ok - response had a 250 status |- content - provides the parsed message content +- raw_content - unparsed socket data ControlLine - String subclass with methods for parsing controller responses. |- remainder - provides the unparsed content |- is_empty - checks if the remaining content is empty |- is_next_quoted - checks if the next entry is a quoted value |- is_next_mapping - checks if the next entry is a KEY=VALUE mapping |- peek_key - provides the key of the next entry |- pop - removes and returns the next entry +- pop_mapping - removes and returns the next entry as a KEY=VALUE mapping """ import codecs import io import re import threading import stem.socket import stem.util import stem.util.str_tools __all__ = [ 'add_onion', 'events', 'getinfo', 'getconf', 'protocolinfo', 'authchallenge', 'convert', 'ControlMessage', 'ControlLine', 'SingleLineResponse', ] KEY_ARG = re.compile('^(\S+)=') def convert(response_type, message, **kwargs): """ Converts a :class:`~stem.response.ControlMessage` into a particular kind of tor response. This does an in-place conversion of the message from being a :class:`~stem.response.ControlMessage` to a subclass for its response type. Recognized types include... =================== ===== response_type Class =================== ===== **ADD_ONION** :class:`stem.response.add_onion.AddOnionResponse` **AUTHCHALLENGE** :class:`stem.response.authchallenge.AuthChallengeResponse` **EVENT** :class:`stem.response.events.Event` subclass **GETCONF** :class:`stem.response.getconf.GetConfResponse` **GETINFO** :class:`stem.response.getinfo.GetInfoResponse` **MAPADDRESS** :class:`stem.response.mapaddress.MapAddressResponse` **PROTOCOLINFO** :class:`stem.response.protocolinfo.ProtocolInfoResponse` **SINGLELINE** :class:`stem.response.SingleLineResponse` =================== ===== :param str response_type: type of tor response to convert to :param stem.response.ControlMessage message: message to be converted :param kwargs: optional keyword arguments to be passed to the parser method :raises: * :class:`stem.ProtocolError` the message isn't a proper response of that type * :class:`stem.InvalidArguments` the arguments given as input are invalid, this is can only be raised if the response_type is: **GETINFO**, **GETCONF** * :class:`stem.InvalidRequest` the arguments given as input are invalid, this is can only be raised if the response_type is: **MAPADDRESS** * :class:`stem.OperationFailed` if the action the event represents failed, this is can only be raised if the response_type is: **MAPADDRESS** * **TypeError** if argument isn't a :class:`~stem.response.ControlMessage` or response_type isn't supported """ import stem.response.add_onion import stem.response.authchallenge import stem.response.events import stem.response.getinfo import stem.response.getconf import stem.response.mapaddress import stem.response.protocolinfo if not isinstance(message, ControlMessage): raise TypeError('Only able to convert stem.response.ControlMessage instances') response_types = { 'ADD_ONION': stem.response.add_onion.AddOnionResponse, 'AUTHCHALLENGE': stem.response.authchallenge.AuthChallengeResponse, 'EVENT': stem.response.events.Event, 'GETCONF': stem.response.getconf.GetConfResponse, 'GETINFO': stem.response.getinfo.GetInfoResponse, 'MAPADDRESS': stem.response.mapaddress.MapAddressResponse, 'PROTOCOLINFO': stem.response.protocolinfo.ProtocolInfoResponse, 'SINGLELINE': SingleLineResponse, } try: response_class = response_types[response_type] except TypeError: raise TypeError('Unsupported response type: %s' % response_type) message.__class__ = response_class message._parse_message(**kwargs) class ControlMessage(object): """ Message from the control socket. This is iterable and can be stringified for individual message components stripped of protocol formatting. Messages are never empty. .. versionchanged:: 1.7.0 Implemented equality and hashing. """ @staticmethod def from_str(content, msg_type = None, normalize = False, **kwargs): """ Provides a ControlMessage for the given content. .. versionadded:: 1.1.0 .. versionchanged:: 1.6.0 Added the normalize argument. :param str content: message to construct the message from :param str msg_type: type of tor reply to parse the content as :param bool normalize: ensures expected carriage return and ending newline are present :param kwargs: optional keyword arguments to be passed to the parser method :returns: stem.response.ControlMessage instance """ if normalize: if not content.endswith('\n'): content += '\n' content = re.sub('([\r]?)\n', '\r\n', content) msg = stem.socket.recv_message(io.BytesIO(stem.util.str_tools._to_bytes(content))) if msg_type is not None: convert(msg_type, msg, **kwargs) return msg def __init__(self, parsed_content, raw_content): if not parsed_content: raise ValueError("ControlMessages can't be empty") self._parsed_content = parsed_content self._raw_content = raw_content self._str = None self._hash = stem.util._hash_attr(self, '_raw_content') def is_ok(self): """ Checks if any of our lines have a 250 response. :returns: **True** if any lines have a 250 response code, **False** otherwise """ for code, _, _ in self._parsed_content: if code == '250': return True return False def content(self, get_bytes = False): """ Provides the parsed message content. These are entries of the form... :: (status_code, divider, content) **status_code** Three character code for the type of response (defined in section 4 of the control-spec). **divider** Single character to indicate if this is mid-reply, data, or an end to the message (defined in section 2.3 of the control-spec). **content** The following content is the actual payload of the line. For data entries the content is the full multi-line payload with newline linebreaks and leading periods unescaped. The **status_code** and **divider** are both strings (**bytes** in python 2.x and **unicode** in python 3.x). The **content** however is **bytes** if **get_bytes** is **True**. .. versionchanged:: 1.1.0 Added the get_bytes argument. :param bool get_bytes: provides **bytes** for the **content** rather than a **str** :returns: **list** of (str, str, str) tuples for the components of this message """ if stem.prereq.is_python_3() and not get_bytes: return [(code, div, stem.util.str_tools._to_unicode(content)) for (code, div, content) in self._parsed_content] else: return list(self._parsed_content) def raw_content(self, get_bytes = False): """ Provides the unparsed content read from the control socket. .. versionchanged:: 1.1.0 Added the get_bytes argument. :param bool get_bytes: if **True** then this provides **bytes** rather than a **str** :returns: **str** of the socket data used to generate this message """ if stem.prereq.is_python_3() and not get_bytes: return stem.util.str_tools._to_unicode(self._raw_content) else: return self._raw_content def __str__(self): """ Content of the message, stripped of status code and divider protocol formatting. """ if self._str is None: self._str = '\n'.join(list(self)) return self._str def __iter__(self): """ Provides :class:`~stem.response.ControlLine` instances for the content of the message. This is stripped of status codes and dividers, for instance... :: 250+info/names= desc/id/* -- Router descriptors by ID. desc/name/* -- Router descriptors by nickname. . 250 OK Would provide two entries... :: 1st - "info/names= desc/id/* -- Router descriptors by ID. desc/name/* -- Router descriptors by nickname." 2nd - "OK" """ for _, _, content in self._parsed_content: if stem.prereq.is_python_3(): content = stem.util.str_tools._to_unicode(content) yield ControlLine(content) def __len__(self): """ :returns: number of ControlLines """ return len(self._parsed_content) def __getitem__(self, index): """ :returns: :class:`~stem.response.ControlLine` at the index """ content = self._parsed_content[index][2] if stem.prereq.is_python_3(): content = stem.util.str_tools._to_unicode(content) return ControlLine(content) def __hash__(self): return self._hash def __eq__(self, other): return hash(self) == hash(other) if isinstance(other, ControlMessage) else False def __ne__(self, other): return not self == other class ControlLine(str): """ String subclass that represents a line of controller output. This behaves as a normal string with additional methods for parsing and popping entries from a space delimited series of elements like a stack. None of these additional methods effect ourselves as a string (which is still immutable). All methods are thread safe. """ def __new__(self, value): return str.__new__(self, value) def __init__(self, value): self._remainder = value self._remainder_lock = threading.RLock() def remainder(self): """ Provides our unparsed content. This is an empty string after we've popped all entries. :returns: **str** of the unparsed content """ return self._remainder def is_empty(self): """ Checks if we have further content to pop or not. :returns: **True** if we have additional content, **False** otherwise """ return self._remainder == '' def is_next_quoted(self, escaped = False): """ Checks if our next entry is a quoted value or not. :param bool escaped: unescapes the string :returns: **True** if the next entry can be parsed as a quoted value, **False** otherwise """ start_quote, end_quote = _get_quote_indices(self._remainder, escaped) return start_quote == 0 and end_quote != -1 def is_next_mapping(self, key = None, quoted = False, escaped = False): """ Checks if our next entry is a KEY=VALUE mapping or not. :param str key: checks that the key matches this value, skipping the check if **None** :param bool quoted: checks that the mapping is to a quoted value :param bool escaped: unescapes the string :returns: **True** if the next entry can be parsed as a key=value mapping, **False** otherwise """ remainder = self._remainder # temp copy to avoid locking key_match = KEY_ARG.match(remainder) if key_match: if key and key != key_match.groups()[0]: return False if quoted: # checks that we have a quoted value and that it comes after the 'key=' start_quote, end_quote = _get_quote_indices(remainder, escaped) return start_quote == key_match.end() and end_quote != -1 else: return True # we just needed to check for the key else: return False # doesn't start with a key def peek_key(self): """ Provides the key of the next entry, providing **None** if it isn't a key/value mapping. :returns: **str** with the next entry's key """ remainder = self._remainder key_match = KEY_ARG.match(remainder) if key_match: return key_match.groups()[0] else: return None def pop(self, quoted = False, escaped = False): """ Parses the next space separated entry, removing it and the space from our remaining content. Examples... :: >>> line = ControlLine("\\"We're all mad here.\\" says the grinning cat.") >>> print line.pop(True) "We're all mad here." >>> print line.pop() "says" >>> print line.remainder() "the grinning cat." >>> line = ControlLine("\\"this has a \\\\\\" and \\\\\\\\ in it\\" foo=bar more_data") >>> print line.pop(True, True) "this has a \\" and \\\\ in it" :param bool quoted: parses the next entry as a quoted value, removing the quotes :param bool escaped: unescapes the string :returns: **str** of the next space separated entry :raises: * **ValueError** if quoted is True without the value being quoted * **IndexError** if we don't have any remaining content left to parse """ with self._remainder_lock: next_entry, remainder = _parse_entry(self._remainder, quoted, escaped, False) self._remainder = remainder return next_entry def pop_mapping(self, quoted = False, escaped = False, get_bytes = False): """ Parses the next space separated entry as a KEY=VALUE mapping, removing it and the space from our remaining content. .. versionchanged:: 1.6.0 Added the get_bytes argument. :param bool quoted: parses the value as being quoted, removing the quotes :param bool escaped: unescapes the string :param bool get_bytes: provides **bytes** for the **value** rather than a **str** :returns: **tuple** of the form (key, value) :raises: **ValueError** if this isn't a KEY=VALUE mapping or if quoted is **True** without the value being quoted :raises: **IndexError** if there's nothing to parse from the line """ with self._remainder_lock: if self.is_empty(): raise IndexError('no remaining content to parse') key_match = KEY_ARG.match(self._remainder) if not key_match: raise ValueError("the next entry isn't a KEY=VALUE mapping: " + self._remainder) # parse off the key key = key_match.groups()[0] remainder = self._remainder[key_match.end():] next_entry, remainder = _parse_entry(remainder, quoted, escaped, get_bytes) self._remainder = remainder return (key, next_entry) def _parse_entry(line, quoted, escaped, get_bytes): """ Parses the next entry from the given space separated content. :param str line: content to be parsed :param bool quoted: parses the next entry as a quoted value, removing the quotes :param bool escaped: unescapes the string :returns: **tuple** of the form (entry, remainder) :raises: * **ValueError** if quoted is True without the next value being quoted * **IndexError** if there's nothing to parse from the line """ if line == '': raise IndexError('no remaining content to parse') next_entry, remainder = '', line if quoted: # validate and parse the quoted value start_quote, end_quote = _get_quote_indices(remainder, escaped) if start_quote != 0 or end_quote == -1: raise ValueError("the next entry isn't a quoted value: " + line) next_entry, remainder = remainder[1:end_quote], remainder[end_quote + 1:] else: # non-quoted value, just need to check if there's more data afterward if ' ' in remainder: next_entry, remainder = remainder.split(' ', 1) else: next_entry, remainder = remainder, '' if escaped: # Tor does escaping in its 'esc_for_log' function of 'common/util.c'. It's # hard to tell what controller functions use this in practice, but direct # users are... # # * 'COOKIEFILE' field of PROTOCOLINFO responses # * logged messages about bugs # * the 'getinfo_helper_listeners' function of control.c # # Ideally we'd use "next_entry.decode('string_escape')" but it was removed # in python 3.x and 'unicode_escape' isn't quite the same... # # https://stackoverflow.com/questions/14820429/how-do-i-decodestring-escape-in-python3 next_entry = codecs.escape_decode(next_entry)[0] if stem.prereq.is_python_3() and not get_bytes: next_entry = stem.util.str_tools._to_unicode(next_entry) # normalize back to str if get_bytes: next_entry = stem.util.str_tools._to_bytes(next_entry) return (next_entry, remainder.lstrip()) def _get_quote_indices(line, escaped): """ Provides the indices of the next two quotes in the given content. :param str line: content to be parsed :param bool escaped: unescapes the string :returns: **tuple** of two ints, indices being -1 if a quote doesn't exist """ indices, quote_index = [], -1 for _ in range(2): quote_index = line.find('"', quote_index + 1) # if we have escapes then we need to skip any r'\"' entries if escaped: # skip check if index is -1 (no match) or 0 (first character) while quote_index >= 1 and line[quote_index - 1] == '\\': quote_index = line.find('"', quote_index + 1) indices.append(quote_index) return tuple(indices) class SingleLineResponse(ControlMessage): """ Reply to a request that performs an action rather than querying data. These requests only contain a single line, which is 'OK' if successful, and a description of the problem if not. :var str code: status code for our line :var str message: content of the line """ def is_ok(self, strict = False): """ Checks if the response code is "250". If strict is **True** then this checks if the response is "250 OK" :param bool strict: checks for a "250 OK" message if **True** :returns: * If strict is **False**: **True** if the response code is "250", **False** otherwise * If strict is **True**: **True** if the response is "250 OK", **False** otherwise """ if strict: return self.content()[0] == ('250', ' ', 'OK') return self.content()[0][0] == '250' def _parse_message(self): content = self.content() if len(content) > 1: raise stem.ProtocolError('Received multi-line response') elif len(content) == 0: raise stem.ProtocolError('Received empty response') else: self.code, _, self.message = content[0] stem-1.7.1/stem/response/authchallenge.py0000664000175000017500000000357213341034346021206 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information import binascii import stem.response import stem.socket import stem.util.str_tools import stem.util.tor_tools class AuthChallengeResponse(stem.response.ControlMessage): """ AUTHCHALLENGE query response. :var str server_hash: server hash provided by tor :var str server_nonce: server nonce provided by tor """ def _parse_message(self): # Example: # 250 AUTHCHALLENGE SERVERHASH=680A73C9836C4F557314EA1C4EDE54C285DB9DC89C83627401AEF9D7D27A95D5 SERVERNONCE=F8EA4B1F2C8B40EF1AF68860171605B910E3BBCABADF6FC3DB1FA064F4690E85 self.server_hash = None self.server_nonce = None if not self.is_ok(): raise stem.ProtocolError("AUTHCHALLENGE response didn't have an OK status:\n%s" % self) elif len(self) > 1: raise stem.ProtocolError('Received multiline AUTHCHALLENGE response:\n%s' % self) line = self[0] # sanity check that we're a AUTHCHALLENGE response if not line.pop() == 'AUTHCHALLENGE': raise stem.ProtocolError('Message is not an AUTHCHALLENGE response (%s)' % self) if line.is_next_mapping('SERVERHASH'): value = line.pop_mapping()[1] if not stem.util.tor_tools.is_hex_digits(value, 64): raise stem.ProtocolError('SERVERHASH has an invalid value: %s' % value) self.server_hash = binascii.unhexlify(stem.util.str_tools._to_bytes(value)) else: raise stem.ProtocolError('Missing SERVERHASH mapping: %s' % line) if line.is_next_mapping('SERVERNONCE'): value = line.pop_mapping()[1] if not stem.util.tor_tools.is_hex_digits(value, 64): raise stem.ProtocolError('SERVERNONCE has an invalid value: %s' % value) self.server_nonce = binascii.unhexlify(stem.util.str_tools._to_bytes(value)) else: raise stem.ProtocolError('Missing SERVERNONCE mapping: %s' % line) stem-1.7.1/stem/response/mapaddress.py0000664000175000017500000000245613341034346020525 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information import stem.response import stem.socket class MapAddressResponse(stem.response.ControlMessage): """ Reply for a MAPADDRESS query. Doesn't raise an exception unless no addresses were mapped successfully. :var dict entries: mapping between the original and replacement addresses :raises: * :class:`stem.OperationFailed` if Tor was unable to satisfy the request * :class:`stem.InvalidRequest` if the addresses provided were invalid """ def _parse_message(self): # Example: # 250-127.192.10.10=torproject.org # 250 1.2.3.4=tor.freehaven.net if not self.is_ok(): for code, _, message in self.content(): if code == '512': raise stem.InvalidRequest(code, message) elif code == '451': raise stem.OperationFailed(code, message) else: raise stem.ProtocolError('MAPADDRESS returned unexpected response code: %s', code) self.entries = {} for code, _, message in self.content(): if code == '250': try: key, value = message.split('=', 1) self.entries[key] = value except ValueError: raise stem.ProtocolError(None, "MAPADDRESS returned '%s', which isn't a mapping" % message) stem-1.7.1/stem/response/events.py0000664000175000017500000014433013341474573017716 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information import io import re import time import stem import stem.control import stem.descriptor.router_status_entry import stem.prereq import stem.response import stem.util import stem.version from stem.util import connection, log, str_tools, tor_tools # Matches keyword=value arguments. This can't be a simple "(.*)=(.*)" pattern # because some positional arguments, like circuit paths, can have an equal # sign. KW_ARG = re.compile('^(.*) ([A-Za-z0-9_]+)=(\S*)$') QUOTED_KW_ARG = re.compile('^(.*) ([A-Za-z0-9_]+)="(.*)"$') CELL_TYPE = re.compile('^[a-z0-9_]+$') PARSE_NEWCONSENSUS_EVENTS = True # TODO: We can remove the following when we drop python2.6 support. INT_TYPE = int if stem.prereq.is_python_3() else long class Event(stem.response.ControlMessage): """ Base for events we receive asynchronously, as described in section 4.1 of the `control-spec `_. :var str type: event type :var int arrived_at: unix timestamp for when the message arrived :var list positional_args: positional arguments of the event :var dict keyword_args: key/value arguments of the event """ _POSITIONAL_ARGS = () # attribute names for recognized positional arguments _KEYWORD_ARGS = {} # map of 'keyword => attribute' for recognized attributes _QUOTED = () # positional arguments that are quoted _OPTIONALLY_QUOTED = () # positional arguments that may or may not be quoted _SKIP_PARSING = False # skip parsing contents into our positional_args and keyword_args _VERSION_ADDED = stem.version.Version('0.1.1.1-alpha') # minimum version with control-spec V1 event support def _parse_message(self, arrived_at = None): if arrived_at is None: arrived_at = int(time.time()) if not str(self).strip(): raise stem.ProtocolError('Received a blank tor event. Events must at the very least have a type.') self.type = str(self).split()[0] self.arrived_at = arrived_at # if we're a recognized event type then translate ourselves into that subclass if self.type in EVENT_TYPE_TO_CLASS: self.__class__ = EVENT_TYPE_TO_CLASS[self.type] self.positional_args = [] self.keyword_args = {} if not self._SKIP_PARSING: self._parse_standard_attr() self._parse() def __hash__(self): return stem.util._hash_attr(self, 'arrived_at', parent = stem.response.ControlMessage, cache = True) def _parse_standard_attr(self): """ Most events are of the form... 650 *( positional_args ) *( key "=" value ) This parses this standard format, populating our **positional_args** and **keyword_args** attributes and creating attributes if it's in our event's **_POSITIONAL_ARGS** and **_KEYWORD_ARGS**. """ # Tor events contain some number of positional arguments followed by # key/value mappings. Parsing keyword arguments from the end until we hit # something that isn't a key/value mapping. The rest are positional. content = str(self) while True: match = QUOTED_KW_ARG.match(content) if not match: match = KW_ARG.match(content) if match: content, keyword, value = match.groups() self.keyword_args[keyword] = value else: break # Setting attributes for the fields that we recognize. self.positional_args = content.split()[1:] positional = list(self.positional_args) for attr_name in self._POSITIONAL_ARGS: attr_value = None if positional: if attr_name in self._QUOTED or (attr_name in self._OPTIONALLY_QUOTED and positional[0].startswith('"')): attr_values = [positional.pop(0)] if not attr_values[0].startswith('"'): raise stem.ProtocolError("The %s value should be quoted, but didn't have a starting quote: %s" % (attr_name, self)) while True: if not positional: raise stem.ProtocolError("The %s value should be quoted, but didn't have an ending quote: %s" % (attr_name, self)) attr_values.append(positional.pop(0)) if attr_values[-1].endswith('"'): break attr_value = ' '.join(attr_values)[1:-1] else: attr_value = positional.pop(0) setattr(self, attr_name, attr_value) for controller_attr_name, attr_name in self._KEYWORD_ARGS.items(): setattr(self, attr_name, self.keyword_args.get(controller_attr_name)) def _iso_timestamp(self, timestamp): """ Parses an iso timestamp (ISOTime2Frac in the control-spec). :param str timestamp: timestamp to parse :returns: **datetime** with the parsed timestamp :raises: :class:`stem.ProtocolError` if timestamp is malformed """ if timestamp is None: return None try: return str_tools._parse_iso_timestamp(timestamp) except ValueError as exc: raise stem.ProtocolError('Unable to parse timestamp (%s): %s' % (exc, self)) # method overwritten by our subclasses for special handling that they do def _parse(self): pass def _log_if_unrecognized(self, attr, attr_enum): """ Checks if an attribute exists in a given enumeration, logging a message if it isn't. Attributes can either be for a string or collection of strings :param str attr: name of the attribute to check :param stem.util.enum.Enum enum: enumeration to check against """ attr_values = getattr(self, attr) if attr_values: if stem.util._is_str(attr_values): attr_values = [attr_values] for value in attr_values: if value not in attr_enum: log_id = 'event.%s.unknown_%s.%s' % (self.type.lower(), attr, value) unrecognized_msg = "%s event had an unrecognized %s (%s). Maybe a new addition to the control protocol? Full Event: '%s'" % (self.type, attr, value, self) log.log_once(log_id, log.INFO, unrecognized_msg) class AddrMapEvent(Event): """ Event that indicates a new address mapping. The ADDRMAP event was one of the first Control Protocol V1 events and was introduced in tor version 0.1.1.1-alpha. .. versionchanged:: 1.1.0 Added the cached attribute. :var str hostname: address being resolved :var str destination: destination of the resolution, this is usually an ip, but could be a hostname if TrackHostExits is enabled or **NONE** if the resolution failed :var datetime expiry: expiration time of the resolution in local time :var str error: error code if the resolution failed :var datetime utc_expiry: expiration time of the resolution in UTC :var bool cached: **True** if the resolution will be kept until it expires, **False** otherwise or **None** if undefined """ _POSITIONAL_ARGS = ('hostname', 'destination', 'expiry') _KEYWORD_ARGS = { 'error': 'error', 'EXPIRES': 'utc_expiry', 'CACHED': 'cached', } _OPTIONALLY_QUOTED = ('expiry') def _parse(self): if self.destination == '': self.destination = None if self.expiry is not None: if self.expiry == 'NEVER': self.expiry = None else: try: self.expiry = stem.util.str_tools._parse_timestamp(self.expiry) except ValueError: raise stem.ProtocolError('Unable to parse date in ADDRMAP event: %s' % self) if self.utc_expiry is not None: self.utc_expiry = stem.util.str_tools._parse_timestamp(self.utc_expiry) if self.cached is not None: if self.cached == 'YES': self.cached = True elif self.cached == 'NO': self.cached = False else: raise stem.ProtocolError("An ADDRMAP event's CACHED mapping can only be 'YES' or 'NO': %s" % self) class AuthDirNewDescEvent(Event): """ Event specific to directory authorities, indicating that we just received new descriptors. The descriptor type contained within this event is unspecified so the descriptor contents are left unparsed. The AUTHDIR_NEWDESCS event was introduced in tor version 0.1.1.10-alpha and removed in 0.3.2.1-alpha. (:spec:`6e887ba`) .. deprecated:: 1.6.0 Tor dropped this event as of version 0.3.2.1. (:spec:`6e887ba`) :var stem.AuthDescriptorAction action: what is being done with the descriptor :var str message: explanation of why we chose this action :var str descriptor: content of the descriptor """ _SKIP_PARSING = True _VERSION_ADDED = stem.version.Requirement.EVENT_AUTHDIR_NEWDESCS def _parse(self): lines = str(self).split('\n') if len(lines) < 5: raise stem.ProtocolError("AUTHDIR_NEWDESCS events must contain lines for at least the type, action, message, descriptor, and terminating 'OK'") elif lines[-1] != 'OK': raise stem.ProtocolError("AUTHDIR_NEWDESCS doesn't end with an 'OK'") # TODO: For stem 2.0.0 we should consider changing 'descriptor' to a # ServerDescriptor instance. self.action = lines[1] self.message = lines[2] self.descriptor = '\n'.join(lines[3:-1]) class BandwidthEvent(Event): """ Event emitted every second with the bytes sent and received by tor. The BW event was one of the first Control Protocol V1 events and was introduced in tor version 0.1.1.1-alpha. :var int read: bytes received by tor that second :var int written: bytes sent by tor that second """ _POSITIONAL_ARGS = ('read', 'written') def _parse(self): if not self.read: raise stem.ProtocolError('BW event is missing its read value') elif not self.written: raise stem.ProtocolError('BW event is missing its written value') elif not self.read.isdigit() or not self.written.isdigit(): raise stem.ProtocolError("A BW event's bytes sent and received should be a positive numeric value, received: %s" % self) self.read = INT_TYPE(self.read) self.written = INT_TYPE(self.written) class BuildTimeoutSetEvent(Event): """ Event indicating that the timeout value for a circuit has changed. This was first added in tor version 0.2.2.7. The BUILDTIMEOUT_SET event was introduced in tor version 0.2.2.7-alpha. :var stem.TimeoutSetType set_type: way in which the timeout is changing :var int total_times: circuit build times tor used to determine the timeout :var int timeout: circuit timeout value in milliseconds :var int xm: Pareto parameter Xm in milliseconds :var float alpha: Pareto parameter alpha :var float quantile: CDF quantile cutoff point :var float timeout_rate: ratio of circuits that have time out :var int close_timeout: duration to keep measurement circuits in milliseconds :var float close_rate: ratio of measurement circuits that are closed """ _POSITIONAL_ARGS = ('set_type',) _KEYWORD_ARGS = { 'TOTAL_TIMES': 'total_times', 'TIMEOUT_MS': 'timeout', 'XM': 'xm', 'ALPHA': 'alpha', 'CUTOFF_QUANTILE': 'quantile', 'TIMEOUT_RATE': 'timeout_rate', 'CLOSE_MS': 'close_timeout', 'CLOSE_RATE': 'close_rate', } _VERSION_ADDED = stem.version.Requirement.EVENT_BUILDTIMEOUT_SET def _parse(self): # convert our integer and float parameters for param in ('total_times', 'timeout', 'xm', 'close_timeout'): param_value = getattr(self, param) if param_value is not None: try: setattr(self, param, int(param_value)) except ValueError: raise stem.ProtocolError('The %s of a BUILDTIMEOUT_SET should be an integer: %s' % (param, self)) for param in ('alpha', 'quantile', 'timeout_rate', 'close_rate'): param_value = getattr(self, param) if param_value is not None: try: setattr(self, param, float(param_value)) except ValueError: raise stem.ProtocolError('The %s of a BUILDTIMEOUT_SET should be a float: %s' % (param, self)) self._log_if_unrecognized('set_type', stem.TimeoutSetType) class CircuitEvent(Event): """ Event that indicates that a circuit has changed. The fingerprint or nickname values in our 'path' may be **None** if the VERBOSE_NAMES feature isn't enabled. The option was first introduced in tor version 0.1.2.2, and on by default after 0.2.2.1. The CIRC event was one of the first Control Protocol V1 events and was introduced in tor version 0.1.1.1-alpha. .. versionchanged:: 1.4.0 Added the socks_username and socks_password attributes which is used for `stream isolation `_. :var str id: circuit identifier :var stem.CircStatus status: reported status for the circuit :var tuple path: relays involved in the circuit, these are **(fingerprint, nickname)** tuples :var tuple build_flags: :data:`~stem.CircBuildFlag` attributes governing how the circuit is built :var stem.CircPurpose purpose: purpose that the circuit is intended for :var stem.HiddenServiceState hs_state: status if this is a hidden service circuit :var str rend_query: circuit's rendezvous-point if this is hidden service related :var datetime created: time when the circuit was created or cannibalized :var stem.CircClosureReason reason: reason for the circuit to be closed :var stem.CircClosureReason remote_reason: remote side's reason for the circuit to be closed :var str socks_username: username for using this circuit :var str socks_password: password for using this circuit """ _POSITIONAL_ARGS = ('id', 'status', 'path') _KEYWORD_ARGS = { 'BUILD_FLAGS': 'build_flags', 'PURPOSE': 'purpose', 'HS_STATE': 'hs_state', 'REND_QUERY': 'rend_query', 'TIME_CREATED': 'created', 'REASON': 'reason', 'REMOTE_REASON': 'remote_reason', 'SOCKS_USERNAME': 'socks_username', 'SOCKS_PASSWORD': 'socks_password', } def _parse(self): self.path = tuple(stem.control._parse_circ_path(self.path)) self.created = self._iso_timestamp(self.created) if self.build_flags is not None: self.build_flags = tuple(self.build_flags.split(',')) if not tor_tools.is_valid_circuit_id(self.id): raise stem.ProtocolError("Circuit IDs must be one to sixteen alphanumeric characters, got '%s': %s" % (self.id, self)) self._log_if_unrecognized('status', stem.CircStatus) self._log_if_unrecognized('build_flags', stem.CircBuildFlag) self._log_if_unrecognized('purpose', stem.CircPurpose) self._log_if_unrecognized('hs_state', stem.HiddenServiceState) self._log_if_unrecognized('reason', stem.CircClosureReason) self._log_if_unrecognized('remote_reason', stem.CircClosureReason) def _compare(self, other, method): # sorting circuit events by their identifier if not isinstance(other, CircuitEvent): return False my_id = getattr(self, 'id') their_id = getattr(other, 'id') return method(my_id, their_id) if my_id != their_id else method(hash(self), hash(other)) def __gt__(self, other): return self._compare(other, lambda s, o: s > o) def __ge__(self, other): return self._compare(other, lambda s, o: s >= o) class CircMinorEvent(Event): """ Event providing information about minor changes in our circuits. This was first added in tor version 0.2.3.11. The CIRC_MINOR event was introduced in tor version 0.2.3.11-alpha. :var str id: circuit identifier :var stem.CircEvent event: type of change in the circuit :var tuple path: relays involved in the circuit, these are **(fingerprint, nickname)** tuples :var tuple build_flags: :data:`~stem.CircBuildFlag` attributes governing how the circuit is built :var stem.CircPurpose purpose: purpose that the circuit is intended for :var stem.HiddenServiceState hs_state: status if this is a hidden service circuit :var str rend_query: circuit's rendezvous-point if this is hidden service related :var datetime created: time when the circuit was created or cannibalized :var stem.CircPurpose old_purpose: prior purpose for the circuit :var stem.HiddenServiceState old_hs_state: prior status as a hidden service circuit """ _POSITIONAL_ARGS = ('id', 'event', 'path') _KEYWORD_ARGS = { 'BUILD_FLAGS': 'build_flags', 'PURPOSE': 'purpose', 'HS_STATE': 'hs_state', 'REND_QUERY': 'rend_query', 'TIME_CREATED': 'created', 'OLD_PURPOSE': 'old_purpose', 'OLD_HS_STATE': 'old_hs_state', } _VERSION_ADDED = stem.version.Requirement.EVENT_CIRC_MINOR def _parse(self): self.path = tuple(stem.control._parse_circ_path(self.path)) self.created = self._iso_timestamp(self.created) if self.build_flags is not None: self.build_flags = tuple(self.build_flags.split(',')) if not tor_tools.is_valid_circuit_id(self.id): raise stem.ProtocolError("Circuit IDs must be one to sixteen alphanumeric characters, got '%s': %s" % (self.id, self)) self._log_if_unrecognized('event', stem.CircEvent) self._log_if_unrecognized('build_flags', stem.CircBuildFlag) self._log_if_unrecognized('purpose', stem.CircPurpose) self._log_if_unrecognized('hs_state', stem.HiddenServiceState) self._log_if_unrecognized('old_purpose', stem.CircPurpose) self._log_if_unrecognized('old_hs_state', stem.HiddenServiceState) class ClientsSeenEvent(Event): """ Periodic event on bridge relays that provides a summary of our users. The CLIENTS_SEEN event was introduced in tor version 0.2.1.10-alpha. :var datetime start_time: time in UTC that we started collecting these stats :var dict locales: mapping of country codes to a rounded count for the number of users :var dict ip_versions: mapping of ip protocols to a rounded count for the number of users """ _KEYWORD_ARGS = { 'TimeStarted': 'start_time', 'CountrySummary': 'locales', 'IPVersions': 'ip_versions', } _VERSION_ADDED = stem.version.Requirement.EVENT_CLIENTS_SEEN def _parse(self): if self.start_time is not None: self.start_time = stem.util.str_tools._parse_timestamp(self.start_time) if self.locales is not None: locale_to_count = {} for entry in self.locales.split(','): if '=' not in entry: raise stem.ProtocolError("The CLIENTS_SEEN's CountrySummary should be a comma separated listing of '=' mappings: %s" % self) locale, count = entry.split('=', 1) if len(locale) != 2: raise stem.ProtocolError("Locales should be a two character code, got '%s': %s" % (locale, self)) elif not count.isdigit(): raise stem.ProtocolError('Locale count was non-numeric (%s): %s' % (count, self)) elif locale in locale_to_count: raise stem.ProtocolError("CountrySummary had multiple mappings for '%s': %s" % (locale, self)) locale_to_count[locale] = int(count) self.locales = locale_to_count if self.ip_versions is not None: protocol_to_count = {} for entry in self.ip_versions.split(','): if '=' not in entry: raise stem.ProtocolError("The CLIENTS_SEEN's IPVersions should be a comma separated listing of '=' mappings: %s" % self) protocol, count = entry.split('=', 1) if not count.isdigit(): raise stem.ProtocolError('IP protocol count was non-numeric (%s): %s' % (count, self)) protocol_to_count[protocol] = int(count) self.ip_versions = protocol_to_count class ConfChangedEvent(Event): """ Event that indicates that our configuration changed, either in response to a SETCONF or RELOAD signal. The CONF_CHANGED event was introduced in tor version 0.2.3.3-alpha. .. deprecated:: 1.7.0 Deprecated the *config* attribute. Some tor configuration options (like ExitPolicy) can have multiple values, so a simple 'str => str' mapping meant that we only provided the last. .. versionchanged:: 1.7.0 Added the changed and unset attributes. :var dict changed: mapping of configuration options to a list of their new values :var list unset: configuration options that have been unset """ _SKIP_PARSING = True _VERSION_ADDED = stem.version.Requirement.EVENT_CONF_CHANGED def _parse(self): self.changed = {} self.unset = [] self.config = {} # TODO: remove in stem 2.0 # Skip first and last line since they're the header and footer. For # instance... # # 650-CONF_CHANGED # 650-ExitNodes=caerSidi # 650-ExitPolicy # 650-MaxCircuitDirtiness=20 # 650 OK for line in str(self).splitlines()[1:-1]: if '=' in line: key, value = line.split('=', 1) self.changed.setdefault(key, []).append(value) else: key, value = line, None self.unset.append(key) self.config[key] = value class DescChangedEvent(Event): """ Event that indicates that our descriptor has changed. The DESCCHANGED event was introduced in tor version 0.1.2.2-alpha. """ _VERSION_ADDED = stem.version.Requirement.EVENT_DESCCHANGED class GuardEvent(Event): """ Event that indicates that our guard relays have changed. The 'endpoint' could be either a... * fingerprint * 'fingerprint=nickname' pair The derived 'endpoint_*' attributes are generally more useful. The GUARD event was introduced in tor version 0.1.2.5-alpha. :var stem.GuardType guard_type: purpose the guard relay is for :var str endpoint: relay that the event concerns :var str endpoint_fingerprint: endpoint's finterprint :var str endpoint_nickname: endpoint's nickname if it was provided :var stem.GuardStatus status: status of the guard relay """ _VERSION_ADDED = stem.version.Requirement.EVENT_GUARD _POSITIONAL_ARGS = ('guard_type', 'endpoint', 'status') def _parse(self): self.endpoint_fingerprint = None self.endpoint_nickname = None try: self.endpoint_fingerprint, self.endpoint_nickname = \ stem.control._parse_circ_entry(self.endpoint) except stem.ProtocolError: raise stem.ProtocolError("GUARD's endpoint doesn't match a ServerSpec: %s" % self) self._log_if_unrecognized('guard_type', stem.GuardType) self._log_if_unrecognized('status', stem.GuardStatus) class HSDescEvent(Event): """ Event triggered when we fetch a hidden service descriptor that currently isn't in our cache. The HS_DESC event was introduced in tor version 0.2.5.2-alpha. .. versionadded:: 1.2.0 .. versionchanged:: 1.3.0 Added the reason attribute. .. versionchanged:: 1.5.0 Added the replica attribute. .. versionchanged:: 1.7.0 Added the index attribute. :var stem.HSDescAction action: what is happening with the descriptor :var str address: hidden service address :var stem.HSAuth authentication: service's authentication method :var str directory: hidden service directory servicing the request :var str directory_fingerprint: hidden service directory's finterprint :var str directory_nickname: hidden service directory's nickname if it was provided :var str descriptor_id: descriptor identifier :var stem.HSDescReason reason: reason the descriptor failed to be fetched :var int replica: replica number the descriptor involves :var str index: computed index of the HSDir the descriptor was uploaded to or fetched from """ _VERSION_ADDED = stem.version.Requirement.EVENT_HS_DESC _POSITIONAL_ARGS = ('action', 'address', 'authentication', 'directory', 'descriptor_id') _KEYWORD_ARGS = {'REASON': 'reason', 'REPLICA': 'replica', 'HSDIR_INDEX': 'index'} def _parse(self): self.directory_fingerprint = None self.directory_nickname = None if self.directory != 'UNKNOWN': try: self.directory_fingerprint, self.directory_nickname = \ stem.control._parse_circ_entry(self.directory) except stem.ProtocolError: raise stem.ProtocolError("HS_DESC's directory doesn't match a ServerSpec: %s" % self) if self.replica is not None: if not self.replica.isdigit(): raise stem.ProtocolError('HS_DESC event got a non-numeric replica count (%s): %s' % (self.replica, self)) self.replica = int(self.replica) self._log_if_unrecognized('action', stem.HSDescAction) self._log_if_unrecognized('authentication', stem.HSAuth) class HSDescContentEvent(Event): """ Provides the content of hidden service descriptors we fetch. The HS_DESC_CONTENT event was introduced in tor version 0.2.7.1-alpha. .. versionadded:: 1.4.0 :var str address: hidden service address :var str descriptor_id: descriptor identifier :var str directory: hidden service directory servicing the request :var str directory_fingerprint: hidden service directory's finterprint :var str directory_nickname: hidden service directory's nickname if it was provided :var stem.descriptor.hidden_service_descriptor.HiddenServiceDescriptor descriptor: descriptor that was retrieved """ _VERSION_ADDED = stem.version.Requirement.EVENT_HS_DESC_CONTENT _POSITIONAL_ARGS = ('address', 'descriptor_id', 'directory') def _parse(self): if self.address == 'UNKNOWN': self.address = None self.directory_fingerprint = None self.directory_nickname = None try: self.directory_fingerprint, self.directory_nickname = \ stem.control._parse_circ_entry(self.directory) except stem.ProtocolError: raise stem.ProtocolError("HS_DESC_CONTENT's directory doesn't match a ServerSpec: %s" % self) # skip the first line (our positional arguments) and last ('OK') desc_content = str_tools._to_bytes('\n'.join(str(self).splitlines()[1:-1])) self.descriptor = None if desc_content: self.descriptor = list(stem.descriptor.hidden_service_descriptor._parse_file(io.BytesIO(desc_content)))[0] class LogEvent(Event): """ Tor logging event. These are the most visible kind of event since, by default, tor logs at the NOTICE :data:`~stem.Runlevel` to stdout. The logging events were some of the first Control Protocol V1 events and were introduced in tor version 0.1.1.1-alpha. :var stem.Runlevel runlevel: runlevel of the logged message :var str message: logged message """ _SKIP_PARSING = True def _parse(self): self.runlevel = self.type self._log_if_unrecognized('runlevel', stem.Runlevel) # message is our content, minus the runlevel and ending "OK" if a # multi-line message self.message = str(self)[len(self.runlevel) + 1:].rstrip('\nOK') class NetworkStatusEvent(Event): """ Event for when our copy of the consensus has changed. This was introduced in tor version 0.1.2.3. The NS event was introduced in tor version 0.1.2.3-alpha. :var list desc: :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3` for the changed descriptors """ _SKIP_PARSING = True _VERSION_ADDED = stem.version.Requirement.EVENT_NS def _parse(self): content = str(self).lstrip('NS\n').rstrip('\nOK') # TODO: For stem 2.0.0 consider changing 'desc' to 'descriptors' to match # our other events. self.desc = list(stem.descriptor.router_status_entry._parse_file( io.BytesIO(str_tools._to_bytes(content)), False, entry_class = stem.descriptor.router_status_entry.RouterStatusEntryV3, )) class NetworkLivenessEvent(Event): """ Event for when the network becomes reachable or unreachable. The NETWORK_LIVENESS event was introduced in tor version 0.2.7.2-alpha. .. versionadded:: 1.5.0 :var str status: status of the network ('UP', 'DOWN', or possibly other statuses in the future) """ _VERSION_ADDED = stem.version.Requirement.EVENT_NETWORK_LIVENESS _POSITIONAL_ARGS = ('status',) class NewConsensusEvent(Event): """ Event for when we have a new consensus. This is similar to :class:`~stem.response.events.NetworkStatusEvent`, except that it contains the whole consensus so anything not listed is implicitly no longer recommended. The NEWCONSENSUS event was introduced in tor version 0.2.1.13-alpha. .. versionchanged:: 1.6.0 Added the consensus_content attribute. .. deprecated:: 1.6.0 In Stem 2.0 we'll remove the desc attribute, so this event only provides the unparsed consensus. Callers can then parse it if they'd like. To drop parsing before then you can set... :: stem.response.events.PARSE_NEWCONSENSUS_EVENTS = False :var str consensus_content: consensus content :var list desc: :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3` for the changed descriptors """ _SKIP_PARSING = True _VERSION_ADDED = stem.version.Requirement.EVENT_NEWCONSENSUS def _parse(self): self.consensus_content = str(self).lstrip('NEWCONSENSUS\n').rstrip('\nOK') # TODO: For stem 2.0.0 consider changing 'desc' to 'descriptors' to match # our other events. if PARSE_NEWCONSENSUS_EVENTS: self.desc = list(stem.descriptor.router_status_entry._parse_file( io.BytesIO(str_tools._to_bytes(self.consensus_content)), False, entry_class = stem.descriptor.router_status_entry.RouterStatusEntryV3, )) else: self.desc = None class NewDescEvent(Event): """ Event that indicates that a new descriptor is available. The fingerprint or nickname values in our 'relays' may be **None** if the VERBOSE_NAMES feature isn't enabled. The option was first introduced in tor version 0.1.2.2, and on by default after 0.2.2.1. The NEWDESC event was one of the first Control Protocol V1 events and was introduced in tor version 0.1.1.1-alpha. :var tuple relays: **(fingerprint, nickname)** tuples for the relays with new descriptors """ def _parse(self): self.relays = tuple([stem.control._parse_circ_entry(entry) for entry in str(self).split()[1:]]) class ORConnEvent(Event): """ Event that indicates a change in a relay connection. The 'endpoint' could be any of several things including a... * fingerprint * nickname * 'fingerprint=nickname' pair * address:port The derived 'endpoint_*' attributes are generally more useful. The ORCONN event was one of the first Control Protocol V1 events and was introduced in tor version 0.1.1.1-alpha. Its id attribute was added in version 0.2.5.2-alpha. .. versionchanged:: 1.2.0 Added the id attribute. :var str id: connection identifier :var str endpoint: relay that the event concerns :var str endpoint_fingerprint: endpoint's finterprint if it was provided :var str endpoint_nickname: endpoint's nickname if it was provided :var str endpoint_address: endpoint's address if it was provided :var int endpoint_port: endpoint's port if it was provided :var stem.ORStatus status: state of the connection :var stem.ORClosureReason reason: reason for the connection to be closed :var int circ_count: number of established and pending circuits """ _POSITIONAL_ARGS = ('endpoint', 'status') _KEYWORD_ARGS = { 'REASON': 'reason', 'NCIRCS': 'circ_count', 'ID': 'id', } def _parse(self): self.endpoint_fingerprint = None self.endpoint_nickname = None self.endpoint_address = None self.endpoint_port = None try: self.endpoint_fingerprint, self.endpoint_nickname = \ stem.control._parse_circ_entry(self.endpoint) except stem.ProtocolError: if ':' not in self.endpoint: raise stem.ProtocolError("ORCONN endpoint is neither a relay nor 'address:port': %s" % self) address, port = self.endpoint.rsplit(':', 1) if not connection.is_valid_port(port): raise stem.ProtocolError("ORCONN's endpoint location's port is invalid: %s" % self) self.endpoint_address = address self.endpoint_port = int(port) if self.circ_count is not None: if not self.circ_count.isdigit(): raise stem.ProtocolError('ORCONN event got a non-numeric circuit count (%s): %s' % (self.circ_count, self)) self.circ_count = int(self.circ_count) if self.id and not tor_tools.is_valid_connection_id(self.id): raise stem.ProtocolError("Connection IDs must be one to sixteen alphanumeric characters, got '%s': %s" % (self.id, self)) self._log_if_unrecognized('status', stem.ORStatus) self._log_if_unrecognized('reason', stem.ORClosureReason) class SignalEvent(Event): """ Event that indicates that tor has received and acted upon a signal being sent to the process. As of tor version 0.2.4.6 the only signals conveyed by this event are... * RELOAD * DUMP * DEBUG * NEWNYM * CLEARDNSCACHE The SIGNAL event was introduced in tor version 0.2.3.1-alpha. :var stem.Signal signal: signal that tor received """ _POSITIONAL_ARGS = ('signal',) _VERSION_ADDED = stem.version.Requirement.EVENT_SIGNAL def _parse(self): # log if we recieved an unrecognized signal expected_signals = ( stem.Signal.RELOAD, stem.Signal.DUMP, stem.Signal.DEBUG, stem.Signal.NEWNYM, stem.Signal.CLEARDNSCACHE, ) self._log_if_unrecognized('signal', expected_signals) class StatusEvent(Event): """ Notification of a change in tor's state. These are generally triggered for the same sort of things as log messages of the NOTICE level or higher. However, unlike :class:`~stem.response.events.LogEvent` these contain well formed data. The STATUS_GENERAL, STATUS_CLIENT, STATUS_SERVER events were introduced in tor version 0.1.2.3-alpha. :var stem.StatusType status_type: category of the status event :var stem.Runlevel runlevel: runlevel of the logged message :var str action: activity that caused this message :var dict arguments: attributes about the event """ _POSITIONAL_ARGS = ('runlevel', 'action') _VERSION_ADDED = stem.version.Requirement.EVENT_STATUS def _parse(self): if self.type == 'STATUS_GENERAL': self.status_type = stem.StatusType.GENERAL elif self.type == 'STATUS_CLIENT': self.status_type = stem.StatusType.CLIENT elif self.type == 'STATUS_SERVER': self.status_type = stem.StatusType.SERVER else: raise ValueError("BUG: Unrecognized status type (%s), likely an EVENT_TYPE_TO_CLASS addition without revising how 'status_type' is assigned." % self.type) # Just an alias for our parent class' keyword_args since that already # parses these for us. Unlike our other event types Tor commonly supplies # arbitrary key/value pairs for these, so making an alias here to better # draw attention that the StatusEvent will likely have them. self.arguments = self.keyword_args self._log_if_unrecognized('runlevel', stem.Runlevel) class StreamEvent(Event): """ Event that indicates that a stream has changed. The STREAM event was one of the first Control Protocol V1 events and was introduced in tor version 0.1.1.1-alpha. :var str id: stream identifier :var stem.StreamStatus status: reported status for the stream :var str circ_id: circuit that the stream is attached to, this is **None** of the stream is unattached :var str target: destination of the stream :var str target_address: destination address (ip, hostname, or '(Tor_internal)') :var int target_port: destination port :var stem.StreamClosureReason reason: reason for the stream to be closed :var stem.StreamClosureReason remote_reason: remote side's reason for the stream to be closed :var stem.StreamSource source: origin of the REMAP request :var str source_addr: requester of the connection :var str source_address: requester address (ip or hostname) :var int source_port: requester port :var stem.StreamPurpose purpose: purpose for the stream """ _POSITIONAL_ARGS = ('id', 'status', 'circ_id', 'target') _KEYWORD_ARGS = { 'REASON': 'reason', 'REMOTE_REASON': 'remote_reason', 'SOURCE': 'source', 'SOURCE_ADDR': 'source_addr', 'PURPOSE': 'purpose', } def _parse(self): if self.target is None: raise stem.ProtocolError("STREAM event didn't have a target: %s" % self) else: if ':' not in self.target: raise stem.ProtocolError("Target location must be of the form 'address:port': %s" % self) address, port = self.target.rsplit(':', 1) if not connection.is_valid_port(port, allow_zero = True): raise stem.ProtocolError("Target location's port is invalid: %s" % self) self.target_address = address self.target_port = int(port) if self.source_addr is None: self.source_address = None self.source_port = None else: if ':' not in self.source_addr: raise stem.ProtocolError("Source location must be of the form 'address:port': %s" % self) address, port = self.source_addr.rsplit(':', 1) if not connection.is_valid_port(port, allow_zero = True): raise stem.ProtocolError("Source location's port is invalid: %s" % self) self.source_address = address self.source_port = int(port) # spec specifies a circ_id of zero if the stream is unattached if self.circ_id == '0': self.circ_id = None self._log_if_unrecognized('reason', stem.StreamClosureReason) self._log_if_unrecognized('remote_reason', stem.StreamClosureReason) self._log_if_unrecognized('purpose', stem.StreamPurpose) class StreamBwEvent(Event): """ Event (emitted approximately every second) with the bytes sent and received by the application since the last such event on this stream. The STREAM_BW event was introduced in tor version 0.1.2.8-beta. .. versionchanged:: 1.6.0 Added the time attribute. :var str id: stream identifier :var int written: bytes sent by the application :var int read: bytes received by the application :var datetime time: time when the measurement was recorded """ _POSITIONAL_ARGS = ('id', 'written', 'read', 'time') _VERSION_ADDED = stem.version.Requirement.EVENT_STREAM_BW def _parse(self): if not tor_tools.is_valid_stream_id(self.id): raise stem.ProtocolError("Stream IDs must be one to sixteen alphanumeric characters, got '%s': %s" % (self.id, self)) elif not self.written: raise stem.ProtocolError('STREAM_BW event is missing its written value') elif not self.read: raise stem.ProtocolError('STREAM_BW event is missing its read value') elif not self.read.isdigit() or not self.written.isdigit(): raise stem.ProtocolError("A STREAM_BW event's bytes sent and received should be a positive numeric value, received: %s" % self) self.read = INT_TYPE(self.read) self.written = INT_TYPE(self.written) self.time = self._iso_timestamp(self.time) class TransportLaunchedEvent(Event): """ Event triggered when a pluggable transport is launched. The TRANSPORT_LAUNCHED event was introduced in tor version 0.2.5.0-alpha. .. versionadded:: 1.1.0 :var str type: 'server' or 'client' :var str name: name of the pluggable transport :var str address: IPv4 or IPv6 address where the transport is listening for connections :var int port: port where the transport is listening for connections """ _POSITIONAL_ARGS = ('type', 'name', 'address', 'port') _VERSION_ADDED = stem.version.Requirement.EVENT_TRANSPORT_LAUNCHED def _parse(self): if self.type not in ('server', 'client'): raise stem.ProtocolError("Transport type should either be 'server' or 'client': %s" % self) if not connection.is_valid_ipv4_address(self.address) and \ not connection.is_valid_ipv6_address(self.address): raise stem.ProtocolError("Transport address isn't a valid IPv4 or IPv6 address: %s" % self) if not connection.is_valid_port(self.port): raise stem.ProtocolError('Transport port is invalid: %s' % self) self.port = int(self.port) class ConnectionBandwidthEvent(Event): """ Event emitted every second with the bytes sent and received by tor on a per-connection basis. The CONN_BW event was introduced in tor version 0.2.5.2-alpha. .. versionadded:: 1.2.0 .. versionchanged:: 1.6.0 Renamed 'type' attribute to 'conn_type' so it wouldn't be override parent class attribute with the same name. :var str id: connection identifier :var stem.ConnectionType conn_type: connection type :var int read: bytes received by tor that second :var int written: bytes sent by tor that second """ _KEYWORD_ARGS = { 'ID': 'id', 'TYPE': 'conn_type', 'READ': 'read', 'WRITTEN': 'written', } _VERSION_ADDED = stem.version.Requirement.EVENT_CONN_BW def _parse(self): if not self.id: raise stem.ProtocolError('CONN_BW event is missing its id') elif not self.conn_type: raise stem.ProtocolError('CONN_BW event is missing its connection type') elif not self.read: raise stem.ProtocolError('CONN_BW event is missing its read value') elif not self.written: raise stem.ProtocolError('CONN_BW event is missing its written value') elif not self.read.isdigit() or not self.written.isdigit(): raise stem.ProtocolError("A CONN_BW event's bytes sent and received should be a positive numeric value, received: %s" % self) elif not tor_tools.is_valid_connection_id(self.id): raise stem.ProtocolError("Connection IDs must be one to sixteen alphanumeric characters, got '%s': %s" % (self.id, self)) self.read = INT_TYPE(self.read) self.written = INT_TYPE(self.written) self._log_if_unrecognized('conn_type', stem.ConnectionType) class CircuitBandwidthEvent(Event): """ Event emitted every second with the bytes sent and received by tor on a per-circuit basis. The CIRC_BW event was introduced in tor version 0.2.5.2-alpha. .. versionadded:: 1.2.0 .. versionchanged:: 1.6.0 Added the time attribute. .. versionchanged:: 1.7.0 Added the delivered_read, delivered_written, overhead_read, and overhead_written attributes. :var str id: circuit identifier :var int read: bytes received by tor that second :var int written: bytes sent by tor that second :var int delivered_read: user payload received by tor that second :var int delivered_written: user payload sent by tor that second :var int overhead_read: padding so read cells will have a fixed length :var int overhead_written: padding so written cells will have a fixed length :var datetime time: time when the measurement was recorded """ _KEYWORD_ARGS = { 'ID': 'id', 'READ': 'read', 'WRITTEN': 'written', 'DELIVERED_READ': 'delivered_read', 'DELIVERED_WRITTEN': 'delivered_written', 'OVERHEAD_READ': 'overhead_read', 'OVERHEAD_WRITTEN': 'overhead_written', 'TIME': 'time', } _VERSION_ADDED = stem.version.Requirement.EVENT_CIRC_BW def _parse(self): if not self.id: raise stem.ProtocolError('CIRC_BW event is missing its id') elif not self.read: raise stem.ProtocolError('CIRC_BW event is missing its read value') elif not self.written: raise stem.ProtocolError('CIRC_BW event is missing its written value') elif not self.read.isdigit(): raise stem.ProtocolError("A CIRC_BW event's bytes received should be a positive numeric value, received: %s" % self) elif not self.written.isdigit(): raise stem.ProtocolError("A CIRC_BW event's bytes sent should be a positive numeric value, received: %s" % self) elif self.delivered_read and not self.delivered_read.isdigit(): raise stem.ProtocolError("A CIRC_BW event's delivered bytes received should be a positive numeric value, received: %s" % self) elif self.delivered_written and not self.delivered_written.isdigit(): raise stem.ProtocolError("A CIRC_BW event's delivered bytes sent should be a positive numeric value, received: %s" % self) elif self.overhead_read and not self.overhead_read.isdigit(): raise stem.ProtocolError("A CIRC_BW event's overhead bytes received should be a positive numeric value, received: %s" % self) elif self.overhead_written and not self.overhead_written.isdigit(): raise stem.ProtocolError("A CIRC_BW event's overhead bytes sent should be a positive numeric value, received: %s" % self) elif not tor_tools.is_valid_circuit_id(self.id): raise stem.ProtocolError("Circuit IDs must be one to sixteen alphanumeric characters, got '%s': %s" % (self.id, self)) self.time = self._iso_timestamp(self.time) for attr in ('read', 'written', 'delivered_read', 'delivered_written', 'overhead_read', 'overhead_written'): value = getattr(self, attr) if value: setattr(self, attr, INT_TYPE(value)) class CellStatsEvent(Event): """ Event emitted every second with a count of the number of cells types broken down by the circuit. **These events are only emitted if TestingTorNetwork is set.** The CELL_STATS event was introduced in tor version 0.2.5.2-alpha. .. versionadded:: 1.2.0 :var str id: circuit identifier :var str inbound_queue: inbound queue identifier :var str inbound_connection: inbound connection identifier :var dict inbound_added: mapping of added inbound cell types to their count :var dict inbound_removed: mapping of removed inbound cell types to their count :var dict inbound_time: mapping of inbound cell types to the time they took to write in milliseconds :var str outbound_queue: outbound queue identifier :var str outbound_connection: outbound connection identifier :var dict outbound_added: mapping of added outbound cell types to their count :var dict outbound_removed: mapping of removed outbound cell types to their count :var dict outbound_time: mapping of outbound cell types to the time they took to write in milliseconds """ _KEYWORD_ARGS = { 'ID': 'id', 'InboundQueue': 'inbound_queue', 'InboundConn': 'inbound_connection', 'InboundAdded': 'inbound_added', 'InboundRemoved': 'inbound_removed', 'InboundTime': 'inbound_time', 'OutboundQueue': 'outbound_queue', 'OutboundConn': 'outbound_connection', 'OutboundAdded': 'outbound_added', 'OutboundRemoved': 'outbound_removed', 'OutboundTime': 'outbound_time', } _VERSION_ADDED = stem.version.Requirement.EVENT_CELL_STATS def _parse(self): if self.id and not tor_tools.is_valid_circuit_id(self.id): raise stem.ProtocolError("Circuit IDs must be one to sixteen alphanumeric characters, got '%s': %s" % (self.id, self)) elif self.inbound_queue and not tor_tools.is_valid_circuit_id(self.inbound_queue): raise stem.ProtocolError("Queue IDs must be one to sixteen alphanumeric characters, got '%s': %s" % (self.inbound_queue, self)) elif self.inbound_connection and not tor_tools.is_valid_connection_id(self.inbound_connection): raise stem.ProtocolError("Connection IDs must be one to sixteen alphanumeric characters, got '%s': %s" % (self.inbound_connection, self)) elif self.outbound_queue and not tor_tools.is_valid_circuit_id(self.outbound_queue): raise stem.ProtocolError("Queue IDs must be one to sixteen alphanumeric characters, got '%s': %s" % (self.outbound_queue, self)) elif self.outbound_connection and not tor_tools.is_valid_connection_id(self.outbound_connection): raise stem.ProtocolError("Connection IDs must be one to sixteen alphanumeric characters, got '%s': %s" % (self.outbound_connection, self)) self.inbound_added = _parse_cell_type_mapping(self.inbound_added) self.inbound_removed = _parse_cell_type_mapping(self.inbound_removed) self.inbound_time = _parse_cell_type_mapping(self.inbound_time) self.outbound_added = _parse_cell_type_mapping(self.outbound_added) self.outbound_removed = _parse_cell_type_mapping(self.outbound_removed) self.outbound_time = _parse_cell_type_mapping(self.outbound_time) class TokenBucketEmptyEvent(Event): """ Event emitted when refilling an empty token bucket. **These events are only emitted if TestingTorNetwork is set.** The TB_EMPTY event was introduced in tor version 0.2.5.2-alpha. .. versionadded:: 1.2.0 :var stem.TokenBucket bucket: bucket being refilled :var str id: connection identifier :var int read: time in milliseconds since the read bucket was last refilled :var int written: time in milliseconds since the write bucket was last refilled :var int last_refill: time in milliseconds the bucket has been empty since last refilled """ _POSITIONAL_ARGS = ('bucket',) _KEYWORD_ARGS = { 'ID': 'id', 'READ': 'read', 'WRITTEN': 'written', 'LAST': 'last_refill', } _VERSION_ADDED = stem.version.Requirement.EVENT_TB_EMPTY def _parse(self): if self.id and not tor_tools.is_valid_connection_id(self.id): raise stem.ProtocolError("Connection IDs must be one to sixteen alphanumeric characters, got '%s': %s" % (self.id, self)) elif not self.read.isdigit(): raise stem.ProtocolError("A TB_EMPTY's READ value should be a positive numeric value, received: %s" % self) elif not self.written.isdigit(): raise stem.ProtocolError("A TB_EMPTY's WRITTEN value should be a positive numeric value, received: %s" % self) elif not self.last_refill.isdigit(): raise stem.ProtocolError("A TB_EMPTY's LAST value should be a positive numeric value, received: %s" % self) self.read = int(self.read) self.written = int(self.written) self.last_refill = int(self.last_refill) self._log_if_unrecognized('bucket', stem.TokenBucket) def _parse_cell_type_mapping(mapping): """ Parses a mapping of the form... key1:value1,key2:value2... ... in which keys are strings and values are integers. :param str mapping: value to be parsed :returns: dict of **str => int** mappings :rasies: **stem.ProtocolError** if unable to parse the mapping """ if mapping is None: return None results = {} for entry in mapping.split(','): if ':' not in entry: raise stem.ProtocolError("Mappings are expected to be of the form 'key:value', got '%s': %s" % (entry, mapping)) key, value = entry.rsplit(':', 1) if not CELL_TYPE.match(key): raise stem.ProtocolError("Key had invalid characters, got '%s': %s" % (key, mapping)) elif not value.isdigit(): raise stem.ProtocolError("Values should just be integers, got '%s': %s" % (value, mapping)) results[key] = int(value) return results EVENT_TYPE_TO_CLASS = { 'ADDRMAP': AddrMapEvent, 'AUTHDIR_NEWDESCS': AuthDirNewDescEvent, 'BUILDTIMEOUT_SET': BuildTimeoutSetEvent, 'BW': BandwidthEvent, 'CELL_STATS': CellStatsEvent, 'CIRC': CircuitEvent, 'CIRC_BW': CircuitBandwidthEvent, 'CIRC_MINOR': CircMinorEvent, 'CLIENTS_SEEN': ClientsSeenEvent, 'CONF_CHANGED': ConfChangedEvent, 'CONN_BW': ConnectionBandwidthEvent, 'DEBUG': LogEvent, 'DESCCHANGED': DescChangedEvent, 'ERR': LogEvent, 'GUARD': GuardEvent, 'HS_DESC': HSDescEvent, 'HS_DESC_CONTENT': HSDescContentEvent, 'INFO': LogEvent, 'NETWORK_LIVENESS': NetworkLivenessEvent, 'NEWCONSENSUS': NewConsensusEvent, 'NEWDESC': NewDescEvent, 'NOTICE': LogEvent, 'NS': NetworkStatusEvent, 'ORCONN': ORConnEvent, 'SIGNAL': SignalEvent, 'STATUS_CLIENT': StatusEvent, 'STATUS_GENERAL': StatusEvent, 'STATUS_SERVER': StatusEvent, 'STREAM': StreamEvent, 'STREAM_BW': StreamBwEvent, 'TB_EMPTY': TokenBucketEmptyEvent, 'TRANSPORT_LAUNCHED': TransportLaunchedEvent, 'WARN': LogEvent, # accounting for a bug in tor 0.2.0.22 'STATUS_SEVER': StatusEvent, } stem-1.7.1/stem/directory.py0000664000175000017500000005523113341474573016561 0ustar atagaratagar00000000000000# Copyright 2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Directories that provide `relay descriptor information <../tutorials/mirror_mirror_on_the_wall.html>`_. At a very high level tor works as follows... 1. Volunteer starts a new tor relay, during which it sends a `server descriptor `_ to each of the directory authorities. 2. Each hour the directory authorities make a `vote `_ that says who they think the active relays are in the network and some attributes about them. 3. The directory authorities send each other their votes, and compile that into the `consensus `_. This document is very similar to the votes, the only difference being that the majority of the authorities agree upon and sign this document. The idividual relay entries in the vote or consensus is called `router status entries `_. 4. Tor clients (people using the service) download the consensus from an authority, fallback, or other mirror to determine who the active relays in the network are. They then use this to construct circuits and use the network. :: Directory - Relay we can retrieve descriptor information from | |- from_cache - Provides cached information bundled with Stem. | +- from_remote - Downloads the latest directory information from tor. | |- Authority - Tor directory authority +- Fallback - Mirrors that can be used instead of the authorities .. versionadded:: 1.7.0 """ import os import re import stem.util import stem.util.conf from stem.util import connection, str_tools, tor_tools try: # added in python 2.7 from collections import OrderedDict except ImportError: from stem.util.ordereddict import OrderedDict try: # account for urllib's change between python 2.x and 3.x import urllib.request as urllib except ImportError: import urllib2 as urllib GITWEB_AUTHORITY_URL = 'https://gitweb.torproject.org/tor.git/plain/src/app/config/auth_dirs.inc' GITWEB_FALLBACK_URL = 'https://gitweb.torproject.org/tor.git/plain/src/app/config/fallback_dirs.inc' FALLBACK_CACHE_PATH = os.path.join(os.path.dirname(__file__), 'cached_fallbacks.cfg') AUTHORITY_NAME = re.compile('"(\S+) orport=(\d+) .*"') AUTHORITY_V3IDENT = re.compile('"v3ident=([\dA-F]{40}) "') AUTHORITY_IPV6 = re.compile('"ipv6=\[([\da-f:]+)\]:(\d+) "') AUTHORITY_ADDR = re.compile('"([\d\.]+):(\d+) ([\dA-F ]{49})",') FALLBACK_DIV = '/* ===== */' FALLBACK_MAPPING = re.compile('/\*\s+(\S+)=(\S*)\s+\*/') FALLBACK_ADDR = re.compile('"([\d\.]+):(\d+) orport=(\d+) id=([\dA-F]{40}).*') FALLBACK_NICKNAME = re.compile('/\* nickname=(\S+) \*/') FALLBACK_EXTRAINFO = re.compile('/\* extrainfo=([0-1]) \*/') FALLBACK_IPV6 = re.compile('" ipv6=\[([\da-f:]+)\]:(\d+)"') def _match_with(lines, regexes, required = None): """ Scans the given content against a series of regex matchers, providing back a mapping of regexes to their capture groups. This maping is with the value if the regex has just a single capture group, and a tuple otherwise. :param list lines: text to parse :param list regexes: regexes to match against :param list required: matches that must be in the content :returns: **dict** mapping matchers against their capture groups :raises: **ValueError** if a required match is not present """ matches = {} for line in lines: for matcher in regexes: m = matcher.search(str_tools._to_unicode(line)) if m: match_groups = m.groups() matches[matcher] = match_groups if len(match_groups) > 1 else match_groups[0] if required: for required_matcher in required: if required_matcher not in matches: raise ValueError('Failed to parse mandatory data from:\n\n%s' % '\n'.join(lines)) return matches def _directory_entries(lines, pop_section_func, regexes, required = None): next_section = pop_section_func(lines) while next_section: yield _match_with(next_section, regexes, required) next_section = pop_section_func(lines) class Directory(object): """ Relay we can contact for descriptor information. Our :func:`~stem.directory.Directory.from_cache` and :func:`~stem.directory.Directory.from_remote` functions key off a different identifier based on our subclass... * :class:`~stem.directory.Authority` keys off the nickname. * :class:`~stem.directory.Fallback` keys off fingerprints. This is because authorities are highly static and canonically known by their names, whereas fallbacks vary more and don't necessarily have a nickname to key off of. :var str address: IPv4 address of the directory :var int or_port: port on which the relay services relay traffic :var int dir_port: port on which directory information is available :var str fingerprint: relay fingerprint :var str nickname: relay nickname :var str orport_v6: **(address, port)** tuple for the directory's IPv6 ORPort, or **None** if it doesn't have one """ def __init__(self, address, or_port, dir_port, fingerprint, nickname, orport_v6): identifier = '%s (%s)' % (fingerprint, nickname) if nickname else fingerprint if not connection.is_valid_ipv4_address(address): raise ValueError('%s has an invalid IPv4 address: %s' % (identifier, address)) elif not connection.is_valid_port(or_port): raise ValueError('%s has an invalid ORPort: %s' % (identifier, or_port)) elif not connection.is_valid_port(dir_port): raise ValueError('%s has an invalid DirPort: %s' % (identifier, dir_port)) elif not tor_tools.is_valid_fingerprint(fingerprint): raise ValueError('%s has an invalid fingerprint: %s' % (identifier, fingerprint)) elif nickname and not tor_tools.is_valid_nickname(nickname): raise ValueError('%s has an invalid nickname: %s' % (fingerprint, nickname)) if orport_v6: if not isinstance(orport_v6, tuple) or len(orport_v6) != 2: raise ValueError('%s orport_v6 should be a two value tuple: %s' % (identifier, str(orport_v6))) elif not connection.is_valid_ipv6_address(orport_v6[0]): raise ValueError('%s has an invalid IPv6 address: %s' % (identifier, orport_v6[0])) elif not connection.is_valid_port(orport_v6[1]): raise ValueError('%s has an invalid IPv6 port: %s' % (identifier, orport_v6[1])) self.address = address self.or_port = int(or_port) self.dir_port = int(dir_port) self.fingerprint = fingerprint self.nickname = nickname self.orport_v6 = (orport_v6[0], int(orport_v6[1])) if orport_v6 else None @staticmethod def from_cache(): """ Provides cached Tor directory information. This information is hardcoded into Tor and occasionally changes, so the information provided by this method may not necessarily match the latest version of tor. .. versionadded:: 1.5.0 .. versionchanged:: 1.7.0 Support added to the :class:`~stem.directory.Authority` class. :returns: **dict** of **str** identifiers to :class:`~stem.directory.Directory` instances """ raise NotImplementedError('Unsupported Operation: this should be implemented by the Directory subclass') @staticmethod def from_remote(timeout = 60): """ Reads and parses tor's directory data `from gitweb.torproject.org `_. Note that while convenient, this reliance on GitWeb means you should alway call with a fallback, such as... :: try: authorities = stem.directory.Authority.from_remote() except IOError: authorities = stem.directory.Authority.from_cache() .. versionadded:: 1.5.0 .. versionchanged:: 1.7.0 Support added to the :class:`~stem.directory.Authority` class. :param int timeout: seconds to wait before timing out the request :returns: **dict** of **str** identifiers to their :class:`~stem.directory.Directory` :raises: **IOError** if unable to retrieve the fallback directories """ raise NotImplementedError('Unsupported Operation: this should be implemented by the Directory subclass') def __hash__(self): return stem.util._hash_attr(self, 'address', 'or_port', 'dir_port', 'fingerprint', 'nickname', 'orport_v6') def __eq__(self, other): return hash(self) == hash(other) if isinstance(other, Directory) else False def __ne__(self, other): return not self == other class Authority(Directory): """ Tor directory authority, a special type of relay `hardcoded into tor `_ to enumerate the relays in the network. .. versionchanged:: 1.3.0 Added the is_bandwidth_authority attribute. .. versionchanged:: 1.7.0 Added the orport_v6 attribute. .. deprecated:: 1.7.0 The is_bandwidth_authority attribute is deprecated and will be removed in the future. :var str v3ident: identity key fingerprint used to sign votes and consensus """ def __init__(self, address = None, or_port = None, dir_port = None, fingerprint = None, nickname = None, orport_v6 = None, v3ident = None, is_bandwidth_authority = False): super(Authority, self).__init__(address, or_port, dir_port, fingerprint, nickname, orport_v6) if v3ident and not tor_tools.is_valid_fingerprint(v3ident): identifier = '%s (%s)' % (fingerprint, nickname) if nickname else fingerprint raise ValueError('%s has an invalid v3ident: %s' % (identifier, v3ident)) self.v3ident = v3ident self.is_bandwidth_authority = is_bandwidth_authority @staticmethod def from_cache(): return dict(DIRECTORY_AUTHORITIES) @staticmethod def from_remote(timeout = 60): try: lines = str_tools._to_unicode(urllib.urlopen(GITWEB_AUTHORITY_URL, timeout = timeout).read()).splitlines() except Exception as exc: raise IOError("Unable to download tor's directory authorities from %s: %s" % (GITWEB_AUTHORITY_URL, exc)) if not lines: raise IOError('%s did not have any content' % GITWEB_AUTHORITY_URL) # Entries look like... # # "moria1 orport=9101 " # "v3ident=D586D18309DED4CD6D57C18FDB97EFA96D330566 " # "128.31.0.39:9131 9695 DFC3 5FFE B861 329B 9F1A B04C 4639 7020 CE31", try: results = {} for matches in _directory_entries(lines, Authority._pop_section, (AUTHORITY_NAME, AUTHORITY_V3IDENT, AUTHORITY_IPV6, AUTHORITY_ADDR), required = (AUTHORITY_NAME, AUTHORITY_ADDR)): nickname, or_port = matches.get(AUTHORITY_NAME) address, dir_port, fingerprint = matches.get(AUTHORITY_ADDR) results[nickname] = Authority( address = address, or_port = or_port, dir_port = dir_port, fingerprint = fingerprint.replace(' ', ''), nickname = nickname, orport_v6 = matches.get(AUTHORITY_IPV6), v3ident = matches.get(AUTHORITY_V3IDENT), ) except ValueError as exc: raise IOError(str(exc)) return results @staticmethod def _pop_section(lines): """ Provides the next authority entry. """ section_lines = [] if lines: section_lines.append(lines.pop(0)) while lines and lines[0].startswith(' '): section_lines.append(lines.pop(0)) return section_lines def __hash__(self): return stem.util._hash_attr(self, 'v3ident', 'is_bandwidth_authority', parent = Directory, cache = True) def __eq__(self, other): return hash(self) == hash(other) if isinstance(other, Authority) else False def __ne__(self, other): return not self == other class Fallback(Directory): """ Particularly stable relays tor can instead of authorities when bootstrapping. These relays are `hardcoded in tor `_. For example, the following checks the performance of tor's fallback directories... :: import time from stem.descriptor.remote import get_consensus from stem.directory import Fallback for fallback in Fallback.from_cache().values(): start = time.time() get_consensus(endpoints = [(fallback.address, fallback.dir_port)]).run() print('Downloading the consensus took %0.2f from %s' % (time.time() - start, fallback.fingerprint)) :: % python example.py Downloading the consensus took 5.07 from 0AD3FA884D18F89EEA2D89C019379E0E7FD94417 Downloading the consensus took 3.59 from C871C91489886D5E2E94C13EA1A5FDC4B6DC5204 Downloading the consensus took 4.16 from 74A910646BCEEFBCD2E874FC1DC997430F968145 ... .. versionadded:: 1.5.0 .. versionchanged:: 1.7.0 Added the has_extrainfo and header attributes which are part of the `second version of the fallback directories `_. :var bool has_extrainfo: **True** if the relay should be able to provide extrainfo descriptors, **False** otherwise. :var collections.OrderedDict header: metadata about the fallback directory file this originated from """ def __init__(self, address = None, or_port = None, dir_port = None, fingerprint = None, nickname = None, has_extrainfo = False, orport_v6 = None, header = None): super(Fallback, self).__init__(address, or_port, dir_port, fingerprint, nickname, orport_v6) self.has_extrainfo = has_extrainfo self.header = OrderedDict(header) if header else OrderedDict() @staticmethod def from_cache(path = FALLBACK_CACHE_PATH): conf = stem.util.conf.Config() conf.load(path) headers = OrderedDict([(k.split('.', 1)[1], conf.get(k)) for k in conf.keys() if k.startswith('header.')]) results = {} for fingerprint in set([key.split('.')[0] for key in conf.keys()]): if fingerprint in ('tor_commit', 'stem_commit', 'header'): continue attr = {} for attr_name in ('address', 'or_port', 'dir_port', 'nickname', 'has_extrainfo', 'orport6_address', 'orport6_port'): key = '%s.%s' % (fingerprint, attr_name) attr[attr_name] = conf.get(key) if not attr[attr_name] and attr_name not in ('nickname', 'has_extrainfo', 'orport6_address', 'orport6_port'): raise IOError("'%s' is missing from %s" % (key, FALLBACK_CACHE_PATH)) if attr['orport6_address'] and attr['orport6_port']: orport_v6 = (attr['orport6_address'], int(attr['orport6_port'])) else: orport_v6 = None results[fingerprint] = Fallback( address = attr['address'], or_port = int(attr['or_port']), dir_port = int(attr['dir_port']), fingerprint = fingerprint, nickname = attr['nickname'], has_extrainfo = attr['has_extrainfo'] == 'true', orport_v6 = orport_v6, header = headers, ) return results @staticmethod def from_remote(timeout = 60): try: lines = str_tools._to_unicode(urllib.urlopen(GITWEB_FALLBACK_URL, timeout = timeout).read()).splitlines() except Exception as exc: raise IOError("Unable to download tor's fallback directories from %s: %s" % (GITWEB_FALLBACK_URL, exc)) if not lines: raise IOError('%s did not have any content' % GITWEB_FALLBACK_URL) elif lines[0] != '/* type=fallback */': raise IOError('%s does not have a type field indicating it is fallback directory metadata' % GITWEB_FALLBACK_URL) # header metadata header = {} for line in Fallback._pop_section(lines): mapping = FALLBACK_MAPPING.match(line) if mapping: header[mapping.group(1)] = mapping.group(2) else: raise IOError('Malformed fallback directory header line: %s' % line) Fallback._pop_section(lines) # skip human readable comments # Entries look like... # # "5.9.110.236:9030 orport=9001 id=0756B7CD4DFC8182BE23143FAC0642F515182CEB" # " ipv6=[2a01:4f8:162:51e2::2]:9001" # /* nickname=rueckgrat */ # /* extrainfo=1 */ try: results = {} for matches in _directory_entries(lines, Fallback._pop_section, (FALLBACK_ADDR, FALLBACK_NICKNAME, FALLBACK_EXTRAINFO, FALLBACK_IPV6), required = (FALLBACK_ADDR,)): address, dir_port, or_port, fingerprint = matches[FALLBACK_ADDR] results[fingerprint] = Fallback( address = address, or_port = int(or_port), dir_port = int(dir_port), fingerprint = fingerprint, nickname = matches.get(FALLBACK_NICKNAME), has_extrainfo = matches.get(FALLBACK_EXTRAINFO) == '1', orport_v6 = matches.get(FALLBACK_IPV6), header = header, ) except ValueError as exc: raise IOError(str(exc)) return results @staticmethod def _pop_section(lines): """ Provides lines up through the next divider. This excludes lines with just a comma since they're an artifact of these being C strings. """ section_lines = [] if lines: line = lines.pop(0) while lines and line != FALLBACK_DIV: if line.strip() != ',': section_lines.append(line) line = lines.pop(0) return section_lines @staticmethod def _write(fallbacks, tor_commit, stem_commit, headers, path = FALLBACK_CACHE_PATH): """ Persists fallback directories to a location in a way that can be read by from_cache(). :param dict fallbacks: mapping of fingerprints to their fallback directory :param str tor_commit: tor commit the fallbacks came from :param str stem_commit: stem commit the fallbacks came from :param dict headers: metadata about the file these came from :param str path: location fallbacks will be persisted to """ conf = stem.util.conf.Config() conf.set('tor_commit', tor_commit) conf.set('stem_commit', stem_commit) for k, v in headers.items(): conf.set('header.%s' % k, v) for directory in sorted(fallbacks.values(), key = lambda x: x.fingerprint): fingerprint = directory.fingerprint conf.set('%s.address' % fingerprint, directory.address) conf.set('%s.or_port' % fingerprint, str(directory.or_port)) conf.set('%s.dir_port' % fingerprint, str(directory.dir_port)) conf.set('%s.nickname' % fingerprint, directory.nickname) conf.set('%s.has_extrainfo' % fingerprint, 'true' if directory.has_extrainfo else 'false') if directory.orport_v6: conf.set('%s.orport6_address' % fingerprint, str(directory.orport_v6[0])) conf.set('%s.orport6_port' % fingerprint, str(directory.orport_v6[1])) conf.save(path) def __hash__(self): return stem.util._hash_attr(self, 'has_extrainfo', 'header', parent = Directory, cache = True) def __eq__(self, other): return hash(self) == hash(other) if isinstance(other, Fallback) else False def __ne__(self, other): return not self == other def _fallback_directory_differences(previous_directories, new_directories): """ Provides a description of how fallback directories differ. """ lines = [] added_fp = set(new_directories.keys()).difference(previous_directories.keys()) removed_fp = set(previous_directories.keys()).difference(new_directories.keys()) for fp in added_fp: directory = new_directories[fp] orport_v6 = '%s:%s' % directory.orport_v6 if directory.orport_v6 else '[none]' lines += [ '* Added %s as a new fallback directory:' % directory.fingerprint, ' address: %s' % directory.address, ' or_port: %s' % directory.or_port, ' dir_port: %s' % directory.dir_port, ' nickname: %s' % directory.nickname, ' has_extrainfo: %s' % directory.has_extrainfo, ' orport_v6: %s' % orport_v6, '', ] for fp in removed_fp: lines.append('* Removed %s as a fallback directory' % fp) for fp in new_directories: if fp in added_fp or fp in removed_fp: continue # already discussed these previous_directory = previous_directories[fp] new_directory = new_directories[fp] if previous_directory != new_directory: for attr in ('address', 'or_port', 'dir_port', 'fingerprint', 'orport_v6'): old_attr = getattr(previous_directory, attr) new_attr = getattr(new_directory, attr) if old_attr != new_attr: lines.append('* Changed the %s of %s from %s to %s' % (attr, fp, old_attr, new_attr)) return '\n'.join(lines) DIRECTORY_AUTHORITIES = { 'moria1': Authority( nickname = 'moria1', address = '128.31.0.39', or_port = 9101, dir_port = 9131, fingerprint = '9695DFC35FFEB861329B9F1AB04C46397020CE31', v3ident = 'D586D18309DED4CD6D57C18FDB97EFA96D330566', ), 'tor26': Authority( nickname = 'tor26', address = '86.59.21.38', or_port = 443, dir_port = 80, fingerprint = '847B1F850344D7876491A54892F904934E4EB85D', orport_v6 = ('2001:858:2:2:aabb:0:563b:1526', 443), v3ident = '14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4', ), 'dizum': Authority( nickname = 'dizum', address = '194.109.206.212', or_port = 443, dir_port = 80, fingerprint = '7EA6EAD6FD83083C538F44038BBFA077587DD755', v3ident = 'E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58', ), 'gabelmoo': Authority( nickname = 'gabelmoo', address = '131.188.40.189', or_port = 443, dir_port = 80, fingerprint = 'F2044413DAC2E02E3D6BCF4735A19BCA1DE97281', orport_v6 = ('2001:638:a000:4140::ffff:189', 443), v3ident = 'ED03BB616EB2F60BEC80151114BB25CEF515B226', ), 'dannenberg': Authority( nickname = 'dannenberg', address = '193.23.244.244', or_port = 443, dir_port = 80, orport_v6 = ('2001:678:558:1000::244', 443), fingerprint = '7BE683E65D48141321C5ED92F075C55364AC7123', v3ident = '0232AF901C31A04EE9848595AF9BB7620D4C5B2E', ), 'maatuska': Authority( nickname = 'maatuska', address = '171.25.193.9', or_port = 80, dir_port = 443, fingerprint = 'BD6A829255CB08E66FBE7D3748363586E46B3810', orport_v6 = ('2001:67c:289c::9', 80), v3ident = '49015F787433103580E3B66A1707A00E60F2D15B', ), 'Faravahar': Authority( nickname = 'Faravahar', address = '154.35.175.225', or_port = 443, dir_port = 80, fingerprint = 'CF6D0AAFB385BE71B8E111FC5CFF4B47923733BC', v3ident = 'EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97', ), 'longclaw': Authority( nickname = 'longclaw', address = '199.58.81.140', or_port = 443, dir_port = 80, fingerprint = '74A910646BCEEFBCD2E874FC1DC997430F968145', v3ident = '23D15D965BC35114467363C165C4F724B64B4F66', ), 'bastet': Authority( nickname = 'bastet', address = '204.13.164.118', or_port = 443, dir_port = 80, fingerprint = '24E2F139121D4394C54B5BCC368B3B411857C413', orport_v6 = ('2620:13:4000:6000::1000:118', 443), v3ident = '27102BC123E7AF1D4741AE047E160C91ADC76B21', ), 'Serge': Authority( nickname = 'Serge', address = '66.111.2.131', or_port = 9001, dir_port = 9030, fingerprint = 'BA44A889E64B93FAA2B114E02C2A279A8555C533', v3ident = None, # does not vote in the consensus ), } stem-1.7.1/stem/control.py0000664000175000017500000043730413411002341016214 0ustar atagaratagar00000000000000# Copyright 2011-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Module for interacting with the Tor control socket. The :class:`~stem.control.Controller` is a wrapper around a :class:`~stem.socket.ControlSocket`, retaining many of its methods (connect, close, is_alive, etc) in addition to providing its own for working with the socket at a higher level. Stem has `several ways <../faq.html#how-do-i-connect-to-tor>`_ of getting a :class:`~stem.control.Controller`, but the most flexible are :func:`~stem.control.Controller.from_port` and :func:`~stem.control.Controller.from_socket_file`. These static :class:`~stem.control.Controller` methods give you an **unauthenticated** Controller you can then authenticate yourself using its :func:`~stem.control.Controller.authenticate` method. For example... :: import getpass import sys import stem import stem.connection from stem.control import Controller if __name__ == '__main__': try: controller = Controller.from_port() except stem.SocketError as exc: print("Unable to connect to tor on port 9051: %s" % exc) sys.exit(1) try: controller.authenticate() except stem.connection.MissingPassword: pw = getpass.getpass("Controller password: ") try: controller.authenticate(password = pw) except stem.connection.PasswordAuthFailed: print("Unable to authenticate, password is incorrect") sys.exit(1) except stem.connection.AuthenticationFailure as exc: print("Unable to authenticate: %s" % exc) sys.exit(1) print("Tor is running version %s" % controller.get_version()) controller.close() If you're fine with allowing your script to raise exceptions then this can be more nicely done as... :: from stem.control import Controller if __name__ == '__main__': with Controller.from_port() as controller: controller.authenticate() print("Tor is running version %s" % controller.get_version()) **Module Overview:** :: event_description - brief description of a tor event type Controller - General controller class intended for direct use | |- from_port - Provides a Controller based on a port connection. | +- from_socket_file - Provides a Controller based on a socket file connection. | |- authenticate - authenticates this controller with tor |- reconnect - reconnects and authenticates to socket | |- get_info - issues a GETINFO query for a parameter |- get_version - provides our tor version |- get_exit_policy - provides our exit policy |- get_ports - provides the local ports where tor is listening for connections |- get_listeners - provides the addresses and ports where tor is listening for connections |- get_accounting_stats - provides stats related to relaying limits |- get_protocolinfo - information about the controller interface |- get_user - provides the user tor is running as |- get_pid - provides the pid of our tor process |- is_user_traffic_allowed - checks if we send or receive direct user traffic | |- get_microdescriptor - querying the microdescriptor for a relay |- get_microdescriptors - provides all currently available microdescriptors |- get_server_descriptor - querying the server descriptor for a relay |- get_server_descriptors - provides all currently available server descriptors |- get_network_status - querying the router status entry for a relay |- get_network_statuses - provides all presently available router status entries |- get_hidden_service_descriptor - queries the given hidden service descriptor | |- get_conf - gets the value of a configuration option |- get_conf_map - gets the values of multiple configuration options |- is_set - determines if an option differs from its default |- set_conf - sets the value of a configuration option |- reset_conf - reverts configuration options to their default values |- set_options - sets or resets the values of multiple configuration options | |- get_hidden_service_conf - provides our hidden service configuration |- set_hidden_service_conf - sets our hidden service configuration |- create_hidden_service - creates a new hidden service or adds a new port |- remove_hidden_service - removes a hidden service or drops a port | |- list_ephemeral_hidden_services - list ephemeral hidden serivces |- create_ephemeral_hidden_service - create a new ephemeral hidden service |- remove_ephemeral_hidden_service - removes an ephemeral hidden service | |- add_event_listener - attaches an event listener to be notified of tor events |- remove_event_listener - removes a listener so it isn't notified of further events | |- is_caching_enabled - true if the controller has enabled caching |- set_caching - enables or disables caching |- clear_cache - clears any cached results | |- load_conf - loads configuration information as if it was in the torrc |- save_conf - saves configuration information to the torrc | |- is_feature_enabled - checks if a given controller feature is enabled |- enable_feature - enables a controller feature that has been disabled by default | |- get_circuit - provides an active circuit |- get_circuits - provides a list of active circuits |- new_circuit - create new circuits |- extend_circuit - create new circuits and extend existing ones |- repurpose_circuit - change a circuit's purpose |- close_circuit - close a circuit | |- get_streams - provides a list of active streams |- attach_stream - attach a stream to a circuit |- close_stream - close a stream | |- signal - sends a signal to the tor client |- is_newnym_available - true if tor would currently accept a NEWNYM signal |- get_newnym_wait - seconds until tor would accept a NEWNYM signal |- get_effective_rate - provides our effective relaying rate limit |- is_geoip_unavailable - true if we've discovered our geoip db to be unavailable |- map_address - maps one address to another such that connections to the original are replaced with the other +- drop_guards - drops our set of guard relays and picks a new set BaseController - Base controller class asynchronous message handling |- msg - communicates with the tor process |- is_alive - reports if our connection to tor is open or closed |- is_localhost - returns if the connection is for the local system or not |- connection_time - time when we last connected or disconnected |- is_authenticated - checks if we're authenticated to tor |- connect - connects or reconnects to tor |- close - shuts down our connection to the tor process |- get_socket - provides the socket used for control communication |- get_latest_heartbeat - timestamp for when we last heard from tor |- add_status_listener - notifies a callback of changes in our status +- remove_status_listener - prevents further notification of status changes .. data:: State (enum) Enumeration for states that a controller can have. ========== =========== State Description ========== =========== **INIT** new control connection **RESET** received a reset/sighup signal **CLOSED** control connection closed ========== =========== .. data:: EventType (enum) Known types of events that the :func:`~stem.control.Controller.add_event_listener` method of the :class:`~stem.control.Controller` can listen for. The most frequently listened for event types tend to be the logging events (**DEBUG**, **INFO**, **NOTICE**, **WARN**, and **ERR**), bandwidth usage (**BW**), and circuit or stream changes (**CIRC** and **STREAM**). Enums are mapped to :class:`~stem.response.events.Event` subclasses as follows... .. deprecated:: 1.6.0 Tor dropped EventType.AUTHDIR_NEWDESCS as of version 0.3.2.1. (:spec:`6e887ba`) ======================= =========== EventType Event Class ======================= =========== **ADDRMAP** :class:`stem.response.events.AddrMapEvent` **AUTHDIR_NEWDESCS** :class:`stem.response.events.AuthDirNewDescEvent` **BUILDTIMEOUT_SET** :class:`stem.response.events.BuildTimeoutSetEvent` **BW** :class:`stem.response.events.BandwidthEvent` **CELL_STATS** :class:`stem.response.events.CellStatsEvent` **CIRC** :class:`stem.response.events.CircuitEvent` **CIRC_BW** :class:`stem.response.events.CircuitBandwidthEvent` **CIRC_MINOR** :class:`stem.response.events.CircMinorEvent` **CLIENTS_SEEN** :class:`stem.response.events.ClientsSeenEvent` **CONF_CHANGED** :class:`stem.response.events.ConfChangedEvent` **CONN_BW** :class:`stem.response.events.ConnectionBandwidthEvent` **DEBUG** :class:`stem.response.events.LogEvent` **DESCCHANGED** :class:`stem.response.events.DescChangedEvent` **ERR** :class:`stem.response.events.LogEvent` **GUARD** :class:`stem.response.events.GuardEvent` **HS_DESC** :class:`stem.response.events.HSDescEvent` **HS_DESC_CONTENT** :class:`stem.response.events.HSDescContentEvent` **INFO** :class:`stem.response.events.LogEvent` **NETWORK_LIVENESS** :class:`stem.response.events.NetworkLivenessEvent` **NEWCONSENSUS** :class:`stem.response.events.NewConsensusEvent` **NEWDESC** :class:`stem.response.events.NewDescEvent` **NOTICE** :class:`stem.response.events.LogEvent` **NS** :class:`stem.response.events.NetworkStatusEvent` **ORCONN** :class:`stem.response.events.ORConnEvent` **SIGNAL** :class:`stem.response.events.SignalEvent` **STATUS_CLIENT** :class:`stem.response.events.StatusEvent` **STATUS_GENERAL** :class:`stem.response.events.StatusEvent` **STATUS_SERVER** :class:`stem.response.events.StatusEvent` **STREAM** :class:`stem.response.events.StreamEvent` **STREAM_BW** :class:`stem.response.events.StreamBwEvent` **TB_EMPTY** :class:`stem.response.events.TokenBucketEmptyEvent` **TRANSPORT_LAUNCHED** :class:`stem.response.events.TransportLaunchedEvent` **WARN** :class:`stem.response.events.LogEvent` ======================= =========== .. data:: Listener (enum) Purposes for inbound connections that Tor handles. ============= =========== Listener Description ============= =========== **OR** traffic we're relaying as a member of the network (torrc's **ORPort** and **ORListenAddress**) **DIR** mirroring for tor descriptor content (torrc's **DirPort** and **DirListenAddress**) **SOCKS** client traffic we're sending over Tor (torrc's **SocksPort** and **SocksListenAddress**) **TRANS** transparent proxy handling (torrc's **TransPort** and **TransListenAddress**) **NATD** forwarding for ipfw NATD connections (torrc's **NatdPort** and **NatdListenAddress**) **DNS** DNS lookups for our traffic (torrc's **DNSPort** and **DNSListenAddress**) **CONTROL** controller applications (torrc's **ControlPort** and **ControlListenAddress**) ============= =========== """ import calendar import collections import functools import inspect import io import os import threading import time try: # Added in 2.7 from collections import OrderedDict except ImportError: from stem.util.ordereddict import OrderedDict try: # Added in 3.x import queue except ImportError: import Queue as queue import stem.descriptor.microdescriptor import stem.descriptor.reader import stem.descriptor.router_status_entry import stem.descriptor.server_descriptor import stem.exit_policy import stem.response import stem.response.events import stem.socket import stem.util import stem.util.conf import stem.util.connection import stem.util.enum import stem.util.str_tools import stem.util.system import stem.util.tor_tools import stem.version from stem import UNDEFINED, CircStatus, Signal from stem.util import log # When closing the controller we attempt to finish processing enqueued events, # but if it takes longer than this we terminate. EVENTS_LISTENING_TIMEOUT = 0.1 MALFORMED_EVENTS = 'MALFORMED_EVENTS' # state changes a control socket can have State = stem.util.enum.Enum('INIT', 'RESET', 'CLOSED') EventType = stem.util.enum.UppercaseEnum( 'ADDRMAP', 'AUTHDIR_NEWDESCS', 'BUILDTIMEOUT_SET', 'BW', 'CELL_STATS', 'CIRC', 'CIRC_BW', 'CIRC_MINOR', 'CONF_CHANGED', 'CONN_BW', 'CLIENTS_SEEN', 'DEBUG', 'DESCCHANGED', 'ERR', 'GUARD', 'HS_DESC', 'HS_DESC_CONTENT', 'INFO', 'NETWORK_LIVENESS', 'NEWCONSENSUS', 'NEWDESC', 'NOTICE', 'NS', 'ORCONN', 'SIGNAL', 'STATUS_CLIENT', 'STATUS_GENERAL', 'STATUS_SERVER', 'STREAM', 'STREAM_BW', 'TB_EMPTY', 'TRANSPORT_LAUNCHED', 'WARN', ) Listener = stem.util.enum.UppercaseEnum( 'OR', 'DIR', 'SOCKS', 'TRANS', 'NATD', 'DNS', 'CONTROL', ) # torrc options that cannot be changed once tor's running IMMUTABLE_CONFIG_OPTIONS = set(map(stem.util.str_tools._to_unicode, map(str.lower, ( 'AccelDir', 'AccelName', 'DataDirectory', 'DisableAllSwap', 'DisableDebuggerAttachment', 'HardwareAccel', 'HiddenServiceNonAnonymousMode', 'HiddenServiceSingleHopMode', 'KeepBindCapabilities', 'PidFile', 'RunAsDaemon', 'Sandbox', 'SyslogIdentityTag', 'TokenBucketRefillInterval', 'User', )))) LOG_CACHE_FETCHES = True # provide trace level logging for cache hits # Configuration options that are fetched by a special key. The keys are # lowercase to make case insensitive lookups easier. MAPPED_CONFIG_KEYS = { 'hiddenservicedir': 'HiddenServiceOptions', 'hiddenserviceport': 'HiddenServiceOptions', 'hiddenserviceversion': 'HiddenServiceOptions', 'hiddenserviceauthorizeclient': 'HiddenServiceOptions', 'hiddenserviceoptions': 'HiddenServiceOptions', } # unchangeable GETINFO parameters CACHEABLE_GETINFO_PARAMS = ( 'address', 'version', 'config-file', 'exit-policy/default', 'fingerprint', 'config/names', 'config/defaults', 'info/names', 'events/names', 'features/names', 'process/descriptor-limit', 'status/version/current', ) CACHEABLE_GETINFO_PARAMS_UNTIL_SETCONF = ( 'accounting/enabled', ) # GETCONF parameters we shouldn't cache. This includes hidden service # perameters due to the funky way they're set and retrieved (for instance, # 'SETCONF HiddenServiceDir' effects 'GETCONF HiddenServiceOptions'). UNCACHEABLE_GETCONF_PARAMS = ( 'hiddenserviceoptions', 'hiddenservicedir', 'hiddenserviceport', 'hiddenserviceversion', 'hiddenserviceauthorizeclient', ) SERVER_DESCRIPTORS_UNSUPPORTED = "Tor is currently not configured to retrieve \ server descriptors. As of Tor version 0.2.3.25 it downloads microdescriptors \ instead unless you set 'UseMicrodescriptors 0' in your torrc." EVENT_DESCRIPTIONS = None class AccountingStats(collections.namedtuple('AccountingStats', ['retrieved', 'status', 'interval_end', 'time_until_reset', 'read_bytes', 'read_bytes_left', 'read_limit', 'written_bytes', 'write_bytes_left', 'write_limit'])): """ Accounting information, determining the limits where our relay suspends itself. :var float retrieved: unix timestamp for when this was fetched :var str status: hibernation status of 'awake', 'soft', or 'hard' :var datetime interval_end: time when our limits reset :var int time_until_reset: seconds until our limits reset :var int read_bytes: number of bytes we've read relaying :var int read_bytes_left: number of bytes we can read until we suspend :var int read_limit: reading threshold where we suspend :var int written_bytes: number of bytes we've written relaying :var int write_bytes_left: number of bytes we can write until we suspend :var int write_limit: writing threshold where we suspend """ class UserTrafficAllowed(collections.namedtuple('UserTrafficAllowed', ['inbound', 'outbound'])): """ Indicates if we're likely to be servicing direct user traffic or not. :var bool inbound: if **True** we're likely providing guard or bridge connnections :var bool outbound: if **True** we're likely providng exit connections """ class CreateHiddenServiceOutput(collections.namedtuple('CreateHiddenServiceOutput', ['path', 'hostname', 'hostname_for_client', 'config'])): """ Attributes of a hidden service we've created. Both the **hostnames** and **hostname_for_client** attributes can only be provided if we're able to read the hidden service directory. If the method was called with **client_names** then we may provide the **hostname_for_client**, and otherwise can provide the **hostnames**. :var str path: hidden service directory :var str hostname: content of the hostname file if available :var dict hostname_for_client: mapping of client names to their onion address if available :var dict config: tor's new hidden service configuration """ def with_default(yields = False): """ Provides a decorator to support having a default value. This should be treated as private. """ def decorator(func): def get_default(func, args, kwargs): arg_names = inspect.getargspec(func).args[1:] # drop 'self' default_position = arg_names.index('default') if 'default' in arg_names else None if default_position is not None and default_position < len(args): return args[default_position] else: return kwargs.get('default', UNDEFINED) if not yields: @functools.wraps(func) def wrapped(self, *args, **kwargs): try: return func(self, *args, **kwargs) except: default = get_default(func, args, kwargs) if default == UNDEFINED: raise else: return default else: @functools.wraps(func) def wrapped(self, *args, **kwargs): try: for val in func(self, *args, **kwargs): yield val except: default = get_default(func, args, kwargs) if default == UNDEFINED: raise else: if default is not None: for val in default: yield val return wrapped return decorator def event_description(event): """ Provides a description for Tor events. :param str event: the event for which a description is needed :returns: **str** The event description or **None** if this is an event name we don't have a description for """ global EVENT_DESCRIPTIONS if EVENT_DESCRIPTIONS is None: config = stem.util.conf.Config() config_path = os.path.join(os.path.dirname(__file__), 'settings.cfg') try: config.load(config_path) EVENT_DESCRIPTIONS = dict([(key.lower()[18:], config.get_value(key)) for key in config.keys() if key.startswith('event.description.')]) except Exception as exc: log.warn("BUG: stem failed to load its internal manual information from '%s': %s" % (config_path, exc)) return None return EVENT_DESCRIPTIONS.get(event.lower()) class BaseController(object): """ Controller for the tor process. This is a minimal base class for other controllers, providing basic process communication and event listing. Don't use this directly - subclasses like the :class:`~stem.control.Controller` provide higher level functionality. It's highly suggested that you don't interact directly with the :class:`~stem.socket.ControlSocket` that we're constructed from - use our wrapper methods instead. If the **control_socket** is already authenticated to Tor then the caller should provide the **is_authenticated** flag. Otherwise, we will treat the socket as though it hasn't yet been authenticated. """ def __init__(self, control_socket, is_authenticated = False): self._socket = control_socket self._msg_lock = threading.RLock() self._status_listeners = [] # tuples of the form (callback, spawn_thread) self._status_listeners_lock = threading.RLock() # queues where incoming messages are directed self._reply_queue = queue.Queue() self._event_queue = queue.Queue() # thread to continually pull from the control socket self._reader_thread = None # thread to pull from the _event_queue and call handle_event self._event_notice = threading.Event() self._event_thread = None # saves our socket's prior _connect() and _close() methods so they can be # called along with ours self._socket_connect = self._socket._connect self._socket_close = self._socket._close self._socket._connect = self._connect self._socket._close = self._close self._last_heartbeat = 0.0 # timestamp for when we last heard from tor self._is_authenticated = False self._state_change_threads = [] # threads we've spawned to notify of state changes if self._socket.is_alive(): self._launch_threads() if is_authenticated: self._post_authentication() def msg(self, message): """ Sends a message to our control socket and provides back its reply. :param str message: message to be formatted and sent to tor :returns: :class:`~stem.response.ControlMessage` with the response :raises: * :class:`stem.ProtocolError` the content from the socket is malformed * :class:`stem.SocketError` if a problem arises in using the socket * :class:`stem.SocketClosed` if the socket is shut down """ with self._msg_lock: # If our _reply_queue isn't empty then one of a few things happened... # # - Our connection was closed and probably re-restablished. This was # in reply to pulling for an asynchronous event and getting this is # expected - ignore it. # # - Pulling for asynchronous events produced an error. If this was a # ProtocolError then it's a tor bug, and if a non-closure SocketError # then it was probably a socket glitch. Deserves an INFO level log # message. # # - This is a leftover response for a msg() call. We can't tell who an # exception was earmarked for, so we only know that this was the case # if it's a ControlMessage. # # This is the most concerning situation since it indicates that one of # our callers didn't get their reply. However, this is still a # perfectly viable use case. For instance... # # 1. We send a request. # 2. The reader thread encounters an exception, for instance a socket # error. We enqueue the exception. # 3. The reader thread receives the reply. # 4. We raise the socket error, and have an undelivered message. # # Thankfully this only seems to arise in edge cases around rapidly # closing/reconnecting the socket. while not self._reply_queue.empty(): try: response = self._reply_queue.get_nowait() if isinstance(response, stem.SocketClosed): pass # this is fine elif isinstance(response, stem.ProtocolError): log.info('Tor provided a malformed message (%s)' % response) elif isinstance(response, stem.ControllerError): log.info('Socket experienced a problem (%s)' % response) elif isinstance(response, stem.response.ControlMessage): log.info('Failed to deliver a response: %s' % response) except queue.Empty: # the empty() method is documented to not be fully reliable so this # isn't entirely surprising break try: self._socket.send(message) response = self._reply_queue.get() # If the message we received back had an exception then re-raise it to the # caller. Otherwise return the response. if isinstance(response, stem.ControllerError): raise response else: return response except stem.SocketClosed: # If the recv() thread caused the SocketClosed then we could still be # in the process of closing. Calling close() here so that we can # provide an assurance to the caller that when we raise a SocketClosed # exception we are shut down afterward for realz. self.close() raise def is_alive(self): """ Checks if our socket is currently connected. This is a pass-through for our socket's :func:`~stem.socket.BaseSocket.is_alive` method. :returns: **bool** that's **True** if our socket is connected and **False** otherwise """ return self._socket.is_alive() def is_localhost(self): """ Returns if the connection is for the local system or not. .. versionadded:: 1.3.0 :returns: **bool** that's **True** if the connection is for the local host and **False** otherwise """ return self._socket.is_localhost() def connection_time(self): """ Provides the unix timestamp for when our socket was either connected or disconnected. That is to say, the time we connected if we're currently connected and the time we disconnected if we're not connected. .. versionadded:: 1.3.0 :returns: **float** for when we last connected or disconnected, zero if we've never connected """ return self._socket.connection_time() def is_authenticated(self): """ Checks if our socket is both connected and authenticated. :returns: **bool** that's **True** if our socket is authenticated to tor and **False** otherwise """ return self._is_authenticated if self.is_alive() else False def connect(self): """ Reconnects our control socket. This is a pass-through for our socket's :func:`~stem.socket.ControlSocket.connect` method. :raises: :class:`stem.SocketError` if unable to make a socket """ self._socket.connect() def close(self): """ Closes our socket connection. This is a pass-through for our socket's :func:`~stem.socket.BaseSocket.close` method. """ self._socket.close() # Join on any outstanding state change listeners. Closing is a state change # of its own, so if we have any listeners it's quite likely there's some # work in progress. # # It's important that we do this outside of our locks so those daemons have # access to us. This is why we're doing this here rather than _close(). for t in self._state_change_threads: if t.is_alive() and threading.current_thread() != t: t.join() def get_socket(self): """ Provides the socket used to speak with the tor process. Communicating with the socket directly isn't advised since it may confuse this controller. :returns: :class:`~stem.socket.ControlSocket` we're communicating with """ return self._socket def get_latest_heartbeat(self): """ Provides the unix timestamp for when we last heard from tor. This is zero if we've never received a message. :returns: float for the unix timestamp of when we last heard from tor """ return self._last_heartbeat def add_status_listener(self, callback, spawn = True): """ Notifies a given function when the state of our socket changes. Functions are expected to be of the form... :: my_function(controller, state, timestamp) The state is a value from the :data:`stem.control.State` enum. Functions **must** allow for new values. The timestamp is a float for the unix time when the change occurred. This class only provides **State.INIT** and **State.CLOSED** notifications. Subclasses may provide others. If spawn is **True** then the callback is notified via a new daemon thread. If **False** then the notice is under our locks, within the thread where the change occurred. In general this isn't advised, especially if your callback could block for a while. If still outstanding these threads are joined on as part of closing this controller. :param function callback: function to be notified when our state changes :param bool spawn: calls function via a new thread if **True**, otherwise it's part of the connect/close method call """ with self._status_listeners_lock: self._status_listeners.append((callback, spawn)) def remove_status_listener(self, callback): """ Stops listener from being notified of further events. :param function callback: function to be removed from our listeners :returns: **bool** that's **True** if we removed one or more occurrences of the callback, **False** otherwise """ with self._status_listeners_lock: new_listeners, is_changed = [], False for listener, spawn in self._status_listeners: if listener != callback: new_listeners.append((listener, spawn)) else: is_changed = True self._status_listeners = new_listeners return is_changed def __enter__(self): return self def __exit__(self, exit_type, value, traceback): self.close() def _handle_event(self, event_message): """ Callback to be overwritten by subclasses for event listening. This is notified whenever we receive an event from the control socket. :param stem.response.ControlMessage event_message: message received from the control socket """ pass def _connect(self): self._launch_threads() self._notify_status_listeners(State.INIT) self._socket_connect() self._is_authenticated = False def _close(self): # Our is_alive() state is now false. Our reader thread should already be # awake from recv() raising a closure exception. Wake up the event thread # too so it can end. self._event_notice.set() self._is_authenticated = False # joins on our threads if it's safe to do so for t in (self._reader_thread, self._event_thread): if t and t.is_alive() and threading.current_thread() != t: t.join() self._notify_status_listeners(State.CLOSED) self._socket_close() def _post_authentication(self): # actions to be taken after we have a newly authenticated connection self._is_authenticated = True def _notify_status_listeners(self, state): """ Informs our status listeners that a state change occurred. :param stem.control.State state: state change that has occurred """ # Any changes to our is_alive() state happen under the send lock, so we # need to have it to ensure it doesn't change beneath us. with self._socket._get_send_lock(): with self._status_listeners_lock: # States imply that our socket is either alive or not, which may not # hold true when multiple events occur in quick succession. For # instance, a sighup could cause two events (State.RESET for the sighup # and State.CLOSE if it causes tor to crash). However, there's no # guarantee of the order in which they occur, and it would be bad if # listeners got the State.RESET last, implying that we were alive. expect_alive = None if state in (State.INIT, State.RESET): expect_alive = True elif state == State.CLOSED: expect_alive = False change_timestamp = time.time() if expect_alive is not None and expect_alive != self.is_alive(): return self._state_change_threads = list(filter(lambda t: t.is_alive(), self._state_change_threads)) for listener, spawn in self._status_listeners: if spawn: args = (self, state, change_timestamp) notice_thread = threading.Thread(target = listener, args = args, name = '%s notification' % state) notice_thread.setDaemon(True) notice_thread.start() self._state_change_threads.append(notice_thread) else: listener(self, state, change_timestamp) def _launch_threads(self): """ Initializes daemon threads. Threads can't be reused so we need to recreate them if we're restarted. """ # In theory concurrent calls could result in multiple start() calls on a # single thread, which would cause an unexpected exception. Best be safe. with self._socket._get_send_lock(): if not self._reader_thread or not self._reader_thread.is_alive(): self._reader_thread = threading.Thread(target = self._reader_loop, name = 'Tor listener') self._reader_thread.setDaemon(True) self._reader_thread.start() if not self._event_thread or not self._event_thread.is_alive(): self._event_thread = threading.Thread(target = self._event_loop, name = 'Event notifier') self._event_thread.setDaemon(True) self._event_thread.start() def _reader_loop(self): """ Continually pulls from the control socket, directing the messages into queues based on their type. Controller messages come in two varieties... * Responses to messages we've sent (GETINFO, SETCONF, etc). * Asynchronous events, identified by a status code of 650. """ while self.is_alive(): try: control_message = self._socket.recv() self._last_heartbeat = time.time() if control_message.content()[-1][0] == '650': # asynchronous message, adds to the event queue and wakes up its handler self._event_queue.put(control_message) self._event_notice.set() else: # response to a msg() call self._reply_queue.put(control_message) except stem.ControllerError as exc: # Assume that all exceptions belong to the reader. This isn't always # true, but the msg() call can do a better job of sorting it out. # # Be aware that the msg() method relies on this to unblock callers. self._reply_queue.put(exc) def _event_loop(self): """ Continually pulls messages from the _event_queue and sends them to our handle_event callback. This is done via its own thread so subclasses with a lengthy handle_event implementation don't block further reading from the socket. """ socket_closed_at = None while True: try: event_message = self._event_queue.get_nowait() self._handle_event(event_message) # Attempt to finish processing enqueued events when our controller closes if not self.is_alive(): if not socket_closed_at: socket_closed_at = time.time() elif time.time() - socket_closed_at > EVENTS_LISTENING_TIMEOUT: break except queue.Empty: if not self.is_alive(): break self._event_notice.wait() self._event_notice.clear() class Controller(BaseController): """ Connection with Tor's control socket. This is built on top of the BaseController and provides a more user friendly API for library users. """ @staticmethod def from_port(address = '127.0.0.1', port = 'default'): """ Constructs a :class:`~stem.socket.ControlPort` based Controller. If the **port** is **'default'** then this checks on both 9051 (default for relays) and 9151 (default for the Tor Browser). This default may change in the future. .. versionchanged:: 1.5.0 Use both port 9051 and 9151 by default. :param str address: ip address of the controller :param int port: port number of the controller :returns: :class:`~stem.control.Controller` attached to the given port :raises: :class:`stem.SocketError` if we're unable to establish a connection """ import stem.connection if not stem.util.connection.is_valid_ipv4_address(address): raise ValueError('Invalid IP address: %s' % address) elif port != 'default' and not stem.util.connection.is_valid_port(port): raise ValueError('Invalid port: %s' % port) if port == 'default': control_port = stem.connection._connection_for_default_port(address) else: control_port = stem.socket.ControlPort(address, port) return Controller(control_port) @staticmethod def from_socket_file(path = '/var/run/tor/control'): """ Constructs a :class:`~stem.socket.ControlSocketFile` based Controller. :param str path: path where the control socket is located :returns: :class:`~stem.control.Controller` attached to the given socket file :raises: :class:`stem.SocketError` if we're unable to establish a connection """ control_socket = stem.socket.ControlSocketFile(path) return Controller(control_socket) def __init__(self, control_socket, is_authenticated = False): self._is_caching_enabled = True self._request_cache = {} self._last_newnym = 0.0 self._cache_lock = threading.RLock() # mapping of event types to their listeners self._event_listeners = {} self._event_listeners_lock = threading.RLock() self._enabled_features = [] self._is_geoip_unavailable = None self._last_address_exc = None self._last_fingerprint_exc = None super(Controller, self).__init__(control_socket, is_authenticated) def _sighup_listener(event): if event.signal == Signal.RELOAD: self.clear_cache() self._notify_status_listeners(State.RESET) self.add_event_listener(_sighup_listener, EventType.SIGNAL) def _confchanged_listener(event): if self.is_caching_enabled(): to_cache_changed = dict((k.lower(), v) for k, v in event.changed.items()) to_cache_unset = dict((k.lower(), []) for k in event.unset) # [] represents None value in cache to_cache = {} to_cache.update(to_cache_changed) to_cache.update(to_cache_unset) self._set_cache(to_cache, 'getconf') self._confchanged_cache_invalidation(to_cache) self.add_event_listener(_confchanged_listener, EventType.CONF_CHANGED) def _address_changed_listener(event): if event.action in ('EXTERNAL_ADDRESS', 'DNS_USELESS'): self._set_cache({'exit_policy': None}) self._set_cache({'address': None}, 'getinfo') self._last_address_exc = None self.add_event_listener(_address_changed_listener, EventType.STATUS_SERVER) def close(self): self.clear_cache() super(Controller, self).close() def authenticate(self, *args, **kwargs): """ A convenience method to authenticate the controller. This is just a pass-through to :func:`stem.connection.authenticate`. """ import stem.connection stem.connection.authenticate(self, *args, **kwargs) def reconnect(self, *args, **kwargs): """ Reconnects and authenticates to our control socket. .. versionadded:: 1.5.0 :raises: * :class:`stem.SocketError` if unable to re-establish socket * :class:`stem.connection.AuthenticationFailure` if unable to authenticate """ with self._msg_lock: self.connect() self.clear_cache() self.authenticate(*args, **kwargs) @with_default() def get_info(self, params, default = UNDEFINED, get_bytes = False): """ get_info(params, default = UNDEFINED, get_bytes = False) Queries the control socket for the given GETINFO option. If provided a default then that's returned if the GETINFO option is undefined or the call fails for any reason (error response, control port closed, initiated, etc). .. versionchanged:: 1.1.0 Added the get_bytes argument. .. versionchanged:: 1.7.0 Errors commonly provided a :class:`stem.ProtocolError` when we should raise a :class:`stem.OperationFailed`. :param str,list params: GETINFO option or options to be queried :param object default: response if the query fails :param bool get_bytes: provides **bytes** values rather than a **str** under python 3.x :returns: Response depends upon how we were called as follows... * **str** with the response if our param was a **str** * **dict** with the 'param => response' mapping if our param was a **list** * default if one was provided and our call failed :raises: * :class:`stem.ControllerError` if the call fails and we weren't provided a default response * :class:`stem.InvalidArguments` if the 'params' requested was invalid * :class:`stem.ProtocolError` if the geoip database is unavailable """ start_time = time.time() reply = {} if stem.util._is_str(params): is_multiple = False params = set([params]) else: if not params: return {} is_multiple = True params = set(params) for param in params: if param.startswith('ip-to-country/') and param != 'ip-to-country/0.0.0.0' and self.is_geoip_unavailable(): raise stem.ProtocolError('Tor geoip database is unavailable') elif param == 'address' and self._last_address_exc: raise self._last_address_exc # we already know we can't resolve an address elif param == 'fingerprint' and self._last_fingerprint_exc and self.get_conf('ORPort', None) is None: raise self._last_fingerprint_exc # we already know we're not a relay # check for cached results from_cache = [param.lower() for param in params] cached_results = self._get_cache_map(from_cache, 'getinfo') for key in cached_results: user_expected_key = _case_insensitive_lookup(params, key) reply[user_expected_key] = cached_results[key] params.remove(user_expected_key) # if everything was cached then short circuit making the query if not params: if LOG_CACHE_FETCHES: log.trace('GETINFO %s (cache fetch)' % ' '.join(reply.keys())) if is_multiple: return reply else: return list(reply.values())[0] try: response = self.msg('GETINFO %s' % ' '.join(params)) stem.response.convert('GETINFO', response) response._assert_matches(params) # usually we want unicode values under python 3.x if stem.prereq.is_python_3() and not get_bytes: response.entries = dict((k, stem.util.str_tools._to_unicode(v)) for (k, v) in response.entries.items()) reply.update(response.entries) if self.is_caching_enabled(): to_cache = {} for key, value in response.entries.items(): key = key.lower() # make case insensitive if key in CACHEABLE_GETINFO_PARAMS or key in CACHEABLE_GETINFO_PARAMS_UNTIL_SETCONF: to_cache[key] = value elif key.startswith('ip-to-country/'): to_cache[key] = value self._set_cache(to_cache, 'getinfo') if 'address' in params: self._last_address_exc = None if 'fingerprint' in params: self._last_fingerprint_exc = None log.debug('GETINFO %s (runtime: %0.4f)' % (' '.join(params), time.time() - start_time)) if is_multiple: return reply else: return list(reply.values())[0] except stem.ControllerError as exc: if 'address' in params: self._last_address_exc = exc if 'fingerprint' in params: self._last_fingerprint_exc = exc log.debug('GETINFO %s (failed: %s)' % (' '.join(params), exc)) raise @with_default() def get_version(self, default = UNDEFINED): """ get_version(default = UNDEFINED) A convenience method to get tor version that current controller is connected to. :param object default: response if the query fails :returns: :class:`~stem.version.Version` of the tor instance that we're connected to :raises: * :class:`stem.ControllerError` if unable to query the version * **ValueError** if unable to parse the version An exception is only raised if we weren't provided a default response. """ version = self._get_cache('version') if not version: version_str = self.get_info('version') version = stem.version.Version(version_str[4:] if version_str.startswith('Tor ') else version_str) self._set_cache({'version': version}) return version @with_default() def get_exit_policy(self, default = UNDEFINED): """ get_exit_policy(default = UNDEFINED) Effective ExitPolicy for our relay. .. versionchanged:: 1.7.0 Policies retrieved through 'GETINFO exit-policy/full' rather than parsing the user's torrc entries. This should be more reliable for some edge cases. (:trac:`25739`) :param object default: response if the query fails :returns: :class:`~stem.exit_policy.ExitPolicy` of the tor instance that we're connected to :raises: * :class:`stem.ControllerError` if unable to query the policy * **ValueError** if unable to parse the policy An exception is only raised if we weren't provided a default response. """ policy = self._get_cache('exit_policy') if not policy: try: policy = stem.exit_policy.ExitPolicy(*self.get_info('exit-policy/full').splitlines()) self._set_cache({'exit_policy': policy}) except stem.OperationFailed: # There's a few situations where 'GETINFO exit-policy/full' will fail, # most commonly... # # * Error 551: Descriptor still rebuilding - not ready yet # # Tor hasn't yet finished making our server descriptor. This often # arises when tor has first started. # # * Error 552: Not running in server mode # # We're not configured to be a relay (no ORPort), or haven't yet # been able to determine our externally facing IP address. # # When these arise best we can do is infer our policy from the torrc. # Skipping caching so we'll retry GETINFO policy resolution next time # we're called. rules = [] if self.get_conf('ExitRelay') == '0': rules.append('reject *:*') if self.get_conf('ExitPolicyRejectPrivate') == '1': rules.append('reject private:*') for policy_line in self.get_conf('ExitPolicy', multiple = True): rules += policy_line.split(',') rules += self.get_info('exit-policy/default').split(',') policy = stem.exit_policy.get_config_policy(rules, self.get_info('address', None)) return policy @with_default() def get_ports(self, listener_type, default = UNDEFINED): """ get_ports(listener_type, default = UNDEFINED) Provides the local ports where tor is listening for the given type of connections. This is similar to :func:`~stem.control.Controller.get_listeners`, but doesn't provide addresses nor include non-local endpoints. .. versionadded:: 1.2.0 :param stem.control.Listener listener_type: connection type being handled by the ports we return :param object default: response if the query fails :returns: **list** of **ints** for the local ports where tor handles connections of the given type :raises: :class:`stem.ControllerError` if unable to determine the ports and no default was provided """ def is_localhost(address): if stem.util.connection.is_valid_ipv4_address(address): return address == '0.0.0.0' or address.startswith('127.') elif stem.util.connection.is_valid_ipv6_address(address): return stem.util.connection.expand_ipv6_address(address) in ( '0000:0000:0000:0000:0000:0000:0000:0000', '0000:0000:0000:0000:0000:0000:0000:0001', ) else: log.info("Request for %s ports got an address that's neither IPv4 or IPv6: %s" % (listener_type, address)) return False return [port for (addr, port) in self.get_listeners(listener_type) if is_localhost(addr)] @with_default() def get_listeners(self, listener_type, default = UNDEFINED): """ get_listeners(listener_type, default = UNDEFINED) Provides the addresses and ports where tor is listening for connections of the given type. This is similar to :func:`~stem.control.Controller.get_ports` but includes listener addresses and non-local endpoints. .. versionadded:: 1.2.0 .. versionchanged:: 1.5.0 Recognize listeners with IPv6 addresses. :param stem.control.Listener listener_type: connection type being handled by the listeners we return :param object default: response if the query fails :returns: **list** of **(address, port)** tuples for the available listeners :raises: :class:`stem.ControllerError` if unable to determine the listeners and no default was provided """ listeners = self._get_cache(listener_type, 'listeners') if listeners is None: proxy_addrs = [] query = 'net/listeners/%s' % listener_type.lower() try: for listener in self.get_info(query).split(): if not (listener.startswith('"') and listener.endswith('"')): raise stem.ProtocolError("'GETINFO %s' responses are expected to be quoted: %s" % (query, listener)) elif ':' not in listener: raise stem.ProtocolError("'GETINFO %s' had a listener without a colon: %s" % (query, listener)) listener = listener[1:-1] # strip quotes addr, port = listener.rsplit(':', 1) # Skip unix sockets, for instance... # # GETINFO net/listeners/control # 250-net/listeners/control="unix:/tmp/tor/socket" # 250 OK if addr == 'unix': continue if addr.startswith('[') and addr.endswith(']'): addr = addr[1:-1] # unbracket ipv6 address proxy_addrs.append((addr, port)) except stem.InvalidArguments: # Tor version is old (pre-tor-0.2.2.26-beta), use get_conf() instead. # Some options (like the ORPort) can have optional attributes after the # actual port number. port_option = { Listener.OR: 'ORPort', Listener.DIR: 'DirPort', Listener.SOCKS: 'SocksPort', Listener.TRANS: 'TransPort', Listener.NATD: 'NatdPort', Listener.DNS: 'DNSPort', Listener.CONTROL: 'ControlPort', }[listener_type] listener_option = { Listener.OR: 'ORListenAddress', Listener.DIR: 'DirListenAddress', Listener.SOCKS: 'SocksListenAddress', Listener.TRANS: 'TransListenAddress', Listener.NATD: 'NatdListenAddress', Listener.DNS: 'DNSListenAddress', Listener.CONTROL: 'ControlListenAddress', }[listener_type] port_value = self.get_conf(port_option).split()[0] for listener in self.get_conf(listener_option, multiple = True): if ':' in listener: addr, port = listener.rsplit(':', 1) if addr.startswith('[') and addr.endswith(']'): addr = addr[1:-1] # unbracket ipv6 address proxy_addrs.append((addr, port)) else: proxy_addrs.append((listener, port_value)) # validate that address/ports are valid, and convert ports to ints for addr, port in proxy_addrs: if not stem.util.connection.is_valid_ipv4_address(addr) and not stem.util.connection.is_valid_ipv6_address(addr): raise stem.ProtocolError('Invalid address for a %s listener: %s' % (listener_type, addr)) elif not stem.util.connection.is_valid_port(port): raise stem.ProtocolError('Invalid port for a %s listener: %s' % (listener_type, port)) listeners = [(addr, int(port)) for (addr, port) in proxy_addrs] self._set_cache({listener_type: listeners}, 'listeners') return listeners @with_default() def get_accounting_stats(self, default = UNDEFINED): """ get_accounting_stats(default = UNDEFINED) Provides stats related to our relaying limitations if AccountingMax was set in our torrc. .. versionadded:: 1.3.0 :param object default: response if the query fails :returns: :class:`~stem.control.AccountingStats` with our accounting stats :raises: :class:`stem.ControllerError` if unable to determine the listeners and no default was provided """ if self.get_info('accounting/enabled') != '1': raise stem.ControllerError("Accounting isn't enabled") retrieved = time.time() status = self.get_info('accounting/hibernating') interval_end = self.get_info('accounting/interval-end') used = self.get_info('accounting/bytes') left = self.get_info('accounting/bytes-left') interval_end = stem.util.str_tools._parse_timestamp(interval_end) used_read, used_written = [int(val) for val in used.split(' ', 1)] left_read, left_written = [int(val) for val in left.split(' ', 1)] return AccountingStats( retrieved = retrieved, status = status, interval_end = interval_end, time_until_reset = calendar.timegm(interval_end.timetuple()) - int(retrieved), read_bytes = used_read, read_bytes_left = left_read, read_limit = used_read + left_read, written_bytes = used_written, write_bytes_left = left_written, write_limit = used_written + left_written, ) def get_socks_listeners(self, default = UNDEFINED): """ Provides the SOCKS **(address, port)** tuples that tor has open. .. deprecated:: 1.2.0 Use :func:`~stem.control.Controller.get_listeners` with **Listener.SOCKS** instead. :param object default: response if the query fails :returns: list of **(address, port)** tuples for the available SOCKS listeners :raises: :class:`stem.ControllerError` if unable to determine the listeners and no default was provided """ return self.get_listeners(Listener.SOCKS, default) @with_default() def get_protocolinfo(self, default = UNDEFINED): """ get_protocolinfo(default = UNDEFINED) A convenience method to get the protocol info of the controller. :param object default: response if the query fails :returns: :class:`~stem.response.protocolinfo.ProtocolInfoResponse` provided by tor :raises: * :class:`stem.ProtocolError` if the PROTOCOLINFO response is malformed * :class:`stem.SocketError` if problems arise in establishing or using the socket An exception is only raised if we weren't provided a default response. """ import stem.connection return stem.connection.get_protocolinfo(self) @with_default() def get_user(self, default = UNDEFINED): """ get_user(default = UNDEFINED) Provides the user tor is running as. This often only works if tor is running locally. Also, most of its checks are platform dependent, and hence are not entirely reliable. .. versionadded:: 1.1.0 :param object default: response if the query fails :returns: str with the username tor is running as """ user = self._get_cache('user') if not user: user = self.get_info('process/user', None) if not user and self.is_localhost(): pid = self.get_pid(None) if pid: user = stem.util.system.user(pid) if user: self._set_cache({'user': user}) return user else: raise ValueError("Unable to resolve tor's user" if self.is_localhost() else "Tor isn't running locally") @with_default() def get_pid(self, default = UNDEFINED): """ get_pid(default = UNDEFINED) Provides the process id of tor. This often only works if tor is running locally. Also, most of its checks are platform dependent, and hence are not entirely reliable. .. versionadded:: 1.1.0 :param object default: response if the query fails :returns: **int** for tor's pid :raises: **ValueError** if unable to determine the pid and no default was provided """ pid = self._get_cache('pid') if not pid: getinfo_pid = self.get_info('process/pid', None) if getinfo_pid and getinfo_pid.isdigit(): pid = int(getinfo_pid) if not pid and self.is_localhost(): pid_file_path = self.get_conf('PidFile', None) if pid_file_path is not None: with open(pid_file_path) as pid_file: pid_file_contents = pid_file.read().strip() if pid_file_contents.isdigit(): pid = int(pid_file_contents) if not pid: pid = stem.util.system.pid_by_name('tor') if not pid: control_socket = self.get_socket() if isinstance(control_socket, stem.socket.ControlPort): pid = stem.util.system.pid_by_port(control_socket.port) elif isinstance(control_socket, stem.socket.ControlSocketFile): pid = stem.util.system.pid_by_open_file(control_socket.path) if pid: self._set_cache({'pid': pid}) return pid else: raise ValueError("Unable to resolve tor's pid" if self.is_localhost() else "Tor isn't running locally") def is_user_traffic_allowed(self): """ Checks if we're likely to service direct user traffic. This essentially boils down to... * If we're a bridge or guard relay, inbound connections are possibly from users. * If our exit policy allows traffic then output connections are possibly from users. Note the word 'likely'. These is a decent guess in practice, but not always correct. For instance, information about which flags we have are only fetched periodically. This method is intended to help you avoid eavesdropping on user traffic. Monitoring user connections is not only unethical, but likely a violation of wiretapping laws. .. versionadded:: 1.5.0 :returns: :class:`~stem.cotroller.UserTrafficAllowed` with **inbound** and **outbound** boolean attributes to indicate if we're likely servicing direct user traffic """ inbound_allowed, outbound_allowed = False, False if self.get_conf('BridgeRelay', None) == '1': inbound_allowed = True if self.get_conf('ORPort', None): if not inbound_allowed: consensus_entry = self.get_network_status(default = None) inbound_allowed = consensus_entry and 'Guard' in consensus_entry.flags exit_policy = self.get_exit_policy(None) outbound_allowed = exit_policy and exit_policy.is_exiting_allowed() return UserTrafficAllowed(inbound_allowed, outbound_allowed) @with_default() def get_microdescriptor(self, relay = None, default = UNDEFINED): """ get_microdescriptor(relay = None, default = UNDEFINED) Provides the microdescriptor for the relay with the given fingerprint or nickname. If the relay identifier could be either a fingerprint *or* nickname then it's queried as a fingerprint. If no **relay** is provided then this defaults to ourselves. Remember that this requires that we've retrieved our own descriptor from remote authorities so this both won't be available for newly started relays and may be up to around an hour out of date. .. versionchanged:: 1.3.0 Changed so we'd fetch our own descriptor if no 'relay' is provided. :param str relay: fingerprint or nickname of the relay to be queried :param object default: response if the query fails :returns: :class:`~stem.descriptor.microdescriptor.Microdescriptor` for the given relay :raises: * :class:`stem.DescriptorUnavailable` if unable to provide a descriptor for the given relay * :class:`stem.ControllerError` if unable to query the descriptor * **ValueError** if **relay** doesn't conform with the pattern for being a fingerprint or nickname An exception is only raised if we weren't provided a default response. """ if relay is None: try: relay = self.get_info('fingerprint') except stem.ControllerError as exc: raise stem.ControllerError('Unable to determine our own fingerprint: %s' % exc) if stem.util.tor_tools.is_valid_fingerprint(relay): query = 'md/id/%s' % relay elif stem.util.tor_tools.is_valid_nickname(relay): query = 'md/name/%s' % relay else: raise ValueError("'%s' isn't a valid fingerprint or nickname" % relay) try: desc_content = self.get_info(query, get_bytes = True) except stem.InvalidArguments as exc: if str(exc).startswith('GETINFO request contained unrecognized keywords:'): raise stem.DescriptorUnavailable("Tor was unable to provide the descriptor for '%s'" % relay) else: raise if not desc_content: raise stem.DescriptorUnavailable('Descriptor information is unavailable, tor might still be downloading it') return stem.descriptor.microdescriptor.Microdescriptor(desc_content) @with_default(yields = True) def get_microdescriptors(self, default = UNDEFINED): """ get_microdescriptors(default = UNDEFINED) Provides an iterator for all of the microdescriptors that tor currently knows about. Prior to Tor 0.3.5.1 this information was not available via the control protocol. When connected to prior versions we read the microdescriptors directly from disk instead, which will not work remotely or if our process lacks read permissions. :param list default: items to provide if the query fails :returns: iterates over :class:`~stem.descriptor.microdescriptor.Microdescriptor` for relays in the tor network :raises: :class:`stem.ControllerError` if unable to query tor and no default was provided """ if self.get_version() >= stem.version.Requirement.GETINFO_MICRODESCRIPTORS: desc_content = self.get_info('md/all', get_bytes = True) if not desc_content: raise stem.DescriptorUnavailable('Descriptor information is unavailable, tor might still be downloading it') for desc in stem.descriptor.microdescriptor._parse_file(io.BytesIO(desc_content)): yield desc else: # TODO: remove when tor versions that require this are obsolete try: data_directory = self.get_conf('DataDirectory') except stem.ControllerError as exc: raise stem.OperationFailed(message = 'Unable to determine the data directory (%s)' % exc) cached_descriptor_path = os.path.join(data_directory, 'cached-microdescs') if not os.path.exists(data_directory): raise stem.OperationFailed(message = "Data directory reported by tor doesn't exist (%s)" % data_directory) elif not os.path.exists(cached_descriptor_path): raise stem.OperationFailed(message = "Data directory doesn't contain cached microdescriptors (%s)" % cached_descriptor_path) with stem.descriptor.reader.DescriptorReader([cached_descriptor_path]) as reader: for desc in reader: # It shouldn't be possible for these to be something other than # microdescriptors but as the saying goes: trust but verify. if not isinstance(desc, stem.descriptor.microdescriptor.Microdescriptor): raise stem.OperationFailed(message = 'BUG: Descriptor reader provided non-microdescriptor content (%s)' % type(desc)) yield desc @with_default() def get_server_descriptor(self, relay = None, default = UNDEFINED): """ get_server_descriptor(relay = None, default = UNDEFINED) Provides the server descriptor for the relay with the given fingerprint or nickname. If the relay identifier could be either a fingerprint *or* nickname then it's queried as a fingerprint. If no **relay** is provided then this defaults to ourselves. Remember that this requires that we've retrieved our own descriptor from remote authorities so this both won't be available for newly started relays and may be up to around an hour out of date. **As of Tor version 0.2.3.25 relays no longer get server descriptors by default.** It's advised that you use microdescriptors instead, but if you really need server descriptors then you can get them by setting 'UseMicrodescriptors 0'. .. versionchanged:: 1.3.0 Changed so we'd fetch our own descriptor if no 'relay' is provided. :param str relay: fingerprint or nickname of the relay to be queried :param object default: response if the query fails :returns: :class:`~stem.descriptor.server_descriptor.RelayDescriptor` for the given relay :raises: * :class:`stem.DescriptorUnavailable` if unable to provide a descriptor for the given relay * :class:`stem.ControllerError` if unable to query the descriptor * **ValueError** if **relay** doesn't conform with the pattern for being a fingerprint or nickname An exception is only raised if we weren't provided a default response. """ try: if relay is None: try: relay = self.get_info('fingerprint') except stem.ControllerError as exc: raise stem.ControllerError('Unable to determine our own fingerprint: %s' % exc) if stem.util.tor_tools.is_valid_fingerprint(relay): query = 'desc/id/%s' % relay elif stem.util.tor_tools.is_valid_nickname(relay): query = 'desc/name/%s' % relay else: raise ValueError("'%s' isn't a valid fingerprint or nickname" % relay) try: desc_content = self.get_info(query, get_bytes = True) except stem.InvalidArguments as exc: if str(exc).startswith('GETINFO request contained unrecognized keywords:'): raise stem.DescriptorUnavailable("Tor was unable to provide the descriptor for '%s'" % relay) else: raise if not desc_content: raise stem.DescriptorUnavailable('Descriptor information is unavailable, tor might still be downloading it') return stem.descriptor.server_descriptor.RelayDescriptor(desc_content) except: if not self._is_server_descriptors_available(): raise ValueError(SERVER_DESCRIPTORS_UNSUPPORTED) raise @with_default(yields = True) def get_server_descriptors(self, default = UNDEFINED): """ get_server_descriptors(default = UNDEFINED) Provides an iterator for all of the server descriptors that tor currently knows about. **As of Tor version 0.2.3.25 relays no longer get server descriptors by default.** It's advised that you use microdescriptors instead, but if you really need server descriptors then you can get them by setting 'UseMicrodescriptors 0'. :param list default: items to provide if the query fails :returns: iterates over :class:`~stem.descriptor.server_descriptor.RelayDescriptor` for relays in the tor network :raises: :class:`stem.ControllerError` if unable to query tor and no default was provided """ # TODO: We should iterate over the descriptors as they're read from the # socket rather than reading the whole thing into memory. # # https://trac.torproject.org/8248 desc_content = self.get_info('desc/all-recent', get_bytes = True) if not desc_content: if not self._is_server_descriptors_available(): raise stem.ControllerError(SERVER_DESCRIPTORS_UNSUPPORTED) else: raise stem.DescriptorUnavailable('Descriptor information is unavailable, tor might still be downloading it') for desc in stem.descriptor.server_descriptor._parse_file(io.BytesIO(desc_content)): yield desc def _is_server_descriptors_available(self): """ Checks to see if tor server descriptors should be available or not. """ # TODO: Replace with a 'GETINFO desc/download-enabled' request when they're # widely available... # # https://gitweb.torproject.org/torspec.git/commit/?id=378699c return self.get_version() < stem.version.Requirement.MICRODESCRIPTOR_IS_DEFAULT or \ self.get_conf('UseMicrodescriptors', None) == '0' @with_default() def get_network_status(self, relay = None, default = UNDEFINED): """ get_network_status(relay = None, default = UNDEFINED) Provides the router status entry for the relay with the given fingerprint or nickname. If the relay identifier could be either a fingerprint *or* nickname then it's queried as a fingerprint. If no **relay** is provided then this defaults to ourselves. Remember that this requires that we've retrieved our own descriptor from remote authorities so this both won't be available for newly started relays and may be up to around an hour out of date. .. versionchanged:: 1.3.0 Changed so we'd fetch our own descriptor if no 'relay' is provided. :param str relay: fingerprint or nickname of the relay to be queried :param object default: response if the query fails :returns: :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3` for the given relay :raises: * :class:`stem.DescriptorUnavailable` if unable to provide a descriptor for the given relay * :class:`stem.ControllerError` if unable to query the descriptor * **ValueError** if **relay** doesn't conform with the pattern for being a fingerprint or nickname An exception is only raised if we weren't provided a default response. """ if relay is None: try: relay = self.get_info('fingerprint') except stem.ControllerError as exc: raise stem.ControllerError('Unable to determine our own fingerprint: %s' % exc) if stem.util.tor_tools.is_valid_fingerprint(relay): query = 'ns/id/%s' % relay elif stem.util.tor_tools.is_valid_nickname(relay): query = 'ns/name/%s' % relay else: raise ValueError("'%s' isn't a valid fingerprint or nickname" % relay) try: desc_content = self.get_info(query, get_bytes = True) except stem.InvalidArguments as exc: if str(exc).startswith('GETINFO request contained unrecognized keywords:'): raise stem.DescriptorUnavailable("Tor was unable to provide the descriptor for '%s'" % relay) else: raise if not desc_content: raise stem.DescriptorUnavailable('Descriptor information is unavailable, tor might still be downloading it') return stem.descriptor.router_status_entry.RouterStatusEntryV3(desc_content) @with_default(yields = True) def get_network_statuses(self, default = UNDEFINED): """ get_network_statuses(default = UNDEFINED) Provides an iterator for all of the router status entries that tor currently knows about. :param list default: items to provide if the query fails :returns: iterates over :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3` for relays in the tor network :raises: :class:`stem.ControllerError` if unable to query tor and no default was provided """ # TODO: We should iterate over the descriptors as they're read from the # socket rather than reading the whole thing into memory. # # https://trac.torproject.org/8248 desc_content = self.get_info('ns/all', get_bytes = True) if not desc_content: raise stem.DescriptorUnavailable('Descriptor information is unavailable, tor might still be downloading it') desc_iterator = stem.descriptor.router_status_entry._parse_file( io.BytesIO(desc_content), False, entry_class = stem.descriptor.router_status_entry.RouterStatusEntryV3, ) for desc in desc_iterator: yield desc @with_default() def get_hidden_service_descriptor(self, address, default = UNDEFINED, servers = None, await_result = True, timeout = None): """ get_hidden_service_descriptor(address, default = UNDEFINED, servers = None, await_result = True) Provides the descriptor for a hidden service. The **address** is the '.onion' address of the hidden service (for instance 3g2upl4pq6kufc4m.onion for DuckDuckGo). If **await_result** is **True** then this blocks until we either receive the descriptor or the request fails. If **False** this returns right away. **This method only supports v2 hidden services, not v3.** (:trac:`25417`) .. versionadded:: 1.4.0 .. versionchanged:: 1.7.0 Added the timeout argument. :param str address: address of the hidden service descriptor, the '.onion' suffix is optional :param object default: response if the query fails :param list servers: requrest the descriptor from these specific servers :param float timeout: seconds to wait when **await_result** is **True** :returns: :class:`~stem.descriptor.hidden_service_descriptor.HiddenServiceDescriptor` for the given service if **await_result** is **True**, or **None** otherwise :raises: * :class:`stem.DescriptorUnavailable` if **await_result** is **True** and unable to provide a descriptor for the given service * :class:`stem.Timeout` if **timeout** was reached * :class:`stem.ControllerError` if unable to query the descriptor * **ValueError** if **address** doesn't conform with the pattern of a hidden service address An exception is only raised if we weren't provided a default response. """ if address.endswith('.onion'): address = address[:-6] if not stem.util.tor_tools.is_valid_hidden_service_address(address): raise ValueError("'%s.onion' isn't a valid hidden service address" % address) if self.get_version() < stem.version.Requirement.HSFETCH: raise stem.UnsatisfiableRequest(message = 'HSFETCH was added in tor version %s' % stem.version.Requirement.HSFETCH) hs_desc_queue, hs_desc_listener = queue.Queue(), None hs_desc_content_queue, hs_desc_content_listener = queue.Queue(), None start_time = time.time() if await_result: def hs_desc_listener(event): hs_desc_queue.put(event) def hs_desc_content_listener(event): hs_desc_content_queue.put(event) self.add_event_listener(hs_desc_listener, EventType.HS_DESC) self.add_event_listener(hs_desc_content_listener, EventType.HS_DESC_CONTENT) try: request = 'HSFETCH %s' % address if servers: request += ' ' + ' '.join(['SERVER=%s' % s for s in servers]) response = self.msg(request) stem.response.convert('SINGLELINE', response) if not response.is_ok(): raise stem.ProtocolError('HSFETCH returned unexpected response code: %s' % response.code) if not await_result: return None # not waiting, so nothing to provide back else: while True: event = _get_with_timeout(hs_desc_content_queue, timeout, start_time) if event.address == address: if event.descriptor: return event.descriptor else: # no descriptor, looking through HS_DESC to figure out why while True: event = _get_with_timeout(hs_desc_queue, timeout, start_time) if event.address == address and event.action == stem.HSDescAction.FAILED: if event.reason == stem.HSDescReason.NOT_FOUND: raise stem.DescriptorUnavailable('No running hidden service at %s.onion' % address) else: raise stem.DescriptorUnavailable('Unable to retrieve the descriptor for %s.onion (retrieved from %s): %s' % (address, event.directory_fingerprint, event.reason)) finally: if hs_desc_listener: self.remove_event_listener(hs_desc_listener) if hs_desc_content_listener: self.remove_event_listener(hs_desc_content_listener) def get_conf(self, param, default = UNDEFINED, multiple = False): """ get_conf(param, default = UNDEFINED, multiple = False) Queries the current value for a configuration option. Some configuration options (like the ExitPolicy) can have multiple values. This provides a **list** with all of the values if **multiple** is **True**. Otherwise this will be a **str** with the first value. If provided with a **default** then that is provided if the configuration option was unset or the query fails (invalid configuration option, error response, control port closed, initiated, etc). If the configuration value is unset and no **default** was given then this provides **None** if **multiple** was **False** and an empty list if it was **True**. :param str param: configuration option to be queried :param object default: response if the option is unset or the query fails :param bool multiple: if **True** then provides a list with all of the present values (this is an empty list if the config option is unset) :returns: Response depends upon how we were called as follows... * **str** with the configuration value if **multiple** was **False**, **None** if it was unset * **list** with the response strings if multiple was **True** * default if one was provided and the configuration option was either unset or our call failed :raises: * :class:`stem.ControllerError` if the call fails and we weren't provided a default response * :class:`stem.InvalidArguments` if the configuration option requested was invalid """ # Config options are case insensitive and don't contain whitespace. Using # strip so the following check will catch whitespace-only params. param = param.lower().strip() if not param: return default if default != UNDEFINED else None entries = self.get_conf_map(param, default, multiple) return _case_insensitive_lookup(entries, param, default) def get_conf_map(self, params, default = UNDEFINED, multiple = True): """ get_conf_map(params, default = UNDEFINED, multiple = True) Similar to :func:`~stem.control.Controller.get_conf` but queries multiple configuration options, providing back a mapping of those options to their values. There are three use cases for GETCONF: 1. a single value is provided (e.g. **ControlPort**) 2. multiple values are provided for the option (e.g. **ExitPolicy**) 3. a set of options that weren't necessarily requested are returned (for instance querying **HiddenServiceOptions** gives **HiddenServiceDir**, **HiddenServicePort**, etc) The vast majority of the options fall into the first two categories, in which case calling :func:`~stem.control.Controller.get_conf` is sufficient. However, for batch queries or the special options that give a set of values this provides back the full response. As of tor version 0.2.1.25 **HiddenServiceOptions** was the only option that falls into the third category. **Note:** HiddenServiceOptions are best retrieved via the :func:`~stem.control.Controller.get_hidden_service_conf` method instead. :param str,list params: configuration option(s) to be queried :param object default: value for the mappings if the configuration option is either undefined or the query fails :param bool multiple: if **True** then the values provided are lists with all of the present values :returns: **dict** of the 'config key => value' mappings. The value is a... * **str** if **multiple** is **False**, **None** if the configuration option is unset * **list** if **multiple** is **True** * the **default** if it was set and the value was either undefined or our lookup failed :raises: * :class:`stem.ControllerError` if the call fails and we weren't provided a default response * :class:`stem.InvalidArguments` if the configuration option requested was invalid """ start_time = time.time() reply = {} if stem.util._is_str(params): params = [params] # remove strings which contain only whitespace params = [entry for entry in params if entry.strip()] if params == []: return {} # translate context sensitive options lookup_params = set([MAPPED_CONFIG_KEYS.get(entry, entry) for entry in params]) # check for cached results from_cache = [param.lower() for param in lookup_params] cached_results = self._get_cache_map(from_cache, 'getconf') for key in cached_results: user_expected_key = _case_insensitive_lookup(lookup_params, key) reply[user_expected_key] = cached_results[key] lookup_params.remove(user_expected_key) # if everything was cached then short circuit making the query if not lookup_params: if LOG_CACHE_FETCHES: log.trace('GETCONF %s (cache fetch)' % ' '.join(reply.keys())) return self._get_conf_dict_to_response(reply, default, multiple) try: response = self.msg('GETCONF %s' % ' '.join(lookup_params)) stem.response.convert('GETCONF', response) reply.update(response.entries) if self.is_caching_enabled(): to_cache = dict((k.lower(), v) for k, v in response.entries.items()) self._set_cache(to_cache, 'getconf') # Maps the entries back to the parameters that the user requested so the # capitalization matches (ie, if they request "exitpolicy" then that # should be the key rather than "ExitPolicy"). When the same # configuration key is provided multiple times this determines the case # based on the first and ignores the rest. # # This retains the tor provided camel casing of MAPPED_CONFIG_KEYS # entries since the user didn't request those by their key, so we can't # be sure what they wanted. for key in reply: if not key.lower() in MAPPED_CONFIG_KEYS.values(): user_expected_key = _case_insensitive_lookup(params, key, key) if key != user_expected_key: reply[user_expected_key] = reply[key] del reply[key] log.debug('GETCONF %s (runtime: %0.4f)' % (' '.join(lookup_params), time.time() - start_time)) return self._get_conf_dict_to_response(reply, default, multiple) except stem.ControllerError as exc: log.debug('GETCONF %s (failed: %s)' % (' '.join(lookup_params), exc)) if default != UNDEFINED: return dict((param, default) for param in params) else: raise def _get_conf_dict_to_response(self, config_dict, default, multiple): """ Translates a dictionary of 'config key => [value1, value2...]' into the return value of :func:`~stem.control.Controller.get_conf_map`, taking into account what the caller requested. """ return_dict = {} for key, values in list(config_dict.items()): if values == []: # config option was unset if default != UNDEFINED: return_dict[key] = default else: return_dict[key] = [] if multiple else None else: return_dict[key] = values if multiple else values[0] return return_dict @with_default() def is_set(self, param, default = UNDEFINED): """ is_set(param, default = UNDEFINED) Checks if a configuration option differs from its default or not. .. versionadded:: 1.5.0 :param str param: configuration option to check :param object default: response if the query fails :returns: **True** if option differs from its default and **False** otherwise :raises: :class:`stem.ControllerError` if the call fails and we weren't provided a default response """ return param in self._get_custom_options() def _get_custom_options(self): result = self._get_cache('get_custom_options') if not result: config_lines = self.get_info('config-text').splitlines() # Tor provides some config options even if they haven't been set... # # https://trac.torproject.org/projects/tor/ticket/2362 # https://trac.torproject.org/projects/tor/ticket/17909 default_lines = ( 'Log notice stdout', 'Log notice file /var/log/tor/log', 'DataDirectory /home/%s/.tor' % self.get_user('undefined'), 'HiddenServiceStatistics 0', ) for line in default_lines: if line in config_lines: config_lines.remove(line) result = dict([line.split(' ', 1) for line in config_lines]) self._set_cache({'get_custom_options': result}) return result def set_conf(self, param, value): """ Changes the value of a tor configuration option. Our value can be any of the following... * a string to set a single value * a list of strings to set a series of values (for instance the ExitPolicy) * None to either set the value to 0/NULL :param str param: configuration option to be set :param str,list value: value to set the parameter to :raises: * :class:`stem.ControllerError` if the call fails * :class:`stem.InvalidArguments` if configuration options requested was invalid * :class:`stem.InvalidRequest` if the configuration setting is impossible or if there's a syntax error in the configuration values """ self.set_options({param: value}, False) def reset_conf(self, *params): """ Reverts one or more parameters to their default values. :param str params: configuration option to be reset :raises: * :class:`stem.ControllerError` if the call fails * :class:`stem.InvalidArguments` if configuration options requested was invalid * :class:`stem.InvalidRequest` if the configuration setting is impossible or if there's a syntax error in the configuration values """ self.set_options(dict([(entry, None) for entry in params]), True) def set_options(self, params, reset = False): """ Changes multiple tor configuration options via either a SETCONF or RESETCONF query. Both behave identically unless our value is None, in which case SETCONF sets the value to 0 or NULL, and RESETCONF returns it to its default value. This accepts str, list, or None values in a similar fashion to :func:`~stem.control.Controller.set_conf`. For example... :: my_controller.set_options({ 'Nickname': 'caerSidi', 'ExitPolicy': ['accept *:80', 'accept *:443', 'reject *:*'], 'ContactInfo': 'caerSidi-exit@someplace.com', 'Log': None, }) The params can optionally be a list of key/value tuples, though the only reason this type of argument would be useful is for hidden service configuration (those options are order dependent). :param dict,list params: mapping of configuration options to the values we're setting it to :param bool reset: issues a RESETCONF, returning **None** values to their defaults if **True** :raises: * :class:`stem.ControllerError` if the call fails * :class:`stem.InvalidArguments` if configuration options requested was invalid * :class:`stem.InvalidRequest` if the configuration setting is impossible or if there's a syntax error in the configuration values """ start_time = time.time() # constructs the SETCONF or RESETCONF query query_comp = ['RESETCONF' if reset else 'SETCONF'] if isinstance(params, dict): params = list(params.items()) for param, value in params: if isinstance(value, str): query_comp.append('%s="%s"' % (param, value.strip())) elif isinstance(value, collections.Iterable): query_comp.extend(['%s="%s"' % (param, val.strip()) for val in value]) elif not value: query_comp.append(param) else: raise ValueError('Cannot set %s to %s since the value was a %s but we only accept strings' % (param, value, type(value).__name__)) query = ' '.join(query_comp) response = self.msg(query) stem.response.convert('SINGLELINE', response) if response.is_ok(): log.debug('%s (runtime: %0.4f)' % (query, time.time() - start_time)) if self.is_caching_enabled(): # clear cache for params; the CONF_CHANGED event will set cache for changes to_cache = dict((k.lower(), None) for k, v in params) self._set_cache(to_cache, 'getconf') self._confchanged_cache_invalidation(dict(params)) else: log.debug('%s (failed, code: %s, message: %s)' % (query, response.code, response.message)) immutable_params = [k for k, v in params if stem.util.str_tools._to_unicode(k).lower() in IMMUTABLE_CONFIG_OPTIONS] if immutable_params: raise stem.InvalidArguments(message = "%s cannot be changed while tor's running" % ', '.join(sorted(immutable_params)), arguments = immutable_params) if response.code == '552': if response.message.startswith("Unrecognized option: Unknown option '"): key = response.message[37:response.message.find("'", 37)] raise stem.InvalidArguments(response.code, response.message, [key]) raise stem.InvalidRequest(response.code, response.message) elif response.code in ('513', '553'): raise stem.InvalidRequest(response.code, response.message) else: raise stem.ProtocolError('Returned unexpected status code: %s' % response.code) @with_default() def get_hidden_service_conf(self, default = UNDEFINED): """ get_hidden_service_conf(default = UNDEFINED) This provides a mapping of hidden service directories to their attribute's key/value pairs. All hidden services are assured to have a 'HiddenServicePort', but other entries may or may not exist. :: { "/var/lib/tor/hidden_service_empty/": { "HiddenServicePort": [ ] }, "/var/lib/tor/hidden_service_with_two_ports/": { "HiddenServiceAuthorizeClient": "stealth a, b", "HiddenServicePort": [ (8020, "127.0.0.1", 8020), # the ports order is kept (8021, "127.0.0.1", 8021) ], "HiddenServiceVersion": "2" }, } .. versionadded:: 1.3.0 :param object default: response if the query fails :returns: **dict** with the hidden service configuration :raises: :class:`stem.ControllerError` if the call fails and we weren't provided a default response """ service_dir_map = self._get_cache('hidden_service_conf') if service_dir_map is not None: if LOG_CACHE_FETCHES: log.trace('GETCONF HiddenServiceOptions (cache fetch)') return service_dir_map start_time = time.time() try: response = self.msg('GETCONF HiddenServiceOptions') stem.response.convert('GETCONF', response) log.debug('GETCONF HiddenServiceOptions (runtime: %0.4f)' % (time.time() - start_time)) except stem.ControllerError as exc: log.debug('GETCONF HiddenServiceOptions (failed: %s)' % exc) raise service_dir_map = OrderedDict() directory = None for status_code, divider, content in response.content(): if content == 'HiddenServiceOptions': continue if '=' not in content: continue k, v = content.split('=', 1) if k == 'HiddenServiceDir': directory = v service_dir_map[directory] = {'HiddenServicePort': []} elif k == 'HiddenServicePort': port = target_port = v target_address = '127.0.0.1' if not v.isdigit(): port, target = v.split() if target.isdigit(): target_port = target else: target_address, target_port = target.rsplit(':', 1) if not stem.util.connection.is_valid_port(port): raise stem.ProtocolError('GETCONF provided an invalid HiddenServicePort port (%s): %s' % (port, content)) elif not stem.util.connection.is_valid_ipv4_address(target_address): raise stem.ProtocolError('GETCONF provided an invalid HiddenServicePort target address (%s): %s' % (target_address, content)) elif not stem.util.connection.is_valid_port(target_port): raise stem.ProtocolError('GETCONF provided an invalid HiddenServicePort target port (%s): %s' % (target_port, content)) service_dir_map[directory]['HiddenServicePort'].append((int(port), target_address, int(target_port))) else: service_dir_map[directory][k] = v self._set_cache({'hidden_service_conf': service_dir_map}) return service_dir_map def set_hidden_service_conf(self, conf): """ Update all the configured hidden services from a dictionary having the same format as :func:`~stem.control.Controller.get_hidden_service_conf`. For convenience the HiddenServicePort entries can be an integer, string, or tuple. If an **int** then we treat it as just a port. If a **str** we pass that directly as the HiddenServicePort. And finally, if a **tuple** then it's expected to be the **(port, target_address, target_port)** as provided by :func:`~stem.control.Controller.get_hidden_service_conf`. This is to say the following three are equivalent... :: "HiddenServicePort": [ 80, '80 127.0.0.1:80', (80, '127.0.0.1', 80), ] .. versionadded:: 1.3.0 :param dict conf: configuration dictionary :raises: * :class:`stem.ControllerError` if the call fails * :class:`stem.InvalidArguments` if configuration options requested was invalid * :class:`stem.InvalidRequest` if the configuration setting is impossible or if there's a syntax error in the configuration values """ # If we're not adding or updating any hidden services then call RESETCONF # so we drop existing values. Otherwise calling SETCONF is a no-op. if not conf: self.reset_conf('HiddenServiceDir') return # Convert conf dictionary into a list of ordered config tuples hidden_service_options = [] for directory in conf: hidden_service_options.append(('HiddenServiceDir', directory)) for k, v in list(conf[directory].items()): if k == 'HiddenServicePort': for entry in v: if isinstance(entry, int): entry = '%s 127.0.0.1:%s' % (entry, entry) elif isinstance(entry, str): pass # just pass along what the user gave us elif isinstance(entry, tuple): port, target_address, target_port = entry entry = '%s %s:%s' % (port, target_address, target_port) hidden_service_options.append(('HiddenServicePort', entry)) else: hidden_service_options.append((k, str(v))) self.set_options(hidden_service_options) def create_hidden_service(self, path, port, target_address = None, target_port = None, auth_type = None, client_names = None): """ Create a new hidden service. If the directory is already present, a new port is added. Our *.onion address is fetched by reading the hidden service directory. However, this directory is only readable by the tor user, so if unavailable the **hostname** will be **None**. **As of Tor 0.2.7.1 there's two ways for creating hidden services, and this method is no longer recommended.** Rather, try using :func:`~stem.control.Controller.create_ephemeral_hidden_service` instead. .. versionadded:: 1.3.0 .. versionchanged:: 1.4.0 Added the auth_type and client_names arguments. :param str path: path for the hidden service's data directory :param int port: hidden service port :param str target_address: address of the service, by default 127.0.0.1 :param int target_port: port of the service, by default this is the same as **port** :param str auth_type: authentication type: basic, stealth or None to disable auth :param list client_names: client names (1-16 characters "A-Za-z0-9+-_") :returns: :class:`~stem.cotroller.CreateHiddenServiceOutput` if we create or update a hidden service, **None** otherwise :raises: :class:`stem.ControllerError` if the call fails """ if not stem.util.connection.is_valid_port(port): raise ValueError("%s isn't a valid port number" % port) elif target_address and not stem.util.connection.is_valid_ipv4_address(target_address): raise ValueError("%s isn't a valid IPv4 address" % target_address) elif target_port is not None and not stem.util.connection.is_valid_port(target_port): raise ValueError("%s isn't a valid port number" % target_port) elif auth_type not in (None, 'basic', 'stealth'): raise ValueError("%s isn't a recognized type of authentication" % auth_type) port = int(port) target_address = target_address if target_address else '127.0.0.1' target_port = port if target_port is None else int(target_port) conf = self.get_hidden_service_conf() if path in conf and (port, target_address, target_port) in conf[path]['HiddenServicePort']: return None conf.setdefault(path, OrderedDict()).setdefault('HiddenServicePort', []).append((port, target_address, target_port)) if auth_type and client_names: hsac = "%s %s" % (auth_type, ','.join(client_names)) conf[path]['HiddenServiceAuthorizeClient'] = hsac # Tor 0.3.5 changes its default for HS creation from v2 to v3. This is # fine, but there's a couple options that are incompatible with v3. If # creating a service with one of those we should explicitly create a v2 # service instead. # # https://trac.torproject.org/projects/tor/ticket/27446 for path in conf: if 'HiddenServiceAuthorizeClient' in conf[path] or 'RendPostPeriod' in conf[path]: conf[path]['HiddenServiceVersion'] = '2' self.set_hidden_service_conf(conf) hostname, hostname_for_client = None, {} if self.is_localhost(): hostname_path = os.path.join(path, 'hostname') if not os.path.isabs(hostname_path): cwd = stem.util.system.cwd(self.get_pid(None)) if cwd: hostname_path = stem.util.system.expand_path(hostname_path, cwd) if os.path.isabs(hostname_path): start_time = time.time() while not os.path.exists(hostname_path): wait_time = time.time() - start_time if wait_time >= 3: break else: time.sleep(0.05) try: with open(hostname_path) as hostname_file: hostname = hostname_file.read().strip() if client_names and '\n' in hostname: # When there's multiple clients this looks like... # # ndisjxzkgcdhrwqf.onion sjUwjTSPznqWLdOPuwRUzg # client: c1 # ndisjxzkgcdhrwqf.onion sUu92axuL5bKnA76s2KRfw # client: c2 for line in hostname.splitlines(): if ' # client: ' in line: address = line.split()[0] client = line.split(' # client: ', 1)[1] if len(address) == 22 and address.endswith('.onion'): hostname_for_client[client] = address except: pass return CreateHiddenServiceOutput( path = path, hostname = hostname, hostname_for_client = hostname_for_client, config = conf, ) def remove_hidden_service(self, path, port = None): """ Discontinues a given hidden service. .. versionadded:: 1.3.0 :param str path: path for the hidden service's data directory :param int port: hidden service port :returns: **True** if the hidden service is discontinued, **False** if it wasn't running in the first place :raises: :class:`stem.ControllerError` if the call fails """ if port and not stem.util.connection.is_valid_port(port): raise ValueError("%s isn't a valid port number" % port) port = int(port) if port else None conf = self.get_hidden_service_conf() if path not in conf: return False if not port: del conf[path] else: to_remove = [entry for entry in conf[path]['HiddenServicePort'] if entry[0] == port] if not to_remove: return False for entry in to_remove: conf[path]['HiddenServicePort'].remove(entry) if not conf[path]['HiddenServicePort']: del conf[path] # no ports left self.set_hidden_service_conf(conf) return True @with_default() def list_ephemeral_hidden_services(self, default = UNDEFINED, our_services = True, detached = False): """ list_ephemeral_hidden_services(default = UNDEFINED, our_services = True, detached = False) Lists hidden service addresses created by :func:`~stem.control.Controller.create_ephemeral_hidden_service`. .. versionadded:: 1.4.0 .. versionchanged:: 1.6.0 Tor change caused this to start providing empty strings if unset (:trac:`21329`). :param object default: response if the query fails :param bool our_services: include services created with this controller that weren't flagged as 'detached' :param bool detached: include services whos contiuation isn't tied to a controller :returns: **list** of hidden service addresses without their '.onion' suffix :raises: :class:`stem.ControllerError` if the call fails and we weren't provided a default response """ if self.get_version() < stem.version.Requirement.ADD_ONION: raise stem.UnsatisfiableRequest(message = 'Ephemeral hidden services were added in tor version %s' % stem.version.Requirement.ADD_ONION) result = [] if our_services: try: result += self.get_info('onions/current').split('\n') except stem.ProtocolError as exc: # TODO: Tor's behavior around this was changed in Feb 2017, we should # drop it when all versions that did this are deprecated... # # https://trac.torproject.org/projects/tor/ticket/21329 if 'No onion services of the specified type.' not in str(exc): raise if detached: try: result += self.get_info('onions/detached').split('\n') except stem.ProtocolError as exc: if 'No onion services of the specified type.' not in str(exc): raise return [r for r in result if r] # drop any empty responses (GETINFO is blank if unset) def create_ephemeral_hidden_service(self, ports, key_type = 'NEW', key_content = 'BEST', discard_key = False, detached = False, await_publication = False, timeout = None, basic_auth = None, max_streams = None): """ Creates a new hidden service. Unlike :func:`~stem.control.Controller.create_hidden_service` this style of hidden service doesn't touch disk, carrying with it a lot of advantages. This is the suggested method for making hidden services. Our **ports** argument can be a single port... :: create_ephemeral_hidden_service(80) ... list of ports the service is available on... :: create_ephemeral_hidden_service([80, 443]) ... or a mapping of hidden service ports to their targets... :: create_ephemeral_hidden_service({80: 80, 443: '173.194.33.133:443'}) If **basic_auth** is provided this service will require basic authentication to access. This means users must set HidServAuth in their torrc with credentials to access it. **basic_auth** is a mapping of usernames to their credentials. If the credential is **None** one is generated and returned as part of the response. For instance, only bob can access using the given newly generated credentials... :: >>> response = controller.create_ephemeral_hidden_service(80, basic_auth = {'bob': None}) >>> print(response.client_auth) {'bob': 'nKwfvVPmTNr2k2pG0pzV4g'} ... while both alice and bob can access with existing credentials in the following... :: controller.create_ephemeral_hidden_service(80, basic_auth = { 'alice': 'l4BT016McqV2Oail+Bwe6w', 'bob': 'vGnNRpWYiMBFTWD2gbBlcA', }) To create a **version 3** service simply specify **ED25519-V3** as the our key type, and to create a **version 2** service use **RSA1024**. The default version of newly created hidden services is based on the **HiddenServiceVersion** value in your torrc... :: response = controller.create_ephemeral_hidden_service( 80, key_content = 'ED25519-V3', await_publication = True, ) print('service established at %s.onion' % response.service_id) .. versionadded:: 1.4.0 .. versionchanged:: 1.5.0 Added the basic_auth argument. .. versionchanged:: 1.5.0 Added support for non-anonymous services. To do so set 'HiddenServiceSingleHopMode 1' and 'HiddenServiceNonAnonymousMode 1' in your torrc. .. versionchanged:: 1.7.0 Added the timeout and max_streams arguments. :param int,list,dict ports: hidden service port(s) or mapping of hidden service ports to their targets :param str key_type: type of key being provided, generates a new key if 'NEW' (options are: **NEW**, **RSA1024**, and **ED25519-V3**) :param str key_content: key for the service to use or type of key to be generated (options when **key_type** is **NEW** are **BEST**, **RSA1024**, and **ED25519-V3**) :param bool discard_key: avoid providing the key back in our response :param bool detached: continue this hidden service even after this control connection is closed if **True** :param bool await_publication: blocks until our descriptor is successfully published if **True** :param float timeout: seconds to wait when **await_result** is **True** :param dict basic_auth: required user credentials to access this service :param int max_streams: maximum number of streams the hidden service will accept, unlimited if zero or not set :returns: :class:`~stem.response.add_onion.AddOnionResponse` with the response :raises: * :class:`stem.ControllerError` if the call fails * :class:`stem.Timeout` if **timeout** was reached """ if self.get_version() < stem.version.Requirement.ADD_ONION: raise stem.UnsatisfiableRequest(message = 'Ephemeral hidden services were added in tor version %s' % stem.version.Requirement.ADD_ONION) hs_desc_queue, hs_desc_listener = queue.Queue(), None start_time = time.time() if await_publication: def hs_desc_listener(event): hs_desc_queue.put(event) self.add_event_listener(hs_desc_listener, EventType.HS_DESC) request = 'ADD_ONION %s:%s' % (key_type, key_content) flags = [] if discard_key: flags.append('DiscardPK') if detached: flags.append('Detach') if basic_auth is not None: if self.get_version() < stem.version.Requirement.ADD_ONION_BASIC_AUTH: raise stem.UnsatisfiableRequest(message = 'Basic authentication support was added to ADD_ONION in tor version %s' % stem.version.Requirement.ADD_ONION_BASIC_AUTH) flags.append('BasicAuth') if max_streams is not None: if self.get_version() < stem.version.Requirement.ADD_ONION_MAX_STREAMS: raise stem.UnsatisfiableRequest(message = 'Limitation of the maximum number of streams to accept was added to ADD_ONION in tor version %s' % stem.version.Requirement.ADD_ONION_MAX_STREAMS) flags.append('MaxStreamsCloseCircuit') if self.get_version() >= stem.version.Requirement.ADD_ONION_NON_ANONYMOUS: if self.get_conf('HiddenServiceSingleHopMode', None) == '1' and self.get_conf('HiddenServiceNonAnonymousMode', None) == '1': flags.append('NonAnonymous') if flags: request += ' Flags=%s' % ','.join(flags) if max_streams is not None: request += ' MaxStreams=%s' % max_streams if isinstance(ports, int): request += ' Port=%s' % ports elif isinstance(ports, list): for port in ports: request += ' Port=%s' % port elif isinstance(ports, dict): for port, target in ports.items(): request += ' Port=%s,%s' % (port, target) else: raise ValueError("The 'ports' argument of create_ephemeral_hidden_service() needs to be an int, list, or dict") if basic_auth is not None: for client_name, client_blob in basic_auth.items(): if client_blob: request += ' ClientAuth=%s:%s' % (client_name, client_blob) else: request += ' ClientAuth=%s' % client_name response = self.msg(request) stem.response.convert('ADD_ONION', response) if await_publication: # We should receive five UPLOAD events, followed by up to another five # UPLOADED to indicate they've finished. Presently tor seems to have an # issue where the address is provided for UPLOAD but not UPLOADED so need # to just guess that if it's for the same hidden service authority then # it's what we're looking for. directories_uploaded_to, failures = [], [] try: while True: event = _get_with_timeout(hs_desc_queue, timeout, start_time) if event.action == stem.HSDescAction.UPLOAD and event.address == response.service_id: directories_uploaded_to.append(event.directory_fingerprint) elif event.action == stem.HSDescAction.UPLOADED and event.directory_fingerprint in directories_uploaded_to: break # successfully uploaded to a HS authority... maybe elif event.action == stem.HSDescAction.FAILED and event.directory_fingerprint in directories_uploaded_to: failures.append('%s (%s)' % (event.directory_fingerprint, event.reason)) if len(directories_uploaded_to) == len(failures): raise stem.OperationFailed(message = 'Failed to upload our hidden service descriptor to %s' % ', '.join(failures)) finally: self.remove_event_listener(hs_desc_listener) return response def remove_ephemeral_hidden_service(self, service_id): """ Discontinues a given hidden service that was created with :func:`~stem.control.Controller.create_ephemeral_hidden_service`. .. versionadded:: 1.4.0 :param str service_id: hidden service address without the '.onion' suffix :returns: **True** if the hidden service is discontinued, **False** if it wasn't running in the first place :raises: :class:`stem.ControllerError` if the call fails """ if self.get_version() < stem.version.Requirement.ADD_ONION: raise stem.UnsatisfiableRequest(message = 'Ephemeral hidden services were added in tor version %s' % stem.version.Requirement.ADD_ONION) response = self.msg('DEL_ONION %s' % service_id) stem.response.convert('SINGLELINE', response) if response.is_ok(): return True elif response.code == '552': return False # no hidden service to discontinue else: raise stem.ProtocolError('DEL_ONION returned unexpected response code: %s' % response.code) def add_event_listener(self, listener, *events): """ Directs further tor controller events to a given function. The function is expected to take a single argument, which is a :class:`~stem.response.events.Event` subclass. For instance the following would print the bytes sent and received by tor over five seconds... :: import time from stem.control import Controller, EventType def print_bw(event): print('sent: %i, received: %i' % (event.written, event.read)) with Controller.from_port(port = 9051) as controller: controller.authenticate() controller.add_event_listener(print_bw, EventType.BW) time.sleep(5) If a new control connection is initialized then this listener will be reattached. If tor emits a malformed event it can be received by listening for the stem.control.MALFORMED_EVENTS constant. .. versionchanged:: 1.7.0 Listener exceptions and malformed events no longer break further event processing. Added the **MALFORMED_EVENTS** constant. :param functor listener: function to be called when an event is received :param stem.control.EventType events: event types to be listened for :raises: :class:`stem.ProtocolError` if unable to set the events """ # first checking that tor supports these event types with self._event_listeners_lock: if self.is_authenticated(): for event_type in events: event_type = stem.response.events.EVENT_TYPE_TO_CLASS.get(event_type) if event_type and (self.get_version() < event_type._VERSION_ADDED): raise stem.InvalidRequest(552, '%s event requires Tor version %s or later' % (event_type, event_type._VERSION_ADDED)) for event_type in events: self._event_listeners.setdefault(event_type, []).append(listener) failed_events = self._attach_listeners()[1] # restricted the failures to just things we requested failed_events = set(failed_events).intersection(set(events)) if failed_events: raise stem.ProtocolError('SETEVENTS rejected %s' % ', '.join(failed_events)) def remove_event_listener(self, listener): """ Stops a listener from being notified of further tor events. :param stem.control.EventListener listener: listener to be removed :raises: :class:`stem.ProtocolError` if unable to set the events """ with self._event_listeners_lock: event_types_changed = False for event_type, event_listeners in list(self._event_listeners.items()): if listener in event_listeners: event_listeners.remove(listener) if len(event_listeners) == 0: event_types_changed = True del self._event_listeners[event_type] if event_types_changed: response = self.msg('SETEVENTS %s' % ' '.join(self._event_listeners.keys())) if not response.is_ok(): raise stem.ProtocolError('SETEVENTS received unexpected response\n%s' % response) def _get_cache(self, param, namespace = None): """ Queries our request cache for the given key. :param str param: key to be queried :param str namespace: namespace in which to check for the key :returns: cached value corresponding to key or **None** if the key wasn't found """ with self._cache_lock: if not self.is_caching_enabled(): return None cache_key = '%s.%s' % (namespace, param) if namespace else param return self._request_cache.get(cache_key, None) def _get_cache_map(self, params, namespace = None): """ Queries our request cache for multiple entries. :param list params: keys to be queried :param str namespace: namespace in which to check for the keys :returns: **dict** of 'param => cached value' pairs of keys present in cache """ with self._cache_lock: cached_values = {} if self.is_caching_enabled(): for param in params: cache_key = '%s.%s' % (namespace, param) if namespace else param if cache_key in self._request_cache: cached_values[param] = self._request_cache[cache_key] return cached_values def _set_cache(self, params, namespace = None): """ Sets the given request cache entries. If the new cache value is **None** then it is removed from our cache. :param dict params: **dict** of 'cache_key => value' pairs to be cached :param str namespace: namespace for the keys """ with self._cache_lock: if not self.is_caching_enabled(): return # if params is None then clear the namespace if params is None and namespace: for cache_key in list(self._request_cache.keys()): if cache_key.startswith('%s.' % namespace): del self._request_cache[cache_key] return # remove uncacheable items if namespace == 'getconf': # shallow copy before edit so as not to change it for the caller params = params.copy() for key in UNCACHEABLE_GETCONF_PARAMS: if key in params: del params[key] for key, value in list(params.items()): if namespace: cache_key = '%s.%s' % (namespace, key) else: cache_key = key if value is None: if cache_key in list(self._request_cache.keys()): del self._request_cache[cache_key] else: self._request_cache[cache_key] = value def _confchanged_cache_invalidation(self, params): """ Drops dependent portions of the cache when configuration changes. :param dict params: **dict** of 'config_key => value' pairs for configs that changed. The entries' values are currently unused. """ with self._cache_lock: if not self.is_caching_enabled(): return if any('hidden' in param.lower() for param in params.keys()): self._set_cache({'hidden_service_conf': None}) # reset any getinfo parameters that can be changed by a SETCONF self._set_cache(dict([(k.lower(), None) for k in CACHEABLE_GETINFO_PARAMS_UNTIL_SETCONF]), 'getinfo') self._set_cache(None, 'listeners') self._set_cache({'get_custom_options': None}) self._set_cache({'exit_policy': None}) # numerous options can change our policy def is_caching_enabled(self): """ **True** if caching has been enabled, **False** otherwise. :returns: bool to indicate if caching is enabled """ return self._is_caching_enabled def set_caching(self, enabled): """ Enables or disables caching of information retrieved from tor. :param bool enabled: **True** to enable caching, **False** to disable it """ self._is_caching_enabled = enabled if not self._is_caching_enabled: self.clear_cache() def clear_cache(self): """ Drops any cached results. """ with self._cache_lock: self._request_cache = {} self._last_newnym = 0.0 self._is_geoip_unavailable = None def load_conf(self, configtext): """ Sends the configuration text to Tor and loads it as if it has been read from the torrc. :param str configtext: the configuration text :raises: :class:`stem.ControllerError` if the call fails """ response = self.msg('LOADCONF\n%s' % configtext) stem.response.convert('SINGLELINE', response) if response.code in ('552', '553'): if response.code == '552' and response.message.startswith('Invalid config file: Failed to parse/validate config: Unknown option'): raise stem.InvalidArguments(response.code, response.message, [response.message[70:response.message.find('.', 70) - 1]]) raise stem.InvalidRequest(response.code, response.message) elif not response.is_ok(): raise stem.ProtocolError('+LOADCONF Received unexpected response\n%s' % str(response)) def save_conf(self, force = False): """ Saves the current configuration options into the active torrc file. .. versionchanged:: 1.6.0 Added the force argument. :param bool force: overwrite the configuration even if it includes a '%include' clause, this is ignored if tor doesn't support it :raises: * :class:`stem.ControllerError` if the call fails * :class:`stem.OperationFailed` if the client is unable to save the configuration file """ if self.get_version() < stem.version.Requirement.SAVECONF_FORCE: force = False response = self.msg('SAVECONF FORCE' if force else 'SAVECONF') stem.response.convert('SINGLELINE', response) if response.is_ok(): return True elif response.code == '551': raise stem.OperationFailed(response.code, response.message) else: raise stem.ProtocolError('SAVECONF returned unexpected response code') def is_feature_enabled(self, feature): """ Checks if a control connection feature is enabled. These features can be enabled using :func:`~stem.control.Controller.enable_feature`. :param str feature: feature to be checked :returns: **True** if feature is enabled, **False** otherwise """ feature = feature.upper() if feature in self._enabled_features: return True else: # check if this feature is on by default defaulted_version = None if feature == 'EXTENDED_EVENTS': defaulted_version = stem.version.Requirement.FEATURE_EXTENDED_EVENTS elif feature == 'VERBOSE_NAMES': defaulted_version = stem.version.Requirement.FEATURE_VERBOSE_NAMES if defaulted_version: our_version = self.get_version(None) if our_version and our_version >= defaulted_version: self._enabled_features.append(feature) return feature in self._enabled_features def enable_feature(self, features): """ Enables features that are disabled by default to maintain backward compatibility. Once enabled, a feature cannot be disabled and a new control connection must be opened to get a connection with the feature disabled. Feature names are case-insensitive. The following features are currently accepted: * EXTENDED_EVENTS - Requests the extended event syntax * VERBOSE_NAMES - Replaces ServerID with LongName in events and GETINFO results :param str,list features: a single feature or a list of features to be enabled :raises: * :class:`stem.ControllerError` if the call fails * :class:`stem.InvalidArguments` if features passed were invalid """ if stem.util._is_str(features): features = [features] response = self.msg('USEFEATURE %s' % ' '.join(features)) stem.response.convert('SINGLELINE', response) if not response.is_ok(): if response.code == '552': invalid_feature = [] if response.message.startswith('Unrecognized feature "'): invalid_feature = [response.message[22:response.message.find('"', 22)]] raise stem.InvalidArguments(response.code, response.message, invalid_feature) raise stem.ProtocolError('USEFEATURE provided an invalid response code: %s' % response.code) self._enabled_features += [entry.upper() for entry in features] @with_default() def get_circuit(self, circuit_id, default = UNDEFINED): """ get_circuit(circuit_id, default = UNDEFINED) Provides a circuit currently available from tor. :param int circuit_id: circuit to be fetched :param object default: response if the query fails :returns: :class:`stem.response.events.CircuitEvent` for the given circuit :raises: * :class:`stem.ControllerError` if the call fails * **ValueError** if the circuit doesn't exist An exception is only raised if we weren't provided a default response. """ for circ in self.get_circuits(): if circ.id == circuit_id: return circ raise ValueError("Tor currently does not have a circuit with the id of '%s'" % circuit_id) @with_default() def get_circuits(self, default = UNDEFINED): """ get_circuits(default = UNDEFINED) Provides tor's currently available circuits. :param object default: response if the query fails :returns: **list** of :class:`stem.response.events.CircuitEvent` for our circuits :raises: :class:`stem.ControllerError` if the call fails and no default was provided """ circuits = [] response = self.get_info('circuit-status') for circ in response.splitlines(): circ_message = stem.socket.recv_message(io.BytesIO(stem.util.str_tools._to_bytes('650 CIRC %s\r\n' % circ))) stem.response.convert('EVENT', circ_message, arrived_at = 0) circuits.append(circ_message) return circuits def new_circuit(self, path = None, purpose = 'general', await_build = False, timeout = None): """ Requests a new circuit. If the path isn't provided, one is automatically selected. .. versionchanged:: 1.7.0 Added the timeout argument. :param list,str path: one or more relays to make a circuit through :param str purpose: 'general' or 'controller' :param bool await_build: blocks until the circuit is built if **True** :param float timeout: seconds to wait when **await_build** is **True** :returns: str of the circuit id of the newly created circuit :raises: * :class:`stem.ControllerError` if the call fails * :class:`stem.Timeout` if **timeout** was reached """ return self.extend_circuit('0', path, purpose, await_build, timeout) def extend_circuit(self, circuit_id = '0', path = None, purpose = 'general', await_build = False, timeout = None): """ Either requests the creation of a new circuit or extends an existing one. When called with a circuit value of zero (the default) a new circuit is created, and when non-zero the circuit with that id is extended. If the path isn't provided, one is automatically selected. A python interpreter session used to create circuits could look like this... :: >>> controller.extend_circuit('0', ['718BCEA286B531757ACAFF93AE04910EA73DE617', '30BAB8EE7606CBD12F3CC269AE976E0153E7A58D', '2765D8A8C4BBA3F89585A9FFE0E8575615880BEB']) 19 >>> controller.extend_circuit('0') 20 >>> print(controller.get_info('circuit-status')) 20 EXTENDED $718BCEA286B531757ACAFF93AE04910EA73DE617=KsmoinOK,$649F2D0ACF418F7CFC6539AB2257EB2D5297BAFA=Eskimo BUILD_FLAGS=NEED_CAPACITY PURPOSE=GENERAL TIME_CREATED=2012-12-06T13:51:11.433755 19 BUILT $718BCEA286B531757ACAFF93AE04910EA73DE617=KsmoinOK,$30BAB8EE7606CBD12F3CC269AE976E0153E7A58D=Pascal1,$2765D8A8C4BBA3F89585A9FFE0E8575615880BEB=Anthracite PURPOSE=GENERAL TIME_CREATED=2012-12-06T13:50:56.969938 .. versionchanged:: 1.7.0 Added the timeout argument. :param str circuit_id: id of a circuit to be extended :param list,str path: one or more relays to make a circuit through, this is required if the circuit id is non-zero :param str purpose: 'general' or 'controller' :param bool await_build: blocks until the circuit is built if **True** :param float timeout: seconds to wait when **await_build** is **True** :returns: str of the circuit id of the created or extended circuit :raises: * :class:`stem.InvalidRequest` if one of the parameters were invalid * :class:`stem.CircuitExtensionFailed` if we were waiting for the circuit to build but it failed * :class:`stem.Timeout` if **timeout** was reached * :class:`stem.ControllerError` if the call fails """ # Attaches a temporary listener for CIRC events if we'll be waiting for it # to build. This is icky, but we can't reliably do this via polling since # we then can't get the failure if it can't be created. circ_queue, circ_listener = queue.Queue(), None start_time = time.time() if await_build: def circ_listener(event): circ_queue.put(event) self.add_event_listener(circ_listener, EventType.CIRC) try: # we might accidently get integer circuit ids circuit_id = str(circuit_id) if path is None and circuit_id == '0': path_opt_version = stem.version.Requirement.EXTENDCIRCUIT_PATH_OPTIONAL if not self.get_version() >= path_opt_version: raise stem.InvalidRequest(512, 'EXTENDCIRCUIT requires the path prior to version %s' % path_opt_version) args = [circuit_id] if stem.util._is_str(path): path = [path] if path: args.append(','.join(path)) if purpose: args.append('purpose=%s' % purpose) response = self.msg('EXTENDCIRCUIT %s' % ' '.join(args)) stem.response.convert('SINGLELINE', response) if response.code in ('512', '552'): raise stem.InvalidRequest(response.code, response.message) elif not response.is_ok(): raise stem.ProtocolError('EXTENDCIRCUIT returned unexpected response code: %s' % response.code) if not response.message.startswith('EXTENDED '): raise stem.ProtocolError('EXTENDCIRCUIT response invalid:\n%s', response) new_circuit = response.message.split(' ', 1)[1] if await_build: while True: circ = _get_with_timeout(circ_queue, timeout, start_time) if circ.id == new_circuit: if circ.status == CircStatus.BUILT: break elif circ.status == CircStatus.FAILED: raise stem.CircuitExtensionFailed('Circuit failed to be created: %s' % circ.reason, circ) elif circ.status == CircStatus.CLOSED: raise stem.CircuitExtensionFailed('Circuit was closed prior to build', circ) return new_circuit finally: if circ_listener: self.remove_event_listener(circ_listener) def repurpose_circuit(self, circuit_id, purpose): """ Changes a circuit's purpose. Currently, two purposes are recognized... * general * controller :param str circuit_id: id of the circuit whose purpose is to be changed :param str purpose: purpose (either 'general' or 'controller') :raises: :class:`stem.InvalidArguments` if the circuit doesn't exist or if the purpose was invalid """ response = self.msg('SETCIRCUITPURPOSE %s purpose=%s' % (circuit_id, purpose)) stem.response.convert('SINGLELINE', response) if not response.is_ok(): if response.code == '552': raise stem.InvalidRequest(response.code, response.message) else: raise stem.ProtocolError('SETCIRCUITPURPOSE returned unexpected response code: %s' % response.code) def close_circuit(self, circuit_id, flag = ''): """ Closes the specified circuit. :param str circuit_id: id of the circuit to be closed :param str flag: optional value to modify closing, the only flag available is 'IfUnused' which will not close the circuit unless it is unused :raises: :class:`stem.InvalidArguments` if the circuit is unknown :raises: :class:`stem.InvalidRequest` if not enough information is provided """ response = self.msg('CLOSECIRCUIT %s %s' % (circuit_id, flag)) stem.response.convert('SINGLELINE', response) if not response.is_ok(): if response.code in ('512', '552'): if response.message.startswith('Unknown circuit '): raise stem.InvalidArguments(response.code, response.message, [circuit_id]) raise stem.InvalidRequest(response.code, response.message) else: raise stem.ProtocolError('CLOSECIRCUIT returned unexpected response code: %s' % response.code) @with_default() def get_streams(self, default = UNDEFINED): """ get_streams(default = UNDEFINED) Provides the list of streams tor is currently handling. :param object default: response if the query fails :returns: list of :class:`stem.response.events.StreamEvent` objects :raises: :class:`stem.ControllerError` if the call fails and no default was provided """ streams = [] response = self.get_info('stream-status') for stream in response.splitlines(): message = stem.socket.recv_message(io.BytesIO(stem.util.str_tools._to_bytes('650 STREAM %s\r\n' % stream))) stem.response.convert('EVENT', message, arrived_at = 0) streams.append(message) return streams def attach_stream(self, stream_id, circuit_id, exiting_hop = None): """ Attaches a stream to a circuit. Note: Tor attaches streams to circuits automatically unless the __LeaveStreamsUnattached configuration variable is set to '1' :param str stream_id: id of the stream that must be attached :param str circuit_id: id of the circuit to which it must be attached :param int exiting_hop: hop in the circuit where traffic should exit :raises: * :class:`stem.InvalidRequest` if the stream or circuit id were unrecognized * :class:`stem.UnsatisfiableRequest` if the stream isn't in a state where it can be attached * :class:`stem.OperationFailed` if the stream couldn't be attached for any other reason """ query = 'ATTACHSTREAM %s %s' % (stream_id, circuit_id) if exiting_hop: query += ' HOP=%s' % exiting_hop response = self.msg(query) stem.response.convert('SINGLELINE', response) if not response.is_ok(): if response.code == '552': raise stem.InvalidRequest(response.code, response.message) elif response.code == '551': raise stem.OperationFailed(response.code, response.message) elif response.code == '555': raise stem.UnsatisfiableRequest(response.code, response.message) else: raise stem.ProtocolError('ATTACHSTREAM returned unexpected response code: %s' % response.code) def close_stream(self, stream_id, reason = stem.RelayEndReason.MISC, flag = ''): """ Closes the specified stream. :param str stream_id: id of the stream to be closed :param stem.RelayEndReason reason: reason the stream is closing :param str flag: not currently used :raises: * :class:`stem.InvalidArguments` if the stream or reason are not recognized * :class:`stem.InvalidRequest` if the stream and/or reason are missing """ # there's a single value offset between RelayEndReason.index_of() and the # value that tor expects since tor's value starts with the index of one response = self.msg('CLOSESTREAM %s %s %s' % (stream_id, stem.RelayEndReason.index_of(reason) + 1, flag)) stem.response.convert('SINGLELINE', response) if not response.is_ok(): if response.code in ('512', '552'): if response.message.startswith('Unknown stream '): raise stem.InvalidArguments(response.code, response.message, [stream_id]) elif response.message.startswith('Unrecognized reason '): raise stem.InvalidArguments(response.code, response.message, [reason]) raise stem.InvalidRequest(response.code, response.message) else: raise stem.ProtocolError('CLOSESTREAM returned unexpected response code: %s' % response.code) def signal(self, signal): """ Sends a signal to the Tor client. :param stem.Signal signal: type of signal to be sent :raises: * :class:`stem.ControllerError` if sending the signal failed * :class:`stem.InvalidArguments` if signal provided wasn't recognized """ response = self.msg('SIGNAL %s' % signal) stem.response.convert('SINGLELINE', response) if response.is_ok(): if signal == stem.Signal.NEWNYM: self._last_newnym = time.time() else: if response.code == '552': raise stem.InvalidArguments(response.code, response.message, [signal]) raise stem.ProtocolError('SIGNAL response contained unrecognized status code: %s' % response.code) def is_newnym_available(self): """ Indicates if tor would currently accept a NEWNYM signal. This can only account for signals sent via this controller. .. versionadded:: 1.2.0 :returns: **True** if tor would currently accept a NEWNYM signal, **False** otherwise """ if self.is_alive(): return self.get_newnym_wait() == 0.0 else: return False def get_newnym_wait(self): """ Provides the number of seconds until a NEWNYM signal would be respected. This can only account for signals sent via this controller. .. versionadded:: 1.2.0 :returns: **float** for the number of seconds until tor would respect another NEWNYM signal """ return max(0.0, self._last_newnym + 10 - time.time()) @with_default() def get_effective_rate(self, default = UNDEFINED, burst = False): """ get_effective_rate(default = UNDEFINED, burst = False) Provides the maximum rate this relay is configured to relay in bytes per second. This is based on multiple torrc parameters if they're set... * Effective Rate = min(BandwidthRate, RelayBandwidthRate, MaxAdvertisedBandwidth) * Effective Burst = min(BandwidthBurst, RelayBandwidthBurst) .. versionadded:: 1.3.0 :param object default: response if the query fails :param bool burst: provides the burst bandwidth, otherwise this provides the standard rate :returns: **int** with the effective bandwidth rate in bytes per second :raises: :class:`stem.ControllerError` if the call fails and no default was provided """ if not burst: attributes = ('BandwidthRate', 'RelayBandwidthRate', 'MaxAdvertisedBandwidth') else: attributes = ('BandwidthBurst', 'RelayBandwidthBurst') value = None for attr in attributes: attr_value = int(self.get_conf(attr)) if attr_value == 0 and attr.startswith('Relay'): continue # RelayBandwidthRate and RelayBandwidthBurst default to zero value = min(value, attr_value) if value else attr_value return value def is_geoip_unavailable(self): """ Provides **True** if tor's geoip database is unavailable, **False** otherwise. .. versionchanged:: 1.6.0 No longer requires previously failed GETINFO requests to determine this. .. deprecated:: 1.6.0 This is available as of Tor 0.3.2.1 through the following instead... :: controller.get_info('ip-to-country/ipv4-available', 0) == '1' :returns: **bool** indicating if we've determined tor's geoip database to be unavailable or not """ if self._is_geoip_unavailable is None: try: self.get_info('ip-to-country/0.0.0.0') self._is_geoip_unavailable = False except stem.ControllerError as exc: if 'GeoIP data not loaded' in str(exc): self._is_geoip_unavailable = True else: return False # unexpected issue, fail open and don't cache return self._is_geoip_unavailable def map_address(self, mapping): """ Map addresses to replacement addresses. Tor replaces subseqent connections to the original addresses with the replacement addresses. If the original address is a null address, i.e., one of '0.0.0.0', '::0', or '.' Tor picks an original address itself and returns it in the reply. If the original address is already mapped to a different address the mapping is removed. :param dict mapping: mapping of original addresses to replacement addresses :raises: * :class:`stem.InvalidRequest` if the addresses are malformed * :class:`stem.OperationFailed` if Tor couldn't fulfill the request :returns: **dict** with 'original -> replacement' address mappings """ mapaddress_arg = ' '.join(['%s=%s' % (k, v) for (k, v) in list(mapping.items())]) response = self.msg('MAPADDRESS %s' % mapaddress_arg) stem.response.convert('MAPADDRESS', response) return response.entries def drop_guards(self): """ Drops our present guard nodes and picks a new set. .. versionadded:: 1.2.0 :raises: :class:`stem.ControllerError` if Tor couldn't fulfill the request """ if self.get_version() < stem.version.Requirement.DROPGUARDS: raise stem.UnsatisfiableRequest(message = 'DROPGUARDS was added in tor version %s' % stem.version.Requirement.DROPGUARDS) self.msg('DROPGUARDS') def _post_authentication(self): super(Controller, self)._post_authentication() # try to re-attach event listeners to the new instance with self._event_listeners_lock: try: failed_events = self._attach_listeners()[1] if failed_events: # remove our listeners for these so we don't keep failing for event_type in failed_events: del self._event_listeners[event_type] logging_id = 'stem.controller.event_reattach-%s' % '-'.join(failed_events) log.log_once(logging_id, log.WARN, 'We were unable to re-attach our event listeners to the new tor instance for: %s' % ', '.join(failed_events)) except stem.ProtocolError as exc: log.warn('Unable to issue the SETEVENTS request to re-attach our listeners (%s)' % exc) # issue TAKEOWNERSHIP if we're the owning process for this tor instance owning_pid = self.get_conf('__OwningControllerProcess', None) if owning_pid == str(os.getpid()) and self.is_localhost(): response = self.msg('TAKEOWNERSHIP') stem.response.convert('SINGLELINE', response) if response.is_ok(): # Now that tor is tracking our ownership of the process via the control # connection, we can stop having it check for us via our pid. try: self.reset_conf('__OwningControllerProcess') except stem.ControllerError as exc: log.warn("We were unable to reset tor's __OwningControllerProcess configuration. It will continue to periodically check if our pid exists. (%s)" % exc) else: log.warn('We were unable assert ownership of tor through TAKEOWNERSHIP, despite being configured to be the owning process through __OwningControllerProcess. (%s)' % response) def _handle_event(self, event_message): try: stem.response.convert('EVENT', event_message, arrived_at = time.time()) event_type = event_message.type except stem.ProtocolError as exc: log.error('Tor sent a malformed event (%s): %s' % (exc, event_message)) event_type = MALFORMED_EVENTS with self._event_listeners_lock: for listener_type, event_listeners in list(self._event_listeners.items()): if listener_type == event_type: for listener in event_listeners: try: listener(event_message) except Exception as exc: log.warn('Event listener raised an uncaught exception (%s): %s' % (exc, event_message)) def _attach_listeners(self): """ Attempts to subscribe to the self._event_listeners events from tor. This is a no-op if we're not currently authenticated. :returns: tuple of the form (set_events, failed_events) :raises: :class:`stem.ControllerError` if unable to make our request to tor """ set_events, failed_events = [], [] with self._event_listeners_lock: if self.is_authenticated(): # try to set them all response = self.msg('SETEVENTS %s' % ' '.join(self._event_listeners.keys())) if response.is_ok(): set_events = list(self._event_listeners.keys()) else: # One of the following likely happened... # # * Our user attached listeners before having an authenticated # connection, so we couldn't check if we met the version # requirement. # # * User attached listeners to one tor instance, then connected us to # an older tor instancce. # # * Some other controller hiccup (far less likely). # # See if we can set some subset of our events. for event in list(self._event_listeners.keys()): response = self.msg('SETEVENTS %s' % ' '.join(set_events + [event])) if response.is_ok(): set_events.append(event) else: failed_events.append(event) return (set_events, failed_events) def _parse_circ_path(path): """ Parses a circuit path as a list of **(fingerprint, nickname)** tuples. Tor circuit paths are defined as being of the form... :: Path = LongName *("," LongName) LongName = Fingerprint [ ( "=" / "~" ) Nickname ] example: $999A226EBED397F331B612FE1E4CFAE5C1F201BA=piyaz ... *unless* this is prior to tor version 0.2.2.1 with the VERBOSE_NAMES feature turned off (or before version 0.1.2.2 where the feature was introduced). In that case either the fingerprint or nickname in the tuple will be **None**, depending on which is missing. :: Path = ServerID *("," ServerID) ServerID = Nickname / Fingerprint example: $E57A476CD4DFBD99B4EE52A100A58610AD6E80B9,hamburgerphone,PrivacyRepublic14 :param str path: circuit path to be parsed :returns: list of **(fingerprint, nickname)** tuples, fingerprints do not have a proceeding '$' :raises: :class:`stem.ProtocolError` if the path is malformed """ if path: try: return [_parse_circ_entry(entry) for entry in path.split(',')] except stem.ProtocolError as exc: # include the path with the exception raise stem.ProtocolError('%s: %s' % (exc, path)) else: return [] def _parse_circ_entry(entry): """ Parses a single relay's 'LongName' or 'ServerID'. See the :func:`~stem.control._parse_circ_path` function for more information. :param str entry: relay information to be parsed :returns: **(fingerprint, nickname)** tuple :raises: :class:`stem.ProtocolError` if the entry is malformed """ if '=' in entry: # common case fingerprint, nickname = entry.split('=') elif '~' in entry: # this is allowed for by the spec, but I've never seen it used fingerprint, nickname = entry.split('~') elif entry[0] == '$': # old style, fingerprint only fingerprint, nickname = entry, None else: # old style, nickname only fingerprint, nickname = None, entry if fingerprint is not None: if not stem.util.tor_tools.is_valid_fingerprint(fingerprint, True): raise stem.ProtocolError('Fingerprint in the circuit path is malformed (%s)' % fingerprint) fingerprint = fingerprint[1:] # strip off the leading '$' if nickname is not None and not stem.util.tor_tools.is_valid_nickname(nickname): raise stem.ProtocolError('Nickname in the circuit path is malformed (%s)' % nickname) return (fingerprint, nickname) @with_default() def _case_insensitive_lookup(entries, key, default = UNDEFINED): """ Makes a case insensitive lookup within a list or dictionary, providing the first matching entry that we come across. :param list,dict entries: list or dictionary to be searched :param str key: entry or key value to look up :param object default: value to be returned if the key doesn't exist :returns: case insensitive match or default if one was provided and key wasn't found :raises: **ValueError** if no such value exists """ if entries is not None: if isinstance(entries, dict): for k, v in list(entries.items()): if k.lower() == key.lower(): return v else: for entry in entries: if entry.lower() == key.lower(): return entry raise ValueError("key '%s' doesn't exist in dict: %s" % (key, entries)) def _get_with_timeout(event_queue, timeout, start_time): """ Pulls an item from a queue with a given timeout. """ if timeout: time_left = timeout - (time.time() - start_time) if time_left <= 0: raise stem.Timeout('Reached our %0.1f second timeout' % timeout) try: return event_queue.get(True, time_left) except queue.Empty: raise stem.Timeout('Reached our %0.1f second timeout' % timeout) else: return event_queue.get() stem-1.7.1/stem/__init__.py0000664000175000017500000006733313411002463016301 0ustar atagaratagar00000000000000# Copyright 2011-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Library for working with the tor process. **Module Overview:** :: Endpoint - Networking endpoint. |- ORPort - Tor relay endpoint. +- DirPort - Descriptor mirror. ControllerError - Base exception raised when using the controller. |- ProtocolError - Malformed socket data. | |- OperationFailed - Tor was unable to successfully complete the operation. | |- UnsatisfiableRequest - Tor was unable to satisfy a valid request. | | |- CircuitExtensionFailed - Attempt to make or extend a circuit failed. | | |- DescriptorUnavailable - The given relay descriptor is unavailable. | | +- Timeout - Caller requested timeout was reached. | | | | | +- InvalidRequest - Invalid request. | +- InvalidArguments - Invalid request parameters. | +- SocketError - Communication with the socket failed. +- SocketClosed - Socket has been shut down. .. data:: Runlevel (enum) Rating of importance used for event logging. =========== =========== Runlevel Description =========== =========== **ERR** critical issues that impair tor's ability to function **WARN** non-critical issues the user should be aware of **NOTICE** information that may be helpful to the user **INFO** high level runtime information **DEBUG** low level runtime information =========== =========== .. data:: Signal (enum) Signals that the tor process will accept. .. versionchanged:: 1.3.0 Added the HEARTBEAT signal. ========================= =========== Signal Description ========================= =========== **RELOAD** or **HUP** reloads our torrc **SHUTDOWN** or **INT** shut down, waiting ShutdownWaitLength first if we're a relay **DUMP** or **USR1** dumps information about open connections and circuits to our log **DEBUG** or **USR2** switch our logging to the DEBUG runlevel **HALT** or **TERM** exit tor immediately **NEWNYM** switch to new circuits, so new application requests don't share any circuits with old ones (this also clears our DNS cache) **CLEARDNSCACHE** clears cached DNS results **HEARTBEAT** trigger a heartbeat log message ========================= =========== .. data:: Flag (enum) Flag assigned to tor relays by the authorities to indicate various characteristics. **Note:** The BADDIRECTORY flag was `removed from tor `_. .. versionchanged:: 1.5.0 Added the NO_ED_CONSENSUS flag. =================== =========== Flag Description =================== =========== **AUTHORITY** relay is a directory authority **BADEXIT** relay shouldn't be used as an exit due to being either problematic or malicious **BADDIRECTORY** relay shouldn't be used for directory information **EXIT** relay's exit policy makes it more useful as an exit rather than middle hop **FAST** relay's suitable for high-bandwidth circuits **GUARD** relay's suitable for being an entry guard (first hop) **HSDIR** relay is being used as a v2 hidden service directory **NAMED** relay can be referred to by its nickname **NO_ED_CONSENSUS** relay's Ed25519 doesn't reflrect the consensus **RUNNING** relay is currently usable **STABLE** relay's suitable for long-lived circuits **UNNAMED** relay isn't currently bound to a nickname **V2DIR** relay supports the v2 directory protocol **VALID** relay has been validated =================== =========== .. data:: CircStatus (enum) Statuses that a circuit can be in. Tor may provide statuses not in this enum. .. versionchanged:: 1.6.0 Added the GUARD_WAIT signal. ============== =========== CircStatus Description ============== =========== **LAUNCHED** new circuit was created **BUILT** circuit finished being created and can accept traffic **GUARD_WAIT** waiting to see if there's a circuit with a better guard before using **EXTENDED** circuit has been extended by a hop **FAILED** circuit construction failed **CLOSED** circuit has been closed ============== =========== .. data:: CircBuildFlag (enum) Attributes about how a circuit is built. These were introduced in tor version 0.2.3.11. Tor may provide flags not in this enum. ================= =========== CircBuildFlag Description ================= =========== **ONEHOP_TUNNEL** single hop circuit to fetch directory information **IS_INTERNAL** circuit that won't be used for client traffic **NEED_CAPACITY** circuit only includes high capacity relays **NEED_UPTIME** circuit only includes relays with a high uptime ================= =========== .. data:: CircPurpose (enum) Description of what a circuit is intended for. These were introduced in tor version 0.2.1.6. Tor may provide purposes not in this enum. ==================== =========== CircPurpose Description ==================== =========== **GENERAL** client traffic or fetching directory information **HS_CLIENT_INTRO** client side introduction point for a hidden service circuit **HS_CLIENT_REND** client side hidden service rendezvous circuit **HS_SERVICE_INTRO** server side introduction point for a hidden service circuit **HS_SERVICE_REND** server side hidden service rendezvous circuit **TESTING** testing to see if we're reachable, so we can be used as a relay **CONTROLLER** circuit that was built by a controller **MEASURE_TIMEOUT** circuit being kept around to see how long it takes ==================== =========== .. data:: CircClosureReason (enum) Reason that a circuit is being closed or failed to be established. Tor may provide reasons not in this enum. ========================= =========== CircClosureReason Description ========================= =========== **NONE** no reason given **TORPROTOCOL** violation in the tor protocol **INTERNAL** internal error **REQUESTED** requested by the client via a TRUNCATE command **HIBERNATING** relay is currently hibernating **RESOURCELIMIT** relay is out of memory, sockets, or circuit IDs **CONNECTFAILED** unable to contact the relay **OR_IDENTITY** relay had the wrong OR identification **OR_CONN_CLOSED** connection failed after being established **FINISHED** circuit has expired (see tor's MaxCircuitDirtiness config option) **TIMEOUT** circuit construction timed out **DESTROYED** circuit unexpectedly closed **NOPATH** not enough relays to make a circuit **NOSUCHSERVICE** requested hidden service does not exist **MEASUREMENT_EXPIRED** same as **TIMEOUT** except that it was left open for measurement purposes ========================= =========== .. data:: CircEvent (enum) Type of change reflected in a circuit by a CIRC_MINOR event. Tor may provide event types not in this enum. ===================== =========== CircEvent Description ===================== =========== **PURPOSE_CHANGED** circuit purpose or hidden service state has changed **CANNIBALIZED** circuit connections are being reused for a different circuit ===================== =========== .. data:: HiddenServiceState (enum) State that a hidden service circuit can have. These were introduced in tor version 0.2.3.11. Tor may provide states not in this enum. Enumerations fall into four groups based on their prefix... ======= =========== Prefix Description ======= =========== HSCI_* client-side introduction-point HSCR_* client-side rendezvous-point HSSI_* service-side introduction-point HSSR_* service-side rendezvous-point ======= =========== ============================= =========== HiddenServiceState Description ============================= =========== **HSCI_CONNECTING** connecting to the introductory point **HSCI_INTRO_SENT** sent INTRODUCE1 and awaiting a reply **HSCI_DONE** received a reply, circuit is closing **HSCR_CONNECTING** connecting to the introductory point **HSCR_ESTABLISHED_IDLE** rendezvous-point established, awaiting an introduction **HSCR_ESTABLISHED_WAITING** introduction received, awaiting a rend **HSCR_JOINED** connected to the hidden service **HSSI_CONNECTING** connecting to the introductory point **HSSI_ESTABLISHED** established introductory point **HSSR_CONNECTING** connecting to the introductory point **HSSR_JOINED** connected to the rendezvous-point ============================= =========== .. data:: RelayEndReason (enum) Reasons why the stream is to be closed. =================== =========== RelayEndReason Description =================== =========== **MISC** none of the following reasons **RESOLVEFAILED** unable to resolve the hostname **CONNECTREFUSED** remote host refused the connection **EXITPOLICY** OR refuses to connect to the destination **DESTROY** circuit is being shut down **DONE** connection has been closed **TIMEOUT** connection timed out **NOROUTE** routing error while contacting the destination **HIBERNATING** relay is temporarily hibernating **INTERNAL** internal error at the relay **RESOURCELIMIT** relay has insufficient resources to service the request **CONNRESET** connection was unexpectedly reset **TORPROTOCOL** violation in the tor protocol **NOTDIRECTORY** directory information requested from a relay that isn't mirroring it =================== =========== .. data:: StreamStatus (enum) State that a stream going through tor can have. Tor may provide states not in this enum. ================= =========== StreamStatus Description ================= =========== **NEW** request for a new connection **NEWRESOLVE** request to resolve an address **REMAP** address is being re-mapped to another **SENTCONNECT** sent a connect cell along a circuit **SENTRESOLVE** sent a resolve cell along a circuit **SUCCEEDED** stream has been established **FAILED** stream is detached, and won't be re-established **DETACHED** stream is detached, but might be re-established **CLOSED** stream has closed ================= =========== .. data:: StreamClosureReason (enum) Reason that a stream is being closed or failed to be established. This includes all values in the :data:`~stem.RelayEndReason` enumeration as well as the following. Tor may provide reasons not in this enum. ===================== =========== StreamClosureReason Description ===================== =========== **END** endpoint has sent a RELAY_END cell **PRIVATE_ADDR** endpoint was a private address (127.0.0.1, 10.0.0.1, etc) ===================== =========== .. data:: StreamSource (enum) Cause of a stream being remapped to another address. Tor may provide sources not in this enum. ============= =========== StreamSource Description ============= =========== **CACHE** tor is remapping because of a cached answer **EXIT** exit relay requested the remap ============= =========== .. data:: StreamPurpose (enum) Purpsoe of the stream. This is only provided with new streams and tor may provide purposes not in this enum. ================= =========== StreamPurpose Description ================= =========== **DIR_FETCH** fetching directory information (descriptors, consensus, etc) **DIR_UPLOAD** uploading our descriptor to an authority **DNS_REQUEST** user initiated DNS request **DIRPORT_TEST** checking that our directory port is reachable externally **USER** either relaying user traffic or not one of the above categories ================= =========== .. data:: ORStatus (enum) State that an OR connection can have. Tor may provide states not in this enum. =============== =========== ORStatus Description =============== =========== **NEW** received OR connection, starting server-side handshake **LAUNCHED** launched outbound OR connection, starting client-side handshake **CONNECTED** OR connection has been established **FAILED** attempt to establish OR connection failed **CLOSED** OR connection has been closed =============== =========== .. data:: ORClosureReason (enum) Reason that an OR connection is being closed or failed to be established. Tor may provide reasons not in this enum. =================== =========== ORClosureReason Description =================== =========== **DONE** OR connection shut down cleanly **CONNECTREFUSED** got a ECONNREFUSED when connecting to the relay **IDENTITY** identity of the relay wasn't what we expected **CONNECTRESET** got a ECONNRESET or similar error from relay **TIMEOUT** got a ETIMEOUT or similar error from relay **NOROUTE** got a ENOTCONN, ENETUNREACH, ENETDOWN, EHOSTUNREACH, or similar error from relay **IOERROR** got a different kind of error from relay **RESOURCELIMIT** relay has insufficient resources to service the request **MISC** connection refused for another reason **PT_MISSING** no pluggable transport was available =================== =========== .. data:: AuthDescriptorAction (enum) Actions that directory authorities might take with relay descriptors. Tor may provide reasons not in this enum. ===================== =========== AuthDescriptorAction Description ===================== =========== **ACCEPTED** accepting the descriptor as the newest version **DROPPED** descriptor rejected without notifying the relay **REJECTED** relay notified that its descriptor has been rejected ===================== =========== .. data:: StatusType (enum) Sources for tor status events. Tor may provide types not in this enum. ============= =========== StatusType Description ============= =========== **GENERAL** general tor activity, not specifically as a client or relay **CLIENT** related to our activity as a tor client **SERVER** related to our activity as a tor relay ============= =========== .. data:: GuardType (enum) Use a guard relay can be for. Tor may provide types not in this enum. =========== =========== GuardType Description =========== =========== **ENTRY** used to connect to the tor network =========== =========== .. data:: GuardStatus (enum) Status a guard relay can have. Tor may provide types not in this enum. ============= =========== GuardStatus Description ============= =========== **NEW** new guard that we weren't previously using **DROPPED** removed from use as one of our guards **UP** guard is now reachable **DOWN** guard is now unreachable **BAD** consensus or relay considers this relay to be unusable as a guard **GOOD** consensus or relay considers this relay to be usable as a guard ============= =========== .. data:: TimeoutSetType (enum) Way in which the timeout value of a circuit is changing. Tor may provide types not in this enum. =============== =========== TimeoutSetType Description =============== =========== **COMPUTED** tor has computed a new timeout based on prior circuits **RESET** timeout reverted to its default **SUSPENDED** timeout reverted to its default until network connectivity has recovered **DISCARD** throwing out timeout value from when the network was down **RESUME** resumed calculations to determine the proper timeout =============== =========== .. data:: ConnectionType (enum) Purpose for a tor connection. Tor may provide types not in this enum. The meaning behind these values is a bit unclear, pending :trac:`10086`. .. versionadded:: 1.2.0 =============== =========== ConnectionType Description =============== =========== **OR** carrying traffic within the tor network **DIR** fetching or sending tor descriptor data **EXIT** carrying traffic between the tor network and an external destination =============== =========== .. data:: TokenBucket (enum) Bucket categories of TB_EMPTY events. .. versionadded:: 1.2.0 =============== =========== TokenBucket Description =============== =========== **GLOBAL** global token bucket **RELAY** relay token bucket **ORCONN** bucket used for OR connections =============== =========== .. data:: HSDescAction (enum) Action beeing taken in a HS_DESC event. .. versionadded:: 1.2.0 .. versionchanged:: 1.4.0 Added the UPLOAD and UPLOADED actions. .. versionchanged:: 1.5.0 Added the CREATED action. =============== =========== HSDescAction Description =============== =========== **REQUESTED** uncached hidden service descriptor is being requested **UPLOAD** descriptor is being uploaded with HSPOST **RECEIVED** hidden service descriptor has been retrieved **UPLOADED** descriptor was uploaded with HSPOST **IGNORE** fetched descriptor was ignored because we already have its v0 descriptor **FAILED** we were unable to retrieve the descriptor **CREATED** hidden service descriptor was just created =============== =========== .. data:: HSDescReason (enum) Reason for the hidden service descriptor to fail to be fetched. .. versionadded:: 1.3.0 .. versionchanged:: 1.4.0 Added the UPLOAD_REJECTED reason. .. versionchanged:: 1.6.0 Added the QUERY_NO_HSDIR reason. =================== =========== HSDescReason Description =================== =========== **BAD_DESC** descriptor was unparseable **QUERY_REJECTED** hidden service directory refused to provide the descriptor **UPLOAD_REJECTED** descriptor was rejected by the hidden service directory **NOT_FOUND** descriptor with the given identifier wasn't found **QUERY_NO_HSDIR** no hidden service directory was found **UNEXPECTED** failure type is unknown =================== =========== .. data:: HSAuth (enum) Type of authentication being used for a HS_DESC event. .. versionadded:: 1.2.0 ================= =========== HSAuth Description ================= =========== **NO_AUTH** no authentication **BASIC_AUTH** general hidden service authentication **STEALTH_AUTH** authentication method that hides service activity from unauthorized clients **UNKNOWN** unrecognized method of authentication ================= =========== """ import stem.util import stem.util.enum __version__ = '1.7.1' __author__ = 'Damian Johnson' __contact__ = 'atagar@torproject.org' __url__ = 'https://stem.torproject.org/' __license__ = 'LGPLv3' __all__ = [ 'client', 'descriptor', 'response', 'util', 'connection', 'control', 'directory', 'exit_policy', 'prereq', 'process', 'socket', 'version', 'ControllerError', 'ProtocolError', 'OperationFailed', 'UnsatisfiableRequest', 'CircuitExtensionFailed', 'DescriptorUnavailable', 'Timeout', 'InvalidRequest', 'InvalidArguments', 'SocketError', 'SocketClosed', 'Runlevel', 'Signal', 'Flag', 'CircStatus', 'CircBuildFlag', 'CircPurpose', 'CircClosureReason', 'CircEvent', 'HiddenServiceState', 'HSAuth', 'HSDescAction', 'HSDescReason', 'RelayEndReason', 'StreamStatus', 'StreamClosureReason', 'StreamSource', 'StreamPurpose', 'ORStatus', 'ORClosureReason', 'AuthDescriptorAction', 'StatusType', 'GuardType', 'GuardStatus', 'TimeoutSetType', ] # Constant that we use by default for our User-Agent when downloading descriptors stem.USER_AGENT = 'Stem/%s' % __version__ # Constant to indicate an undefined argument default. Usually we'd use None for # this, but users will commonly provide None as the argument so need something # else fairly unique... UNDEFINED = '' class Endpoint(object): """ Tor endpint that can be connected to. .. versionadded:: 1.7.0 :var str address: ip address of the endpoint :var int port: port of the endpoint """ def __init__(self, address, port): if not stem.util.connection.is_valid_ipv4_address(address) and not stem.util.connection.is_valid_ipv6_address(address): raise ValueError("'%s' isn't a valid IPv4 or IPv6 address" % address) elif not stem.util.connection.is_valid_port(port): raise ValueError("'%s' isn't a valid port" % port) self.address = address self.port = int(port) def __hash__(self): return stem.util._hash_attr(self, 'address', 'port', cache = True) def __eq__(self, other): return hash(self) == hash(other) if isinstance(other, Endpoint) else False def __ne__(self, other): return not self == other class ORPort(Endpoint): """ Tor relay's ORPort. The endpoint on which Tor accepts relay traffic. :var list link_protocols: link protocol version we're willing to establish """ def __init__(self, address, port, link_protocols = None): super(ORPort, self).__init__(address, port) self.link_protocols = link_protocols def __hash__(self): return stem.util._hash_attr(self, 'link_protocols', parent = Endpoint, cache = True) class DirPort(Endpoint): """ Tor relay's DirPort. The endpoint on which Tor provides http access for downloading descriptors. """ class ControllerError(Exception): 'Base error for controller communication issues.' class ProtocolError(ControllerError): 'Malformed content from the control socket.' class OperationFailed(ControllerError): """ Base exception class for failed operations that return an error code :var str code: error code returned by Tor :var str message: error message returned by Tor or a human readable error message """ def __init__(self, code = None, message = None): super(ControllerError, self).__init__(message) self.code = code self.message = message class UnsatisfiableRequest(OperationFailed): """ Exception raised if Tor was unable to process our request. """ class CircuitExtensionFailed(UnsatisfiableRequest): """ An attempt to create or extend a circuit failed. :var stem.response.CircuitEvent circ: response notifying us of the failure """ def __init__(self, message, circ = None): super(CircuitExtensionFailed, self).__init__(message = message) self.circ = circ class DescriptorUnavailable(UnsatisfiableRequest): """ Tor was unable to provide a descriptor for the given relay. .. versionchanged:: 1.7.0 Subclassed under UnsatisfiableRequest rather than OperationFailed. """ def __init__(self, message): super(DescriptorUnavailable, self).__init__(message = message) class Timeout(UnsatisfiableRequest): """ Timeout requested by the caller was reached. .. versionadded:: 1.7.0 """ def __init__(self, message): super(Timeout, self).__init__(message = message) class InvalidRequest(OperationFailed): """ Exception raised when the request was invalid or malformed. """ class InvalidArguments(InvalidRequest): """ Exception class for requests which had invalid arguments. :var str code: error code returned by Tor :var str message: error message returned by Tor or a human readable error message :var list arguments: a list of arguments which were invalid """ def __init__(self, code = None, message = None, arguments = None): super(InvalidArguments, self).__init__(code, message) self.arguments = arguments class SocketError(ControllerError): 'Error arose while communicating with the control socket.' class SocketClosed(SocketError): 'Control socket was closed before completing the message.' Runlevel = stem.util.enum.UppercaseEnum( 'DEBUG', 'INFO', 'NOTICE', 'WARN', 'ERR', ) Flag = stem.util.enum.Enum( ('AUTHORITY', 'Authority'), ('BADEXIT', 'BadExit'), ('BADDIRECTORY', 'BadDirectory'), ('EXIT', 'Exit'), ('FAST', 'Fast'), ('GUARD', 'Guard'), ('HSDIR', 'HSDir'), ('NAMED', 'Named'), ('NO_ED_CONSENSUS', 'NoEdConsensus'), ('RUNNING', 'Running'), ('STABLE', 'Stable'), ('UNNAMED', 'Unnamed'), ('V2DIR', 'V2Dir'), ('V3DIR', 'V3Dir'), ('VALID', 'Valid'), ) Signal = stem.util.enum.UppercaseEnum( 'RELOAD', 'HUP', 'SHUTDOWN', 'INT', 'DUMP', 'USR1', 'DEBUG', 'USR2', 'HALT', 'TERM', 'NEWNYM', 'CLEARDNSCACHE', 'HEARTBEAT', ) CircStatus = stem.util.enum.UppercaseEnum( 'LAUNCHED', 'BUILT', 'GUARD_WAIT', 'EXTENDED', 'FAILED', 'CLOSED', ) CircBuildFlag = stem.util.enum.UppercaseEnum( 'ONEHOP_TUNNEL', 'IS_INTERNAL', 'NEED_CAPACITY', 'NEED_UPTIME', ) CircPurpose = stem.util.enum.UppercaseEnum( 'GENERAL', 'HS_CLIENT_INTRO', 'HS_CLIENT_REND', 'HS_SERVICE_INTRO', 'HS_SERVICE_REND', 'TESTING', 'CONTROLLER', 'MEASURE_TIMEOUT', ) CircClosureReason = stem.util.enum.UppercaseEnum( 'NONE', 'TORPROTOCOL', 'INTERNAL', 'REQUESTED', 'HIBERNATING', 'RESOURCELIMIT', 'CONNECTFAILED', 'OR_IDENTITY', 'OR_CONN_CLOSED', 'FINISHED', 'TIMEOUT', 'DESTROYED', 'NOPATH', 'NOSUCHSERVICE', 'MEASUREMENT_EXPIRED', ) CircEvent = stem.util.enum.UppercaseEnum( 'PURPOSE_CHANGED', 'CANNIBALIZED', ) HiddenServiceState = stem.util.enum.UppercaseEnum( 'HSCI_CONNECTING', 'HSCI_INTRO_SENT', 'HSCI_DONE', 'HSCR_CONNECTING', 'HSCR_ESTABLISHED_IDLE', 'HSCR_ESTABLISHED_WAITING', 'HSCR_JOINED', 'HSSI_CONNECTING', 'HSSI_ESTABLISHED', 'HSSR_CONNECTING', 'HSSR_JOINED', ) RelayEndReason = stem.util.enum.UppercaseEnum( 'MISC', 'RESOLVEFAILED', 'CONNECTREFUSED', 'EXITPOLICY', 'DESTROY', 'DONE', 'TIMEOUT', 'NOROUTE', 'HIBERNATING', 'INTERNAL', 'RESOURCELIMIT', 'CONNRESET', 'TORPROTOCOL', 'NOTDIRECTORY', ) StreamStatus = stem.util.enum.UppercaseEnum( 'NEW', 'NEWRESOLVE', 'REMAP', 'SENTCONNECT', 'SENTRESOLVE', 'SUCCEEDED', 'FAILED', 'DETACHED', 'CLOSED', ) # StreamClosureReason is a superset of RelayEndReason StreamClosureReason = stem.util.enum.UppercaseEnum(*(RelayEndReason.keys() + [ 'END', 'PRIVATE_ADDR', ])) StreamSource = stem.util.enum.UppercaseEnum( 'CACHE', 'EXIT', ) StreamPurpose = stem.util.enum.UppercaseEnum( 'DIR_FETCH', 'DIR_UPLOAD', 'DNS_REQUEST', 'DIRPORT_TEST', 'USER', ) ORStatus = stem.util.enum.UppercaseEnum( 'NEW', 'LAUNCHED', 'CONNECTED', 'FAILED', 'CLOSED', ) ORClosureReason = stem.util.enum.UppercaseEnum( 'DONE', 'CONNECTREFUSED', 'IDENTITY', 'CONNECTRESET', 'TIMEOUT', 'NOROUTE', 'IOERROR', 'RESOURCELIMIT', 'MISC', 'PT_MISSING', ) AuthDescriptorAction = stem.util.enum.UppercaseEnum( 'ACCEPTED', 'DROPPED', 'REJECTED', ) StatusType = stem.util.enum.UppercaseEnum( 'GENERAL', 'CLIENT', 'SERVER', ) GuardType = stem.util.enum.UppercaseEnum( 'ENTRY', ) GuardStatus = stem.util.enum.UppercaseEnum( 'NEW', 'UP', 'DOWN', 'BAD', 'GOOD', 'DROPPED', ) TimeoutSetType = stem.util.enum.UppercaseEnum( 'COMPUTED', 'RESET', 'SUSPENDED', 'DISCARD', 'RESUME', ) ConnectionType = stem.util.enum.UppercaseEnum( 'OR', 'DIR', 'EXIT', ) TokenBucket = stem.util.enum.UppercaseEnum( 'GLOBAL', 'RELAY', 'ORCONN', ) HSDescAction = stem.util.enum.UppercaseEnum( 'REQUESTED', 'UPLOAD', 'RECEIVED', 'UPLOADED', 'IGNORE', 'FAILED', 'CREATED', ) HSDescReason = stem.util.enum.UppercaseEnum( 'BAD_DESC', 'QUERY_REJECTED', 'UPLOAD_REJECTED', 'NOT_FOUND', 'QUERY_NO_HSDIR', 'UNEXPECTED', ) HSAuth = stem.util.enum.UppercaseEnum( 'NO_AUTH', 'BASIC_AUTH', 'STEALTH_AUTH', 'UNKNOWN', ) import stem.util.connection # importing afterward to avoid circular dependency stem-1.7.1/stem/settings.cfg0000664000175000017500000007505113355716034016522 0ustar atagaratagar00000000000000################################################################################ # # Information related to tor configuration options and events... # # * manual.important Most commonly used configuration options. # * manual.summary Short summary describing the option. # * event.description Descriptions for the events. # ################################################################################ manual.important BandwidthRate manual.important BandwidthBurst manual.important RelayBandwidthRate manual.important RelayBandwidthBurst manual.important ControlPort manual.important HashedControlPassword manual.important CookieAuthentication manual.important DataDirectory manual.important Log manual.important RunAsDaemon manual.important User manual.important Bridge manual.important ExcludeNodes manual.important MaxCircuitDirtiness manual.important SocksPort manual.important UseBridges manual.important BridgeRelay manual.important ContactInfo manual.important ExitPolicy manual.important MyFamily manual.important Nickname manual.important ORPort manual.important AccountingMax manual.important AccountingStart manual.important DirPortFrontPage manual.important DirPort manual.important HiddenServiceDir manual.important HiddenServicePort # General Config Options manual.summary.BandwidthRate Average bandwidth usage limit manual.summary.BandwidthBurst Maximum bandwidth usage limit manual.summary.MaxAdvertisedBandwidth Limit for the bandwidth we advertise as being available for relaying manual.summary.RelayBandwidthRate Average bandwidth usage limit for relaying manual.summary.RelayBandwidthBurst Maximum bandwidth usage limit for relaying manual.summary.PerConnBWRate Average relayed bandwidth limit per connection manual.summary.PerConnBWBurst Maximum relayed bandwidth limit per connection manual.summary.ClientTransportPlugin Proxy when establishing bridge connections manual.summary.ServerTransportPlugin Proxy when servicing bridge connections manual.summary.ServerTransportListenAddr Endpoint for bridge's pluggable transport proxy manual.summary.ServerTransportOptions Additional arguments for bridge's proxy manual.summary.ExtORPort Endpoint for extended ORPort connections manual.summary.ExtORPortCookieAuthFile Location of the ExtORPort's authentication cookie manual.summary.ExtORPortCookieAuthFileGroupReadable Group read permissions for the ExtORPort's authentication cookie manual.summary.ConnLimit Minimum number of file descriptors for Tor to start manual.summary.DisableNetwork Don't accept non-controller connections manual.summary.ConstrainedSockets Shrinks sockets to ConstrainedSockSize manual.summary.ConstrainedSockSize Limit for the received and transmit buffers of sockets manual.summary.ControlPort Port providing access to tor controllers (nyx, vidalia, etc) manual.summary.ControlSocket Socket providing controller access manual.summary.ControlSocketsGroupWritable Group read permissions for the control socket manual.summary.HashedControlPassword Hash of the password for authenticating to the control port manual.summary.CookieAuthentication If set, authenticates controllers via a cookie manual.summary.CookieAuthFile Location of the authentication cookie manual.summary.CookieAuthFileGroupReadable Group read permissions for the authentication cookie manual.summary.ControlPortWriteToFile Path for a file tor writes containing its control port manual.summary.ControlPortFileGroupReadable Group read permissions for the control port file manual.summary.DataDirectory Location for storing runtime data (state, keys, etc) manual.summary.DataDirectoryGroupReadable Group read permissions for the data directory manual.summary.CacheDirectory Directory where information is cached manual.summary.CacheDirectoryGroupReadable Group read permissions for the cache directory manual.summary.FallbackDir Fallback when unable to retrieve descriptor information manual.summary.UseDefaultFallbackDirs Use hard-coded fallback directory authorities when needed manual.summary.DirAuthority Alternative directory authorities manual.summary.DirAuthorityFallbackRate Rate at which to use fallback directory manual.summary.AlternateDirAuthority Alternative directory authorities (consensus only) manual.summary.AlternateBridgeAuthority Alternative directory authorities (bridges only) manual.summary.DisableAllSwap Locks all allocated memory so they can't be paged out manual.summary.DisableDebuggerAttachment Limit information applications can retrieve about the process manual.summary.FetchDirInfoEarly Keeps consensus information up to date, even if unnecessary manual.summary.FetchDirInfoExtraEarly Updates consensus information when it's first available manual.summary.FetchHidServDescriptors Toggles if hidden service descriptors are fetched automatically or not manual.summary.FetchServerDescriptors Toggles if the consensus is fetched automatically or not manual.summary.FetchUselessDescriptors Toggles if relay descriptors are fetched when they aren't strictly necessary manual.summary.HTTPProxy HTTP proxy for connecting to tor manual.summary.HTTPProxyAuthenticator Authentication credentials for HTTPProxy manual.summary.HTTPSProxy SSL proxy for connecting to tor manual.summary.HTTPSProxyAuthenticator Authentication credentials for HTTPSProxy manual.summary.Sandbox Run within a syscall sandbox manual.summary.Socks4Proxy SOCKS 4 proxy for connecting to tor manual.summary.Socks5Proxy SOCKS 5 for connecting to tor manual.summary.Socks5ProxyUsername Username for connecting to the Socks5Proxy manual.summary.Socks5ProxyPassword Password for connecting to the Socks5Proxy manual.summary.UnixSocksGroupWritable Group write permissions for the socks socket manual.summary.KeepalivePeriod Rate at which to send keepalive packets manual.summary.Log Runlevels and location for tor logging manual.summary.LogMessageDomains Includes a domain when logging messages manual.summary.MaxUnparseableDescSizeToLog Size of the dedicated log for unparseable descriptors manual.summary.OutboundBindAddress Sets the IP used for connecting to tor manual.summary.OutboundBindAddressOR Make outbound non-exit connections originate from this address manual.summary.OutboundBindAddressExit Make outbound exit connections originate from this address manual.summary.PidFile Path for a file tor writes containing its process id manual.summary.ProtocolWarnings Toggles if protocol errors give warnings or not manual.summary.RunAsDaemon Toggles if tor runs as a daemon process manual.summary.LogTimeGranularity limits granularity of log message timestamps manual.summary.TruncateLogFile Overwrites log file rather than appending when restarted manual.summary.SyslogIdentityTag Tag logs appended to the syslog as being from tor manual.summary.AndroidIdentityTag Tag when logging to android subsystem manual.summary.SafeLogging Toggles if logs are scrubbed of sensitive information manual.summary.User UID for the process when started manual.summary.KeepBindCapabilities Retain permission for binding to low valued ports manual.summary.HardwareAccel Toggles if tor attempts to use hardware acceleration manual.summary.AccelName OpenSSL engine name for crypto acceleration manual.summary.AccelDir Crypto acceleration library path manual.summary.AvoidDiskWrites Toggles if tor avoids frequently writing to disk manual.summary.CircuitPriorityHalflife Overwrite method for prioritizing traffic among relayed connections manual.summary.CountPrivateBandwidth Applies rate limiting to private IP addresses manual.summary.ExtendByEd25519ID Include Ed25519 identifier when extending circuits manual.summary.NoExec Prevents any launch of other executables manual.summary.Schedulers Scheduling algorithm by which to send outbound data manual.summary.KISTSchedRunInterval Scheduling interval if using KIST manual.summary.KISTSockBufSizeFactor Multiplier for per-socket limit if using KIST # Client Config Options manual.summary.Bridge Available bridges manual.summary.LearnCircuitBuildTimeout Toggles adaptive timeouts for circuit creation manual.summary.CircuitBuildTimeout Initial timeout for circuit creation manual.summary.CircuitsAvailableTimeout Time to keep circuits open and unused for manual.summary.CircuitStreamTimeout Timeout for shifting streams among circuits manual.summary.ClientOnly Ensures that we aren't used as a relay or directory mirror manual.summary.ConnectionPadding Pad traffic to help prevent correlation attacks manual.summary.ReducedConnectionPadding Reduce padding and increase circuit cycling for low bandidth connections manual.summary.ExcludeNodes Relays or locales never to be used in circuits manual.summary.ExcludeExitNodes Relays or locales never to be used for exits manual.summary.GeoIPExcludeUnknown Don't use relays with an unknown locale in circuits manual.summary.ExitNodes Preferred final hop for circuits manual.summary.EntryNodes Preferred first hops for circuits manual.summary.StrictNodes Never uses notes outside of Entry/ExitNodes manual.summary.FascistFirewall Only make outbound connections on FirewallPorts manual.summary.FirewallPorts Ports used by FascistFirewall manual.summary.HidServAuth Authentication credentials for connecting to a hidden service manual.summary.ClientOnionAuthDir Path containing hidden service authorization files manual.summary.ReachableAddresses Rules for bypassing the local firewall manual.summary.ReachableDirAddresses Rules for bypassing the local firewall (directory fetches) manual.summary.ReachableORAddresses Rules for bypassing the local firewall (OR connections) manual.summary.LongLivedPorts Ports requiring highly reliable relays manual.summary.MapAddress Alias mappings for address requests manual.summary.NewCircuitPeriod Period for considering the creation of new circuits manual.summary.MaxCircuitDirtiness Duration for reusing constructed circuits manual.summary.MaxClientCircuitsPending Number of circuits that can be in construction at once manual.summary.NodeFamily Define relays as belonging to a family manual.summary.EnforceDistinctSubnets Prevent use of multiple relays from the same subnet on a circuit manual.summary.SocksPort Port for using tor as a Socks proxy manual.summary.SocksPolicy Access policy for the pocks port manual.summary.SocksTimeout Time until idle or unestablished socks connections are closed manual.summary.TokenBucketRefillInterval Frequency at which exhausted connections are checked for new traffic manual.summary.TrackHostExits Maintains use of the same exit whenever connecting to this destination manual.summary.TrackHostExitsExpire Time until use of an exit for tracking expires manual.summary.UpdateBridgesFromAuthority Toggles fetching bridge descriptors from the authorities manual.summary.UseBridges Make use of configured bridges manual.summary.UseEntryGuards Use guard relays for first hop manual.summary.GuardfractionFile File containing information with duration of our guards manual.summary.UseGuardFraction Take guardfraction into account for path selection manual.summary.NumEntryGuards Pool size of guard relays we'll select from manual.summary.NumPrimaryGuards Pool size of strongly preferred guard relays we'll select from manual.summary.NumDirectoryGuards Pool size of directory guards we'll select from manual.summary.GuardLifetime Minimum time to keep entry guards manual.summary.SafeSocks Toggles rejecting unsafe variants of the socks protocol manual.summary.TestSocks Provide notices for if socks connections are of the safe or unsafe variants manual.summary.VirtualAddrNetworkIPv4 IPv4 address range to use when needing a virtual address manual.summary.VirtualAddrNetworkIPv6 IPv6 address range to use when needing a virtual address manual.summary.AllowNonRFC953Hostnames Toggles blocking invalid characters in hostname resolution manual.summary.HTTPTunnelPort Port on which to allow 'HTTP CONNECT' connections manual.summary.TransPort Port for transparent proxying if the OS supports it manual.summary.TransProxyType Proxy type to be used manual.summary.NATDPort Port for forwarding ipfw NATD connections manual.summary.AutomapHostsOnResolve Map addresses ending with special suffixes to virtual addresses manual.summary.AutomapHostsSuffixes Address suffixes recognized by AutomapHostsOnResolve manual.summary.DNSPort Port from which DNS responses are fetched instead of tor manual.summary.ClientDNSRejectInternalAddresses Disregards anonymous DNS responses for internal addresses manual.summary.ClientRejectInternalAddresses Disables use of Tor for internal connections manual.summary.DownloadExtraInfo Toggles fetching of extra information about relays manual.summary.WarnPlaintextPorts Toggles warnings for using risky ports manual.summary.RejectPlaintextPorts Prevents connections on risky ports manual.summary.OptimisticData Use exits without confirmation that prior connections succeeded manual.summary.HSLayer2Nodes permissible relays for the second hop of HS circuits manual.summary.HSLayer3Nodes permissible relays for the third hop of HS circuits manual.summary.UseMicrodescriptors Retrieve microdescriptors rather than server descriptors manual.summary.PathBiasCircThreshold Number of circuits through a guard before applying bias checks manual.summary.PathBiasNoticeRate Fraction of circuits that must succeed before logging a notice manual.summary.PathBiasWarnRate Fraction of circuits that must succeed before logging a warning manual.summary.PathBiasExtremeRate Fraction of circuits that must succeed before logging an error manual.summary.PathBiasDropGuards Drop guards failing to establish circuits manual.summary.PathBiasScaleThreshold Circuits through a guard before scaling past observations down manual.summary.PathBiasUseThreshold Number of streams through a circuit before applying bias checks manual.summary.PathBiasNoticeUseRate Fraction of streams that must succeed before logging a notice manual.summary.PathBiasExtremeUseRate Fraction of streams that must succeed before logging an error manual.summary.PathBiasScaleUseThreshold Streams through a circuit before scaling past observations down manual.summary.ClientUseIPv4 Allow IPv4 connections to guards and fetching consensus manual.summary.ClientUseIPv6 Allow IPv6 connections to guards and fetching consensus manual.summary.ClientPreferIPv6DirPort Perfer relays with IPv6 when fetching consensus manual.summary.ClientPreferIPv6ORPort Prefer a guard's IPv6 rather than IPv4 endpoint manual.summary.PathsNeededToBuildCircuits Portion of relays to require information for before making circuits manual.summary.ClientBootstrapConsensusAuthorityDownloadInitialDelay Delay when bootstrapping before downloading descriptors from authorities manual.summary.ClientBootstrapConsensusFallbackDownloadInitialDelay Delay when bootstrapping before downloading descriptors from fallbacks manual.summary.ClientBootstrapConsensusAuthorityOnlyDownloadInitialDelay Delay when bootstrapping before downloading descriptors from authorities if fallbacks disabled manual.summary.ClientBootstrapConsensusMaxInProgressTries Descriptor documents that can be downloaded in parallel manual.summary.ClientBootstrapConsensusMaxInProgressTries Number of consensus download requests to allow in-flight at once # Server Config Options manual.summary.Address Overwrites address others will use to reach this relay manual.summary.AssumeReachable Skips reachability test at startup manual.summary.BridgeRelay Act as a bridge manual.summary.BridgeDistribution Distribution method BrideDB should provide our address by manual.summary.ContactInfo Contact information for this relay manual.summary.ExitRelay Allow relaying of exit traffic manual.summary.ExitPolicy Traffic destinations that can exit from this relay manual.summary.ExitPolicyRejectPrivate Prevent exiting on the local network manual.summary.ExitPolicyRejectLocalInterfaces More extensive prevention of exiting on the local network manual.summary.ReducedExitPolicy Customized reduced exit policy manual.summary.IPv6Exit Allow clients to use us for IPv6 traffic manual.summary.MaxOnionQueueDelay Duration to reject new onionskins if we have more than we can process manual.summary.MyFamily Other relays this operator administers manual.summary.Nickname Identifier for this relay manual.summary.NumCPUs Number of processes spawned for decryption manual.summary.ORPort Port used to accept relay traffic manual.summary.PublishServerDescriptor Types of descriptors published manual.summary.ShutdownWaitLength Delay before quitting after receiving a SIGINT signal manual.summary.SSLKeyLifetime Lifetime for our link certificate manual.summary.HeartbeatPeriod Rate at which an INFO level heartbeat message is sent manual.summary.MainloopStats Include development information from the main loop with heartbeats manual.summary.AccountingMax Amount of traffic before hibernating manual.summary.AccountingRule Method to determine when the accounting limit is reached manual.summary.AccountingStart Duration of an accounting period manual.summary.RefuseUnknownExits Prevents relays not in the consensus from using us as an exit manual.summary.ServerDNSResolvConfFile Overriding resolver config for DNS queries we provide manual.summary.ServerDNSAllowBrokenConfig Toggles if we persist despite configuration parsing errors or not manual.summary.ServerDNSSearchDomains Toggles if our DNS queries search for addresses in the local domain manual.summary.ServerDNSDetectHijacking Toggles testing for DNS hijacking manual.summary.ServerDNSTestAddresses Addresses to test to see if valid DNS queries are being hijacked manual.summary.ServerDNSAllowNonRFC953Hostnames Toggles if we reject DNS queries with invalid characters manual.summary.BridgeRecordUsageByCountry Tracks geoip information on bridge usage manual.summary.ServerDNSRandomizeCase Toggles DNS query case randomization manual.summary.GeoIPFile Path to file containing IPv4 geoip information manual.summary.GeoIPv6File Path to file containing IPv6 geoip information manual.summary.CellStatistics Toggles storing circuit queue duration to disk manual.summary.PaddingStatistics Toggles storing padding counts manual.summary.DirReqStatistics Toggles storing network status counts and performance to disk manual.summary.EntryStatistics Toggles storing client connection counts to disk manual.summary.ExitPortStatistics Toggles storing traffic and port usage data to disk manual.summary.ConnDirectionStatistics Toggles storing connection use to disk manual.summary.HiddenServiceStatistics Toggles storing hidden service stats to disk manual.summary.ExtraInfoStatistics Publishes statistic data in the extra-info documents manual.summary.ExtendAllowPrivateAddresses Allow circuits to be extended to the local network manual.summary.MaxMemInQueues Threshold at which tor will terminate circuits to avoid running out of memory manual.summary.DisableOOSCheck Don't close connections when running out of sockets manual.summary.SigningKeyLifetime Duration the Ed25519 signing key is valid for manual.summary.OfflineMasterKey Don't generate the master secret key manual.summary.KeyDirectory Directory where secret keys reside manual.summary.KeyDirectoryGroupReadable Group read permissions for the secret key directory # Directory Server Options manual.summary.DirPortFrontPage Publish this html file on the DirPort manual.summary.DirPort Port for directory connections manual.summary.DirPolicy Access policy for the DirPort manual.summary.DirCache Provide cached descriptor information to other tor users manual.summary.MaxConsensusAgeForDiffs Time to generate consensus caches for # Directory Authority Server Options manual.summary.AuthoritativeDirectory Act as a directory authority manual.summary.V3AuthoritativeDirectory Generates a version 3 consensus manual.summary.VersioningAuthoritativeDirectory Provides opinions on recommended versions of tor manual.summary.RecommendedVersions Suggested versions of tor manual.summary.RecommendedPackages Suggested versions of applications other than tor manual.summary.RecommendedClientVersions Tor versions believed to be safe for clients manual.summary.BridgeAuthoritativeDir Acts as a bridge authority manual.summary.MinUptimeHidServDirectoryV2 Required uptime before accepting hidden service directory manual.summary.RecommendedServerVersions Tor versions believed to be safe for relays manual.summary.ConsensusParams Params entry of the networkstatus vote manual.summary.DirAllowPrivateAddresses Toggles allowing arbitrary input or non-public IPs in descriptors manual.summary.AuthDirBadExit Relays to be flagged as bad exits manual.summary.AuthDirInvalid Relays from which the valid flag is withheld manual.summary.AuthDirReject Relays to be dropped from the consensus manual.summary.AuthDirBadExitCCs Countries for which to flag all relays as bad exits manual.summary.AuthDirInvalidCCs Countries for which the valid flag is withheld manual.summary.AuthDirRejectCCs Countries for which relays aren't accepted into the consensus manual.summary.AuthDirListBadExits Toggles if we provide an opinion on bad exits manual.summary.AuthDirMaxServersPerAddr Limit on the number of relays accepted per ip manual.summary.AuthDirFastGuarantee Advertised rate at which the Fast flag is granted manual.summary.AuthDirGuardBWGuarantee Advertised rate necessary to be a guard manual.summary.AuthDirPinKeys Don't accept descriptors with conflicting identity keypairs manual.summary.AuthDirSharedRandomness Participates in shared randomness voting manual.summary.AuthDirTestEd25519LinkKeys Require proper Ed25519 key for the Running flag manual.summary.BridgePassword Password for requesting bridge information manual.summary.V3AuthVotingInterval Consensus voting interval manual.summary.V3AuthVoteDelay Wait time to collect votes of other authorities manual.summary.V3AuthDistDelay Wait time to collect the signatures of other authorities manual.summary.V3AuthNIntervalsValid Number of voting intervals a consensus is valid for manual.summary.V3BandwidthsFile Path to a file containing measured relay bandwidths manual.summary.V3AuthUseLegacyKey Signs consensus with both the current and legacy keys manual.summary.RephistTrackTime Discards old, unchanged reliability information manual.summary.AuthDirHasIPv6Connectivity Descriptors can be retrieved over the authority's IPv6 ORPort manual.summary.MinMeasuredBWsForAuthToIgnoreAdvertised Total measured value before advertised bandwidths are treated as unreliable # Hidden Service Options manual.summary.HiddenServiceDir Directory contents for the hidden service manual.summary.HiddenServicePort Port the hidden service is provided on manual.summary.PublishHidServDescriptors Toggles automated publishing of the hidden service to the rendezvous directory manual.summary.HiddenServiceVersion Version for published hidden service descriptors manual.summary.HiddenServiceAuthorizeClient Restricts access to the hidden service manual.summary.HiddenServiceAllowUnknownPorts Allow rendezvous circuits on unrecognized ports manual.summary.HiddenServiceExportCircuitID Exposes incoming client circuits via the given protocol manual.summary.HiddenServiceMaxStreams Maximum streams per rendezvous circuit manual.summary.HiddenServiceMaxStreamsCloseCircuit Closes rendezvous circuits that exceed the maximum number of streams manual.summary.RendPostPeriod Period at which the rendezvous service descriptors are refreshed manual.summary.HiddenServiceDirGroupReadable Group read permissions for the hidden service directory manual.summary.HiddenServiceNumIntroductionPoints Number of introduction points the hidden service will have manual.summary.HiddenServiceSingleHopMode Allow non-anonymous single hop hidden services manual.summary.HiddenServiceNonAnonymousMode Enables HiddenServiceSingleHopMode to be set # DoS Mitigation Options manual.summary.DoSCircuitCreationEnabled Enables circuit creation DoS mitigation manual.summary.DoSCircuitCreationMinConnections Connection rate when clients are a suspected DoS manual.summary.DoSCircuitCreationRate Acceptable rate for circuit creation manual.summary.DoSCircuitCreationBurst Accept burst of circuit creation up to this rate manual.summary.DoSCircuitCreationDefenseType Method for mitigating circuit creation DoS manual.summary.DoSCircuitCreationDefenseTimePeriod Duration of DoS mitigation manual.summary.DoSConnectionEnabled Enables connection DoS mitigation manual.summary.DoSConnectionMaxConcurrentCount Acceptable number of connections manual.summary.DoSConnectionDefenseType Method for mitigating connection DoS manual.summary.DoSRefuseSingleHopClientRendezvous Prevent establishment of single hop rendezvous points # Testing Network Options manual.summary.TestingTorNetwork Overrides other options to be a testing network manual.summary.TestingV3AuthInitialVotingInterval Overrides V3AuthVotingInterval for the first consensus manual.summary.TestingV3AuthInitialVoteDelay Overrides TestingV3AuthInitialVoteDelay for the first consensus manual.summary.TestingV3AuthInitialDistDelay Overrides TestingV3AuthInitialDistDelay for the first consensus manual.summary.TestingV3AuthVotingStartOffset Offset for the point at which the authority votes manual.summary.TestingAuthDirTimeToLearnReachability Delay until opinions are given about which relays are running or not manual.summary.TestingEstimatedDescriptorPropagationTime Delay before clients attempt to fetch descriptors from directory caches manual.summary.TestingMinFastFlagThreshold Minimum value for the Fast flag manual.summary.TestingServerDownloadInitialDelay Delay before downloading resources for relaying manual.summary.TestingClientDownloadInitialDelay Delay before downloading resources for client usage manual.summary.TestingServerConsensusDownloadInitialDelay Delay before downloading descriptors for relaying manual.summary.TestingClientConsensusDownloadInitialDelay Delay before downloading descriptors for client usage manual.summary.TestingBridgeDownloadInitialDelay Delay before downloading bridge descriptors manual.summary.TestingBridgeBootstrapDownloadInitialDelay Delay before downloading bridge descriptors when first started manual.summary.TestingClientMaxIntervalWithoutRequest Maximum time to wait to batch requests for missing descriptors manual.summary.TestingDirConnectionMaxStall Duration to let directory connections stall before timing out manual.summary.TestingDirAuthVoteExit Relays to give the Exit flag to manual.summary.TestingDirAuthVoteExitIsStrict Only grant the Exit flag to relays listed by TestingDirAuthVoteExit manual.summary.TestingDirAuthVoteGuard Relays to give the Guard flag to manual.summary.TestingDirAuthVoteGuardIsStrict Only grant the Guard flag to relays listed by TestingDirAuthVoteGuard manual.summary.TestingDirAuthVoteHSDir Relays to give the HSDir flag to manual.summary.TestingDirAuthVoteHSDirIsStrict Only grant the HSDir flag to relays listed by TestingDirAuthVoteHSDir manual.summary.TestingEnableConnBwEvent Allow controllers to request CONN_BW events manual.summary.TestingEnableCellStatsEvent Allow controllers to request CELL_STATS events manual.summary.TestingMinExitFlagThreshold Lower bound for assigning the Exit flag manual.summary.TestingLinkCertLifetime Duration of our ed25519 certificate manual.summary.TestingAuthKeyLifetime Duration for our ed25519 signing key manual.summary.TestingLinkKeySlop Time before expiration that we replace our ed25519 link key manual.summary.TestingAuthKeySlop Time before expiration that we replace our ed25519 authentication key manual.summary.TestingSigningKeySlop Time before expiration that we replace our ed25519 signing key # Brief description of tor events event.description.debug Logging at the debug runlevel. This is low level, high volume information about tor's internals that generally isn't useful to users. event.description.info Logging at the info runlevel. This is low level information of important internal processes. event.description.notice Logging at the notice runlevel. This runlevel and above are shown to users by default, and includes general information the user should be aware of. event.description.warn Logging at the warning runlevel. These are problems the user should be aware of. event.description.err Logging at the error runlevel. These are critical issues that may prevent tor from working properly. event.description.addrmap New address mapping for our DNS cache. event.description.authdir_newdescs Indicates we just received a new descriptor. This is only used by directory authorities. event.description.buildtimeout_set Indicates the timeout value for a circuit has changed. event.description.bw Event emitted every second with the bytes sent and received by tor. event.description.cell_stats Event emitted every second with the count of the number of cell types per circuit. event.description.circ Indicates that a circuit we've established through the tor network has been created, changed, or closed. event.description.circ_bw Event emitted every second with the bytes sent and received on a per-circuit basis. event.description.circ_minor Minor changes to our circuits, such as reuse of existing circuits for a different purpose. event.description.clients_seen Periodic summary of the countries we've seen users connect from. This is only used by bridge relays. event.description.conf_changed Indicates that our torrc configuration has changed. This could be in response to a SETCONF or RELOAD signal. event.description.conn_bw Event emitted every second with the byytes sent and received on a per-connection basis. event.description.descchanged Indicates that our descriptor has changed. event.description.guard Indicates that the set of relays we use for our initial connection into the tor network (guards) have changed. event.description.hs_desc Received a hidden service descriptor that wasn't yet cached. event.description.hs_desc_content Content of a hidden service descriptor we've fetched. event.description.network_liveness Emitted when the network becomes reachable or unreachable. event.description.newconsensus Received a new hourly consensus of relays in the tor network. event.description.newdesc Indicates that a new descriptor is available. event.description.ns Consensus information for an individual relay has changed. This could be due to receiving a new consensus or tor locally decides a relay is up or down. event.description.orconn Change in our connections as a relay. event.description.signal Indicates that tor has received and acted upon a signal being sent to its process. event.description.status_client Notification of a change in tor's state as a client (ie user). event.description.status_general Notification of a change in tor's state. event.description.status_server Notification of a change in tor's state as a relay. event.description.stream Communication over a circuit we've established. For instance, Firefox making a connection through tor. event.description.stream_bw Event emitted every second with the bytes sent and received for a specific stream. event.description.tb_empty Statistics for when token buckets are refilled. This is only used when TestingTorNetwork is set. event.description.transport_launched Emitted when a pluggable transport is launched. stem-1.7.1/stem/socket.py0000664000175000017500000006065713341474573016055 0ustar atagaratagar00000000000000# Copyright 2011-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Supports communication with sockets speaking Tor protocols. This allows us to send messages as basic strings, and receive responses as :class:`~stem.response.ControlMessage` instances. **This module only consists of low level components, and is not intended for users.** See our `tutorials <../tutorials.html>`_ and `Control Module `_ if you're new to Stem and looking to get started. With that aside, these can still be used for raw socket communication with Tor... :: import stem import stem.connection import stem.socket if __name__ == '__main__': try: control_socket = stem.socket.ControlPort(port = 9051) stem.connection.authenticate(control_socket) except stem.SocketError as exc: print 'Unable to connect to tor on port 9051: %s' % exc sys.exit(1) except stem.connection.AuthenticationFailure as exc: print 'Unable to authenticate: %s' % exc sys.exit(1) print "Issuing 'GETINFO version' query...\\n" control_socket.send('GETINFO version') print control_socket.recv() :: % python example.py Issuing 'GETINFO version' query... version=0.2.4.10-alpha-dev (git-8be6058d8f31e578) OK **Module Overview:** :: BaseSocket - Thread safe socket. |- RelaySocket - Socket for a relay's ORPort. | |- send - sends a message to the socket | +- recv - receives a response from the socket | |- ControlSocket - Socket wrapper that speaks the tor control protocol. | |- ControlPort - Control connection via a port. | |- ControlSocketFile - Control connection via a local file socket. | | | |- send - sends a message to the socket | +- recv - receives a ControlMessage from the socket | |- is_alive - reports if the socket is known to be closed |- is_localhost - returns if the socket is for the local system or not |- connection_time - timestamp when socket last connected or disconnected |- connect - connects a new socket |- close - shuts down the socket +- __enter__ / __exit__ - manages socket connection send_message - Writes a message to a control socket. recv_message - Reads a ControlMessage from a control socket. send_formatting - Performs the formatting expected from sent messages. """ from __future__ import absolute_import import re import socket import ssl import threading import time import stem.prereq import stem.response import stem.util.str_tools from stem.util import log MESSAGE_PREFIX = re.compile(b'^[a-zA-Z0-9]{3}[-+ ]') ERROR_MSG = 'Error while receiving a control message (%s): %s' # lines to limit our trace logging to, you can disable this by setting it to None TRUNCATE_LOGS = 10 # maximum number of bytes to read at a time from a relay socket MAX_READ_BUFFER_LEN = 10 * 1024 * 1024 class BaseSocket(object): """ Thread safe socket, providing common socket functionality. """ def __init__(self): self._socket, self._socket_file = None, None self._is_alive = False self._connection_time = 0.0 # time when we last connected or disconnected # Tracks sending and receiving separately. This should be safe, and doing # so prevents deadlock where we block writes because we're waiting to read # a message that isn't coming. self._send_lock = threading.RLock() self._recv_lock = threading.RLock() def is_alive(self): """ Checks if the socket is known to be closed. We won't be aware if it is until we either use it or have explicitily shut it down. In practice a socket derived from a port knows about its disconnection after failing to receive data, whereas socket file derived connections know after either sending or receiving data. This means that to have reliable detection for when we're disconnected you need to continually pull from the socket (which is part of what the :class:`~stem.control.BaseController` does). :returns: **bool** that's **True** if our socket is connected and **False** otherwise """ return self._is_alive def is_localhost(self): """ Returns if the connection is for the local system or not. :returns: **bool** that's **True** if the connection is for the local host and **False** otherwise """ return False def connection_time(self): """ Provides the unix timestamp for when our socket was either connected or disconnected. That is to say, the time we connected if we're currently connected and the time we disconnected if we're not connected. .. versionadded:: 1.3.0 :returns: **float** for when we last connected or disconnected, zero if we've never connected """ return self._connection_time def connect(self): """ Connects to a new socket, closing our previous one if we're already attached. :raises: :class:`stem.SocketError` if unable to make a socket """ with self._send_lock: # Closes the socket if we're currently attached to one. Once we're no # longer alive it'll be safe to acquire the recv lock because recv() # calls no longer block (raising SocketClosed instead). if self.is_alive(): self.close() with self._recv_lock: self._socket = self._make_socket() self._socket_file = self._socket.makefile(mode = 'rwb') self._is_alive = True self._connection_time = time.time() # It's possible for this to have a transient failure... # SocketError: [Errno 4] Interrupted system call # # It's safe to retry, so give it another try if it fails. try: self._connect() except stem.SocketError: self._connect() # single retry def close(self): """ Shuts down the socket. If it's already closed then this is a no-op. """ with self._send_lock: # Function is idempotent with one exception: we notify _close() if this # is causing our is_alive() state to change. is_change = self.is_alive() if self._socket: # if we haven't yet established a connection then this raises an error # socket.error: [Errno 107] Transport endpoint is not connected try: self._socket.shutdown(socket.SHUT_RDWR) except socket.error: pass # Suppressing unexpected exceptions from close. For instance, if the # socket's file has already been closed then with python 2.7 that raises # with... # error: [Errno 32] Broken pipe try: self._socket.close() except: pass if self._socket_file: try: self._socket_file.close() except: pass self._socket = None self._socket_file = None self._is_alive = False self._connection_time = time.time() if is_change: self._close() def _send(self, message, handler): """ Send message in a thread safe manner. Handler is expected to be of the form... :: my_handler(socket, socket_file, message) """ with self._send_lock: try: if not self.is_alive(): raise stem.SocketClosed() handler(self._socket, self._socket_file, message) except stem.SocketClosed: # if send_message raises a SocketClosed then we should properly shut # everything down if self.is_alive(): self.close() raise def _recv(self, handler): """ Receives a message in a thread safe manner. Handler is expected to be of the form... :: my_handler(socket, socket_file) """ with self._recv_lock: try: # makes a temporary reference to the _socket_file because connect() # and close() may set or unset it my_socket, my_socket_file = self._socket, self._socket_file if not my_socket or not my_socket_file: raise stem.SocketClosed() return handler(my_socket, my_socket_file) except stem.SocketClosed: # If recv_message raises a SocketClosed then we should properly shut # everything down. However, there's a couple cases where this will # cause deadlock... # # * This SocketClosed was *caused by* a close() call, which is joining # on our thread. # # * A send() call that's currently in flight is about to call close(), # also attempting to join on us. # # To resolve this we make a non-blocking call to acquire the send lock. # If we get it then great, we can close safely. If not then one of the # above are in progress and we leave the close to them. if self.is_alive(): if self._send_lock.acquire(False): self.close() self._send_lock.release() raise def _get_send_lock(self): """ The send lock is useful to classes that interact with us at a deep level because it's used to lock :func:`stem.socket.ControlSocket.connect` / :func:`stem.socket.BaseSocket.close`, and by extension our :func:`stem.socket.BaseSocket.is_alive` state changes. :returns: **threading.RLock** that governs sending messages to our socket and state changes """ return self._send_lock def __enter__(self): return self def __exit__(self, exit_type, value, traceback): self.close() def _connect(self): """ Connection callback that can be overwritten by subclasses and wrappers. """ pass def _close(self): """ Disconnection callback that can be overwritten by subclasses and wrappers. """ pass def _make_socket(self): """ Constructs and connects new socket. This is implemented by subclasses. :returns: **socket.socket** for our configuration :raises: * :class:`stem.SocketError` if unable to make a socket * **NotImplementedError** if not implemented by a subclass """ raise NotImplementedError('Unsupported Operation: this should be implemented by the BaseSocket subclass') class RelaySocket(BaseSocket): """ `Link-level connection `_ to a Tor relay. .. versionadded:: 1.7.0 :var str address: address our socket connects to :var int port: ORPort our socket connects to """ def __init__(self, address = '127.0.0.1', port = 9050, connect = True): """ RelaySocket constructor. :param str address: ip address of the relay :param int port: orport of the relay :param bool connect: connects to the socket if True, leaves it unconnected otherwise :raises: :class:`stem.SocketError` if connect is **True** and we're unable to establish a connection """ super(RelaySocket, self).__init__() self.address = address self.port = port if connect: self.connect() def send(self, message): """ Sends a message to the relay's ORPort. :param str message: message to be formatted and sent to the socket :raises: * :class:`stem.SocketError` if a problem arises in using the socket * :class:`stem.SocketClosed` if the socket is known to be shut down """ self._send(message, lambda s, sf, msg: _write_to_socket(sf, msg)) def recv(self): """ Receives a message from the relay. :returns: bytes for the message received :raises: * :class:`stem.ProtocolError` the content from the socket is malformed * :class:`stem.SocketClosed` if the socket closes before we receive a complete message """ # TODO: Is MAX_READ_BUFFER_LEN defined in the spec? Not sure where it came # from. return self._recv(lambda s, sf: s.recv(MAX_READ_BUFFER_LEN)) def is_localhost(self): return self.address == '127.0.0.1' def _make_socket(self): try: relay_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) relay_socket.connect((self.address, self.port)) return ssl.wrap_socket(relay_socket) except socket.error as exc: raise stem.SocketError(exc) class ControlSocket(BaseSocket): """ Wrapper for a socket connection that speaks the Tor control protocol. To the better part this transparently handles the formatting for sending and receiving complete messages. Callers should not instantiate this class directly, but rather use subclasses which are expected to implement the **_make_socket()** method. """ def __init__(self): super(ControlSocket, self).__init__() def send(self, message): """ Formats and sends a message to the control socket. For more information see the :func:`~stem.socket.send_message` function. .. deprecated:: 1.7.0 The **raw** argument was unhelpful and be removed. Use :func:`stem.socket.send_message` if you need this level of control instead. :param str message: message to be formatted and sent to the socket :raises: * :class:`stem.SocketError` if a problem arises in using the socket * :class:`stem.SocketClosed` if the socket is known to be shut down """ self._send(message, lambda s, sf, msg: send_message(sf, msg)) def recv(self): """ Receives a message from the control socket, blocking until we've received one. For more information see the :func:`~stem.socket.recv_message` function. :returns: :class:`~stem.response.ControlMessage` for the message received :raises: * :class:`stem.ProtocolError` the content from the socket is malformed * :class:`stem.SocketClosed` if the socket closes before we receive a complete message """ return self._recv(lambda s, sf: recv_message(sf)) class ControlPort(ControlSocket): """ Control connection to tor. For more information see tor's ControlPort torrc option. :var str address: address our socket connects to :var int port: ControlPort our socket connects to """ def __init__(self, address = '127.0.0.1', port = 9051, connect = True): """ ControlPort constructor. :param str address: ip address of the controller :param int port: port number of the controller :param bool connect: connects to the socket if True, leaves it unconnected otherwise :raises: :class:`stem.SocketError` if connect is **True** and we're unable to establish a connection """ super(ControlPort, self).__init__() self.address = address self.port = port if connect: self.connect() def get_address(self): """ Provides the ip address our socket connects to. .. deprecated:: 1.7.0 Use the **address** attribute instead. :returns: str with the ip address of our socket """ return self.address def get_port(self): """ Provides the port our socket connects to. .. deprecated:: 1.7.0 Use the **port** attribute instead. :returns: int with the port of our socket """ return self.port def is_localhost(self): return self.address == '127.0.0.1' def _make_socket(self): try: control_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) control_socket.connect((self.address, self.port)) return control_socket except socket.error as exc: raise stem.SocketError(exc) class ControlSocketFile(ControlSocket): """ Control connection to tor. For more information see tor's ControlSocket torrc option. :var str path: filesystem path of the socket we connect to """ def __init__(self, path = '/var/run/tor/control', connect = True): """ ControlSocketFile constructor. :param str socket_path: path where the control socket is located :param bool connect: connects to the socket if True, leaves it unconnected otherwise :raises: :class:`stem.SocketError` if connect is **True** and we're unable to establish a connection """ super(ControlSocketFile, self).__init__() self.path = path if connect: self.connect() def get_socket_path(self): """ Provides the path our socket connects to. .. deprecated:: 1.7.0 Use the **path** attribute instead. :returns: str with the path for our control socket """ return self.path def is_localhost(self): return True def _make_socket(self): try: control_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) control_socket.connect(self.path) return control_socket except socket.error as exc: raise stem.SocketError(exc) def send_message(control_file, message, raw = False): """ Sends a message to the control socket, adding the expected formatting for single verses multi-line messages. Neither message type should contain an ending newline (if so it'll be treated as a multi-line message with a blank line at the end). If the message doesn't contain a newline then it's sent as... :: \\r\\n and if it does contain newlines then it's split on ``\\n`` and sent as... :: +\\r\\n \\r\\n \\r\\n .\\r\\n :param file control_file: file derived from the control socket (see the socket's makefile() method for more information) :param str message: message to be sent on the control socket :param bool raw: leaves the message formatting untouched, passing it to the socket as-is :raises: * :class:`stem.SocketError` if a problem arises in using the socket * :class:`stem.SocketClosed` if the socket is known to be shut down """ if not raw: message = send_formatting(message) _write_to_socket(control_file, message) if log.is_tracing(): log_message = message.replace('\r\n', '\n').rstrip() msg_div = '\n' if '\n' in log_message else ' ' log.trace('Sent to tor:%s%s' % (msg_div, log_message)) def _write_to_socket(socket_file, message): try: socket_file.write(stem.util.str_tools._to_bytes(message)) socket_file.flush() except socket.error as exc: log.info('Failed to send: %s' % exc) # When sending there doesn't seem to be a reliable method for # distinguishing between failures from a disconnect verses other things. # Just accounting for known disconnection responses. if str(exc) == '[Errno 32] Broken pipe': raise stem.SocketClosed(exc) else: raise stem.SocketError(exc) except AttributeError: # if the control_file has been closed then flush will receive: # AttributeError: 'NoneType' object has no attribute 'sendall' log.info('Failed to send: file has been closed') raise stem.SocketClosed('file has been closed') def recv_message(control_file): """ Pulls from a control socket until we either have a complete message or encounter a problem. :param file control_file: file derived from the control socket (see the socket's makefile() method for more information) :returns: :class:`~stem.response.ControlMessage` read from the socket :raises: * :class:`stem.ProtocolError` the content from the socket is malformed * :class:`stem.SocketClosed` if the socket closes before we receive a complete message """ parsed_content, raw_content, first_line = None, None, True while True: try: line = control_file.readline() except AttributeError: # if the control_file has been closed then we will receive: # AttributeError: 'NoneType' object has no attribute 'recv' log.info(ERROR_MSG % ('SocketClosed', 'socket file has been closed')) raise stem.SocketClosed('socket file has been closed') except (socket.error, ValueError) as exc: # When disconnected we get... # # Python 2: # socket.error: [Errno 107] Transport endpoint is not connected # # Python 3: # ValueError: I/O operation on closed file. log.info(ERROR_MSG % ('SocketClosed', 'received exception "%s"' % exc)) raise stem.SocketClosed(exc) # Parses the tor control lines. These are of the form... # \r\n if not line: # if the socket is disconnected then the readline() method will provide # empty content log.info(ERROR_MSG % ('SocketClosed', 'empty socket content')) raise stem.SocketClosed('Received empty socket content.') elif not MESSAGE_PREFIX.match(line): log.info(ERROR_MSG % ('ProtocolError', 'malformed status code/divider, "%s"' % log.escape(line))) raise stem.ProtocolError('Badly formatted reply line: beginning is malformed') elif not line.endswith(b'\r\n'): log.info(ERROR_MSG % ('ProtocolError', 'no CRLF linebreak, "%s"' % log.escape(line))) raise stem.ProtocolError('All lines should end with CRLF') status_code, divider, content = line[:3], line[3:4], line[4:-2] # strip CRLF off content if stem.prereq.is_python_3(): status_code = stem.util.str_tools._to_unicode(status_code) divider = stem.util.str_tools._to_unicode(divider) # Most controller responses are single lines, in which case we don't need # so much overhead. if first_line: if divider == ' ': _log_trace(line) return stem.response.ControlMessage([(status_code, divider, content)], line) else: parsed_content, raw_content, first_line = [], bytearray(), False raw_content += line if divider == '-': # mid-reply line, keep pulling for more content parsed_content.append((status_code, divider, content)) elif divider == ' ': # end of the message, return the message parsed_content.append((status_code, divider, content)) _log_trace(bytes(raw_content)) return stem.response.ControlMessage(parsed_content, bytes(raw_content)) elif divider == '+': # data entry, all of the following lines belong to the content until we # get a line with just a period content_block = bytearray(content) while True: try: line = control_file.readline() raw_content += line except socket.error as exc: log.info(ERROR_MSG % ('SocketClosed', 'received an exception while mid-way through a data reply (exception: "%s", read content: "%s")' % (exc, log.escape(bytes(raw_content))))) raise stem.SocketClosed(exc) if not line.endswith(b'\r\n'): log.info(ERROR_MSG % ('ProtocolError', 'CRLF linebreaks missing from a data reply, "%s"' % log.escape(bytes(raw_content)))) raise stem.ProtocolError('All lines should end with CRLF') elif line == b'.\r\n': break # data block termination line = line[:-2] # strips off the CRLF # lines starting with a period are escaped by a second period (as per # section 2.4 of the control-spec) if line.startswith(b'..'): line = line[1:] content_block += b'\n' + line # joins the content using a newline rather than CRLF separator (more # conventional for multi-line string content outside the windows world) parsed_content.append((status_code, divider, bytes(content_block))) else: # this should never be reached due to the prefix regex, but might as well # be safe... log.warn(ERROR_MSG % ('ProtocolError', "\"%s\" isn't a recognized divider type" % divider)) raise stem.ProtocolError("Unrecognized divider type '%s': %s" % (divider, stem.util.str_tools._to_unicode(line))) def send_formatting(message): """ Performs the formatting expected from sent control messages. For more information see the :func:`~stem.socket.send_message` function. :param str message: message to be formatted :returns: **str** of the message wrapped by the formatting expected from controllers """ # From control-spec section 2.2... # Command = Keyword OptArguments CRLF / "+" Keyword OptArguments CRLF CmdData # Keyword = 1*ALPHA # OptArguments = [ SP *(SP / VCHAR) ] # # A command is either a single line containing a Keyword and arguments, or a # multiline command whose initial keyword begins with +, and whose data # section ends with a single "." on a line of its own. # if we already have \r\n entries then standardize on \n to start with message = message.replace('\r\n', '\n') if '\n' in message: return '+%s\r\n.\r\n' % message.replace('\n', '\r\n') else: return message + '\r\n' def _log_trace(response): if not log.is_tracing(): return log_message = stem.util.str_tools._to_unicode(response.replace(b'\r\n', b'\n').rstrip()) log_message_lines = log_message.split('\n') if TRUNCATE_LOGS and len(log_message_lines) > TRUNCATE_LOGS: log_message = '\n'.join(log_message_lines[:TRUNCATE_LOGS] + ['... %i more lines...' % (len(log_message_lines) - TRUNCATE_LOGS)]) if len(log_message_lines) > 2: log.trace('Received from tor:\n%s' % log_message) else: log.trace('Received from tor: %s' % log_message.replace('\n', '\\n')) stem-1.7.1/stem/manual.py0000664000175000017500000006674513341474573016046 0ustar atagaratagar00000000000000# Copyright 2015-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Information available about Tor from `its manual `_. This provides three methods of getting this information... * :func:`~stem.manual.Manual.from_cache` provides manual content bundled with Stem. This is the fastest and most reliable method but only as up-to-date as Stem's release. * :func:`~stem.manual.Manual.from_man` reads Tor's local man page for information about it. * :func:`~stem.manual.Manual.from_remote` fetches the latest manual information remotely. This is the slowest and least reliable method but provides the most recent information about Tor. Manual information includes arguments, signals, and probably most usefully the torrc configuration options. For example, say we want a little script that told us what our torrc options do... .. literalinclude:: /_static/example/manual_config_options.py :language: python | .. image:: /_static/manual_output.png | **Module Overview:** :: query - performs a query on our cached sqlite manual information is_important - Indicates if a configuration option is of particularly common importance. download_man_page - Downloads tor's latest man page. Manual - Information about Tor available from its manual. | |- from_cache - Provides manual information cached with Stem. | |- from_man - Retrieves manual information from its man page. | +- from_remote - Retrieves manual information remotely from tor's latest manual. | +- save - writes the manual contents to a given location .. versionadded:: 1.5.0 """ import os import shutil import sys import tempfile import stem.prereq import stem.util import stem.util.conf import stem.util.enum import stem.util.log import stem.util.system try: # added in python 2.7 from collections import OrderedDict except ImportError: from stem.util.ordereddict import OrderedDict if stem.prereq._is_lru_cache_available(): from functools import lru_cache else: from stem.util.lru_cache import lru_cache try: # account for urllib's change between python 2.x and 3.x import urllib.request as urllib except ImportError: import urllib2 as urllib Category = stem.util.enum.Enum('GENERAL', 'CLIENT', 'RELAY', 'DIRECTORY', 'AUTHORITY', 'HIDDEN_SERVICE', 'DENIAL_OF_SERVICE', 'TESTING', 'UNKNOWN') GITWEB_MANUAL_URL = 'https://gitweb.torproject.org/tor.git/plain/doc/tor.1.txt' CACHE_PATH = os.path.join(os.path.dirname(__file__), 'cached_manual.sqlite') DATABASE = None # cache database connections HAS_ENCODING_ARG = not stem.util.system.is_mac() and not stem.util.system.is_bsd() and not stem.util.system.is_slackware() SCHEMA_VERSION = 1 # version of our scheme, bump this if you change the following SCHEMA = ( 'CREATE TABLE schema(version INTEGER)', 'INSERT INTO schema(version) VALUES (%i)' % SCHEMA_VERSION, 'CREATE TABLE metadata(name TEXT, synopsis TEXT, description TEXT, man_commit TEXT, stem_commit TEXT)', 'CREATE TABLE commandline(name TEXT PRIMARY KEY, description TEXT)', 'CREATE TABLE signals(name TEXT PRIMARY KEY, description TEXT)', 'CREATE TABLE files(name TEXT PRIMARY KEY, description TEXT)', 'CREATE TABLE torrc(key TEXT PRIMARY KEY, name TEXT, category TEXT, usage TEXT, summary TEXT, description TEXT, position INTEGER)', ) CATEGORY_SECTIONS = OrderedDict(( ('GENERAL OPTIONS', Category.GENERAL), ('CLIENT OPTIONS', Category.CLIENT), ('SERVER OPTIONS', Category.RELAY), ('DIRECTORY SERVER OPTIONS', Category.DIRECTORY), ('DIRECTORY AUTHORITY SERVER OPTIONS', Category.AUTHORITY), ('HIDDEN SERVICE OPTIONS', Category.HIDDEN_SERVICE), ('DENIAL OF SERVICE MITIGATION OPTIONS', Category.DENIAL_OF_SERVICE), ('TESTING NETWORK OPTIONS', Category.TESTING), )) class SchemaMismatch(IOError): """ Database schema doesn't match what Stem supports. .. versionadded:: 1.6.0 :var int database_schema: schema of the database :var tuple supported_schemas: schemas library supports """ def __init__(self, message, database_schema, library_schema): super(SchemaMismatch, self).__init__(message) self.database_schema = database_schema self.library_schema = library_schema def query(query, *param): """ Performs the given query on our sqlite manual cache. This database should be treated as being read-only. File permissions generally enforce this, and in the future will be enforced by this function as well. :: >>> import stem.manual >>> print(stem.manual.query('SELECT description FROM torrc WHERE key=?', 'CONTROLSOCKET').fetchone()[0]) Like ControlPort, but listens on a Unix domain socket, rather than a TCP socket. 0 disables ControlSocket. (Unix and Unix-like systems only.) (Default: 0) .. versionadded:: 1.6.0 :param str query: query to run on the cache :param list param: query parameters :returns: :class:`sqlite3.Cursor` with the query results :raises: * **ImportError** if the sqlite3 module is unavailable * **sqlite3.OperationalError** if query fails """ if not stem.prereq.is_sqlite_available(): raise ImportError('Querying requires the sqlite3 module') import sqlite3 # The only reason to explicitly close the sqlite connection is to ensure # transactions are committed. Since we're only using read-only access this # doesn't matter, and can allow interpreter shutdown to do the needful. # # TODO: When we only support python 3.4+ we can use sqlite's uri argument # to enforce a read-only connection... # # https://docs.python.org/3/library/sqlite3.html#sqlite3.connect global DATABASE if DATABASE is None: DATABASE = sqlite3.connect(CACHE_PATH) return DATABASE.execute(query, param) class ConfigOption(object): """ Tor configuration attribute found in its torrc. :var str name: name of the configuration option :var stem.manual.Category category: category the config option was listed under, this is Category.UNKNOWN if we didn't recognize the category :var str usage: arguments accepted by the option :var str summary: brief description of what the option does :var str description: longer manual description with details """ def __init__(self, name, category = Category.UNKNOWN, usage = '', summary = '', description = ''): self.name = name self.category = category self.usage = usage self.summary = summary self.description = description def __hash__(self): return stem.util._hash_attr(self, 'name', 'category', 'usage', 'summary', 'description', cache = True) def __eq__(self, other): return hash(self) == hash(other) if isinstance(other, ConfigOption) else False def __ne__(self, other): return not self == other @lru_cache() def _config(lowercase = True): """ Provides a dictionary for our settings.cfg. This has a couple categories... * manual.important (list) - configuration options considered to be important * manual.summary.* (str) - summary descriptions of config options :param bool lowercase: uses lowercase keys if **True** to allow for case insensitive lookups """ config = stem.util.conf.Config() config_path = os.path.join(os.path.dirname(__file__), 'settings.cfg') try: config.load(config_path) config_dict = dict([(key.lower() if lowercase else key, config.get_value(key)) for key in config.keys() if key.startswith('manual.summary.')]) config_dict['manual.important'] = [name.lower() if lowercase else name for name in config.get_value('manual.important', [], multiple = True)] return config_dict except Exception as exc: stem.util.log.warn("BUG: stem failed to load its internal manual information from '%s': %s" % (config_path, exc)) return {} def _manual_differences(previous_manual, new_manual): """ Provides a description of how two manuals differ. """ lines = [] for attr in ('name', 'synopsis', 'description', 'commandline_options', 'signals', 'files', 'config_options'): previous_attr = getattr(previous_manual, attr) new_attr = getattr(new_manual, attr) if previous_attr != new_attr: lines.append("* Manual's %s attribute changed\n" % attr) if attr in ('name', 'synopsis', 'description'): lines.append(' Previously...\n\n%s\n' % previous_attr) lines.append(' Updating to...\n\n%s' % new_attr) elif attr == 'config_options': for config_name, config_attr in new_attr.items(): previous = previous_attr.get(config_name) if previous is None: lines.append(' adding new config option => %s' % config_name) elif config_attr != previous: for attr in ('name', 'category', 'usage', 'summary', 'description'): if getattr(config_attr, attr) != getattr(previous, attr): lines.append(' modified %s (%s) => %s' % (config_name, attr, getattr(config_attr, attr))) for config_name in set(previous_attr.keys()).difference(new_attr.keys()): lines.append(' removing config option => %s' % config_name) else: added_items = set(new_attr.items()).difference(previous_attr.items()) removed_items = set(previous_attr.items()).difference(new_attr.items()) for added_item in added_items: lines.append(' adding %s => %s' % added_item) for removed_item in removed_items: lines.append(' removing %s => %s' % removed_item) lines.append('\n') return '\n'.join(lines) def is_important(option): """ Indicates if a configuration option of particularly common importance or not. :param str option: tor configuration option to check :returns: **bool** that's **True** if this is an important option and **False** otherwise """ return option.lower() in _config()['manual.important'] def download_man_page(path = None, file_handle = None, url = GITWEB_MANUAL_URL, timeout = 20): """ Downloads tor's latest man page from `gitweb.torproject.org `_. This method is both slow and unreliable - please see the warnings on :func:`~stem.manual.Manual.from_remote`. :param str path: path to save tor's man page to :param file file_handle: file handler to save tor's man page to :param str url: url to download tor's asciidoc manual from :param int timeout: seconds to wait before timing out the request :raises: **IOError** if unable to retrieve the manual """ if not path and not file_handle: raise ValueError("Either the path or file_handle we're saving to must be provided") elif not stem.util.system.is_available('a2x'): raise IOError('We require a2x from asciidoc to provide a man page') dirpath = tempfile.mkdtemp() asciidoc_path = os.path.join(dirpath, 'tor.1.txt') manual_path = os.path.join(dirpath, 'tor.1') try: try: with open(asciidoc_path, 'wb') as asciidoc_file: request = urllib.urlopen(url, timeout = timeout) shutil.copyfileobj(request, asciidoc_file) except: exc = sys.exc_info()[1] raise IOError("Unable to download tor's manual from %s to %s: %s" % (url, asciidoc_path, exc)) try: stem.util.system.call('a2x -f manpage %s' % asciidoc_path) if not os.path.exists(manual_path): raise OSError('no man page was generated') except stem.util.system.CallError as exc: raise IOError("Unable to run '%s': %s" % (exc.command, exc.stderr)) if path: try: path_dir = os.path.dirname(path) if not os.path.exists(path_dir): os.makedirs(path_dir) shutil.copyfile(manual_path, path) except OSError as exc: raise IOError(exc) if file_handle: with open(manual_path, 'rb') as manual_file: shutil.copyfileobj(manual_file, file_handle) file_handle.flush() finally: shutil.rmtree(dirpath) class Manual(object): """ Parsed tor man page. Tor makes no guarantees about its man page format so this may not always be compatible. If not you can use the cached manual information stored with Stem. This does not include every bit of information from the tor manual. For instance, I've excluded the 'THE CONFIGURATION FILE FORMAT' section. If there's a part you'd find useful then `file an issue `_ and we can add it. :var str name: brief description of the tor command :var str synopsis: brief tor command usage :var str description: general description of what tor does :var collections.OrderedDict commandline_options: mapping of commandline arguments to their descripton :var collections.OrderedDict signals: mapping of signals tor accepts to their description :var collections.OrderedDict files: mapping of file paths to their description :var collections.OrderedDict config_options: :class:`~stem.manual.ConfigOption` tuples for tor configuration options :var str man_commit: latest tor commit editing the man page when this information was cached :var str stem_commit: stem commit to cache this manual information """ def __init__(self, name, synopsis, description, commandline_options, signals, files, config_options): self.name = name self.synopsis = synopsis self.description = description self.commandline_options = OrderedDict(commandline_options) self.signals = OrderedDict(signals) self.files = OrderedDict(files) self.config_options = OrderedDict(config_options) self.man_commit = None self.stem_commit = None self.schema = None @staticmethod def from_cache(path = None): """ Provides manual information cached with Stem. Unlike :func:`~stem.manual.Manual.from_man` and :func:`~stem.manual.Manual.from_remote` this doesn't have any system requirements, and is faster too. Only drawback is that this manual content is only as up to date as the Stem release we're using. .. versionchanged:: 1.6.0 Added support for sqlite cache. Support for :class:`~stem.util.conf.Config` caches will be dropped in Stem 2.x. :param str path: cached manual content to read, if not provided this uses the bundled manual information :returns: :class:`~stem.manual.Manual` with our bundled manual information :raises: * **ImportError** if cache is sqlite and the sqlite3 module is unavailable * **IOError** if a **path** was provided and we were unable to read it or the schema is out of date """ # TODO: drop _from_config_cache() with stem 2.x if path is None: path = CACHE_PATH if path is not None and path.endswith('.sqlite'): return Manual._from_sqlite_cache(path) else: return Manual._from_config_cache(path) @staticmethod def _from_sqlite_cache(path): if not stem.prereq.is_sqlite_available(): raise ImportError('Reading a sqlite cache requires the sqlite3 module') import sqlite3 if not os.path.exists(path): raise IOError("%s doesn't exist" % path) with sqlite3.connect(path) as conn: try: schema = conn.execute('SELECT version FROM schema').fetchone()[0] if schema != SCHEMA_VERSION: raise SchemaMismatch("Stem's current manual schema version is %s, but %s was version %s" % (SCHEMA_VERSION, path, schema), schema, (SCHEMA_VERSION,)) name, synopsis, description, man_commit, stem_commit = conn.execute('SELECT name, synopsis, description, man_commit, stem_commit FROM metadata').fetchone() except sqlite3.OperationalError as exc: raise IOError('Failed to read database metadata from %s: %s' % (path, exc)) commandline = dict(conn.execute('SELECT name, description FROM commandline').fetchall()) signals = dict(conn.execute('SELECT name, description FROM signals').fetchall()) files = dict(conn.execute('SELECT name, description FROM files').fetchall()) config_options = OrderedDict() for entry in conn.execute('SELECT name, category, usage, summary, description FROM torrc ORDER BY position').fetchall(): option, category, usage, summary, option_description = entry config_options[option] = ConfigOption(option, category, usage, summary, option_description) manual = Manual(name, synopsis, description, commandline, signals, files, config_options) manual.man_commit = man_commit manual.stem_commit = stem_commit manual.schema = schema return manual @staticmethod def _from_config_cache(path): conf = stem.util.conf.Config() conf.load(path, commenting = False) config_options = OrderedDict() for key in conf.keys(): if key.startswith('config_options.'): key = key.split('.')[1] if key not in config_options: config_options[key] = ConfigOption( conf.get('config_options.%s.name' % key, ''), conf.get('config_options.%s.category' % key, ''), conf.get('config_options.%s.usage' % key, ''), conf.get('config_options.%s.summary' % key, ''), conf.get('config_options.%s.description' % key, '') ) manual = Manual( conf.get('name', ''), conf.get('synopsis', ''), conf.get('description', ''), conf.get('commandline_options', OrderedDict()), conf.get('signals', OrderedDict()), conf.get('files', OrderedDict()), config_options, ) manual.man_commit = conf.get('man_commit', None) manual.stem_commit = conf.get('stem_commit', None) return manual @staticmethod def from_man(man_path = 'tor'): """ Reads and parses a given man page. On OSX the man command doesn't have an '--encoding' argument so its results may not quite match other platforms. For instance, it normalizes long dashes into '--'. :param str man_path: path argument for 'man', for example you might want '/path/to/tor/doc/tor.1' to read from tor's git repository :returns: :class:`~stem.manual.Manual` for the system's man page :raises: **IOError** if unable to retrieve the manual """ man_cmd = 'man %s -P cat %s' % ('--encoding=ascii' if HAS_ENCODING_ARG else '', man_path) try: man_output = stem.util.system.call(man_cmd, env = {'MANWIDTH': '10000000'}) except OSError as exc: raise IOError("Unable to run '%s': %s" % (man_cmd, exc)) categories, config_options = _get_categories(man_output), OrderedDict() for category_header, category_enum in CATEGORY_SECTIONS.items(): _add_config_options(config_options, category_enum, categories.get(category_header, [])) for category in categories: if category.endswith(' OPTIONS') and category not in CATEGORY_SECTIONS and category not in ('COMMAND-LINE OPTIONS', 'NON-PERSISTENT OPTIONS'): _add_config_options(config_options, Category.UNKNOWN, categories.get(category, [])) return Manual( _join_lines(categories.get('NAME', [])), _join_lines(categories.get('SYNOPSIS', [])), _join_lines(categories.get('DESCRIPTION', [])), _get_indented_descriptions(categories.get('COMMAND-LINE OPTIONS', [])), _get_indented_descriptions(categories.get('SIGNALS', [])), _get_indented_descriptions(categories.get('FILES', [])), config_options, ) @staticmethod def from_remote(timeout = 60): """ Reads and parses the latest tor man page `from gitweb.torproject.org `_. Note that while convenient, this reliance on GitWeb means you should alway call with a fallback, such as... :: try: manual = stem.manual.from_remote() except IOError: manual = stem.manual.from_cache() In addition to our GitWeb dependency this requires 'a2x' which is part of `asciidoc `_ and... isn't quick. Personally this takes ~7.41s, breaking down for me as follows... * 1.67s to download tor.1.txt * 5.57s to convert the asciidoc to a man page * 0.17s for stem to read and parse the manual :param int timeout: seconds to wait before timing out the request :returns: latest :class:`~stem.manual.Manual` available for tor :raises: **IOError** if unable to retrieve the manual """ with tempfile.NamedTemporaryFile() as tmp: download_man_page(file_handle = tmp, timeout = timeout) return Manual.from_man(tmp.name) def save(self, path): """ Persists the manual content to a given location. .. versionchanged:: 1.6.0 Added support for sqlite cache. Support for :class:`~stem.util.conf.Config` caches will be dropped in Stem 2.x. :param str path: path to save our manual content to :raises: * **ImportError** if saving as sqlite and the sqlite3 module is unavailable * **IOError** if unsuccessful """ # TODO: drop _save_as_config() with stem 2.x if path.endswith('.sqlite'): return self._save_as_sqlite(path) else: return self._save_as_config(path) def _save_as_sqlite(self, path): if not stem.prereq.is_sqlite_available(): raise ImportError('Saving a sqlite cache requires the sqlite3 module') import sqlite3 tmp_path = path + '.new' if os.path.exists(tmp_path): os.remove(tmp_path) with sqlite3.connect(tmp_path) as conn: for cmd in SCHEMA: conn.execute(cmd) conn.execute('INSERT INTO metadata(name, synopsis, description, man_commit, stem_commit) VALUES (?,?,?,?,?)', (self.name, self.synopsis, self.description, self.man_commit, self.stem_commit)) for k, v in self.commandline_options.items(): conn.execute('INSERT INTO commandline(name, description) VALUES (?,?)', (k, v)) for k, v in self.signals.items(): conn.execute('INSERT INTO signals(name, description) VALUES (?,?)', (k, v)) for k, v in self.files.items(): conn.execute('INSERT INTO files(name, description) VALUES (?,?)', (k, v)) for i, v in enumerate(self.config_options.values()): conn.execute('INSERT INTO torrc(key, name, category, usage, summary, description, position) VALUES (?,?,?,?,?,?,?)', (v.name.upper(), v.name, v.category, v.usage, v.summary, v.description, i)) if os.path.exists(path): os.remove(path) os.rename(tmp_path, path) def _save_as_config(self, path): conf = stem.util.conf.Config() conf.set('name', self.name) conf.set('synopsis', self.synopsis) conf.set('description', self.description) if self.man_commit: conf.set('man_commit', self.man_commit) if self.stem_commit: conf.set('stem_commit', self.stem_commit) for k, v in self.commandline_options.items(): conf.set('commandline_options', '%s => %s' % (k, v), overwrite = False) for k, v in self.signals.items(): conf.set('signals', '%s => %s' % (k, v), overwrite = False) for k, v in self.files.items(): conf.set('files', '%s => %s' % (k, v), overwrite = False) for k, v in self.config_options.items(): conf.set('config_options.%s.category' % k, v.category) conf.set('config_options.%s.name' % k, v.name) conf.set('config_options.%s.usage' % k, v.usage) conf.set('config_options.%s.summary' % k, v.summary) conf.set('config_options.%s.description' % k, v.description) conf.save(path) def __hash__(self): return stem.util._hash_attr(self, 'name', 'synopsis', 'description', 'commandline_options', 'signals', 'files', 'config_options', cache = True) def __eq__(self, other): return hash(self) == hash(other) if isinstance(other, Manual) else False def __ne__(self, other): return not self == other def _get_categories(content): """ The man page is headers followed by an indented section. First pass gets the mapping of category titles to their lines. """ # skip header and footer lines if content and 'TOR(1)' in content[0]: content = content[1:] if content and content[-1].startswith('Tor'): content = content[:-1] categories = OrderedDict() category, lines = None, [] for line in content: # replace non-ascii characters # # \u2019 - smart single quote # \u2014 - extra long dash # \xb7 - centered dot char_for = chr if stem.prereq.is_python_3() else unichr line = line.replace(char_for(0x2019), "'").replace(char_for(0x2014), '-').replace(char_for(0xb7), '*') if line and not line.startswith(' '): if category: if lines and lines[-1] == '': lines = lines[:-1] # sections end with an extra empty line categories[category] = lines category, lines = line.strip(), [] else: if line.startswith(' '): line = line[7:] # contents of a section have a seven space indentation lines.append(line) if category: categories[category] = lines return categories def _get_indented_descriptions(lines): """ Parses the commandline argument and signal sections. These are options followed by an indented description. For example... :: -f FILE Specify a new configuration file to contain further Tor configuration options OR pass - to make Tor read its configuration from standard input. (Default: /usr/local/etc/tor/torrc, or $HOME/.torrc if that file is not found) There can be additional paragraphs not related to any particular argument but ignoring those. """ options, last_arg = OrderedDict(), None for line in lines: if line and not line.startswith(' '): options[line], last_arg = [], line elif last_arg and line.startswith(' '): options[last_arg].append(line[4:]) return dict([(arg, ' '.join(desc_lines)) for arg, desc_lines in options.items() if desc_lines]) def _add_config_options(config_options, category, lines): """ Parses a section of tor configuration options. These have usage information, followed by an indented description. For instance... :: ConnLimit NUM The minimum number of file descriptors that must be available to the Tor process before it will start. Tor will ask the OS for as many file descriptors as the OS will allow (you can find this by "ulimit -H -n"). If this number is less than ConnLimit, then Tor will refuse to start. You probably don't need to adjust this. It has no effect on Windows since that platform lacks getrlimit(). (Default: 1000) """ last_option, usage, description = None, None, [] # Drop the section description. Each ends with a paragraph saying 'The # following options...'. desc_paragraph_index = None for i, line in enumerate(lines): if 'The following options' in line: desc_paragraph_index = i break if desc_paragraph_index is not None: lines = lines[desc_paragraph_index:] # trim to the description paragrah lines = lines[lines.index(''):] # drop the paragraph for line in lines: if line and not line.startswith(' '): if last_option: summary = _config().get('manual.summary.%s' % last_option.lower(), '') config_options[last_option] = ConfigOption(last_option, category, usage, summary, _join_lines(description).strip()) if ' ' in line: last_option, usage = line.split(' ', 1) else: last_option, usage = line, '' description = [] else: if line.startswith(' '): line = line[4:] description.append(line) if last_option: summary = _config().get('manual.summary.%s' % last_option.lower(), '') config_options[last_option] = ConfigOption(last_option, category, usage, summary, _join_lines(description).strip()) def _join_lines(lines): """ Simple join, except we want empty lines to still provide a newline. """ result = [] for line in lines: if not line: if result and result[-1] != '\n': result.append('\n') else: result.append(line + '\n') return ''.join(result).strip() stem-1.7.1/stem/util/0000775000175000017500000000000013411004021015121 5ustar atagaratagar00000000000000stem-1.7.1/stem/util/test_tools.py0000664000175000017500000004736413353502540017726 0ustar atagaratagar00000000000000# Copyright 2015-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Helper functions for testing. Our **stylistic_issues**, **pyflakes_issues**, and **type_check_issues** respect a 'exclude_paths' in our test config, excluding any absolute paths matching those regexes. Issue strings can start or end with an asterisk to match just against the prefix or suffix. For instance... :: exclude_paths .*/stem/test/data/.* .. versionadded:: 1.2.0 :: TimedTestRunner - test runner that tracks test runtimes test_runtimes - provides runtime of tests excuted through TimedTestRunners clean_orphaned_pyc - delete *.pyc files without corresponding *.py is_pyflakes_available - checks if pyflakes is available is_pycodestyle_available - checks if pycodestyle is available pyflakes_issues - static checks for problems via pyflakes stylistic_issues - checks for PEP8 and other stylistic issues """ import collections import linecache import multiprocessing import os import re import threading import time import traceback import unittest import stem.prereq import stem.util.conf import stem.util.enum import stem.util.system CONFIG = stem.util.conf.config_dict('test', { 'pep8.ignore': [], # TODO: drop with stem 2.x, legacy alias for pycodestyle.ignore 'pycodestyle.ignore': [], 'pyflakes.ignore': [], 'exclude_paths': [], }) TEST_RUNTIMES = {} ASYNC_TESTS = {} AsyncStatus = stem.util.enum.UppercaseEnum('PENDING', 'RUNNING', 'FINISHED') AsyncResult = collections.namedtuple('AsyncResult', 'type msg') # TODO: Providing a copy of SkipTest that works with python 2.6. This will be # dropped when we remove python 2.6 support. if stem.prereq._is_python_26(): class SkipTest(Exception): 'Notes that the test was skipped.' else: SkipTest = unittest.case.SkipTest def assert_equal(expected, actual, msg = None): """ Function form of a TestCase's assertEqual. .. versionadded:: 1.6.0 :param object expected: expected value :param object actual: actual value :param str msg: message if assertion fails :raises: **AssertionError** if values aren't equal """ if expected != actual: raise AssertionError("Expected '%s' but was '%s'" % (expected, actual) if msg is None else msg) def assert_in(expected, actual, msg = None): """ Asserts that a given value is within this content. .. versionadded:: 1.6.0 :param object expected: expected value :param object actual: actual value :param str msg: message if assertion fails :raises: **AssertionError** if the expected value isn't in the actual """ if expected not in actual: raise AssertionError("Expected '%s' to be within '%s'" % (expected, actual) if msg is None else msg) def skip(msg): """ Function form of a TestCase's skipTest. .. versionadded:: 1.6.0 :param str msg: reason test is being skipped :raises: **unittest.case.SkipTest** for this reason """ raise SkipTest(msg) def asynchronous(func): test = stem.util.test_tools.AsyncTest(func) ASYNC_TESTS[test.name] = test return test.method class AsyncTest(object): """ Test that's run asychronously. These are functions (no self reference) performed like the following... :: class MyTest(unittest.TestCase): @staticmethod def run_tests(): MyTest.test_addition = stem.util.test_tools.AsyncTest(MyTest.test_addition).method @staticmethod def test_addition(): if 1 + 1 != 2: raise AssertionError('tisk, tisk') MyTest.run() .. versionadded:: 1.6.0 """ def __init__(self, runner, args = None, threaded = False): self.name = '%s.%s' % (runner.__module__, runner.__name__) self._runner = runner self._runner_args = args self._threaded = threaded self.method = lambda test: self.result(test) # method that can be mixed into TestCases self._process = None self._process_pipe = None self._process_lock = threading.RLock() self._result = None self._status = AsyncStatus.PENDING def run(self, *runner_args, **kwargs): if stem.prereq._is_python_26(): return # not supported under python 2.6 def _wrapper(conn, runner, args): os.nice(12) try: runner(*args) if args else runner() conn.send(AsyncResult('success', None)) except AssertionError as exc: conn.send(AsyncResult('failure', str(exc))) except SkipTest as exc: conn.send(AsyncResult('skipped', str(exc))) except: conn.send(AsyncResult('error', traceback.format_exc())) finally: conn.close() with self._process_lock: if self._status == AsyncStatus.PENDING: if runner_args: self._runner_args = runner_args if 'threaded' in kwargs: self._threaded = kwargs['threaded'] self._process_pipe, child_pipe = multiprocessing.Pipe() if self._threaded: self._process = threading.Thread( target = _wrapper, args = (child_pipe, self._runner, self._runner_args), name = 'Background test of %s' % self.name, ) self._process.setDaemon(True) else: self._process = multiprocessing.Process(target = _wrapper, args = (child_pipe, self._runner, self._runner_args)) self._process.start() self._status = AsyncStatus.RUNNING def pid(self): with self._process_lock: return self._process.pid if (self._process and not self._threaded) else None def join(self): self.result(None) def result(self, test): if stem.prereq._is_python_26(): return # not supported under python 2.6 with self._process_lock: if self._status == AsyncStatus.PENDING: self.run() if self._status == AsyncStatus.RUNNING: self._result = self._process_pipe.recv() self._process.join() self._status = AsyncStatus.FINISHED if test and self._result.type == 'failure': test.fail(self._result.msg) elif test and self._result.type == 'error': test.fail(self._result.msg) elif test and self._result.type == 'skipped': test.skipTest(self._result.msg) class Issue(collections.namedtuple('Issue', ['line_number', 'message', 'line'])): """ Issue encountered by pyflakes or pycodestyle. :var int line_number: line number the issue occured on :var str message: description of the issue :var str line: content of the line the issue is about """ class TimedTestRunner(unittest.TextTestRunner): """ Test runner that tracks the runtime of individual tests. When tests are run with this their runtimes are made available through :func:`stem.util.test_tools.test_runtimes`. .. versionadded:: 1.6.0 """ def run(self, test): for t in test._tests: original_type = type(t) class _TestWrapper(original_type): def run(self, result = None): start_time = time.time() result = super(type(self), self).run(result) TEST_RUNTIMES[self.id()] = time.time() - start_time return result # TODO: remove and drop unnecessary 'returns' when dropping python 2.6 # support def skipTest(self, message): if not stem.prereq._is_python_26(): return super(original_type, self).skipTest(message) # TODO: remove when dropping python 2.6 support def assertItemsEqual(self, expected, actual): if stem.prereq._is_python_26(): self.assertEqual(set(expected), set(actual)) else: return super(original_type, self).assertItemsEqual(expected, actual) def assertRaisesWith(self, exc_type, exc_msg, func, *args, **kwargs): """ Asserts the given invokation raises the expected excepiton. This is similar to unittest's assertRaises and assertRaisesRegexp, but checks for an exact match. This method is **not** being vended to external users and may be changed without notice. If you want this method to be part of our vended API then please let us know. """ return self.assertRaisesRegexp(exc_type, '^%s$' % re.escape(exc_msg), func, *args, **kwargs) def assertRaisesRegexp(self, exc_type, exc_msg, func, *args, **kwargs): if stem.prereq._is_python_26(): try: func(*args, **kwargs) self.fail('Expected a %s to be raised but nothing was' % exc_type) except exc_type as exc: self.assertTrue(re.search(exc_msg, str(exc), re.MULTILINE)) else: return super(original_type, self).assertRaisesRegexp(exc_type, exc_msg, func, *args, **kwargs) def id(self): return '%s.%s.%s' % (original_type.__module__, original_type.__name__, self._testMethodName) def __str__(self): return '%s (%s.%s)' % (self._testMethodName, original_type.__module__, original_type.__name__) t.__class__ = _TestWrapper return super(TimedTestRunner, self).run(test) def test_runtimes(): """ Provides the runtimes of tests executed through TimedTestRunners. :returns: **dict** of fully qualified test names to floats for the runtime in seconds .. versionadded:: 1.6.0 """ return dict(TEST_RUNTIMES) def clean_orphaned_pyc(paths): """ Deletes any file with a \*.pyc extention without a corresponding \*.py. This helps to address a common gotcha when deleting python files... * You delete module 'foo.py' and run the tests to ensure that you haven't broken anything. They pass, however there *are* still some 'import foo' statements that still work because the bytecode (foo.pyc) is still around. * You push your change. * Another developer clones our repository and is confused because we have a bunch of ImportErrors. :param list paths: paths to search for orphaned pyc files :returns: list of absolute paths that were deleted """ orphaned_pyc = [] for path in paths: for pyc_path in stem.util.system.files_with_suffix(path, '.pyc'): py_path = pyc_path[:-1] # If we're running python 3 then the *.pyc files are no longer bundled # with the *.py. Rather, they're in a __pycache__ directory. pycache = '%s__pycache__%s' % (os.path.sep, os.path.sep) if pycache in pyc_path: directory, pycache_filename = pyc_path.split(pycache, 1) if not pycache_filename.endswith('.pyc'): continue # should look like 'test_tools.cpython-32.pyc' py_path = os.path.join(directory, pycache_filename.split('.')[0] + '.py') if not os.path.exists(py_path): orphaned_pyc.append(pyc_path) os.remove(pyc_path) return orphaned_pyc def is_pyflakes_available(): """ Checks if pyflakes is availalbe. :returns: **True** if we can use pyflakes and **False** otherwise """ return _module_exists('pyflakes.api') and _module_exists('pyflakes.reporter') def is_pycodestyle_available(): """ Checks if pycodestyle is availalbe. :returns: **True** if we can use pycodestyle and **False** otherwise """ if _module_exists('pycodestyle'): import pycodestyle elif _module_exists('pep8'): import pep8 as pycodestyle else: return False return hasattr(pycodestyle, 'BaseReport') def stylistic_issues(paths, check_newlines = False, check_exception_keyword = False, prefer_single_quotes = False): """ Checks for stylistic issues that are an issue according to the parts of PEP8 we conform to. You can suppress pycodestyle issues by making a 'test' configuration that sets 'pycodestyle.ignore'. For example, with a 'test/settings.cfg' of... :: # pycodestyle compliance issues that we're ignoreing... # # * E111 and E121 four space indentations # * E501 line is over 79 characters pycodestyle.ignore E111 pycodestyle.ignore E121 pycodestyle.ignore E501 pycodestyle.ignore run_tests.py => E402: import stem.util.enum ... you can then run tests with... :: import stem.util.conf test_config = stem.util.conf.get_config('test') test_config.load('test/settings.cfg') issues = stylistic_issues('my_project') .. versionchanged:: 1.3.0 Renamed from get_stylistic_issues() to stylistic_issues(). The old name still works as an alias, but will be dropped in Stem version 2.0.0. .. versionchanged:: 1.4.0 Changing tuples in return value to be namedtuple instances, and adding the line that had the issue. .. versionchanged:: 1.4.0 Added the prefer_single_quotes option. .. versionchanged:: 1.6.0 Changed 'pycodestyle.ignore' code snippets to only need to match against the prefix. :param list paths: paths to search for stylistic issues :param bool check_newlines: check that we have standard newlines (\\n), not windows (\\r\\n) nor classic mac (\\r) :param bool check_exception_keyword: checks that we're using 'as' for exceptions rather than a comma :param bool prefer_single_quotes: standardize on using single rather than double quotes for strings, when reasonable :returns: dict of paths list of :class:`stem.util.test_tools.Issue` instances """ issues = {} ignore_rules = [] ignore_for_file = [] for rule in CONFIG['pycodestyle.ignore'] + CONFIG['pep8.ignore']: if '=>' in rule: path, rule_entry = rule.split('=>', 1) if ':' in rule_entry: rule, code = rule_entry.split(':', 1) ignore_for_file.append((path.strip(), rule.strip(), code.strip())) else: ignore_rules.append(rule) def is_ignored(path, rule, code): for ignored_path, ignored_rule, ignored_code in ignore_for_file: if path.endswith(ignored_path) and ignored_rule == rule and code.strip().startswith(ignored_code): return True return False if is_pycodestyle_available(): if _module_exists('pep8'): import pep8 as pycodestyle else: import pycodestyle class StyleReport(pycodestyle.BaseReport): def init_file(self, filename, lines, expected, line_offset): super(StyleReport, self).init_file(filename, lines, expected, line_offset) if not check_newlines and not check_exception_keyword and not prefer_single_quotes: return is_block_comment = False for index, line in enumerate(lines): content = line.split('#', 1)[0].strip() if check_newlines and '\r' in line: issues.setdefault(filename, []).append(Issue(index + 1, 'contains a windows newline', line)) if not content: continue # blank line if '"""' in content: is_block_comment = not is_block_comment if check_exception_keyword and content.startswith('except') and content.endswith(', exc:'): # Python 2.6 - 2.7 supports two forms for exceptions... # # except ValueError, exc: # except ValueError as exc: # # The former is the old method and no longer supported in python 3 # going forward. # TODO: This check only works if the exception variable is called # 'exc'. We should generalize this via a regex so other names work # too. issues.setdefault(filename, []).append(Issue(index + 1, "except clause should use 'as', not comma", line)) if prefer_single_quotes and not is_block_comment: if '"' in content and "'" not in content and '"""' not in content and not content.endswith('\\'): # Checking if the line already has any single quotes since that # usually means double quotes are preferable for the content (for # instance "I'm hungry"). Also checking for '\' at the end since # that can indicate a multi-line string. issues.setdefault(filename, []).append(Issue(index + 1, 'use single rather than double quotes', line)) def error(self, line_number, offset, text, check): code = super(StyleReport, self).error(line_number, offset, text, check) if code: line = linecache.getline(self.filename, line_number) if not is_ignored(self.filename, code, line): issues.setdefault(self.filename, []).append(Issue(line_number, text, line)) style_checker = pycodestyle.StyleGuide(ignore = ignore_rules, reporter = StyleReport) style_checker.check_files(list(_python_files(paths))) return issues def pyflakes_issues(paths): """ Performs static checks via pyflakes. False positives can be ignored via 'pyflakes.ignore' entries in our 'test' config. For instance... :: pyflakes.ignore stem/util/test_tools.py => 'pyflakes' imported but unused pyflakes.ignore stem/util/test_tools.py => 'pycodestyle' imported but unused .. versionchanged:: 1.3.0 Renamed from get_pyflakes_issues() to pyflakes_issues(). The old name still works as an alias, but will be dropped in Stem version 2.0.0. .. versionchanged:: 1.4.0 Changing tuples in return value to be namedtuple instances, and adding the line that had the issue. .. versionchanged:: 1.5.0 Support matching against prefix or suffix issue strings. :param list paths: paths to search for problems :returns: dict of paths list of :class:`stem.util.test_tools.Issue` instances """ issues = {} if is_pyflakes_available(): import pyflakes.api import pyflakes.reporter class Reporter(pyflakes.reporter.Reporter): def __init__(self): self._ignored_issues = {} for line in CONFIG['pyflakes.ignore']: path, issue = line.split('=>') self._ignored_issues.setdefault(path.strip(), []).append(issue.strip()) def unexpectedError(self, filename, msg): self._register_issue(filename, None, msg, None) def syntaxError(self, filename, msg, lineno, offset, text): self._register_issue(filename, lineno, msg, text) def flake(self, msg): self._register_issue(msg.filename, msg.lineno, msg.message % msg.message_args, None) def _is_ignored(self, path, issue): # Paths in pyflakes_ignore are relative, so we need to check to see if our # path ends with any of them. for ignored_path, ignored_issues in self._ignored_issues.items(): if path.endswith(ignored_path): if issue in ignored_issues: return True for prefix in [i[:1] for i in ignored_issues if i.endswith('*')]: if issue.startswith(prefix): return True for suffix in [i[1:] for i in ignored_issues if i.startswith('*')]: if issue.endswith(suffix): return True return False def _register_issue(self, path, line_number, issue, line): if not self._is_ignored(path, issue): if path and line_number and not line: line = linecache.getline(path, line_number).strip() issues.setdefault(path, []).append(Issue(line_number, issue, line)) reporter = Reporter() for path in _python_files(paths): pyflakes.api.checkPath(path, reporter) return issues def _module_exists(module_name): """ Checks if a module exists. :param str module_name: module to check existance of :returns: **True** if module exists and **False** otherwise """ try: __import__(module_name) return True except ImportError: return False def _python_files(paths): for path in paths: for file_path in stem.util.system.files_with_suffix(path, '.py'): skip = False for exclude_path in CONFIG['exclude_paths']: if re.match(exclude_path, file_path): skip = True break if not skip: yield file_path # TODO: drop with stem 2.x # We renamed our methods to drop a redundant 'get_*' prefix, so alias the old # names for backward compatability, and account for pep8 being renamed to # pycodestyle. get_stylistic_issues = stylistic_issues get_pyflakes_issues = pyflakes_issues is_pep8_available = is_pycodestyle_available stem-1.7.1/stem/util/system.py0000664000175000017500000012371613411002341017034 0ustar atagaratagar00000000000000# Copyright 2011-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Helper functions for working with the underlying system. These are mostly os dependent, only working on linux, osx, and bsd. In almost all cases they're best-effort, providing **None** if the lookup fails. .. versionchanged:: 1.3.0 Dropped the get_* prefix from several function names. The old names still work, but are deprecated aliases. .. versionchanged:: 1.5.0 Added the **SYSTEM_CALL_TIME** global, which tracks total time spent making system commands. **Module Overview:** :: is_windows - checks if we're running on windows is_mac - checks if we're running on a mac is_gentoo - checks if we're running on gentoo is_slackware - checks if we're running on slackware is_bsd - checks if we're running on the bsd family of operating systems is_available - determines if a command is available on this system is_running - determines if a given process is running size_of - provides the memory usage of an object call - runs the given system command and provides back the results name_by_pid - gets the name for a process by the given pid pid_by_name - gets the pid for a process by the given name pid_by_port - gets the pid for a process listening to a given port pid_by_open_file - gets the pid for the process with an open file pids_by_user - provides processes owned by a user cwd - provides the current working directory for a given process user - provides the user a process is running under start_time - provides the unix timestamp when the process started tail - provides lines from the end of a file bsd_jail_id - provides the BSD jail id a given process is running within bsd_jail_path - provides the path of the given BSD jail is_tarfile - checks if the given path is a tarball expand_path - expands relative paths and ~ entries files_with_suffix - provides files with the given suffix get_process_name - provides our process' name set_process_name - changes our process' name .. data:: Status (enum) State of a subprocess. .. versionadded:: 1.6.0 ==================== =========== Status Description ==================== =========== PENDING not yet started RUNNING currently being performed DONE completed successfully FAILED failed with an exception ==================== =========== """ import collections import ctypes import ctypes.util import itertools import mimetypes import multiprocessing import os import platform import re import subprocess import sys import tarfile import threading import time import stem.prereq import stem.util import stem.util.enum import stem.util.proc import stem.util.str_tools from stem import UNDEFINED from stem.util import log State = stem.util.enum.UppercaseEnum( 'PENDING', 'RUNNING', 'DONE', 'FAILED', ) SIZE_RECURSES = { tuple: iter, list: iter, collections.deque: iter, dict: lambda d: itertools.chain.from_iterable(d.items()), set: iter, frozenset: iter, } # Mapping of commands to if they're available or not. CMD_AVAILABLE_CACHE = {} # An incomplete listing of commands provided by the shell. Expand this as # needed. Some noteworthy things about shell commands... # # * They're not in the path so is_available() will fail. # * subprocess.Popen() without the 'shell = True' argument will fail with... # OSError: [Errno 2] No such file or directory SHELL_COMMANDS = ['ulimit'] IS_RUNNING_PS_LINUX = 'ps -A co command' IS_RUNNING_PS_BSD = 'ps -ao ucomm=' GET_NAME_BY_PID_PS = 'ps -p %s -o comm' GET_PID_BY_NAME_PGREP = 'pgrep -x %s' GET_PID_BY_NAME_PIDOF = 'pidof %s' GET_PID_BY_NAME_PS_LINUX = 'ps -o pid -C %s' GET_PID_BY_NAME_PS_BSD = 'ps axc' GET_PID_BY_NAME_LSOF = 'lsof -tc %s' GET_PID_BY_PORT_NETSTAT = 'netstat -npltu' GET_PID_BY_PORT_SOCKSTAT = 'sockstat -4l -P tcp -p %s' GET_PID_BY_PORT_LSOF = 'lsof -wnP -iTCP -sTCP:LISTEN' GET_PID_BY_FILE_LSOF = 'lsof -tw %s' GET_PIDS_BY_USER_LINUX = 'ps -o pid -u %s' GET_PIDS_BY_USER_BSD = 'ps -o pid -U %s' GET_CWD_PWDX = 'pwdx %s' GET_CWD_LSOF = 'lsof -a -p %s -d cwd -Fn' GET_BSD_JAIL_ID_PS = 'ps -p %s -o jid' GET_BSD_JAIL_PATH = 'jls -j %s' BLOCK_SIZE = 1024 # flag for setting the process name, found in '/usr/include/linux/prctl.h' PR_SET_NAME = 15 argc_t = ctypes.POINTER(ctypes.c_char_p) # The following can fail with pypy... # AttributeError: No symbol Py_GetArgcArgv found in library try: Py_GetArgcArgv = ctypes.pythonapi.Py_GetArgcArgv Py_GetArgcArgv.restype = None Py_GetArgcArgv.argtypes = [ ctypes.POINTER(ctypes.c_int), ctypes.POINTER(argc_t), ] except: Py_GetArgcArgv = None # This is both a cache for get_process_name() and tracks what we've changed our # process name to. _PROCESS_NAME = None # Length of our original process name. # # The original author our process renaming is based on did a memset for 256, # while Jake did it for the original process name length (capped at 1608). I'm # not sure of the reasons for either of these limits, but setting it to # anything higher than our original name length should be pointless, so opting # for Jake's limit. _MAX_NAME_LENGTH = -1 # Tracks total time spent shelling out to other commands like 'ps' and # 'netstat', so we can account for it as part of our cpu time along with # os.times(). SYSTEM_CALL_TIME = 0.0 SYSTEM_CALL_TIME_LOCK = threading.RLock() class CallError(OSError): """ Error response when making a system call. This is an **OSError** subclass with additional information about the process. Depending on the nature of the error not all of these attributes will be available. :var str msg: exception string :var str command: command that was ran :var int exit_status: exit code of the process :var float runtime: time the command took to run :var str stdout: stdout of the process :var str stderr: stderr of the process """ def __init__(self, msg, command, exit_status, runtime, stdout, stderr): self.msg = msg self.command = command self.exit_status = exit_status self.runtime = runtime self.stdout = stdout self.stderr = stderr def __str__(self): return self.msg class CallTimeoutError(CallError): """ Error response when making a system call that has timed out. .. versionadded:: 1.6.0 :var float timeout: time we waited """ def __init__(self, msg, command, exit_status, runtime, stdout, stderr, timeout): super(CallTimeoutError, self).__init__(msg, command, exit_status, runtime, stdout, stderr) self.timeout = timeout class DaemonTask(object): """ Invokes the given function in a subprocess, returning the value. .. versionadded:: 1.6.0 :var function runner: function to be invoked by the subprocess :var tuple args: arguments to provide to the subprocess :var int priority: subprocess nice priority :var stem.util.system.State status: state of the subprocess :var float runtime: seconds subprocess took to complete :var object result: return value of subprocess if successful :var exception error: exception raised by subprocess if it failed """ def __init__(self, runner, args = None, priority = 15, start = False): self.runner = runner self.args = args self.priority = priority self.status = State.PENDING self.runtime = None self.result = None self.error = None self._process = None self._pipe = None if start: self.run() def run(self): """ Invokes the task if it hasn't already been started. If it has this is a no-op. """ if self.status == State.PENDING: self._pipe, child_pipe = multiprocessing.Pipe() self._process = multiprocessing.Process(target = DaemonTask._run_wrapper, args = (child_pipe, self.priority, self.runner, self.args)) self._process.start() self.status = State.RUNNING def join(self): """ Provides the result of the daemon task. If still running this blocks until the task is completed. :returns: response of the function we ran :raises: exception raised by the function if it failed with one """ if self.status == State.PENDING: self.run() if self.status == State.RUNNING: self._process.join() response = self._pipe.recv() self.status = response[0] self.runtime = response[1] if self.status == State.DONE: self.result = response[2] elif self.status == State.FAILED: self.error = response[2] if self.status == State.DONE: return self.result elif self.status == State.FAILED: raise self.error else: raise RuntimeError('BUG: unexpected status from daemon task, %s' % self.status) @staticmethod def _run_wrapper(conn, priority, runner, args): start_time = time.time() os.nice(priority) try: result = runner(*args) if args else runner() conn.send((State.DONE, time.time() - start_time, result)) except Exception as exc: conn.send((State.FAILED, time.time() - start_time, exc)) finally: conn.close() def is_windows(): """ Checks if we are running on Windows. :returns: **bool** to indicate if we're on Windows """ return platform.system() == 'Windows' def is_mac(): """ Checks if we are running on Mac OSX. :returns: **bool** to indicate if we're on a Mac """ return platform.system() == 'Darwin' def is_gentoo(): """ Checks if we're running on Gentoo. :returns: **bool** to indicate if we're on Gentoo """ return os.path.exists('/etc/gentoo-release') def is_slackware(): """ Checks if we are running on a Slackware system. :returns: **bool** to indicate if we're on a Slackware system """ return os.path.exists('/etc/slackware-version') def is_bsd(): """ Checks if we are within the BSD family of operating systems. This currently recognizes Macs, FreeBSD, and OpenBSD but may be expanded later. :returns: **bool** to indicate if we're on a BSD OS """ return platform.system() in ('Darwin', 'FreeBSD', 'OpenBSD', 'NetBSD') def is_available(command, cached=True): """ Checks the current PATH to see if a command is available or not. If more than one command is present (for instance "ls -a | grep foo") then this just checks the first. Note that shell (like cd and ulimit) aren't in the PATH so this lookup will try to assume that it's available. This only happends for recognized shell commands (those in SHELL_COMMANDS). :param str command: command to search for :param bool cached: makes use of available cached results if **True** :returns: **True** if an executable we can use by that name exists in the PATH, **False** otherwise """ if ' ' in command: command = command.split(' ')[0] if command in SHELL_COMMANDS: return True # we can't actually look it up, so hope the shell really provides it... elif cached and command in CMD_AVAILABLE_CACHE: return CMD_AVAILABLE_CACHE[command] elif 'PATH' not in os.environ: return False # lacking a path will cause find_executable() to internally fail cmd_exists = False for path in os.environ['PATH'].split(os.pathsep): cmd_path = os.path.join(path, command) if is_windows(): cmd_path += '.exe' if os.path.exists(cmd_path) and os.access(cmd_path, os.X_OK): cmd_exists = True break CMD_AVAILABLE_CACHE[command] = cmd_exists return cmd_exists def is_running(command): """ Checks for if a process with a given name or pid is running. .. versionchanged:: 1.6.0 Added support for list and pid arguments. :param str,list,int command: process name if a str, multiple process names if a list, or pid if an int to be checked :returns: **True** if the process is running, **False** if it's not among ps results, and **None** if ps can't be queried """ if isinstance(command, int): try: os.kill(command, 0) return True except OSError: return False # Linux and the BSD families have different variants of ps. Guess based on # the is_bsd() check which to try first, then fall back to the other. # # Linux # -A - Select all processes. # -co command - Shows just the base command. # # Mac / BSD # -a - Display information about other users' processes as well as # our own. # -o ucomm= - Shows just the ucomm attribute ("name to be used for # accounting") if is_available('ps'): if is_bsd(): primary_resolver = IS_RUNNING_PS_BSD secondary_resolver = IS_RUNNING_PS_LINUX else: primary_resolver = IS_RUNNING_PS_LINUX secondary_resolver = IS_RUNNING_PS_BSD command_listing = call(primary_resolver, None) if not command_listing: command_listing = call(secondary_resolver, None) if command_listing: command_listing = [c.strip() for c in command_listing] if stem.util._is_str(command): command = [command] for cmd in command: if cmd in command_listing: return True return False return None def size_of(obj, exclude = None): """ Provides the `approximate memory usage of an object `_. This can recurse tuples, lists, deques, dicts, and sets. To teach this function to inspect additional object types expand SIZE_RECURSES... :: stem.util.system.SIZE_RECURSES[SomeClass] = SomeClass.get_elements .. versionadded:: 1.6.0 :param object obj: object to provide the size of :param set exclude: object ids to exclude from size estimation :returns: **int** with the size of the object in bytes :raises: **NotImplementedError** if using PyPy """ if stem.prereq.is_pypy(): raise NotImplementedError('PyPy does not implement sys.getsizeof()') if exclude is None: exclude = set() elif id(obj) in exclude: return 0 try: size = sys.getsizeof(obj) except TypeError: size = sys.getsizeof(0) # estimate if object lacks a __sizeof__ exclude.add(id(obj)) if type(obj) in SIZE_RECURSES: for entry in SIZE_RECURSES[type(obj)](obj): size += size_of(entry, exclude) return size def name_by_pid(pid): """ Attempts to determine the name a given process is running under (not including arguments). This uses... :: 1. Information from /proc 2. ps -p -o command :param int pid: process id of the process to be queried :returns: **str** with the process name, **None** if it can't be determined """ process_name = None if stem.util.proc.is_available(): try: process_name = stem.util.proc.stats(pid, stem.util.proc.Stat.COMMAND)[0] except IOError: pass # attempts to resolve using ps, failing if: # - system's ps variant doesn't handle these flags (none known at the moment) # # example output: # atagar@morrigan:~$ ps -p 5767 -o comm # COMMAND # vim if not process_name: try: results = call(GET_NAME_BY_PID_PS % pid) except OSError: results = None if results and len(results) == 2 and results[0] == 'COMMAND': process_name = results[1].strip() return process_name def pid_by_name(process_name, multiple = False): """ Attempts to determine the process id for a running process, using... :: 1. pgrep -x 2. pidof 3. ps -o pid -C (linux) ps axc | egrep " $" (bsd) 4. lsof -tc 5. tasklist | str .exe :param str process_name: process name for which to fetch the pid :param bool multiple: provides a list of all pids if **True**, otherwise results with multiple processes are discarded :returns: Response depends upon the 'multiple' argument as follows... * if **False** then this provides an **int** with the process id or **None** if it can't be determined * if **True** then this provides a **list** of all **int** process ids, and an empty list if it can't be determined """ # attempts to resolve using pgrep, failing if: # - we're running on bsd (command unavailable) # # example output: # atagar@morrigan:~$ pgrep -x vim # 3283 # 3392 if is_available('pgrep'): results = call(GET_PID_BY_NAME_PGREP % process_name, None) if results: try: pids = list(map(int, results)) if multiple: return pids elif len(pids) == 1: return pids[0] except ValueError: pass # attempts to resolve using pidof, failing if: # - we're running on bsd (command unavailable) # # example output: # atagar@morrigan:~$ pidof vim # 3392 3283 if is_available('pidof'): results = call(GET_PID_BY_NAME_PIDOF % process_name, None) if results and len(results) == 1: try: pids = list(map(int, results[0].split())) if multiple: return pids elif len(pids) == 1: return pids[0] except ValueError: pass # attempts to resolve using ps, failing if: # - system's ps variant doesn't handle these flags (none known at the moment) # # example output: # atagar@morrigan:~/Desktop/stem$ ps -o pid -C vim # PID # 3283 # 3392 # # atagar$ ps axc # PID TT STAT TIME COMMAND # 1 ?? Ss 9:00.22 launchd # 10 ?? Ss 0:09.97 kextd # 11 ?? Ss 5:47.36 DirectoryService # 12 ?? Ss 3:01.44 notifyd if is_available('ps'): if not is_bsd(): # linux variant of ps results = call(GET_PID_BY_NAME_PS_LINUX % process_name, None) if results: try: pids = list(map(int, results[1:])) if multiple: return pids elif len(pids) == 1: return pids[0] except ValueError: pass if is_bsd(): # bsd variant of ps results = call(GET_PID_BY_NAME_PS_BSD, None) if results: # filters results to those with our process name results = [r.split()[0] for r in results if r.endswith(' %s' % process_name)] try: pids = list(map(int, results)) if multiple: return pids elif len(pids) == 1: return pids[0] except ValueError: pass # resolves using lsof which works on both Linux and BSD, only failing if: # - lsof is unavailable (not included by default on OpenBSD) # - the process being run as a different user due to permissions # - the process doesn't have any open files to be reported by lsof? # # flags: # t - only show pids # c - restrict results to that command # # example output: # atagar@morrigan:~$ lsof -t -c vim # 2470 # 2561 if is_available('lsof'): results = call(GET_PID_BY_NAME_LSOF % process_name, None) if results: try: pids = list(map(int, results)) if multiple: return pids elif len(pids) == 1: return pids[0] except ValueError: pass if is_available('tasklist') and is_windows(): if not process_name.endswith('.exe'): process_name = process_name + '.exe' process_ids = [] results = stem.util.system.call('tasklist', None) if results: tasklist_regex = re.compile('^\s*%s\s+(?P[0-9]*)' % process_name) for line in results: match = tasklist_regex.search(line) if match: process_ids.append(int(match.group('pid'))) if multiple: return process_ids elif len(process_ids) > 0: return process_ids[0] log.debug("failed to resolve a pid for '%s'" % process_name) return [] if multiple else None def pid_by_port(port): """ Attempts to determine the process id for a process with the given port, using... :: 1. netstat -npltu | grep 127.0.0.1: 2. sockstat -4l -P tcp -p 3. lsof -wnP -iTCP -sTCP:LISTEN | grep ":" Most queries limit results to listening TCP connections. This function likely won't work on Mac OSX. :param int port: port where the process we're looking for is listening :returns: **int** with the process id, **None** if it can't be determined """ # attempts to resolve using netstat, failing if: # - netstat doesn't accept these flags (Linux only) # - the process being run as a different user due to permissions # # flags: # n - numeric (disables hostname lookups) # p - program (include pids) # l - listening (include listening sockets) # tu - show tcp and udp sockets, and nothing else # # example output: # atagar@morrigan:~$ netstat -npltu # Active Internet connections (only servers) # Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name # tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN - # tcp 0 0 127.0.0.1:9051 0.0.0.0:* LISTEN 1641/tor # tcp6 0 0 ::1:631 :::* LISTEN - # udp 0 0 0.0.0.0:5353 0.0.0.0:* - # udp6 0 0 fe80::7ae4:ff:fe2f::123 :::* - if is_available('netstat'): results = call(GET_PID_BY_PORT_NETSTAT, None) if results: # filters to results with our port results = [r for r in results if '127.0.0.1:%s' % port in r] if len(results) == 1 and len(results[0].split()) == 7: results = results[0].split()[6] # process field (ex. "7184/tor") pid = results[:results.find('/')] if pid.isdigit(): return int(pid) # attempts to resolve using sockstat, failing if: # - sockstat doesn't accept the -4 flag (BSD only) # - sockstat isn't available (encountered with OSX 10.5.8) # - there are multiple instances using the same port on different addresses # # flags: # 4 - only show IPv4 sockets # l - listening sockets # P tcp - only show tcp connections # p - only includes results if the local or foreign port match this # # example output: # # sockstat -4 | grep tor # _tor tor 4397 7 tcp4 51.64.7.84:9050 *:* # _tor tor 4397 8 udp4 51.64.7.84:53 *:* # _tor tor 4397 12 tcp4 51.64.7.84:54011 80.3.121.7:9001 # _tor tor 4397 15 tcp4 51.64.7.84:59374 7.42.1.102:9001 # _tor tor 4397 20 tcp4 51.64.7.84:51946 32.83.7.104:443 if is_available('sockstat'): results = call(GET_PID_BY_PORT_SOCKSTAT % port, None) if results: # filters to results where this is the local port results = [r for r in results if (len(r.split()) == 7 and (':%s' % port) in r.split()[5])] if len(results) == 1: pid = results[0].split()[2] if pid.isdigit(): return int(pid) # resolves using lsof which works on both Linux and BSD, only failing if: # - lsof is unavailable (not included by default on OpenBSD) # - lsof doesn't provide the port ip/port, nor accept the -i and -s args # (encountered with OSX 10.5.8) # - the process being run as a different user due to permissions # - there are multiple instances using the same port on different addresses # # flags: # w - disables warning messages # n - numeric addresses (disables hostname lookups) # P - numeric ports (disables replacement of ports with their protocol) # iTCP - only show tcp connections # sTCP:LISTEN - listening sockets # # example output: # atagar@morrigan:~$ lsof -wnP -iTCP -sTCP:LISTEN # COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME # tor 1745 atagar 6u IPv4 14229 0t0 TCP 127.0.0.1:9051 (LISTEN) if is_available('lsof'): results = call(GET_PID_BY_PORT_LSOF, None) if results: # filters to results with our port results = [r for r in results if (len(r.split()) == 10 and (':%s' % port) in r.split()[8])] if len(results) == 1: pid = results[0].split()[1] if pid.isdigit(): return int(pid) return None # all queries failed def pid_by_open_file(path): """ Attempts to determine the process id for a process with the given open file, using... :: lsof -w :param str path: location of the socket file to query against :returns: **int** with the process id, **None** if it can't be determined """ # resolves using lsof which works on both Linux and BSD, only failing if: # - lsof is unavailable (not included by default on OpenBSD) # - the file can't be read due to permissions # # flags: # t - only show pids # w - disables warning messages # # example output: # atagar@morrigan:~$ lsof -tw /tmp/foo # 4762 if is_available('lsof'): results = call(GET_PID_BY_FILE_LSOF % path, []) if len(results) == 1: pid = results[0].strip() if pid.isdigit(): return int(pid) return None # all queries failed def pids_by_user(user): """ Provides processes owned by a given user. .. versionadded:: 1.5.0 :param str user: user to look up processes for :returns: **list** with the process ids, **None** if it can't be determined """ # example output: # atagar@odin:~$ ps -o pid -u avahi # PID # 914 # 915 if is_available('ps'): if is_bsd(): results = call(GET_PIDS_BY_USER_BSD % user, None) else: results = call(GET_PIDS_BY_USER_LINUX % user, None) if results: try: return list(map(int, results[1:])) except ValueError: pass return None def cwd(pid): """ Provides the working directory of the given process. :param int pid: process id of the process to be queried :returns: **str** with the absolute path for the process' present working directory, **None** if it can't be determined """ # try fetching via the proc contents if it's available if stem.util.proc.is_available(): try: return stem.util.proc.cwd(pid) except IOError: pass # Fall back to a pwdx query. This isn't available on BSD. logging_prefix = 'cwd(%s):' % pid if is_available('pwdx'): # pwdx results are of the form: # 3799: /home/atagar # 5839: No such process results = call(GET_CWD_PWDX % pid, None) if not results: log.debug("%s pwdx didn't return any results" % logging_prefix) elif results[0].endswith('No such process'): log.debug('%s pwdx processes reported for this pid' % logging_prefix) elif len(results) != 1 or results[0].count(' ') != 1 or not results[0].startswith('%s: ' % pid): log.debug('%s we got unexpected output from pwdx: %s' % (logging_prefix, results)) else: return results[0].split(' ', 1)[1].strip() # Use lsof as the final fallback. This is available on both Linux and is the # only lookup method here that works for BSD... # https://trac.torproject.org/projects/tor/ticket/4236 # # flags: # a - presents the intersection of the following arguments # p - limits results to this pid # d cwd - limits results to just the cwd rather than all open files # Fn - short listing in a single column, with just the pid and cwd # # example output: # ~$ lsof -a -p 75717 -d cwd -Fn # p75717 # n/Users/atagar/tor/src/or if is_available('lsof'): results = call(GET_CWD_LSOF % pid, []) if len(results) >= 2 and results[-1].startswith('n/'): lsof_result = results[-1][1:].strip() # If we lack read permissions for the cwd then it returns... # p2683 # n/proc/2683/cwd (readlink: Permission denied) if ' ' not in lsof_result: return lsof_result else: log.debug('%s we got unexpected output from lsof: %s' % (logging_prefix, results)) return None # all queries failed def user(pid): """ Provides the user a process is running under. :param int pid: process id of the process to be queried :returns: **str** with the username a process is running under, **None** if it can't be determined """ if not isinstance(pid, int) or pid < 0: return None if stem.util.proc.is_available(): try: import pwd # only available on unix platforms uid = stem.util.proc.uid(pid) if uid and uid.isdigit(): return pwd.getpwuid(int(uid)).pw_name except: pass if is_available('ps'): results = call('ps -o user %s' % pid, []) if len(results) >= 2: return results[1].strip() return None def start_time(pid): """ Provides the unix timestamp when the given process started. :param int pid: process id of the process to be queried :returns: **float** for the unix timestamp when the process began, **None** if it can't be determined """ if not isinstance(pid, int) or pid < 0: return None if stem.util.proc.is_available(): try: return float(stem.util.proc.stats(pid, stem.util.proc.Stat.START_TIME)[0]) except IOError: pass try: ps_results = call('ps -p %s -o etime' % pid, []) if len(ps_results) >= 2: etime = ps_results[1].strip() return time.time() - stem.util.str_tools.parse_short_time_label(etime) except: pass return None def tail(target, lines = None): """ Provides lines of a file starting with the end. For instance, 'tail -n 50 /tmp/my_log' could be done with... :: reversed(list(tail('/tmp/my_log', 50))) :param str,file target: path or file object to read from :param int lines: number of lines to read :returns: **generator** that reads lines, starting with the end :raises: **IOError** if unable to read the file """ if isinstance(target, str): with open(target, 'rb') as target_file: for line in tail(target_file, lines): yield line return # based on snippet from... # https://stackoverflow.com/questions/136168/get-last-n-lines-of-a-file-with-python-similar-to-tail target.seek(0, 2) # go to the end of the file block_end_byte = target.tell() block_number = -1 content = b'' while (lines is None or lines > 0) and block_end_byte > 0: if (block_end_byte - BLOCK_SIZE > 0): # read the last block we haven't yet read target.seek(block_number * BLOCK_SIZE, 2) content, completed_lines = (target.read(BLOCK_SIZE) + content).split(b'\n', 1) else: # reached the start of the file, just read what's left target.seek(0, 0) completed_lines = target.read(block_end_byte) + content for line in reversed(completed_lines.splitlines()): if lines is None or lines > 0: if lines is not None: lines -= 1 yield stem.util.str_tools._to_unicode(line) block_end_byte -= BLOCK_SIZE block_number -= 1 def bsd_jail_id(pid): """ Gets the jail id for a process. These seem to only exist for FreeBSD (this style for jails does not exist on Linux, OSX, or OpenBSD). :param int pid: process id of the jail id to be queried :returns: **int** for the jail id, zero if this can't be determined """ # Output when called from a FreeBSD jail or when Tor isn't jailed: # JID # 0 # # Otherwise it's something like: # JID # 1 ps_output = call(GET_BSD_JAIL_ID_PS % pid, []) if len(ps_output) == 2 and len(ps_output[1].split()) == 1: jid = ps_output[1].strip() if jid.isdigit(): return int(jid) os_name = platform.system() if os_name == 'FreeBSD': log.warn('Unable to get the jail id for process %s.' % pid) else: log.debug('bsd_jail_id(%s): jail ids do not exist on %s' % (pid, os_name)) return 0 def bsd_jail_path(jid): """ Provides the path of the given FreeBSD jail. :param int jid: jail id to be queried :returns: **str** of the path prefix, **None** if this can't be determined """ if jid != 0: # Output should be something like: # JID IP Address Hostname Path # 1 10.0.0.2 tor-jail /usr/jails/tor-jail jls_output = call(GET_BSD_JAIL_PATH % jid, []) if len(jls_output) == 2 and len(jls_output[1].split()) == 4: return jls_output[1].split()[3] return None def is_tarfile(path): """ Returns if the path belongs to a tarfile or not. .. versionadded:: 1.2.0 :param str path: path to be checked :returns: **True** if the path belongs to a tarball, **False** otherwise """ # Checking if it's a tar file may fail due to permissions so failing back # to the mime type... # # IOError: [Errno 13] Permission denied: '/vmlinuz.old' # # With python 3 insuffient permissions raises an AttributeError instead... # # http://bugs.python.org/issue17059 try: return tarfile.is_tarfile(path) except (IOError, AttributeError): return mimetypes.guess_type(path)[0] == 'application/x-tar' def expand_path(path, cwd = None): """ Provides an absolute path, expanding tildes with the user's home and appending a current working directory if the path was relative. :param str path: path to be expanded :param str cwd: current working directory to expand relative paths with, our process' if this is **None** :returns: **str** of the path expanded to be an absolute path, never with an ending slash """ if is_windows(): relative_path = path.replace('/', '\\').rstrip('\\') else: relative_path = path.rstrip('/') if not relative_path or os.path.isabs(relative_path): # empty or already absolute - nothing to do pass elif relative_path.startswith('~'): # prefixed with a ~ or ~user entry relative_path = os.path.expanduser(relative_path) else: # relative path, expand with the cwd if not cwd: cwd = os.getcwd() # we'll be dealing with both "my/path/" and "./my/path" entries, so # cropping the later if relative_path.startswith('./') or relative_path.startswith('.\\'): relative_path = relative_path[2:] elif relative_path == '.': relative_path = '' if relative_path == '': relative_path = cwd else: relative_path = os.path.join(cwd, relative_path) return relative_path def files_with_suffix(base_path, suffix): """ Iterates over files in a given directory, providing filenames with a certain suffix. .. versionadded:: 1.2.0 :param str base_path: directory to be iterated over :param str suffix: filename suffix to look for :returns: iterator that yields the absolute path for files with the given suffix """ if os.path.isfile(base_path): if base_path.endswith(suffix): yield base_path else: for root, _, files in os.walk(base_path): for filename in files: if filename.endswith(suffix): yield os.path.join(root, filename) def call(command, default = UNDEFINED, ignore_exit_status = False, timeout = None, cwd = None, env = None): """ call(command, default = UNDEFINED, ignore_exit_status = False) Issues a command in a subprocess, blocking until completion and returning the results. This is not actually ran in a shell so pipes and other shell syntax are not permitted. .. versionchanged:: 1.5.0 Providing additional information upon failure by raising a CallError. This is a subclass of OSError, providing backward compatibility. .. versionchanged:: 1.5.0 Added env argument. .. versionchanged:: 1.6.0 Added timeout and cwd arguments. :param str,list command: command to be issued :param object default: response if the query fails :param bool ignore_exit_status: reports failure if our command's exit status was non-zero :param float timeout: maximum seconds to wait, blocks indefinitely if **None** :param dict env: environment variables :returns: **list** with the lines of output from the command :raises: * **CallError** if this fails and no default was provided * **CallTimeoutError** if the timeout is reached without a default """ # TODO: in stem 2.x return a struct with stdout, stderr, and runtime instead global SYSTEM_CALL_TIME if isinstance(command, str): command_list = command.split(' ') else: command_list = list(map(str, command)) exit_status, runtime, stdout, stderr = None, None, None, None start_time = time.time() try: is_shell_command = command_list[0] in SHELL_COMMANDS process = subprocess.Popen(command_list, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = is_shell_command, cwd = cwd, env = env) if timeout: while process.poll() is None: if time.time() - start_time > timeout: raise CallTimeoutError("Process didn't finish after %0.1f seconds" % timeout, ' '.join(command_list), None, timeout, '', '', timeout) time.sleep(0.001) stdout, stderr = process.communicate() stdout, stderr = stdout.strip(), stderr.strip() runtime = time.time() - start_time log.debug('System call: %s (runtime: %0.2f)' % (command, runtime)) if log.is_tracing(): trace_prefix = 'Received from system (%s)' % command if stdout and stderr: log.trace(trace_prefix + ', stdout:\n%s\nstderr:\n%s' % (stdout, stderr)) elif stdout: log.trace(trace_prefix + ', stdout:\n%s' % stdout) elif stderr: log.trace(trace_prefix + ', stderr:\n%s' % stderr) exit_status = process.poll() if not ignore_exit_status and exit_status != 0: raise OSError('%s returned exit status %i' % (command, exit_status)) if stdout: return stdout.decode('utf-8', 'replace').splitlines() else: return [] except CallTimeoutError: log.debug('System call (timeout): %s (after %0.4fs)' % (command, timeout)) if default != UNDEFINED: return default else: raise except OSError as exc: log.debug('System call (failed): %s (error: %s)' % (command, exc)) if default != UNDEFINED: return default else: raise CallError(str(exc), ' '.join(command_list), exit_status, runtime, stdout, stderr) finally: with SYSTEM_CALL_TIME_LOCK: SYSTEM_CALL_TIME += time.time() - start_time def get_process_name(): """ Provides the present name of our process. :returns: **str** with the present name of our process """ global _PROCESS_NAME, _MAX_NAME_LENGTH if _PROCESS_NAME is None: # Example output... # # COMMAND # python run_tests.py --unit ps_output = call('ps -p %i -o args' % os.getpid(), []) if len(ps_output) == 2 and ps_output[0] in ('COMMAND', 'ARGS'): _PROCESS_NAME = ps_output[1] else: # Falling back on using ctypes to get our argv. Unfortunately the simple # method for getting this... # # ' '.join(['python'] + sys.argv) # # ... doesn't do the trick since this will miss interpreter arguments. # # python -W ignore::DeprecationWarning my_script.py args, argc = [], argc_t() for i in range(100): # The ending index can be either None or raise a ValueError when # accessed... # # ValueError: NULL pointer access try: if argc[i] is None: break except ValueError: break args.append(str(argc[i])) _PROCESS_NAME = ' '.join(args) _MAX_NAME_LENGTH = len(_PROCESS_NAME) return _PROCESS_NAME def set_process_name(process_name): """ Renames our current process from "python " to a custom name. This is best-effort, not necessarily working on all platforms. **Note:** This might have issues on FreeBSD (:trac:`9804`). :param str process_name: new name for our process """ # This is mostly based on... # # http://www.rhinocerus.net/forum/lang-python/569677-setting-program-name-like-0-perl.html#post2272369 # # ... and an adaptation by Jake... # # https://github.com/ioerror/chameleon # # A cleaner implementation is available at... # # https://github.com/cream/libs/blob/b38970e2a6f6d2620724c828808235be0445b799/cream/util/procname.py # # but I'm not quite clear on their implementation, and it only does targeted # argument replacement (ie, replace argv[0], argv[1], etc but with a string # the same size). _set_argv(process_name) if platform.system() == 'Linux': _set_prctl_name(process_name) elif platform.system() in ('Darwin', 'FreeBSD', 'OpenBSD'): _set_proc_title(process_name) def _set_argv(process_name): """ Overwrites our argv in a similar fashion to how it's done in C with: strcpy(argv[0], 'new_name'); """ if Py_GetArgcArgv is None: return global _PROCESS_NAME # both gets the current process name and initializes _MAX_NAME_LENGTH current_name = get_process_name() argv, argc = ctypes.c_int(0), argc_t() Py_GetArgcArgv(argv, ctypes.pointer(argc)) if len(process_name) > _MAX_NAME_LENGTH: raise IOError("Can't rename process to something longer than our initial name (this would overwrite memory used for the env)") # space we need to clear zero_size = max(len(current_name), len(process_name)) ctypes.memset(argc.contents, 0, zero_size + 1) # null terminate the string's end process_name_encoded = process_name.encode('utf8') ctypes.memmove(argc.contents, process_name_encoded, len(process_name)) _PROCESS_NAME = process_name def _set_prctl_name(process_name): """ Sets the prctl name, which is used by top and killall. This appears to be Linux specific and has the max of 15 characters. This is from... http://stackoverflow.com/questions/564695/is-there-a-way-to-change-effective-process-name-in-python/923034#923034 """ libc = ctypes.CDLL(ctypes.util.find_library('c')) name_buffer = ctypes.create_string_buffer(len(process_name) + 1) name_buffer.value = stem.util.str_tools._to_bytes(process_name) libc.prctl(PR_SET_NAME, ctypes.byref(name_buffer), 0, 0, 0) def _set_proc_title(process_name): """ BSD specific calls (should be compataible with both FreeBSD and OpenBSD: http://fxr.watson.org/fxr/source/gen/setproctitle.c?v=FREEBSD-LIBC http://www.rootr.net/man/man/setproctitle/3 """ libc = ctypes.CDLL(ctypes.util.find_library('c')) name_buffer = ctypes.create_string_buffer(len(process_name) + 1) name_buffer.value = process_name.encode() try: libc.setproctitle(ctypes.byref(name_buffer)) except AttributeError: # Possible issue (seen on OSX): # AttributeError: dlsym(0x7fff6a41d1e0, setproctitle): symbol not found pass # TODO: drop with stem 2.x # We renamed our methods to drop a redundant 'get_*' prefix, so alias the old # names for backward compatability. get_name_by_pid = name_by_pid get_pid_by_name = pid_by_name get_pid_by_port = pid_by_port get_pid_by_open_file = pid_by_open_file get_cwd = cwd get_user = user get_start_time = start_time get_bsd_jail_id = bsd_jail_id get_bsd_jail_path = bsd_jail_path stem-1.7.1/stem/util/conf.py0000664000175000017500000006105513341034346016446 0ustar atagaratagar00000000000000# Copyright 2011-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Handlers for text configuration files. Configurations are simple string to string mappings, with the configuration files using the following rules... * the key/value is separated by a space * anything after a '#' is ignored as a comment * excess whitespace is trimmed * empty lines are ignored * multi-line values can be defined by following the key with lines starting with a '|' For instance... :: # This is my sample config user.name Galen user.password yabba1234 # here's an inline comment user.notes takes a fancy to pepperjack cheese blankEntry.example msg.greeting |Multi-line message exclaiming of the |wonder and awe that is pepperjack! ... would be loaded as... :: config = { 'user.name': 'Galen', 'user.password': 'yabba1234', 'user.notes': 'takes a fancy to pepperjack cheese', 'blankEntry.example': '', 'msg.greeting': 'Multi-line message exclaiming of the\\nwonder and awe that is pepperjack!', } Configurations are managed via the :class:`~stem.util.conf.Config` class. The :class:`~stem.util.conf.Config` can be be used directly with its :func:`~stem.util.conf.Config.get` and :func:`~stem.util.conf.Config.set` methods, but usually modules will want a local dictionary with just the configurations that it cares about. To do this use the :func:`~stem.util.conf.config_dict` function. For example... :: import getpass from stem.util import conf, connection def config_validator(key, value): if key == 'timeout': # require at least a one second timeout return max(1, value) elif key == 'endpoint': if not connection.is_valid_ipv4_address(value): raise ValueError("'%s' isn't a valid IPv4 address" % value) elif key == 'port': if not connection.is_valid_port(value): raise ValueError("'%s' isn't a valid port" % value) elif key == 'retries': # negative retries really don't make sense return max(0, value) CONFIG = conf.config_dict('ssh_login', { 'username': getpass.getuser(), 'password': '', 'timeout': 10, 'endpoint': '263.12.8.0', 'port': 22, 'reconnect': False, 'retries': 3, }, config_validator) There's several things going on here so lets take it step by step... * The :func:`~stem.util.conf.config_dict` provides a dictionary that's bound to a given configuration. If the "ssh_proxy_config" configuration changes then so will the contents of CONFIG. * The dictionary we're passing to :func:`~stem.util.conf.config_dict` provides two important pieces of information: default values and their types. See the Config's :func:`~stem.util.conf.Config.get` method for how these type inferences work. * The config_validator is a hook we're adding to make sure CONFIG only gets values we think are valid. In this case it ensures that our timeout value is at least one second, and rejects endpoints or ports that are invalid. Now lets say our user has the following configuration file... :: username waddle_doo password jabberwocky timeout -15 port 9000000 retries lots reconnect true logging debug ... and we load it as follows... :: >>> from stem.util import conf >>> our_config = conf.get_config('ssh_login') >>> our_config.load('/home/atagar/user_config') >>> print CONFIG # doctest: +SKIP { "username": "waddle_doo", "password": "jabberwocky", "timeout": 1, "endpoint": "263.12.8.0", "port": 22, "reconnect": True, "retries": 3, } Here's an expanation of what happened... * the username, password, and reconnect attributes took the values in the configuration file * the 'config_validator' we added earlier allows for a minimum timeout of one and rejected the invalid port (with a log message) * we weren't able to convert the retries' "lots" value to an integer so it kept its default value and logged a warning * the user didn't supply an endpoint so that remained unchanged * our CONFIG didn't have a 'logging' attribute so it was ignored **Module Overview:** :: config_dict - provides a dictionary that's kept in sync with our config get_config - singleton for getting configurations uses_settings - provides an annotation for functions that use configurations parse_enum_csv - helper funcion for parsing confguration entries for enums Config - Custom configuration |- load - reads a configuration file |- save - writes the current configuration to a file |- clear - empties our loaded configuration contents |- add_listener - notifies the given listener when an update occurs |- clear_listeners - removes any attached listeners |- keys - provides keys in the loaded configuration |- set - sets the given key/value pair |- unused_keys - provides keys that have never been requested |- get - provides the value for a given key, with type inference +- get_value - provides the value for a given key as a string """ import inspect import os import threading import stem.prereq from stem.util import log try: # added in python 2.7 from collections import OrderedDict except ImportError: from stem.util.ordereddict import OrderedDict CONFS = {} # mapping of identifier to singleton instances of configs class _SyncListener(object): def __init__(self, config_dict, interceptor): self.config_dict = config_dict self.interceptor = interceptor def update(self, config, key): if key in self.config_dict: new_value = config.get(key, self.config_dict[key]) if new_value == self.config_dict[key]: return # no change if self.interceptor: interceptor_value = self.interceptor(key, new_value) if interceptor_value: new_value = interceptor_value self.config_dict[key] = new_value def config_dict(handle, conf_mappings, handler = None): """ Makes a dictionary that stays synchronized with a configuration. This takes a dictionary of 'config_key => default_value' mappings and changes the values to reflect our current configuration. This will leave the previous values alone if... * we don't have a value for that config_key * we can't convert our value to be the same type as the default_value If a handler is provided then this is called just prior to assigning new values to the config_dict. The handler function is expected to accept the (key, value) for the new values and return what we should actually insert into the dictionary. If this returns None then the value is updated as normal. For more information about how we convert types see our :func:`~stem.util.conf.Config.get` method. **The dictionary you get from this is manged by the Config class and should be treated as being read-only.** :param str handle: unique identifier for a config instance :param dict conf_mappings: config key/value mappings used as our defaults :param functor handler: function referred to prior to assigning values """ selected_config = get_config(handle) selected_config.add_listener(_SyncListener(conf_mappings, handler).update) return conf_mappings def get_config(handle): """ Singleton constructor for configuration file instances. If a configuration already exists for the handle then it's returned. Otherwise a fresh instance is constructed. :param str handle: unique identifier used to access this config instance """ if handle not in CONFS: CONFS[handle] = Config() return CONFS[handle] def uses_settings(handle, path, lazy_load = True): """ Provides a function that can be used as a decorator for other functions that require settings to be loaded. Functions with this decorator will be provided with the configuration as its 'config' keyword argument. .. versionchanged:: 1.3.0 Omits the 'config' argument if the funcion we're decorating doesn't accept it. :: uses_settings = stem.util.conf.uses_settings('my_app', '/path/to/settings.cfg') @uses_settings def my_function(config): print 'hello %s!' % config.get('username', '') :param str handle: hande for the configuration :param str path: path where the configuration should be loaded from :param bool lazy_load: loads the configuration file when the decorator is used if true, otherwise it's loaded right away :returns: **function** that can be used as a decorator to provide the configuration :raises: **IOError** if we fail to read the configuration file, if **lazy_load** is true then this arises when we use the decorator """ config = get_config(handle) if not lazy_load and not config._settings_loaded: config.load(path) config._settings_loaded = True def decorator(func): def wrapped(*args, **kwargs): if lazy_load and not config._settings_loaded: config.load(path) config._settings_loaded = True if 'config' in inspect.getargspec(func).args: return func(*args, config = config, **kwargs) else: return func(*args, **kwargs) return wrapped return decorator def parse_enum(key, value, enumeration): """ Provides the enumeration value for a given key. This is a case insensitive lookup and raises an exception if the enum key doesn't exist. :param str key: configuration key being looked up :param str value: value to be parsed :param stem.util.enum.Enum enumeration: enumeration the values should be in :returns: enumeration value :raises: **ValueError** if the **value** isn't among the enumeration keys """ return parse_enum_csv(key, value, enumeration, 1)[0] def parse_enum_csv(key, value, enumeration, count = None): """ Parses a given value as being a comma separated listing of enumeration keys, returning the corresponding enumeration values. This is intended to be a helper for config handlers. The checks this does are case insensitive. The **count** attribute can be used to make assertions based on the number of values. This can be... * None to indicate that there's no restrictions. * An int to indicate that we should have this many values. * An (int, int) tuple to indicate the range that values can be in. This range is inclusive and either can be None to indicate the lack of a lower or upper bound. :param str key: configuration key being looked up :param str value: value to be parsed :param stem.util.enum.Enum enumeration: enumeration the values should be in :param int,tuple count: validates that we have this many items :returns: list with the enumeration values :raises: **ValueError** if the count assertion fails or the **value** entries don't match the enumeration keys """ values = [val.upper().strip() for val in value.split(',')] if values == ['']: return [] if count is None: pass # no count validateion checks to do elif isinstance(count, int): if len(values) != count: raise ValueError("Config entry '%s' is expected to be %i comma separated values, got '%s'" % (key, count, value)) elif isinstance(count, tuple) and len(count) == 2: minimum, maximum = count if minimum is not None and len(values) < minimum: raise ValueError("Config entry '%s' must have at least %i comma separated values, got '%s'" % (key, minimum, value)) if maximum is not None and len(values) > maximum: raise ValueError("Config entry '%s' can have at most %i comma separated values, got '%s'" % (key, maximum, value)) else: raise ValueError("The count must be None, an int, or two value tuple. Got '%s' (%s)'" % (count, type(count))) result = [] enum_keys = [k.upper() for k in list(enumeration.keys())] enum_values = list(enumeration) for val in values: if val in enum_keys: result.append(enum_values[enum_keys.index(val)]) else: raise ValueError("The '%s' entry of config entry '%s' wasn't in the enumeration (expected %s)" % (val, key, ', '.join(enum_keys))) return result class Config(object): """ Handler for easily working with custom configurations, providing persistence to and from files. All operations are thread safe. **Example usage:** User has a file at '/home/atagar/myConfig' with... :: destination.ip 1.2.3.4 destination.port blarg startup.run export PATH=$PATH:~/bin startup.run alias l=ls And they have a script with... :: from stem.util import conf # Configuration values we'll use in this file. These are mappings of # configuration keys to the default values we'll use if the user doesn't # have something different in their config file (or it doesn't match this # type). ssh_config = conf.config_dict('ssh_login', { 'login.user': 'atagar', 'login.password': 'pepperjack_is_awesome!', 'destination.ip': '127.0.0.1', 'destination.port': 22, 'startup.run': [], }) # Makes an empty config instance with the handle of 'ssh_login'. This is # a singleton so other classes can fetch this same configuration from # this handle. user_config = conf.get_config('ssh_login') # Loads the user's configuration file, warning if this fails. try: user_config.load("/home/atagar/myConfig") except IOError as exc: print "Unable to load the user's config: %s" % exc # This replace the contents of ssh_config with the values from the user's # config file if... # # * the key is present in the config file # * we're able to convert the configuration file's value to the same type # as what's in the mapping (see the Config.get() method for how these # type inferences work) # # For instance in this case... # # * the login values are left alone because they aren't in the user's # config file # # * the 'destination.port' is also left with the value of 22 because we # can't turn "blarg" into an integer # # The other values are replaced, so ssh_config now becomes... # # {'login.user': 'atagar', # 'login.password': 'pepperjack_is_awesome!', # 'destination.ip': '1.2.3.4', # 'destination.port': 22, # 'startup.run': ['export PATH=$PATH:~/bin', 'alias l=ls']} # # Information for what values fail to load and why are reported to # 'stem.util.log'. .. versionchanged:: 1.7.0 Class can now be used as a dictionary. """ def __init__(self): self._path = None # location we last loaded from or saved to self._contents = OrderedDict() # configuration key/value pairs self._listeners = [] # functors to be notified of config changes # used for accessing _contents self._contents_lock = threading.RLock() # keys that have been requested (used to provide unused config contents) self._requested_keys = set() # flag to support lazy loading in uses_settings() self._settings_loaded = False def load(self, path = None, commenting = True): """ Reads in the contents of the given path, adding its configuration values to our current contents. If the path is a directory then this loads each of the files, recursively. .. versionchanged:: 1.3.0 Added support for directories. .. versionchanged:: 1.3.0 Added the **commenting** argument. .. versionchanged:: 1.6.0 Avoid loading vim swap files. :param str path: file or directory path to be loaded, this uses the last loaded path if not provided :param bool commenting: ignore line content after a '#' if **True**, read otherwise :raises: * **IOError** if we fail to read the file (it doesn't exist, insufficient permissions, etc) * **ValueError** if no path was provided and we've never been provided one """ if path: self._path = path elif not self._path: raise ValueError('Unable to load configuration: no path provided') if os.path.isdir(self._path): for root, dirnames, filenames in os.walk(self._path): for filename in filenames: if filename.endswith('.swp'): continue # vim swap file self.load(os.path.join(root, filename)) return with open(self._path, 'r') as config_file: read_contents = config_file.readlines() with self._contents_lock: while read_contents: line = read_contents.pop(0) # strips any commenting or excess whitespace comment_start = line.find('#') if commenting else -1 if comment_start != -1: line = line[:comment_start] line = line.strip() # parse the key/value pair if line: if ' ' in line: key, value = line.split(' ', 1) self.set(key, value.strip(), False) else: # this might be a multi-line entry, try processing it as such multiline_buffer = [] while read_contents and read_contents[0].lstrip().startswith('|'): content = read_contents.pop(0).lstrip()[1:] # removes '\s+|' prefix content = content.rstrip('\n') # trailing newline multiline_buffer.append(content) if multiline_buffer: self.set(line, '\n'.join(multiline_buffer), False) else: self.set(line, '', False) # default to a key => '' mapping def save(self, path = None): """ Saves configuration contents to disk. If a path is provided then it replaces the configuration location that we track. :param str path: location to be saved to :raises: * **IOError** if we fail to save the file (insufficient permissions, etc) * **ValueError** if no path was provided and we've never been provided one """ if path: self._path = path elif not self._path: raise ValueError('Unable to save configuration: no path provided') with self._contents_lock: if not os.path.exists(os.path.dirname(self._path)): os.makedirs(os.path.dirname(self._path)) with open(self._path, 'w') as output_file: for entry_key in self.keys(): for entry_value in self.get_value(entry_key, multiple = True): # check for multi line entries if '\n' in entry_value: entry_value = '\n|' + entry_value.replace('\n', '\n|') output_file.write('%s %s\n' % (entry_key, entry_value)) def clear(self): """ Drops the configuration contents and reverts back to a blank, unloaded state. """ with self._contents_lock: self._contents.clear() self._requested_keys = set() def add_listener(self, listener, backfill = True): """ Registers the function to be notified of configuration updates. Listeners are expected to be functors which accept (config, key). :param functor listener: function to be notified when our configuration is changed :param bool backfill: calls the function with our current values if **True** """ with self._contents_lock: self._listeners.append(listener) if backfill: for key in self.keys(): listener(self, key) def clear_listeners(self): """ Removes all attached listeners. """ self._listeners = [] def keys(self): """ Provides all keys in the currently loaded configuration. :returns: **list** if strings for the configuration keys we've loaded """ return list(self._contents.keys()) def unused_keys(self): """ Provides the configuration keys that have never been provided to a caller via :func:`~stem.util.conf.config_dict` or the :func:`~stem.util.conf.Config.get` and :func:`~stem.util.conf.Config.get_value` methods. :returns: **set** of configuration keys we've loaded but have never been requested """ return set(self.keys()).difference(self._requested_keys) def set(self, key, value, overwrite = True): """ Appends the given key/value configuration mapping, behaving the same as if we'd loaded this from a configuration file. .. versionchanged:: 1.5.0 Allow removal of values by overwriting with a **None** value. :param str key: key for the configuration mapping :param str,list value: value we're setting the mapping to :param bool overwrite: replaces the previous value if **True**, otherwise the values are appended """ with self._contents_lock: unicode_type = str if stem.prereq.is_python_3() else unicode if value is None: if overwrite and key in self._contents: del self._contents[key] else: pass # no value so this is a no-op elif isinstance(value, (bytes, unicode_type)): if not overwrite and key in self._contents: self._contents[key].append(value) else: self._contents[key] = [value] for listener in self._listeners: listener(self, key) elif isinstance(value, (list, tuple)): if not overwrite and key in self._contents: self._contents[key] += value else: self._contents[key] = value for listener in self._listeners: listener(self, key) else: raise ValueError("Config.set() only accepts str (bytes or unicode), list, or tuple. Provided value was a '%s'" % type(value)) def get(self, key, default = None): """ Fetches the given configuration, using the key and default value to determine the type it should be. Recognized inferences are: * **default is a boolean => boolean** * values are case insensitive * provides the default if the value isn't "true" or "false" * **default is an integer => int** * provides the default if the value can't be converted to an int * **default is a float => float** * provides the default if the value can't be converted to a float * **default is a list => list** * string contents for all configuration values with this key * **default is a tuple => tuple** * string contents for all configuration values with this key * **default is a dictionary => dict** * values without "=>" in them are ignored * values are split into key/value pairs on "=>" with extra whitespace stripped :param str key: config setting to be fetched :param default object: value provided if no such key exists or fails to be converted :returns: given configuration value with its type inferred with the above rules """ is_multivalue = isinstance(default, (list, tuple, dict)) val = self.get_value(key, default, is_multivalue) if val == default: return val # don't try to infer undefined values if isinstance(default, bool): if val.lower() == 'true': val = True elif val.lower() == 'false': val = False else: log.debug("Config entry '%s' is expected to be a boolean, defaulting to '%s'" % (key, str(default))) val = default elif isinstance(default, int): try: val = int(val) except ValueError: log.debug("Config entry '%s' is expected to be an integer, defaulting to '%i'" % (key, default)) val = default elif isinstance(default, float): try: val = float(val) except ValueError: log.debug("Config entry '%s' is expected to be a float, defaulting to '%f'" % (key, default)) val = default elif isinstance(default, list): val = list(val) # make a shallow copy elif isinstance(default, tuple): val = tuple(val) elif isinstance(default, dict): val_map = OrderedDict() for entry in val: if '=>' in entry: entry_key, entry_val = entry.split('=>', 1) val_map[entry_key.strip()] = entry_val.strip() else: log.debug('Ignoring invalid %s config entry (expected a mapping, but "%s" was missing "=>")' % (key, entry)) val = val_map return val def get_value(self, key, default = None, multiple = False): """ This provides the current value associated with a given key. :param str key: config setting to be fetched :param object default: value provided if no such key exists :param bool multiple: provides back a list of all values if **True**, otherwise this returns the last loaded configuration value :returns: **str** or **list** of string configuration values associated with the given key, providing the default if no such key exists """ with self._contents_lock: if key in self._contents: self._requested_keys.add(key) if multiple: return self._contents[key] else: return self._contents[key][-1] else: message_id = 'stem.util.conf.missing_config_key_%s' % key log.log_once(message_id, log.TRACE, "config entry '%s' not found, defaulting to '%s'" % (key, default)) return default def __getitem__(self, key): with self._contents_lock: return self._contents[key] stem-1.7.1/stem/util/term.py0000664000175000017500000001125413341474573016476 0ustar atagaratagar00000000000000# Copyright 2011-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Utilities for working with the terminal. **Module Overview:** :: encoding - provides the ANSI escape sequence for a terminal attribute format - wrap text with ANSI for the given colors or attributes .. data:: Color (enum) .. data:: BgColor (enum) Foreground or background terminal colors. =========== =========== Color Description =========== =========== **BLACK** black color **BLUE** blue color **CYAN** cyan color **GREEN** green color **MAGENTA** magenta color **RED** red color **WHITE** white color **YELLOW** yellow color =========== =========== .. data:: Attr (enum) Terminal text attributes. .. versionchanged:: 1.5.0 Added the LINES attribute. =================== =========== Attr Description =================== =========== **BOLD** heavy typeface **HIGHLIGHT** inverted foreground and background **UNDERLINE** underlined text **READLINE_ESCAPE** wrap encodings in `RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE sequences `_ **LINES** formats lines individually =================== =========== """ import stem.util.enum import stem.util.str_tools TERM_COLORS = ('BLACK', 'RED', 'GREEN', 'YELLOW', 'BLUE', 'MAGENTA', 'CYAN', 'WHITE') # DISABLE_COLOR_SUPPORT is *not* being vended to Stem users. This is likely to # go away if I can think of a more graceful method for color toggling. DISABLE_COLOR_SUPPORT = False Color = stem.util.enum.Enum(*TERM_COLORS) BgColor = stem.util.enum.Enum(*['BG_' + color for color in TERM_COLORS]) Attr = stem.util.enum.Enum('BOLD', 'UNDERLINE', 'HIGHLIGHT', 'READLINE_ESCAPE', 'LINES') # mappings of terminal attribute enums to their ANSI escape encoding FG_ENCODING = dict([(list(Color)[i], str(30 + i)) for i in range(8)]) BG_ENCODING = dict([(list(BgColor)[i], str(40 + i)) for i in range(8)]) ATTR_ENCODING = {Attr.BOLD: '1', Attr.UNDERLINE: '4', Attr.HIGHLIGHT: '7'} CSI = '\x1B[%sm' RESET = CSI % '0' def encoding(*attrs): """ Provides the ANSI escape sequence for these terminal color or attributes. .. versionadded:: 1.5.0 :param list attr: :data:`~stem.util.terminal.Color`, :data:`~stem.util.terminal.BgColor`, or :data:`~stem.util.terminal.Attr` to provide an ecoding for :returns: **str** of the ANSI escape sequence, **None** no attributes are recognized """ term_encodings = [] for attr in attrs: # TODO: Account for an earlier misspelled attribute. This should be dropped # in Stem. 2.0.x. if attr == 'HILIGHT': attr = 'HIGHLIGHT' attr = stem.util.str_tools._to_camel_case(attr) term_encoding = FG_ENCODING.get(attr, None) term_encoding = BG_ENCODING.get(attr, term_encoding) term_encoding = ATTR_ENCODING.get(attr, term_encoding) if term_encoding: term_encodings.append(term_encoding) if term_encodings: return CSI % ';'.join(term_encodings) def format(msg, *attr): """ Simple terminal text formatting using `ANSI escape sequences `_. The following are some toolkits providing similar capabilities: * `django.utils.termcolors `_ * `termcolor `_ * `colorama `_ .. versionchanged:: 1.6.0 Normalized return value to be unicode to better support python 2/3 compatibility. :param str msg: string to be formatted :param str attr: text attributes, this can be :data:`~stem.util.term.Color`, :data:`~stem.util.term.BgColor`, or :data:`~stem.util.term.Attr` enums and are case insensitive (so strings like 'red' are fine) :returns: **unicode** wrapped with ANSI escape encodings, starting with the given attributes and ending with a reset """ msg = stem.util.str_tools._to_unicode(msg) if DISABLE_COLOR_SUPPORT: return msg if Attr.LINES in attr: attr = list(attr) attr.remove(Attr.LINES) lines = [format(line, *attr) for line in msg.split('\n')] return '\n'.join(lines) # if we have reset sequences in the message then apply our attributes # after each of them if RESET in msg: return ''.join([format(comp, *attr) for comp in msg.split(RESET)]) prefix, suffix = encoding(*attr), RESET if prefix: if Attr.READLINE_ESCAPE in attr: prefix = '\001%s\002' % prefix suffix = '\001%s\002' % suffix return prefix + msg + suffix else: return msg stem-1.7.1/stem/util/ordereddict.py0000664000175000017500000000757113237375570020027 0ustar atagaratagar00000000000000# Drop in replacement for python 2.7's OrderedDict, from... # http://pypi.python.org/pypi/ordereddict # # Stem users should *not* rely upon this module. It will be removed when we # drop support for python 2.6 and below. # Copyright (c) 2009 Raymond Hettinger # # 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. from UserDict import DictMixin class OrderedDict(dict, DictMixin): def __init__(self, *args, **kwds): if len(args) > 1: raise TypeError('expected at most 1 arguments, got %d' % len(args)) try: self.__end except AttributeError: self.clear() self.update(*args, **kwds) def clear(self): self.__end = end = [] end += [None, end, end] # sentinel node for doubly linked list self.__map = {} # key --> [key, prev, next] dict.clear(self) def __setitem__(self, key, value): if key not in self: end = self.__end curr = end[1] curr[2] = end[1] = self.__map[key] = [key, curr, end] dict.__setitem__(self, key, value) def __delitem__(self, key): dict.__delitem__(self, key) key, prev, next = self.__map.pop(key) prev[2] = next next[1] = prev def __iter__(self): end = self.__end curr = end[2] while curr is not end: yield curr[0] curr = curr[2] def __reversed__(self): end = self.__end curr = end[1] while curr is not end: yield curr[0] curr = curr[1] def popitem(self, last=True): if not self: raise KeyError('dictionary is empty') if last: key = reversed(self).next() else: key = iter(self).next() value = self.pop(key) return key, value def __reduce__(self): items = [[k, self[k]] for k in self] tmp = self.__map, self.__end del self.__map, self.__end inst_dict = vars(self).copy() self.__map, self.__end = tmp if inst_dict: return (self.__class__, (items,), inst_dict) return self.__class__, (items,) def keys(self): return list(self) setdefault = DictMixin.setdefault update = DictMixin.update pop = DictMixin.pop values = DictMixin.values items = DictMixin.items iterkeys = DictMixin.iterkeys itervalues = DictMixin.itervalues iteritems = DictMixin.iteritems def __repr__(self): if not self: return '%s()' % (self.__class__.__name__,) return '%s(%r)' % (self.__class__.__name__, self.items()) def copy(self): return self.__class__(self) @classmethod def fromkeys(cls, iterable, value=None): d = cls() for key in iterable: d[key] = value return d def __eq__(self, other): if isinstance(other, OrderedDict): if len(self) != len(other): return False for p, q in zip(self.items(), other.items()): if p != q: return False return True return dict.__eq__(self, other) def __ne__(self, other): return not self == other stem-1.7.1/stem/util/proc.py0000664000175000017500000004243213341474573016474 0ustar atagaratagar00000000000000# Copyright 2011-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Helper functions for querying process and system information from the /proc contents. Fetching information this way provides huge performance benefits over lookups via system utilities (ps, netstat, etc). For instance, resolving connections this way cuts the runtime by around 90% verses the alternatives. These functions may not work on all platforms (only Linux?). The method for reading these files (and a little code) are borrowed from `psutil `_, which was written by Jay Loden, Dave Daeschler, Giampaolo Rodola' and is under the BSD license. **These functions are not being vended to stem users. They may change in the future, use them at your own risk.** .. versionchanged:: 1.3.0 Dropped the get_* prefix from several function names. The old names still work, but are deprecated aliases. **Module Overview:** :: is_available - checks if proc utilities can be used on this system system_start_time - unix timestamp for when the system started physical_memory - memory available on this system cwd - provides the current working directory for a process uid - provides the user id a process is running under memory_usage - provides the memory usage of a process stats - queries statistics about a process file_descriptors_used - number of file descriptors used by a process connections - provides the connections made by a process .. data:: Stat (enum) Types of data available via the :func:`~stem.util.proc.stats` function. ============== =========== Stat Description ============== =========== **COMMAND** command name under which the process is running **CPU_UTIME** total user time spent on the process **CPU_STIME** total system time spent on the process **START_TIME** when this process began, in unix time ============== =========== """ import base64 import os import platform import socket import sys import time import stem.prereq import stem.util.connection import stem.util.enum import stem.util.str_tools from stem.util import log try: # unavailable on windows (#19823) import pwd IS_PWD_AVAILABLE = True except ImportError: IS_PWD_AVAILABLE = False if stem.prereq._is_lru_cache_available(): from functools import lru_cache else: from stem.util.lru_cache import lru_cache # os.sysconf is only defined on unix try: CLOCK_TICKS = os.sysconf(os.sysconf_names['SC_CLK_TCK']) except AttributeError: CLOCK_TICKS = None IS_LITTLE_ENDIAN = sys.byteorder == 'little' ENCODED_ADDR = {} # cache of encoded ips to their decoded version Stat = stem.util.enum.Enum( ('COMMAND', 'command'), ('CPU_UTIME', 'utime'), ('CPU_STIME', 'stime'), ('START_TIME', 'start time') ) @lru_cache() def is_available(): """ Checks if proc information is available on this platform. :returns: **True** if proc contents exist on this platform, **False** otherwise """ if platform.system() != 'Linux': return False else: # list of process independent proc paths we use proc_paths = ('/proc/stat', '/proc/meminfo', '/proc/net/tcp', '/proc/net/udp') for path in proc_paths: if not os.path.exists(path): return False return True @lru_cache() def system_start_time(): """ Provides the unix time (seconds since epoch) when the system started. :returns: **float** for the unix time of when the system started :raises: **IOError** if it can't be determined """ start_time, parameter = time.time(), 'system start time' btime_line = _get_line('/proc/stat', 'btime', parameter) try: result = float(btime_line.strip().split()[1]) _log_runtime(parameter, '/proc/stat[btime]', start_time) return result except: exc = IOError('unable to parse the /proc/stat btime entry: %s' % btime_line) _log_failure(parameter, exc) raise exc @lru_cache() def physical_memory(): """ Provides the total physical memory on the system in bytes. :returns: **int** for the bytes of physical memory this system has :raises: **IOError** if it can't be determined """ start_time, parameter = time.time(), 'system physical memory' mem_total_line = _get_line('/proc/meminfo', 'MemTotal:', parameter) try: result = int(mem_total_line.split()[1]) * 1024 _log_runtime(parameter, '/proc/meminfo[MemTotal]', start_time) return result except: exc = IOError('unable to parse the /proc/meminfo MemTotal entry: %s' % mem_total_line) _log_failure(parameter, exc) raise exc def cwd(pid): """ Provides the current working directory for the given process. :param int pid: process id of the process to be queried :returns: **str** with the path of the working directory for the process :raises: **IOError** if it can't be determined """ start_time, parameter = time.time(), 'cwd' proc_cwd_link = '/proc/%s/cwd' % pid if pid == 0: cwd = '' else: try: cwd = os.readlink(proc_cwd_link) except OSError: exc = IOError('unable to read %s' % proc_cwd_link) _log_failure(parameter, exc) raise exc _log_runtime(parameter, proc_cwd_link, start_time) return cwd def uid(pid): """ Provides the user ID the given process is running under. :param int pid: process id of the process to be queried :returns: **int** with the user id for the owner of the process :raises: **IOError** if it can't be determined """ start_time, parameter = time.time(), 'uid' status_path = '/proc/%s/status' % pid uid_line = _get_line(status_path, 'Uid:', parameter) try: result = int(uid_line.split()[1]) _log_runtime(parameter, '%s[Uid]' % status_path, start_time) return result except: exc = IOError('unable to parse the %s Uid entry: %s' % (status_path, uid_line)) _log_failure(parameter, exc) raise exc def memory_usage(pid): """ Provides the memory usage in bytes for the given process. :param int pid: process id of the process to be queried :returns: **tuple** of two ints with the memory usage of the process, of the form **(resident_size, virtual_size)** :raises: **IOError** if it can't be determined """ # checks if this is the kernel process if pid == 0: return (0, 0) start_time, parameter = time.time(), 'memory usage' status_path = '/proc/%s/status' % pid mem_lines = _get_lines(status_path, ('VmRSS:', 'VmSize:'), parameter) try: residentSize = int(mem_lines['VmRSS:'].split()[1]) * 1024 virtualSize = int(mem_lines['VmSize:'].split()[1]) * 1024 _log_runtime(parameter, '%s[VmRSS|VmSize]' % status_path, start_time) return (residentSize, virtualSize) except: exc = IOError('unable to parse the %s VmRSS and VmSize entries: %s' % (status_path, ', '.join(mem_lines))) _log_failure(parameter, exc) raise exc def stats(pid, *stat_types): """ Provides process specific information. See the :data:`~stem.util.proc.Stat` enum for valid options. :param int pid: process id of the process to be queried :param Stat stat_types: information to be provided back :returns: **tuple** with all of the requested statistics as strings :raises: **IOError** if it can't be determined """ if CLOCK_TICKS is None: raise IOError('Unable to look up SC_CLK_TCK') start_time, parameter = time.time(), 'process %s' % ', '.join(stat_types) # the stat file contains a single line, of the form... # 8438 (tor) S 8407 8438 8407 34818 8438 4202496... stat_path = '/proc/%s/stat' % pid stat_line = _get_line(stat_path, str(pid), parameter) # breaks line into component values stat_comp = [] cmd_start, cmd_end = stat_line.find('('), stat_line.find(')') if cmd_start != -1 and cmd_end != -1: stat_comp.append(stat_line[:cmd_start]) stat_comp.append(stat_line[cmd_start + 1:cmd_end]) stat_comp += stat_line[cmd_end + 1:].split() if len(stat_comp) < 44 and _is_float(stat_comp[13], stat_comp[14], stat_comp[21]): exc = IOError('stat file had an unexpected format: %s' % stat_path) _log_failure(parameter, exc) raise exc results = [] for stat_type in stat_types: if stat_type == Stat.COMMAND: if pid == 0: results.append('sched') else: results.append(stat_comp[1]) elif stat_type == Stat.CPU_UTIME: if pid == 0: results.append('0') else: results.append(str(float(stat_comp[13]) / CLOCK_TICKS)) elif stat_type == Stat.CPU_STIME: if pid == 0: results.append('0') else: results.append(str(float(stat_comp[14]) / CLOCK_TICKS)) elif stat_type == Stat.START_TIME: if pid == 0: return system_start_time() else: # According to documentation, starttime is in field 21 and the unit is # jiffies (clock ticks). We divide it for clock ticks, then add the # uptime to get the seconds since the epoch. p_start_time = float(stat_comp[21]) / CLOCK_TICKS results.append(str(p_start_time + system_start_time())) _log_runtime(parameter, stat_path, start_time) return tuple(results) def file_descriptors_used(pid): """ Provides the number of file descriptors currently being used by a process. .. versionadded:: 1.3.0 :param int pid: process id of the process to be queried :returns: **int** of the number of file descriptors used :raises: **IOError** if it can't be determined """ try: pid = int(pid) if pid < 0: raise IOError("Process pids can't be negative: %s" % pid) except (ValueError, TypeError): raise IOError('Process pid was non-numeric: %s' % pid) try: return len(os.listdir('/proc/%i/fd' % pid)) except Exception as exc: raise IOError('Unable to check number of file descriptors used: %s' % exc) def connections(pid = None, user = None): """ Queries connections from the proc contents. This matches netstat, lsof, and friends but is much faster. If no **pid** or **user** are provided this provides all present connections. :param int pid: pid to provide connections for :param str user: username to look up connections for :returns: **list** of :class:`~stem.util.connection.Connection` instances :raises: **IOError** if it can't be determined """ start_time, conn = time.time(), [] if pid: parameter = 'connections for pid %s' % pid try: pid = int(pid) if pid < 0: raise IOError("Process pids can't be negative: %s" % pid) except (ValueError, TypeError): raise IOError('Process pid was non-numeric: %s' % pid) elif user: parameter = 'connections for user %s' % user else: parameter = 'all connections' try: if not IS_PWD_AVAILABLE: raise IOError("This requires python's pwd module, which is unavailable on Windows.") inodes = _inodes_for_sockets(pid) if pid else set() process_uid = stem.util.str_tools._to_bytes(str(pwd.getpwnam(user).pw_uid)) if user else None for proc_file_path in ('/proc/net/tcp', '/proc/net/tcp6', '/proc/net/udp', '/proc/net/udp6'): if proc_file_path.endswith('6') and not os.path.exists(proc_file_path): continue # ipv6 proc contents are optional protocol = proc_file_path[10:].rstrip('6') # 'tcp' or 'udp' is_ipv6 = proc_file_path.endswith('6') try: with open(proc_file_path, 'rb') as proc_file: proc_file.readline() # skip the first line for line in proc_file: _, l_dst, r_dst, status, _, _, _, uid, _, inode = line.split()[:10] if inodes and inode not in inodes: continue elif process_uid and uid != process_uid: continue elif protocol == 'tcp' and status != b'01': continue # skip tcp connections that aren't yet established div = l_dst.find(b':') l_addr = _unpack_addr(l_dst[:div]) l_port = int(l_dst[div + 1:], 16) div = r_dst.find(b':') r_addr = _unpack_addr(r_dst[:div]) r_port = int(r_dst[div + 1:], 16) if r_addr == '0.0.0.0' or r_addr == '0000:0000:0000:0000:0000:0000': continue # no address elif l_port == 0 or r_port == 0: continue # no port conn.append(stem.util.connection.Connection(l_addr, l_port, r_addr, r_port, protocol, is_ipv6)) except IOError as exc: raise IOError("unable to read '%s': %s" % (proc_file_path, exc)) except Exception as exc: raise IOError("unable to parse '%s': %s" % (proc_file_path, exc)) _log_runtime(parameter, '/proc/net/[tcp|udp]', start_time) return conn except IOError as exc: _log_failure(parameter, exc) raise def _inodes_for_sockets(pid): """ Provides inodes in use by a process for its sockets. :param int pid: process id of the process to be queried :returns: **set** with inodes for its sockets :raises: **IOError** if it can't be determined """ inodes = set() try: fd_contents = os.listdir('/proc/%s/fd' % pid) except OSError as exc: raise IOError('Unable to read our file descriptors: %s' % exc) for fd in fd_contents: fd_path = '/proc/%s/fd/%s' % (pid, fd) try: # File descriptor link, such as 'socket:[30899]' fd_name = os.readlink(fd_path) if fd_name.startswith('socket:['): inodes.add(stem.util.str_tools._to_bytes(fd_name[8:-1])) except OSError as exc: if not os.path.exists(fd_path): continue # descriptors may shift while we're in the middle of iterating over them # most likely couldn't be read due to permissions raise IOError('unable to determine file descriptor destination (%s): %s' % (exc, fd_path)) return inodes def _unpack_addr(addr): """ Translates an address entry in the /proc/net/* contents to a human readable form (`reference `_, for instance: :: "0500000A" -> "10.0.0.5" "F804012A4A5190010000000002000000" -> "2a01:4f8:190:514a::2" :param str addr: proc address entry to be decoded :returns: **str** of the decoded address """ if addr not in ENCODED_ADDR: if len(addr) == 8: # IPv4 address decoded = base64.b16decode(addr)[::-1] if IS_LITTLE_ENDIAN else base64.b16decode(addr) ENCODED_ADDR[addr] = socket.inet_ntop(socket.AF_INET, decoded) else: # IPv6 address if IS_LITTLE_ENDIAN: # Group into eight characters, then invert in pairs... # # https://trac.torproject.org/projects/tor/ticket/18079#comment:24 inverted = [] for i in range(4): grouping = addr[8 * i:8 * (i + 1)] inverted += [grouping[2 * i:2 * (i + 1)] for i in range(4)][::-1] encoded = b''.join(inverted) else: encoded = addr ENCODED_ADDR[addr] = stem.util.connection.expand_ipv6_address(socket.inet_ntop(socket.AF_INET6, base64.b16decode(encoded))) return ENCODED_ADDR[addr] def _is_float(*value): try: for v in value: float(v) return True except ValueError: return False def _get_line(file_path, line_prefix, parameter): return _get_lines(file_path, (line_prefix, ), parameter)[line_prefix] def _get_lines(file_path, line_prefixes, parameter): """ Fetches lines with the given prefixes from a file. This only provides back the first instance of each prefix. :param str file_path: path of the file to read :param tuple line_prefixes: string prefixes of the lines to return :param str parameter: description of the proc attribute being fetch :returns: mapping of prefixes to the matching line :raises: **IOError** if unable to read the file or can't find all of the prefixes """ try: remaining_prefixes = list(line_prefixes) proc_file, results = open(file_path), {} for line in proc_file: if not remaining_prefixes: break # found everything we're looking for for prefix in remaining_prefixes: if line.startswith(prefix): results[prefix] = line remaining_prefixes.remove(prefix) break proc_file.close() if remaining_prefixes: if len(remaining_prefixes) == 1: msg = '%s did not contain a %s entry' % (file_path, remaining_prefixes[0]) else: msg = '%s did not contain %s entries' % (file_path, ', '.join(remaining_prefixes)) raise IOError(msg) else: return results except IOError as exc: _log_failure(parameter, exc) raise def _log_runtime(parameter, proc_location, start_time): """ Logs a message indicating a successful proc query. :param str parameter: description of the proc attribute being fetch :param str proc_location: proc files we were querying :param int start_time: unix time for when this query was started """ runtime = time.time() - start_time log.debug('proc call (%s): %s (runtime: %0.4f)' % (parameter, proc_location, runtime)) def _log_failure(parameter, exc): """ Logs a message indicating that the proc query failed. :param str parameter: description of the proc attribute being fetch :param Exception exc: exception that we're raising """ log.debug('proc call failed (%s): %s' % (parameter, exc)) # TODO: drop with stem 2.x # We renamed our methods to drop a redundant 'get_*' prefix, so alias the old # names for backward compatability. get_system_start_time = system_start_time get_physical_memory = physical_memory get_cwd = cwd get_uid = uid get_memory_usage = memory_usage get_stats = stats get_connections = connections stem-1.7.1/stem/util/connection.py0000664000175000017500000006001313341034346017651 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Connection and networking based utility functions. **Module Overview:** :: get_connections - quieries the connections belonging to a given process system_resolvers - provides connection resolution methods that are likely to be available port_usage - brief description of the common usage for a port is_valid_ipv4_address - checks if a string is a valid IPv4 address is_valid_ipv6_address - checks if a string is a valid IPv6 address is_valid_port - checks if something is a valid representation for a port is_private_address - checks if an IPv4 address belongs to a private range or not address_to_int - provides an integer representation of an IP address expand_ipv6_address - provides an IPv6 address with its collapsed portions expanded get_mask_ipv4 - provides the mask representation for a given number of bits get_mask_ipv6 - provides the IPv6 mask representation for a given number of bits .. data:: Resolver (enum) Method for resolving a process' connections. .. versionadded:: 1.1.0 .. versionchanged:: 1.4.0 Added **NETSTAT_WINDOWS**. .. versionchanged:: 1.6.0 Added **BSD_FSTAT**. .. deprecated:: 1.6.0 The SOCKSTAT connection resolver is proving to be unreliable (:trac:`23057`), and will be dropped in the 2.0.0 release unless fixed. ==================== =========== Resolver Description ==================== =========== **PROC** /proc contents **NETSTAT** netstat **NETSTAT_WINDOWS** netstat command under Windows **SS** ss command **LSOF** lsof command **SOCKSTAT** sockstat command under \*nix **BSD_SOCKSTAT** sockstat command under FreeBSD **BSD_PROCSTAT** procstat command under FreeBSD **BSD_FSTAT** fstat command under OpenBSD ==================== =========== """ import collections import hashlib import hmac import os import platform import re import stem.util import stem.util.proc import stem.util.system from stem.util import conf, enum, log, str_tools # Connection resolution is risky to log about since it's highly likely to # contain sensitive information. That said, it's also difficult to get right in # a platform independent fashion. To opt into the logging requried to # troubleshoot connection resolution set the following... LOG_CONNECTION_RESOLUTION = False Resolver = enum.Enum( ('PROC', 'proc'), ('NETSTAT', 'netstat'), ('NETSTAT_WINDOWS', 'netstat (windows)'), ('SS', 'ss'), ('LSOF', 'lsof'), ('SOCKSTAT', 'sockstat'), ('BSD_SOCKSTAT', 'sockstat (bsd)'), ('BSD_PROCSTAT', 'procstat (bsd)'), ('BSD_FSTAT', 'fstat (bsd)') ) FULL_IPv4_MASK = '255.255.255.255' FULL_IPv6_MASK = 'FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF' CRYPTOVARIABLE_EQUALITY_COMPARISON_NONCE = os.urandom(32) PORT_USES = None # port number => description RESOLVER_COMMAND = { Resolver.PROC: '', # -n = prevents dns lookups, -p = include process, -W = don't crop addresses (needed for ipv6) Resolver.NETSTAT: 'netstat -npW', # -a = show all TCP/UDP connections, -n = numeric addresses and ports, -o = include pid Resolver.NETSTAT_WINDOWS: 'netstat -ano', # -n = numeric ports, -p = include process, -t = tcp sockets, -u = udp sockets Resolver.SS: 'ss -nptu', # -n = prevent dns lookups, -P = show port numbers (not names), -i = ip only, -w = no warnings # (lsof provides a '-p ' but oddly in practice it seems to be ~11-28% slower) Resolver.LSOF: 'lsof -wnPi', Resolver.SOCKSTAT: 'sockstat', # -4 = IPv4, -c = connected sockets Resolver.BSD_SOCKSTAT: 'sockstat -4c', # -f = process pid Resolver.BSD_PROCSTAT: 'procstat -f {pid}', # -p = process pid Resolver.BSD_FSTAT: 'fstat -p {pid}', } RESOLVER_FILTER = { Resolver.PROC: '', # tcp 0 586 192.168.0.1:44284 38.229.79.2:443 ESTABLISHED 15843/tor Resolver.NETSTAT: '^{protocol}\s+.*\s+{local}\s+{remote}\s+ESTABLISHED\s+{pid}/{name}\s*$', # tcp 586 192.168.0.1:44284 38.229.79.2:443 ESTABLISHED 15843 Resolver.NETSTAT_WINDOWS: '^\s*{protocol}\s+{local}\s+{remote}\s+ESTABLISHED\s+{pid}\s*$', # tcp ESTAB 0 0 192.168.0.20:44415 38.229.79.2:443 users:(("tor",15843,9)) Resolver.SS: '^{protocol}\s+ESTAB\s+.*\s+{local}\s+{remote}\s+users:\(\("{name}",(?:pid=)?{pid},(?:fd=)?[0-9]+\)\)$', # tor 3873 atagar 45u IPv4 40994 0t0 TCP 10.243.55.20:45724->194.154.227.109:9001 (ESTABLISHED) Resolver.LSOF: '^{name}\s+{pid}\s+.*\s+{protocol}\s+{local}->{remote} \(ESTABLISHED\)$', # atagar tor 15843 tcp4 192.168.0.20:44092 68.169.35.102:443 ESTABLISHED Resolver.SOCKSTAT: '^\S+\s+{name}\s+{pid}\s+{protocol}4\s+{local}\s+{remote}\s+ESTABLISHED$', # _tor tor 4397 12 tcp4 172.27.72.202:54011 127.0.0.1:9001 Resolver.BSD_SOCKSTAT: '^\S+\s+{name}\s+{pid}\s+\S+\s+{protocol}4\s+{local}\s+{remote}$', # 3561 tor 4 s - rw---n-- 2 0 TCP 10.0.0.2:9050 10.0.0.1:22370 Resolver.BSD_PROCSTAT: '^\s*{pid}\s+{name}\s+.*\s+{protocol}\s+{local}\s+{remote}$', # _tor tor 15843 20* internet stream tcp 0x0 192.168.1.100:36174 --> 4.3.2.1:443 Resolver.BSD_FSTAT: '^\S+\s+{name}\s+{pid}\s+.*\s+{protocol}\s+\S+\s+{local}\s+[-<]-[->]\s+{remote}$', } class Connection(collections.namedtuple('Connection', ['local_address', 'local_port', 'remote_address', 'remote_port', 'protocol', 'is_ipv6'])): """ Network connection information. .. versionchanged:: 1.5.0 Added the **is_ipv6** attribute. :var str local_address: ip address the connection originates from :var int local_port: port the connection originates from :var str remote_address: destionation ip address :var int remote_port: destination port :var str protocol: protocol of the connection ('tcp', 'udp', etc) :var bool is_ipv6: addresses are ipv6 if true, and ipv4 otherwise """ def get_connections(resolver = None, process_pid = None, process_name = None): """ Retrieves a list of the current connections for a given process. This provides a list of :class:`~stem.util.connection.Connection`. Note that addresses may be IPv4 *or* IPv6 depending on what the platform supports. .. versionadded:: 1.1.0 .. versionchanged:: 1.5.0 Made our resolver argument optional. .. versionchanged:: 1.5.0 IPv6 support when resolving via proc, netstat, lsof, or ss. :param Resolver resolver: method of connection resolution to use, if not provided then one is picked from among those that should likely be available for the system :param int process_pid: pid of the process to retrieve :param str process_name: name of the process to retrieve :returns: **list** of :class:`~stem.util.connection.Connection` instances :raises: * **ValueError** if neither a process_pid nor process_name is provided * **IOError** if no connections are available or resolution fails (generally they're indistinguishable). The common causes are the command being unavailable or permissions. """ if not resolver: available_resolvers = system_resolvers() if available_resolvers: resolver = available_resolvers[0] else: raise IOError('Unable to determine a connection resolver') if not process_pid and not process_name: raise ValueError('You must provide a pid or process name to provide connections for') def _log(msg): if LOG_CONNECTION_RESOLUTION: log.debug(msg) _log('=' * 80) _log('Querying connections for resolver: %s, pid: %s, name: %s' % (resolver, process_pid, process_name)) if isinstance(process_pid, str): try: process_pid = int(process_pid) except ValueError: raise ValueError('Process pid was non-numeric: %s' % process_pid) if process_pid is None: all_pids = stem.util.system.pid_by_name(process_name, True) if len(all_pids) == 0: if resolver in (Resolver.NETSTAT_WINDOWS, Resolver.PROC, Resolver.BSD_PROCSTAT): raise IOError("Unable to determine the pid of '%s'. %s requires the pid to provide the connections." % (process_name, resolver)) elif len(all_pids) == 1: process_pid = all_pids[0] else: if resolver in (Resolver.NETSTAT_WINDOWS, Resolver.PROC, Resolver.BSD_PROCSTAT): raise IOError("There's multiple processes named '%s'. %s requires a single pid to provide the connections." % (process_name, resolver)) if resolver == Resolver.PROC: return stem.util.proc.connections(pid = process_pid) resolver_command = RESOLVER_COMMAND[resolver].format(pid = process_pid) try: results = stem.util.system.call(resolver_command) except OSError as exc: raise IOError("Unable to query '%s': %s" % (resolver_command, exc)) resolver_regex_str = RESOLVER_FILTER[resolver].format( protocol = '(?P\S+)', local = '(?P[\[\]0-9a-f.:]+)', remote = '(?P[\[\]0-9a-f.:]+)', pid = process_pid if process_pid else '[0-9]*', name = process_name if process_name else '\S*', ) _log('Resolver regex: %s' % resolver_regex_str) _log('Resolver results:\n%s' % '\n'.join(results)) connections = [] resolver_regex = re.compile(resolver_regex_str) def _parse_address_str(addr_type, addr_str, line): addr, port = addr_str.rsplit(':', 1) if not is_valid_ipv4_address(addr) and not is_valid_ipv6_address(addr, allow_brackets = True): _log('Invalid %s address (%s): %s' % (addr_type, addr, line)) return None, None elif not is_valid_port(port): _log('Invalid %s port (%s): %s' % (addr_type, port, line)) return None, None else: _log('Valid %s:%s: %s' % (addr, port, line)) return addr.lstrip('[').rstrip(']'), int(port) for line in results: match = resolver_regex.match(line) if match: attr = match.groupdict() local_addr, local_port = _parse_address_str('local', attr['local'], line) remote_addr, remote_port = _parse_address_str('remote', attr['remote'], line) if not (local_addr and local_port and remote_addr and remote_port): continue # missing or malformed field protocol = attr['protocol'].lower() if protocol == 'tcp6': protocol = 'tcp' if protocol not in ('tcp', 'udp'): _log('Unrecognized protocol (%s): %s' % (protocol, line)) continue conn = Connection(local_addr, local_port, remote_addr, remote_port, protocol, is_valid_ipv6_address(local_addr)) connections.append(conn) _log(str(conn)) _log('%i connections found' % len(connections)) if not connections: raise IOError('No results found using: %s' % resolver_command) return connections def system_resolvers(system = None): """ Provides the types of connection resolvers likely to be available on this platform. .. versionadded:: 1.1.0 .. versionchanged:: 1.3.0 Renamed from get_system_resolvers() to system_resolvers(). The old name still works as an alias, but will be dropped in Stem version 2.0.0. :param str system: system to get resolvers for, this is determined by platform.system() if not provided :returns: **list** of :data:`~stem.util.connection.Resolver` instances available on this platform """ if system is None: if stem.util.system.is_gentoo(): system = 'Gentoo' else: system = platform.system() if system == 'Windows': resolvers = [Resolver.NETSTAT_WINDOWS] elif system == 'Darwin': resolvers = [Resolver.LSOF] elif system == 'OpenBSD': resolvers = [Resolver.BSD_FSTAT] elif system == 'FreeBSD': # Netstat is available, but lacks a '-p' equivalent so we can't associate # the results to processes. The platform also has a ss command, but it # belongs to a spreadsheet application. resolvers = [Resolver.BSD_SOCKSTAT, Resolver.BSD_PROCSTAT, Resolver.LSOF] else: # Sockstat isn't available by default on ubuntu. resolvers = [Resolver.NETSTAT, Resolver.SOCKSTAT, Resolver.LSOF, Resolver.SS] # remove any that aren't in the user's PATH resolvers = [r for r in resolvers if stem.util.system.is_available(RESOLVER_COMMAND[r])] # proc resolution, by far, outperforms the others so defaults to this is able if stem.util.proc.is_available() and os.access('/proc/net/tcp', os.R_OK) and os.access('/proc/net/udp', os.R_OK): resolvers = [Resolver.PROC] + resolvers return resolvers def port_usage(port): """ Provides the common use of a given port. For example, 'HTTP' for port 80 or 'SSH' for 22. .. versionadded:: 1.2.0 :param int port: port number to look up :returns: **str** with a description for the port, **None** if none is known """ global PORT_USES if PORT_USES is None: config = conf.Config() config_path = os.path.join(os.path.dirname(__file__), 'ports.cfg') try: config.load(config_path) port_uses = {} for key, value in config.get('port', {}).items(): if key.isdigit(): port_uses[int(key)] = value elif '-' in key: min_port, max_port = key.split('-', 1) for port_entry in range(int(min_port), int(max_port) + 1): port_uses[port_entry] = value else: raise ValueError("'%s' is an invalid key" % key) PORT_USES = port_uses except Exception as exc: log.warn("BUG: stem failed to load its internal port descriptions from '%s': %s" % (config_path, exc)) if not PORT_USES: return None if isinstance(port, str) and port.isdigit(): port = int(port) return PORT_USES.get(port) def is_valid_ipv4_address(address): """ Checks if a string is a valid IPv4 address. :param str address: string to be checked :returns: **True** if input is a valid IPv4 address, **False** otherwise """ if isinstance(address, bytes): address = str_tools._to_unicode(address) elif not stem.util._is_str(address): return False # checks if theres four period separated values if address.count('.') != 3: return False # checks that each value in the octet are decimal values between 0-255 for entry in address.split('.'): if not entry.isdigit() or int(entry) < 0 or int(entry) > 255: return False elif entry[0] == '0' and len(entry) > 1: return False # leading zeros, for instance in '1.2.3.001' return True def is_valid_ipv6_address(address, allow_brackets = False): """ Checks if a string is a valid IPv6 address. :param str address: string to be checked :param bool allow_brackets: ignore brackets which form '[address]' :returns: **True** if input is a valid IPv6 address, **False** otherwise """ if isinstance(address, bytes): address = str_tools._to_unicode(address) elif not stem.util._is_str(address): return False if allow_brackets: if address.startswith('[') and address.endswith(']'): address = address[1:-1] if address.count('.') == 3: # Likely an ipv4-mapped portion. Check that its vaild, then replace with a # filler. ipv4_start = address.rfind(':', 0, address.find('.')) + 1 ipv4_end = address.find(':', ipv4_start + 1) if ipv4_end == -1: ipv4_end = None # don't crop the last character if not is_valid_ipv4_address(address[ipv4_start:ipv4_end]): return False addr_comp = [address[:ipv4_start - 1] if ipv4_start != 0 else None, 'ff:ff', address[ipv4_end + 1:] if ipv4_end else None] address = ':'.join(filter(None, addr_comp)) # addresses are made up of eight colon separated groups of four hex digits # with leading zeros being optional # https://en.wikipedia.org/wiki/IPv6#Address_format colon_count = address.count(':') if colon_count > 7: return False # too many groups elif colon_count != 7 and '::' not in address: return False # not enough groups and none are collapsed elif address.count('::') > 1 or ':::' in address: return False # multiple groupings of zeros can't be collapsed for entry in address.split(':'): if not re.match('^[0-9a-fA-f]{0,4}$', entry): return False return True def is_valid_port(entry, allow_zero = False): """ Checks if a string or int is a valid port number. :param list,str,int entry: string, integer or list to be checked :param bool allow_zero: accept port number of zero (reserved by definition) :returns: **True** if input is an integer and within the valid port range, **False** otherwise """ try: value = int(entry) if str(value) != str(entry): return False # invalid leading char, e.g. space or zero elif allow_zero and value == 0: return True else: return value > 0 and value < 65536 except TypeError: if isinstance(entry, (tuple, list)): for port in entry: if not is_valid_port(port, allow_zero): return False return True else: return False except ValueError: return False def is_private_address(address): """ Checks if the IPv4 address is in a range belonging to the local network or loopback. These include: * Private ranges: 10.*, 172.16.* - 172.31.*, 192.168.* * Loopback: 127.* .. versionadded:: 1.1.0 :param str address: string to be checked :returns: **True** if input is in a private range, **False** otherwise :raises: **ValueError** if the address isn't a valid IPv4 address """ if not is_valid_ipv4_address(address): raise ValueError("'%s' isn't a valid IPv4 address" % address) # checks for any of the simple wildcard ranges if address.startswith('10.') or address.startswith('192.168.') or address.startswith('127.'): return True # checks for the 172.16.* - 172.31.* range if address.startswith('172.'): second_octet = int(address.split('.')[1]) if second_octet >= 16 and second_octet <= 31: return True return False def address_to_int(address): """ Provides an integer representation of a IPv4 or IPv6 address that can be used for sorting. .. versionadded:: 1.5.0 :param str address: IPv4 or IPv6 address :returns: **int** representation of the address """ # TODO: Could be neat to also use this for serialization if we also had an # int_to_address() function. return int(_address_to_binary(address), 2) def expand_ipv6_address(address): """ Expands abbreviated IPv6 addresses to their full colon separated hex format. For instance... :: >>> expand_ipv6_address('2001:db8::ff00:42:8329') '2001:0db8:0000:0000:0000:ff00:0042:8329' >>> expand_ipv6_address('::') '0000:0000:0000:0000:0000:0000:0000:0000' >>> expand_ipv6_address('::ffff:5.9.158.75') '0000:0000:0000:0000:0000:ffff:0509:9e4b' :param str address: IPv6 address to be expanded :raises: **ValueError** if the address can't be expanded due to being malformed """ if not is_valid_ipv6_address(address): raise ValueError("'%s' isn't a valid IPv6 address" % address) # expand ipv4-mapped portions of addresses if address.count('.') == 3: ipv4_start = address.rfind(':', 0, address.find('.')) + 1 ipv4_end = address.find(':', ipv4_start + 1) if ipv4_end == -1: ipv4_end = None # don't crop the last character # Converts ipv4 address to its hex ipv6 representation. For instance... # # '5.9.158.75' => '0509:9e4b' ipv4_bin = _address_to_binary(address[ipv4_start:ipv4_end]) groupings = [ipv4_bin[16 * i:16 * (i + 1)] for i in range(2)] ipv6_snippet = ':'.join(['%04x' % int(group, 2) for group in groupings]) addr_comp = [address[:ipv4_start - 1] if ipv4_start != 0 else None, ipv6_snippet, address[ipv4_end + 1:] if ipv4_end else None] address = ':'.join(filter(None, addr_comp)) # expands collapsed groupings, there can only be a single '::' in a valid # address if '::' in address: missing_groups = 7 - address.count(':') address = address.replace('::', '::' + ':' * missing_groups) # inserts missing zeros for index in range(8): start = index * 5 end = address.index(':', start) if index != 7 else len(address) missing_zeros = 4 - (end - start) if missing_zeros > 0: address = address[:start] + '0' * missing_zeros + address[start:] return address def get_mask_ipv4(bits): """ Provides the IPv4 mask for a given number of bits, in the dotted-quad format. :param int bits: number of bits to be converted :returns: **str** with the subnet mask representation for this many bits :raises: **ValueError** if given a number of bits outside the range of 0-32 """ if bits > 32 or bits < 0: raise ValueError('A mask can only be 0-32 bits, got %i' % bits) elif bits == 32: return FULL_IPv4_MASK # get the binary representation of the mask mask_bin = _get_binary(2 ** bits - 1, 32)[::-1] # breaks it into eight character groupings octets = [mask_bin[8 * i:8 * (i + 1)] for i in range(4)] # converts each octet into its integer value return '.'.join([str(int(octet, 2)) for octet in octets]) def get_mask_ipv6(bits): """ Provides the IPv6 mask for a given number of bits, in the hex colon-delimited format. :param int bits: number of bits to be converted :returns: **str** with the subnet mask representation for this many bits :raises: **ValueError** if given a number of bits outside the range of 0-128 """ if bits > 128 or bits < 0: raise ValueError('A mask can only be 0-128 bits, got %i' % bits) elif bits == 128: return FULL_IPv6_MASK # get the binary representation of the mask mask_bin = _get_binary(2 ** bits - 1, 128)[::-1] # breaks it into sixteen character groupings groupings = [mask_bin[16 * i:16 * (i + 1)] for i in range(8)] # converts each group into its hex value return ':'.join(['%04x' % int(group, 2) for group in groupings]).upper() def _get_masked_bits(mask): """ Provides the number of bits that an IPv4 subnet mask represents. Note that not all masks can be represented by a bit count. :param str mask: mask to be converted :returns: **int** with the number of bits represented by the mask :raises: **ValueError** if the mask is invalid or can't be converted """ if not is_valid_ipv4_address(mask): raise ValueError("'%s' is an invalid subnet mask" % mask) # converts octets to binary representation mask_bin = _address_to_binary(mask) mask_match = re.match('^(1*)(0*)$', mask_bin) if mask_match: return 32 - len(mask_match.groups()[1]) else: raise ValueError('Unable to convert mask to a bit count: %s' % mask) def _get_binary(value, bits): """ Provides the given value as a binary string, padded with zeros to the given number of bits. :param int value: value to be converted :param int bits: number of bits to pad to """ # http://www.daniweb.com/code/snippet216539.html return ''.join([str((value >> y) & 1) for y in range(bits - 1, -1, -1)]) def _address_to_binary(address): """ Provides the binary value for an IPv4 or IPv6 address. :returns: **str** with the binary representation of this address :raises: **ValueError** if address is neither an IPv4 nor IPv6 address """ if is_valid_ipv4_address(address): return ''.join([_get_binary(int(octet), 8) for octet in address.split('.')]) elif is_valid_ipv6_address(address): address = expand_ipv6_address(address) return ''.join([_get_binary(int(grouping, 16), 16) for grouping in address.split(':')]) else: raise ValueError("'%s' is neither an IPv4 or IPv6 address" % address) def _hmac_sha256(key, msg): """ Generates a sha256 digest using the given key and message. :param str key: starting key for the hash :param str msg: message to be hashed :returns: sha256 digest of msg as bytes, hashed using the given key """ return hmac.new(key, msg, hashlib.sha256).digest() def _cryptovariables_equal(x, y): """ Compares two strings for equality securely. :param str x: string to be compared. :param str y: the other string to be compared. :returns: **True** if both strings are equal, **False** otherwise. """ return ( _hmac_sha256(CRYPTOVARIABLE_EQUALITY_COMPARISON_NONCE, x) == _hmac_sha256(CRYPTOVARIABLE_EQUALITY_COMPARISON_NONCE, y)) # TODO: drop with stem 2.x # We renamed our methods to drop a redundant 'get_*' prefix, so alias the old # names for backward compatability. get_system_resolvers = system_resolvers stem-1.7.1/stem/util/lru_cache.py0000664000175000017500000001631513237375570017460 0ustar atagaratagar00000000000000# Drop in replace for python 3.2's collections.lru_cache, from... # http://code.activestate.com/recipes/578078-py26-and-py30-backport-of-python-33s-lru-cache/ # # ... which is under the MIT license. Stem users should *not* rely upon this # module. It will be removed when we drop support for python 3.2 and below. """ Memoization decorator that caches a function's return value. If later called with the same arguments then the cached value is returned rather than reevaluated. This is a a python 2.x port of `functools.lru_cache `_. If using python 3.2 or later you should use that instead. """ from collections import namedtuple from functools import update_wrapper from threading import RLock _CacheInfo = namedtuple('CacheInfo', ['hits', 'misses', 'maxsize', 'currsize']) class _HashedSeq(list): __slots__ = 'hashvalue' def __init__(self, tup, hash=hash): self[:] = tup self.hashvalue = hash(tup) def __hash__(self): return self.hashvalue def _make_key(args, kwds, typed, kwd_mark = (object(),), fasttypes = set([int, str, frozenset, type(None)]), sorted=sorted, tuple=tuple, type=type, len=len): 'Make a cache key from optionally typed positional and keyword arguments' key = args if kwds: sorted_items = sorted(kwds.items()) key += kwd_mark for item in sorted_items: key += item if typed: key += tuple(type(v) for v in args) if kwds: key += tuple(type(v) for k, v in sorted_items) elif len(key) == 1 and type(key[0]) in fasttypes: return key[0] return _HashedSeq(key) def lru_cache(maxsize=100, typed=False): """Least-recently-used cache decorator. If *maxsize* is set to None, the LRU features are disabled and the cache can grow without bound. If *typed* is True, arguments of different types will be cached separately. For example, f(3.0) and f(3) will be treated as distinct calls with distinct results. Arguments to the cached function must be hashable. View the cache statistics named tuple (hits, misses, maxsize, currsize) with f.cache_info(). Clear the cache and statistics with f.cache_clear(). Access the underlying function with f.__wrapped__. See: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used """ # Users should only access the lru_cache through its public API: # cache_info, cache_clear, and f.__wrapped__ # The internals of the lru_cache are encapsulated for thread safety and # to allow the implementation to change (including a possible C version). def decorating_function(user_function): cache = dict() stats = [0, 0] # make statistics updateable non-locally HITS, MISSES = 0, 1 # names for the stats fields make_key = _make_key cache_get = cache.get # bound method to lookup key or return None _len = len # localize the global len() function lock = RLock() # because linkedlist updates aren't threadsafe root = [] # root of the circular doubly linked list root[:] = [root, root, None, None] # initialize by pointing to self nonlocal_root = [root] # make updateable non-locally PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 # names for the link fields if maxsize == 0: def wrapper(*args, **kwds): # no caching, just do a statistics update after a successful call result = user_function(*args, **kwds) stats[MISSES] += 1 return result elif maxsize is None: def wrapper(*args, **kwds): # simple caching without ordering or size limit key = make_key(args, kwds, typed) result = cache_get(key, root) # root used here as a unique not-found sentinel if result is not root: stats[HITS] += 1 return result result = user_function(*args, **kwds) cache[key] = result stats[MISSES] += 1 return result else: def wrapper(*args, **kwds): # size limited caching that tracks accesses by recency key = make_key(args, kwds, typed) if kwds or typed else args with lock: link = cache_get(key) if link is not None: # record recent use of the key by moving it to the front of the list root, = nonlocal_root link_prev, link_next, key, result = link link_prev[NEXT] = link_next link_next[PREV] = link_prev last = root[PREV] last[NEXT] = root[PREV] = link link[PREV] = last link[NEXT] = root stats[HITS] += 1 return result result = user_function(*args, **kwds) with lock: root, = nonlocal_root if key in cache: # getting here means that this same key was added to the # cache while the lock was released. since the link # update is already done, we need only return the # computed result and update the count of misses. pass elif _len(cache) >= maxsize: # use the old root to store the new key and result oldroot = root oldroot[KEY] = key oldroot[RESULT] = result # empty the oldest link and make it the new root root = nonlocal_root[0] = oldroot[NEXT] oldkey = root[KEY] root[KEY] = root[RESULT] = None # now update the cache dictionary for the new links del cache[oldkey] cache[key] = oldroot else: # put result in a new link at the front of the list last = root[PREV] link = [last, root, key, result] last[NEXT] = root[PREV] = cache[key] = link stats[MISSES] += 1 return result def cache_info(): """Report cache statistics""" with lock: return _CacheInfo(stats[HITS], stats[MISSES], maxsize, len(cache)) def cache_clear(): """Clear the cache and cache statistics""" with lock: cache.clear() root = nonlocal_root[0] root[:] = [root, root, None, None] stats[:] = [0, 0] wrapper.__wrapped__ = user_function wrapper.cache_info = cache_info wrapper.cache_clear = cache_clear return update_wrapper(wrapper, user_function) return decorating_function stem-1.7.1/stem/util/log.py0000664000175000017500000001645513362431756016317 0ustar atagaratagar00000000000000# Copyright 2011-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Functions to aid library logging. The default logging :data:`~stem.util.log.Runlevel` is usually NOTICE and above. **Stem users are more than welcome to listen for stem events, but these functions are not being vended to our users. They may change in the future, use them at your own risk.** **Module Overview:** :: get_logger - provides the stem's Logger instance logging_level - converts a runlevel to its logging number escape - escapes special characters in a message in preparation for logging log - logs a message at the given runlevel log_once - logs a message, deduplicating if it has already been logged trace - logs a message at the TRACE runlevel debug - logs a message at the DEBUG runlevel info - logs a message at the INFO runlevel notice - logs a message at the NOTICE runlevel warn - logs a message at the WARN runlevel error - logs a message at the ERROR runlevel LogBuffer - Buffers logged events so they can be iterated over. |- is_empty - checks if there's events in our buffer +- __iter__ - iterates over and removes the buffered events log_to_stdout - reports further logged events to stdout .. data:: Runlevel (enum) Enumeration for logging runlevels. ========== =========== Runlevel Description ========== =========== **ERROR** critical issue occurred, the user needs to be notified **WARN** non-critical issue occurred that the user should be aware of **NOTICE** information that is helpful to the user **INFO** high level library activity **DEBUG** low level library activity **TRACE** request/reply logging ========== =========== """ import logging import stem.prereq import stem.util.enum import stem.util.str_tools # Logging runlevels. These are *very* commonly used so including shorter # aliases (so they can be referenced as log.DEBUG, log.WARN, etc). Runlevel = stem.util.enum.UppercaseEnum('TRACE', 'DEBUG', 'INFO', 'NOTICE', 'WARN', 'ERROR') TRACE, DEBUG, INFO, NOTICE, WARN, ERR = list(Runlevel) # mapping of runlevels to the logger module's values, TRACE and DEBUG aren't # built into the module LOG_VALUES = { Runlevel.TRACE: logging.DEBUG - 5, Runlevel.DEBUG: logging.DEBUG, Runlevel.INFO: logging.INFO, Runlevel.NOTICE: logging.INFO + 5, Runlevel.WARN: logging.WARN, Runlevel.ERROR: logging.ERROR, } logging.addLevelName(LOG_VALUES[TRACE], 'TRACE') logging.addLevelName(LOG_VALUES[NOTICE], 'NOTICE') LOGGER = logging.getLogger('stem') LOGGER.setLevel(LOG_VALUES[TRACE]) # There's some messages that we don't want to log more than once. This set has # the messages IDs that we've logged which fall into this category. DEDUPLICATION_MESSAGE_IDS = set() # Adds a default nullhandler for the stem logger, suppressing the 'No handlers # could be found for logger "stem"' warning as per... # http://docs.python.org/release/3.1.3/library/logging.html#configuring-logging-for-a-library class _NullHandler(logging.Handler): def __init__(self): logging.Handler.__init__(self, level = logging.FATAL + 5) # disable logging def emit(self, record): pass if not LOGGER.handlers: LOGGER.addHandler(_NullHandler()) def get_logger(): """ Provides the stem logger. :returns: **logging.Logger** for stem """ return LOGGER def logging_level(runlevel): """ Translates a runlevel into the value expected by the logging module. :param stem.util.log.Runlevel runlevel: runlevel to be returned, no logging if **None** """ if runlevel: return LOG_VALUES[runlevel] else: return logging.FATAL + 5 def is_tracing(): """ Checks if we're logging at the trace runlevel. .. versionadded:: 1.6.0 :returns: **True** if we're logging at the trace runlevel and **False** otherwise """ for handler in get_logger().handlers: if handler.level <= logging_level(TRACE): return True return False def escape(message): """ Escapes specific sequences for logging (newlines, tabs, carriage returns). If the input is **bytes** then this converts it to **unicode** under python 3.x. :param str message: string to be escaped :returns: str that is escaped """ if stem.prereq.is_python_3(): message = stem.util.str_tools._to_unicode(message) for pattern, replacement in (('\n', '\\n'), ('\r', '\\r'), ('\t', '\\t')): message = message.replace(pattern, replacement) return message def log(runlevel, message): """ Logs a message at the given runlevel. :param stem.util.log.Runlevel runlevel: runlevel to log the message at, logging is skipped if **None** :param str message: message to be logged """ if runlevel: LOGGER.log(LOG_VALUES[runlevel], message) def log_once(message_id, runlevel, message): """ Logs a message at the given runlevel. If a message with this ID has already been logged then this is a no-op. :param str message_id: unique message identifier to deduplicate on :param stem.util.log.Runlevel runlevel: runlevel to log the message at, logging is skipped if **None** :param str message: message to be logged :returns: **True** if we log the message, **False** otherwise """ if not runlevel or message_id in DEDUPLICATION_MESSAGE_IDS: return False else: DEDUPLICATION_MESSAGE_IDS.add(message_id) log(runlevel, message) # shorter aliases for logging at a runlevel def trace(message): log(Runlevel.TRACE, message) def debug(message): log(Runlevel.DEBUG, message) def info(message): log(Runlevel.INFO, message) def notice(message): log(Runlevel.NOTICE, message) def warn(message): log(Runlevel.WARN, message) def error(message): log(Runlevel.ERROR, message) class LogBuffer(logging.Handler): """ Basic log handler that listens for stem events and stores them so they can be read later. Log entries are cleared as they are read. .. versionchanged:: 1.4.0 Added the yield_records argument. """ def __init__(self, runlevel, yield_records = False): # TODO: At least in python 2.6 logging.Handler has a bug in that it doesn't # extend object, causing our super() call to fail. When we drop python 2.6 # support we should switch back to using super() instead. # # super(LogBuffer, self).__init__(level = logging_level(runlevel)) logging.Handler.__init__(self, level = logging_level(runlevel)) self.formatter = logging.Formatter( fmt = '%(asctime)s [%(levelname)s] %(message)s', datefmt = '%m/%d/%Y %H:%M:%S') self._buffer = [] self._yield_records = yield_records def is_empty(self): return not bool(self._buffer) def __iter__(self): while self._buffer: record = self._buffer.pop(0) yield record if self._yield_records else self.formatter.format(record) def emit(self, record): self._buffer.append(record) class _StdoutLogger(logging.Handler): def __init__(self, runlevel): logging.Handler.__init__(self, level = logging_level(runlevel)) self.formatter = logging.Formatter( fmt = '%(asctime)s [%(levelname)s] %(message)s', datefmt = '%m/%d/%Y %H:%M:%S') def emit(self, record): print(self.formatter.format(record)) def log_to_stdout(runlevel): """ Logs further events to stdout. :param stem.util.log.Runlevel runlevel: minimum runlevel a message needs to be to be logged """ get_logger().addHandler(_StdoutLogger(runlevel)) stem-1.7.1/stem/util/ports.cfg0000664000175000017500000001401013157571677017006 0ustar atagaratagar00000000000000################################################################################ # # Common usages for port . This is based on... # # https://secure.wikimedia.org/wikipedia/en/wiki/List_of_TCP_and_UDP_port numbers # http://isc.sans.edu/services.html # ################################################################################ port 1 => TCPMUX port 2 => CompressNET port 3 => CompressNET port 5 => RJE port 7 => Echo port 9 => Discard port 11 => SYSTAT port 13 => Daytime port 15 => netstat port 17 => QOTD port 18 => MSP port 19 => CHARGEN port 20 => FTP port 21 => FTP port 22 => SSH port 23 => Telnet port 24 => Priv-mail port 25 => SMTP port 34 => RF port 35 => Printer port 37 => TIME port 39 => RLP port 41 => Graphics port 42 => WINS port 43 => WHOIS port 47 => NI FTP port 49 => TACACS port 50 => Remote Mail port 51 => IMP port 52 => XNS port 53 => DNS port 54 => XNS port 55 => ISI-GL port 56 => RAP port 57 => MTP port 58 => XNS port 67 => BOOTP port 68 => BOOTP port 69 => TFTP port 70 => Gopher port 79 => Finger port 80 => HTTP port 81 => HTTP Alternate port 82 => Torpark port 83 => MIT ML port 88 => Kerberos port 90 => dnsix port 99 => WIP port 101 => NIC port 102 => ISO-TSAP port 104 => ACR/NEMA port 105 => CCSO port 107 => Telnet port 108 => SNA port 109 => POP2 port 110 => POP3 port 111 => ONC RPC port 113 => ident port 115 => SFTP port 117 => UUCP port 118 => SQL port 119 => NNTP port 123 => NTP port 135 => DCE port 137 => NetBIOS port 138 => NetBIOS port 139 => NetBIOS port 143 => IMAP port 152 => BFTP port 153 => SGMP port 156 => SQL port 158 => DMSP port 161 => SNMP port 162 => SNMPTRAP port 170 => Print-srv port 177 => XDMCP port 179 => BGP port 194 => IRC port 199 => SMUX port 201 => AppleTalk port 209 => QMTP port 210 => ANSI port 213 => IPX port 218 => MPP port 220 => IMAP port 256 => 2DEV port 259 => ESRO port 264 => BGMP port 308 => Novastor port 311 => OSX Admin port 318 => PKIX TSP port 319 => PTP port 320 => PTP port 323 => IMMP port 350 => MATIP port 351 => MATIP port 366 => ODMR port 369 => Rpc2port ap port 370 => codaauth2 port 371 => ClearCase port 383 => HP Alarm Mgr port 384 => ARNS port 387 => AURP port 389 => LDAP port 401 => UPS port 402 => Altiris port 427 => SLP port 443 => HTTPS port 444 => SNPP port 445 => SMB port 464 => Kerberos (kpasswd) port 465 => SMTP port 475 => tcpnethaspsrv port 497 => Retrospect port 500 => ISAKMP port 501 => STMF port 502 => Modbus port 504 => Citadel port 510 => FirstClass port 512 => Rexec port 513 => rlogin port 514 => rsh port 515 => LPD port 517 => Talk port 518 => NTalk port 520 => efs port 524 => NCP port 530 => RPC port 531 => AIM/IRC port 532 => netnews port 533 => netwall port 540 => UUCP port 542 => commerce port 543 => Kerberos (klogin) port 544 => Kerberos (kshell) port 545 => OSISoft PI port 546 => DHCPv6 port 547 => DHCPv6 port 548 => AFP port 550 => new-who port 554 => RTSP port 556 => RFS port 560 => rmonitor port 561 => monitor port 563 => NNTPS port 587 => SMTP port 591 => FileMaker port 593 => HTTP RPC port 604 => TUNNEL port 623 => ASF-RMCP port 631 => CUPS port 635 => RLZ DBase port 636 => LDAPS port 639 => MSDP port 641 => Support oft port 646 => LDP port 647 => DHCP port 648 => RRP port 651 => IEEE-MMS port 652 => DTCP port 653 => Support oft port 654 => MMS/MMP port 657 => RMC port 660 => OSX Admin port 665 => sun-dr port 666 => Doom port 674 => ACAP port 691 => MS Exchange port 692 => Hyperwave-ISP port 694 => Linux-HA port 695 => IEEE-MMS-SSL port 698 => OLSR port 699 => Access Network port 700 => EPP port 701 => LMP port 702 => IRIS port 706 => SILC port 711 => MPLS port 712 => TBRPF port 720 => SMQP port 749 => Kerberos (admin) port 750 => rfile port 751 => pump port 752 => qrh port 753 => rrh port 754 => tell send port 760 => ns port 782 => Conserver port 783 => spamd port 829 => CMP port 843 => Flash port 847 => DHCP port 860 => iSCSI port 873 => rsync port 888 => CDDB port 901 => SWAT port 902-904 => VMware port 911 => NCA port 953 => DNS RNDC port 981 => SofaWare Firewall port 989 => FTPS port 990 => FTPS port 991 => NAS port 992 => Telnets port 993 => IMAPS port 994 => IRCS port 995 => POP3S port 999 => ScimoreDB port 1001 => JtoMB port 1002 => cogbot port 1080 => SOCKS port 1085 => WebObjects port 1109 => KPOP port 1169 => Tripwire port 1194 => OpenVPN port 1214 => Kazaa port 1220 => QuickTime port 1234 => VLC port 1241 => Nessus port 1270 => SCOM port 1293 => IPSec port 1433 => MSSQL port 1434 => MSSQL port 1500 => NetGuard port 1503 => MSN port 1512 => WINS port 1521 => Oracle port 1526 => Oracle port 1533 => Sametime port 1666 => Perforce port 1677 => GroupWise port 1723 => PPTP port 1725 => Steam port 1863 => MSNP port 2049 => NFS port 2082 => Infowave port 2083 => radsec port 2086 => GNUnet port 2087 => ELI port 2095 => NBX SER port 2096 => NBX DIR port 2102-2104 => Zephyr port 2401 => CVS port 2525 => SMTP port 2710 => BitTorrent port 3074 => XBox LIVE port 3101 => BlackBerry port 3128 => SQUID port 3306 => MySQL port 3389 => WBT port 3690 => SVN port 3723 => Battle.net port 3724 => WoW port 4321 => RWHOIS port 4643 => Virtuozzo port 4662 => eMule port 5003 => FileMaker port 5050 => Yahoo IM port 5060 => SIP port 5061 => SIP port 5190 => AIM/ICQ port 5222 => Jabber port 5223 => Jabber port 5228 => Android Market port 5269 => Jabber port 5298 => Jabber port 5432 => PostgreSQL port 5500 => VNC port 5556 => Freeciv port 5666 => NRPE port 5667 => NSCA port 5800 => VNC port 5900 => VNC port 6346 => gnutella port 6347 => gnutella port 6660-6669 => IRC port 6679 => IRC port 6697 => IRC port 6881-6999 => BitTorrent port 8000 => iRDMI port 8008 => HTTP Alternate port 8010 => XMPP port 8074 => Gadu-Gadu port 8080 => HTTP Proxy port 8087 => SPP port 8088 => Radan HTTP port 8118 => Privoxy port 8123 => Polipo port 8332-8333 => Bitcoin port 8443 => PCsync HTTPS port 8888 => NewsEDGE port 9030 => Tor port 9050 => Tor port 9051 => Tor port 9418 => Git port 9999 => distinct port 10000 => Webmin port 19294 => Google Voice port 19638 => Ensim port 23399 => Skype port 30301 => BitTorrent port 33434 => traceroute port 50002 => Electrum Bitcoin SSL stem-1.7.1/stem/util/__init__.py0000664000175000017500000001022513356507530017257 0ustar atagaratagar00000000000000# Copyright 2011-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Utility functions used by the stem library. """ import datetime import stem.prereq __all__ = [ 'conf', 'connection', 'enum', 'log', 'lru_cache', 'ordereddict', 'proc', 'system', 'term', 'test_tools', 'tor_tools', 'datetime_to_unix', ] # Beginning with Stem 1.7 we take attribute types into account when hashing # and checking equality. That is to say, if two Stem classes' attributes are # the same but use different types we no longer consider them to be equal. # For example... # # s1 = Schedule(classes = ['Math', 'Art', 'PE']) # s2 = Schedule(classes = ('Math', 'Art', 'PE')) # # Prior to Stem 1.7 s1 and s2 would be equal, but afterward unless Stem's # construcotr normalizes the types they won't. # # This change in behavior is the right thing to do but carries some risk, so # we provide the following constant to revert to legacy behavior. If you find # yourself using it them please let me know (https://www.atagar.com/contact/) # since this flag will go away in the future. HASH_TYPES = True def _hash_value(val): if not HASH_TYPES: my_hash = 0 else: # TODO: I hate doing this but until Python 2.x support is dropped we # can't readily be strict about bytes vs unicode for attributes. This # is because test assertions often use strings, and normalizing this # would require wrapping most with to_unicode() calls. # # This hack will go away when we drop Python 2.x support. if _is_str(val): my_hash = hash('str') else: # Hashing common builtins (ints, bools, etc) provide consistant values but many others vary their value on interpreter invokation. my_hash = hash(str(type(val))) if isinstance(val, (tuple, list)): for v in val: my_hash = (my_hash * 1024) + hash(v) elif isinstance(val, dict): for k in sorted(val.keys()): my_hash = (my_hash * 2048) + (hash(k) * 1024) + hash(val[k]) else: my_hash += hash(val) return my_hash def _is_str(val): """ Check if a value is a string. This will be removed when we no longer provide backward compatibility for the Python 2.x series. :param object val: value to be checked :returns: **True** if the value is some form of string (unicode or bytes), and **False** otherwise """ if stem.prereq.is_python_3(): return isinstance(val, (bytes, str)) else: return isinstance(val, (bytes, unicode)) def _is_int(val): """ Check if a value is an integer. This will be removed when we no longer provide backward compatibility for the Python 2.x series. :param object val: value to be checked :returns: **True** if the value is some form of integer (int or long), and **False** otherwise """ if stem.prereq.is_python_3(): return isinstance(val, int) else: return isinstance(val, (int, long)) def datetime_to_unix(timestamp): """ Converts a utc datetime object to a unix timestamp. .. versionadded:: 1.5.0 :param datetime timestamp: timestamp to be converted :returns: **float** for the unix timestamp of the given datetime object """ if stem.prereq._is_python_26(): delta = (timestamp - datetime.datetime(1970, 1, 1)) return delta.days * 86400 + delta.seconds else: return (timestamp - datetime.datetime(1970, 1, 1)).total_seconds() def _hash_attr(obj, *attributes, **kwargs): """ Provide a hash value for the given set of attributes. :param Object obj: object to be hashed :param list attributes: attribute names to take into account :param bool cache: persists hash in a '_cached_hash' object attribute :param class parent: include parent's hash value """ is_cached = kwargs.get('cache', False) parent_class = kwargs.get('parent', None) cached_hash = getattr(obj, '_cached_hash', None) if is_cached and cached_hash is not None: return cached_hash my_hash = parent_class.__hash__(obj) if parent_class else 0 my_hash = my_hash * 1024 + hash(str(type(obj))) for attr in attributes: val = getattr(obj, attr) my_hash = my_hash * 1024 + _hash_value(val) if is_cached: setattr(obj, '_cached_hash', my_hash) return my_hash stem-1.7.1/stem/util/tor_tools.py0000664000175000017500000001053413341034346017541 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Miscellaneous utility functions for working with tor. .. versionadded:: 1.2.0 **Module Overview:** :: is_valid_fingerprint - checks if a string is a valid tor relay fingerprint is_valid_nickname - checks if a string is a valid tor relay nickname is_valid_circuit_id - checks if a string is a valid tor circuit id is_valid_stream_id - checks if a string is a valid tor stream id is_valid_connection_id - checks if a string is a valid tor connection id is_valid_hidden_service_address - checks if a string is a valid hidden service address is_hex_digits - checks if a string is only made up of hex digits """ import re import stem.util.str_tools # The control-spec defines the following as... # # Fingerprint = "$" 40*HEXDIG # NicknameChar = "a"-"z" / "A"-"Z" / "0" - "9" # Nickname = 1*19 NicknameChar # # CircuitID = 1*16 IDChar # IDChar = ALPHA / DIGIT # # HEXDIG is defined in RFC 5234 as being uppercase and used in RFC 5987 as # case insensitive. Tor doesn't define this in the spec so flipping a coin # and going with case insensitive. NICKNAME_PATTERN = re.compile('^[a-zA-Z0-9]{1,19}$') CIRC_ID_PATTERN = re.compile('^[a-zA-Z0-9]{1,16}$') # Hidden service addresses are sixteen base32 characters. HS_ADDRESS_PATTERN = re.compile('^[a-z2-7]{16}$') def is_valid_fingerprint(entry, check_prefix = False): """ Checks if a string is a properly formatted relay fingerprint. This checks for a '$' prefix if check_prefix is true, otherwise this only validates the hex digits. :param str entry: string to be checked :param bool check_prefix: checks for a '$' prefix :returns: **True** if the string could be a relay fingerprint, **False** otherwise """ if isinstance(entry, bytes): entry = stem.util.str_tools._to_unicode(entry) try: if check_prefix: if not entry or entry[0] != '$': return False entry = entry[1:] return is_hex_digits(entry, 40) except TypeError: return False def is_valid_nickname(entry): """ Checks if a string is a valid format for being a nickname. :param str entry: string to be checked :returns: **True** if the string could be a nickname, **False** otherwise """ if isinstance(entry, bytes): entry = stem.util.str_tools._to_unicode(entry) try: return bool(NICKNAME_PATTERN.match(entry)) except TypeError: return False def is_valid_circuit_id(entry): """ Checks if a string is a valid format for being a circuit identifier. :returns: **True** if the string could be a circuit id, **False** otherwise """ if isinstance(entry, bytes): entry = stem.util.str_tools._to_unicode(entry) try: return bool(CIRC_ID_PATTERN.match(entry)) except TypeError: return False def is_valid_stream_id(entry): """ Checks if a string is a valid format for being a stream identifier. Currently, this is just an alias to :func:`~stem.util.tor_tools.is_valid_circuit_id`. :returns: **True** if the string could be a stream id, **False** otherwise """ return is_valid_circuit_id(entry) def is_valid_connection_id(entry): """ Checks if a string is a valid format for being a connection identifier. Currently, this is just an alias to :func:`~stem.util.tor_tools.is_valid_circuit_id`. :returns: **True** if the string could be a connection id, **False** otherwise """ return is_valid_circuit_id(entry) def is_valid_hidden_service_address(entry): """ Checks if a string is a valid format for being a hidden service address (not including the '.onion' suffix). :returns: **True** if the string could be a hidden service address, **False** otherwise """ if isinstance(entry, bytes): entry = stem.util.str_tools._to_unicode(entry) try: return bool(HS_ADDRESS_PATTERN.match(entry)) except TypeError: return False def is_hex_digits(entry, count): """ Checks if a string is the given number of hex digits. Digits represented by letters are case insensitive. :param str entry: string to be checked :param int count: number of hex digits to be checked for :returns: **True** if the given number of hex digits, **False** otherwise """ try: if len(entry) != count: return False int(entry, 16) # attempt to convert it as hex return True except (ValueError, TypeError): return False stem-1.7.1/stem/util/enum.py0000664000175000017500000001041413341034346016456 0ustar atagaratagar00000000000000# Copyright 2011-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Basic enumeration, providing ordered types for collections. These can be constructed as simple type listings... :: >>> from stem.util import enum >>> insects = enum.Enum('ANT', 'WASP', 'LADYBUG', 'FIREFLY') >>> insects.ANT 'Ant' >>> tuple(insects) ('Ant', 'Wasp', 'Ladybug', 'Firefly') ... or with overwritten string counterparts... :: >>> from stem.util import enum >>> pets = enum.Enum(('DOG', 'Skippy'), 'CAT', ('FISH', 'Nemo')) >>> pets.DOG 'Skippy' >>> pets.CAT 'Cat' **Module Overview:** :: UppercaseEnum - Provides an enum instance with capitalized values Enum - Provides a basic, ordered enumeration |- keys - string representation of our enum keys |- index_of - index of an enum value |- next - provides the enum after a given enum value |- previous - provides the enum before a given value |- __getitem__ - provides the value for an enum key +- __iter__ - iterator over our enum keys """ import stem.util def UppercaseEnum(*args): """ Provides an :class:`~stem.util.enum.Enum` instance where the values are identical to the keys. Since the keys are uppercase by convention this means the values are too. For instance... :: >>> from stem.util import enum >>> runlevels = enum.UppercaseEnum('DEBUG', 'INFO', 'NOTICE', 'WARN', 'ERROR') >>> runlevels.DEBUG 'DEBUG' :param list args: enum keys to initialize with :returns: :class:`~stem.util.enum.Enum` instance with the given keys """ return Enum(*[(v, v) for v in args]) class Enum(object): """ Basic enumeration. """ def __init__(self, *args): from stem.util.str_tools import _to_camel_case # ordered listings of our keys and values keys, values = [], [] for entry in args: if stem.util._is_str(entry): key, val = entry, _to_camel_case(entry) elif isinstance(entry, tuple) and len(entry) == 2: key, val = entry else: raise ValueError('Unrecognized input: %s' % args) keys.append(key) values.append(val) setattr(self, key, val) self._keys = tuple(keys) self._values = tuple(values) def keys(self): """ Provides an ordered listing of the enumeration keys in this set. :returns: **list** with our enum keys """ return list(self._keys) def index_of(self, value): """ Provides the index of the given value in the collection. :param str value: entry to be looked up :returns: **int** index of the given entry :raises: **ValueError** if no such element exists """ return self._values.index(value) def next(self, value): """ Provides the next enumeration after the given value. :param str value: enumeration for which to get the next entry :returns: enum value following the given entry :raises: **ValueError** if no such element exists """ if value not in self._values: raise ValueError('No such enumeration exists: %s (options: %s)' % (value, ', '.join(self._values))) next_index = (self._values.index(value) + 1) % len(self._values) return self._values[next_index] def previous(self, value): """ Provides the previous enumeration before the given value. :param str value: enumeration for which to get the previous entry :returns: enum value proceeding the given entry :raises: **ValueError** if no such element exists """ if value not in self._values: raise ValueError('No such enumeration exists: %s (options: %s)' % (value, ', '.join(self._values))) prev_index = (self._values.index(value) - 1) % len(self._values) return self._values[prev_index] def __getitem__(self, item): """ Provides the values for the given key. :param str item: key to be looked up :returns: **str** with the value for the given key :raises: **ValueError** if the key doesn't exist """ if item in vars(self): return getattr(self, item) else: keys = ', '.join(self.keys()) raise ValueError("'%s' isn't among our enumeration keys, which includes: %s" % (item, keys)) def __iter__(self): """ Provides an ordered listing of the enums in this set. """ for entry in self._values: yield entry stem-1.7.1/stem/util/str_tools.py0000664000175000017500000004114413341034346017546 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Toolkit for various string activity. .. versionchanged:: 1.3.0 Dropped the get_* prefix from several function names. The old names still work, but are deprecated aliases. **Module Overview:** :: crop - shortens string to a given length size_label - human readable label for a number of bytes time_label - human readable label for a number of seconds time_labels - human readable labels for each time unit short_time_label - condensed time label output parse_short_time_label - seconds represented by a short time label """ import codecs import datetime import re import sys import stem.prereq import stem.util import stem.util.enum # label conversion tuples of the form... # (bits / bytes / seconds, short label, long label) SIZE_UNITS_BITS = ( (140737488355328.0, ' Pb', ' Petabit'), (137438953472.0, ' Tb', ' Terabit'), (134217728.0, ' Gb', ' Gigabit'), (131072.0, ' Mb', ' Megabit'), (128.0, ' Kb', ' Kilobit'), (0.125, ' b', ' Bit'), ) SIZE_UNITS_BYTES = ( (1125899906842624.0, ' PB', ' Petabyte'), (1099511627776.0, ' TB', ' Terabyte'), (1073741824.0, ' GB', ' Gigabyte'), (1048576.0, ' MB', ' Megabyte'), (1024.0, ' KB', ' Kilobyte'), (1.0, ' B', ' Byte'), ) TIME_UNITS = ( (86400.0, 'd', ' day'), (3600.0, 'h', ' hour'), (60.0, 'm', ' minute'), (1.0, 's', ' second'), ) _timestamp_re = re.compile(r'(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})') if stem.prereq.is_python_3(): def _to_bytes_impl(msg): if isinstance(msg, str): return codecs.latin_1_encode(msg, 'replace')[0] else: return msg def _to_unicode_impl(msg): if msg is not None and not isinstance(msg, str): return msg.decode('utf-8', 'replace') else: return msg else: def _to_bytes_impl(msg): if msg is not None and isinstance(msg, unicode): return codecs.latin_1_encode(msg, 'replace')[0] else: return msg def _to_unicode_impl(msg): if msg is not None and not isinstance(msg, unicode): return msg.decode('utf-8', 'replace') else: return msg def _to_bytes(msg): """ Provides the ASCII bytes for the given string. This is purely to provide python 3 compatability, normalizing the unicode/ASCII change in the version bump. For an explanation of this see... http://python3porting.com/problems.html#nicer-solutions :param str,unicode msg: string to be converted :returns: ASCII bytes for string """ return _to_bytes_impl(msg) def _to_unicode(msg): """ Provides the unicode string for the given ASCII bytes. This is purely to provide python 3 compatability, normalizing the unicode/ASCII change in the version bump. :param str,unicode msg: string to be converted :returns: unicode conversion """ return _to_unicode_impl(msg) def _to_int(msg): """ Serializes a string to a number. :param str msg: string to be serialized :returns: **int** representation of the string """ if stem.prereq.is_python_3() and isinstance(msg, bytes): # iterating over bytes in python3 provides ints rather than characters return sum([pow(256, (len(msg) - i - 1)) * c for (i, c) in enumerate(msg)]) else: return sum([pow(256, (len(msg) - i - 1)) * ord(c) for (i, c) in enumerate(msg)]) def _to_camel_case(label, divider = '_', joiner = ' '): """ Converts the given string to camel case, ie: :: >>> _to_camel_case('I_LIKE_PEPPERJACK!') 'I Like Pepperjack!' :param str label: input string to be converted :param str divider: word boundary :param str joiner: replacement for word boundaries :returns: camel cased string """ words = [] for entry in label.split(divider): if len(entry) == 0: words.append('') elif len(entry) == 1: words.append(entry.upper()) else: words.append(entry[0].upper() + entry[1:].lower()) return joiner.join(words) def _split_by_length(msg, size): """ Splits a string into a list of strings up to the given size. :: >>> _split_by_length('hello', 2) ['he', 'll', 'o'] :param str msg: string to split :param int size: number of characters to chunk into :returns: **list** with chunked string components """ return [msg[i:i + size] for i in range(0, len(msg), size)] # This needs to be defined after _to_camel_case() to avoid a circular # dependency with the enum module. Ending = stem.util.enum.Enum('ELLIPSE', 'HYPHEN') def crop(msg, size, min_word_length = 4, min_crop = 0, ending = Ending.ELLIPSE, get_remainder = False): """ Shortens a string to a given length. If we crop content then a given ending is included (counting itself toward the size limitation). This crops on word breaks so we only include a word if we can display at least **min_word_length** characters of it. If there isn't room for even a truncated single word (or one word plus the ellipse if including those) then this provides an empty string. If a cropped string ends with a comma or period then it's stripped (unless we're providing the remainder back). For example... >>> crop('This is a looooong message', 17) 'This is a looo...' >>> crop('This is a looooong message', 12) 'This is a...' >>> crop('This is a looooong message', 3) '' The whole point of this method is to provide human friendly croppings, and as such details of how this works might change in the future. Callers should not rely on the details of how this crops. .. versionadded:: 1.3.0 :param str msg: text to be processed :param int size: space available for text :param int min_word_length: minimum characters before which a word is dropped, requires whole word if **None** :param int min_crop: minimum characters that must be dropped if a word is cropped :param Ending ending: type of ending used when truncating, no special truncation is used if **None** :param bool get_remainder: returns a tuple with the second part being the cropped portion of the message :returns: **str** of the text truncated to the given length """ # checks if there's room for the whole message if len(msg) <= size: return (msg, '') if get_remainder else msg if size < 0: raise ValueError("Crop size can't be negative (received %i)" % size) elif min_word_length and min_word_length < 0: raise ValueError("Crop's min_word_length can't be negative (received %i)" % min_word_length) elif min_crop < 0: raise ValueError("Crop's min_crop can't be negative (received %i)" % min_crop) # since we're cropping, the effective space available is less with an # ellipse, and cropping words requires an extra space for hyphens if ending == Ending.ELLIPSE: if size < 3: return ('', msg) if get_remainder else '' size -= 3 elif min_word_length and ending == Ending.HYPHEN: min_word_length += 1 if min_word_length is None: min_word_length = sys.maxsize # checks if there isn't the minimum space needed to include anything last_wordbreak = msg.rfind(' ', 0, size + 1) if last_wordbreak == -1: # we're splitting the first word if size < min_word_length: return ('', msg) if get_remainder else '' include_crop = True else: last_wordbreak = len(msg[:last_wordbreak].rstrip()) # drops extra ending whitespaces include_crop = size - last_wordbreak - 1 >= min_word_length # if there's a max crop size then make sure we're cropping at least that many characters if include_crop and min_crop: next_wordbreak = msg.find(' ', size) if next_wordbreak == -1: next_wordbreak = len(msg) include_crop = next_wordbreak - size + 1 >= min_crop if include_crop: return_msg, remainder = msg[:size], msg[size:] if ending == Ending.HYPHEN: remainder = return_msg[-1] + remainder return_msg = return_msg[:-1].rstrip() + '-' else: return_msg, remainder = msg[:last_wordbreak], msg[last_wordbreak:] # if this is ending with a comma or period then strip it off if not get_remainder and return_msg and return_msg[-1] in (',', '.'): return_msg = return_msg[:-1] if ending == Ending.ELLIPSE: return_msg = return_msg.rstrip() + '...' return (return_msg, remainder) if get_remainder else return_msg def size_label(byte_count, decimal = 0, is_long = False, is_bytes = True, round = False): """ Converts a number of bytes into a human readable label in its most significant units. For instance, 7500 bytes would return "7 KB". If the is_long option is used this expands unit labels to be the properly pluralized full word (for instance 'Kilobytes' rather than 'KB'). Units go up through petabytes. :: >>> size_label(2000000) '1 MB' >>> size_label(1050, 2) '1.02 KB' >>> size_label(1050, 3, True) '1.025 Kilobytes' .. versionchanged:: 1.6.0 Added round argument. :param int byte_count: number of bytes to be converted :param int decimal: number of decimal digits to be included :param bool is_long: expands units label :param bool is_bytes: provides units in bytes if **True**, bits otherwise :param bool round: rounds normally if **True**, otherwise rounds down :returns: **str** with human readable representation of the size """ if is_bytes: return _get_label(SIZE_UNITS_BYTES, byte_count, decimal, is_long, round) else: return _get_label(SIZE_UNITS_BITS, byte_count, decimal, is_long, round) def time_label(seconds, decimal = 0, is_long = False): """ Converts seconds into a time label truncated to its most significant units. For instance, 7500 seconds would return "2h". Units go up through days. This defaults to presenting single character labels, but if the is_long option is used this expands labels to be the full word (space included and properly pluralized). For instance, "4h" would be "4 hours" and "1m" would become "1 minute". :: >>> time_label(10000) '2h' >>> time_label(61, 1, True) '1.0 minute' >>> time_label(61, 2, True) '1.01 minutes' :param int seconds: number of seconds to be converted :param int decimal: number of decimal digits to be included :param bool is_long: expands units label :returns: **str** with human readable representation of the time """ return _get_label(TIME_UNITS, seconds, decimal, is_long) def time_labels(seconds, is_long = False): """ Provides a list of label conversions for each time unit, starting with its most significant units on down. Any counts that evaluate to zero are omitted. For example... :: >>> time_labels(400) ['6m', '40s'] >>> time_labels(3640, True) ['1 hour', '40 seconds'] :param int seconds: number of seconds to be converted :param bool is_long: expands units label :returns: **list** of strings with human readable representations of the time """ time_labels = [] for count_per_unit, _, _ in TIME_UNITS: if abs(seconds) >= count_per_unit: time_labels.append(_get_label(TIME_UNITS, seconds, 0, is_long)) seconds %= count_per_unit return time_labels def short_time_label(seconds): """ Provides a time in the following format: [[dd-]hh:]mm:ss :: >>> short_time_label(111) '01:51' >>> short_time_label(544100) '6-07:08:20' :param int seconds: number of seconds to be converted :returns: **str** with the short representation for the time :raises: **ValueError** if the input is negative """ if seconds < 0: raise ValueError("Input needs to be a non-negative integer, got '%i'" % seconds) time_comp = {} for amount, _, label in TIME_UNITS: count = int(seconds / amount) seconds %= amount time_comp[label.strip()] = count label = '%02i:%02i' % (time_comp['minute'], time_comp['second']) if time_comp['day']: label = '%i-%02i:%s' % (time_comp['day'], time_comp['hour'], label) elif time_comp['hour']: label = '%02i:%s' % (time_comp['hour'], label) return label def parse_short_time_label(label): """ Provides the number of seconds corresponding to the formatting used for the cputime and etime fields of ps: [[dd-]hh:]mm:ss or mm:ss.ss :: >>> parse_short_time_label('01:51') 111 >>> parse_short_time_label('6-07:08:20') 544100 :param str label: time entry to be parsed :returns: **int** with the number of seconds represented by the label :raises: **ValueError** if input is malformed """ days, hours, minutes, seconds = '0', '0', '0', '0' if '-' in label: days, label = label.split('-', 1) time_comp = label.split(':') if len(time_comp) == 3: hours, minutes, seconds = time_comp elif len(time_comp) == 2: minutes, seconds = time_comp else: raise ValueError("Invalid time format, we expected '[[dd-]hh:]mm:ss' or 'mm:ss.ss': %s" % label) try: time_sum = int(float(seconds)) time_sum += int(minutes) * 60 time_sum += int(hours) * 3600 time_sum += int(days) * 86400 return time_sum except ValueError: raise ValueError('Non-numeric value in time entry: %s' % label) def _parse_timestamp(entry): """ Parses the date and time that in format like like... :: 2012-11-08 16:48:41 :param str entry: timestamp to be parsed :returns: **datetime** for the time represented by the timestamp :raises: **ValueError** if the timestamp is malformed """ if not stem.util._is_str(entry): raise ValueError('parse_timestamp() input must be a str, got a %s' % type(entry)) try: time = [int(x) for x in _timestamp_re.match(entry).groups()] except AttributeError: raise ValueError('Expected timestamp in format YYYY-MM-DD HH:MM:ss but got ' + entry) return datetime.datetime(time[0], time[1], time[2], time[3], time[4], time[5]) def _parse_iso_timestamp(entry): """ Parses the ISO 8601 standard that provides for timestamps like... :: 2012-11-08T16:48:41.420251 :param str entry: timestamp to be parsed :returns: **datetime** for the time represented by the timestamp :raises: **ValueError** if the timestamp is malformed """ if not stem.util._is_str(entry): raise ValueError('parse_iso_timestamp() input must be a str, got a %s' % type(entry)) # based after suggestions from... # http://stackoverflow.com/questions/127803/how-to-parse-iso-formatted-date-in-python if '.' in entry: timestamp_str, microseconds = entry.split('.') else: timestamp_str, microseconds = entry, '000000' if len(microseconds) != 6 or not microseconds.isdigit(): raise ValueError("timestamp's microseconds should be six digits") if len(timestamp_str) > 10 and timestamp_str[10] == 'T': timestamp_str = timestamp_str[:10] + ' ' + timestamp_str[11:] else: raise ValueError("timestamp didn't contain delimeter 'T' between date and time") timestamp = _parse_timestamp(timestamp_str) return timestamp + datetime.timedelta(microseconds = int(microseconds)) def _get_label(units, count, decimal, is_long, round = False): """ Provides label corresponding to units of the highest significance in the provided set. This rounds down (ie, integer truncation after visible units). :param tuple units: type of units to be used for conversion, containing (count_per_unit, short_label, long_label) :param int count: number of base units being converted :param int decimal: decimal precision of label :param bool is_long: uses the long label if **True**, short label otherwise :param bool round: rounds normally if **True**, otherwise rounds down """ # formatted string for the requested number of digits label_format = '%%.%if' % decimal if count < 0: label_format = '-' + label_format count = abs(count) elif count == 0: units_label = units[-1][2] + 's' if is_long else units[-1][1] return '%s%s' % (label_format % count, units_label) for count_per_unit, short_label, long_label in units: if count >= count_per_unit: if not round: # Rounding down with a '%f' is a little clunky. Reducing the count so # it'll divide evenly as the rounded down value. count -= count % (count_per_unit / (10 ** decimal)) count_label = label_format % (count / count_per_unit) if is_long: # Pluralize if any of the visible units make it greater than one. For # instance 1.0003 is plural but 1.000 isn't. if decimal > 0: is_plural = count > count_per_unit else: is_plural = count >= count_per_unit * 2 return count_label + long_label + ('s' if is_plural else '') else: return count_label + short_label # TODO: drop with stem 2.x # We renamed our methods to drop a redundant 'get_*' prefix, so alias the old # names for backward compatability. get_size_label = size_label get_time_label = time_label get_time_labels = time_labels get_short_time_label = short_time_label stem-1.7.1/requirements.txt0000664000175000017500000000006213157571677016517 0ustar atagaratagar00000000000000mock pyflakes pycodestyle tox cryptography pynacl stem-1.7.1/MANIFEST.in0000664000175000017500000000063313411004021014734 0ustar atagaratagar00000000000000include cache_fallback_directories.py include cache_manual.py include LICENSE include README.md include MANIFEST.in include requirements.txt include run_tests.py include tox.ini graft docs graft test global-exclude __pycache__ global-exclude *.orig global-exclude *.pyc global-exclude *.swp global-exclude *.swo global-exclude .tox global-exclude *~ recursive-exclude test/data * recursive-exclude docs/_build *stem-1.7.1/run_tests.py0000775000175000017500000002733013411002341015607 0ustar atagaratagar00000000000000#!/usr/bin/env python # Copyright 2011-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Runs unit and integration tests. For usage information run this with '--help'. """ import os import sys import threading import time import traceback import unittest try: # TODO: added in python 2.7, drop check when removing 2.6 support import importlib RUN_ASYNC_TESTS = True except ImportError: RUN_ASYNC_TESTS = False try: from StringIO import StringIO except ImportError: from io import StringIO import stem.prereq import stem.util.conf import stem.util.log import stem.util.system import stem.util.test_tools import stem.version import test import test.arguments import test.output import test.runner import test.task from test.output import STATUS, SUCCESS, ERROR, NO_NL, STDERR, println CONFIG = stem.util.conf.config_dict('test', { 'integ.test_directory': './test/data', 'test.unit_tests': '', 'test.integ_tests': '', }) MOCK_UNAVAILABLE_MSG = """\ To run stem's tests you'll need mock... https://pypi.python.org/pypi/mock/ """ MOCK_OUT_OF_DATE_MSG = """\ To run stem's tests you'll need mock. You have version %s, but you need version 0.8.0 or later... https://pypi.python.org/pypi/mock/ """ NEW_CAPABILITIES_FOUND = """\ Your version of Tor has capabilities stem currently isn't taking advantage of. If you're running the latest version of stem then please file a ticket on: https://trac.torproject.org/projects/tor/wiki/doc/stem/bugs New capabilities are: """ def get_unit_tests(module_prefix = None): """ Provides the classes for our unit tests. :param str module_prefix: only provide the test if the module starts with this substring :returns: an **iterator** for our unit tests """ if module_prefix and not module_prefix.startswith('test.unit.'): module_prefix = 'test.unit.' + module_prefix return _get_tests(CONFIG['test.unit_tests'].splitlines(), module_prefix) def get_integ_tests(module_prefix = None): """ Provides the classes for our integration tests. :param str module_prefix: only provide the test if the module starts with this substring :returns: an **iterator** for our integration tests """ if module_prefix and not module_prefix.startswith('test.integ.'): module_prefix = 'test.integ.' + module_prefix return _get_tests(CONFIG['test.integ_tests'].splitlines(), module_prefix) def _get_tests(modules, module_prefix): for import_name in modules: module, module_name = import_name.rsplit('.', 1) # example: util.conf.TestConf if not module_prefix or module.startswith(module_prefix): yield import_name elif module_prefix.startswith(module): # single test for this module test_name = module_prefix.rsplit('.', 1)[1] yield '%s.%s' % (import_name, test_name) def main(): start_time = time.time() try: stem.prereq.check_requirements() except ImportError as exc: println('%s\n' % exc) sys.exit(1) test_config = stem.util.conf.get_config('test') test_config.load(os.path.join(test.STEM_BASE, 'test', 'settings.cfg')) try: args = test.arguments.parse(sys.argv[1:]) test.task.TOR_VERSION.args = (args.tor_path,) test.output.SUPPRESS_STDOUT = args.quiet except ValueError as exc: println(str(exc)) sys.exit(1) if args.print_help: println(test.arguments.get_help()) sys.exit() elif not args.run_unit and not args.run_integ: println('Nothing to run (for usage provide --help)\n') sys.exit() if not stem.prereq.is_mock_available(): try: import mock println(MOCK_OUT_OF_DATE_MSG % mock.__version__) except ImportError: println(MOCK_UNAVAILABLE_MSG) if stem.util.system.is_available('pip'): println("You can get it by running 'sudo pip install mock'.") elif stem.util.system.is_available('apt-get'): println("You can get it by running 'sudo apt-get install python-mock'.") sys.exit(1) test.task.run( 'INITIALISING', test.task.STEM_VERSION, test.task.TOR_VERSION if args.run_integ else None, test.task.PYTHON_VERSION, test.task.PLATFORM_VERSION, test.task.CRYPTO_VERSION, test.task.PYNACL_VERSION, test.task.MOCK_VERSION, test.task.PYFLAKES_VERSION, test.task.PYCODESTYLE_VERSION, test.task.CLEAN_PYC, test.task.UNUSED_TESTS, test.task.IMPORT_TESTS, test.task.PYFLAKES_TASK if not args.specific_test else None, test.task.PYCODESTYLE_TASK if not args.specific_test else None, ) # buffer that we log messages into so they can be printed after a test has finished logging_buffer = stem.util.log.LogBuffer(args.logging_runlevel) stem.util.log.get_logger().addHandler(logging_buffer) # filters for how testing output is displayed error_tracker = test.output.ErrorTracker() output_filters = ( error_tracker.get_filter(), test.output.runtimes, test.output.strip_module, test.output.align_results, test.output.colorize, ) # Number of tests that we have skipped. This is only available with python # 2.7 or later because before that test results didn't have a 'skipped' # attribute. skipped_tests = 0 if args.run_integ: default_test_dir = stem.util.system.expand_path(CONFIG['integ.test_directory'], test.STEM_BASE) async_args = test.AsyncTestArgs(default_test_dir, args.tor_path) for module_str in stem.util.test_tools.ASYNC_TESTS: if RUN_ASYNC_TESTS and (not args.specific_test or module_str.startswith(args.specific_test)): module = importlib.import_module(module_str.rsplit('.', 1)[0]) test_classes = [v for k, v in module.__dict__.items() if k.startswith('Test')] if len(test_classes) != 1: print('BUG: Detected multiple tests for %s: %s' % (module_str, ', '.join(test_classes))) sys.exit(1) test_classes[0].run_tests(async_args) if args.run_unit: test.output.print_divider('UNIT TESTS', True) error_tracker.set_category('UNIT TEST') for test_class in get_unit_tests(args.specific_test): run_result = _run_test(args, test_class, output_filters) test.output.print_logging(logging_buffer) skipped_tests += len(getattr(run_result, 'skipped', [])) println() if args.run_integ: test.output.print_divider('INTEGRATION TESTS', True) integ_runner = test.runner.get_runner() for target in args.run_targets: error_tracker.set_category(target) try: integ_runner.start(target, args.attribute_targets, args.tor_path) println('Running tests...\n', STATUS) for test_class in get_integ_tests(args.specific_test): if integ_runner.assert_tor_is_running(): run_result = _run_test(args, test_class, output_filters) test.output.print_logging(logging_buffer) skipped_tests += len(getattr(run_result, 'skipped', [])) else: # our tor process died error_tracker.register_error() break except KeyboardInterrupt: println(' aborted starting tor: keyboard interrupt\n', ERROR) break except ValueError as exc: println(str(exc), ERROR) # can arise if there's bad settings.cfg data break except OSError: error_tracker.register_error() finally: println() integ_runner.stop() println() # We should have joined on all threads. If not then that indicates a # leak that could both likely be a bug and disrupt further targets. active_threads = threading.enumerate() if len(active_threads) > 1: println('Threads lingering after test run:', ERROR) for lingering_thread in active_threads: println(' %s' % lingering_thread, ERROR) break static_check_issues = {} for task in (test.task.PYFLAKES_TASK, test.task.PYCODESTYLE_TASK): if not task.is_available and task.unavailable_msg: println(task.unavailable_msg, ERROR) else: task.join() # no-op if these haven't been run if task.result: for path, issues in task.result.items(): for issue in issues: static_check_issues.setdefault(path, []).append(issue) _print_static_issues(static_check_issues) if error_tracker.has_errors_occured(): println('TESTING FAILED (%i seconds)' % (time.time() - start_time), ERROR, STDERR) for line in error_tracker: println(' %s' % line, ERROR, STDERR) error_modules = error_tracker.get_modules() if len(error_modules) < 10 and not args.specific_test: println('\nYou can re-run just these tests with:\n', ERROR, STDERR) for module in error_modules: println(' %s --test %s' % (' '.join(sys.argv), module), ERROR, STDERR) else: if skipped_tests > 0: println('%i TESTS WERE SKIPPED' % skipped_tests, STATUS) println('TESTING PASSED (%i seconds)\n' % (time.time() - start_time), SUCCESS) new_capabilities = test.get_new_capabilities() if new_capabilities: println(NEW_CAPABILITIES_FOUND, ERROR) for capability_type, msg in new_capabilities: println(' [%s] %s' % (capability_type, msg), ERROR) sys.exit(1 if error_tracker.has_errors_occured() else 0) def _print_static_issues(static_check_issues): if static_check_issues: println('STATIC CHECKS', STATUS) for file_path in static_check_issues: println('* %s' % file_path, STATUS) # Make a dict of line numbers to its issues. This is so we can both sort # by the line number and clear any duplicate messages. line_to_issues = {} for issue in static_check_issues[file_path]: line_to_issues.setdefault(issue.line_number, set()).add((issue.message, issue.line)) for line_number in sorted(line_to_issues.keys()): for msg, line in line_to_issues[line_number]: line_count = '%-4s' % line_number content = ' | %s' % line.strip() if line.strip() else '' println(' line %s - %-40s%s' % (line_count, msg, content)) println() def _run_test(args, test_class, output_filters): start_time = time.time() # Test classes look like... # # test.unit.util.conf.TestConf.test_parse_enum_csv # # We want to strip the 'test.unit.' or 'test.integ.' prefix since it's # redundant. We also want to drop the test class name. The individual test # name at the end it optional (only present if we used the '--test' # argument). label_comp = test_class.split('.')[2:] del label_comp[-1 if label_comp[-1][0].isupper() else -2] test_label = ' %-52s' % ('.'.join(label_comp) + '...') if args.verbose: test.output.print_divider(test_class) else: println(test_label, STATUS, NO_NL) try: suite = unittest.TestLoader().loadTestsFromName(test_class) except AttributeError: if args.specific_test: # should only come up if user provided '--test' for something that doesn't exist println(' no such test', ERROR) return None else: raise except Exception as exc: println(' failed', ERROR) traceback.print_exc(exc) return None test_results = StringIO() run_result = stem.util.test_tools.TimedTestRunner(test_results, verbosity = 2).run(suite) if args.verbose: println(test.output.apply_filters(test_results.getvalue(), *output_filters)) elif not run_result.failures and not run_result.errors: println(' success (%0.2fs)' % (time.time() - start_time), SUCCESS) else: if args.quiet: println(test_label, STATUS, NO_NL, STDERR) println(' failed (%0.2fs)' % (time.time() - start_time), ERROR, STDERR) println(test.output.apply_filters(test_results.getvalue(), *output_filters), STDERR) else: println(' failed (%0.2fs)' % (time.time() - start_time), ERROR) println(test.output.apply_filters(test_results.getvalue(), *output_filters), NO_NL) return run_result if __name__ == '__main__': main() stem-1.7.1/LICENSE0000664000175000017500000001674313157571677014255 0ustar atagaratagar00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. stem-1.7.1/tox.ini0000664000175000017500000000036213341474573014541 0ustar atagaratagar00000000000000[tox] skip_missing_interpreters = True envlist = py26,py27,py32,py33,py34,py35,py36,py37,jython,pypy skipsdist = True [testenv] commands = pip install -e . python run_tests.py {posargs:-a} rm -rf stem.egg-info deps = -rrequirements.txt stem-1.7.1/docs/0000775000175000017500000000000013411004021014124 5ustar atagaratagar00000000000000stem-1.7.1/docs/tutorials.rst0000664000175000017500000001330513157571677016747 0ustar atagaratagar00000000000000Tutorial ======== .. Image Sources: * The Little Relay That Could - train.png Source: https://openclipart.org/detail/140185/tren-train-by-antroares Author: Antroares License: Public Domain Alternate: https://openclipart.org/detail/1128/train-roadsign-by-ryanlerch * To Russia With Love - soviet.png Source: https://openclipart.org/detail/146017/flag-of-the-soviet-union-by-marxist-leninist Author: Unknown License: Public Domain (not a subject of copyright according the Russian civil code) Alternate: https://openclipart.org/detail/85555/communist-sabbatarian-ribbon-by-rones-85555 * Tortoise and the Hare - tortoise.png Source: https://openclipart.org/detail/27911/green-tortoise-%28cartoon%29-by-arking-27911 Author: arking License: Public Domain * Over the River and Through the Wood - riding_hood.png Source: https://openclipart.org/detail/163771/little-red-riding-hood-by-tzunghaor Author: tzunghaor License: Public Domain * Mirror Mirror On The Wall - mirror.png Source: https://openclipart.org/detail/152155/mirror-frame-by-gsagri04 Author: Unknown (gsagri04?) License: Public Domain Alternate: https://openclipart.org/detail/174179/miroir-rectangulaire-by-defaz36-174179 * East of the Sun & West of the Moon - windrose.png Source: https://commons.wikimedia.org/wiki/File:Compass_card_%28sl%29.svg Author: Andrejj License: CC0 (https://creativecommons.org/publicdomain/zero/1.0/deed.en) * Mad Hatter - mad_hatter.png Source: http://www.krepcio.com/vitreosity/archives/MadHatter-ALL-illus600.jpg Author: John Tenniel License: Public Doman Augmented: Colored by me, and used the card from... https://openclipart.org/detail/1892/mad-hatter-with-label-on-hat-by-nayrhcrel * Double Double Toil and Trouble - cauldron.png Source: https://openclipart.org/detail/174099/cauldron-by-jarda-174099 Author: Unknown (jarda?) License: Public Domain Getting started with any new library can be daunting, so let's get our feet wet by jumping straight in with some tutorials... .. list-table:: :widths: 1 10 :header-rows: 0 * - .. image:: /_static/section/tutorials/train.png :target: tutorials/the_little_relay_that_could.html - .. image:: /_static/label/the_little_relay_that_could.png :target: tutorials/the_little_relay_that_could.html Basics for talking with Tor. This will step you through configuring Tor and writing your first script to talk with it. * - .. image:: /_static/section/tutorials/soviet.png :target: tutorials/to_russia_with_love.html - .. image:: /_static/label/to_russia_with_love.png :target: tutorials/to_russia_with_love.html Rather than talking to Tor, we'll now talk **through** it. In this tutorial we'll programmatically start Tor then use it to read a site through mother Russia! * - .. image:: /_static/section/tutorials/tortoise.png :target: tutorials/tortoise_and_the_hare.html - .. image:: /_static/label/tortoise_and_the_hare.png :target: tutorials/tortoise_and_the_hare.html As Tor runs it generates a variety of **events** that controllers can subscribe to be notified of. In this tutorial we'll do just that, writing a curses application that graphs the bandwidth usage of Tor. * - .. image:: /_static/section/tutorials/riding_hood.png :target: tutorials/over_the_river.html - .. image:: /_static/label/over_the_river.png :target: tutorials/over_the_river.html `Hidden services `_ are a way of providing a service that isn't easily trackable. As a dissident, for instance, this could let you safely publish a blog without getting your door kicked down. Here we'll walk you through an example. * - .. image:: /_static/section/tutorials/mirror.png :target: tutorials/mirror_mirror_on_the_wall.html - .. image:: /_static/label/mirror_mirror_on_the_wall.png :target: tutorials/mirror_mirror_on_the_wall.html Getting and acting upon information about relays in the Tor network. Relay information is provided through documents called **descriptors**. This walks you through both where to get them and a small script to tell you the fastest Tor exits. * - .. image:: /_static/section/tutorials/windrose.png :target: tutorials/east_of_the_sun.html - .. image:: /_static/label/east_of_the_sun.png :target: tutorials/east_of_the_sun.html Stem provides several utility modules frequently useful for Tor controller applications. Here we introduce some of them. * - .. image:: /_static/section/tutorials/mad_hatter.png :target: tutorials/down_the_rabbit_hole.html - .. image:: /_static/label/down_the_rabbit_hole.png :target: tutorials/down_the_rabbit_hole.html Interactive interpreter for Tor that provides you with direct access to Tor's `control interface `_ via either python or direct requests. This is an easy way of experimenting with Stem and learning what Tor can do. * - .. image:: /_static/section/tutorials/cauldron.png :target: tutorials/double_double_toil_and_trouble.html - .. image:: /_static/label/double_double_toil_and_trouble.png :target: tutorials/double_double_toil_and_trouble.html Sometimes it's easiest to learn a library by seeing how it's used in the wild. This is a directory of scripts and applications that use Stem. stem-1.7.1/docs/roles.py0000664000175000017500000000522013237375570015653 0ustar atagaratagar00000000000000import re from docutils.utils import unescape from docutils.nodes import reference from docutils.parsers.rst.roles import set_classes def role_trac(name, rawtext, text, lineno, inliner, options={}, content=[]): """ Aliases :trac:`1234` to 'https://trac.torproject.org/1234'. :param name: the role name used in the document :param rawtext: the entire markup snippet, with role :param text: the text marked with the role :param lineno: the line number where rawtext appears in the input :param inliner: the inliner instance that called us :param options: directive options for customization :param content: the directive content for customization """ # checking if the number is valid try: ticket_num = int(text) if ticket_num <= 0: raise ValueError except ValueError: msg = inliner.reporter.error('Invalid trac ticket: %s' % text, line=lineno) prb = inliner.problematic(rawtext, rawtext, msg) return ([prb], [msg]) app = inliner.document.settings.env.app link_text = 'ticket %s' % unescape(str(ticket_num)) return ( [make_link_node(rawtext, app, 'trac_url', link_text, str(ticket_num), options)], [], ) def role_spec(name, rawtext, text, lineno, inliner, options={}, content=[]): """ Aliases :spec:`25b0d43` to 'https://gitweb.torproject.org/torspec.git/commit/?id=25b0d43'. """ # checking if the input is a valid short commit id if not re.match('^[0-9a-f]{7}$', text): msg = inliner.reporter.error('Spec tag expects a short commit id (seven hex characters): %s' % text, line=lineno) prb = inliner.problematic(rawtext, rawtext, msg) return ([prb], [msg]) app = inliner.document.settings.env.app return ( [make_link_node(rawtext, app, 'spec_url', 'spec', text, options)], [], ) def make_link_node(rawtext, app, url_type, link_text, slug, options): """ Creates a link to a trac ticket. :param rawtext: text being replaced with link node :param app: sphinx application context :param url_type: base for our url :param link_text: text for the link :param slug: ID of the thing to link to :param options: options dictionary passed to role func """ base_url = getattr(app.config, url_type, None) if not base_url: raise ValueError("'%s' isn't set in our config" % url_type) ref = base_url.format(slug = slug) set_classes(options) return reference(rawtext, link_text, refuri = ref, **options) def setup(app): """ Installs the plugin. :param app: sphinx application context """ app.add_role('trac', role_trac) app.add_config_value('trac_url', None, 'env') app.add_role('spec', role_spec) app.add_config_value('spec_url', None, 'env') stem-1.7.1/docs/_static/0000775000175000017500000000000013411004021015552 5ustar atagaratagar00000000000000stem-1.7.1/docs/_static/favicon.png0000664000175000017500000000174413157571677017754 0ustar atagaratagar00000000000000‰PNG  IHDR szzôsRGB®ÎébKGDÿÿÿ ½§“ pHYs¬¬!¼UWtIMEÝ4å…‡~dIDATXÃÅ×_ˆ”UÇñÏóθFæ¿MA7´?”T®  DYÁFi%ÎŽ’uHÑEÚ_uw#£ì¢.jí¢‚ºÉ‹ 5ŒC((rwK,3Œ\Ý÷t±“ÍŽ»9»îæ¹z_Ιó|ßçù=¿s¦`’GÖî­ÔªÏ^?8?Ù‰e‘¼g£©ç  Khq¢‰(™Ù ÁË8¨àøD×öye5´¸ÝÊQ÷9†Ù‘ìTvÿY2µÜ)ŸO<@2y$›µ)Œ¸fƒk„‹ìðëhÛÆ °Ôja:¸Ð—z6ÿˆY‘y '²V¦Vó,Ó«g¸Šã’‚Ìá,¹'çÃÓs›dÑçܬLˆ¡¬ý˜6Xn›þsÏÀ2G‚Çq­nð‰}֛혧°KèÎ’$\YýØ™sS÷ÿýŽÚ±Î"]u©üoÝáüáû|ÐÖ,”óSžðº?N¯kÓ¤ÙRE½¶úax"k_J¾RÊ”m÷EC›QpÒê,wk>àQoø«áv®«k/EîS%W7´ÃϦg^•›–W¬Kð3"9Šãˆ,ó@%X¹7ód‹Š—†œwŒ†6¬µ3ó1})¹oÔ_m4#Ú}”…›Ò|÷ªøv¼Z.֙˂êÓ1,ñ˜éÃÄ›v§¤;Ul>WK¯÷YÃÄÙäRì¯1— bªîÄnõÁ×j6ÅrWÈôËõâ+Žà0š‘Wß/«Ȧz11¨³&xÉͶá:ICÏô›%cÓ@x±úØ„þ,¹«Æ#'ÚR²æ´ØÊÖEø ×Wáa)Qò®±µá<]ÁV,ÆQœÔ®"óB„.}Õ#¶ISð¸Å SÅžÆ}äó»·HN(ØeÐ’§p¹‡”Üá$0Sh© ¹7q­ŠßÇPŸ¦’)ÌHÚ”¬‰Ð)‘ìLay5cÿ´òJÛu7~¦m´)D³þÄ3Y²8…µØ—Ø”±°f³Ž¼Óúqшãb+0GØ“‡}‰§…ãÁs5ÁO&žkð†2nÃ!öKöG¸[²§ð]ðl*ºJ§-“óÇ¢ìíh··®,Mêg¬NxæÕ/Y(êît ô÷Äi€…‘F¿TN.ÀÐm·…ó0W Šg”àȇÚ,ÏÏ@ªöù$fàoý|  8€IEND®B`‚stem-1.7.1/docs/_static/resources/0000775000175000017500000000000013411004021017564 5ustar atagaratagar00000000000000stem-1.7.1/docs/_static/resources/exit_map_alt.png0000664000175000017500000003071313157571677023005 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÞæ†tEXtCommentCreated with GIMPW IDATxÚíwœåýÇß3³}¯÷;8zïH“ H€hÔDÅüŒŠ°‹†X#Š ¨€bÈ`T@¥) p´kÀõ^¶·™y~,¬œ9àá{¯yÁíîÍÌÎóy¾½HBÁ:mI>óNo2´ä›ÛµkûöíÀív#Ë26›áÇc·Û[ôƒÝ¹s'7näšk®9ÃŽ•ºwïÎsÏ=ÇìÙ³9÷ÜséÖ­ëÖ­‹€â—¤ë:>Ÿ¯EÜ{AA·ß~ûp¼Ô·o_’’’HKK£gÏžÜrË-tèÐMÓ¨¯¯§²²’œœB¡7Ýt‹/Æï÷ãr¹p»Ý”––²oß> q¹\„B! ðûý‡å8ÅÅÅèºÎ¾}ûp¹\ø|>òòò"Ÿ¯««cûöíPÜn7‡ââbB¡¹¹¹´k×îŒÐ¤iÕÕÕäææ²~ýzæÏŸÕjå³Ï>cüøñ|ýõ×Üyç|öÙg,_¾›ÍFyy9cÇŽå_ÿúO=õåååüáÀçóa4yùå—1 ®3uêTêëë™1cS¦LáwÞaîܹ(ŠÂìÙ³ùñÇÉÉÉá‘GÁårqÕUW …¸üòËyüñÇ™9s&>Ÿ|`0ÈâÅ‹1 gÐTWWÇÎ;Ù°a%%%Œ=Y–¹òÊ+¹æškøá‡ˆŠŠ"333²ûú÷ïÏ /¼ÀÙgŸMïÞ½Y»v-N§“””E‰œ? òÜsÏ1tèPú÷ïÕjeøðáÔÔÔ`2™°Ûíx<FŽÉ Aƒxÿý÷1˜ÍfzôèÁ‹/¾HVV;wî¤gÏžLœ81ÂÎ(ÇA’$ѹsg.¹äŠ‹‹q»ÝH’áV«MÓBD^ˆ‰‰‰üÿ®»îâÕW_eÛ¶mL›6­Á5L&ùË_xýõ× Œ;¿ß9—$I!HOOç§Ÿ~bݺuÈrxï!"×Yµj v†©ªÚ`Q­V+Ÿþ9f³I’P%ò¯Ùl& FíàEèÕ«•••x<žÃZ àü#“'OføðᨪŠÛí °°›ÍÆSO=Enn.çž{.º®‡ ,G®Ó§O-Zá*§‚‹¥E`ÇŽ,_¾œõë×sï½÷rÇw0hÐ ZµjÅÂ… )--¥  €… ’““Ø1c˜}z˜S6á BJÂÚádÉ|Æ 8ÕHHN¶2qâÄþ¯ªj$ RÑi{Ðd«)“>/þ¦ÿ7/t]D¢ƒ¿F¡P›ÍFš\$ \{ÆaïÝ–ß:öYÁ’$QXXÎìÙ ¨uçb°hoˆ³"$ý NÙ…•%ŒFзoWÚ¶É`ì9·“¿ìRV~bFQtBÁ Bÿmƒà7+ *¹ï¾§•”!IŽz'Ï>s? õ—²ì‹7n•¥…X¬vÌ61±q€t-ªÊJP$‰´´8®»îÊFé6›…ë¯É`Á¥WÑ»]?vîÚÇØ d~¿W]-q ÉØJ3;#ZyÝ.Š÷æðy€,I˜Í¦_=l6+7^ÿ€—žÿ¯sr€­ÿÄê/v±vÝdYF–e„ÔVWPYV‚z ${žB „ TåÁ]U‡„LʰZ-,[ösæ|È߯¿‚‹/½]»ó™0ñ|Š•Ÿv5s_ÌíS¦QYY‰ÑhD’$>/UeŸŽÓ-1e@@  •lç.|‡&´Fݯ®ë<ó̸œ¾^1ŸÑçŸC]u5²"SZZÅ óogwùÎn}éU™påµlËÊŠè š¦Q_S…³®öô@KLuÒÐðj^jJˈ•b‘‘‘ˆ_UÕdYbÞ¼ÿrÎïòêk3AŠ JY¿a+}úöÀQï"!!†.ƒð}$Ø“—ù7nùû½äåïiPìᨫÁãrüöÐ"Ù¿¦ãw¸ H’ôó„þ?8€Õjáµ×?`Èà~Ü{ÿÍ€Ä'‹WPWï`̘ópÕ;éÔ¹-_³Ž¿NÃ_‹‚XKc;\à 7Þ‚×çmP/P[U‰×í<€I>¯‡Š¢BüNw£¹“$Iäç ™2õÐ5ž™9›±cFЧO8tß¾b„.P™g5Š9ìÐ…N¼=‘³b/àéYÏ5à’$QW]E08€£%]× ø}^ü^Oøðy ühšzØ¿ ø}ÔV–µÈ’$‰oWÿÀÃÓoÍË矯bÊ“0YÌ„‚!rs÷‘”OÖöF?‚?mC˜^TM×èšÒ—üÜ\n×!úˆ£¶†S1½ò¤ø>ng=ªBÛ”9ðð¬\F1( &¬v;öè˜rWèz£µýÈj¯ŽÚP[[OBB,Š¢àõxÙ¹#NÛe·Ñºµ›];v’K¾¡ ²øt¡#;íTVTѦMfƒóû½‚~&‹5BSCHŠƒAAQ g ©!*ËJÐÔÐ!^µƒw­:jHG …ðû<8jkHNË@6ð{<ÈG¨»;ÐuÙlBQdòó‹iß®5( ÿýï2®úËÅH’„Óé&#=…µë6Ó¶m:ß³çPÝ# àõy{ͪòÒÿe² lQ±ÄÆÅ#µ Ôó!®ú:uÕH’ÌѺTu]£¼¸Å`<ââÿšö¯†4$IÂãñÍò/Wsþès5"++›¤¤‚AÙ áõzÁø‹):F£éè..I蚎«¾g]5V{4ѱqX¬¶ß¾ i*•å%8êjö/þ±‘$ˇ$q )Š‚@§¼¼ŠÎ]ÚQRRA}½“”ôtV|õ=={u¦°°”´´$6oÎBü‚K!!ÇHLˆ?¶ï IȲBÀ祺¼ŒÊÒb4Mûí@×4ªËËTjÝ$¥±;^U#G(¢ÿ<0}q±Ñøý~W䌊¢K]—ËÍÞ=%ÈAkƒÅwêˆN5“’’Ü$ß"ðS^´€ÿäµµiVPSYN0àorGґΦë:­3Ûòå—_7€‹ÉddÏÞBV¬øžÔÔ$ ›~ÜÌ€Aƒ¨ªªYF:ùùEDEÙð©–ÈâëBçóÜy¼õÈlTµév­‚ªò’’Ó±œ„ÆWÍÆª+Ëñä49‘¤( ùyÙ”——QZúóQPPD«V1L½ûQ<^Õ5u¬^ýºêÅåò€¦!tAm]=U…â­)‘s~¸éUþñÄ=têØñT²¦`i5•åx=îþ¬š¥6ÐëvQW]yRíb£ÑtKQBên¼åî¼ã*¶nÝM—.í7ö÷Ì}ó#l6 ËW|ÇÎok¸¼ßõxC.¾*ü€›¦^ÍEcÇ4ëwR RÒ[¡Œ§.„T• ´<ϘK¸Y\Ë9–aÄÍÜy󨫫¢¦¦$¦†Ø²m7¥ûê9¯ãE˜“ ¦½Ä„?]NŸÞ½ 4ówB`‰%!)åÔ€ß祪´¸EÙº ¯úÞà ×LF[F1/öuB²Š×륦¶–` t!0)fttìQ6’“’"zʼn1™uZ·ëtž_“+Õ¥-nñÃbVÐVi‹$ɬ ¬ç‡Ð&úza6›ÉHOÿU…òKeª+ÊHNouê)¿¯Å&QêèŒ5ýt9‡p°CÝÙ"3ü$IÂïóœšV€ó8=ÍM&ÉÄ@ãP¬–¢Ó2ƒ7’$ãrÔŸ4¥  ª*-™:ÑRtXWÁ‡ åFieÛ,h*;= ¢Ÿd·æ‘ÛÕí¤È)È-8Bè'æY6Ùµðƈ22[CYìVs°Èº:ï÷ ´Pˆµ)šJÉÒB„Ý®-ã¡Jý Rª—ñ°ûQÜÂCWCgÎ6j´ƒáV´a–Ùèf³ù”î,Öd'`+(ÈÒôO‰¾½Ÿ[GÃ!œ”je”h¥ìÐv±=´ƒïCk)W+°ÉVžŠ~œX9† h\~ÿãO>…Ýn'-5•5ëÖÓ½[¢££ÙüÓî¼ýV:wêÔô@§škÑ ’ zY¡íê…i%Ôjµxñâ.üp蜺 —p¡#ЄJ• ¢£ƒ€®†Î¼÷ ”ö^|M×¹ù¦‘e‰^~™?^2žßŸ7œÔ”<o3)gÊé €r¹T+#KÝÁþE|ZƒGó6æÃ Á€E2+Å¥ØbÌE–±œoI@ŽZû¿zâUÄÄDïo\-c2™°X,œsΰHsɪêjBÁŠ"“š’Š¦k8œNYÆére·×h=Éh6bǯHH¨¨Ìt?Ëûþ¨Ñ~.¼ˆUbé¢t"QN$^Ž%FŠÁ(±bÅ(±K6Œ±JVl’•$9‰9™VJ6Ɇ*BøÅ±™V=ºw;lâF|\V«•·çÍ' Ò¥sg¾ÿ£G¤Oï^ÜsÿƒthßÇC‡öí¹ç®)‡4­:¼ ˆŽ?ÅкŸ‚ ÷cÌñ¾‚L%“‰Ö üÑr1ñrü~@Šø9˜s4Ädx·ùÄñ%\ü¯¬I’ÈËËç‡g»3 Y–IMMካ®fÅK±˜Í$$Ä3ãáé]oÜâ -*ê„)–MI’Ž:S÷—”¯ía©ÿ ‚»¢ïäûݨhEðˆlûd8uEaý?Óå"9)œhâõù0›ÍÄÇÅa6™Ž*¦’vêXnG=Á€Ÿ@àø=WåzåZ±J,÷ÛïÂ+Z¢·N:ç‚Ø˜‚Á Å%%ÄÆÆñññÇ8/H`±ÙNhÍ1ó!e…{©¯­Æëq£5Ø¥‡sôÚ)mP0´¸ÅW…`(ˆ¦…¿PHeܘ ÉÈÈà“ÅK0¸Ü.Ze¤“‘žÉGlü‚J|>ª+ËZ6?E{rš<£Õ"…“0ºs¿•ßBö¼$áóúxgáûd¶nÍÒÏ>gã¦Í Ë>û”í;w²àÝ…¼³ð=žŸõ4?nÚ„Ëí!7/Ÿ’ÒÒ£ÚÕ>·›ª²’âY=ê„¿ÏCuyó tKh—Ö]ŽFqJ>:zËá FŒF#º® …"@’$ŒF#^¯›ÍF(B’$Ìf3BèÇâ&˜ÌVR2Z· „ º¬´Ùn&QN MIEG°!ôcË Öˆp;¹ãgæ~B„ÛÑ †È°¨SLýþÀ1îd‰ ßGeiqË@yIa³ºúSädZÉá±këCP¤ScôZ3Êžp"Ÿ÷äÀU_ Òœˆ–£i«´`{ ÍØif&sXýÃQWÛl¢°qŸÇÕìæ‰‚®†.Th•¸t÷éµáÿÇëÁ€Ÿ`3 Ånü>ï i€ £ÓÍÐ ‰½†½–3ô³ŽqÒ øOˆI¢£ó;Sx(C±^B©^öÛßõ’„Åb9âgš«+™ÜøávÖŸï”@/Å1ÀØŸ®²[ÍþÍ ²ªŠ§Ÿ}îˆ;\ uš’ԤœÉdÆlnxè&‡ନþtµu=ä}³ÙŒÉtâ[¸›ŒFJJJ›4H#Ë2›6mæ¥Ù¯qÒø¯¦ÛÇæ<¢Ã:RiŽ|EQ˜9ëŸ8õ‡|…n"¥Òû|Æ¿ø;™({4Sïxช6Ì&²,£ª*«¿ßY³Ùî' >Ÿ£ÑÈ7«VóßO3ï­9ø¼>4M# FØ·¯ÕjÁçó£ëz8]L’dŸÏ‡“É97ÀÀh•‘HȲŒÅbAÓ4‚Á@Ã-I¡7yÚýàu;šü¢²,óÑÒ¡S{† zT.åM›6±zÕ T5ˆ, œÁ`yóß¡°¸ˆaC‡òä̧™rÇm\|ÑE„T•×Þ˜ÃÖmYØl6f<ô uõõ<öäS¸=nnºåvòòóéÛ§7ÿwÝ${ò_hªÆÃÞ¦éüãÑÇxøûÉÌlÍ /ÍÆårQZVÊ÷ÞKBBóO?Ũ‘¿'''‡×ÿ3›ó/G(¨Ò½[7:wìÄÇŸ,¦SÇŽx¼Ìf3Ý»wcìøK˜|ã \~Ùùü‹e 1’/–,æó/—QZZÆ?žN}}=º¦Gvø¶mYLøÓeŒ9’PèîcA³”ÜóЛZÿs»Ý¤¦%p˜9Î(Š‚Ùl!r]MÓQÕ &c,` *øIÆqHPE=ŠÔ¸ ƒÖ­Z‘ž–ÆàA°XÂ7’›ŸOAA!u'[¶mã¦oÀd4 …¿4 ¿ÏÏm·ÜÌÄk¯ã‘MYY[·e±fÝ:¦Þ~Û²²ØðãF–|ò155µŒüýÚf¶aë¶môìÞŒ¹ðx½^ÊË+°˜Íüeâ5Ü{÷4Î~îáB¹y”ð# 9Ì?]×9ë¬ó¸à‚‹ ;wnáõןáÚk¯=¤;œš­c4˜)>D¢q,UÁÿâÓòio›à(BÒ"œÃÖ#¤ˆ/-+cäˆáû‡K†ýÿû@TMeôÈß“’œÌ¼ïàñzø¿ë&ñîû KݯëÊ›6‡ã&UUØ£¢Ð4¶m3#qEQÐ4ígÑ'IŒ9‚žÁçK>Áz³Ð`lžžGä)a…¥yü^ÅÅÙTWSUUDUUee{ˆ‹³6P’~©ì&¦»É°]ƒRÿz1íOÕâh++Ërƒ¹ÂI‰‰þýêëá®5µÌyóm ¬È¹=Œ#¯—û>ö#Ï;«'þ…·çÏçÜs† …èÔ±#éé¼÷ÁGDGGc2™Ø»¯€!ƒ!IB‘„ƒAÁïó3uÊôëÛ‡GŸx£ÑØÀÚB`Š990˜›g^ž¢(„P Ð$ñW.É:݆åawR§­À*w õ.4á=j´rõjÖnØÀúõøü‹e|þå2ùÇÃ<ûâ‹ôì?€Û¦LeÜØ øÝÙCX·~÷<ð .—‹óGdÔïG™ÙšÄÄD&]ýW:wî„®ëDEÙ™÷æ,úäf=÷âÚë®g_AA’$a¶X›Çu¤|€`ÀGyqQ“Ú¿û ö°bå** cŒFúÓŸÊBa$d[ŽÏ¾I†y½c?DçØ\Ô³YQðûý(Š‚ÉdŠT™L&ª*«HLJŒÜƒÁ` ¾¾žø¸8TM O˜g"¼³z”’$a2™¨®©!>..Ò Õb±„KÀýaSÑh4`2™#×¶X,áºÁ`ÄÌ5[¬$¥e4‹3îˆ:€Élmr?€“&L˜ð«¦ÚÏJ›‚2²­D1@mi:¿ŽB‘[“PP0HJ$kXG ¡ê!Ñ4ÿAúÅÈ{~?±q± îAUUbbb”ú&òÂn m  &:ºAÕ´ïAPHÝïkÙov{½¿àz )©Íæ‰m”(ËÍ—4*À!|ûíFú舮” úmlŒ¡‹éçþÂûÖ„Ö±9´…=Ú^º“VJ:Œgq‘y fÉL@4ž[ÎÉt,ާãQ¢‚Ôô6ÍÚkøˆg–$ [t ^§NBË7I›ÕŠÏ"FêBÖOà©m°£kôúViȨ¤0ÈÞà-&³_Ë­¶›H‘“[t_€ƒÑÔ¼B‚–ÕjÇãt4™J’$,V3QQ¶FY ‰1œÕ¯/Få-yòAºŽ¨kð¾M²ÑÏØ¿ÐQé@Šœ„Y2S¯×³CÛEVps=oó…÷FMc¢õÊc®:qÀ—ð¸Ä%&|˜-Œ&S“MËòûƒÜwﳘL³0t]çëåóhÝÊŠ¬ñûŠ0KfĽ‰Œ„3FɈ„„††_(Ô ™æ¼¬Ð¦9ïck(‹§b% ‚-› œ€&€¬(˜Í6ÔPÓĤ-ÿzj*CüU Ë2N§‹+Öšš„? ##­kÖQYYI«V­Ñ4 ‰XéP;YAÁ.ÙèaèΗ Ÿò kó}ïò¦o‰r·ÛonÑM"ôƒ¡Ì˜1cF£Ä€ÝŽËY×$A]}-ù{w‘””D(:ì¡ë:K–|Êåßsí5—Ñ¥S;**k0*f”ÒLÞÿèCœz-gõë×èëþÁ|>fÙÌ·ïYZOk¹ƒL Ñ2ç ÑqqÍÚxë¨ÎœÖºí‰aK3g¾F(¨2ÿíYŒù; ‹Êð‚ ½°#± 6†µÏæEE\4þÏ„B¡#ú)‚ An´þFݦ¹îcMh†Ü&!l^pÅ@BJz³*>^¯éÓŸeô¨a¼øÒãDÇD±s{6IÉ ´j•BBr †ö•dýÒ‡1Àö†Ÿ3†ÝÙÙ²•‚ël×0Ò|S÷à'fô›$I(ŠrT‡ÔÌË1µŠu9ꨫªBVŽ5íÝ—Ï·k—2`@ÿ¯û|~æÎýˆ;n›Äè .Àí¬dõêèØ± ݺv ° §ÛÛéãåÛ¿§SJO$ ê½5¬¯[Êkóž#>6®¨—)Ð SûGÂÉTûíL±ßÖ¼²VQp¹,Yú1¯›Æö…DEGc³G‚É“ï>9Jà/):6‹ÕNEIa“ÞÌÆÛ¹z⥌õ;j*‹ùö»7ö÷˜Ì&õNÊÊ*IMO¦Sç6”©oÑ…Þ¨zˆhKé¢óÞ^È´©·±_¡ŽNGCž‰y’¿×ß³žù«õJRä”fñH’Äž½y¼ûÁ\ÆŒ¹ÄÄÄF‚Ff÷îlÞ}wC† >yVÀaoÎ`@èRy E&?¯€ûi`0ȪÕëÑ(LfšªR]S‡ªkXÌ&²³÷“bD×Ed#õÊÄ+¯Î`êÔ[u½ q™å>±,á3ÿ—LrÜÀ²ø%hhM‹ÅʽÓo£Cûö,X0ïbXtI‡±‚$*+«8°'™™áŠ)¿ZQŽE‘-'á;—›l‡ÔÖ†SÏ¢bÒ™?ïmƉÉj§º¢‚ʪºtnÑ` ¸¤œªÊZ’2ì¸ö9°[ÃI FÅH»ø.|õõJ.=êˆI–^áã¨{ø!´‰mÁí<ï}™iö;ŽÊeÜXJMMcæÌ—ÓGA¢¼¼·»ò08 ?> “IÝL•{5AµŽVq—PãYO¢ýì«ò OkSEeY¦¼¼Š®];àq”a³Z‰KLf׎]äæí£GÏ.Ìá0qFF*¯V™Ix®ˆ¯ ô˜¶ü´yÊQLk¯´ãJëŸ$‰yÞwš-]‘ hšNEEÅ‘£ºº„U«–ãõz1…ƒû-Ù "Ù·SP3ŸhsVåœGŒ¥Û‰·~±m1›ÎO­ª:Š"³yËNþxÉhÜŽZŠ‹Ë:l ¨*¯&7oš¦…ÓíDZýÞ¨˜øýG²ÐÑ™j»L¥5eZ9ÿö¾ÞlŠ Ùl£uë®dfv‹Q㯈ZARû½’Wo;‹U¹#ØvF%îä@’$¬6{“ô4ÕuV­RÈÉÙK·nغm7N§›Ý;¦R[]OyE5™­ÓÙµ+§ÓMiiUƒ(™„L•§”½º¡iÚ VÉÂ[±¯ ½°,°³Ô´µÁ`²²}TV"?rTUíC×/®4U¢ë jâZïç³µxÃ;}I”¹óÉW(‚Ç!<’u€’’pº<ÄÄD±eË.ÆA öÕ{¼^ÒÒ’ðû””Tàr¹)ØSJ›˜†QÁÝå?qñøç%ÿ8[PéjèÌtû}•‰†‚IDAT<æþ79ng˜i(ÑRt“)„n·“_|â°ûÅï÷Ó£G×C¹búÿ¾“5DHÕ×m;1Öž-à °XmÈŠrÔ]Âm6»wç“““ß@«p»,^üôbÍÚÍtíÚþÀ6¸F«ªjˆ‹!/¯ˆ‹Î‰' úÈ.ÏâÒ ã0ïÏ®9j.„`‚ír> |L¶šÃλy-öešÆÊ±GÙ™4éºÃÎ’$é×%IF3äa¶ªhºŽ¨œÐä‹ß$Àd2ã?Ê^¯—>}º1tè;Âétñ oóÖœQPPÂ[oÌÓÏ<ŒËíA–edY"RqÔ;é˜Ô]‚UÕEòV^¸åñ㪢M’y8ê&ÖObyàkæzçq«ýƦ‰ A0hdŒàí·>aüÕ`Q4Üéèå=Z– òÐR3(Ú—ƒtê„¢(|þÅW|óÍ÷‡Ê=MeÐÙ—ñÖÜ™œuVOšþÓ¦ü윽 @ù saæ hBÃpñéÞ×xæÙÇIMM=®r1 óÍ#y$ê!v=Ê#®'°IVþf»¶YLÃ_ó‰ôíÛ…¾íÎæ»ylÿ>…Þ=¤– $ˆM Ïn¤YØ®m>~oùaÓ¥Â!`3}³EœÇ[o/ÂíöPPXFή}$;áôÖRàÞ?¡’ùï¼F‡öšd¬[@˜l¿-¾…Üç|¯ð1ÉöW,XÐÐŽåQ[ëäûï75º ®¼¼ ¯g()µ±ú“'iÓÚÕKh’rüâ©ÉÆÆU•ïŸ{üH=ÔÉÎÉ¡ªªšÜül²³sPU+Dß®ýéÖ§É©‰tïÖ EQš|º—†Æ}®‡xÏû!Hpžé\þõ gáÝn§]ç8ÏBÊÈHå“_aÝŠl>_°…¡SøÇC/ý¬³øýÈKË@( ª¼¤YƬ(ä8XFžˆ†VÉÊ,÷ <éy:òÚóÜl¿‘>†^ûíè#s=«ÕÆÿÝôg¦L¹õˆVdYfëÖÝü´y'ÿžýO²¶å2ó†åäkëÙ¸}ãÏK••(ññÈÇY1Ô脃©²²’²²²ý_ÎQf3e¥%”•–a2™(((Àn·Eª`$I¢º¦†²²r’’#‹èr¹ÈËßCJr2EÅÅø|>bbb,òEõAŠŠKPÕöãÈ"Äpó9 2¤R¯¢P+"WÍg¡÷øßc{h%z NáÂ-<èèX0%Û1H áÍ`4Y¼ä† H(¤6ø.EQ(-­àþÀãö1ç')*.§U«¶oÍ'ÖÕ™'f>FT²‰.]º`Ž=y" 0yòdªªªX¸p!QQQ‘÷zõêI·.]˜ùäãÌ|æ9&]{5­[eD”¿O>]œ¹o±ü‹¥x½ááÒ›Úµÿw=ù»wrómwйs'n»yò1Ët Àõ7Læ’K.bâ•Ww áe—º›eÁ¯øÈ÷ åjyDÚÉ’LŒCŒM´MŠ’Lg¥Sl·-Gc±ZùÛâÎ;oŽø6šÅV¬XÃW_­åÙ§`è°¸.ŠŠË …T|N•ùÓ·mŠ'§f5Qy|²ä¿ÄÅ¿7ð˜ùfDOçw¦³1Kf¼ÂK©VÆ.u7+«yÍ=‡h9ºq‰?^ΪU?²ní"†; -¤²-+‡˜è(B¡ ½úuÀÖуQ1Ñ;uÝôátîØ…ªªª“gX,®½öZyä/^ ÀŠ+˜0aÛ·oÇÓ?Æ…œO¯Ýùbùrt]PPP€Á`Äl2ñÕ×ßPïpàv»6—#fwvÅ%%ìܵ‹óÎ=—¾}zGädvv‹—.%1!U Ñ«g ‹()-åÁ{ïÙ" MÓ™ûÖÛtîԉܼ<®½ú¯|øÑ"ÊÊ+¸ã¶[(((dçîÝŒsa£2Štt"@¥·ØoàNû-€D±VÂn-›<5ŸÝZÕZ5fÉü«éç’$±k×êëœ|÷Ý kädï!;g/ç @ß>ÝYÿÃÒ:Ù¨- 8#¦ Wô¸«¯œÄG‹ßoÀOh,àŠ+®`õêÕìÞ½›•+W2iÒ¤H+”˜˜6oÙŠÁl¥ ´‚ÿ»˜ñãÆÐ«gt¡SX\Ì /Ïæ’ñ1dð ðâëá’ípJ·ÌÛï,ÄåtRQQÉ#?‰ò…3e¢øfåjÎ~. ±ôó/ˆ‰á•¿ÆÊÕßFLRÇCaQãÇeÓO?QYUÅàÁƒøiëVt]GÓuâãºôê@ʹK¸q qr,CC¸ÖúWžˆú'/Å>{ÄÚ³ÙÄÒ¥+yòñ»‰U«Öãõù¹hÜï‰OˆÃáp±go™­Òi×5™¢º\dIAÕUm©(åñ|¹ìË“ èÙ³'ãÇçæ›oÆápбcÇ;V…ØØX,V+K–.¥O¿þ$¥gÒ¥[عióÒÓ3°X­‘ stö˜Xbâpº½$&&rÙå—óà}÷ðî¼·°í¸ØXâãhÛ&“Üü|FɈó†³+ë'Î~îþ¦J‚ØØXn¾ñF^þ÷«—ðèÐ>œ[°{w6?nÜDß¾}Žßч@GGEEC;b¢©¢(lþi]»´'½u¶þ´ “ÉH¿³z#I5Õµ„T}ûJ0›Môëß•²Ð^äý9A»¸®,xõ½“¿ßÛíæ™gžaåÊ•E4÷ƒËš%I"))‰uëÖ…E‡Í†Á`¤c—®lÙº•˜„dZµí9¯ÑhDQ¢¢¢X³f Ñq‰¤¥¥³uë¶»Ô`0 É2’$ËÆM›INN&¤ªìÝ·Y ×þçäærýM“™vçídffb4†;~ÿmÒµ<ôÏG"ÌN4)ŠÂ¦M;¸âÏ㨫.¡  Œß3Œ€×Kn^N§›Ä„8úõíNAa)Žz7µÁÒ×äètÖ¬^â——Ç+¯¼Â‚ HMMeÚ´iŒ3†ÜÜ\Þ|óM¾úê+>ýôSV¬XÁŠ+¸á†p»Ý\tÑEÌ™3‡úúzÒÓÓéÝ»7ƒæÉ'ŸDQ–.]Ê÷ßÏ’%KˆŠŠâ /¤]»¶üaÜxüiòF£_ÚµëØðÃüßu×òÉ’% úÝ9<ñ¯™H’Ć~dåªUøýöí+à†É·àt8øÇ£¡jç…Ãá7† žø !Y–¨(¯¢]ûVlËÊæ‚ó‡¡ݬY³‰ä¤xÚwjÉ}0 èº@…,Ф`3GQ]]}òA!UU¥¢iòþü¿#õÕ•xÜ®Àd2Ð5 Å`ÀçóEpû¶eߺdMd ´ßZ˜õü‹ücú‡”l7¹CÉj;Ä ´XÌ<úÈ˼ýæÓì+(aÈà¾TTTápºéÙ£3B¶ee£i*™­3X»~3wÜú/þÞçZø~Љÿ¬zŒœªmÇìï8¡ ù7GGQ”_UÀˆ‘¸ÄÌfKªªâõz##]UUâ@¿@ nrᦺŽ$ËÌyëmî¼ën®ÿÛ¤H¿¦ÐŽf/éºN›¶lÚ¼=< M–(..§mÛV—#tAQQ9B K1L\šTÈFŽËÙuÊ ½•d‰Ä´ ÌËÿ|Ðy]Ó4.;†»§N!!>¾É\Ê‹ «ÕQ‚·àáN§&Ìf²¬0~ü(žž5‡þý{°rÕúŸ—V’(¯¨¦mÛVX,f ‹Ê(/¯$9&£A½`…³˜‹'Œ;ÉÑÀ*7e’ÒZQS^F pll[AzZÓŽe3™Í$§·Šü%è÷…iI`4™HOoÍSO½Ð J–%$Iç§-;©¨¨¥Gx²³÷0``êë˜LFE¦²²ššÚzâÉ@ðs¬eOýùÛݧ€ 9½Žºj\õõ ¼‰å’$OL|Bƒ×cñ;À¶m›¹ð ­H’DBBwÜ9ƒ¥Kæ²hÑ2dYfÀ þDÙmTUÕRPPJFF »vía`â4¡b6Xù±x%ýÇwbÈà!-#x2(P]Y†ºHÓ‰"!£‘äôÖžXYY~Ø{”$‰ŠŠJ&N¼‚»¦^HøýA.?’üüB>ûb%~õŸïetÛ+B°dûëÉ^û÷É µ4r9ëqÕ×unâ1Ùï±ñ Øš¡oßí·ÝJ}}9:…åt¹))ªàÛ•›‘y9º¬²WßÊwßÊŸÿôçHw²Óv¥×íÂïõàóºº8îÞºBµ’,c·Gc¶Z±GE7k¯¤ââbÖ®]ƒÓé@U54†&lõ›À/-àóਫ%€$Ezú5æïÖìcâ1š,‡$¥LŸ}öÕÕÕ f ¦¤¤p饗öóÏ=÷W]u©©©Ç ’O?ý”sÏ=—Þ½{Ÿ^J`c3I’°Ú£±ÚÃáØP0ˆ×ãB †Ð´ðü!~¡:Ê2Š"c2™±GÇUéûèÑ£ÉÌÌäÝwߥOŸ>TWWóØcýOh PSSi'ÛXJKKcÖ¬Y´oßþ¸€8CÇM~¿_ :TìÞ½;ò{ii©PUUlÚ´IlܸQÔÖÖŠï¾ûN„B!Q__/<ÈÊÊC‡Ÿ}ö™Ð4­Á9KJJDnn®Ø±c‡Bˆœœ±xñbáõz…BŒ5J|ñÅB×u±råJ±mÛ6!„ëÖ­7n>ŸOÔÕՉ͛7‹`0ø?ï]æ 5™èÙ¸q#6l`ÆŒƒAE!77—o¼«ÕJvv6;wîdÈ!deeÑ£GòóóéÑ£GÿÀòåË8p sæÌáùçŸ'//ììl’““9rdıäóù¸à‚ 6l .d×®]!¸çž{"&óúõëµÿ²áÌÒ59Njkkq:‘×®¸â æÎË„ X´hF£‘Þ½{ ‘eƒÁpHj×\@ZZS¦L!%%…»îº‹ôôtZ·7¦®¬ü¹”|Ê”)ÔÕÕ¡ª*%%%Œ1»ÝNqq1~¿ŸN:^:Àɤ#Fн{wÎ;着’˜˜È Aƒ˜4iÒéç8Ý©¶¶–‚‚öîÝËe—]vúùNwš>}:_}õkÖ¬9==§»)z´±3:ÀoÌ z´ôÿµ$†c†œ*¯IEND®B`‚stem-1.7.1/docs/_static/example/0000775000175000017500000000000013411004021017205 5ustar atagaratagar00000000000000stem-1.7.1/docs/_static/example/get_hidden_service_descriptor.py0000664000175000017500000000041713237375570025663 0ustar atagaratagar00000000000000from stem.control import Controller with Controller.from_port(port = 9051) as controller: controller.authenticate() # descriptor of duck-duck-go's hidden service (http://3g2upl4pq6kufc4m.onion) print(controller.get_hidden_service_descriptor('3g2upl4pq6kufc4m')) stem-1.7.1/docs/_static/example/descriptor_from_tor_control_socket.py0000664000175000017500000000035613237375570027012 0ustar atagaratagar00000000000000from stem.control import Controller with Controller.from_port(port = 9051) as controller: controller.authenticate() for desc in controller.get_network_statuses(): print("found relay %s (%s)" % (desc.nickname, desc.fingerprint)) stem-1.7.1/docs/_static/example/utilities.py0000664000175000017500000000173213237375570021627 0ustar atagaratagar00000000000000import sys from stem.util.connection import get_connections, system_resolvers from stem.util.system import pid_by_name resolvers = system_resolvers() if not resolvers: print("Stem doesn't support any connection resolvers on our platform.") sys.exit(1) picked_resolver = resolvers[0] # lets just opt for the first print("Our platform supports connection resolution via: %s (picked %s)" % (', '.join(resolvers), picked_resolver)) tor_pids = pid_by_name('tor', multiple = True) if not tor_pids: print("Unable to get tor's pid. Is it running?") sys.exit(1) elif len(tor_pids) > 1: print("You're running %i instances of tor, picking the one with pid %i" % (len(tor_pids), tor_pids[0])) else: print("Tor is running with pid %i" % tor_pids[0]) print("\nConnections:\n") for conn in get_connections(picked_resolver, process_pid = tor_pids[0], process_name = 'tor'): print(" %s:%s => %s:%s" % (conn.local_address, conn.local_port, conn.remote_address, conn.remote_port)) stem-1.7.1/docs/_static/example/descriptor_from_tor_data_directory.py0000664000175000017500000000025113237375570026751 0ustar atagaratagar00000000000000from stem.descriptor import parse_file for desc in parse_file('/home/atagar/.tor/cached-consensus'): print('found relay %s (%s)' % (desc.nickname, desc.fingerprint)) stem-1.7.1/docs/_static/example/benchmark_server_descriptor_stem.py0000664000175000017500000000136213237375570026421 0ustar atagaratagar00000000000000import time import stem.descriptor def measure_average_advertised_bandwidth(path): start_time = time.time() total_bw, count = 0, 0 for desc in stem.descriptor.parse_file(path): total_bw += min(desc.average_bandwidth, desc.burst_bandwidth, desc.observed_bandwidth) count += 1 runtime = time.time() - start_time print("Finished measure_average_advertised_bandwidth('%s')" % path) print(' Total time: %i seconds' % runtime) print(' Processed server descriptors: %i' % count) print(' Average advertised bandwidth: %i' % (total_bw / count)) print(' Time per server descriptor: %0.5f seconds' % (runtime / count)) print('') if __name__ == '__main__': measure_average_advertised_bandwidth('server-descriptors-2015-11.tar') stem-1.7.1/docs/_static/example/introduction_points.py0000664000175000017500000000063613237375570023733 0ustar atagaratagar00000000000000from stem.control import Controller with Controller.from_port(port = 9051) as controller: controller.authenticate() desc = controller.get_hidden_service_descriptor('3g2upl4pq6kufc4m') print("DuckDuckGo's introduction points are...\n") for introduction_point in desc.introduction_points(): print(' %s:%s => %s' % (introduction_point.address, introduction_point.port, introduction_point.identifier)) stem-1.7.1/docs/_static/example/exit_used.py0000664000175000017500000000211613237375570021602 0ustar atagaratagar00000000000000import functools from stem import StreamStatus from stem.control import EventType, Controller def main(): print("Tracking requests for tor exits. Press 'enter' to end.") print("") with Controller.from_port() as controller: controller.authenticate() stream_listener = functools.partial(stream_event, controller) controller.add_event_listener(stream_listener, EventType.STREAM) raw_input() # wait for user to press enter def stream_event(controller, event): if event.status == StreamStatus.SUCCEEDED and event.circ_id: circ = controller.get_circuit(event.circ_id) exit_fingerprint = circ.path[-1][0] exit_relay = controller.get_network_status(exit_fingerprint) print("Exit relay for our connection to %s" % (event.target)) print(" address: %s:%i" % (exit_relay.address, exit_relay.or_port)) print(" fingerprint: %s" % exit_relay.fingerprint) print(" nickname: %s" % exit_relay.nickname) print(" locale: %s" % controller.get_info("ip-to-country/%s" % exit_relay.address, 'unknown')) print("") if __name__ == '__main__': main() stem-1.7.1/docs/_static/example/descriptor_from_orport.py0000664000175000017500000000067713344455504024424 0ustar atagaratagar00000000000000import stem.descriptor.remote # Unlike the above example, this one downloads specifically through the # ORPort of moria1 (long time tor directory authority). try: consensus = stem.descriptor.remote.get_consensus( endpoints = (stem.ORPort('128.31.0.34', 9101),) ) for desc in consensus: print("found relay %s (%s)" % (desc.nickname, desc.fingerprint)) except Exception as exc: print("Unable to retrieve the consensus: %s" % exc) stem-1.7.1/docs/_static/example/event_listening.py0000664000175000017500000001224613237375570023013 0ustar atagaratagar00000000000000import curses import functools from stem.control import EventType, Controller from stem.util import str_tools # colors that curses can handle COLOR_LIST = { "red": curses.COLOR_RED, "green": curses.COLOR_GREEN, "yellow": curses.COLOR_YELLOW, "blue": curses.COLOR_BLUE, "cyan": curses.COLOR_CYAN, "magenta": curses.COLOR_MAGENTA, "black": curses.COLOR_BLACK, "white": curses.COLOR_WHITE, } GRAPH_WIDTH = 40 GRAPH_HEIGHT = 8 DOWNLOAD_COLOR = "green" UPLOAD_COLOR = "blue" def main(): with Controller.from_port(port = 9051) as controller: controller.authenticate() try: # This makes curses initialize and call draw_bandwidth_graph() with a # reference to the screen, followed by additional arguments (in this # case just the controller). curses.wrapper(draw_bandwidth_graph, controller) except KeyboardInterrupt: pass # the user hit ctrl+c def draw_bandwidth_graph(stdscr, controller): window = Window(stdscr) # (downloaded, uploaded) tuples for the last 40 seconds bandwidth_rates = [(0, 0)] * GRAPH_WIDTH # Making a partial that wraps the window and bandwidth_rates with a function # for Tor to call when it gets a BW event. This causes the 'window' and # 'bandwidth_rates' to be provided as the first two arguments whenever # 'bw_event_handler()' is called. bw_event_handler = functools.partial(_handle_bandwidth_event, window, bandwidth_rates) # Registering this listener with Tor. Tor reports a BW event each second. controller.add_event_listener(bw_event_handler, EventType.BW) # Pause the main thread until the user hits any key... and no, don't you dare # ask where the 'any' key is. :P stdscr.getch() def _handle_bandwidth_event(window, bandwidth_rates, event): # callback for when tor provides us with a BW event bandwidth_rates.insert(0, (event.read, event.written)) bandwidth_rates = bandwidth_rates[:GRAPH_WIDTH] # truncate old values _render_graph(window, bandwidth_rates) def _render_graph(window, bandwidth_rates): window.erase() download_rates = [entry[0] for entry in bandwidth_rates] upload_rates = [entry[1] for entry in bandwidth_rates] # show the latest values at the top label = "Downloaded (%s/s):" % str_tools.size_label(download_rates[0], 1) window.addstr(0, 1, label, DOWNLOAD_COLOR, curses.A_BOLD) label = "Uploaded (%s/s):" % str_tools.size_label(upload_rates[0], 1) window.addstr(0, GRAPH_WIDTH + 7, label, UPLOAD_COLOR, curses.A_BOLD) # draw the graph bounds in KB max_download_rate = max(download_rates) max_upload_rate = max(upload_rates) window.addstr(1, 1, "%4i" % (max_download_rate / 1024), DOWNLOAD_COLOR) window.addstr(GRAPH_HEIGHT, 1, " 0", DOWNLOAD_COLOR) window.addstr(1, GRAPH_WIDTH + 7, "%4i" % (max_upload_rate / 1024), UPLOAD_COLOR) window.addstr(GRAPH_HEIGHT, GRAPH_WIDTH + 7, " 0", UPLOAD_COLOR) # draw the graph for col in range(GRAPH_WIDTH): col_height = GRAPH_HEIGHT * download_rates[col] / max(max_download_rate, 1) for row in range(col_height): window.addstr(GRAPH_HEIGHT - row, col + 6, " ", DOWNLOAD_COLOR, curses.A_STANDOUT) col_height = GRAPH_HEIGHT * upload_rates[col] / max(max_upload_rate, 1) for row in range(col_height): window.addstr(GRAPH_HEIGHT - row, col + GRAPH_WIDTH + 12, " ", UPLOAD_COLOR, curses.A_STANDOUT) window.refresh() class Window(object): """ Simple wrapper for the curses standard screen object. """ def __init__(self, stdscr): self._stdscr = stdscr # Mappings of names to the curses color attribute. Initially these all # reference black text, but if the terminal can handle color then # they're set with that foreground color. self._colors = dict([(color, 0) for color in COLOR_LIST]) # allows for background transparency try: curses.use_default_colors() except curses.error: pass # makes the cursor invisible try: curses.curs_set(0) except curses.error: pass # initializes colors if the terminal can handle them try: if curses.has_colors(): color_pair = 1 for name, foreground in COLOR_LIST.items(): background = -1 # allows for default (possibly transparent) background curses.init_pair(color_pair, foreground, background) self._colors[name] = curses.color_pair(color_pair) color_pair += 1 except curses.error: pass def addstr(self, y, x, msg, color = None, attr = curses.A_NORMAL): # Curses throws an error if we try to draw a message that spans out of the # window's bounds (... seriously?), so doing our best to avoid that. if color is not None: if color not in self._colors: recognized_colors = ", ".join(self._colors.keys()) raise ValueError("The '%s' color isn't recognized: %s" % (color, recognized_colors)) attr |= self._colors[color] max_y, max_x = self._stdscr.getmaxyx() if max_x > x and max_y > y: try: self._stdscr.addstr(y, x, msg[:max_x - x], attr) except: pass # maybe an edge case while resizing the window def erase(self): self._stdscr.erase() def refresh(self): self._stdscr.refresh() if __name__ == '__main__': main() stem-1.7.1/docs/_static/example/hello_world.py0000664000175000017500000000055113237375570022124 0ustar atagaratagar00000000000000from stem.control import Controller with Controller.from_port(port = 9051) as controller: controller.authenticate() # provide the password here if you set one bytes_read = controller.get_info("traffic/read") bytes_written = controller.get_info("traffic/written") print("My Tor relay has read %s bytes and written %s." % (bytes_read, bytes_written)) stem-1.7.1/docs/_static/example/benchmark_stem.py0000664000175000017500000000565713237375570022610 0ustar atagaratagar00000000000000import time import stem.descriptor def measure_average_advertised_bandwidth(path): start_time = time.time() total_bw, count = 0, 0 for desc in stem.descriptor.parse_file(path): total_bw += min(desc.average_bandwidth, desc.burst_bandwidth, desc.observed_bandwidth) count += 1 runtime = time.time() - start_time print("Finished measure_average_advertised_bandwidth('%s')" % path) print(' Total time: %i seconds' % runtime) print(' Processed server descriptors: %i' % count) print(' Average advertised bandwidth: %i' % (total_bw / count)) print(' Time per server descriptor: %0.5f seconds' % (runtime / count)) print('') def measure_countries_v3_requests(path): start_time = time.time() countries, count = set(), 0 for desc in stem.descriptor.parse_file(path): if desc.dir_v3_responses: countries.update(desc.dir_v3_responses.keys()) count += 1 runtime = time.time() - start_time print("Finished measure_countries_v3_requests('%s')" % path) print(' Total time: %i seconds' % runtime) print(' Processed extrainfo descriptors: %i' % count) print(' Number of countries: %i' % len(countries)) print(' Time per extrainfo descriptor: %0.5f seconds' % (runtime / count)) print('') def measure_average_relays_exit(path): start_time = time.time() total_relays, exits, consensuses = 0, 0, 0 for consensus in stem.descriptor.parse_file(path, document_handler = stem.descriptor.DocumentHandler.DOCUMENT): for desc in consensus.routers.values(): if 'Exit' in desc.flags: exits += 1 total_relays += 1 consensuses += 1 runtime = time.time() - start_time print("Finished measure_average_relays_exit('%s')" % path) print(' Total time: %i seconds' % runtime) print(' Processed %i consensuses with %i router status entries' % (consensuses, total_relays)) print(' Total exits: %i (%0.2f%%)' % (exits, float(exits) / total_relays)) print(' Time per consensus: %0.5f seconds' % (runtime / consensuses)) print('') def measure_fraction_relays_exit_80_microdescriptors(path): start_time = time.time() exits, count = 0, 0 for desc in stem.descriptor.parse_file(path): if desc.exit_policy.can_exit_to(port = 80): exits += 1 count += 1 runtime = time.time() - start_time print("Finished measure_fraction_relays_exit_80_microdescriptors('%s')" % path) print(' Total time: %i seconds' % runtime) print(' Processed microdescriptors: %i' % count) print(' Total exits to port 80: %i (%0.2f%%)' % (exits, float(exits) / count)) print(' Time per microdescriptor: %0.5f seconds' % (runtime / count)) print('') measure_average_advertised_bandwidth('/home/atagar/Desktop/server-descriptors-2015-11.tar') measure_countries_v3_requests('/home/atagar/Desktop/extra-infos-2015-11.tar') measure_average_relays_exit('/home/atagar/Desktop/consensuses-2015-11.tar') measure_fraction_relays_exit_80_microdescriptors('/home/atagar/Desktop/microdescs-2015-11.tar') stem-1.7.1/docs/_static/example/client_usage_using_socksipy.py0000664000175000017500000000113713237375570025406 0ustar atagaratagar00000000000000import socks # SocksiPy module import socket import urllib SOCKS_PORT = 7000 # Set socks proxy and wrap the urllib module socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', SOCKS_PORT) socket.socket = socks.socksocket # Perform DNS resolution through the socket def getaddrinfo(*args): return [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (args[0], args[1]))] socket.getaddrinfo = getaddrinfo def query(url): """ Uses urllib to fetch a site using SocksiPy for Tor over the SOCKS_PORT. """ try: return urllib.urlopen(url).read() except: return "Unable to reach %s" % url stem-1.7.1/docs/_static/example/relay_connections.py0000775000175000017500000000763613341034346023333 0ustar atagaratagar00000000000000import argparse import collections import time import stem.connection import stem.util.system import stem.util.str_tools from stem.control import Listener from stem.util.connection import get_connections, port_usage, is_valid_ipv4_address HEADER_LINE = " {version} uptime: {uptime} flags: {flags}\n" DIV = '+%s+%s+%s+' % ('-' * 30, '-' * 6, '-' * 6) COLUMN = '| %-28s | %4s | %4s |' INBOUND_ORPORT = 'Inbound to our ORPort' INBOUND_DIRPORT = 'Inbound to our DirPort' INBOUND_CONTROLPORT = 'Inbound to our ControlPort' OUTBOUND_ORPORT = 'Outbound to a relay' OUTBOUND_EXIT = 'Outbound exit traffic' OUTBOUND_UNKNOWN = 'Outbound uncategorized' def main(): parser = argparse.ArgumentParser() parser.add_argument("--ctrlport", help="default: 9051 or 9151") parser.add_argument("--resolver", help="default: autodetected") args = parser.parse_args() control_port = int(args.ctrlport) if args.ctrlport else 'default' controller = stem.connection.connect(control_port = ('127.0.0.1', control_port)) if not controller: return desc = controller.get_network_status(default = None) pid = controller.get_pid() print(HEADER_LINE.format( version = str(controller.get_version()).split()[0], uptime = stem.util.str_tools.short_time_label(time.time() - stem.util.system.start_time(pid)), flags = ', '.join(desc.flags if desc else ['none']), )) policy = controller.get_exit_policy() relays = {} # address => [orports...] for desc in controller.get_network_statuses(): relays.setdefault(desc.address, []).append(desc.or_port) # categorize our connections categories = collections.OrderedDict(( (INBOUND_ORPORT, []), (INBOUND_DIRPORT, []), (INBOUND_CONTROLPORT, []), (OUTBOUND_ORPORT, []), (OUTBOUND_EXIT, []), (OUTBOUND_UNKNOWN, []), )) exit_connections = {} # port => [connections] for conn in get_connections(resolver = args.resolver, process_pid = pid): if conn.protocol == 'udp': continue if conn.local_port in controller.get_ports(Listener.OR, []): categories[INBOUND_ORPORT].append(conn) elif conn.local_port in controller.get_ports(Listener.DIR, []): categories[INBOUND_DIRPORT].append(conn) elif conn.local_port in controller.get_ports(Listener.CONTROL, []): categories[INBOUND_CONTROLPORT].append(conn) elif conn.remote_port in relays.get(conn.remote_address, []): categories[OUTBOUND_ORPORT].append(conn) elif policy.can_exit_to(conn.remote_address, conn.remote_port): categories[OUTBOUND_EXIT].append(conn) exit_connections.setdefault(conn.remote_port, []).append(conn) else: categories[OUTBOUND_UNKNOWN].append(conn) print(DIV) print(COLUMN % ('Type', 'IPv4', 'IPv6')) print(DIV) total_ipv4, total_ipv6 = 0, 0 for label, connections in categories.items(): if len(connections) == 0: continue ipv4_count = len([conn for conn in connections if is_valid_ipv4_address(conn.remote_address)]) ipv6_count = len(connections) - ipv4_count total_ipv4, total_ipv6 = total_ipv4 + ipv4_count, total_ipv6 + ipv6_count print(COLUMN % (label, ipv4_count, ipv6_count)) print(DIV) print(COLUMN % ('Total', total_ipv4, total_ipv6)) print(DIV) print('') if exit_connections: print(DIV) print(COLUMN % ('Exit Port', 'IPv4', 'IPv6')) print(DIV) total_ipv4, total_ipv6 = 0, 0 for port in sorted(exit_connections): connections = exit_connections[port] ipv4_count = len([conn for conn in connections if is_valid_ipv4_address(conn.remote_address)]) ipv6_count = len(connections) - ipv4_count total_ipv4, total_ipv6 = total_ipv4 + ipv4_count, total_ipv6 + ipv6_count usage = port_usage(port) label = '%s (%s)' % (port, usage) if usage else port print(COLUMN % (label, ipv4_count, ipv6_count)) print(DIV) print(COLUMN % ('Total', total_ipv4, total_ipv6)) print(DIV) print('') if __name__ == '__main__': main() stem-1.7.1/docs/_static/example/persisting_a_consensus_with_parse_file.py0000664000175000017500000000050013237375570027617 0ustar atagaratagar00000000000000from stem.descriptor import DocumentHandler, parse_file consensus = next(parse_file( '/tmp/descriptor_dump', descriptor_type = 'network-status-consensus-3 1.0', document_handler = DocumentHandler.DOCUMENT, )) for fingerprint, relay in consensus.routers.items(): print("%s: %s" % (fingerprint, relay.nickname)) stem-1.7.1/docs/_static/example/running_hidden_service.py0000664000175000017500000000276313237375570024334 0ustar atagaratagar00000000000000import os import shutil from stem.control import Controller from flask import Flask app = Flask(__name__) @app.route('/') def index(): return "

Hi Grandma!

" print(' * Connecting to tor') with Controller.from_port() as controller: controller.authenticate() # All hidden services have a directory on disk. Lets put ours in tor's data # directory. hidden_service_dir = os.path.join(controller.get_conf('DataDirectory', '/tmp'), 'hello_world') # Create a hidden service where visitors of port 80 get redirected to local # port 5000 (this is where Flask runs by default). print(" * Creating our hidden service in %s" % hidden_service_dir) result = controller.create_hidden_service(hidden_service_dir, 80, target_port = 5000) # The hostname is only available when we can read the hidden service # directory. This requires us to be running with the same user as tor. if result.hostname: print(" * Our service is available at %s, press ctrl+c to quit" % result.hostname) else: print(" * Unable to determine our service's hostname, probably due to being unable to read the hidden service directory") try: app.run() finally: # Shut down the hidden service and clean it off disk. Note that you *don't* # want to delete the hidden service directory if you'd like to have this # same *.onion address in the future. print(" * Shutting down our hidden service") controller.remove_hidden_service(hidden_service_dir) shutil.rmtree(hidden_service_dir) stem-1.7.1/docs/_static/example/create_descriptor_content.py0000664000175000017500000000020313237375570025037 0ustar atagaratagar00000000000000from stem.descriptor.server_descriptor import RelayDescriptor print(RelayDescriptor.content({'router': 'demo 127.0.0.1 80 0 0'})) stem-1.7.1/docs/_static/example/persisting_a_consensus.py0000664000175000017500000000051013237375570024374 0ustar atagaratagar00000000000000from stem.descriptor import DocumentHandler from stem.descriptor.remote import DescriptorDownloader downloader = DescriptorDownloader() consensus = downloader.get_consensus(document_handler = DocumentHandler.DOCUMENT).run()[0] with open('/tmp/descriptor_dump', 'w') as descriptor_file: descriptor_file.write(str(consensus)) stem-1.7.1/docs/_static/example/benchmark_server_descriptor_zoossh.go0000664000175000017500000000241113157571677026756 0ustar atagaratagar00000000000000package main import ( "fmt" "os" "path/filepath" "time" "git.torproject.org/user/phw/zoossh.git" ) var processedDescs int64 = 0 var totalBw uint64 = 0 func Min(a uint64, b uint64, c uint64) uint64 { min := a if b < min { min = b } if c < min { min = c } return min } func ProcessDescriptors(path string, info os.FileInfo, err error) error { if _, err := os.Stat(path); err != nil { return err } if info.IsDir() { return nil } consensus, err := zoossh.ParseDescriptorFile(path) if err != nil { return err } if (processedDescs % 100) == 0 { fmt.Printf(".") } for _, getDesc := range consensus.RouterDescriptors { desc := getDesc() totalBw += Min(desc.BandwidthAvg, desc.BandwidthBurst, desc.BandwidthObs) processedDescs++ } return nil } func main() { before = time.Now() filepath.Walk("server-descriptors-2015-11", ProcessDescriptors) fmt.Println() after = time.Now() duration = after.Sub(before) fmt.Println("Total time for descriptors:", duration) fmt.Printf("Time per descriptor: %dns\n", duration.Nanoseconds()/processedDescs) fmt.Printf("Processed %d descriptors.\n", processedDescs) fmt.Printf("Average advertised bandwidth: %d\n", totalBw/uint64(processedDescs)) } stem-1.7.1/docs/_static/example/tor_descriptors.py0000664000175000017500000000146313237375570023042 0ustar atagaratagar00000000000000import sys import stem.descriptor.remote from stem.util import str_tools # provides a mapping of observed bandwidth to the relay nicknames def get_bw_to_relay(): bw_to_relay = {} try: for desc in stem.descriptor.remote.get_server_descriptors().run(): if desc.exit_policy.is_exiting_allowed(): bw_to_relay.setdefault(desc.observed_bandwidth, []).append(desc.nickname) except Exception as exc: print("Unable to retrieve the server descriptors: %s" % exc) return bw_to_relay # prints the top fifteen relays bw_to_relay = get_bw_to_relay() count = 1 for bw_value in sorted(bw_to_relay.keys(), reverse = True): for nickname in bw_to_relay[bw_value]: print("%i. %s (%s/s)" % (count, nickname, str_tools.size_label(bw_value, 2))) count += 1 if count > 15: sys.exit() stem-1.7.1/docs/_static/example/past_descriptors.py0000664000175000017500000000034213237375570023200 0ustar atagaratagar00000000000000from stem.descriptor.reader import DescriptorReader with DescriptorReader(["/home/atagar/server-descriptors-2013-03.tar"]) as reader: for desc in reader: print("found relay %s (%s)" % (desc.nickname, desc.fingerprint)) stem-1.7.1/docs/_static/example/read_with_parse_file.py0000664000175000017500000000031013237375570023742 0ustar atagaratagar00000000000000from stem.descriptor import parse_file server_descriptors = parse_file('/tmp/descriptor_dump', descriptor_type = 'server-descriptor 1.0') for relay in server_descriptors: print(relay.fingerprint) stem-1.7.1/docs/_static/example/download_descriptor.py0000664000175000017500000001000013341474573023644 0ustar atagaratagar00000000000000""" Simple script to dowload a descriptor from Tor's ORPort or DirPort. """ import collections import getopt import sys import stem import stem.descriptor.remote import stem.util.connection import stem.util.tor_tools # By default downloading moria1's server descriptor from itself. DEFAULT_ARGS = { 'descriptor_type': 'server', 'fingerprint': '9695DFC35FFEB861329B9F1AB04C46397020CE31', 'download_from': stem.DirPort('128.31.0.34', 9131), 'print_help': False, } VALID_TYPES = ('server', 'extrainfo', 'consensus') HELP_TEXT = """\ Downloads a descriptor through Tor's ORPort or DirPort. -t, --type TYPE descriptor type to download, options are: %s -f, --fingerprint FP relay to download the descriptor of --orport ADDRESS:PORT ORPort to download from --dirport ADDRESS:PORT DirPort to download from -h, --help presents this help """ % ', '.join(VALID_TYPES) def parse(argv): """ Parses our arguments, providing a named tuple with their values. :param list argv: input arguments to be parsed :returns: a **named tuple** with our parsed arguments :raises: **ValueError** if we got an invalid argument """ args = dict(DEFAULT_ARGS) try: recognized_args, unrecognized_args = getopt.getopt(argv, 't:f:h', ['type=', 'fingerprint=', 'orport=', 'dirport=', 'help']) if unrecognized_args: raise getopt.GetoptError("'%s' aren't recognized arguments" % "', '".join(unrecognized_args)) except Exception as exc: raise ValueError('%s (for usage provide --help)' % exc) for opt, arg in recognized_args: if opt in ('-t', '--type'): if arg not in VALID_TYPES: raise ValueError("'%s' isn't a recognized decriptor type, options are: %s" % (arg, ', '.join(VALID_TYPES))) args['descriptor_type'] = arg elif opt in ('-f', '--fingerprint'): if not stem.util.tor_tools.is_valid_fingerprint(arg): raise ValueError("'%s' isn't a relay fingerprint" % arg) args['fingerprint'] = arg elif opt in ('--orport', '--dirport'): if ':' not in arg: raise ValueError("'%s' should be of the form 'address:port'" % arg) address, port = arg.rsplit(':', 1) if not stem.util.connection.is_valid_ipv4_address(address): raise ValueError("'%s' isn't a valid IPv4 address" % address) elif not stem.util.connection.is_valid_port(port): raise ValueError("'%s' isn't a valid port number" % port) endpoint_class = stem.ORPort if opt == '--orport' else stem.DirPort args['download_from'] = endpoint_class(address, port) elif opt in ('-h', '--help'): args['print_help'] = True # translates our args dict into a named tuple Args = collections.namedtuple('Args', args.keys()) return Args(**args) def main(): try: args = parse(sys.argv[1:]) except ValueError as exc: print(exc) sys.exit(1) if args.print_help: print(HELP_TEXT) sys.exit() print('Downloading %s descriptor from %s:%s...\n' % (args.descriptor_type, args.download_from.address, args.download_from.port)) desc = None if args.descriptor_type in ('server', 'extrainfo'): if args.descriptor_type == 'server': download_func = stem.descriptor.remote.get_server_descriptors else: download_func = stem.descriptor.remote.get_extrainfo_descriptors desc = download_func( fingerprints = [args.fingerprint], endpoints = [args.download_from], ).run()[0] elif args.descriptor_type == 'consensus': for consensus_desc in stem.descriptor.remote.get_consensus(endpoints = [args.download_from]): if consensus_desc.fingerprint == args.fingerprint: desc = consensus_desc break if not desc: print('Unable to find a descriptor for %s in the consensus' % args.fingerprint) sys.exit(1) else: print("'%s' is not a recognized descriptor type, options are: %s" % (args.descriptor_type, ', '.join(VALID_TYPES))) sys.exit(1) print(desc) if __name__ == '__main__': main() stem-1.7.1/docs/_static/example/custom_path_selection.py0000664000175000017500000000441613341034346024176 0ustar atagaratagar00000000000000import StringIO import time import pycurl import stem.control # Static exit for us to make 2-hop circuits through. Picking aurora, a # particularly beefy one... # # https://metrics.torproject.org/rs.html#details/379FB450010D17078B3766C2273303C358C3A442 EXIT_FINGERPRINT = '379FB450010D17078B3766C2273303C358C3A442' SOCKS_PORT = 9050 CONNECTION_TIMEOUT = 30 # timeout before we give up on a circuit def query(url): """ Uses pycurl to fetch a site using the proxy on the SOCKS_PORT. """ output = StringIO.StringIO() query = pycurl.Curl() query.setopt(pycurl.URL, url) query.setopt(pycurl.PROXY, 'localhost') query.setopt(pycurl.PROXYPORT, SOCKS_PORT) query.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5_HOSTNAME) query.setopt(pycurl.CONNECTTIMEOUT, CONNECTION_TIMEOUT) query.setopt(pycurl.WRITEFUNCTION, output.write) try: query.perform() return output.getvalue() except pycurl.error as exc: raise ValueError("Unable to reach %s (%s)" % (url, exc)) def scan(controller, path): """ Fetch check.torproject.org through the given path of relays, providing back the time it took. """ circuit_id = controller.new_circuit(path, await_build = True) def attach_stream(stream): if stream.status == 'NEW': controller.attach_stream(stream.id, circuit_id) controller.add_event_listener(attach_stream, stem.control.EventType.STREAM) try: controller.set_conf('__LeaveStreamsUnattached', '1') # leave stream management to us start_time = time.time() check_page = query('https://check.torproject.org/') if 'Congratulations. This browser is configured to use Tor.' not in check_page: raise ValueError("Request didn't have the right content") return time.time() - start_time finally: controller.remove_event_listener(attach_stream) controller.reset_conf('__LeaveStreamsUnattached') with stem.control.Controller.from_port() as controller: controller.authenticate() relay_fingerprints = [desc.fingerprint for desc in controller.get_network_statuses()] for fingerprint in relay_fingerprints: try: time_taken = scan(controller, [fingerprint, EXIT_FINGERPRINT]) print('%s => %0.2f seconds' % (fingerprint, time_taken)) except Exception as exc: print('%s => %s' % (fingerprint, exc)) stem-1.7.1/docs/_static/example/benchmark_metrics_lib.java0000664000175000017500000002631513157571677024426 0ustar atagaratagar00000000000000/* Copyright 2016 The Tor Project * See LICENSE for licensing information */ package org.torproject.descriptor; import java.io.File; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.SortedMap; public class MeasurePerformance { /* Check if all necessary files are available and then measure * performance of some more or less common use cases. */ public static void main(String[] args) { if (!filesAvailable()) { return; } /*measureListOutdatedRelays(null); pause();*/ measureAverageAdvertisedBandwidth(new File(resDir, resPaths[0])); pause(); measureAverageAdvertisedBandwidth(new File(resDir, resPaths[1])); pause(); measureAverageAdvertisedBandwidth(new File(resDir, resPaths[2])); pause(); /*measureFractionRelaysExit80ServerDescriptors(null); pause(); measureSumOfWrittenAndReadBytes(null); pause();*/ measureCountriesV3Requests(new File(resDir, resPaths[3])); pause(); measureCountriesV3Requests(new File(resDir, resPaths[4])); pause(); measureAverageRelaysExit(new File(resDir, resPaths[5])); pause(); measureAverageRelaysExit(new File(resDir, resPaths[6])); pause(); measureAverageRelaysExit(new File(resDir, resPaths[7])); /*pause(); measureVotesByBandwidthAuthorities(null); pause(); measureExtendedFamilies(null); pause();*/ measureFractionRelaysExit80Microdescriptors( new File(resDir, resPaths[8])); measureFractionRelaysExit80Microdescriptors( new File(resDir, resPaths[9])); } private static File resDir = new File("res"); private static String[] resPaths = new String[] { "archive/relay-descriptors/server-descriptors/" + "server-descriptors-2015-11.tar.xz", "archive/relay-descriptors/server-descriptors/" + "server-descriptors-2015-11.tar", "archive/relay-descriptors/server-descriptors/" + "server-descriptors-2015-11", "archive/relay-descriptors/extra-infos/extra-infos-2015-11.tar.xz", "archive/relay-descriptors/extra-infos/extra-infos-2015-11.tar", "archive/relay-descriptors/consensuses/consensuses-2015-11.tar.xz", "archive/relay-descriptors/consensuses/consensuses-2015-11.tar", "archive/relay-descriptors/consensuses/consensuses-2015-11", "archive/relay-descriptors/microdescs/" + "microdescs-2015-11-micro.tar.xz", "archive/relay-descriptors/microdescs/microdescs-2015-11-micro.tar" }; private static boolean filesAvailable() { if (!resDir.exists() || !resDir.isDirectory()) { return false; } for (String resPath : resPaths) { if (!(new File(resDir, resPath).exists())) { System.err.println(resPath); return false; } } return true; } private static void pause() { try { Thread.sleep(15L * 1000L); } catch (InterruptedException e) { e.printStackTrace(); } } private static void measureListOutdatedRelays(File tarballFile) { } private static void measureAverageAdvertisedBandwidth( File tarballFileOrDirectory) { System.out.println("Starting measureAverageAdvertisedBandwidth"); long startedMillis = System.currentTimeMillis(); long sumAdvertisedBandwidth = 0, countedServerDescriptors = 0; DescriptorReader descriptorReader = DescriptorSourceFactory.createDescriptorReader(); descriptorReader.addTarball(tarballFileOrDirectory); descriptorReader.addDirectory(tarballFileOrDirectory); Iterator descriptorFiles = descriptorReader.readDescriptors(); while (descriptorFiles.hasNext()) { DescriptorFile descriptorFile = descriptorFiles.next(); for (Descriptor descriptor : descriptorFile.getDescriptors()) { if (!(descriptor instanceof ServerDescriptor)) { continue; } ServerDescriptor serverDescriptor = (ServerDescriptor) descriptor; sumAdvertisedBandwidth += (long) Math.min(Math.min( serverDescriptor.getBandwidthRate(), serverDescriptor.getBandwidthBurst()), serverDescriptor.getBandwidthObserved()); countedServerDescriptors++; } } long endedMillis = System.currentTimeMillis(); System.out.println("Ending measureAverageAdvertisedBandwidth"); System.out.printf("Total time: %d millis%n", endedMillis - startedMillis); System.out.printf("Processed server descriptors: %d%n", countedServerDescriptors); System.out.printf("Average advertised bandwidth: %d%n", sumAdvertisedBandwidth / countedServerDescriptors); System.out.printf("Time per server descriptor: %.6f millis%n", ((double) (endedMillis - startedMillis)) / ((double) countedServerDescriptors)); } private static void measureFractionRelaysExit80ServerDescriptors( File tarballFile) { } private static void measureSumOfWrittenAndReadBytes(File tarballFile) { } private static void measureCountriesV3Requests(File tarballFile) { System.out.println("Starting measureCountriesV3Requests"); long startedMillis = System.currentTimeMillis(); Set countries = new HashSet<>(); long countedExtraInfoDescriptors = 0; DescriptorReader descriptorReader = DescriptorSourceFactory.createDescriptorReader(); descriptorReader.addTarball(tarballFile); Iterator descriptorFiles = descriptorReader.readDescriptors(); while (descriptorFiles.hasNext()) { DescriptorFile descriptorFile = descriptorFiles.next(); for (Descriptor descriptor : descriptorFile.getDescriptors()) { if (!(descriptor instanceof ExtraInfoDescriptor)) { continue; } ExtraInfoDescriptor extraInfoDescriptor = (ExtraInfoDescriptor) descriptor; SortedMap dirreqV3Reqs = extraInfoDescriptor.getDirreqV3Reqs(); if (dirreqV3Reqs != null) { countries.addAll(dirreqV3Reqs.keySet()); } countedExtraInfoDescriptors++; } } long endedMillis = System.currentTimeMillis(); System.out.println("Ending measureCountriesV3Requests"); System.out.printf("Total time: %d millis%n", endedMillis - startedMillis); System.out.printf("Processed extra-info descriptors: %d%n", countedExtraInfoDescriptors); System.out.printf("Number of countries: %d%n", countries.size()); System.out.printf("Time per extra-info descriptor: %.6f millis%n", ((double) (endedMillis - startedMillis)) / ((double) countedExtraInfoDescriptors)); } private static void measureAverageRelaysExit( File tarballFileOrDirectory) { System.out.println("Starting measureAverageRelaysExit"); long startedMillis = System.currentTimeMillis(); long totalRelaysWithExitFlag = 0L, totalRelays = 0L, countedConsensuses = 0L; DescriptorReader descriptorReader = DescriptorSourceFactory.createDescriptorReader(); descriptorReader.addTarball(tarballFileOrDirectory); descriptorReader.addDirectory(tarballFileOrDirectory); Iterator descriptorFiles = descriptorReader.readDescriptors(); while (descriptorFiles.hasNext()) { DescriptorFile descriptorFile = descriptorFiles.next(); for (Descriptor descriptor : descriptorFile.getDescriptors()) { if (!(descriptor instanceof RelayNetworkStatusConsensus)) { continue; } RelayNetworkStatusConsensus consensus = (RelayNetworkStatusConsensus) descriptor; for (NetworkStatusEntry entry : consensus.getStatusEntries().values()) { if (entry.getFlags().contains("Exit")) { totalRelaysWithExitFlag++; } totalRelays++; } countedConsensuses++; } } long endedMillis = System.currentTimeMillis(); System.out.println("Ending measureAverageRelaysExit"); System.out.printf("Total time: %d millis%n", endedMillis - startedMillis); System.out.printf("Processed consensuses: %d%n", countedConsensuses); System.out.printf("Total number of status entries: %d%n", totalRelays); System.out.printf("Total number of status entries with Exit flag: " + "%d%n", totalRelaysWithExitFlag); System.out.printf("Average number of relays with Exit Flag: %.2f%n", (double) totalRelaysWithExitFlag / (double) totalRelays); System.out.printf("Time per consensus: %.6f millis%n", ((double) (endedMillis - startedMillis)) / ((double) countedConsensuses)); } private static void measureVotesByBandwidthAuthorities( File tarballFile) { } private static void measureExtendedFamilies(File tarballFile) { } private static void measureFractionRelaysExit80Microdescriptors( File tarballFile) { System.out.println("Starting " + "measureFractionRelaysExit80Microdescriptors"); long startedMillis = System.currentTimeMillis(); long totalRelaysWithExitFlag = 0L, countedMicrodescriptors = 0L; DescriptorReader descriptorReader = DescriptorSourceFactory.createDescriptorReader(); descriptorReader.addTarball(tarballFile); Iterator descriptorFiles = descriptorReader.readDescriptors(); while (descriptorFiles.hasNext()) { DescriptorFile descriptorFile = descriptorFiles.next(); for (Descriptor descriptor : descriptorFile.getDescriptors()) { if (!(descriptor instanceof Microdescriptor)) { continue; } countedMicrodescriptors++; Microdescriptor microdescriptor = (Microdescriptor) descriptor; String defaultPolicy = microdescriptor.getDefaultPolicy(); if (defaultPolicy == null) { continue; } boolean accept = "accept".equals( microdescriptor.getDefaultPolicy()); for (String ports : microdescriptor.getPortList().split(",")) { if (ports.contains("-")) { String[] parts = ports.split("-"); int from = Integer.parseInt(parts[0]); int to = Integer.parseInt(parts[1]); if (from <= 80 && to >= 80) { if (accept) { totalRelaysWithExitFlag++; } } else if (to > 80) { if (!accept) { totalRelaysWithExitFlag++; } break; } } else if ("80".equals(ports)) { if (accept) { totalRelaysWithExitFlag++; } break; } } } } long endedMillis = System.currentTimeMillis(); System.out.println("Ending " + "measureFractionRelaysExit80Microdescriptors"); System.out.printf("Total time: %d millis%n", endedMillis - startedMillis); System.out.printf("Processed microdescriptors: %d%n", countedMicrodescriptors); System.out.printf("Total number of microdescriptors that exit to 80: " + "%d%n", totalRelaysWithExitFlag); System.out.printf("Average number of relays that exit to 80: %.2f%n", (double) totalRelaysWithExitFlag / (double) countedMicrodescriptors); System.out.printf("Time per microdescriptor: %.6f millis%n", ((double) (endedMillis - startedMillis)) / ((double) countedMicrodescriptors)); } } stem-1.7.1/docs/_static/example/compare_flags.py0000664000175000017500000000335313341034346022404 0ustar atagaratagar00000000000000import collections import stem.descriptor import stem.descriptor.remote import stem.directory # Query all authority votes asynchronously. downloader = stem.descriptor.remote.DescriptorDownloader( document_handler = stem.descriptor.DocumentHandler.DOCUMENT, ) # An ordered dictionary ensures queries are finished in the order they were # added. queries = collections.OrderedDict() for name, authority in stem.directory.Authority.from_cache().items(): if authority.v3ident is None: continue # authority doesn't vote if it lacks a v3ident queries[name] = downloader.get_vote(authority) # Wait for the votes to finish being downloaded, this produces a dictionary of # authority nicknames to their vote. votes = dict((name, query.run()[0]) for (name, query) in queries.items()) # Get a superset of all the fingerprints in all the votes. all_fingerprints = set() for vote in votes.values(): all_fingerprints.update(vote.routers.keys()) # Finally, compare moria1's votes to maatuska's votes. for fingerprint in all_fingerprints: moria1_vote = votes['moria1'].routers.get(fingerprint) maatuska_vote = votes['maatuska'].routers.get(fingerprint) if not moria1_vote and not maatuska_vote: print("both moria1 and maatuska haven't voted about %s" % fingerprint) elif not moria1_vote: print("moria1 hasn't voted about %s" % fingerprint) elif not maatuska_vote: print("maatuska hasn't voted about %s" % fingerprint) elif 'Running' in moria1_vote.flags and 'Running' not in maatuska_vote.flags: print("moria1 has the Running flag but maatuska doesn't: %s" % fingerprint) elif 'Running' in maatuska_vote.flags and 'Running' not in moria1_vote.flags: print("maatuska has the Running flag but moria1 doesn't: %s" % fingerprint) stem-1.7.1/docs/_static/example/create_descriptor.py0000664000175000017500000000055713237375570023321 0ustar atagaratagar00000000000000from stem.descriptor.server_descriptor import RelayDescriptor # prints 'caerSidi (71.35.133.197:9001)' desc = RelayDescriptor.create() print("%s (%s:%s)" % (desc.nickname, desc.address, desc.or_port)) # prints 'demo (127.0.0.1:80)' desc = RelayDescriptor.create({'router': 'demo 127.0.0.1 80 0 0'}) print("%s (%s:%s)" % (desc.nickname, desc.address, desc.or_port)) stem-1.7.1/docs/_static/example/votes_by_bandwidth_authorities.py0000664000175000017500000000164313341034346026100 0ustar atagaratagar00000000000000import stem.descriptor.remote import stem.directory # request votes from all the bandwidth authorities queries = {} downloader = stem.descriptor.remote.DescriptorDownloader() for authority in stem.directory.Authority.from_cache().values(): queries[authority.nickname] = downloader.query( '/tor/status-vote/current/authority', endpoints = [(authority.address, authority.dir_port)], ) for authority_name, query in queries.items(): try: print("Getting %s's vote from %s:" % (authority_name, query.download_url)) measured, unmeasured = 0, 0 for desc in query.run(): if desc.measured: measured += 1 else: unmeasured += 1 if measured == 0: print(' %s is not a bandwidth authority' % authority_name) else: print(' %i measured entries and %i unmeasured' % (measured, unmeasured)) except Exception as exc: print(" failed to get the vote (%s)" % exc) stem-1.7.1/docs/_static/example/fibonacci_threaded.py0000664000175000017500000000066513340051401023350 0ustar atagaratagar00000000000000import threading import time def fibonacci(n): if n < 2: return n else: return fibonacci(n-2) + fibonacci(n-1) # calculate fibonacci sequences four times in parallel start_time, threads = time.time(), [] for i in range(4): t = threading.Thread(target = fibonacci, args = (35,)) t.setDaemon(True) t.start() threads.append(t) for t in threads: t.join() print('took %0.1f seconds' % (time.time() - start_time)) stem-1.7.1/docs/_static/example/ephemeral_hidden_services.py0000664000175000017500000000121613237375570024771 0ustar atagaratagar00000000000000from stem.control import Controller from flask import Flask app = Flask(__name__) @app.route('/') def index(): return "

Hi Grandma!

" print(' * Connecting to tor') with Controller.from_port() as controller: controller.authenticate() # Create a hidden service where visitors of port 80 get redirected to local # port 5000 (this is where Flask runs by default). response = controller.create_ephemeral_hidden_service({80: 5000}, await_publication = True) print(" * Our service is available at %s.onion, press ctrl+c to quit" % response.service_id) try: app.run() finally: print(" * Shutting down our hidden service") stem-1.7.1/docs/_static/example/load_test.py0000664000175000017500000000133213340051401021541 0ustar atagaratagar00000000000000import os import time import stem.control import stem.util.proc import stem.util.str_tools start_time = time.time() samplings = [] last_sample = None with stem.control.Controller.from_port() as controller: controller.authenticate() controller.add_event_listener(lambda *args: None, 'DEBUG') while True: utime, stime = stem.util.proc.stats(os.getpid(), stem.util.proc.Stat.CPU_UTIME, stem.util.proc.Stat.CPU_STIME) total_cpu_time = float(utime) + float(stime) if last_sample: samplings.append(total_cpu_time - last_sample) print '%0.1f%% (%s)' % (sum(samplings) / len(samplings) * 100, stem.util.str_tools.time_label(time.time() - start_time)) last_sample = total_cpu_time time.sleep(1) stem-1.7.1/docs/_static/example/reading_twitter.py0000664000175000017500000000503313237375570023005 0ustar atagaratagar00000000000000import binascii import hashlib import hmac import json import socket import time import urllib import urllib2 import socks # SockiPy module import stem.process SOCKS_PORT = 7000 TWITTER_API_URL = "https://api.twitter.com/1.1/statuses/user_timeline.json" CONSUMER_KEY = "" CONSUMER_SECRET = "" ACCESS_TOKEN = "" ACCESS_TOKEN_SECRET = "" HEADER_AUTH_KEYS = ['oauth_consumer_key', 'oauth_nonce', 'oauth_signature', 'oauth_signature_method', 'oauth_timestamp', 'oauth_token', 'oauth_version'] socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', SOCKS_PORT) socket.socket = socks.socksocket def oauth_signature(key_dict): fin_key = "" for key in sorted(key_dict.keys()): fin_key += key + "=" + key_dict[key] + "&" fin_key = fin_key[:-1] fin_key = 'GET' + "&" + urllib.quote(TWITTER_API_URL, '') + "&" + urllib.quote(fin_key, '') key = urllib.quote(CONSUMER_SECRET, '') + "&" + urllib.quote(ACCESS_TOKEN_SECRET, '') hashed = hmac.new(key, fin_key, hashlib.sha1) fin_key = binascii.b2a_base64(hashed.digest())[:-1] return urllib.quote(fin_key, '') def poll_twitter_feed(user_id, tweet_count): """ Polls Twitter for the tweets from a given user. """ key_dict = { 'oauth_consumer_key': urllib.quote(CONSUMER_KEY, ''), 'oauth_nonce': urllib.quote(hashlib.md5(str(time.time())).hexdigest(), ''), 'oauth_signature_method': urllib.quote("HMAC-SHA1", ''), 'oauth_timestamp': urllib.quote(str(int(time.time())), ''), 'oauth_token': urllib.quote(ACCESS_TOKEN, ''), 'oauth_version': urllib.quote('1.0', ''), } url_values = {'screen_name': user_id, 'count': str(tweet_count), 'include_rts': '1'} for key, value in url_values.items(): key_dict[key] = urllib.quote(value, '') key_dict['oauth_signature'] = oauth_signature(key_dict) header_auth = 'OAuth ' + ', '.join(['%s="%s"' % (key, key_dict[key]) for key in HEADER_AUTH_KEYS]) data = urllib.urlencode(url_values) api_request = urllib2.Request(TWITTER_API_URL + "?" + data, headers = {'Authorization': header_auth}) try: api_response = urllib2.urlopen(api_request).read() except: raise IOError("Unable to reach %s" % TWITTER_API_URL) return json.loads(api_response) tor_process = stem.process.launch_tor_with_config( config = { 'SocksPort': str(SOCKS_PORT), 'ExitNodes': '{ru}', }, ) try: for index, tweet in enumerate(poll_twitter_feed('ioerror', 3)): print("%i. %s" % (index + 1, tweet["created_at"])) print(tweet["text"]) print("") except IOError as exc: print(exc) finally: tor_process.kill() # stops tor stem-1.7.1/docs/_static/example/current_descriptors.py0000664000175000017500000000035613344340401023700 0ustar atagaratagar00000000000000import stem.descriptor.remote try: for desc in stem.descriptor.remote.get_consensus(): print("found relay %s (%s)" % (desc.nickname, desc.fingerprint)) except Exception as exc: print("Unable to retrieve the consensus: %s" % exc) stem-1.7.1/docs/_static/example/list_circuits.py0000664000175000017500000000120313237375570022465 0ustar atagaratagar00000000000000from stem import CircStatus from stem.control import Controller with Controller.from_port(port = 9051) as controller: controller.authenticate() for circ in sorted(controller.get_circuits()): if circ.status != CircStatus.BUILT: continue print("") print("Circuit %s (%s)" % (circ.id, circ.purpose)) for i, entry in enumerate(circ.path): div = '+' if (i == len(circ.path) - 1) else '|' fingerprint, nickname = entry desc = controller.get_network_status(fingerprint, None) address = desc.address if desc else 'unknown' print(" %s- %s (%s, %s)" % (div, fingerprint, nickname, address)) stem-1.7.1/docs/_static/example/outdated_relays.py0000664000175000017500000000104113237375570022775 0ustar atagaratagar00000000000000from stem.descriptor.remote import DescriptorDownloader from stem.version import Version downloader = DescriptorDownloader() count, with_contact = 0, 0 print("Checking for outdated relays...") print("") for desc in downloader.get_server_descriptors(): if desc.tor_version < Version('0.2.3.0'): count += 1 if desc.contact: print(' %-15s %s' % (desc.tor_version, desc.contact.decode("utf-8", "replace"))) with_contact += 1 print("") print("%i outdated relays found, %i had contact information" % (count, with_contact)) stem-1.7.1/docs/_static/example/benchmark_zoossh.go0000664000175000017500000000437313157571677023143 0ustar atagaratagar00000000000000package main import ( "fmt" "log" "os" "path/filepath" "time" "git.torproject.org/user/phw/zoossh.git" ) var processedCons int64 = 0 var processedDescs int64 = 0 var totalExits int64 = 0 var totalRelays int64 = 0 var totalBw uint64 = 0 func Min(a uint64, b uint64, c uint64) uint64 { min := a if b < min { min = b } if c < min { min = c } return min } func ProcessDescriptors(path string, info os.FileInfo, err error) error { if _, err := os.Stat(path); err != nil { return err } if info.IsDir() { return nil } consensus, err := zoossh.ParseDescriptorFile(path) if err != nil { return err } if (processedDescs % 100) == 0 { fmt.Printf(".") } for _, getDesc := range consensus.RouterDescriptors { desc := getDesc() totalBw += Min(desc.BandwidthAvg, desc.BandwidthBurst, desc.BandwidthObs) processedDescs++ } return nil } func ProcessConsensus(path string, info os.FileInfo, err error) error { if _, err := os.Stat(path); err != nil { return err } if info.IsDir() { return nil } consensus, err := zoossh.ParseConsensusFile(path) if err != nil { return err } fmt.Printf(".") for _, getStatus := range consensus.RouterStatuses { status := getStatus() totalRelays++ if status.Flags.Exit == true { totalExits++ } } processedCons++ return nil } func main() { if len(os.Args) != 3 { log.Fatalf("Usage: %s CONSENSUS_ARCHIVE DESCRIPTOR_ARCHIVE", os.Args[0]) } before := time.Now() filepath.Walk(os.Args[1], ProcessConsensus) fmt.Println() after := time.Now() duration := after.Sub(before) fmt.Println("Total time for consensuses:", duration) fmt.Printf("Time per consensus: %dms\n", duration.Nanoseconds()/processedCons/int64(1000000)) fmt.Printf("Processed %d consensuses with %d router status entries.\n", processedCons, totalRelays) fmt.Printf("Total exits: %d\n", totalExits) before = time.Now() filepath.Walk(os.Args[2], ProcessDescriptors) fmt.Println() after = time.Now() duration = after.Sub(before) fmt.Println("Total time for descriptors:", duration) fmt.Printf("Time per descriptor: %dns\n", duration.Nanoseconds()/processedDescs) fmt.Printf("Processed %d descriptors.\n", processedDescs) fmt.Printf("Average advertised bandwidth: %d\n", totalBw/uint64(processedDescs)) } stem-1.7.1/docs/_static/example/benchmark_server_descriptor_metrics_lib.java0000664000175000017500000000377713157571677030261 0ustar atagaratagar00000000000000package org.torproject.descriptor; import org.torproject.descriptor.Descriptor; import org.torproject.descriptor.DescriptorReader; import org.torproject.descriptor.DescriptorSourceFactory; import org.torproject.descriptor.ServerDescriptor; import java.io.File; import java.util.Iterator; public class MeasurePerformance { public static void main(String[] args) { measureAverageAdvertisedBandwidth(new File("server-descriptors-2015-11.tar")); } private static void measureAverageAdvertisedBandwidth( File tarballFileOrDirectory) { System.out.println("Starting measureAverageAdvertisedBandwidth"); final long startedMillis = System.currentTimeMillis(); long sumAdvertisedBandwidth = 0; long countedServerDescriptors = 0; DescriptorReader descriptorReader = DescriptorSourceFactory.createDescriptorReader(); Iterator descriptors = descriptorReader.readDescriptors(tarballFileOrDirectory).iterator(); while (descriptors.hasNext()) { Descriptor descriptor = descriptors.next(); if (!(descriptor instanceof ServerDescriptor)) { continue; } ServerDescriptor serverDescriptor = (ServerDescriptor) descriptor; sumAdvertisedBandwidth += (long) Math.min(Math.min( serverDescriptor.getBandwidthRate(), serverDescriptor.getBandwidthBurst()), serverDescriptor.getBandwidthObserved()); countedServerDescriptors++; } long endedMillis = System.currentTimeMillis(); System.out.println("Ending measureAverageAdvertisedBandwidth"); System.out.printf("Total time: %d millis%n", endedMillis - startedMillis); System.out.printf("Processed server descriptors: %d%n", countedServerDescriptors); System.out.printf("Average advertised bandwidth: %d%n", sumAdvertisedBandwidth / countedServerDescriptors); System.out.printf("Time per server descriptor: %.6f millis%n", ((double) (endedMillis - startedMillis)) / ((double) countedServerDescriptors)); } } stem-1.7.1/docs/_static/example/client_usage_using_pycurl.py0000664000175000017500000000246613237375570025066 0ustar atagaratagar00000000000000import io import pycurl import stem.process from stem.util import term SOCKS_PORT = 7000 def query(url): """ Uses pycurl to fetch a site using the proxy on the SOCKS_PORT. """ output = io.BytesIO() query = pycurl.Curl() query.setopt(pycurl.URL, url) query.setopt(pycurl.PROXY, 'localhost') query.setopt(pycurl.PROXYPORT, SOCKS_PORT) query.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5_HOSTNAME) query.setopt(pycurl.WRITEFUNCTION, output.write) try: query.perform() return output.getvalue() except pycurl.error as exc: return "Unable to reach %s (%s)" % (url, exc) # Start an instance of Tor configured to only exit through Russia. This prints # Tor's bootstrap information as it starts. Note that this likely will not # work if you have another Tor instance running. def print_bootstrap_lines(line): if "Bootstrapped " in line: print(term.format(line, term.Color.BLUE)) print(term.format("Starting Tor:\n", term.Attr.BOLD)) tor_process = stem.process.launch_tor_with_config( config = { 'SocksPort': str(SOCKS_PORT), 'ExitNodes': '{ru}', }, init_msg_handler = print_bootstrap_lines, ) print(term.format("\nChecking our endpoint:\n", term.Attr.BOLD)) print(term.format(query("https://www.atagar.com/echo.php"), term.Color.BLUE)) tor_process.kill() # stops tor stem-1.7.1/docs/_static/example/saving_and_loading_descriptors.py0000664000175000017500000000034613237375570026043 0ustar atagaratagar00000000000000import stem.descriptor.remote server_descriptors = stem.descriptor.remote.get_server_descriptors().run() with open('/tmp/descriptor_dump', 'wb') as descriptor_file: descriptor_file.write(''.join(map(str, server_descriptors))) stem-1.7.1/docs/_static/example/fibonacci_multiprocessing.py0000664000175000017500000000063413340051401025013 0ustar atagaratagar00000000000000import stem.util.system import time def fibonacci(n): if n < 2: return n else: return fibonacci(n-2) + fibonacci(n-1) # calculate fibonacci sequences four times in parallel start_time, threads = time.time(), [] for i in range(4): threads.append(stem.util.system.DaemonTask(fibonacci, (35,), start = True)) for t in threads: t.join() print('took %0.1f seconds' % (time.time() - start_time)) stem-1.7.1/docs/_static/example/resuming_ephemeral_hidden_service.py0000664000175000017500000000165213237375570026523 0ustar atagaratagar00000000000000import os from stem.control import Controller key_path = os.path.expanduser('~/my_service_key') with Controller.from_port() as controller: controller.authenticate() if not os.path.exists(key_path): service = controller.create_ephemeral_hidden_service({80: 5000}, await_publication = True) print("Started a new hidden service with the address of %s.onion" % service.service_id) with open(key_path, 'w') as key_file: key_file.write('%s:%s' % (service.private_key_type, service.private_key)) else: with open(key_path) as key_file: key_type, key_content = key_file.read().split(':', 1) service = controller.create_ephemeral_hidden_service({80: 5000}, key_type = key_type, key_content = key_content, await_publication = True) print("Resumed %s.onion" % service.service_id) raw_input('press any key to shut the service down...') controller.remove_ephemeral_hidden_service(service.service_id) stem-1.7.1/docs/_static/example/manual_config_options.py0000664000175000017500000000230313237375570024164 0ustar atagaratagar00000000000000from stem.manual import Manual from stem.util import term try: print("Downloading tor's manual information, please wait...") manual = Manual.from_remote() print(" done\n") except IOError as exc: print(" unsuccessful (%s), using information provided with stem\n" % exc) manual = Manual.from_cache() # fall back to our bundled manual information print('Which tor configuration would you like to learn about? (press ctrl+c to quit)\n') try: while True: requested_option = raw_input('> ').strip() if requested_option: if requested_option in manual.config_options: option = manual.config_options[requested_option] print(term.format('%s %s' % (option.name, option.usage), term.Color.GREEN, term.Attr.BOLD)) print(term.format(option.summary, term.Color.GREEN)) # brief description provided by stem print(term.format('\nFull Description:\n', term.Color.GREEN, term.Attr.BOLD)) print(term.format(option.description + '\n', term.Color.GREEN)) else: print(term.format("Sorry, we don't have any information about %s. Are you sure it's an option?" % requested_option, term.Color.RED)) except KeyboardInterrupt: pass # user pressed ctrl+c stem-1.7.1/docs/_static/example/validate_descriptor_content.py0000664000175000017500000000027213237375570025373 0ustar atagaratagar00000000000000from stem.descriptor import parse_file for desc in parse_file('/home/atagar/.tor/cached-consensus', validate = True): print('found relay %s (%s)' % (desc.nickname, desc.fingerprint)) stem-1.7.1/docs/_static/example/words_with.py0000664000175000017500000000214313340051401021755 0ustar atagaratagar00000000000000import itertools import re from stem.util import term from stem.util.term import Attr, Color def get_words_with(target, attr): """ Provides words with the given substring highlighted within it. :param str target: substring to match against :param tuple attr: terminal formatting to highlight the match with :returns: **iterable** with words containing that substring """ word_matcher = re.compile('(.*)(%s)(.*)' % target, re.I) with open('/etc/dictionaries-common/words') as dictionary_file: for word in dictionary_file: match = word_matcher.match(word) if match: yield ''.join(( match.group(1), term.format(match.group(2), *attr), match.group(3), )) if __name__ == '__main__': target = raw_input("What substring would you like to look for? We'll get words containing it: ") attr = (Attr.BOLD, Color.YELLOW) print("Words with '%s' include...\n" % term.format(target, *attr)) for words in itertools.izip_longest(*(get_words_with(target, attr),) * 4): print('%-30s%-30s%-30s%-30s' % tuple([w if w else '' for w in words])) stem-1.7.1/docs/_static/style.css0000664000175000017500000000030513411002341017425 0ustar atagaratagar00000000000000div.literal-block-wrapper { padding: 0; } span.caption-text { float: right; } span.red { color: red; font-weight: bold; } span.green { color: green; font-weight: bold; } stem-1.7.1/docs/_static/words_with.png0000664000175000017500000013315113340051401020462 0ustar atagaratagar00000000000000‰PNG  IHDRË6—ìßbKGDÿÿÿ ½§“ pHYs  šœtIMEá ,/øà· IDATxÚìwtUÅÖÀ·%¹é–= EšôÞ›ˆÊ "*`Gß{¢Ò*6TžÊG•"½HïD „$$¤„ôrËþþ¸¡“ä.H™ßZ{-H&söìÙgfŸ©:´ãôÚ P …B¡P( …âÖæ pØ ¬~r´ü¡NCšp` 00*[+ …B¡P(ns¬À7À àÐõËS€±Êž …B¡P(Š;”©À¸â~©/æçáÀ(+îJôTéø,‡¥n95™r÷Ô{mÆ|Äì1˜•5Ðû·ä¹i1:¬êT¡PÜéŒ-Š{õË­p¬åhRæGét¸‡˜©TY¯i}‡âÐé©<®.ÿmÌèñ¸Þ‘†ö$ô™M¼ôõFö¹©:ë´ KòZºß±“w:ôïE}Ÿ«Ô«±mŸÍ“*aR- ÆríõÒHºýSÖÐS¾ß÷ÄYÓY3ª&.ªN Å¥IQüÛª´`9Ç‚çkظ§§êû xgK8O qÃp;˜Å`¤ÊPžÝژɱMøï_õxäY/·¢Î:˜³‘Ýß´ÂXn8›³3ˆ^û_šzüƒ®Õäß,úm*½+ªƒÛ Æ«Z8!_ÂÂü‹õUU§ …‰ÅÁ—Œ0_Þº|Ãuœp¡ÓßNöÐüBF1“»+-‹ 16 ¤Ù«µñÉ>Èçß`»Õ¶°s| ^º’ºð g¬wšŸêp­9€jn@ú*Ç8~lòÇ¿‚': 7ùºÀ*5{š~¬|ëþ#†ÐýN_Œ}n5u>tœ¹ŠÏÿÃ̧»òãþ³˜Êצq­tNªÖX¡ Q³:RgC0‘§ ¢P(n^Àü ÐôjÁò®ºôB‡w¯P†¿ëG¹=z ?6‹½3cYòK…Þ×åÍ)†‹|GÔã½EÿIIfvëXbóJÏ@çíA³ñÁ´íëE9_ØldÏaßûÑ,ýÓ‚mù˜•£óˆÂš»S.°(8°ÛHù-šO^>K^Eú6S¸êÓG¤‘i<2Ðo®C“'üñŸŸˆµOUëGHˆ]AÑ;픿όG^ÛÇã×¥…Ø—;Í^¯LÇ^ø™!ïXۦƲjyÁùQ¿Òôɱ—žÆðà¥v¦·‰¤ÑDç^Vcΰ¡‹-?¬Fë–f‹t)ˆÉä¯÷cX±¬àÒÑLce™¿ïz§2£kÆnÌ@®9Èò"¸]KL@Öö¥¤^XíæÏÿ<ÉQ[]šûžÖÕ[Òv@SŽ}±•\ªR§ÿ8îkß 3XÓrìi¬]µ—|{Ñ#<Ñxð‹4n\/W€<²O,fõG“8‘i¿R'×ú´ûïwÜ[²ÖbÞ·Û0´þŽÃ.|xzuÿ‘ÑÝ‹þ“ñ3óÇ¿ÏéBЙëRÿ¡±4kÙo!?aûĶ]ñ«ÑhÄD‡UÅËË=vò¶rð÷IlÙ‡U´Û§ärgm:—lC#Þ÷½Eï©è‰ÎrŠøãyø‡ÕÂ\xœƒ_=ÇêIØ]kУC ù+ã­¯W‘ À6-/ëàb%úÏü™)5¥f +Kì¦yÿÅqÌÙy; ʆS_SþpîùÏa  UyvûI>.Fpë¯IpoϧÖ2ØÇ‘í{‘¼Wôˆ£êQÿ¿G8gJ·^?p²0?“´¿1éÙLÝ”ÆyÏp«Îÿþ„÷ŸéF-/ §·ÏçƒÆ0{[º#!ˆþÍcâýM òBÔ¿1õù§™²þŒÆp/ºýžÄòÀaTh³€”‹üÀ¥Þî{˜¯Â2騥t}C…N¼üߨ©9õªâa¬§øy@C-NE½w#F~ô9o?Ö” †\b$R 8~ñƒ_ FÏšÅøM¨ä X2ˆÙ8™¾½Þc¾óÊ55ÿ)vÄ|B£¢ße.èHð¿Ö’}qVžN¬Ó›å‡v…(· MŠââqŽáUá»™O(<+HV »²‰²âVÅ‹Skѵ¾ãÏ­ ÙDnÍæôÙ¢?9“ˉ­YDmÍâØÆ<òlÚòÁÅLûÃxàqoÊ ˆ^ŸE’Õ€woêÔ1­¯Ô:|:V¤M/Ï A'€Þ€{¡•B»ïöåÕ[Ø9ë,–ybó½L>R‡&þ@3>.:Üj{Q9Ä@îßy乺R­•ùG °z˜iöfy*º&7Ú|W—ñÂÏdáLœ s-:|^—»‹ \š>ÚÒ8ìœÅ‰ƒ–â«×Y64™¨ÚÁƒÀ@=ñù$' ®U½iûY ZU¿l¥«[ zv BïVŸ^m¯sm {#êßc9º5ªø%ùGØû¿Õn=tô¨ûôôêÑ Ë1NGEañ»‡ºƒ¾ _ûG]è¨=üSÚÝW/ÛINÛGrr!•±[ìW޼ǽåÀzdÿûa y"XÓö¹›”s'4fFr*r'q‘;‰=|ܘCiüÒwtnßoc*é)Y¸µ¡ÙsßÓµ‘¿£. Tº§.>^îX’ÿ&%9· V4yö;º6ô»rMqqö)µ\u.Õ†z\ƒ›P1Гüøä›B®[‚Ø8l®5¹çáA˜kÑ)àÖù5Æt¹öµõÂ;µ¦fü‡ êÖ™î_e™ùQ>ݲ”j;–àØ“×±`/ÔêÛŽJ†sÛ éGm&ÅälglÓz4{òòˆafŸ†„‡‡^ŸDqÉõ3¯êI÷þÏ2ßÒ‡I‹?¦›_Qôôül ÇVaó„ôè;’o³ûòÑÆ¼æZ¤³7á;P/õs†öîFÏGó‹½ï/žCï@­£úÎDA|Cð1‚Þ=ˆšÕË᪓(~ö¢R-Úô\Bzñüðn—ý›§t¥C‡Îôô"ï,ú°5ñÐ÷ëùä‹^Hïžç«ƒ–˦=i5m1Óû¤óùN´lÞ’öýŸáý6rÚ‚SËeK˜Ï€ºá„7ìì˜b²rVÞL?T(·c‹âãómᘒRço>ɇmÁàiÄÝl ôÝz<ÖÃ…:­\X¾?ŸÜqÌݨ'trÏ2röד|ùnîNiùU ]„ò3˜ßá8{’ôԛ߈¡­Ê–ÏÅ#7¶M'øàñ42¬ s3âébÂÿfn`ÍáX‚…P7²äB]w—R\ËÆ8æncxã–WÄïj±²ÓmXÀ¦'ñG”+WÞC÷î4¸ÏÄÆ…Fe²·ðê#¯Ð2_>9Ê%ƒÁú@ª?<î]ïÁ˜º‹Ã+æð׆¸uûœ¾÷Ʋíãw8tÞ@:ÜjßOU õŽ$”<_o=sˆ,ºáêQO“c¥ÇiÓÈ2³xÒ'$æƒkñ ÑàŽñYÿéúrTv,œúe4¿®wŒÞê]ÍpÅãôx4z…>]C˜/X8ëgÒ,ŽüCÓøí™ '–1¨­/Y[þï?¹Äç]ê>EóšF(ØÈò×^äHº‰rýçóX¿PÂèËÖýß~>õ)öÎzœÍñ®„<²‡:•'¬_76ï[@†Òíc,­\Út6†–fÃE)“8üåÓÄ?°Œ¾÷Dò׬×q}áÿh_±HÉố¯pÿªIü{Uã,æÓi“˜öýf¯aF~Ìz–¯\C&kXµ>†€ã‹xýÕæÌ¶‘k<Ë¿ßS¡CÅ9|oýnšºÆñÝêXÇû%¹œ>v„¬Êg±’Gâ±#þûêŠäG.âÇ_ÿ ØÎýÛå_î,_Ÿƒ±ÊÃügHviňÙO||%¯¾ÒœÏžØp~ô3?z5‹–®$“•¬;Y‹>;ž`P„;‹þÌÖPâB$!Ô ÐdDF®àØ <Ü“õ«á•v„Sy”IHcÇsY°5÷Ч™Bæµ¾žl{ºÏ~‹ Xu¨ƒÿõöEŽ.†øÂ™}¬[½ž­©6`+ëËT“ÚÊ…õ,'#Ï‚‹¤âF¬T§7Õ ÅíÆ`¸ÇÍ|C‹O§§Ü¡ŒÞß„÷7ä­]õy¬‡ã³Ùŧ,§^”–÷Zî¸D¦•"NÑGò¬E’o%+SæŠÈ( ßß‹:ÁÀá8fˆf{ÜÕe!ÿ¬Ðáj°“• ¸0étø4öÀ Èž3ü(€ä?Î:‚ Þ”s×¢OÙÓ\cCÇ€…SÇQ›{Ს…Ä-̸7¾`{ºý’瘼FÏ®÷àî%â‘ÏþùPŸ!+û¢O!íZ`2ÿZ^˜–T\Ýù‘r0à^ã^<¼ûÐgâr†O[Îã#:8vÑ{WÅl,'‰Ür 02äÿxöƒ/èÞ¿\-د0Wêõë‚;ÇØôÙòÊ24d³F8n€œXDtº È'm×ZÇ’„J-ðw½š¯e‘¸eãJ¡ ñ¹x˜¾$û”©\ÅŸi³á…Ï r \ô¹dçFw :GdíšL—P: ŸÌ–öŒýr±[ߣïõ­™¶ŸÙÄ‚Ýv›6£’É1ZóëvèšóDç p¥z·ö&/çGò¯ëY… ûIÀ—Ê~ŽŠ0×lO¢ùcÝ©óÁœÝÉoûì4iJÅb¦U ö“€7•|´Î»ØÉ8~”,¿ÚyÓeP8¸´dpÓ@*„Aü^â ®]ŸËq«ÞŠœäÏ­IÅ/‘tVŽ}™%îcY—Ë–&2¬Mneš5ÐV®Éåuz;ø¡B¡øÇ Ž•ký)áf>}•@þ5= 98ý4ûÚ |¤ ][—m½–|ä\¯nÐ]4²{ƒô16w#.€5>œ’‚3Ûqé¹8új1+çc8¹±µxÅÇÁ ³¡`+pä­3hí¸ùZ8›´C3^àMiÐ{[܃GÞn¶ú!qyÈã^ê×sˆÜ]Ê):Là u’¬BAg( ÂR²jÁ.Žm¥àiV€|’{œ¹GûÓ ]Oê4nB½~M¨×£kߪċ —äã¹”¯Y‹VÇ3ù+’ ä›”d¯«ù†N§;4Hqn?7j™K´Ör•ìZlèu‰®6¸xå§NwÙà_ ë¾|…u_ý—úOÿĦO^ãÓßÐhòÑëiìv¹äYÖS¿3{ý ¾~¦Á?­¦S¿ê¤ý1œ¹×÷~‰Í‚ úK|^Wö#÷ì6Çþ†2|'äÇn'V÷ ûÓ=t=ï~U•CÛRW_ŽÌƒ‡I³q~™×u(‚ Ã ×•h÷œý3éºæ÷?Î¡ÃøxÃë|°ì:=8‹¹â´r•ÞÒ9»Nom?T(ÿF ¿h_âXSywÇtòYÖ}–ÂÞ¥é9|õ±knÑÈc¨ .Eí‡ÑÓ±¬ô|„ÜÈ\²î)GÓ†FL>.ø^»>%6Øivp7bÌ*$0†ºãíRühHÔ {_å0›ã. –2vå èP«¼t‚úù9t<–AÒ ØÂ-¹VÇ̺·+~E‘‹Á¬Cw“mxñ(jHÏqL~w8Íüô—Œ8§¯}•y¯ŽdOb>…‰Ùñåc|þT#>|þI6N¿(tÓa®;€*& e9—rd‚Ϋ)Íîˆ Èݳ”3…6rOí˜h„oÎ^Nì^ËñÝk‰:¼ŸÓÇŠÖäêÜñ)GÞá¬ÿøqæ<Ý—Õ‘piJÃæU.;ž*ƒ˜£Xûw!úê£0¤=îúË? zºU¨€Qç(‡ÁÍŒ+ÙÇ’èªõ¦Š¯t”kÑÙàÇo%­ð²`@à‚Ox G@šzˆL«Fûh.WI:k´áEqsÚñáÿbOi§‘H6æMge6T +ÏuøçUŸžõ dìßMÒ¹ˆÛvšÅ“~%³ù†µïÅàzi,ž»Óñ.\¬FA6xàqm£ÛyÇ×ó7¡tër~m¾Î· ÷7Гºs‰Nœk·&ïã`V}G¢êæé|2sé]Þ`ds31›¢Éw¢>yÇ×I(½º…–Z7RÀ¶ðL÷0‚:Ì$¿ç&wöuj¹.4½d€{€W±{!®·NKoÇœï‡ …â¶¢½hXR [\§-Ô,_ž+܉>aÃ-Üåªeúö<¬Ã\péZ“×¶m7âc?Ã'ãHÐå@"k¶Ò¿…;]~kH—ëÒ§ÄaÒ÷@3•H`÷~ŽaÔ¢ì•2̘î:Íš]þô¹×—G¶EÐ#Ù€°²kRjÑh¦s±%f• Ê{òðÚ:gð>{šé½9sÓlxž­˜ôãdû@ß¼DLŒ¤ÌËRu~Tn×±íìÖˆo/§k¹ŠŽNýìRÖü¶Çñ¼¨¯Ø|¸ëÕ éø?i˜G®Î_Ǧveñ¡p©Gë×¾ Ì-“¬ÓñäÚ¼ñ«l ÉH<{åîxËIöÍy—jïý‡ÐûÞ¥Û¡X´9±(]!™GcëRS£é<5-Ž\»žöEüôƇ$E}ɶãÝi_³=½§®$#ÃŒ¿;Æáÿ-&ÃÆEs:Á4k µÓ ø–÷¬œZ½ÚqJ‹ûh.Wi:—fCÑ—K †NyŠ»V°ùÈi²u~Ôð½<3Y¶(²ÌÇ€¹µ{•`]Œ‰{GLfxù£¼?uÛEAˆ¾~2sNîâõoßÇ”6Ÿ—w^¢äŸÜL¤ýI†½;ŽÝ³·“áUª™Købù)M#ÝÖØLøöM–N[Âú·Yx›6£§ð˜Ï_Œ›´lg¾èyÇYwƒÁ=ø®ÓzNù›¹ñ˜tÏifïOuLv9IkìOLøfË>XÍ/o1ws<ÔnD†¡ó¥Ã»Sè‘´šÕ»£I·yS»KCüÉâtz¡sËu^±öîIÃ8x† k²+’¹”¯VÄŸ¯¯ë­Ó²´cÎòC…Bq[ÑP„–V&¥ñÓðÓ9nÃTÍ“:|¨ZÁNNlQG­—Lêæ¬Žeá9d[Áµ’+ #Ɔè5æc)`ëÐC|31‰]KÓÙ3/‰ÝEkˆm…‚”QŸÆFH_•J"fZ=jbÏ3QlØRˆK-3žØ9»'—­A®%ŸMá×ùÙœµ™ðÒ“•Áº‘GøßŸÖ³ #/‡•ÏÄsø„<]°‘°Ïâˆnš /Ž@¢X¾ú4Rp¥O_ÓôºÎ«)a&àG¶Ç\¹nÒ’NzJ.‚r1dçäš÷Y0ámŽ- m§ØÿÑÃ,Y¼†¤´¿æVÈÛû>+×$×.~•ñõÕ‘’ƒèk {>|œÕö’eÀÇß‚ÄÍì˜=„ÕûÎ^ö,!'Mð*ï®ðÑ‹žgɆ„óAn©öÑ\®RtÖbCMWøVlÍ s–²aûnvÿµ†¯1ðóó]xjñÊ|0€-€noÍã÷ß¿á¥:{ø _gÞÙ}ÙÜvÞ>f½³)ïNÌ·³ã*‘¢-~#F|Kt“·ùaé –ÌOŸú~Ú/g±ŸaÙÓ­xhÆ)Úü÷'ÿöC½—òR»ž|éä¤m©ìÙ±_3sk&X¢øqÆ&¬…øóx¾sõ±§²üéÜ?q5F}Éï+þà÷™½±^Í–sG]èÝ0‚éõÖ<þØøÛ·¬âóÇ\ù}l?ÆmÎqn¹Î“Íæ7‡óñîʼðÕ"÷&^zAÉu×iYÚ1'ù¡B¡¸­uôž·Šèõâ¨]Ñÿu^^Ò{™ÛX†v48ùYF©õ~„L޽W^šQQ"š»K¹ª®PÃ,*]Ðá¶“›iC§‰^: ´I,És¤¥û5ü½K˜¼)’·¨›xkHïÑ|ºÄäï”15Mw)¹ñ¢üP‰’»Zn©ûAõåýòW(åò8“î5Ìø¹)ilÚáäûôìV޽É·ÙÕ02„G\4B>?’÷^ɾ-ú¹©6t:ª´kŒHß²’ô;îVBeŸêó>uhæ…¡|[Æ|2 û™¥êR(?T(Îá– –u&áÔ–<|¸¬‹…Ä5©¬ùoQ7bÙWa!‡&þÍáM”7ãhÀ`±r62—Û5¹é6t†Î>-¨_ÛÄpdG,6õ^ÞAöÎ,hiÁ{‚Gã×øõÏ!YÙöåt·LQ~sÓ17aƱ¼\|’Íÿ*G›g¸«Gù¡Bq÷Àz …Bq½‰™ ºaT2w’„Œ¨?«>‡ … – …B¡P(Š;½sr  Í˜˜=&óeZ>?Ï׿³Êu79¸Kž›ö£#T bbÀ'kX;½Êʆ …j3Š›,ËÑöéÑ<Ù¡&g(å]‡ý{QßGÿÏZÇXž£^bdç [¨\zÊ÷ûž8k:kFÕ¼¾Ën§¥Ê3ìAŠ$c~ǵ̥ºf;F½4’.A¦» ì¥ø†Á›º;Ò¢ºgÙÕº…ßåkõk{˜³mèJõ‡¦³úX:V¤à Ç7̤OEÃ]ðV»Òàýhĺ’Þ>e¯Ó›Zï·cÿuÍÝùíßfÞš}î­ÖwkÓçfúó­ü‘‘êcö#éßÓÎóÒŸ‡>·ÉX@ÇÐ:¹7ù7‹~›JïŠFî$œS.^Õ 1øæÏÝÐ¥ØNÿăõРÉý|{w}Ñj/û­ç7ã]¾}ÃXí)æ/Ã=>`Pç¶´ï=Œ·¿]O¤“×õz4|‰Ÿw''‚ˆ…Äß1ª±w.‘¾}`-°‚%‹”½NoÕz¿Sû/Õç^o»z«µÏÚô¹™þ|+¿;¥hd'?31ºaº¤UÕat5"ygɳ«òæb!jVGêl&ãà!òîšb§u0 \ 9w·U¹Ö²+߸Ý|íjKêèŽ1ý­é,¬>žº2(¤õ].͆NL5<«ÌúcC­öY;jñÎÁsö±°¢—O™ô)­Ý°œŻÓç±|Óv¶-ÿ‚I?Ä@@(þšgÚËÐhö§RÈI!ýŸ>ŽXK{XZ¹œÒ9±]ÕèZÚÌRû8­èÌTïû6 þŠ!»È6…gòýÃÁFîJ+—–>Nc]”“8«Ï½µúnú”ÅŸ•yä—xlyû™ÖÆ]Yß?'öZ|þZ)ñÖ¯n¿KNÁJé탸”«+÷6¨"zW¹ç?ÇÅràe©iºp»‘üý‰<= ‡të7Rfï*IŸ/=ütçóÒyÖ•>÷‘Ž-›IóöåõÿK±ÿ%ÏU3:ÒèÜ¥R­ºÒtØ É•“òQïR¯^=©W¯®Tp)ízžÒfnŠHÆJyûáŽr_³û¤]ÏÉÈam¤œ¡([#™#’øi q/ú;—:¯ÉÉ—Åݽ/¹µIÒ×Êôу¤wŸÇäßK’D$R&66k–Ær™ïýPâÄ"»g='ƒút‘öí;IÏJÛJEö1úJhX=©× ·Ì<)’1¿ƒxsÓ”ìŸ"õê*=Ž’O÷ZD2•~ú¢[þ¤ûÜÓ"rL~?Hztî*÷¿ø«œ¹¸ì¥Š›Ü;-VlÇJM¢w’šÕˉ«ñh=WR ÖÉÀ} ôü&QÄvX¾ó€tï󄼿&]Äò—Œ sÕ^—•ïªe7É E™"…{äóç^†É[?FŠ­LåB0†Ês»Edç3Rµ¨uþýdY¾ÈáWj‹‰P®2Ü"vÕ²—Á7·¹JõG8[š,¾¾xèÎùª´›-’ó—ÌÑSÚ¶í%Ãgm—Zž¥%^—}êHˆ‡^»>ZÚËÄ­æò[Jž4cûP IDATì|³áy¿Ô"šú‚2ú©rýD„x\K–%M‰·žjhµ”Ë)ý—ÛU-¾¡©ÍÔÐÇi“„[*™"»dŠŒ~´¿tïÖK>ñ´¿ÏýÚƒ‚«ÕE“rJ2d~GO‡Ý«>-ÛEdÿ¸¢Àïš‚8½?µC¬‰ŸJ w£Ôxq¿HÁ ¨—€k%ÿô§ÒÂ1†Ž’"²ë…知óí"ß9óu[‡þN –M5^”}b—­#«ˆáº‚S“Ôxq¯ˆm“ vÔ©G«/%EbeÚ½nE¾ëär]o0XßXü°t·JÒ­ÑòíàêâzQC•²Íš)¿ß_Nôç~nª%cŠdýÜÙáóe’|^“ d-ÏÒ¤Þlûhn7@\ª•ÿ%fÉÎ÷ÚK€¾lºjé œí?7#XÖÒ–¥\××9±]ÕàšÚÌ2ôq%ŠW{ù6U$gù£l(.&(Ã;XBw­uQ\Lr½}î­Õw—íÝÑfC©Ük¼L™8\šùé¯ÙGnv{X)u¶Ó–•D–݈9à>žl•È’! éŠÙÕ@Aj*yÅœÒ\˜°Ÿ|©ìgºh«oüô'Óò±ÙrIÚú 0áîæäIWIg娗Yâ>–u)±lùa"ÃÚ„à¦sBÞYXvІODc*˜nð³œDAÂ~𦒣.Üjv¤.1,_{WzÛÉ8~”,¿ÚyÓeP8¸´dpÓ@*„Aü^â À\³=uˆæu§Î?KÎîä·}vš4¥¢7\»UoE NòçÖ¤ë¼åÎB̯sØ¡kÎ+`À•êÝÚ˜¼œÿÉnn¹œ>ãÜû{VOnɶamöã .^²j®Õ‰z/úýš|~jR 2%<«VÆÓ‰¯êÍ´¡–g•EŸ’lxËÚÇX•a?Ì¡ÓÖaô~k©e\c¬¥/¸™þã´÷AC{xóÊusÛUMm¦“ú8—Êmháogۗˈ·9×ç/ïã´r£b’kÕçæôÝ7‚Bâ–NfÜ_°=ýÆldû§ûÜR=Âz6ž ›‰ mž¢Uül&üg=AßOM/8—^ìµÐb³`C‡Þ ;·X“1KVðnëS|úTWšÝÛ†¾Ï}ÍñR,!gÿLú†sßàYì x7Ä»d4õÝuçÓØì`p1–y‹N§‘2<ëF¡1» ; +ªmÁˆ…Öë»&?v;±º`"÷ghèzÞý*…6CÛR·A92&ÍvAO])õu­uqi6‚ Ã ¿~»[OýÎìõBëgúìB§~ÕIûcr/µÿM)—“}þï[æp¡ûìox±±×%)u:=:˜3 ááá—H݇#Åî|=u7Ñ&:'éS’ o]ûäsxΆ¿¶”¤køšÔÒÜ|ÿq‚…5´‡7³\ÎkWÕf:©³Û±‹ó}þ²>N[ô~-1‰ÎIúü³}÷5ëóÏ¿­ÿ˜¦¥,g&f ¤ýÈÖ$|¿„ƒ›¾fK¥!<fâllºö¯smºFÀÁ_áÃ_7°kï.¶lØMòÕ^Í‚l ð Àãú¾î¤ m >à™îau˜I~Ï)Lîì[4x˜Nl:Ö­EYŽôÓù5ç†zRwî Ñ¢ñYN.ö² À=ÀëšÎ.ˆÛE¡th^þºŽ¯±&ïã`V}G¢êæé|2sé]Þ`ds31›¢ÉòޝçoBéÖ!ä¼®:ß&Üßà"–¥.ÄJ¾̾Wèžw|-‘„Ò«[èõŸai;ÍâI¿’Ù| ÃÚ÷bp½4ÏÝIÖùg9¹\šºø²—Å7 cò\«¦ŒÙܘ)›–ñJcÏó ÆA´°}ø0‡/’È“g‹ý8.þ,Þç5ÙÐIöÑò¬²èS’ …ÓícMçèÞƒÄä^[G«¥/p¶ÿhòy-i®³=,K¹®·wZ»ªÉÇ´·™Zú¸Çã·°#Ý@‹'»d¸9>_b]”!&¹Þ>÷Vë»Ë¢66Òs“ßN3¿kïìnjqMð%‰{KùÝž#bÙ&/‡¹”áYÚÊ¥}­§´û&U¤p—LÖWz?4BžîìÈGK]«ÉÈu"»åÓQ¤×ýCäÕoˆ¥¬ëž !2|‡ˆHª|ÛÑ[0Õ–ñDDdV3óe6ŽÈ7/=$½û?%“þL±l“±çl¨¥.΋tû%K$o³L|´ôZž¥%:ižVûhm7\¼'Q""éó¤ƒç5¬ÛÓÒ8Ù´ù¼–4%mvÒЖ¡\×Ý9­]ÕàZÚÌ2ôq%‹‹Ôõ§ä‰Hܲ©2zp_éÞ­GÙßS-}œ–º(CLrÝ}î­Öwkѧ,þ|½üœØ_ܨ5Ë¥ËÆê2f¿ˆìyAªЉ_ÏÿI–¤ÈW­=Êà¼:1×þ—ÌXõ·¤:Œ*–lIŽÚ$ÓZ]¶³Ô}òÙ•lu¤Ë9!ËÇ×7ÍMEéùÁ29”b‘sdÇn“y/·ºtS‹k5ypÆZ‰É-JdÏ–„ƒKåõ†æó;…|¶UN¦ŸË'Wb7})Ï6ó»°ÉCë³4”«,•l  ³·%‹]D$?VV¾Z”Æ×ØN^]x@ÒKÌÁh±H®üÞÍ« Îc–&3N‰ÄL•{Í$äÉb)øCî÷¿¨q«!N[%Q9""VIÚ9O^léÁ†Zêâ’MJÉÜ=Í%/æBÙAp •þï.’ƒ©¶óuvúÐy­ù^ƒ„ ùS DäääFWúŸ“Ë¥EJ,ûµø†_Gù8Vľû ‰0ŸÛ¸TI:¿òƒl‹;§tž$îž+_ËnâRÞe-6t–}´<«´4ZmèŒ`Y£ÎZÛ cåÇä·$»dn'õ\¯Á¾Zú§û6Ÿ×’¦ÄNZK{¨¹\×Ù9±]Õ䥵™eêãJÈò:N”ÿí:%ç¬hK;*Ë_k ý=-SpZR]”%&¹þ>÷Öê»5èS6V–G&ˆ=ÿ€Lk[†S“n@ñÏËJî ñhù¹$É)™ÑÔ¬ìq±]šO—˜ü2¦¦IÙC‰Õ*Q¢|õ.uç݈·¦#ž¢QÚ!Ž%åáR©)ƒÿýåcf2ÿ°ºÇGïS‡¦a^Ê·eÌ'£°Ñ™¹Qå7 …j å«w)ê«ánS5ybÁ!I=7«V˜,—L’kš¯cúäίßH¼ˆˆå´lýô©é¦l¢D‰j•(Q¾z·Š®è …B¡P( …â2ôÊ …B¡P( Åm,ëý[òÜ´a¾­@›11{LfåswîËt'øªB¡P(ŠÛ+X6–kǨ—FÒ%Èô™¨|¿ï‰³¦³fTÍbn×{סCÿ^Ô¿ÚíÆr´}z4Ov¨„sJáJƒ÷£ëJzû“D§Ç¿²7UŒ7¡’5èã$;_/†*ϰûÜuµ"dÌï€çã« …B¡P(nr°l¤ú˜ýHú÷´ó¼ôç¡ÏíA2ÐÑóN7‘¯já„| ó/öÖ÷&ÿfÑoSé]ñf0"X ¬`ÉÃ"W×ù¾©]IÞÙEÃbtÃtÉ]®:Œ®F$ï,yö;ÝD¢fu¤Î†`2âÖ8œÅFvröì²mWO¡Óën)}n;[Òˆ:˜.…œV'í( …B¡(}©ÁrFbtÅxy°ìfº4Xv«Î“Vp4S)$á¯oÝÂï’*tbüœ%lJ!ÛR4n‰ã§>œË^ï݈g¾ÞN¢UÉáè/OQýr¥ýZ0fÞò‹ò(<ËÉ5¯ᦵØ^tû=û¦A”»,¦t©7£–C¼RÛtaÊÞšÎß»rôÛ«LÙ{¶ç‡³BÖš‡ñ"Œ÷" ÎOñÿýVÝKFuÝzýÀÉBAÄFêþ…ŒoíK$ldœJ!'5†tË¥õ4¸Ö¤ÞlìxrågÚ“ÔkR?¬"hf>gg†OiMÔIÇïR6¶`b/wÜ.Ê˯q(S¿hÍ¡C½ŸÔëéžšU‘@½}´¡ÉΆ úÏþ“Cñ™ØÄaÃ3ûòj»ÀKG¡ufª÷}›Å]T…gòýÃÁhówkÄ”!ñÓ¸Ÿó‹:¯qDòYÜÝû‚jðULAtyãgö$[òã6óù°úxêTã£P( Åí@©ñƒ%;|½;F¸”«Ký "$at5^IÔÒó³-,|,o^Èè(oÚù6†áR¿-S# GH/žÞ”Ù/òÔÊ¿I̲ãàGöÎ Çùu† ú~=Ÿôˆb΋ù¿xÏ;õ/‰Ni5m1Óûìá!X‡K`(aOqZs fáLÔ¤f>FH5Q½¢…¸èŒþ¡øÙSˆJµ`˘πºëqw­ÎÓ‹3äjYålglÓzÌh3õ_…ñEŸ~|~ÂùIQ\¢RÔϼþÚb¢mUè3a&“ÌêƒYž^öµ 9{fóæ¤b /þ©ŸÊò-6‚ëá ¤d°ñ˜;`MÈ"ØEg쀉Ð'²÷«žœ]:•×ÛÌÑ žA•‘]g°:óÍÑâ«:ÚMßÌÊ'’™õb_^ˆÔQçÁ·™ùÕ*Œ'ëðÔŸêÜF…B¡P(nJ<ˆÙ½Õ’\¸Nî÷÷•n?gˆÈ.y¾š§4š|R ¶<*tˆ1t”ì‘]/ÔÓ¹œ}»ÈwgDÎ|ÝV<5ÞÙmªñ¢ì»lYE E?s©óš‘|YÜÝ»èny¹¥E$jŠ´ 0\ãÓz ~j‡X?•îF©ñâ~‘‚2 P/×JþéO¥…ûEé‹îlϘßá|Y.ÏŽ $SŽÈku\®üýUî|77)ñ’&ßµó¸h¤åôbMê'Ñïø\vÏ;âÕª±¤$õkt \I'`ã:‰5©ŸX7Ô’Ú&‡Â_é,Ö¤~’÷K°›Šîªws‘Š>úsðwIv¾š ›ÌS’!ó;z:Òxµ—oSEr–?*Á†ëx–[#™#’øi q/Ƶøª¡ÊÙfÍ”ßï/wáîzS-{P$ëçÎâ¥zW¢D‰%Jny)u€-+‰,»sÀ}<Ù*‘%;BÒ/³«‚ÔTòÌ5ÛS‡hþXwêüHªœÝÉoûì4iJE‡¸UoE NòçÖ$Š]ú*é¬û2KÜDz.%–-?LdX›ÜÊ4­m'ãøQ²üjäL—AáàÒ’ÁM©ñ{‰/¸±_(… ûIÀ—Ê~7ûä=ÁMüðì»cXqZ‘ËNs f9ê¸_æy²Š*Öž_HbÆ­±P½ a? xSÉÇaC—Êmháogۗˈ·ÝØgkñUs­NÔ3xÑï×䢥#‚eJ8xV­Œ§:å\¡P(Š[žR»këÙx2l&*´yŠVñ³™ðŸõ=~?5½àl\úESÛ:®{¦‚C‰›Ó„œý3éÌ}ƒg±/àA>ÞGì’ÑÔw×®A~ìvbuÁD4îÏÐÐõ¼ûU m†¶¥nƒrd §Ã»Sè‘´šÕ»£I·yS»KCüÉâtzv—ågÝ ÷à»Në9}äoæÆO`Ò=§™½?õÒ©uk {÷¤a< Ä5Ù É\ÊW+âÏ/;É?¹™Hû“ {w»go'ëU3—ðÅòSXnzµÚˆý+“‚ánxtoÎñÝ9$‰ !¶XÚ¶>ÈîG™¸#˜iM+2W7&&¨l øþ½XNXþ!oÔ`çÉÚÌ¿ßZËÀÙ?ò×â{™2oGS-¸T¦|ʾ^•p!@µ¤p02Sï×ÿ¨ŽíöJÒØN³zþ^˜<™/Þ*dö¦$\Â_â‡Z|Õ»€×ç¼ÆÊwÖ³²Âùlù!Rñ%4ÌÝs>g{ÆE#àž­˜ôãdû@ß¼DLŒä ovV…B¡P(e¢ä…ÍÆê2f¿ˆìyAªЉ_ÏÿI–¤ÈW­/ÚœæVCœ¶J¢rDD¬’´sž¼ØÒÿÂÆ& üÁ5Tú¿»H¦ÚÄA®œ>´D^k`vüÞPQz~°L¥XäÙ±ÛdÞË­$@_–Ûfi2ã”HÌT¹×ìØòäF±ü!÷ûë®Ho  ³·%‹]D$?VV¾Zÿ²sf©ûä7²+ÙêP*ç„,_”æ*›Óô‡È6Yÿ€ß Ú,ç!Lk+ñ§ú96îê)ÿRG™‹žïí+#?l#ѱŽß§nn!ïõò¸¨L6øeWþ¼Þ7Zе³Vê<¤Îƒå»NIn‘ØÒŽÊò×\±ÑÑ¥úc2wOš#Q^Ì¥uêZMœ±VbÎebÏ–„ƒKåõ†fí¾ ‚©’t~åÙw.£¥µDtü.ec ™ØË]ÜÎ?K'~Ceê­åСÞò8ÝSͪ(z-åQrçÊí嫆*ÏÈn¹@Æüây•r™B‡ÉoQ™b+J—yl•L*®ªÎoO1„ÈÐ? Dâ>–ö¾ºbÓ•Zï† é?ûO9.MÎì_(¯¶ ªíU¢|U‹¯úöýC2#ß’z.W–«äþBÉÝ"FMá´GC†ô3³nØvR¢ø)nC{†ðÙÇ'±àI«i‹™Þgï éÄÊè<\C «xŠÓG<žŸÊò-6‚ëá ¤d°ñ˜;`MÈ"Ø—w“rJ2d~GOÕö*Q¾z=¾ª¹¿Pr§‹†5ËfîÜïóØvV€<"]IFÃÇé\±h1¨¤³rìË,q˺”X¶ü0‘amBp+Ó²#=ÁMüðì»cXqZ‘ËNs f9ê¸_¶Ò(ÏBVÑ×=¿Ä 5´qwsçúª)¨oüô'Óò±ÙrIÚú 0áî¦Î5¸-G(ì6ìrê½ a? xSÉǤÚ^…òÕëñU§ôŠ;b†¥Ôna<Ð;N H² "BöÆ')gjÊ#mŠ2röϤoh0÷ žÅ¾€ùxC±KFSß]»W]íeÔé@ ‚¨ªŠ;ÞW¯¢ƒKÆ,YÁ»­OñéS]ivoú>÷5ÇUß¶X’"I$€÷úɵֻ݆Еá;Jµ½ å«Wš3ú Å],»TïCÿãLêÞ€ððp‡ÜÓš—vèhñH |/ò)H`Û‚x¦{Af’ßs “;û^ú%™ãøªó¯fÆ£èo]= ±¿#4@ß° *è@g¤Á€ ªM!R ¸S}Õ^@v¸xqÅ‹¹6]#àà‡¯ðá¯صw[6ì&YUùm‹-i- öBãqÏÓÌ«˜N×Éõ®Ú^…òÕk ™5ôŠ;ci¿é<€šéX²i?‡s·%ØçñÑÐóÿø3Û—ïN¡GÒjVïŽ&ÝæMí. ñ'‹Ó鯘·ûW&ÃÝðèÞœã»sHBl±´m}Ý;Ž2qG0ÓšVdþ®nLL6P=Øðý{±œP êwª¯ZSØ»' ãà L&¬É®HHæR¾Z%ÿ¿GMà™c_²-!—* UÅßžX¢øêùiŒØø2ë6•ãi Ù•¤§Bxkš~Ë+³’ïÔzWm¯Bùj™Ñií/wÅ/jÖW’!mb]7HÊë.ÛHÕæk9# 2«™Y0T”ž,“C)–óG`eÇn“y/·’€ËrñG¦µ•øSEG¹œê)ÿRG?ÆWF~ØF¢c¿OÝÜBÞëåqÑ"ÿ ÷³¿+~£€’»\î_5† ÙÛ’Å."’++_­_”—N̵ÿ%3Vý-©…EJ[²%9j“Lkå©êþ¶ƒÜ7J¾X%™EÕšwj›|?¦‰xë4ÖûU6Mé+‘m"²þ?Õö*Q¾z=¾Z–þBÉ-:@­FS( …B¡P(®‚ÚJ¯P( …B¡P¨`Y¡P( …B¡PÁ²B¡P( …B¡‚e…B¡P( …BË …B¡¸=?-ŸŸÆŒçëcVÖP(ŠÛ XÖéñ¯ìMD£Šæ·67ÕW]ið~4b]IoezÅ…f¼|¿ï‰³¦³fTM\®% cy:Œz‰‘ƒ0Ývï…Bµ½ Å-,ëp¯ó ïý¾¤BA$—Ä}‹x`5\®’û¦v%yg 󸶆_q7· w°¯ Ö+Xò°¨•¯^ä‡^Õ 1øæ_ü•Ä7 #|d IDATÕ†+_U>¦¸³0jIä6šå{fÐ2êGÞyê-v¥{Pã¾®Dxé°ßFuçºâÚ¸³}ÕFvröì²mª®•¯žÃBÔ¬ŽÔÙLÆÁCÜ 7S«6\ùªò1ÅF)7Ø„ÈÐ? Dâ>–ö¾ºbÓ™B‡ÉoQ™b+ºå&óØ*™60T\/J£÷k!cæí„ü¢D…gåäš×%ÂÍqPÐàvŽÛz®&"¤ÙùÛ{|dø”ÖuÒñ»”-db/÷‹nïщ_ãP™úEk9t¨÷…¦±¾n9S¢¤Ô‘e}….ŒìàÂþ§±élñs¿Ö3[™ûú#ÌŠK"Ç¥ ^ú„‰?ÿDtVÌŽ¶ž´š¶˜é}öðÎN¬ŒÎÃ%0”°Š§8mqÄìùñ©,ßb#¸^¾@JY°Ö„,2l€É“æ·eJ=X 8«§Ví ¼2·-U†¬eèŠlèêR“1}=.+Œ K!¹võ…t'r7øjΞټ9)†˜ÂËKUšÎŠÛÎWõôül Kã›—2:Ê›vc>ä£a¸ÔoËÔÈl óPw=î®ÕyzÑb†\%SÅf´ªü7¯wCâ“¿2wà!Æ÷ë‰þÕÿñÞ'òSËO‰9ÿÌtÖ|ð8¯G›h:r*þŸ½3‹ªÜÿøçÌ0Ã6ì.ˆä¦WP#CQ”pE…4­›Þ²L-¯¹¥fj™ý®¶!j¢•VZ©×%˼ššæŽ"h †(‚ì0,ƒÌ0Ë÷÷Ç ›¢ †8À÷ýz=Àœ9ç™9ïóÌ÷yÎyžïÿƒžê…%±eF];z]v¸ú4"_ËEÄÜÌNà5þ¬ýö0ÌR¼0åh§§mÄvUê63§ƒ|Ý\L‰¼†ì¬œ ¸`8Fž/“rŒaŒY¶|z ¥S>m`]¿(Üc&]¢r:8ÒNÿ?Á‘ÆDª‰’Âh “ø9èû­AšœPJ^fW­¨/6þ½IžJšd?šÐN @L> ‚ô=Â]ÈSR3/|Ù®ä*1ô4-¤äl'â^R3--ÚU£ëÌ¥©¸jæ1ƒ.QÌìN$1üO°B?äåm¨9‚l®mdÙvø>ºSö+°9?Ašâô¬LLnÓ.&û+êkUõþ²½Ãȶâ½6´1›èöŸ%c¯F¼.ÄîÓ(JSL¿Œi]9ÒIšGT²kð}ëÌåÑ´«–O­¢4Ê¡ }­jy~Èóõ8ãÂ¥òÎm‘´N ¨ÎºÄe–ì<‡”%´Ú;È9» >ÀÊÂp*DäüyØo5ÈSqfÛ Là‹z=v$‚«¯èboáPÐ"á@R skxYÕ|‡¶LÃÈšNYŽì"î.6Û^_KvµAê̘’«–Á ÉøítTÜ Û°çOœ|Ÿ†óC,[¡Ó ˆ FˆD¸¯"%Wp N ;ïÞh+1òÚiÄë²Kº‰mús.´D "Py"º²í!ã%µ]­ cÏ—)9Æ0UVÕ:'Ùp‚Ï?ZÝ–µÔ söÂòþéørÊPôyjBÞÚŒw `—^^‹Wô?Æcý‰4¤îŸ…VÆÿ¢×vÁ ô >ˆï»µXZ¶« SgÆ„\Õƒú½:¶Öi¡ÕêŒvOTnlÔµÓx×… ˆ ÇöB÷îÝk”'_Ü9Ç;ìjœ/sŒaŒ–µ9ǰãÐ{ÁLô±¹OCl鉡Þ@ܪ…Xõó Ä\ŠÁ™±È­MbU&¢v|‚éûÂ%p-”Áaøl°}mT¥úVÎñ KXi.à :dD¢€¨§;‚Ú €`Ÿ±.è‰r$”ñIm©°«ÆÕ™i®–Ý8ŽkðÀ°@·Êµ{_Œñ!ÿB4²«?‹®SA¡¬œl¸NrážganÿOUÜ8<ƒç{V;V=®Æ¸.ÊnC\à­CòÕ«¸Z­$¤Ü††5k¼vµ¡Î—‰9Æ0Ô½tœ: ßÎ Ç´“óðÇ©ÖX¾19"´íÞ¾åßcáº8(•7q2øpÆRL¿þ ¢2•º÷D+Ù•-¯=—‡aDΉMF¡ÖžCzÂ%È*¬>[I‹ÔsÅPMµ€õðgp#¶9$…›6ýãˆÑ®ÚÛc†aE®]ͨ°å£TÜäÉL-x¤»jt™&ãjê,ýþ=ü¾_‹>Àî›¶0+ /ÛÂO£P#ÞÕÈqébÌ&,ÅÒÉ„ßÎp+þßʨWµ,<uæÒD\Á¢?LI¥DDʹ°•æös¬š U}"”ÛXZ•K:""e*E¾Ûƒ,îšà‡jÞ¹L>OšÜÔÏ ± ýê,¥Vøs‡RO}CÿîãPíXF\;}]HÚÑà…Û(*íNÅ7HÙ±›èW3ö«‘]­k‚ŸqçËã àÕu†a†a¦6x¾0Ã0 Ã0 Ãp°Ì0 Ã0 Ã0,3 Ã0 Ã0 Ë Ã0 Ã0 ÃÁ2Ã0 Ã0 Ãp°\ÛÛÂÛݬ>„9|>Ni"1ÊŽ¥a—‡ î2ìªiÂqË`å5ýò'rÊ Dwýç^|<î ˜?–j‹ÑwåPä^ÄÞÉÖ>òã4*  .ƒšÚ3]™Û>I èˆ@¤CQrv,ƒÎ–B3ñaWÙU†]5M8NhñÁ²y×Y8xitŽÃÚ)¡ò:þókmè[ÇShÄ£i¡È-N!‡BËÒ˜ì`„yxv´FÌ;Cà83¿¹Žn‹~Æ•ßæ ›EsðaWÙU†]5M8NhîÔ‘Ì^=ª"J[Oƒì…ûn'nDïlÜOç“䤨H¥N££H¨ÌÞãBC–좋¹""R¦¦ “{L¨ÚÄc2íI*&­aÅ×Sø827d÷q™0PŸ­§¶rÅ›úTfï±£©aý))Eÿšü¤­iU-{@½=hå×ý)>~TÕ>²‚)>™ZÝ•õÌ>ä7*NxŸºIïýì"?š³5š2•†J—ߦ”ß“·g½iÌ"vŸN±¤¦C#í*ϱM¿Õ”BJ:ü/WlkÑ‘žÿô%•Sæ¹ïi–ŸCͬh‚%u ù€vœ»EŠŠÓšG[^t%³Çè!vÕä]}`mhØ/wHwêŸÔZ¨ùH»-¥Du<-ô”°#ìj“t•ã„æ[Ìê¾3oJqyn8Nݾÿ½©ÛHÌœ: òus1%ò²Kt°rr€âB‘>E `‡«O#òµ\DÌ Áì^ã?ÀÚoÃ,Å SŽê·ÓäŦÅ‘–ƒR©;‚Þþ+víDr'¬KÖ@™‘ƒg´píæo{ò"œ¼®†€&³EZfo@˜¯Шp=U„.žm±pSÜ'ë‡TÐB€ËΘb}×–ÀQ]Ž;w ™—^\‡÷>½…[åwrüÃ÷aõè‹X6)‘Ée¶ò@WçtdqþùÇÞ,‰þ_þ5Ë'õ…ý¶Ÿ/´BðWg°ûå|7of%ÙbàœUøüdWH{`e‚ €¯íÆ¥oƒqûוXüòi$ÊÕ¹´ÅäAzl2ìªI»*ª«Îjä%å:»ÁÎ È—¸ £³iÉr˜9zÀA'GR>7œìjÓt•ã„<²lùôJ§|Ú<ÀúÁÛÕ‘^ì>¢4Åô˘ÖU=MIšGT²k0ÙÜ/š÷˜I—¨œVöjõyêû­AšœPJ^fW­7©/6þ½IžJšd?šÐN @L> ‚ô=Ë]ÈSR3/|Ù®ä*1ôþ,¤äl'2¾Ç!8Ò˜H5QR ts̤F@@€-P]}—¼$ 3tˆbfw"IEÎwû!ôCQÞæ’›Aô}>QéÁ‘«øAÇ4!¹°«&àjÝu‘ë”hÒdI~VfÔiîe"Õ!ÛJDN㎑2ëKò³b?ØÕfæ*Ç M¾ÔùÌ2é´ÐðwŸW·ì„nb„þœ -ˆTžˆ°î€¬C{È 5‘¸ Ã’çR „V{9g—ÁXY;'VW_8ÐÅÞ¡, EÂ,¤@çÖð²ºëI£25J ½;²ÙEõΣBDΟ‡ýVóñ‡<g¶­Àän°àÇM AB,;‚’ñÛé¨èÐÓí Øó§N¾OÃYHÛ€Ÿ£Qß@ÆC?{ÖÈ2ìª ¸Zwu(º‘ˆO¸È\1äŸÝi?LxºÚvu2.!CÅ °«ÍÌUŽšÿhñߺ¦D‰c{¡{÷î5Ê“/î\@ê…9ûayÿt|9e(ú<5!omƇ*¯íš€Ô 3U ¥—×"ÄÃ}'DàO§ñX" ©ûg¡‡_ ‰3þÑA mÆuäi*mÀÏŒNß=$ýM3ÓC†]5W\geêy¤ ®ðîý^õ8ŽåßÊ1àÕ<éÓÅqWQÀ“£ØÕfç*Ç Í>XÖæÃŽK@ï3ÑÇæáOjÙcH€ ¼uH¾zW«•„”ÛЀ¥'†zq«bÕÏ's)gNÄ"·–ý©Jõ½CÇ',am¨–¹L 3è]ˆ¢žîj+‚|ƺ $Ê‘PÖð_$©2µãLÞ.k¡ ÃgƒíÙ°ÇŒu¯)x³[9Žÿp· (»q×àanT4—ö¾ã#Bþ…hd«òŒ3ˆ.Ãïõáp©£‡hj2ìêãtÕ˜:krÿD\‰BfÍ@‡Ó«ñÅÚ­(²oì³,‚=®øš>›õ" í߇žî;˜&®8N Ê£Mu<çÍåQ<[G½ ˆžé7˜ÆÏùŠ¢DªÓ è–¶¢àﲉ´Ñwo¿@£ž›BŸ-$RGÑü®Rþ¤ÔyÆQ*#¢´+iÖ„>l…N˜FS‡¸™)zÈ…]5W©³Ø¦FåÓ÷ÏÚ$žôÎ"¢LŠècÉ~°«ÍÏUŽšC1f#19õA_ÿ‘DņUOÊÒ£hË_²Œ –‚¤ ^¸¢ÒîTì…²c7Ñ ®f•¹¥çK´æð5Ê/¯X~NA¹I§(Ü_Vs_Rkš@é†%aÒƒéÚ^Ô«ri{zcÕJNÕ¿žÚ>i]m²@)bg þäÅË+ÖË#R¤FÑÖyþäÄË~5îømÇÑΛ¥•ç¡8%Švþßóäiu×’‡h|øaJ*%"ÒPÎ…­4·Ÿã]KY“×øôSL:Uت-H¤ƒ‹|jN81¹°«¦âju¶$ß5éD·VÒS–úß·×O’ZõqØvµù¹ÊqB“/Â}b†a†a˜ˆ¿†a†a†á`™a†a†a8Xf†a†a–†a†a†ƒe†aj\¸ŽýðVøç˜åmÉ_î2 Ãp°\ ‚ŽímáínÆ?Óâ3k=3Þ~C\$|ž˜fìª9|>Ni"1ÊŽO3ûÌ0&,Kà¹ð*ˆèžru¡'ÏOµ}WEî…@ìl )ŸG¦ª•…õ“/!ìÀUh D:&þŽˆ OÔÓvŒaW?J¨Ë æEN Öý7!’°¼‡yµÿÚaô-èÂ4¸‰ù÷iþ˜½¥êÞœ‡¨ÒŠèp'3êÇÖñä|ê̽Xt›‹C±áx&ñ;,zá-œ+”¡sß¡è^ª„–cØÕ&†ŠÜèr(´ìL‹éFrÛ˘d×ýEBž ¯•ì¢ ›¤ÄlDïlÜOç“䤨HR£N££H¨ÌàçBC–좋¹""R¦¦ “{L¨žáÇ’:†|@;ÎÝ"…a7åyq´åEW2ƒ@.R[ÖR®xSŸÊ ?v45¬?%¥è_“Ÿô£#­ªeøÈ¡·­üº?ÅǪÚGV0ÅG8S+ΪÓôŠØ^=VN”þÚß?»’Äc2íI*&mEFªë‡)|œ™¼hlÇ\ŸŠcõ¢é›ÏS¶†ˆ¨”R.'‘Š”´o¸mµ ™F\_\ØÕ&æª}ÈoTœð>u“Ö’]ÎÁæl¦LeÅÅmJù}1y[°c U¬ûo¢D ?`Ò‹1×î6/W ¥—×"Äc7žó &½:ëO,Æ'f#h|®Üᆾá(Cf|,b®¨ ÛÁ¥HØóï;Ó2h´ñ¦²Çxë|õ*®V+ )·¡PžqÑ…bø½>.u,G£*Õ·¨ŽOXÂÚÐ.›ËÄ0ƒÑ…( ê鎠¶ ˜Ág¬ :@¢ e|â›#ÚÜ?ðßX ÷¼ÃWvŸkKO õâV-ĪŸO æR ΜˆEîãr̈ú诌æqße”Œ¹¾vµ9ºJªLDíøÓ‡w…KàZ(ƒÃðÙ`{–¬1Ciþ}gš9Æ,KÐéÞ—Vk¤Ê²‘x#*#zršÔX¼q"—GdÛÿૃñȇ=<º: vãœ/" ä4>|ÿÆ­û/Îí{ a[O 1_ s§öh#ß͇3 ©©çŠ¡šjëáÏàFl)rH 7m*úÇ!6:+¢]þ´3¶Ç Ê\1:ºšPaËG©¸É“?šépÝMlžŽé§ÞÁÑ£vXö3þ̳¿«¨ðVy'g,Åôëß *S ©{O´]3œiÇŒ¨&u'–~·>9‚­ßǦÓ€g/8¸QŸë‹aW›“«‚=—‡aDΉMF¡ÖžCzÂ%È*,gÇþ}gZ7Áˆèú2ênnÜ?I;¼pE¥Ý1ì Œ²c7Ñ ®fÕ&mX“×øôSL:Ul¥-H¤ƒ‹|j>è/µ¦‰á”‘nX&=˜®ýèE½*—–±§7V  äTýëù§ý裑ÖÕöQ5@ñC²åØ›IS«þ³iÓ©”Ê¥‰Ê²ãèàò²ôK Yz¾Dk_£üòŠ%”›tŠÂýe5÷Õ(ŽYsznù^ŠË¯X´ëeÅï§E>–õ»¾¸°«ÍÅU±3r€âåêÊŸ$EjmçON¼4ØcX:Žß¹4ß"¼¢Ã0 Ã0 ÃÔÏ‘g†a†a–†a†a†ƒe†a†a†á`™a†a†a8Xf†a†a– "8¶·…·»Y#TÐ>'ƒ4‘eÇB0-Áy†ýy4ˆÝ§#¶"Ý1жBÆg‡i®r,Ñ¢ƒeëþ›GIXÞüÚí0úˆtaÜÄ ®0ú®ŠÜ Ø;Ùú¾Y ‚F¥ÔePó"zM±¦F(~!<%úÙþ€*ÆŽgMù'»±g𗫦ã6k'Æ÷ðï¬OåÓÌ®¶$W9–hÑÁòãéx yÉ@‘[B…–…hÒHÚÀ« €'_ÂHw3Öèù¯ap€5<:Øšôˆmã:Ï47WMÆu’â.ãò•dqÚavµE¹Ê±ËF]P.²d.æj@DP¦Æ†É= «~]–èòvœ»…áÖGy^¶¼è 3p™0šœQ81Aßßl?}9¡Ðä„BsÅ}, •¶µÃÔ°þHJÑ¿&?é‡#­`Qu 8ôöÀʯû#>~”þý9¡Ðd#>­D5/J—£4ÿ kI“)rðÜ­ÑÈTn×”ßFÊï‹ámÁò˜Ò6ð´¾½çñÏn0³òÆ„AÅ8p&N^mªF1ŒpUÜ6ïlÜóIr(Ô†s¯NÃÎÑNŒòÙp(ÉØ“T ­áõâë‡>ÎæOóL“qÕ¢#žÿô‹ DåÈ<÷=fù9îÇàÏëSŸ‹^ »Ú]åX¢9cÖ0Ãbv¸ú4"_ËEÄÜÌNà5þ¬ýö0ÌR¼0åhx¼¶—¾ Æí_Wbñ˧‘(WCæÒ“ ÊŒ|<£…k7'xÛáäu5t4™%(ÒÈ0{{Â|E€F…ë©"tñl‹…›à>é^=¤‚\†tÆœë»l•ÀQ]Ž;ºšÿ.½¸ï}z ·Êïþ`2ø‡ïÃêѱlR"“Ë må®ÎéÈâüó¦×ó³vFóBìø*s§ C§˜î*Ú†åñ¯#ÌÍ^/»Q®R·‘˜9uäëæbJä5d—è`åäÅ…"CÊ˺|Ö£É;‹M‹'""-¥Rw½ýVìÚ‰äNþX—¬ylÎ3MÀUQ+u»_.ÀwóÆaV’-ÎY…ÏOv…´GV&¨×#êc,u] »Ú]åX¢ycD^øû`È /vŸFQšbúeLkU¼WÒ…æÇ•ìL6Áf}ŸOTzð_ä*~Ð1ÅÔoõÒä„Rò2»šùâ²ñïMòœPÒ$ûÑ„vbòY¤Ï¢ yJjæ…/ûÑ•\%†|òRr¶Ÿ\p¤1‘j¢¤0è$æüè&^¤ÝÞ§kwNÑKÓÖ›çiýÎDŠyLJüVÞ¢;¿!é*@–O­¢4Ê¡ }­j?žÑ>×,f3é•ÓÁ‘v¦é<“qÕÌc] ¢˜ÙHbxŸ`?„~È#ÊÛ@²FöÇøú€ íJKˆŠ¶Öü½® .ìj3q•c‰&_Œ¼#‘…Í/õƒ¯¯¯¡ ¼ U¯Zv B7± Bέ¼UAå‰ëÈ:´‡LHÛ€Ÿ£Qß@ÆC?Ï#‚«¯èboáPÐ"á@R skxYÝuc¤LCÏM§,GvQ=†Ø¨‘óça¿Õ|ü!OÅ™m+0y€,øñRÓ¼MbÛ¶b5Ê ÎáÛ“Oàß/¨°ã—›¸SŠ IDAT£Ò@lã+‘q®ugÒHŸ%.ðdç9¤(¡ÕÞAÎÙeðV"Ótž1W;‚’ñÛé¨|¢Û°çOœ|Ÿ†³¤qýi˜ú4ÔuÁ°«MÈUŽ%šþã6+Cf|,bbb å®WûdbãØ^èÞ½{òä‹{ ×Ðé@ îïM­íÝ‚ýs¤D …J(½¼!®è;!:ÇúiHÝ? =¬ØrSC,k© Ö–àÔÛàÛk4¾¼¡‚Z©`åK±‘®ƒ1>K½0gÿ!,/§ EŸ§ ä­Í¸aÒÎ3¦âªáLCøÛ­XCúó÷ëÓP×î6W9–h!Ár¡ôcH€ ¼uH¾zW«•„”ÛÐ(Ï8ƒèB1ü^—:–›S•ê#Ç',amðÈ\&†tȈ.DQOwµÁ >c]ÐåHx3°I•‰¨Ÿ`úð®p \ ep>lÏö˜Úˆ,uJhPç' æR :‚V¥ÈÒV"ã\5£|¶ôÄPo nÕB¬úùb.Åà̉Xä6çSpõ8®ÁÃÝP1&ØûbŒù¢‘­n\êSJ5`io ñ߸.vµ9¹Ê±D¾b'šÔX¼q"—GdÛÿૃñȇ=<º: vãœ/" ä4>|ÿÆ­û/Îí{ a[O 1_ s§öh#ß͇3 Š©çŠ¡šjëáÏàFl)rH 7m*úÇ!6:+¢]þ´3¶Ç Ê\1:ºšPaËG©¸ÙË ö\†9Gp$6…Z[xé G” «°œí1±~Ÿ…½Dš\h¨f^S®…`å+±‘®ƒ1>+oâd"ðጥ˜~ýDe*!uï‰V²kìÌ„œgLÊե߿‡_Ã÷ãkÑØ}Óf…áe»sXðiìñõ –#.AɨExç_ÎëÚ=ÄuÁ°«ÍÄUŽ%šFLðK¢å=Ì«ýߎFÑVNð@´£Á ·QTÚÃì¿2ÊŽÝD/¸šU{ÈÝš¼Æ¯ ŸbÒ©b+mA"\äSóA©5M  ŒôPýƒýéÁtíG/êeixÐÚÖžÞX5€’Sõ¯çŸö£FZWÛGÕÅmÈöaê;Sð'(^®®œÓ¨H¢­óüÉIļ›V1£Žs.n¡Ö5'Œvøw,QÑv ”ïjüŒòY KÏ—hÍák”_nØ@­ Ü¤Sî/«¹/Sqž‹i¹jщƇ¦¤R"" å\ØJsû9VMNmlŒ­@ÒŽ/Ó¦‹†KìE¾Û£þ×vµ9¸Ê±D“/jLˆa†a†aø  Ã0 Ã0 ÃÁ2Ã0 Ã0 Ãp°Ì0 Ã0 Ã0,3 Ã0 Ã0 Ë Ã0 Ã0 ÃÁ²AÇö¶ðv7ãhž1mÕUsø|œ ÒDb”õŒ©º*B›Ð-HÓâ÷!åožaŸ™æ,‹]§ šÅ{Æ¡mÅÖBL<£†üX7x•Äè»r(r/bïdk“1Þœfï*A£Òê2¨yÁGvÕd]Ãæ‰îpÛ£kWGˆùt7uY1qO*ʈ@D Ò ÿ¯H¬}Õ6-S3û̘X°\ÍsŸãƒþ¶hŒkCq®tæái¾®j¡È-N!‡BËç™]5UWÕHŠx^Oý½çgcoâæhÝ©=ÌϽ@__<ŠE¿Ù`ÊæÓØöb»Ç<²ÏŒéËÚÄDIðzÄ t½_Nâ‚!Kváb®DeÚil˜Ü²j>‹ü0gk42•†jùm¤ü¾Þ ÀeÂ@hrFáÄýAÚOEN(49¡Ð\ñFKÃ~lí05¬?’Rô¯ÉOúaÅH+XT]Fpèí•_÷G|ü(ýûsB¡É F|„3Zñ³Í—fíªEér”æßBa-i_\g†]}ô®ŠÝ§#–¤)ĵ˜8$~ÙÝŸÉ¢Ân²¿ôƒ•á_R¯Eø‹”Ø7Ü–}6Q4׃ó'ÅÆ¯`i¼ #§õ‡½ÁEqÛ ¼³q?Î'É¡PΙ: ;G;Uv%“±'©ZÃ(uñõÃçs£7AŸù\b<·î(â3*¶Ñ"ïòn¼;°T7̌ڊ8ÿñB¤}ÏÆlÆs»twuñì0põiD¾–‹ˆ¹!˜ ÀküXûía˜¥xaÊÑ"dð߇գ/bÙ¤ D&—AÚÊ]Ó‘¥‚2#ÏháÚÍ ÞöäE8y] Mf Š´$2ÌÞ€0_ Qázª]<ÛbᦸO:†W© …—!1'ä®›™" Õ帣ãßliæ®–^\‡÷>½…[åwðºḛ̂«ÞUmævŒ}ò8¬Ì;âͽû0é¡¿ö٤ѩPZb¡2–ºÄ̩à _7S"¯!»D+'(.U¦ ÖäŦÅ‘–ƒR©;‚Þþ+víDr'¬KÖå¼)ú\ççÛ¢ûà@tË_‰W¦Fže„¼·ïᯎã°7ƒ’&Ñd?¨ˆ]§P´:“"ž±§nK®êÆÇÔ˪-M<£&ù7þd Ø}EiŠé—1­«ò®KºÐü8¢’]ƒÉ Ž4&RM”FÄ8¦˜ú­AšœPJ^fW-¼¾Øø÷&yN(i’ýhB;1ù,Òç˜?Ñ…<%5sÇ—ýèJ®CÎy )9Û‰8Ïy3--ÚU£ëÌ…]mW¥]iIQÑö@’Ý]‹^v‹(ûK?²2üO굈þ"%ínË>›Z1ëHs.•&[€ÄÖnä7u¥“šNO÷ 3Ãv–O­¢4Ê¡ }­ŒÞ·™ÇLºDåtp¤þº0ÆySóÙˆÏUñþ²½Ãȶâûò]CéTDÛŸ•±cM ÿ@©ð×— ñ³Ýt|8²M[–]‚ÐMlƒÐŸs+oCPy"º²í! BDΟ‡ýVóñ‡<g¶­Àän°¨×cG"¸ú:À€.öe-d!:·†—Õ]w:ËÔ(1ŒDè”åÈ.â\óïþµ@W¤Î »j"í*ûlrHFüŠ""hi8»1×ÞNjߤ@SŸ}¸ Ã’çR „V{9g—ÁXYˆŒwÞ}®ësÕ†*ó22a‹vv–« P¯§w©àw,ÈÄ÷'¡sµgìA™Ø8¶ºwï^£<ùâÈuúìÒËkâኾ"ð§Óx¬?‘†Ôý³ÐÃÊø°¶Eú[AD ^%€i‘®6Lvµa]j=šVˆ¥f˜ØÈ>›º³3áïÓÝ:»ÀVâ‚Àwþ‡ôú<#õœý‡°¼:¾œ2}ž€·6ãê뼉ùlÄçªý ÕB@à9TÍ/XTøkÃ2u Ó½«w.»q pA€·ÉW¯âjµ’r»FÏ“T™ˆÚñ ¦ï —ÀµP‡á³Áö5Rª¿"Ÿ°„µÁMs™fÐ!#ºD=ÝÔV3øŒuAH”#§ª2-ØUcḛ̂«ÜU `ådƒ{ÆÍÔ…H-Z=Ùv"ö¹© ½}q—ãðWRJ4±KO õâV-ĪŸO æR ΜˆEnµMêã¼ÉølÄçbš>fõ}ƒ.çWüç‡<œéŠ<Ãÿ4©;°xã"D.;ŽÈ¶ÿÁWã‘{xtu@ìÆ 8_D€`Àåa‘sGb“Q¨µ…çžpD ² «ÏVÒ"õ\1TS-`=ü܈-EIá¦ME@ÿ8ÄF'bE´+ŸvÆö˜aX‘+FGW3*lù(7yòÓ]5ºÎ »Ú®jä¸t±f–bédÂï g¸ÿŠoe@­Í‘헀Ï>Ã×ï—cÝ©H»÷†P5Ç>7?”7q2øpÆRL¿þ ¢2•º÷D+ÙõqÞÔ|6âs1Íã&¢ô±¬üŸ¤Ólº@T9AÒŽ/ÜFQiwHOeÇn¢\Íô¯‹)ø“/WSŠÔ(Ú:ÏŸœDwWjMÃ(#=Tÿ@~z0]ûÑ‹zY´¶µ§7V  äTýëù§ý裑ÖÕò¯zp_ñC›Êê¹´IS-ÑÕúÔ™ »Ú®š¹¥uQ¹¤#"R¦Rä»=ªöeþ_sŒnU|,‚2ã~¥Å=-ÙgŸàw¿íêžà'¥çK´æð5Ê/7œTµ‚r“NQ¸µInu9or>ñ¹j™à'ržDQDtüyv¬ µ?ÞÃ0 Ã0 Ã0-~´œa†a†a8Xf†a†a–†a†a†ƒe†a†a†á`™a†a†a8X6 ˆàØÞÞîf¸‚"´ Ý‚4M!~ŸÑRöi®šÃçãd&£ìø6wÄîÓ[‘:˜EÛ!{ì>3ìáqriÚÅì¡Âk ¥å€ *oJÝFbæÔa¯›‹)‘×]¢ƒ•“Šô); \}‘¯å"bnf'ðÿÖ~{f)^˜r´ÊŒ|<£…k7'xÛáäu5t4™%(ÒÈ0{{Â|E€F…ë©"tñl‹…›à>é^=¤‚\†tÆœëšõIà¨.Ç ÍÜŽ±O‡•yG¼¹w&Ýç£jòÎbÓ≈HËA©ÔAo»v"¹“?Ö%k¸«eê°«µºZzqÞûôn•ß½üÃ÷aõè‹X6)‘Ée¶ò@Wçtd©Y§GªêÛ(ƒVƒ©FxH ÒFQ£úÌ414r\‰+†õ³Sñ\çSØz£¬Ö´¿ áaþ©-8«Ý‚‘#;bá…x”€MoL”!sëOHPw¬FõÙÈë”ia#Ëbk7ò›ºÒIM§§{™‘yáÅîÓ(JSL¿ŒiM¢»FýJv ®ÖcS¿Õ#H“JÉËìªõðôÅÆ¿7ÉsBI“ìGÚ ˆÉgA¾·w¢ yJjæ|/ûÑ•\%†^¤…”œíDFörïÓ»ð˜I—¨œŽ´ãÞ–‰,³«áªàHc"ÕDIa4ÐIÌN5ÊȲˆ¬\ûÑ[{äD…»(¤µ¨žyÞëô§‘}æÒdŠÈi-9˜AD³s9½Ò·]wWÊC± M:®!ººˆ¼ w½lo£BJ¥•OYÔóXãóÃ^§\šØ5`lD-ñ+Šˆ Q¤áìÆ@\{/~“cÇV-»¡›Ø¡?çB[1©¥<aÝY‡öU\}à@{ ‡²€ ²[Ã˪æ;´ej”FÄtÊrdÕohCâ2 KvžCJZíäœ]H`eÁskMvõo¸J…ˆœ?û­æãy*Îl[ÉÜ`Áþ=v€H‹ÒôÓˆxêæ žŠýr]½3M ®ìEø›ÿÆo–âLôz|óÛ ؘ mƒy¨Cîáu8 Ø‹É<±f}7Ìmƒ˜…[Qy 4бÊç†ú½`šI°¬½}q—ãPü*»q ‡oæì¹úÀÙüªR½]ŽOXÂZ(‚’s™Z…Ñ…(€ Ž=ÝÔ6?æŠá3Ö QŽ„úβթ PVN6Üýš¥'†zq bÕÏ7  dx!—½1iØÕ¿ï*©2µãDíø ‹­ÆŸÇÂðÙà-ñ¿B¬Q¤%àj\!Þx Ï&ü‚M · ×{Qf¬‡õ9ï¤R XÚ[ßwéÁFõ™i¢ñq×ç÷‚iÁòßîÀ⋹ì8"Ûþ_ŒG>ìáÑÕ±7à|QE7N‹ÔsÅPMµ€õðgp#¶9$…›6ýãˆÑ®ÚÛc†aE®]ͨ°å£Tܬï$$—.ÀlÂR,Lø]á ·â_ñí¡ ¨•7q2øpÆRL¿þ ¢2•º÷D+ÙìNó?iÉ® ö\†9Gp$6…Z[xé G” «°œåxDèäðî»'pmýz¼¾i ÖÝTça}λZޏ$£á 8¯k‡6òýØ|8Óˆ4²ÏLÓ@ÒW-A×øßpüJ:JD­à=î}LiW‚GnB4°‡ œÿ|=¦ý¶~d}Ù‡r« Ï}¬ÆñÙøß ¦éwë»W-¥®IS’v4xá6ŠJ»cX𥌲c7Ñ ®fwM°¦‰á”‘nX¦%=˜®ýèE½*—{±§7V  äTýëù§ý裑ÖÕà¯z(_ñC›Ö™¹¥uQ¹¤#"R¦Rä»= ûÈÒó%Zsøå—W,1¦ Ü¤Sî/ã‡Þ›ÂÒqìjý\;Sð'(^®®\ªN‘E[çù“/ûõH—Žƒµ}žFTðßàÊeëö°~ç]ÚñeÚt±À°«[Õüy<>siżMX¹—.¤ëÛ"*J:N_¿éKö"<EÎôσeDM³:Iîz=ŽÕX>û{Á¥ÉàUM†a†a¦6xž&Ã0 Ã0 Ãp°Ì0 Ã0 Ã0,3 Ã0 Ã0 Ë Ã0 Ã0 ÃÁ2Ã0 Ã0ŒÈ æ|Žus¼aÉßÓÜ‚e±ûtÄV¤‚$BÑö@ÈõAÛÛÂÛÝÌDzæðù8¤‰Ä(;–¯Å`r2M©‰nºišBü>£3¤ÍÈC‘­Ÿ‰v¢¿µ ÓÂ0k€7gáõÀv÷&gb˜Ç, ÖÝðʺ£H*Öºº’T\øi üŒoÀ´Y;1¾‡||Ç`}j£„çè»r(r/bïdë¿÷#Ó`4*  .ƒšì{4qi¸Úü=d7ϯ8¸§Ü C/‹*lžè7±=ºvu¼oæ½¦è¡•ï‡Ø»g%F9›ý­m˜GÛ~ ˆ†&'ô>eÞtøkbš­îM¬Ñ÷³ÃøþÛønþX¼~^‰[/ ò-CÞz$=W )®–#«‘òA "S»ˆµPä–@§C¡eùžrµÙ{È6A×ÂÞé)ø÷ Y8­H™ƒëªÊ†IÏÂë„+ŠââÿV*]ö©?„üË9ˆt6‡X0C—þp€’«y8ŸG€²ÉJþ–˜–r5<¨HäE8y&ÇÏäá÷%(ÒÈ0{{¾|Å $*\OUÃÁ³-n À×ÃÍ ·;¸ éŒ9!NðjUí¨HGu9îèv¸ú4"wÀÉ÷B0pà(ÌüE‚W¾=ŒÏíîù¾J/®Ã{ŸîÅ­ò»?¿ þáû°zt!6L B¿gúaÐsÓññ¶“ÈRsÎ(ŒqÕ˜ó%¶E÷Áè–¿¯Ž†àñ³ð£.ïÛˆQ­DF:ßÈ2ÍmævŒ}²;º÷ˆ[÷Ù¨NWM°=,=ùOwCŸ×CnaíèžèÞ½;ºwï†_$Amì6¢Vþê vÏwÇé¥ã0"ä |¯Áç'áí®æ,PcÒ€í˜Ñ±DÒ.,þg0†?÷olWƧûÖc˜ß=a×È2@"§´ä`PÌÎåôJßv÷ŽßUÌ,¤äl'2ŒþL£(M1ý2¦uU¯VÒ…æÇ•ìüàÎêEp¤1‘j¢¤0è$æžÜÃöþêpÕ¨óep´lï0²5lc黆ҩˆ¶?+3I¹4¿‘e£ÚL£]5½öPöì*¦¿h‘—ô¾ßσ¶1ó˜Aˆ(fv'’þ'Ø¡òˆò6Üû]qyd#˲»§]­Íù§×RЭùéÌ£²Üh4(¸²áoD§§—¡pìz|ó/wýí©æì?„åýÓñ唡èóÔ„¼µ7êê ÷ð:P<‰ÉôùÒi¡ ˆLÓC¦%`d;p·«M²=4þ;áÖññÓ`íØC¶«¤UC "1ÛÀ<Ìæ²PÄÄñ¬ex¾‡3¤HE™¥'†zq bÕÏ7  dx!·Ö·k T–öÖµ.ƒDùGþßœœ: cïôÂ`ÝüsG 4•à ÆKUªo™Ÿ°„µP%æ21´ -2¢ Q{º#¨m6~ÌÃg¬ :@¢ FN;/»q ‡oæì¹Š¿»Ð©2µãDíø ‹­ÆŸÇÂðÙà-ñ¿B¶µ!\m¨óeb2Í `ådó·Ö•5µöT ¨` 'kÑCmSvã8®a†ºaéŸúç˜{_Œñ!_4²y®Gc ÚpíX}b †1©`YÒW-A×øßpüJ:JD­à=î}LiW‚GnBÊ›8™|8c)¦_ÿQ™JHÝ{¢€ì»÷§–#.AɨExç_ÎëÚ¡|?6Î4Ä œÿ|=¦ý¶~d}Ù‡r« G},-RÏC5ÕÖßÁØRänÚTôClt"VD»"üigl†¹btt5 Â–RqÓȆV“º‹7.Bä²ãˆlû|u0ù°‡{²" IDATGWÄnÜ€óEÆÉØ#pyFäÁ‘Ødjmá9¤'Q‚¬Âr6ÕŒpU×PçËÄi]­.U?´©œLpO‘´£Á ·QTÚC…Ê(;v½àjfüäbg þäÅËÕ•K$)R£hë<râ¥ÁŒ+F¹jÄùªe‰ÈyEÑñçL×C.Ís‚@fnci]T®ÞkejU›i”«¦ÚZÒ“¯G1†%æ¨ô&|ç®ß‚º¶±èDãÃSR)‘†r.l¥¹ýx 14ò¿†óLjvµ>ÎsáÒ@E@í1 Ã0 Ã0L‹GÄ_Ã0 Ã0 Ãp°Ì0 Ã0 Ã0,3 Ã0 Ã0 Ë Ã0 Ã0 ÃÁrõ;aÀœÏ±nŽ7,ùü1ì*Ã0 Ã0,Wì5Þœ…×Û±@¿9|>Ni"1ÊŽO6cÊ®2Ì£mêÛ„nAš¦¿Ïè )!LK°ÞÖ ÏD;¾‰ÎüÍŸó¿,Æ€ˆa8öÂý~ê‹ðVïãø*ÃTWŸ#hT@]5/×Ìiê®2ìê£tU ›'ºÃMlQWÇZ³§2LskW­|?ÄÞ=>ø¸ëa\)âä^Ì# – ù—sél±`†.ýà.%Wóp>e1’•¦üñ´Pä–@§C¡å“ݼiê®2ìê£tU¤ˆgáuÂEqñà,ê ·« Sß«¡A²÷ØÑÔ°þ””¢ÏÞ#?éG+FZUËÞ#CoZùuŠ¥Ï •Jš¬`Šp¦V† kÉ´'©˜´†ä=Å×Sø82¯ÌB¥ÏÞCš<*('"ÒRþåÝôNÿÚ³6Ù‡üFÅ ïS7齯‰ühÎÖhÊTV~›R~_LÞœ­Í:Ó”i¹Ê²«ÒU±ûtŠ¥*ж’¬Öº¸Ð%»è¢![ž2í4m˜Üƒd»Ê¥ñÚUXt¤ç?=D‰ÅDDå”yî{šåçPÕfŠ]è¹uG)>£¢íÕRÞåÝôîÀV$®ØF6ˆ¶Ý¦Z¹öþ“$…‘ÇâÂ¥"‹jƒ„Ûfo@˜¯Шp=U„.žm±pSÜ'ë‡TÐB€ËΘb]ó½" Õ帣Óÿ©É;‹M‹'""-¥Rw½ýVìÚ‰äNþX—¬©z_Ò.,^´ÉZwŒ^ºŸî[+'à`aÍÛA¥×á½OoáÖ=w`dð߇գ/bÙ¤ D&—AÚÊ]Ó‘¥æT³Åä\e™Gëª6s;Æ>yVæñæÞ}˜TÛ±; \}‘¯å"bnf'ðÿÖ~{f)^˜r´Ä®2º]µBðWg°ûå|7of%ÙbàœUøüdWH{`e‚ Û¢ûà@tË_‰W¦Fže„¼·ïᯎã°7O”žÇü§»aÍ€Õ8þmW|=:nª”9IPÃÈc1LCŽ,Ûø÷&yN(i’ýhB;1ù,Ò÷Ot!OIͼðe?º’«Äе’³èþѼÇLºDåtp¤Ý}óÂ[>½–2¨€~hm|OAp¤1‘j¢¤0è$æžS 19WÙCvµ±\5øXÛȲØ}EiŠé—1­«FÕ$]h~QÉ®ÁdîriWÍŸÏúCÏ>k/Î~öÚk­½Öw¥í' _ZøÕ"æ€ä9u Sù9+•_ÎbbŸæ¸´÷Ôp©ƒ®ª‡ÊUpõb¸·H'S#F¯ÎÄ&‚ˆ % „w¯V-ð2ª«Ê•wÕ½mBH⇟Rþ²BNîáÛ_íø÷ìE@5øâ´ý¤áÍ>5o\ê¹”ëÕr MŸ÷VϤ¦ e]B˜±™½òÁ£C¸õ–>ŒzêSþ¼Øùml0š µ*uÁþwÄíãò«ÿ8ÞÛz„Ôˆ§é⡵C~R·\U•+ìêù¹T‘¯i,s3;w®”:þõ[²ìêªrµ\5Pk›ì6ì€ÁXû{AÍU®RcÙαè\rc÷– lfƒÝÆÒ !‹øš.½voÏ®p`þ‹Ì_½•˜}1ìØK敼ɋӈZ1›IÃ:8à]І‡3g¯šÑ ©»®ª‡ÊsõL–Ř‹ÁÿÑyq¿ ÿÜL<ôíj'é÷ßù½BŠO>‰U]U®‚«…ná Á ÐüŒ£ßžÜÛÍHöžhŽ×rn¼›)ÆOã?—Ò°qÈ?st³¢ƒ˜×+€å1C™•i¢MPÌo¦r¸¦Òf[¼ñä &ú˜¨´"\Zv§ pÜѹÁ—3ù+c›b“ȵyÓ~pwsŠô\ÇØP©s®ª‡Ê•vµkûöæà4~3& ?šhžÿ=Ÿl8†%uÓO#òõ-D6û?>\G6¾wð#vñGìÎuU¹â®ZSW0ãóWø~^KŒ¯±ê°7}žçAŸ]<ÿvæZ–«(y;ñöG˜8óybí&¯QkZåG°dýQ,>—ÒðqPØ_yb~IJ- “½=TÞáY!lÌÙÉýæ7=31¿r2ˆ{û¿É‚%»¤,΋Å,™‰¿È¼0¯jM&H”ˆlù‹_Í'l›døìu—e9RÆœ%˦„‰¿Q'³Ó CÕ!WÕCuõŠ»ZaQSó1²(*Sì""E©ùR—³y9ß(ƒ^üR¢Žœ.3±PŽÇ.•û‚œÔUMWÏU·›dܼ’X "b•Œ=ËäÙ;*„Û¬UÀ]:>ò™Ä”…C”‚òþ… Î_ì\š4•/þ¤êéFŠ¢(Š¢(ŠrÝ£¦+Š¢(Š¢(Š6–EQEQEËŠ¢(Š¢(Š¢eEQEQEÑÆ²¢(W¦h|OÍûOwu×CQEQ®·Æ²Ñ;„÷Œ ‹Ïåþ™®t{+ ±F2ÒG¥QN7ôãÉçž`p îíª(Š¢(U>+/ü±‰> ‡²ù¾ê¤y<Õc «›Ñç\âH“ò ÜÚÈ_ÞÞ ù""%’¶ësy:ÔïìŽ:¦@¹gÑOw,_l""b“ûWÉKýšˆ©ü¯þòåI©’ƒ¯vjx® ÉwÔ’ÿªtr9ÿ3£_¨L^-iEe')9)É?N—®nºë ur§)¹êÚJFýßw²?«lw(KŽÞóLíâVæ×Íž"rüƒPñ(ËÛ%dšü!E²v˜w…òÊà—¿’½e»LÙ.Mì"^†ÒÏÝ»¿*›’Í¥;¦%n’ϾØ*G‹EŠRÖÉ =‰¡,çà‰òmbù}!’h£Ì,®•þö›eÒ§»å¸UD¤@’÷'Jñ9å©I>šê—«¦få…Ų;1KÌåðYŽÈÊ»ýkîOMê^ îÒfÔk²bWŠ˜Ë«Ää‹¿‰S פ®^ÈÕ‹úSCWõÙ­©¦ÉÉ!Ímg/žYÞ—ðžF°s(ÕH»öÍxqi_ZNØÌCбa pp[&ò¬ü]£3-%œ¶Æ& ÿp«Ìá³)cy:Ñ›~“çó¯mpéÒ—¹ñÅ`ò¦ó tÊžËßßÈ ÷vŒzeo­5òG›±¬9a‡‚ÝLíÕ‰}ÞaË'Xr÷h>:l„¢ŒD,Ôð\(Ø»ˆWÞN!å¼Ù^„Í[Ë;wïåõ ‰L*Ä¥I0Ž’nÑžXÃa®ú3ô½¬yDXû¿0}Û1hûwpý‚\˜û[ ‡[ >ô{g;‘g²ðÙQ<o dÜk¼ûÉFœ’Cxô§<œn%¬ÅA¦™ÌñGV³tl/ŒŽñ¥oxóýXyǤXÁzb'K§ßÏÂ#¸´dàsï3ë«•$ÝÆ¢$+˜¹ï‹-¼W"‹ŸËÿ;æC±/ðz—ÊEºh>Jýrpi>‚>6”¬EÏòhäAŽŸ²ãáï‡yOÞ™-\/îO ê^œ ~xû>ÎÉïç2ýÁí$dYð lÄœÀZCçõ¥¾ºZ­«5ñ§F®ê³[¹Ê#ËÂzHVÆh±&…Êø &éöüÀÒ^ãÖvÒÞ¹ò¾ð…_IsYÏÎÍE|Œ¥-÷à'eˆÄ.QÖ|ùîÞξÑpn'Sˆœúj4ñ¶VN~/wy#þã¶Š5…Üée’æïëñåvjzÂÁÿ”}R"ëGø”ŽÞô¬ü*vÙùDË3£+UŽt_$MõËU@Üo™/G$C>ºÝ£æ#)ç^÷šÔ½úËçÙ"ë SÕùÖÄyuC]­ÎÕùSWõÙ­©ÉÑ0ŒõôðǦ°!]ñëÒIh{!•¿a+´pª¬çf/*áx^i—Ò½mBH⇟RÞ±““{øöW;þ={P̓â´ý¤áÍ>5_Ñ©ç:¿«‘KäÔ)DxLåç¬Tv|9‹‰}šãfÐ^XÝî¶»“Ž$±î0Å—Q"÷védjÄèÕ™ØD¤$ðÎàÕª^çÜ¡v»€ÁˆÁ Ø­v0)WÍ9p(/¯ÜErN6Ûi2v¾N7œñp+ÍÄ­M7‘ÌO;3¸ÐÔû‹å£Ô/Wk<8x ×ýܺץEBÛ‰úxÇlŽq^QWáÏyí}v+µ²ÜACÓçb0PúAjõNÍ@­]µÛ°†Zÿ5—p®*þú‚ýï2*8ˆÛÇ/äWÿq¼·õ©OÓÅCﺺøÅ1®0 Ø/øÁf“‹Sµž F ¤±xÌÍtîܹRêø×oɲŸïºÍf?¿œ.!LŽØÀÌÞGùàÑ!ÜzKF=õ)V*Ž 0/àeMòQꙫ5àR¯û¹u¯ÝŽ ˆ½úÂÕÚyE]u„?çµôÙ­\ÕÆ²cѹäÆî-ØÌ'º ¤@Bñ…5Ë©ðÏ-$˜¡šS>°kðíɽ݌dï‰æx-çI±™b<ñ÷4^…s¥µb6“†u pÀ» gÎ _5¬Ná@Woå­ÔûÆêCÊXrIÍ…&ÛQ]¨ïÂ?7O }»ÚIúýw~¯â“Orî áÜoïÄÕ÷¿ùÉ|îpK{†t…ó_dþê­Äì‹aÇÖX2Ï;W0#†ãRí°ÍÅóQê—«5ÂA׽䨢sM„>2Œ@“cœWÔÕ+é>»•šà~æèfE1¯WËc†2+ÓD› ' ˜/ÞLåp žÖÔÌøü¾ŸÁãk¬:ìMŸ§ÃyÐgÏ¿…¹–å*JÞN¼ý&Î|žØE»ÉkÔšVù,Y‹£ÎeðeÀÌpîÊØÄ¦Ø$rmÞ´ÜÆœ"=·D «c8ÌÕ”¯xë»™¬\ðÿøÐi&kŽzÑõÞÇé ¤–dKgÓò}0gK^-aÑ/¸tî?œ±³¦®`úâiD¾¾…ÈfÿLJëãÈÆ—à~Ä.þˆÝy5’):̶xãÉL:ô1QiE¸´ìNàø™s­dÆg3X7{_{¾ÊÒíÇ ýÍ•ÊS“|”ú媣ü©§¶óÆ«›»è?ìZ{ á˶’mÁÕ¿M³"øtcšãœW®KWæ>»•Úv¬pHØ_yb~IJ- “½=TÞáY!lÌÙÉýæ7=3éþ¼äv“Œ›·Q DD¬’±g™<{Gã³ù«˜¸o ˜ Q"²å/~çäç.ùLbÊÂËHÁaYÿB—³eºØ¹j’L2|ö:‰Ë²œ OgN’eSÂÄߨ“â©“!ŽãªÁûfùÇ™0lfIÚwè¼0l¸¶–q 6KÊé29ìfI;ð½Lïî^¡¼7Ê ¿”¨#åÊñØ¥r_PiÙ+.ð£B'îkæb¹Ã£4,“{û¿É‚%»¤<Ü’Y2‘ya¾ºË=3×Èìòa§%=.B¦us?Þ©FùhªW®^|_ ®{Më^ƒ§„Œ›%ßÄ•r£m9 ²~Z·³å¾ˆóšÔÕ .F½˜?5qUŸÝšj‘  QzŸ„Lã×ø×øó®¦Ü½!_EQEièºcEQEQEÑÆ²¢(Š¢(Š¢Ô†¡(Š¢(Š¢(Õ #ËŠ¢(Š¢(Š¢eEQEQEÑÆ²¢Ô©[¬éè/8bÍåÇ'ÛV¿Èebj9‰Øò­_EÈ[>¯K8æj–YQW¯ž«®t{+ ±F2ÒG¯t7Ñ;„÷Œ ‹ñŠ9¦(µá"›’˜è³p(›ïs®æó<žê±…é´gåZSW]5Ѩugš›|1vhŒé Å–¾’q]¶ãéÚ†ÇW˃—xÌÕ,³ºª®^=Wk±,…XôqUç]õèùk¾íÆ[6ò[^ÉqLQØX²÷gàŠÉàD»Þ~´4À©ßO°û„@Q>IEú#*uºêª…Ä…w²5ˆ¼q^±Óäx \JH/¼Œc®f™ÕUuõª¹jÜy »9 ³M ¬ÿ®:À1E©õÝàÝ{|ä±ðÞ’˜\º{OÖ¶P™5£Âî=ñë,s—ô–¸¸‘bÍ(=Κ>\âH“²sLÍÊ ‹#dwb–˜Ë7Ö±‘•wû‹áLYeðË_ÉÞ²ùŠŽl—&v/C…òø…ÊäeÑ’VT–GÉIIþqºtuÓh¸îwšº:®šZN’X9KÞòâUUy îÒfÔk²bWŠ˜Ëu=q@¾øk8ÕÂy*ì\Uí¹.rLˬI]­g®úŽúAòã_•N.ç¦Ï‹:âªWùò¤TÉÁW;ŠË™ÝwÛÈ_ÞÞ ù""%’¶ësy:ÔïüÝw/â˜sðDù61_Ê÷3Í?´Qæ W½ÞšÎINin;{ñÌò¾„÷4‚µ˜C©FÚµoÆ‹KûÒrÂfÚPŒ ƒÛ2y”gåïil)á´½ôŸ.ÍGðÏdž’µèY<ÈñSv<üý0ïÉ+qgð¡ß;Û‰|8“…ÏŽâ™x!ã^ãÝO6┣?å!x6o-ïܽ—×' $2©—&Át8JºE{G×5WÑU[ÚrÆtÜ‚‡kþ±f-ª.Á¯bß'Ã9ùý\¦?¸„, ^-˜Xkì¼c¨Y™uµþ¹Z°w¯¼BÊyoõõyQg\-ØÍÔ^XÐç¶|Ò%wæ£Ã@(ÊHÄ`lÂðw°êÁ>›2–§½é7y>ÿÚÖ—.}™_\ãb[OìdéôûYx$ƒ—– |î}f}µ’¤›ÂX”dÕëª8vd¹QXÉÊ-Ö¤P£AÀ$ÝžXÚkÜÚNÚ;WÞ¾ðë r.뺹H€±Æû›Z>.QÖ|ùîÞÎö"ÛÉÔ"§¾$@04–{#-"‰áÒÏߤ½"¹&®Öht£Qù<[¤`ýdâÒwÐh]­ŽÑ¤®6WõyQ§\ÄëÎ’/È´—óGø‚Ÿ”="óÌMâ\ößÁòï"'>í[ÙZºáüOÙ'%²~„^oM•ßœ\~[ÛHPO?ü{l Ò°¿.d€¶7âqΈ@¡…Se=v{Q Çóì5>›{»t25bôêLlå«]Kï ^­Zàe$—È©Sˆð˜ÊÏY©ìørû4ÇÍ =£ë›«ëjMpiÑ‡ÐÆv¢>^Ç1Ûe8¯¨«êê%éó¢^µÚö'„$~øù(åÿrrßþjÇ¿g/œk1 8”—Wî"9§›í4;_§Îx¸i¥ªTÆ!Ó0ªz­f0”nˆâÀ…²ƒi,3‚¬ü>Í~:,{i‰ ö¿Ë¨àUÜvïß™ðÐDÞÛ:ÙëžaฅüvZ—C_ϯQ®–«Uœéüÿ²Û±Ëe:ˬ¨« ÊU}^Ô?W —_3¹„09b3›­æ¥GŸgÓáÜnúŸ­š¢T©¢KxÙØ9K`ìÞ’Í `p¢Û˜@Z$dïÀÕ¨…n&ž@úvµ“ôûïü^!Å'Ÿ¤â,#)N#jÅl& ë@à€w)ΜA¾zÕ¯[®®«gO[Œ¹<üqî GɱDçš}d¦Ëw±Rdw_ÏêÃhÕä˜ ”YQW¢«ú¼¨;®J±™b<ñ÷4VáØÌÐÍÏ\oƒoOîíf${O4Ç-5ôǽ=CºÂù/2õVböŰck,™zA•*pÈȲ9:YÑAÌëÀò˜¡ÌÊ4Ñ&È (æ‹7S9ìÀEÖÔL_<È×·Ùìÿøp}ÙøÜÁØÅ±;OÀàË€™áÜ•±‰M±IäÚ¼i?¸;9Ezn‰^õ똫éêYi³Ø·7§ñ3˜1QøÑ@óüïùdÃ1,§¶óÆ«›»è?ìZ{ á˶’mÁÕ¿M³"øtcZÍœ/Ç’Åx3Î#§ñÂvÛo<›Om޹P™U#uµ!¹ªÏ‹:çjQòvâí0qæóÄ.ÚM^£Ö´Ê`Éú£XRW0ãóWø~^KŒ¯±ê°7}žçAŸ]<ÿvæŠ]ÈŸ¢ÃlK€7žœÁ¤C•V„KËî4Žë%UªêÄá°1¾òÄü>’”Z&{{¨¼9³Bؘ³“ûÍÿn*ÞÕœ§F Qœo”A/~)QGN—|)”ã±Kå¾ ²r™døìu—e9vÆœ%˦„‰¿Q'ªs݇8ºŠ®–/i>FEeŠ]D¤(U"_êrö|O 7K¾‰9*åFÛrdý´ng¹˜ó’K›eéÞœ²ÃR*Ÿ«Ç\°ÌšÔÕ†âª>/ꔫ¥É]:>ò™Ä”…”‚òþ… ×Ôí&7o£$ˆˆX%cÏ2yöŽÆç‡Ž» ?qoÿ7Y°ñ d—”‡S4Kfâ/2/ÌK¯·¦JÉè„,EQEQE©]ò©(Š¢(Š¢(ÚXVEQEQm,+Š¢(Š¢(Š6–EQEQEËŠ¢T¾qßÁSóþÅÓ]ÝõÇPÔUEQ”ë­±lôaÀ=#èâ£my¥acj9‰ØòmEÈ[>¯|Ïé†~<ùÜ Ô-C”†ìª+ÝÞJB¬‘ŒôÑk (ʵá"›’˜è³p(›ï«®’Ëã©[øð˜c£Ïyô|ƒ5ßvã­ù-OƒÂ+5z”_W/[úJÆuÙŽ§k_ý-ê…TWÕÕ Öb+X ±hSuUQêfcYÈÞŸAd€+&ƒízûÑÒ§~?ÁîEù$é¨Ôê©«–ä€K é…zÕUuõœ&:æÌSØÍY˜mjŽºª(×ònpÈî=>òXxoIL.ݽ'k[¨ÌáQa÷ƒøõ–¹KzK\ÜH±f”gM.q ¤‰Á«¿|yRªäà«Å·›%x(c^Ú‚OÏ‘ô r9s˜õÄN–N¿ŸÁa·:`³ÿèÆs_­ä±ÖNÚ…j¨8ÄU!û—/ØikΈm8cT£ŒàEÚÿû†ø":f ä¾/¶ðþýάyv,#ÿòO>9`9çµaóÖòÎݹ|4a wÜvýï™Ä[_n#Ý¢—]]­¿®ì]Ä+o¯!å¼yê|Ãrì™?³b´ÕË1øtgdgøcÍv²ìúSÇÈ겺IDAT+õxd¹QXÉÊ-Ö¤P£AÀ$ÝžXÚkÜÚNÚ;WÞ¾ðë r.k­»¹H€±R~^w®|ùC¦…¸œ_ŽŒ,;µú‡ì‘ýÏ·ç >Ÿ“œ‚ÿ)û¤DÖðÑžTq˜«¦@™°Å*òû4 )ñòô¥äJªÌ½Å­öŽ]`´Îù¦gåW±ËÎ'ZŠ©:Ÿ åÞH‹Hb¸ôó7©êjÃwUox®â,7=»OÄö‹<TzM=Ã>–,I•ypU“¦z0²l$¨§~€=6… é؈_—N2@Ûñ¨ü [¡…Se={Q ÇóÛ]tk{'Iaý¦Ô ŽF;åå•»HÎ)Âf;MÆÎ×é†3n…£aâ@WmÇÙðÁO”t|1­]ÀàGØã#ñMø˜O+r¨cnm¸‰d~Ú™AµÓ6%—È©Sˆð˜ÊÏY©ìørû4ÇÍ W]]m ®ªó ÏU,¤¬^L´á6Ô ®´ÚŸ&™ëùæ­\KË44}.D‡.”lv0¹8Q]h09aÄF‰õ'v arÄfö>ÊáÖ[ú0ê©OùShð¯QãªÌ‹XgîÈÄñíq¿a0ÏÜ݈˜÷–q°ÄÁމ 0 üË ö¿Ë¨à n¿_ýÇñÞÖ#¤F&*­—–ÝiW/,ŽuÕÌî½Güãÿ˲ÙþAo6dV˜RTÇ,Yˆ7ã’”Z&{{¨¼9³Bؘ³“ûÍÿn*Þ<Ÿ»t|ä3‰É´–†*8,ë_èr6/×Ö2nÁfI9].Èn–´ßËôîgC#™šô“—Vý&9""b–”Ib‘ÓòÝÐFgÂØ¸·ÿ›,ØxP²KÊò±˜%3ñ™æ¥Útˆ#ºj ÿ^_("ÑòôMÎç|^;Ç\Ú<(K÷–+…)ùREçƒåž™kä@vy`¯Ó’!Óº•9o á³×I\–åL¸Esj”,›&þnI]mˆ®ªó ×ULÒ|ÂOR,"Ésn®‡&M×&¨zºQƒÃóŽ8¼}ËomÇähÝýAQEQêì3û¶wø}KÞù¯ÛYð§ÆT®- 3 °Á‡^?ÊÍ9qÊ(ÄåÆ^ŒãQš¦¼Ëòßµ¡¬(Š¢(u £O½:4ÂÔ´/“ßû’A,MÔ†²R7h€¯‹ZËÃ+â$»üí\I¦ˆx[Ƶuƒ¾NФI“&Mšê\j4à39&"bI—Ü/mu'FM: CQEQEQê6ºû†¢(Š¢(Š¢hcYQEQEQ®›Æ²+ÝÞJB¬‘ŒôÑ ©ÔNû¦£¿àˆ5—Ÿl{ÑÍ.ˆÁHãÞtmé¤=OE]ÕúY]­W®:°ÌÊõÜX6Ñgáp¬£«IýùGеÚVT°[ÁRˆEg]+†ÆÜ³¾I™ÃÍn•?ò² ³$3çÌ&µîLs“/:4®~—Ç‹bâö¹CÈÜ3€5=µ¢UÔU­ŸÕÕz媣ʬ4tœ.VáeïÏ 2À“Á‰v½ýhi€S¿Ÿ`÷ ¢|’Š®UÑm˜3Oa7ga¶é…¼î‘<ö|³†ÝÉmMMìM-—¶Czᙳ™ï•Ëj!qá„l "ï@—LÐ`4èo¯¨«Z?««õÒUÇ•Y¹n²{<Þ[“KwïÉÚ*³FxTØyÇ ~=‚eî’Þ7R¬¥ÇYÓ‡KÜÂibDŒÉ/v‘„ÄåÌ.M­äbDdÇÃxήL¾£~üøW¥“Ëùå5ú…ÊäeÑ’VT>î¤$ÿ8]ºj(š›œÛN‘ߤX6Œñ?"й­<÷›HÁw#ÄÄÔr’ÄÊYò–¯ªò3¸K›Q¯ÉŠ])b.WèÄùâ¯Aâ„AÇ÷;ëð¹é·®r«»ãî ½¶êj}tUëguµ.»ZÓ2;O”oó¥|?ÊüCeÞØ`qU7®«ä˜MIœ½xfy_Â{ÁZÌ¡T#íÚ7ãÅ¥}i9a3m(ƆÀÁm™<ʳòwÎ4¶”pÚöÌŸY±Žêdz~'ÅŸîŒì ¼¶,{å¯ì]Ä+o§Rrn¼›·–wîÞËë™TˆK“`:%]ã›7X,©ëù:a.ÏëŽ×ê9˜šöel§b~ùßÝœ$m9c:nÁõ ÿX³– U MðëØ÷ÉpN~?—én'!Ë‚W` $æV„¢cÙ¬ßa#¨“?]}¬<¶²`¬i§È³9î¾PÔÕúèªÖÏêj]vÕV£2ƒõÄN–N¿Ÿ…G2(piÉÀçÞgÖW+Iº)ŒEIVDG–k>²Ü(¬‡deŒkR¨Œ¿Ñ `’nÏ,íÉmm'í+ï _øu9—õÝ\$ÀÇX–—³Üôì>Û/òPIñ ûX²$UæÝâVó^€¡±ÜiI —~þ&í]7ÉUºÎLIOns/]h2ö)*Ù,÷+ëÒA^ޝf4¡Qù<[¤`ýdºÐùLrÇ;w‰5c´$½îSaTÃÑ÷…&uµ¹ªõ³ºZ—\½P™«a þ§ì“Y?ÂGÝ¸Ž’š êé‡`MaCº6â×¥“ ÐöB<*ÃVháTÙ‚½¨„ãyö3ó‡RV/&Úpj† WÚ íO“Ìõ|óG-&GK.‘S§á1•Ÿ³RÙñå,&öiŽ›N/màsðë•$Œä/ÜÀàKèaw~ÊO™5¢uiÑ‡ÐÆv¢>^Ç1[]¸/uµ¹ªõ³ºZêUçÀ¡¼¼rÉ9EØl§ÉØù:ÝpÆÃMã]O8äjWµØÙ`€R‹ÕÐ֣߱h‹Ð{Òݹ5gàè6äü°‚ßN×®DûßeTp·_ȯþãxoëR#ž¦‹‡ÖÈ ºZ?ø_%·`̽mqõîŃýØññF2ª­«ðÁnGÄ.uæ¾PÔÕ†ãªÖÏêj]tµŠ2»„09b3{åƒG‡pë-}õÔ§ü©Jhc¹öØ9K`ìÞ’Í `p¢Û˜@Z$d_›%¦¶tÖ¾½šüÛ&3±ÿÆwÊaíÒ=œº”›ª8¨³™4¬Þ¥hx8sùêUoÈųbe ­ÿ{,=Â&0ÈyEfp^n/Æ\ þp>磒c;ˆÎ5úÈ0/K¨¸ 4çÆ­Ýñ,«k]½L89ú¾PÔÕæªÖÏêjpõeƽ=CºÂù/2õVböŰck,™jÄu‡Cø™£˜ļ^,ʬLm‚œ€b¾x3•õZ´!än™Ãâä¦þÎ9Ë™²§–Meƒ/f†sWÆ&6Å&‘kó¦ýàî4æé¹%zÕv­Îÿù’äþ‡¹³=púñ"«zUhÍbßÞœÆÏ`ÆDáGsÍó¿ç“ ǰœÚίnfì¢ÿ°kí-„/ÛJB¶Wÿ4ÍŠàÓi”.ë°‘º+ŸâÇÜðvÆ!.4·¥Ò·÷bz_(êjqUëguµ.¹z¡2f[¼ñä &ú˜¨´"\Zv§ p\¥¸îpPè8_yb~IJ- Ñ’½=TÞáYarþÙ ÷æ7o.<Á¿ù„Ÿ¤XD’çÜ|Þÿ‹&S€ Ÿ½Nâ²,g˜S£dÙ”0ñ×P\ ?¹þ—¼qHD$OVõ=îèÜ…ÍÇÈ¢¨L±‹ˆ¥JäK]κfð”q³ä›˜£rºÌ![N‚¬ŸÖ­².žrÿ¼¾rìhYh¢£Ãåà×!r³û•¸/4©« ÀU­ŸÕÕ:æjõe6ˆ{û¿É‚%»¤¬À³d&þ"ó¼ԉë(¨z Ð5Çó¶wø}KÞù¯ÛYð§Á)Š¢(Š¢(W§ºT£O½:4ÂÔ´/“ßû’A,MÔ†²¢(Š¢(Š¢e<{LcõO´'êã‡üüVò5b€¢(Š¢(Šr¨³Ó0EQEQåZ£QµEQEQEËŠ¢(Š¢(ŠrÍËFšŽþ‚#Ö\~|²-.—“•ÁHãÞtmét…[ó,3®t{+ ±F2ÒGŪëÚ_ß®*êjCrUë^uUëUåZ6– ¹g}’2‡›Ý*ä=dfIfΙL4jÝ™æ&_:thŒé’‹dâö¹CÈÜ3€5=¯°¼Ž*3€`-¶‚¥‹Î¿ú¨«Šºzºªu¯ºªõªreqNMª®ƒòØóÍ>v'·55±7ÕVöm‡ôÂ3g3ß**û? ‰ ï$dky⸜ÝQ FÃUúóWf°aÎ<…Ýœ…Ù¦b]uÔUE]½N]ÕºW]ÕzU¹¢œˆæ»–8·"¿I±lãvÇç¶òÜo"ß?SËI+gÉ[>@¼ªÊÏà.mF½&+v¥ˆ¹ìØ’ä‹¿‰ ߯t·žªÒo]åÖ3»÷øÈcá½%1¹ô³¬m¡2k„G…Ý{ â×#Xæ.é-qq#Ïæ‘>\âHcÍËìÏ)Xÿ€™.t>“ÜñÎ]bÍ-I¯ûTÞ/¤QXÉÊ-Ö¤P£AÀ$ÝžXÚkÜÚNÚ;WÞ¾ðë r.ëÙ¹¹H€O-Ê\ÕòÁÿ”}R"ëGøÔ¼Wbh,÷FZDÃ¥Ÿ¿I{iW,©«tµìû…k†ŠwÙ1î=ÈQÉ“åwz©?êjÃsUë^uµ.¸ªÖ÷t¿ø°Vß .æà×+I É_:¸Á—ÐÂ0îü”Ÿ2k>åÒ¢¡íD}¼Žc—<¯ÌHPO?ü{l Ò°¿.d€¶7âqÎl¶B §Êznö¢ŽçÕnôÌ9p(/¯ÜErN6Ûi2v¾N7œñp«Å]É%rê"<¦òsV*;¾œÅÄ>Íq3hwͱ¨«µuµ8m?ixs£³ê£®6ÊáÖ[ú0ê©OùóJ]°ÿ]Fqûø…üê?Ž÷¶!5âiºxèÝâÐj]]­«vvÀ ×ÕÕéªÖ½êj]pU=¬Ç|”_Ê<´(ž+Shýßcé6AÎÛø(2ƒóî{1æbððoĹ}ÿ’c;ˆÎ5úÈ0/Ÿ¥¸ 4çÆ­Ýñ,óÈÕË„vŽEç’»·d`3œè6&V YÄ×v9ëÊŒ{{†t…ó_dþê­Äì‹aÇÖX2/õ&/N#jÅl& ë@à€w)ΜA¾ª¢#QW⪢®6$WµîUWµ  \"  4t@0˜ZÍÂÿù’äþ‡¹³=púñ"«zýbÍbßÞœÆÏ`ÆDáGsÍó¿ç“ ǰœÚίnfì¢ÿ°kí-„/ÛJB¶Wÿ4ÍŠàÓiesAl¤îʧø17<‡ÝÆŸ±dˆ Ím©ôí}€ØèfE1¯WËc†2+ÓD› ' ˜/ÞLåpm'Ë_¨ÌE‡Ù–o<9ƒI‡>&*­—–Ýi¯U‡Õ—3ù+c›b“ȵyÓ~pwsŠôÜUѱµººz9®*êjCrUë^uUÛÊ¥3·¬}|Õ‡‘sý/yãˆHž¬ê{6„̹“ß›‘EQ™b)J•È—ºœ oð”q³ä›˜£rº,zŠ-'AÖOëVy¿‹§Ü?¯¯;Zîåèp9øuˆÜ|&lŒ¯<1¿$¥–~ž½=TÞáY!³“ûÍÿnzfÒ=µ.³AÜÛÿMl<(Ù%e¶˜%3ñ™V‹E&¦>{ÄeY΄©1§Fɲ)aâoÔÉóOêjÕ®V±Å0A¢DdË_üÔuµá¹ªu¯ºZ\Uëe¸¸JýsËŸ©n“EQEQEi¸œúWU>w©DpOÙŠ¢(Š¢(Šr=5”ïáœéU­+Þ^Ö¢Þ£¿™¢(Š¢(Šr°§¬ý»ýܪ[“š,¼€;ô÷SEQEQ(sqeí_jÚX.g#° pºRõH´¢(Š¢(Š¢Ô'¬ÀRàïÀ—:°6Ѱ=)ÇÑè£ EQEQ”ºÏ ØGi0‹ï(ݘï¢üîè!6yg¡ÑIEND®B`‚stem-1.7.1/docs/_static/buttons/0000775000175000017500000000000013411004021017250 5ustar atagaratagar00000000000000stem-1.7.1/docs/_static/buttons/resources/0000775000175000017500000000000013411004021021262 5ustar atagaratagar00000000000000stem-1.7.1/docs/_static/buttons/resources/button_background.xcf0000664000175000017500000014742613157571677025555 0ustar atagaratagar00000000000000gimp xcf fileôPBœBœBgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) gamma0.45454999804496765±¿ðÌÞôP Backgroundÿ     XôPx¿Ì¿Ø¿äôPIJ-ÉA¿U¯j5~c’˥驿¬ê¯ì³¶ ¹/¼mü¨½×Õ'Õþëç çþæç çþæççþæççþíç6çþíççþæçççþæççþæççþêç8ç:ç:çæþçææþçææþçææñçæççæçæçææçææçææþçææþçææüçæçææåæåèæååææåæåææååæåææåææååææååüæåæååüæååææåþäååûäååäååùäåäååäååäåøäåääåääååõäååääååäååäþãääþãääùãääãäãääþãääãäþãääþãää:ã:ãâûãââãââúãâãâãââùãâãâãâããâãâüãâãââãââáâáýâáââþáââþáââáâùáâáââáââáûâáââááþâááâþ¬ááþàááàýáàááüàáàááûàááàááüàáàááþàááþ²à9àþà9àümààßßàßüàßàßßàßûàßààßßàúßààßàßßàößààßßàßààùhÞßßÞÞßßüÞßßÞÞßÞßõÞßßÞßßÞßÞßÞÞßþÞßßýÞßÞÞüßÞÞûlÞÞÝÞÞÝÞþÝÞ ÞþÝÞÞûÝÞÞÝÞÞþÝÞÞýÝÞþeÝ-ÝþÜÝÝþÜÝÝþfÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜþÝÜÜûÝÜÝÝÜÜþÝÜÜþÝÜÜþÝÜÜþfÜ9ÜþfÜÜÛùÜÛÜÜÛÛÜÜÛÜöÛÜÛÜÜÛÛÜÜÛÛÜÛÜýÛÜÛÛÜÛýÜÛþfÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛûÚÛÚÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛÛþfÚ(ÚþÙÚÚþfÙÙûÚÙÙÚÙÙþÚÙÙÚÙþÚÙÙùÚÙÙÚÙÚÙÙþÚÙÙüfØÙØØÙØÙúØÙÙØÙØØõÙØÙØØÙÙØØÙØØÙØÙøØÙÙØÙÙØÙÙûØÙÙØþfØ9ØþfØØùרר×רØúרØ×רØø×Ø×Ø×Ø×ØØþרØûר×רØþרØþf×9×þfÖÖþ×ÖÖþ×Ö Öþ×ÖÖþ×Ö Ö×Öú×Ö×Ö×ÖÖþfÕÕþÖÕÕøÖÕÖÖÕÕÖÕÕÖÕþÖÕÕÖÕôÖÕÖÖÕÖÖÕÖÖÕÖÖÕøfÔÕÔÕÕÔÕÕÔÕþÔÕÕÔÕÔýÕÔÕÕøÔÕÕÔÔÕÔÕÕþÔÕÕÔÕüÔÕÔþfÔ9ÔþfÔ9ÔþfÓ ÓþÔÓÓþÔÓÓûÔÓÓÔÓÓþÔÓÓþÔÓÓüfÒÓÒÒÓýÒÓÒÒþÓÒÒøÓÒÒÓÒÓÒÓÓÒûÓÒÓÒÓÓÒûÓÒÒÓÒÒýfÑÒÒþÑÒÒÑøÒÑÒÑÒÑÒÑÑÒüÑÒÒÑÑÒÑûÒÑÒÒÑÑöÒÑÒÒÑÒÒÑÑÒÒýÑÒþfÑ9ÑþfÑ9ÑþfÐÐÑýÐÑÐÐþÑÐ ÐÑýÐÑÐÐûÑÐÐÑÐÐúÑÐÐÑÑÐÐþÑÐÐûfÐÏÏÐÐõÏÐÏÐÏÐÐÏÏÐÏÏôÐÏÏÐÏÐÏÐÐÏÐÏÏ÷ÐÏÏÐÏÐÏÐÏ ÏÐþfÎÎÏþÎÏÏúÎÏÎÏÏÎÎüÏÎÎÏÏøÎÏÏÎÏÎÏÎÎÏþÎÏÏÎÏýÎÏýfÍÎÎþÍÎÎþÍÎÎþÍÎÎûÍÎÎÍÎ ÎüÍÎÍÎÎþfÍ9ÍþfÍ9Í÷fÍÍÌÌÍÌÍÌÌÍÌæÍÌÌÍÌÍÍÌÍÍÌÍÌÍÍÌÍÌÌÍÌÌÍÌÌÍÍÌùÍÌÍÍÌÌýfÌËËýÌËÌÌöËÌÌËÌËÌÌËÌÌËÌËøÌËÌËÌËËÌÌþËÌÌýËÌËËÌËþfËËþÊËËþÊËËþÊËËþÊËËûÊËËÊËËþÊËËþfÊ9ÊüfÉÊÉÉöÊÉÉÊÉÊÉÉÊÉÉþÊÉÉþÊÉÉþÊÉÉÊÉüÊÉÉþfÉ9ÉþfÈÈýÉÈÉÉÈýÉÈÉÉþÈÉÉüÈÉÈÉÉýÈÉÈÈùÉÈÈÉÉÈÉÉÈüÉÈÈÉÉüÈÉÉ ÈþÇÈÈþÇÈÈûÇÈÇÇÈÈÇÈþÇÈÈþÇÈÈþÇÈÈü[Ç9ÇÆûÇÆÆÇÆÆþÇÆÆþÇÆÆþÇÆÆùÇÆÇÆÇÇÆÆþÇÆÆ:ÆúÄÓäããä%äþëç4çþíç6çþíç7ç9çþêç8ç:ç:çþçææûçææçææþçææþçææøçæççææçææçþæçç æýåæååæüåææååþæååþæååæåæåæåûæååæååûæåæååäûåäåäååäåüäåäååþäååþäååäåïäåääååääåäååäååääþãääþãääã äãäøãäããääãääþãääþãää:ã:ãýâãââãþâããâãâãâãâãñâãââãâãââããâããââãâùãââãââüáâáââáâöáâáâáâááâááâúáâáâáââáâûáâáâááâáþâááþÊá áþàááàáþàááúàáàáàááúàáààáþÏà9àþÄà9àý§àßßöàßààßààßàßßþàßßþàßßüàßßààßüàßàßßàßàß÷àßßàßàßàû¥ßßÞßßÞßüÞßÞßßýÞßÞÞìßÞßßÞßÞßßÞÞßßÞßßÞßßÞÞßÞßûÞßßÞþ¨ÞÞþÝÞÞûÝÞÞÝÞÞÝÞúÝÞÞÝÝÞÞÝÞþÝÞÞþ¤Ý9Ýþ¦ÝÝÜþÝÜÜüÝÜÝÜÜþÝÜÜûÝÜÝÜÝÝýÜÝÜÜþÝÜÜþÝÜÜþ¦Ü9Üþ¦ÛÛÜÛÜÛüÜÛÛÜÜÛÜüÛÜÛÜÜþÛÜÜþÛÜÜÛÜþÛÜÜÛþ¦ÛÛþÚÛÛüÚÛÚÛÛþÚÛÛûÚÛÛÚÛÛüÚÛÚÛÛþÚÛÛõÚÛÛÚÛÛÚÛÚÚþ¦Ú9Úþ¦Ù ÙûÚÙÙÚÙÙÚÙúÚÙÚÙÚÙÙþÚÙÙþÚÙ Ùö¦ØÙÙØÙÙØÙØØýÙØÙÙØûÙØØÙØØÙýØÙØØðÙØÙÙØÙÙØØÙÙØØÙÙØØþ¦Ø9Øû¦ØØ×ØØ×Ø×ýØ×Ø Ø×Øø×ØØ×ØØ×ØØþר Øþ×þ¦×9×þ¦ÖÖ×Öö×ÖÖ×Ö××ÖÖ××úÖ×ÖÖ×ÖÖþ×ÖÖþ×ÖÖ÷¦ÕÖÕÕÖÕÕÖÖÕÖÕÖÕÖÕþÖÕÕþÖÕÕñÖÕÕÖÕÕÖÕÕÖÖÕÖÖù¦ÕÕÔÕÔÕÕüÔÕÔÕÕüÔÕÔÕÕûÔÕÕÔÕÕÔÕÔÕúÔÕÕÔÕþ¦Ô9Ôþ¦Ô+ÔþÓÔ Ôü¦ÔÔÓÓüÔÓÔÓÓÔÓþÔÓÓþÔÓÓþÔÓÓüÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓü¦ÒÒÓÓÒýÓÒÓÓÒÓÒÓÒÓÒúÓÒÒÓÓÒÒÓÒüÓÒÒÓÓÒüÓÒÓþ¦ÒÒÑøÒÑÑÒÑÒÑÒÒÑÒÑÒüÑÒÑÒÒÑÒÑÒÑÒûÑÒÑÑÒÒþ¦Ñ9Ñþ¦Ñ9Ñþ¦ÐÐþÑÐÐþÑÐÐÑÐÑÐõÑÐÐÑÐÐÑÑÐÑÐÐÑ÷¦ÏÏÐÐÏÐÏÐÐûÏÐÏÐÏÏñÐÏÐÐÏÐÏÏÐÐÏÐÏÐÏÏÐÏüÐÏÏÐÐþÏÐÐÏþÐù¦ÎÎÏÎÏÎÎøÏÎÏÎÏÎÎÏÏÎõÏÎÏÎÏÏÎÏÎÎÏÏùÎÏÏÎÏÏÎÎþÏÎÎùÏÎÎÏÎÏû¦ÎÍÍÎÎþÍÎÎÍÎþÍÎÎüÍÎÍÎÎûÍÎÎÍÎÎþÍÎÎþ¦Í9Íþ¦Í9Íù¦ÍÌÌÍÍÌÌüÍÌÍÌÌúÍÌÍÌÌÍÍÌüÍÌÌÍÍúÌÍÌÍÍÌÌýÍÌÍÍÌÍûÌÍÌÍù¦ËËÌËËÌÌúËÌÌËËÌÌËÌþËÌÌþËÌÌËüÌËËÌÌËÌþËÌÌËû¥ÊËÊËËûÊËËÊËËþÊËËþÊËËþÊËËüÊËËÊÊËÊËþÊþ¤Ê9Êþ¤ÉÉÊÉþÊÉÉþÊÉÉ÷ÊÉÊÉÉÊÉÊÉÉùÊÉÊÉÉÊÉÉÊ ÉþÊÉÉþ¢É9Éó¡ÉÈÉÈÉÉÈÉÉÈÈÉÉÈÉøÈÉÉÈÉÉÈÉÉÈÉÈÉÈÉÈþÉÈÈÉÈûÇÈÈÇÈÈþÇÈÈûÇÈÇÇÈÈþÇÈÈüÇÈÇÈÈþÇÈ ÈþÇÈÈüzÇ ÇþÆÇÇüÆÇÇÆÆþÇÆÆÇÆþÇÆÆþÇÆÆüÇÆÇÆÆÇùÆÇÆÆÇÆ:Æ+ÿþëç4çþíç6çþíç%çþæçç9çþêç8ç:ç:çæüçæçææüçæçææûçææçææçæøçæçææççææþçææþçûåæåæååæåõæåææåæååæåææåûæååæååæåüæååææåûæåæåäåøäåäåääåääåûäååäååþäååäåøäååäåäåääåþäåå äþãä äþãääþãääþãä äãäýãä:ã:ãþãââùãââãâãââãâãøâããâãâãââþãââãâãâþãüáââááøâáâááâáââþáââáüâáâááâúáâááâááâ÷áââááâáâþÿááþàááþàááþàá áàüáààááþàþÿà9àþÿà9àòÿßààßßàßßàßßàßßþàßßýàßààûßàßàßßþàßßàßàþßààßýÿÞßßôÞßÞßÞßÞßÞßÞßßÞßýÞßÞÞóßÞÞßÞßÞÞßßÞÞßßúÞßÞßÞßßþÿÞÞÝÞþÝÞÞþÝÞ ÞÝÞþÝÞÞûÝÞÞÝÞÞüÝÞÞÝÝÞþÿÝ9ÝûÿÜÜÝÜÜþÝÜÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜüÝÜÝþÿÜ9ÜþÿÜÜÛÜþÛÜÜîÛÜÜÛÜÜÛÜÛÜÛÛÜÛÜÛÛÜÜÛÜûÛÜÛÛÜÜþÛÜÜÛþÜüÿÛÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛþÚÛÛÚýÛÚÛÛþÿÚ*ÚþÙÚ ÚûÿÚÙÚÙÙþÚÙÙþÚÙÙþÚÙ ÙþÚÙÙþÚÙÙýÿØÙÙüØÙÙØØÙøØÙØÙÙØÙØØÙûØÙØÙØØÙúØÙØØÙØØþÙØØýÙØþÿØ9ØùÿרØ×רØ×ýØ×ØØø×Ø×ØØ×רØ×üØ×רØþÿ×9×þÿÖÖþ×ÖÖþ×ÖÖ×Öþ×ÖÖþ×ÖÖþ×ÖÖú×ÖÖ×Ö×× Öü×Ö×ûÿÕÖÕÖÖøÕÖÖÕÖÕÖÕÕþÖÕÕþÖÕÕÖÕþÖÕÕÖÕÖÕÖþÕÖÖÕøÿÕÕÔÕÔÔÕÕüÔÕÔÕÕÔÕþÔÕÕÔþÕÔÔùÕÔÕÔÕÕÔÔÕÔýÕÔþÿÔ9ÔþÿÔ9ÔþÿÓÓþÔÓÓÔýÓÔÓ ÓþÔÓÓÔÓþÔÓÓüÔÓÔÓÓûÿÓÒÒÓÓÒþÓÒÒôÓÒÓÒÓÓÒÒÓÒÓÒÒüÓÒÓÒÒüÓÒÓÒÒöÓÒÒÓÒÒÓÒÒÓÓþÒþÿÒÒþÑÒÒþÑÒÒÑÒÑÒêÑÒÒÑÑÒÒÑÒÒÑÑÒÒÑÒÑÒÑÒÑÒÒúÑÒÑÒÒþÿÑ9ÑþÿÑ9ÑþÿÐ ÐþÑÐÐÑþÐÑÑ ÐþÑÐÐüÑÐÑÐÐúÿÏÏÐÏÐÐÏûÐÏÐÐÏÏúÐÏÏÐÐÏÏùÐÏÐÏÐÐÏÏóÐÏÏÐÏÐÐÏÐÏÏÐÏÏÐþÏüÿÏÏÎÎÏþÎÏÏøÎÏÎÎÏÎÎÏÏþÎÏÏþÎÏÏúÎÏÏÎÏÎÎõÏÎÎÏÎÎÏÎÎÏÎÎûÿÎÎÍÎÎþÍÎÎèÍÎÎÍÍÎÍÎÍÎÎÍÎÎÍÍÎÎÍÎÎÍÍÎÎýÍÎþÿÍ9ÍþÿÍ9ÍþÿÌÌÍÌþÍÌÌþÍÌÌýÍÌÍÍüÌÍÌÍÍÌÍýÌÍÌÌþÍÌÌúÍÌÍÌÌÍÍþÿÌÌüËÌËÌÌþËÌÌËóÌËËÌÌËÌÌËÌËËÌÌûËÌÌËÌÌðËÌÌËÌÌËËÌÌËÌËËÌþÿË ËþÊËËþÊËËþÊË ËþÊËËüÊËËÊÊýËÊþÿÊ9ÊþÿÊÊÉüÊÉÊÉÉÊÉþÊÉÉùÊÉÊÉÊÉÊÊÉþÊÉÉüÊÉÉþÿÉ9ÉþÿÈÈÉÈÉÈÉùÈÉÈÉÈÈÉÉ÷ÈÉÈÉÈÈÉÉÈÈÉÈùÉÈÉÉÈÉÈÈþÉÈþÇÈÈþÇÈÈþÇÈÈþÇÈÈÇûÈÇÈÇÈÈþÇÈÈüÿÇ9ÇÆüÇÆÇÆÆþÇÆÆÇÆþÇÆÆþÇÆÆÇ Æ:ÆIýåýÿ3ÿþÿ6ÿþÿ7ÿ9ÿþåÿ8ÿþýÿ8ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ?Õ³çþæççþæçïçþæççæþçææþçææ÷çææççæççææþçææþçææüçæçææþçææþçææýåæååûæåææååæøåæåæååæååþæååþæååæøåæåææåæååæúåæåææååüæåæååôäåääååääåäåääåüäååääøåäåääåäååþäååþäååþäååþäååøäåääåäãääþãääþãääãäþãääþãääþãääãä€ãüâããâ âãâóãâããâãââããâãââüãâãââãâãâãâùãâãááâááâþáââýáâááýâáââþáââõáâááâáâááâááâøáâáâáâáââûáàáàááþàááþàááüàáàááþàá áûàááàá áþàááþàáá€àßþàßßàßàßþàßßàßþàßßàüßààßßþàßßàùßàßßààßßþàßßàþÞßßÞßÞûßÞßÞßßÞßþÞßßþÞßßøÞßßÞßÞßÞÞþßÞÞþßÞÞþÝÞÞþÝÞÞþÝÞÞýÝÞÝÝÞ÷ÝÞÞÝÞÝÞÝÞÞþÝÞÞþÝÞÞÝýÞÝÞÞýÝÞÝ7ÝþÜÝÝÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜûÝÜÝÝÜÜûÝÜÝÝÜÜÝÜÝBÜøÛÜÛÛÜÛÜÛÛúÜÛÜÜÛÜÜÛýÜÛÜÜÛÜþÛÜÜöÛÜÜÛÜÜÛÜÛÜÜÛÜýÛÜÛÛüÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛñÚÛÛÚÛÚÛÚÛÚÛÚÛÚÛÛüÚÛÚÛ ÛÚûÛÚÛÛÚ>ÚüÙÚÚÙ ÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÚÙÙîØÙØØÙÙØÙØØÙØØÙØÙÙØØþÙØØñÙØÙØÙØÙØØÙÙØÙÙØØîÙØÙÙØÙØÙØÙÙØØÙØØÙØBØþרØòר×רØ×ØØ×Ø×Ø×רüררØþרØ?×ýÖ×ÖÖü×Ö×ÖÖþ×ÖÖ×ýÖ×ÖÖþ×Ö Ö×Öþ×ÖÖÕþÖÕÕüÖÕÖÕÕþÖÕÕÖöÕÖÕÖÕÕÖÕÖÕÕûÖÕÖÖÕÕìÖÕÖÖÕÖÖÕÖÕÕÖÖÕÖÕÖÕÔÕÕþÔÕÕÔÕþÔÕÕÔÕÔøÕÔÕÕÔÕÔÕÕùÔÕÔÕÕÔÕÕÔÕúÔÕÕÔÔÕÕ€ÔúÓÔÔÓÔÓÓþÔÓÓúÔÓÔÓÔÓÓðÔÓÔÔÓÔÓÓÔÓÓÔÓÓÔÓ ÓÔÓþÔÓÓþÒÓÓñÒÓÒÓÓÒÓÓÒÓÒÒÓÓÒÒÓÒûÓÒÓÓÒÒÓûÒÓÒÓÒÒÓýÒÓÒÒÓúÒÓÑÒÑÒÒþÑÒÒþÑÒÒþÑÒÒþÑÒÒõÑÒÑÒÑÒÒÑÒÑÒÒÑÒûÑÒÑÑÒÒýÑÒÑ~ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐùÑÐÐÑÐÐÑÑÐþÑÐÐøÏÐÐÏÐÏÐÏÏôÐÏÐÏÏÐÏÐÐÏÐÏÏÐÏþÐÏÏüÐÏÐÏÏþÐÏÏþÐÏÏûÐÏÐÐÏÏ÷ÐÏÏÐÎÏÎÏÎÎÏÎÏüÎÏÎÏÏþÎÏÏþÎÏÏÎÏýÎÏÎÎÏÎÏÎÏÎùÏÎÏÎÎÍÎÎþÍÎ ÎþÍÎÎÍÎÍÎþÍÎÎûÍÎÎÍÎÎþÍÎÎýÍÎÍ~ÍÌùÍÌÍÌÌÍÌÌþÍÌÌþÍÌÌÍýÌÍÌÌþÍÌÌÍÌþÍÌÌüËÌÌËËÌþËÌÌËúÌËÌËÌËËýÌËÌÌþËÌÌËÌþËÌÌüËÌËÌÌôËÌÌËÌËËÌÌËËÌÌýËÊËËþÊË ËþÊËËÊüËÊËÊÊËþÊËËÊËüÊËËÊ>ÊÉþÊÉÉÊÉþÊÉÉüÊÉÊÉÉþÊÉÉüÊÉÊÉÉþÊÉEÉÈÉÈÉÈÉþÈÉÉÈÉÈýÉÈÉÉüÈÉÈÉÉøÈÉÉÈÉÈÈÉÉüÈÉÈÉÉýÈÉÈÈþÇÈ ÈþÇÈÈþÇÈÈûÇÈÈÇÈÈüÇÈÇÈ ÈþÇÈÈüÇÈÈÇ ÇþÆÇ1ÇûÆÇÆÇÆÆÇÆûÇÆÆÇÆÆüÇÆÇÆÆÇÆþÇÆÆûÇÆÆÇÆÆþÇÆDÆ?äÀçæçæþçææüçæçææçýæçææûçææçææþçææçæþçææüçåæååùæåæåææååüæååææå÷æåæåæååæååþæååþæååþæååþæååüæåæååþäååþäååäåäþåääåûäååäååþäååüäåäååäåòäååäåäååäååäãääþãääãäúãäãäãääþãääøãäãääããää‡ãâøãâãâããâããüâããââóãâãââãâããâãâããâãâãâãâúãââáâáá âáûâáâáââþáââúáâáâáââáúâááâáââáùâááââáââáüàáàááþàááþàááàýáàááàáúàááààááùàáàáààáá‚àßþàßßýàßààßþàßß÷àßßàßßààßßàýßàßßüàßàßßùàßàßàßÞÞûßÞßßÞÞúßÞÞßßÞÞßõÞßßÞßÞßÞßßÞÞßþÞßßÞßüÞßÞßß ÞüÝÞÝÞÞÝüÞÝÝÞÞþÝÞÞúÝÞÞÝÝÞÞüÝÞÝÞÞÝÞþÝÞÞ?ÝÜþÝÜÜÝÜþÝÜÜÝÜûÝÜÜÝÜÜþÝÜÜþÝÜÜúÝÜÜÝÝÜÜûÝÜÜÝÜ@ÜÛÜøÛÜÛÛÜÜÛÜÜÛÜûÛÜÜÛÜÜùÛÜÛÜÛÛÜÜöÛÜÛÜÛÜÛÜÛÜÜÛÚýÛÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛýÚÛÚ>ÚÙÚÙþÚÙÙþÚÙÙþÚÙ ÙþÚÙÙþÚÙÙþÚÙÙØÙØÙØþÙØØÙüØÙØÙÙØîÙØÙØÙØÙØØÙØØÙÙØÙØÙÙØÙNØþרØø×ØØ×Ø×רØþר Øþר Ø?×üÖ×Ö××ýÖ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×ÖÖ××Öú×ÖÖ××ÖÖþ×ÖÖ×ûÖÕÕÖÕÕÖÕÖÕþÖÕÕÖÕÖÕÖÕýÖÕÖÖÕþÖÕÕüÔÕÕÔÔýÕÔÕÕýÔÕÔÔÕþÔÕÕÔÕÔúÕÔÔÕÕÔÔÕþÔÕÕþÔÕÕýÔÕÔ~ÔÓþÔÓÓþÔÓÓüÔÓÔÓ ÓÔÓúÔÓÔÓÔÓÓþÔÓÓóÒÓÓÒÒÓÓÒÒÓÒÓÒÒúÓÒÓÒÒÓÓÒÓÒúÓÒÓÒÓÒÒÓÒôÓÒÓÓÒÒÓÓÑÒÑÒÒÑÒÑÒýÑÒÑÑòÒÑÒÑÑÒÑÑÒÑÒÑÑÒÒÑÒùÑÒÑÒÑÒÑÑþÒÑÑüÒÑÒÑ~ÑýÐÑÐÐÑÐüÑÐÑÐÐþÑÐÐÑÐþÑÐÐÑýÐÏÐÐüÏÐÐÏÏõÐÏÐÏÐÏÏÐÏÐÏÏÐûÏÐÏÏÐÐÏÐÏùÐÏÏÐÏÐÏÏÐÏÐÏûÎÏÏÎÏÏþÎÏÏþÎÏÏÎ÷ÏÎÎÏÏÎÎÏÎÎ ÏÎÏÎÏ ÎÍÎÍÎþÍÎÎþÍÎÎþÍÎ΀ÍÌþÍÌÌþÍÌÌÍÌÍÌÍÌÍùÌÍÍÌÌÍÌÌóÍÌÍÌÌÍÌÍÌÍÌÍÌÌúÍÌÌÍÍÌÌþËÌÌËÌËÌËÌüËÌËÌ ÌËÌËýÌËÌÌýËÌËËÌËÌÊ ËþÊËËÊËüÊËÊËËþÊËËþÊËËÊ Ë?ÊÉþÊÉÉúÊÉÊÉÊÉÉÊÉøÊÉÉÊÉÉÊÉÉþÊÉÉÊÉþÊÉDÉþÈÉÉþÈÉÉþÈÉÉøÈÉÈÈÉÈÉÈÈòÉÈÈÉÈÉÉÈÉÈÈÉÈÉÉÈùÉÈÉÈÈÉÈÈýÉÈÉÉþÈÉÉÈûÇÈÈÇÈ ÈþÇÈÈþÇÈÈþÇÈÈþÇÈÈþÇÈÈùÇÈÈÇÈÈÇAÇÆþÇÆÆþÇÆÆùÇÆÆÇÆÇÆÆþÇÆÆüÇÆÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆ@Æ?ÿçþæççþæçUçþæçCç æûçææçææþçææþçææùçæççæçææüçæçææþçææçæçøæåææåææååüæååææåôæåæååæååæåæååþæå åæåþæååõæåæäååääåäååäûåääåääüåäåääåäåäþåääüåääååùäååääåääãäþãääøãääãääãääûãäããääãäøãäãääããääþãääãâòãâããââããââãâãââãúâããâãââþãââãâþãââãâþãââãâáâüáâáââùáâáââáââáâùáâáââáââáâøáââááâáââöáâáàáàáààááüàáàááþàááàáþàááþàááàáþàááàßàßàßþàßßþàßßðàßßàßßàßßàßßàßàß ßþàßßàßìÞßßÞßßÞßßÞßßÞßßÞßßÞßßüÞßÞßßüÞßÞß ß÷ÞßÞÞßÞßÞßßþÞßßýÞÝÞÞþÝÞÞûÝÞÞÝÞÞÝÞþÝÞÞÝÞþÝÞÞüÝÞÞÝ?Ý ÜûÝÜÜÝÜÜúÝÜÝÜÝÜÜþÝÜÜ÷ÝÜÜÝÜÜÝÝÜÜþÝÜÜþÝÜÜùÝÜÝÝÜÝÜ@ÜÛÜÛÜýÛÜÛÛõÜÛÛÜÜÛÜÛÜÛÜÜúÛÜÛÛÜÛÛÜþÛÜÜþÛÜÜÛÜÛøÚÛÛÚÛÛÚÛÛúÚÛÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛúÚÛÛÚÚÛÛþÚÛÛþÚÛÛ?ÚÙþÚÙÙþÚÙ ÙþÚÙ ÙþÚÙÙÚÙÚÙþÚÙÙØþÙØØþÙØØúÙØØÙÙØØüÙØÙØØÙØþÙØØÙØøÙØØÙÙØÙØØþÙØØÙCØ×úØ×Ø×רØþרØþרØþרØþרØø×ØØ×ØØ×ØØþרØýר×?×Öþ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×Ö×ÖÖø×ÖÖ×ÕÕÖÕÕüÖÕÖÕÕöÖÕÖÕÕÖÕÕÖÕÕÖ ÕÖÕäÖÕÕÖÕÕÖÕÖÕÖÕÕÖÕÖÔÔÕÕÔÕÔÔÕÕÔÕÕÔùÕÔÕÕÔÕÔÔÕ÷ÔÕÕÔÕÕÔÔÕÕüÔÕÔÕÕüÔÕÔÕÕÔÕüÔÕÕÔÔÓûÔÓÓÔÓÓþÔÓÓþÔÓÓúÔÓÔÓÔÓÓûÔÓÓÔÓÓÒÓòÒÓÓÒÒÓÒÒÓÓÒÓÓÒÒûÓÒÓÓÒÒüÓÒÓÒÒÓÒþÓÒÒÓÒÓúÒÓÓÒÑÒÒüÑÒÑÒÒþÑÒÒÑ ÒêÑÒÒÑÑÒÒÑÑÒÑÑÒÑÒÑÑÒÑÒÒÑÑþÒÑÑýÒÑÒÒ€ÑÐþÑÐÐþÑÐÐþÑÐÐûÑÐÐÑÐÐüÑÐÑÐÐþÑÐÐþÏÐÐÏÐÏÐûÏÐÏÏÐÐÏÐ ÏÐúÏÐÏÐÐÏÏþÐÏÏýÐÏÐÐöÏÐÏÏÐÎÏÏÎÏÏùÎÏÎÏÎÎÏÏýÎÏÎÎúÏÎÎÏÏÎÎþÏÎÎûÏÎÎÏÎÎøÏÎÏÎÏÎÏÎÎÏÎûÏÍÎÍÎÎÍ ÎüÍÎÍÎÎüÍÎÍÎÎþÍÎÎÍÎþÍÎÎþÍÎÎüÍÎÎÍ‚ÍûÌÍÍÌÍÍÌùÍÌÍÌÌÍÌÌþÍÌÌþÍÌÌÍþÌÍÍÌÍÌþÍÌÌÍáÌÍËÌËËÌËÌËÌËÌËÌÌËËÌËËÌÌËËÌËÌËËÌÌúËÌËÌËÌÌËòÌËËÌËÌËËÌÌËËÌËËÌýËÌËËþÊËËüÊËÊËËÊËþÊËËÊËýÊËÊÊùËÊÊËËÊËË?ÊýÉÊÉÉÊ ÉÊÉþÊÉÉþÊÉÉþÊÉBÉþÈÉÉÈùÉÈÈÉÉÈÉÉüÈÉÈÉÉ÷ÈÉÉÈÉÉÈÈÉÉøÈÉÉÈÉÈÈÉÉÈÉÈüÉÈÇÈÈþÇÈ ÈüÇÈÇÈÈûÇÈÈÇÈÈûÇÈÈÇÈÈþÇÈ ÈúÇÈÈÇÈÇ?ÇÆþÇÆÆÇÆþÇÆÆþÇÆÆüÇÆÇÆÆÇÆþÇÆÆþÇÆÆþÇÆÆþÇÆ?Æ@Àÿ?Õ?çþæç}çæçæþçææøçæçæçææççüæççææþçææþçææçûæåææååæåþæååæþåææåæðåæåæååææååæååææååæûåæåæååþæååþäååýäåääåþäåå÷äååääååäååäåäþåääýåäååäþãääûãääãääùãäããäãääüãäãääüãäãääãâõãââãâãâãâãââúãââããââöãâããââãâãââãýâãââøãââãâããââãõâáââáââáâáââáâþáââáþâááâôáââáâáââáâáââáâáâüáâáââáþàááàáþàááüàáàááþàááøàááààáàááþàáá‡àßðàßàßßàßßàßààßßàßßþàßßþàßßöàßßààßßààßßàßòàßàßßàßàÞÞßÞÞßßÞßøÞßÞÞßßÞßßÞßúÞßßÞÞßßôÞßßÞßßÞÞßßÞßßûÞßÞÝÞÞþÝÞÞøÝÞÞÝÞÝÝÞÞûÝÞÞÝÞÞþÝÞÞþÝÞÞþÝÞÞöÝÞÞÝÞÝÝÞÞÝ>ÝÜþÝÜÜÝ ÜþÝÜÜþÝÜÜÝÜÝÜÝDÜúÛÜÜÛÛÜÜûÛÜÜÛÜÜùÛÜÛÛÜÛÜÜþÛÜÜþÛÜÜþÛÜ ÜøÛÜÛÜÛÛÜÛÛþÚÛÛþÚÛÛÚÛþÚÛÛÚÛÚþÙÚÚþÙÚ ÚÙôÚÙÙÚÚÙÚÙÙÚÙÚÚÙùÚÙÙÚÙÚÙÙüÚÙÚÙÙüØÙÙØØÙØýÙØÙÙØþÙØØÙýØÙØØÙØðÙØØÙØÙØÙØÙØÙØÙÙØØüÙØÙØ?Øþר ØþרØüררØþרØþרØôרØ×ØØ×ØØ×רØþרØüרØ×>×Öþ×ÖÖõ×ÖÖ×ÖÖ××Ö×ÖÖ× Ö×Ö× ÖÕûÖÕÕÖÕÕïÖÕÕÖÕÕÖÕÖÕÕÖÕÖÕÖÕÕÖ÷ÕÖÕÖÖÕÕÖÕÕûÖÕÕÖÕÕüÖÕÖÕÕÖÕþÔÕÕÔþÕÔÔþÕÔÔÕýÔÕÔÔÕüÔÕÔÕÕûÔÕÔÔÕÕþÔÕÕýÔÕÔÔþÕÔÔþÕÔ~ÔÓûÔÓÓÔÓÓüÔÓÔÓÓþÔÓÓüÔÓÔÓÓÔÓüÔÓÔÓÓþÔÓÓùÒÓÓÒÒÓÒÒþÓÒÒÓÒ÷ÓÒÒÓÓÒÒÓÒÒ÷ÓÒÓÓÒÓÓÒÓÓýÒÓÒÒþÓÒÒüÑÒÑÒÒÑÒúÑÒÒÑÒÑÑÒþÑÒÒöÑÒÒÑÒÒÑÒÑÒÒÑÒôÑÒÑÑÒÒÑÒÑÒÒÑÑþÒÑÑüÐÑÐÑÑÐÑúÐÑÐÐÑÐÐüÑÐÑÐ ÐüÑÐÑÐÐþÑÐÐþÑÐÐöÏÐÏÐÐÏÐÏÏÐÐýÏÐÏÏÐÏøÐÏÐÏÐÏÏÐÐýÏÐÏÏüÐÏÏÐÐÏÐÏÐ÷ÏÐÏÐÏÏÎÏÎÎÏÎÏ÷ÎÏÎÎÏÎÏÎÏÏþÎÏÏþÎÏÏùÎÏÎÏÎÎÏÏùÎÏÏÎÏÎÏÏÎÏÎüÍÎÍÎÎÍÎúÍÎÎÍÍÎÎöÍÎÍÍÎÍÍÎÍÎÎûÍÎÎÍÎ ÎÍ΀ÍÌþÍÌ ÌôÍÌÍÍÌÍÌÌÍÌÍÌÌþÍÌÌÍÌÍÌÍÌõÍÌÍÌÍÍÌÌËËÌÌýËÌËËÌËÌËýÌËÌÌËöÌËËÌÌËËÌËÌÌËýÌËÌÌËÌþËÌÌËÊËÊËþÊËËúÊËËÊÊËËøÊËËÊËËÊËËþÊËËþÊËËÊËAÊýÉÊÉÉþÊÉÉùÊÉÊÉÉÊÉ ÉüÊÉÊÉÉþÊÉÉþÊÉÉþÊÉIÉ÷ÈÉÈÉÈÉÈÈÉÉÈÉÈÉíÈÉÈÉÉÈÉÈÉÈÈÉÈÈÉÉÈÉÈÈúÉÈÉÈÇÈÈÇýÈÇÈÈüÇÈÇÈÈþÇÈ ÈÇÈÇýÈÇÈÈþÇÈÈ?ÇûÆÇÆÇÆÆþÇÆÆþÇÆÆþÇÆ ÆþÇÆÆþÇÆÆüÇÆÇÆCÆ?ä+çþæçƒçþæçÞçþæççþæçç æþçææûçææçææûçææçææþçææþçææþçææþçææþçææúåæååæåå÷æååæåæåæååýæåææüåæåææåæåõæåæååæåæåæååæåäå÷äåäåääåäååäýåäååþäååäåäýåäååýäåääãäþãääüãäãääãäãäþãääþãääóãääããääãäãäãääãþäã~ãüâããââüãâãââãùâãâããâããâãâñãâããâããâãââãâãââãâáòâáââááââáââááââáûâáâáââøáââáââáâ âáâáþàááà áþàááøàááàááàááàáþàááþàááàßàßýàßààþßààßàøßàßßàßàßßöàßàßßààßàßßàößààßàßàßàßßÞùßÞßßÞÞßßãÞßßÞßÞßÞÞßßÞßÞßÞÞßÞßÞßßÞßÞßÞßßúÞßÞÞßÞÞüßÞßÞÞþßÞÞþÝÞÞøÝÞÞÝÞÞÝÞÞþÝÞÞüÝÞÝÞÞþÝÞÞûÝÞÞÝÞÞþÝÞÞúÝÞÞÝÞÝ6ÝþÜÝÝÜûÝÜÜÝÜÜøÝÜÝÜÜÝÝÜÜþÝÜÜÝÜþÝÜÜþÝÜEÜÛÜÛÜþÛÜÜúÛÜÜÛÜÛÛÜöÛÜÜÛÛÜÛÜÛÜÜìÛÜÛÜÛÛÜÛÛÜÜÛÛÜÛÜÜÛÜÛÛþÚÛÛþÚÛÛûÚÛÛÚÛÛÚÛÚúÛÚÛÛÚÛÛ?ÚÙþÚÙÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÚÙÙüÚÙÚÙÙüÚÙÚÙÙÚÙýØÙØØÙØÙØøÙØÙØÙØÙØØÙØþÙØØÙØþÙØØýÙØÙÙØÙúØÙÙØÙØBØûרØ×ØØþרØþרØöרØ×Ø×ØØ×ØØ×ØþרØ×ýØ×ØØýר×?×ýÖ×ÖÖþ×ÖÖþ×ÖÖ÷×Ö××Ö×Ö×ÖÖþ×ÖÖþ×ÖÖ÷×ÖÕÖÖÕÕÖÕÕÖÕÖÕíÖÕÕÖÕÕÖÕÕÖÕÖÖÕÖÖÕÖÕÕÖýÕÖÕÕÖ÷ÕÖÕÖÖÕÕÖÕÕõÔÕÕÔÕÕÔÕÕÔÕÕþÔÕÕþÔÕÕóÔÕÔÔÕÔÕÔÕÕÔÕÔÔÕøÔÕÔÕÔÕÔÕÕýÔÕÔ~Ô ÓÔÓþÔÓ ÓþÔÓÓþÔÓÓøÔÓÓÔÔÓÔÓÓþÔÓÓþÔÓÓûÔÓÒÒÓÓúÒÓÒÓÓÒÒúÓÒÒÓÓÒÒûÓÒÓÓÒÒÓúÒÓÒÒÓÒÒõÓÒÓÓÒÒÓÒÓÓÒÒòÑÒÒÑÑÒÑÒÑÒÒÑÒÑÑýÒÑÒÒúÑÒÑÒÑÒÒûÑÒÒÑÒÒüÑÒÑÒÒòÑÒÑÑÒÑÒÑÒÑÒÑÑÒÒÑÐÑ ÐÑ ÐþÑÐ ÐüÑÐÑÐÐþÑÐÐüÑÐÐÏÏÐÏûÐÏÏÐÏÏÐÏûÐÏÏÐÏÏúÐÏÐÐÏÐÐüÏÐÐÏÏöÐÏÏÐÏÐÏÐÐÏÏÎüÏÎÎÏÏÎÏøÎÏÎÎÏÏÎÏÏûÎÏÏÎÏÏÎþÏÎÎÏöÎÏÎÏÏÎÎÏÎÏÏþÎÏÏÎÍ ÎþÍÎÎþÍÎÎÍúÎÍÎÎÍÎÎùÍÎÍÎÎÍÎÎþÍÎÎüÍÎÍÎ΃ÍÌúÍÌÍÌÍÌÌÍÌÍûÌÍÌÌÍÍÌÍÌþÍÌÌÍÌõÍÌÌÍÌÍÌÍÌÌÍÍýÌÍÌÌËÌþËÌÌËÌËÌüËÌÌËËüÌËÌËËþÌËËÌûËÌËËÌÌËÊËþÊËËþÊËËÊ÷ËÊËÊËÊËÊËËþÊËËþÊËËüÊËÊËËÊË?ÊúÉÊÉÉÊÉÉÊúÉÊÉÉÊÉÉÊÉþÊÉÉûÊÉÉÊÉÉþÊÉAÉþÈÉÉÈÉþÈÉÉþÈÉÉÈÉüÈÉÉÈÈÉôÈÉÈÉÈÉÈÉÈÉÈÉÉúÈÉÈÈÉÈÈþÇÈÈûÇÈÇÇÈÈþÇÈÈÇÈûÇÈÈÇÈÈ@ÇÆÇÆÇÆøÇÆÇÆÆÇÇÆÆþÇÆÆþÇÆÆþÇÆÆÇÆþÇÆ>Æ?ÿkçþæçRçæþçææûçæççææùçæçææçææþçææþçææþçæ æçþæååýæåææ åþæååýæåææåúæåææåææåùæåææåæååäåéäåääååääååääåäåäåäååäåääþåääñåääåäåäåäåäååäååäþãääãäûãääãääþãä äþãä äñãääããääãääãäãäã€ãâØãâããâãâãââãâãâãââãâããâããâãâããââãââãââãâããâõãââãââããâãââúáâááâááýâáââþáââáñâáâááââáââáâááââáâþáââûáâááââáþàá áôàááàááààááàá áþàááàáüàáàááûàááàáá€àøßààßààßààßàßûàßßàßßàßüàßàßßàößàßàßßàßßààüßààßßÞßÞßþÞßßÞüßÞßÞÞßÞýßÞßßùÞßÞÞßÞßßýÞßÞÞýßÞßßÞÝÞþÝÞÞüÝÞÝÞÞÝÞÝþÞÝÝÞþÝÞÞÝÞüÝÞÝÞÞ?ÝÜþÝÜÜÝÜûÝÜÜÝÜÜþÝÜÜúÝÜÜÝÝÜBÜúÛÜÛÜÜÛÛüÜÛÛÜÜÛÜÛÜûÛÜÛÜÛÛþÜÛÛýÜÛÜÜýÛÜÛÛÜÛüÜÛÚÛÛÚÛþÚÛÛÚÛÚÛúÚÛÚÛÚÛÛÚÛþÚÛÛ?ÚÙÚÙþÚÙÙþÚÙÙùÚÙÚÙÚÚÙÙþÚÙÙ÷ØÙØØÙØØÙØØúÙØÙØØÙÙõØÙÙØÙÙØÙÙØÙÙØÙýØÙØØûÙØÙÙØEØø×Ø×רØ×ØØùררØ×Ø'Ø?×ýÖ×ÖÖû×ÖÖ×ÖÖþ×Ö Öþ×Ö Öþ×ÖÖþ×ÖÖ×ÖÕþÖÕÕýÖÕÖÖýÕÖÕÕÖùÕÖÖÕÖÖÕÕôÖÕÕÖÕÖÕÕÖÕÕÖÖÕþÖÕÕþÖÕÕõÖÕÖÖÕÕÖÕÖÕÔÔÕþÔÕÕøÔÕÕÔÕÕÔÕÕøÔÕÔÔÕÔÔÕÕÔ÷ÕÔÕÔÕÔÕÕÔÔÕýÔÕÔÔûÕÔÕÕÔ~ÔøÓÔÓÔÓÓÔÓÓþÔÓÓûÔÓÓÔÓÓþÔÓÓùÔÓÔÔÓÔÓÓûÔÓÔÔÓÓüÔÓÔÓ ÓÒÓÒþÓÒÒÓôÒÓÒÓÓÒÒÓÒÒÓÒÒþÓÒÒþÓÒÒÓÒÓôÒÓÒÒÓÒÓÒÒÓÑÒÒÑÒÑÒÑ÷ÒÑÒÒÑÒÒÑÒÒÑÒÑÒÑÒöÑÒÑÒÒÑÒÑÑÒÒüÑÒÒÑÑþÒÑ~ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐÑÐùÑÐÐÑÐÑÐÐÑÐþÑÐÐÏÐÏÐýÏÐÏÏòÐÏÏÐÏÏÐÐÏÏÐÏÐÏÏÐÏÐÏþÐÏÏþÐÏÏÐÏöÐÏÏÎÏÏÎÏÎÏÏñÎÏÎÏÎÏÏÎÎÏÎÏÎÎÏÏÎöÏÎÎÏÎÏÏÎÎÏÏõÎÏÎÏÎÏÎÎÏÎÏÏÎÏÍþÎÍÍýÎÍÎÎþÍÎÎÍÎûÍÎÎÍÎÎûÍÎÎÍÎÎûÍÎÍÍÎÎùÍÎÍÎÎÍÎ΀ÍÌûÍÌÌÍÌÌÍÌÍÌÍÌÍþÌÍÍôÌÍÌÍÌÍÌÌÍÌÍÌ ÌþÍÌÌËÌËÌöËÌÌËËÌÌËËÌÌËðÌËËÌËÌÌËËÌÌËÌËËÌÌúËÌËÌËÌÌüËÌÌËËþÊËËþÊË ËÊ ËüÊËÊËËþÊËËÊËúÊËËÊËÊ?ÊÉþÊÉÉûÊÉÉÊÉÉÊÉúÊÉÊÉÊÉÉþÊÉÉþÊÉÉÊÉÊÉÊúÉÊÉÉÊÉ?ÉùÈÉÈÈÉÈÉÉýÈÉÈÈÉÈÉÈÉöÈÉÈÉÈÉÉÈÉÈÈÉûÈÉÉÈÉÉöÈÉÈÉÉÇÈÈÇÈÈþÇÈÈþÇÈÈøÇÈÈÇÈÈÇÈÈþÇÈÈûÇÈÇÈÇ>ÇýÆÇÆÆûÇÆÆÇÆÆÇÆþÇÆÆÇÆûÇÆÆÇÆÆþÇÆÆþÇÆÆþÇÆCÆ@Àÿ?ÕFçþæçwçæüçæçææþçæ æûçæççæ æõçææçææççæçææþçææåæýåæååæåæåùæååæååææåþæååæåöæååææåæåæååùæåæåæåææåýæäååäüåäåääåþäååøäåäåäååääåäåýäåääýåäååäåäþåääùåäãäããä äþãääüãäãääþãääûãäããä äþãää‚ãâãâãâûãââãââãâòãâããâãâãâããââããâóãââãââãâãâããââáâáâþáââáâáýâáââûáâáâááâúáââááââáâáûàááàááþàááþàááþàá áþàááüàáàáá€àþßààûßàßàßßàýßàßßãàßàßààßààßààßßààßàßßààßààßßàßßàßàßÞßýÞßÞÞßüÞßßÞÞßÞûßÞÞßÞÞßûÞßÞßÞÞßûÞßÞÞßßÞÝùÞÝÞÝÞÝÞ ÞüÝÞÝÞÞþÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞþÝÞÞ?ÝÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜÝÜþÝÜÜÝBÜþÛÜÜþÛÜÜûÛÜÛÜÛÛÜöÛÜÜÛÜÛÛÜÜÛÛÜÛÜüÛÜÜÛÛüÜÛÜÛÛÜùÛÜÜÛÚÚÛÛþÚÛÛÚÛþÚÛÛÚÛûÚÛÛÚÛÛþÚÛÛþÚÛÛþÚÛÛ@ÚÙÚÙÚÙÚýÙÚÙ ÙûÚÙÙÚÙÙþÚÙÙüÚÙÚØØøÙØÙÙØØÙØØÙòØÙÙØØÙÙØØÙØØÙØØÙØÙñØÙØØÙØØÙÙØÙØÙÙØDØ×ØþרØþרØþרØþרØþרØ×ýØ×ØØùר×ררØùרØ×ØØ×@×Öþ×ÖÖþ×ÖÖþ×ÖÖø×Ö×Ö×Ö×ÖÖþ×Ö Öþ×ÖÖÕþÖÕÕøÖÕÖÕÖÕÖÕÕþÖÕÕûÖÕÕÖÕÕþÖÕÕÖÕûÖÕÕÖÕÕþÖÕÕÖÕÖÕþÔÕÕÔÕüÔÕÔÕÕúÔÕÔÕÔÕÕ÷ÔÕÔÕÔÕÔÕÔÔóÕÔÔÕÕÔÔÕÔÔÕÔÕÕ€ÔúÓÔÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓùÔÓÓÔÓÔÓÓúÒÓÓÒÓÒÒýÓÒÓÓÒòÓÒÒÓÓÒÒÓÒÓÒÓÒÓÓÒÓÒôÓÒÓÒÓÒÓÒÓÒÓÒÒûÑÒÑÑÒÒÑúÒÑÑÒÒÑÑøÒÑÒÑÒÑÒÑÑþÒÑÑÒôÑÒÒÑÑÒÑÒÒÑÑÒÒÑÒÑÒÑÐþÑÐÐþÑÐÐùÑÐÐÑÐÑÐÐþÑÐÐþÑÐÐüÑÐÐÑÑÐûÑÐÐÑÐÐþÑÐÐÏûÐÏÐÐÏÏþÐÏÏÐþÏÐÐûÏÐÐÏÐÐüÏÐÏÐÐÏþÐÏÏåÐÏÏÐÏÏÐÏÐÏÏÐÏÏÐÏÐÎÏÎÏÎÏÎÏÎÏÏùÎÏÏÎÏÎÏÏ÷ÎÏÎÎÏÎÏÎÏÏõÎÏÎÎÏÏÎÏÏÎÏÏþÎÏÏÎÏûÎÏÎÍÎÎþÍÎÎûÍÎÍÍÎÎúÍÎÍÎÍÎÎøÍÎÎÍÎÎÍÎÎþÍÎÎÍ ÎþÍÎ΀ÍÌÍüÌÍÍÌÌûÍÌÍÍÌÌÍÌÍýÌÍÌÌøÍÌÍÌÍÍÌÍÍÌþËÌÌùËÌËÌËÌËËüÌËÌËËùÌËÌËËÌËËüÌËÌËËÌþËÌÌþËÌÌËÌþËÌÌËýÌÊËËÊýËÊË ËÊýËÊËËûÊËËÊËËþÊËËùÊËÊËÊËÊ>ÊÉóÊÉÊÊÉÊÊÉÊÉÉÊÉÉþÊÉÉúÊÉÉÊÊÉÉüÊÉÊÉÉþÊÉAÉÈ÷ÉÈÉÉÈÉÉÈÉÉÈÉÈÉþÈÉÉüÈÉÈÉÉþÈÉÉøÈÉÈÈÉÉÈÉÉÈõÇÈÈÇÈÇÇÈÈÇÈ ÈþÇÈÈþÇÈÈÇÈûÇÈÈÇÈ È÷ÇÈÇÈÇÇÈÈÇ<ÇüÆÇÇÆÆÇÆþÇÆÆÇÆÇýÆÇÆ ÆúÇÆÆÇÇÆEÆ?äçþæç™çþæç&çþæçóçæþçææþçææûçææçææúçææççææûçææçææüçæçææþçææþçææúçæçææååæüåææååþæååóæååæååæååæååææåæåþæååýæåææåùæåæåæäååþäååþäååþäååöäååääååääååöäååääååääååäåùäååääåääþãää÷ãäãääãäãääüãäãääúãääããääãòäãäãäãääãääãäã~ãøâãâãâããââýãâããâãùâãâãâãââþãââã âýãâããâþáââþáââþáââüáâáââüáâáââüáâáââáðâáâáâáâááââáâáàá áþàááàýáàááþàááüàáàááàáàá€àßàßüàßßààßàßàûßàßàßßàøßààßßàßààüßàßààßàßþÞßßûÞßßÞßßÞßûÞßßÞßßÞßþÞßßÞößÞßÞÞßßÞÞßßþÞßßþÞßßÞþÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞûÝÞÝÝÞÞÝÞÝÞþÝÞÞ@ÝÜþÝÜÜþÝÜ ÜøÝÜÝÝÜÜÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜGÜÛñÜÛÛÜÛÛÜÛÛÜÜÛÛÜÛÛÜÛÜõÛÜÜÛÛÜÛÜÜÛÜÜýÛÜÛÛýÜÛÜÜ÷ÛÜÛÜÜÛÜÚÛÛüÚÛÛÚÚÛþÚÛÛþÚÛÛþÚÛÛ?ÚýÙÚÙÙþÚÙ ÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙ ÙùÚÙÚÙÙØÙÙýØÙØØùÙØÙÙØØÙÙþØÙÙØþÙØØÙüØÙØÙÙùØÙØØÙÙØØ÷ÙØØÙÙØØÙØØþÙØCØþר ØþרØþרØþרØòרØ×ØØ×ØØ×ØØ×ØØø×ØØ×Ø×Ø×>×Öó×ÖÖ×Ö×ÖÖ××Ö×ÖÖþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖþ×ÖÖ÷×Ö×Ö××Ö×ÖÖþ×ÖÖÕÖÕÖÕúÖÕÖÕÕÖÖùÕÖÕÕÖÖÕÕÖÕÖþÕÖÖýÕÖÕÕþÖÕÕúÖÕÖÕÖÕÕÔÕÔøÕÔÕÔÕÔÔÕÕüÔÕÔÕÕùÔÕÔÕÕÔÕÕïÔÕÕÔÔÕÔÔÕÔÕÕÔÕÔÔÕÕþÔÕÕ€ÔýÓÔÓÓþÔÓÓþÔÓÓþÔÓÓÒùÓÒÓÒÓÓÒÒûÓÒÒÓÒÒÓÒÓþÒÓÓÒþÓÒÒÓÒÓ ÒÑÒüÑÒÑÒÒûÑÒÒÑÒÒüÑÒÑÒÒøÑÒÑÒÑÒÑÒÒþÑÒÒþÑÒÒ‚ÑÐüÑÐÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐÑÐþÑÐÐùÏÐÏÐÐÏÐÐíÏÐÏÏÐÏÐÏÐÏÏÐÏÏÐÐÏÐÏÏÐüÏÐÐÏÏøÐÏÏÐÐÏÐÏÏÐïÏÐÏÐÏÎÏÎÏÎÎÏÎÏÎÏÎÎûÏÎÏÎÏÏþÎÏÏÎÏÎôÏÎÏÏÎÎÏÏÎÏÎÏÏùÎÏÎÎÏÎÏÏýÎÏÎÎþÍÎ ÎûÍÎÎÍÎÎþÍÎÎþÍÎÎþÍÎÎûÍÎÎÍÎÎÍÎÍüÌÍÍÌÌÍþÌÍÍÌøÍÌÍÍÌÍÍÌÌöÍÌÌÍÍÌÍÌÌÍÍöÌÍÌÍÌÌÍÌÍÌÌìÍÌÍÍÌÌÍÌÌËÌËÌÌËÌÌËÌËËüÌËËÌÌË÷ÌËÌËËÌËÌËËýÌËÌÌËÌËÌúËÌËÌËÌÌðËÌËÌÌËÊÊËËÊÊËËÊËËÊËþÊËËùÊËËÊËÊËËþÊËËüÊËËÊÊËþÊËËþÊËË?ÊÉüÊÉÊÉÉýÊÉÊÊ ÉþÊÉÉþÊÉÉÊÉþÊÉÉúÊÉÊÉÊÉEÉÈîÉÈÉÈÈÉÈÉÈÉÉÈÉÉÈÉÉÈÈüÉÈÈÉÉÈýÉÈÉÉÈÉüÈÉÈÉÉÈÉüÈÉÉÈÈüÇÈÇÈÈþÇÈÈûÇÈÇÇÈÈÇ ÈÇÈþÇÈÈþÇÈÈÇÈ@ÇÆüÇÆÇÆ ÆþÇÆÆûÇÆÆÇÆÆÇýÆÇÆÆþÇÆÆþÇÆÆÇ?Æ?ÿÀçýæçææçýæçææúçææçæççòæçæçææçæçææççæ æþçææåþæååùæååæååææúåææåæååþæååþæååøæååæåææååæþåææåäùåääååäååûäåäåääúåäååäååùäåäååäååéäååäåääåäåäåäåäåäåääååääòãääããääãäããäãääãäøãäããääãääþãääþãääãäãâøãââãââãââöãââãâãâãâããýâãââãâãâþãââþãââúãââããââ÷áâááââááââáâáøâááââááââóáâááââááâáââááâþáââáþàááþàááþàááúàáàáàááàáþàááþàááüàáàáá„àþßààüßààßßþàßßàþßààüßààßßàßúàßßààßßàýßàßßþàßßÞþßÞÞßþÞßßøÞßßÞÞßÞßßÞþßÞÞþßÞÞßþÞßßÞÝÞÝÞüÝÞÝÞÞõÝÞÞÝÞÞÝÞÞÝÞÞþÝÞÞþÝÞÞþÝÞÞAÝÜþÝÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜöÝÜÝÜÝÜÜÝÝÜÜÝýÜÝÜÜÝ?ÜÛÜûÛÜÜÛÜÜúÛÜÜÛÛÜÜúÛÜÛÛÜÛÛýÜÛÜÜþÛÜÜìÛÜÛÜÜÛÜÛÜÜÛÜÜÛÜÜÛÜÛÜÜþÚÛÛøÚÛÚÛÛÚÚÛÛþÚÛ#ÛþÚÛÛ?ÚýÙÚÙÙþÚÙ ÙúÚÙÙÚÚÙÙþÚÙÙÚÙÚÙþÚÙÙØþÙØØúÙØØÙÙØØÙòØÙØÙØÙØØÙÙØÙÙØØùÙØÙÙØÙØØùÙØÙÙØÙØØûÙØØÙØCØþרØþרØüררØ×ØþרØþרØýר×@×Öþ×ÖÖú×ÖÖ××ÖÖ×Öü×Ö×Ö Ö×Ö×Öø×ÖÖ×ÖÖ×ÖÖÕÖÕÖúÕÖÖÕÖÕÕëÖÕÕÖÖÕÕÖÖÕÕÖÕÖÕÖÖÕÕÖÕÕþÖÕÕþÖÕÕÖûÕÖÕÖÕÕþÖÕÕüÔÕÔÕÕüÔÕÔÕÕûÔÕÔÕÔÔúÕÔÔÕÕÔÔÕþÔÕÕþÔÕÕùÔÕÕÔÕÕÔÔÕýÔÕÔÔüÕÔÕÔÔÓûÔÓÓÔÓÓùÔÓÔÔÓÔÓ ÓÔÓÔÓûÔÓÔÔÓÓþÔÓÓ ÒþÓÒÒþÓÒÒúÓÒÓÒÓÒÒþÓÒÒÓÒÓ÷ÒÓÓÒÒÓÒÓÒÒÓóÒÓÒÓÒÓÒÒÑÒÑÒÑÑÒþÑÒÒÑÒýÑÒÑÑÒÑÒþÑÒÒõÑÒÑÒÑÑÒÒÑÑÒÒ€ÑÐþÑÐÐþÑÐÐÑÐüÑÐÑÐÐùÑÐÑÐÐÑÐÐþÑÐ ÐüÑÐÑÐÐúÑÐÏÏÐÏÏýÐÏÐÐøÏÐÏÐÏÏÐÏ ÏýÐÏÐÐÏÐÏþÐÏÏþÐÏÏþÎÏÏûÎÏÏÎÏÏÎÏÎÏÎþÏÎÎÏúÎÏÏÎÎÏÏÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎûÍÎÍÍÎÎþÍÎÎÍÎþÍÎ ÎÍýÌÍÌÌùÍÌÍÌÌÍÌÌþÍÌÌüÍÌÍÌÌÍÌúÍÌÌÍÌÍÍÌÍÌüÍÌÌÍÍúÌÍËÌËÌÌúËÌÌËÌËËûÌËÌÌËËÌËÌöËÌÌËËÌÌËËÌÌþËÌÌËþÌËËòÌËËÌÌËÌËËÌËËÊËËüÊËÊËËûÊËËÊËËúÊËËÊÊË ËþÊËË@ÊÉüÊÉÊÉ ÉûÊÉÉÊÉÉþÊÉÉÊõÉÊÉÉÊÉÊÉÉÊÉBÉÈýÉÈÉ ÉþÈÉÉÈûÉÈÉÈÉÉüÈÉÈÉÉÈÉþÈÉÉÈÉýÈÇÈ ÈöÇÈÇÈÇÈÈÇÇÈÈÇöÈÇÈÈÇÈÈÇÇÈÈÇÈþÇÈÈ?ÇÆüÇÆÇÆÆûÇÆÆÇÆ ÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆûÇÆÇÇÆ@Æ@Àÿ?ÕÀçæþçææþçææþçææûçæççæ æþçææçæþçææýçæççæþçææýåæååæúåæååæååæýåæååôæåææåæååæåæååæåæùåæåææåææþåääåùäåäåääååþäååôäååääåääååäååäøåäåääååääüåääååäûãääãääþãä äûãääãä äãäþãää€ãôâãâãâããâããâããúâããââããþâããâöãââããâãâãââþãââãâþãââãýâãââùãâááââááâûáââáââþáââáøâáâááâáââáýâáââáâþáââúáââáâááþâááþàááüàáàááþàááþàááàúáàááàááüàáàááàáúàáàáàááàßàüßàßààßþàßßþàßßûàßßàßßàüßààßßàýßàßßþàßßëÞßÞßßÞÞßÞßßÞßÞßÞßÞßÞßßóÞßÞßÞÞßßÞÞßÞßßÞýßÞßßþÞßßÞýßÞßßÞüßÞÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞûÝÞÞÝÞÞÝÞþÝÞ Þ+ÝþÜÝÝÜþÝÜÜþÝÜÜûÝÜÜÝÜÜúÝÜÜÝÝÜÜþÝÜÜþÝÜÜüÝÜÝÜÜÝFÜÛøÜÛÛÜÛÜÛÜÜýÛÜÛÛÜüÛÜÛÜÜ÷ÛÜÜÛÜÜÛÜÛÛÜþÛÜÜÛÜùÛÜÜÛÜÜÛÛþÚÛ ÛþÚÛÛûÚÛÛÚÛ ÛþÚÛÛþÚÛ Û@ÚûÙÚÙÚÙÙþÚÙÙûÚÙÚÚÙ ÙþÚÙÙþÚÙÙÚ ÙØþÙØØûÙØÙÙØØûÙØØÙØØ÷ÙØÙØÙØÙØÙÙïØÙØÙØÙØØÙØØÙÙØÙÙØ>Ø×ØþרØþרØ×Ø×ØþרØþרØ×ØþרØþרØûרØ×Ø Ø?×Öþ×Ö Öþ×ÖÖþ×ÖÖþ×ÖÖú×Ö×Ö×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖù×ÖÖÕÖÕÖÖìÕÖÖÕÖÕÖÕÖÖÕÕÖÖÕÖÕÕÖÕÕøÖÕÕÖÕÖÕÖÖÕÖ÷ÕÖÖÕÖÕÕÖÕÕýÔÕÔÔÕüÔÕÕÔÔÕùÔÕÔÔÕÔÕÕþÔÕÕôÔÕÕÔÔÕÔÕÔÔÕÔÔûÕÔÕÔÕÕõÔÕÕÔÔÕÔÔÕÕÔ~ÔýÓÔÓÓãÔÓÓÔÓÔÓÓÔÓÔÓÔÔÓÔÓÓÔÔÓÔÓÓÔÓÓÔÓÓ÷ÔÓÔÓÓÔÓÔÓ ÓÔÓÔüÓÒÓÒÒÓýÒÓÒÒýÓÒÓÓÒþÓÒÒÓüÒÓÓÒÒùÓÒÓÒÒÓÒÒÓýÒÓÒÒþÓÒÒÓýÒÓÒÒÑýÒÑÒÒÑÒöÑÒÑÒÑÒÑÒÑÒÒÑÒÑüÒÑÑÒÒþÑÒÒøÑÒÒÑÒÒÑÒÒüÑÒÒÑ~ÑÐ÷ÑÐÑÐÑÐÑÑÐÐûÑÐÐÑÐÐþÑÐÐþÑÐÐóÑÐÐÑÐÑÐÐÏÐÏÐÏÏÐÏþÐÏÏÐÏúÐÏÐÏÐÏÏþÐÏÏùÐÏÏÐÏÐÏÏûÐÏÏÐÏÏÐûÏÐÏÐÏÏÎÏùÎÏÎÎÏÎÏÏüÎÏÎÏÏþÎÏÏóÎÏÎÏÏÎÎÏÏÎÏÎÏÏÎÏÎþÏÎÎþÏÎÎüÍÎÍÎÎþÍÎÎûÍÎÎÍÎÎíÍÎÎÍÎÎÍÎÎÍÎÎÍÍÎÎÍÍÎÎúÍÎÍÎÍÎÎÍÌ÷ÍÌÍÌÍÍÌÍÌÌüÍÌÍÌÌøÍÌÌÍÌÌÍÌÌþÍÌÌþÍÌÌøÍÌÌÍÌÍÌÍÍÌøÍÌÍËÌÌËÌÌËþÌËËÌòËÌÌËÌÌËÌËÌÌËËÌÌüËÌËÌÌüËÌÌËËúÌËÌËËÌÌËúÊËÊËÊËËþÊËËþÊËËþÊËËúÊËËÊÊËËúÊËËÊËÊ>ÊÉöÊÉÊÉÉÊÊÉÊÉÉûÊÉÉÊÉÉÊÉþÊÉÉÊ÷ÉÊÉÊÊÉÉÊÉÉþÊÉAÉúÈÉÈÉÉÈÈþÉÈÈøÉÈÉÈÈÉÉÈÈýÉÈÉÉüÈÉÉÈÈõÉÈÉÉÈÉÉÈÉÈÉÉþÈÉÉþÈÉÉûÈÉÈÇÈÈþÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈùÇÈÇÈÈÇÈÈ@ÇÆþÇÆÆþÇÆÆôÇÆÆÇÆÇÆÇÆÆÇÆÆüÇÆÇÆÆûÇÆÆÇÆ ÆþÇÆBÆ?ä çþæç"çþæçŒçæûçææçææçæþçææûçææçææþçææþçææþçææþçææöåæåæåæåææååöæåæåæåææåææåæåæõåæåææåææåæååæåûæåææååäýåäååþäååþäååäüåääååüäåäååùäåäååäååäåøäåäåääåääþãä-äþãääúãäãäãää€ãýâãââãâã÷âãâãâããâããâñãâããââããââãâãâããâãüâããââüãâãââáâáþâááâáâáâüáâáââüáâáââáâþáââáâøáâáàáààááúàááààáá÷àáààááàáààáþàááþàááýàáà~àßüàßàßßþàßßüàßàßßöàßàßàßààßààßüàßßààþßààßàýßÞßßÞßüÞßßÞÞùßÞÞßÞßÞÞûßÞÞßÞÞßøÞßÞÞßßÞßßþÞßßþÞßßþÞßßúÞßßÞÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞÝÞþÝÞÞþÝÞÞÝÞÝÞøÝÞÞÝÞÝÝÞÞÝþÜÝ"Ý ÜþÝÜÜþÝÜÜÝÜüÝÜÝÜÜþÝÜHÜÛÜýÛÜÛÛüÜÛÜÛÛøÜÛÜÛÜÜÛÜÜúÛÜÛÜÛÜÜøÛÜÛÛÜÛÜÛÛÜÛÜÛýÜÛÜÜÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛÚÛþÚÛÛÚÛÚÛýÚÛÚÚþÙÚ+ÚýÙÚÙÙÚÙüÚÙÚÙÙûÚÙÙÚÙÙþÚÙÙÚûÙÚÙÚÙÙøÚÙÚÙÙÚÚÙÙîØÙØÙØØÙÙØÙØÙØØÙØØÙÙØÙüØÙÙØØþÙØØÙýØÙØØþÙØØùÙØÙØÙÙØBØþרØùרר×רØþר ØöררØ×ØØ×ØØûר×רØþרØ@×Öþ×ÖÖþ×ÖÖö×Ö×Ö×Ö×Ö×ÖÖû×ÖÖ×ÖÖ×÷Ö××Ö×ÖÖ×ÖÖ×ýÖ×ÖÖþÕÖÖÕöÖÕÖÖÕÕÖÕÖÕ ÕýÖÕÖÖÕÖÕùÖÕÖÕÕÖÕÕÖûÕÖÕÖÕÕþÔÕÕöÔÕÔÔÕÕÔÕÔÕÕÔÕüÔÕÕÔÔýÕÔÕÕûÔÕÕÔÕÕûÔÕÕÔÕÕÔüÕÔÔÕÕÔóÓÔÓÔÓÔÓÓÔÔÓÔÓÓÔÓþÔÓ ÓÔÞÓÔÓÓÔÓÓÔÓÓÔÓÔÓÓÔÓÔÓÓÔÓÓÔÒÒÓÒÒÓÒÒÓÒÒüÓÒÒÓÓÒÓòÒÓÓÒÓÓÒÓÒÓÒÒÓÒÒÓÒÓÒÓòÒÓÒÒÓÒÒÓÒÒÑÒÒÑÑûÒÑÑÒÑÑÒÑÒãÑÒÑÑÒÑÒÑÑÒÑÑÒÑÒÒÑÑÒÒÑÑÒÑÑÒÑÒÑÑüÒÑÑÒÒÑýÐÑÐ ÐþÑÐÐÑÐÑÐüÑÐÑÐÐüÑÐÑÐÐÑÐþÑÐÐÑÏüÐÏÐÏÏþÐÏÏûÐÏÏÐÏÏóÐÏÐÏÏÐÐÏÏÐÏÐÏÏ ÐÏþÐÏÏÐÏÐÏþÎÏÏÎÏÎÏþÎÏÏÎýÏÎÏÏÎúÏÎÏÏÎÏÏúÎÏÏÎÏÎÎÏÎÏ ÎþÍÎÎ÷ÍÎÎÍÎÎÍÍÎÎÍÎÍÎþÍÎÎþÍÎÎýÍÎÍ~ÍÌÍÌøÍÌÌÍÍÌÍÌÌÍÌúÍÌÍÌÌÍÍÌþÍÌÌþÍÌÌÍÌþÍÌÌûËÌËËÌÌùËÌÌËÌËÌÌËÌþËÌÌýËÌËËøÌËÌËÌËËÌÌþËÌÌüËÌÌËËþÊËËþÊËËÊöËÊÊËËÊÊËÊËËûÊËËÊËËÊËÊËûÊËËÊËËAÊüÉÊÊÉÉþÊÉÉÊÉþÊÉ ÉÊÉÊÉúÊÉÉÊÊÉ@ÉþÈÉÉþÈÉÉþÈÉÉöÈÉÉÈÉÈÈÉÈÉÉüÈÉÈÉÉÈðÉÈÉÉÈÈÉÈÉÉÈÉÈÉÈÉÉÈùÉÈÈÇÈÇÈÈÇÈÇúÈÇÈÈÇÈÈûÇÈÈÇÈÈÇÈÇüÈÇÇÈ È?ÇÆþÇÆÆþÇÆÆþÇÆÆÇþÆÇÇùÆÇÇÆÆÇÆÆûÇÆÆÇÆÆþÇÆÆþÇÆ@Æ?ÿþæçäçþæçØçæþçææþçææçæçæüçæçææþçææþçææåúæåæåæååûæåææååþæååæùåææååæåå÷æåæåæåææååæåæüåææååøäåäååääååþäååä åüäååääåäåäåäûãääãääûãäããääþãääãøäãääãäãää€ãþâããâòãââãââãâããâãâããâþãââüãâãââãýâãââþãââáâýáâááâüáâáââáâþáââáâðáâáâáâááââááâáâááþàáá÷àááààááàááüàáàááþàááàáþàá áþàááàßàßüàßßààßüàßàßßüàßàßßûàßààßßàþßààßþàßßýàßààßþÞßßüÞßÞßßþÞßßüÞßÞßßÞûßÞßÞßßõÞßÞßÞßÞßßÞßßÞýßÞßßüÞßßÞÞûÝÞÝÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞýÝÞÝ>ÝÜþÝÜÜùÝÜÜÝÜÝÜÜÝÜûÝÜÝÝÜÜûÝÜÜÝÜÜÝÜüÝÜÝÜÜþÝÜCÜÛýÜÛÜ ÜþÛÜÜýÛÜÛÛúÜÛÜÛÛÜÜþÛÜÜûÛÜÜÛÜÜÛÜõÛÜÛÛÜÚÛÚÛÚÛÛþÚÛÛþÚÛÛþÚÛÛÚ ÛþÚÛÛþÚÛÛþÚÛÛ+ÚþÙÚÚÙûÚÙÙÚÙÙþÚÙ ÙþÚÙÙüÚÙÚÙÙÚÙþÚÙÙþÚÙÙþÚÙÙØþÙØØþÙØØþÙØØÙûØÙØØÙÙØöÙØÙØØÙØÙØÙÙúØÙØÙØÙÙýØÙØDØþרØþרØþרØ×Ø×ýØ×ØØþרØþרØþרØüרØ×>×Öþ×ÖÖû×Ö××ÖÖþ×ÖÖû×Ö××ÖÖ×ýÖ×ÖÖþ×ÖÖ×Öþ×ÕÕÖÕùÖÕÖÕÕÖÕÕÖüÕÖÕÖÖûÕÖÕÕÖÖÕþÖÕÕÖýÕÖÕÕÖúÕÔÕÔÕÔÔÕþÔÕÕÔÕÔÕÔýÕÔÕÕÔüÕÔÕÔÔÕÔþÕÔ~ÔýÓÔÓÓÔÓÔÓþÔÓÓþÔÓ ÓþÔÒÒüÓÒÓÒÒõÓÒÒÓÒÒÓÒÓÒÓÓüÒÓÒÓÓÒþÓÒÒÓøÒÓÓÒÒÓÓÒÒÓïÒÓÓÒÓÒÒÓÒÒÑÒÒÑÒÑÒÒûÑÒÒÑÒÒþÑÒÒÑþÒÑÑþÒÑÑÒþÑÒÒÑÒüÑÒÒÑ~ÑÐþÑÐÐþÑÐÐÑÐÑøÐÑÐÑÐÐÑÐÐþÑÐÐýÏÐÏÏþÐÏÏïÐÏÐÏÐÐÏÐÏÐÏÐÏÐÏÐÏÏÐÏÐüÏÐÐÏÏÐÏõÐÏÏÐÐÏÏÐÏÏÎÎÏÎÏøÎÏÏÎÏÎÎÏÏþÎÏÏÎÏÎÏéÎÏÎÏÎÏÎÏÎÏÏÎÏÏÎÏÎÎÍÎÎÍÎÎÍÎþÍÎÎùÍÎÎÍÎÍÎÎÍýÎÍÎÎùÍÎÎÍÎÍÎÎûÍÎÎÍÎÎýÍÎÍ€ÍúÌÍÍÌÍÌÌÍûÌÍÌÍÌÌÍÌõÍÌÍÌÌÍÌÌÍÍÌÌþÍÌÌùÍÌÍÌÌÍÌÌþÍÌÌþËÌÌþËÌÌüËÌËÌÌËÌúËÌÌËËÌÌþËÌÌùËÌËÌËËÌÌËÌøËÌËÌÌËÌËËþÊËËþÊËËþÊËËûÊËËÊËËþÊËËþÊË ËüÊËÊËË@ÊùÉÊÉÊÉÊÉÉþÊÉÉüÊÉÊÉÉÊÉùÊÉÊÉÉÊÉÉüÊÉÊÉÉúÊÉÊÉÊÉBÉÈøÉÈÈÉÉÈÉÈÈÉíÈÉÈÉÈÉÉÈÉÈÈÉÈÉÈÉÉÈÉÉþÈÉÉÈúÉÈÉÉÈÉÉþÈÉÉýÈÉÈ ÈþÇÈÈþÇÈÈþÇÈÈúÇÈÈÇÈÇÇ ÈþÇÈÈþÇÈ ÈÇþÆÇ'ÇÆþÇÆÆþÇÆÆûÇÆÆÇÆÆüÇÆÇÆÆÇÆøÇÆÇÇÆÆÇÆ ÆþÇÆÆþÇÆCÆ@Àÿ?ÕýçæçîçþæçDçþæç†çæþçææïçææçææçææççæçææçææþçæ æûçææçææûçææçææçæûåææåææåæýåæååúæååææååøæåææååæååþæååþæååæþäååäåäûåääåääýåäååüäåäååþäååäåúäååääååäå äþãääþãääþãääãäþãääùãäãäããääþãääüãääã~ãâãâþãââûãâãâããâùãâãââãââûãââãââãâãâãâüãâãââþáââáâþáââáâüáââááâïáââááââáââááââááââûáâáàááüàáàá áþàááûàááàááúàáàáàááþàááüàááà~àóßàßàßßàßàßààßßüàßàßßàßûàßààßß÷àßàßààßàßßàß÷àßßààßÞÞßßûÞßßÞßßýÞßÞÞòßÞßÞßßÞßÞßßÞÞßßÞßÞïßÞÞßÞßÞÞßßÞÞßßÞÞßßÞüÝÞÝÞ ÞøÝÞÞÝÞÞÝÞÞüÝÞÝÞÞ?ÝýÜÝÜÜÝÜüÝÜÝÜÜþÝÜÜüÝÜÝÜÜùÝÜÜÝÜÝÜÜúÝÜÜÝÝÜÜûÝÜÝÜÝÝEÜ÷ÛÜÜÛÜÛÛÜÛÛÜþÛÜÜþÛÜÜûÛÜÛÜÛÛýÜÛÜÜþÛÜÜþÛÜÜÛÜþÛÜÜýÛÜÛÛÚüÛÚÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛ Û=ÚþÙÚÚõÙÚÙÚÙÚÙÚÙÚÙÙøÚÙÙÚÙÚÚÙÙþÚÙÙûÚÙÙÚÙÙþÚÙÙüÚÙÙÚÚÙÚÙþÚØØüÙØÙØØÙüØÙÙØØÙØûÙØØÙØØúÙØØÙØÙÙØþÙØØùÙØÙØÙØÙÙGØ×ØþרØþרØþרØþרØþרØûרØ×ØØþרØüרØ×>× Öþ×ÖÖü×Ö×ÖÖü×Ö×ÖÖü×Ö×ÖÖ× Öþ×Ö ÖýÕÖÕÕþÖÕÕýÖÕÖÖÕÖÕúÖÕÖÕÖÕÕýÖÕÖÖÕûÖÕÖÖÕÕÔøÕÔÕÔÕÕÔÕÕÔÕþÔÕÕÔÕÔÕÔþÕÔÔýÕÔÕÕþÔÕÕúÔÕÕÔÕÔZÔþÓÔ!ÔÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓ ÓþÔÓÓìÔÓÒÓÒÓÒÓÓÒÓÒÓÒÓÓÒÒÓÒÒÓþÒÓÓÒúÓÒÒÓÓÒÒþÓÒÒÓýÒÓÒÒëÓÒÓÒÒÓÒÒÑÒÒÑÒÑÒÑÒÒÑÑÒÒÑÒ÷ÑÒÑÑÒÒÑÒÑÑ÷ÒÑÒÒÑÒÑÑÒÒþÑÒÒùÑÒÑÒÒÑÒÒ€ÑÐÑøÐÑÐÐÑÐÑÐÐÑÐþÑÐÐÑÐþÑÐÐþÑÐÐþÑÐÐöÑÐÑÐÐÑÐÐÑÐÐÏþÐÏÏþÐÏÏÐþÏÐÐÏðÐÏÏÐÏÐÏÏÐÏÐÏÐÏÐÏÏþÐÏÏÐÏüÐÏÐÏÏþÎÏÏÎÏþÎÏÏþÎÏÏÎÏþÎÏÏÎÏûÎÏÏÎÏÏýÎÏÎÎÏòÎÏÎÏÏÎÏÎÏÎÏÎÍÎÎÍúÎÍÎÎÍÎÎúÍÎÎÍÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎÍÌûÍÌÍÍÌÌþÍÌÌïÍÌÌÍÌÍÍÌÍÌÍÌÌÍÌÍÌÌøÍÌÍÌÍÌÍÌÌþÍÌÌùÍÌÌÍÌÍÌÌýËÌËËÌËùÌËÌÌËÌËËôÌËËÌËËÌÌËËÌËËÌþËÌÌõËÌÌËÌÌËÌËÌËËüÊËÊËËûÊËÊÊËËüÊËÊËËüÊËÊËËûÊËÊÊËËýÊËÊ>ÊýÉÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉCÉÈÉüÈÉÈÉÉûÈÉÈÈÉÉÈþÉÈÈÉÈÉÈñÉÈÉÉÈÈÉÈÉÉÈÉÉÈÉÉüÈÉÉÈÈûÇÈÈÇÈÈþÇÈÈûÇÈÈÇÈÈþÇÈÈþÇÈÈÇÈýÇÈÇ@ÇÆÇÆþÇÆÆûÇÆÆÇÆÆüÇÆÇÆÆûÇÆÇÇÆÆüÇÆÇÆ>Æ?ä=çþæççþæç/çþæç8çæçæþçææþçææüçæçææþçææüçæçææüçæçææþçææûçææçææûåææåææåæåæåæûåæååææåæþåææåþæååúæååææååæåäüåääååäåþäååäåþäååäåäåþäååäåøäåääååäååþãääþãääþãääãäþãääþãääòãääãäãäãääãäãääúãääãäã€ãýâãââúãâãâãââþãââãýâãââãýâãââãâûãââãââãâãôâãââááââááâááþâááâûáââáââáâüáâáââþáââáûâááâááâáâþàááøàáàáàáàááûàááàááàáþàááþàááþàááþàááúàáàááà~àßúàßßààßßþàßßûàßààßßùàßààßàßßàóßàßààßßàßààßààûßàßàßßþàßßýÞßÞÞýßÞßßÞüßÞÞßßýÞßÞÞþßÞÞßþÞßßÞßûÞßßÞßßÞÝÞüÝÞÝÞÞûÝÞÞÝÞÞþÝÞÞüÝÞÝÞÞÝþÜÝÝþÜÝÝÜÝÜÝÜþÝÜÜÝ ÜÝÜüÝÜÝÜCÜÛÜÛûÜÛÜÛÜÜüÛÜÛÜÜþÛÜÜÛÜÛþÜÛÛîÜÛÛÜÜÛÜÛÜÜÛÛÜÛÛÚÚÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛ?ÚÙÚÙþÚÙÙþÚÙÙÚ ÙüÚÙÚÙÙþÚÙÙûÚÙØÙØØÙØÙüØÙÙØØÙØýÙØÙÙØüÙØÙØØÙþØÙÙØÙýØÙØCØ×Øþר ØþרØþרØø×Ø×ØØ×Ø×רþר ØüרØ×>×Ö×Ö×Öþ×ÖÖ×Öþ×ÖÖ×Ö×þÖÕÕÖÕøÖÕÖÕÖÕÖÕÕÖ÷ÕÖÕÕÖÕÕÖÕÕÖþÕÖÖúÕÖÕÖÖÕÕ÷ÖÕÕÖÕÖÕÕÖÖúÕÖÕÕÖÕÕÔÕþÔÕÕÔÕûÔÕÔÔÕÕúÔÕÔÔÕÔÔÕÔÕÔÕÔÕûÔÕÔÔÕÕÔÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓÔÓþÔÓÓþÔÓÓþÔÓÓÔÓÒ÷ÓÒÒÓÒÒÓÓÒÒøÓÒÒÓÓÒÓÒÒüÓÒÒÓÓùÒÓÒÒÓÓÒÒþÓÒÒÓøÒÓÒÒÓÓÑÒÒÑ÷ÒÑÑÒÑÒÒÑÒÒÑÒÑÒÑÒüÑÒÑÒÒÑõÒÑÒÑÑÒÑÒÒÑÒÒÑÐÑÐþÑÐÐÑÐþÑÐÐþÑÐÐûÑÐÐÑÏÏóÐÏÏÐÏÏÐÏÐÏÐÐÏÏÐÏúÐÏÐÐÏÐÐüÏÐÏÐÐÏÐÏýÐÏÐÐÏÐÏÎÏùÎÏÎÏÏÎÏÏÎúÏÎÏÏÎÏÏüÎÏÎÏÏÎÏÎÏúÎÏÎÏÏÎÎÏùÎÏÏÎÎÏÎÎþÍÎÎþÍÎ ÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎ ÎÍ΂ÍýÌÍÌÌûÍÌÍÌÍÍÌûÍÌÌÍÌÌüÍÌÍÌÌþÍÌÌüÍÌÍÌÌþÍÌÌÍ÷ÌÍÌÍÌÍÌÍËËÌùËÌËËÌÌËËÌËÌþËÌÌýËÌËËþÌËËÌËÊËþÊËËõÊËËÊËËÊËËÊËËþÊËËþÊËËøÊËËÊËËÊËËýÊËÊ?ÊÉþÊÉÉóÊÉÉÊÉÉÊÉÊÉÊÊÉÉÊ ÉÊ ÉüÊÉÊÉAÉÈÉÈÉþÈÉÉþÈÉÉúÈÉÈÈÉÈÈÉýÈÉÈÈøÉÈÉÉÈÉÈÉÉÈÉùÈÉÈÈÉÈÉÉ ÈÇÈþÇÈÈÇÈùÇÈÈÇÈÇÈÈþÇÈÈÇÈûÇÈÇÇÈÈüÇÈÈÇ?ÇõÆÇÇÆÆÇÆÆÇÇÆÆþÇÆÆûÇÆÇÇÆÆþÇÆÆùÇÆÇÆÇÇÆÆÇAÆ?ÿ çþæçÛçþæçÖçæþçææþçææþçæ æþçææçæùçæçææçææþçææåûæååæååüæååææåæåýæåææåþæååæåæåùæåææåäååäþåääåõäååääåääååääïåääåäåäåääåäåäåäååþäååùäåääåäååùäãääããääþãääúãäãäãääùãäãäããääþãääþãääãäãäãýâãââüãââããâãâúãââããââûãââãââþãââãâãûâããâããâáùâááââáââáâáâáùâááââáââ÷áâááâááâááâáúâáââáââøáâáââáàááþàááþàááàýáàááüàáàááþàááþàááþàááþàáá€àßüàßàßßþàßßüàßàßßàßøàßàßàßàßßàßàßûàßßàßßüàßÞßßÞßþÞßßÞßþÞßßþÞßßÞýßÞßßÞßÞþßÞÞüßÞÞßßûÞÝÞÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞÝÞþÝÞÞÝÞõÝÞÝÞÞÝÞÝÞÞÝ?Ý ÜÝÜþÝÜÜÝ ÜþÝÜÜþÝÜÜþÝÜÜÝCÜÛúÜÛÜÜÛÜÜÛÜþÛÜÜÛýÜÛÜÜÛýÜÛÜÜýÛÜÛÛÜôÛÜÛÜÜÛÜÜÛÛÜÛÛþÚÛÛüÚÛÚÛÛÚýÛÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛÚþÙÚ4ÚÙÚÙÚÙþÚÙÙ÷ÚÙÙÚÚÙÙÚÙÙÚöÙÚÙÚÙÙÚÙÙÚÚýÙÚÙÙûÚØØÙØØþÙØØüÙØØÙÙØÙ ØÙ÷ØÙÙØØÙÙØÙÙþØÙÙØþÙØCØüרר Øýר××Ø×Ø× ØþרØ×ØþרØ?×Öþ×ÖÖþ×ÖÖ×Öþ×Ö Öþ×Ö Ö×Öü×ÕÕÖÖÕÖÕÖÕþÖÕÕûÖÕÖÖÕÕÖýÕÖÕÕÖÕþÖÕÕÖÕüÔÕÔÕÕþÔÕÕûÔÕÕÔÕÕÔÕüÔÕÔÕÕûÔÕÔÔÕÕÔ÷ÕÔÕÕÔÔÕÔÕÕýÔÕÔÔûÓÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓüÔÓÔÓÓÔÓÒÓûÒÓÓÒÓÓÒÓýÒÓÒÒÓÒÓúÒÓÒÒÓÒÒûÓÒÓÒÓÓùÒÓÒÒÓÓÒÒÓÒûÓÒÒÑÒÒêÑÒÒÑÒÑÑÒÒÑÑÒÑÒÑÑÒÑÑÒÒÑÑÒÑ÷ÒÑÒÒÑÒÑÑÒÒÑúÒÑÒÒÑÒÒ€ÑÐÑÐþÑÐ ÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐúÑÐÏÐÐÏÏÐÏõÐÏÐÐÏÏÐÐÏÏÐÐýÏÐÏÏúÐÏÐÏÐÏÏÐÏùÐÏÐÏÏÐÏÏûÐÎÏÏÎÎòÏÎÎÏÎÎÏÏÎÏÏÎÏÎÎýÏÎÏÏüÎÏÏÎÎýÏÎÏÏüÎÏÎÏÏþÎÏÏöÎÏÏÎÏÎÏÎÏÎÎýÍÎÍÍÎþÍÎ ÎþÍÎÎþÍÎÎÍûÎÍÎÍÎÎýÍÎÍ~ÍÌöÍÌÌÍÌÍÌÌÍÌÌÍÌýÍÌÍÍÌüÍÌÍÌÌþÍÌÌôÍÌÍÍÌÍÍÌÍÌÍÌÌþÍÌÌþÍÌÌËÌËÌòËÌÌËÌÌËËÌËÌÌËÌÌËþÌËËüÌËËÌÌüËÌËÌÌòËÌÌËËÌËÌÌËËÌÌËËÊËþÊËËøÊËÊÊËÊÊËËûÊËËÊËËüÊËÊËËþÊËËÊË?ÊÉþÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉûÊÉÊÊÉÉúÊÉÊÉÊÉÉþÊÉÉþÊÉEÉüÈÉÈÉÉÈÉþÈÉÉùÈÉÈÉÈÈÉÉÈýÉÈÉÉÈÉûÈÉÉÈÉÉüÈÉÉÈ ÈûÇÈÈÇÈ ÈûÇÈÈÇÈÈþÇÈÈüÇÈÇÈÈúÇÈÈÇÇÈ È?ÇÆþÇÆÆþÇÆÆþÇÆÆûÇÆÇÇÆÆþÇÆÆþÇÆÆþÇÆDÆ@Àÿ?ÕéçþæçÖçæþçæ æüçæçææçæçæûçæççææþçææþçææøçæçæåæåææüåææååþæååúæåæååææùåæåæåæååüæåæååûæåææååüæåæååöæååääåäåäååþäååäøåäåäååäååëäåääååääååääåäåäåäåäååþäå åüäãäããäãäãäþãääãäüãäãääãäûãääãää„ãûâãââããüâããââüãâãââþãââöãâãâããââãââãâúãâãâãââþáââýáâááþâááâáúâáâááââüáââááâùáââáâáââáëâááââáàááàáàáàááàááàááþàááþàááþàááþàá áþàááþàáá€àýßàßßàßàßöàßßàßßààßààßàßþàßßòàßßàßßàßàßßààßß÷àßàßßàßßÞÞýßÞßßüÞßßÞÞýßÞßßþÞßßûÞßßÞßßüÞßÞßßûÞßÞÞßßýÞßÞÞðßÞÞßßÞßßÞßÞÞÝÞÝÞÞÝúÞÝÞÝÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞÝ Þ@ÝÜþÝÜÜþÝÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜøÝÜÜÝÜÜÝÜÜÝÜþÝÜEÜÛþÜÛÛÜÛðÜÛÜÜÛÜÛÜÛÛÜÛÛÜÜÛÛÜÛúÜÛÛÜÛÜÜÛÜòÛÜÛÛÜÛÜÛÜÛÛÜÚÛ ÛþÚÛ ÛþÚÛÛþÚÛÛüÚÛÚÛÛ?ÚÙþÚÙÙûÚÙÙÚÙÙúÚÙÙÚÚÙÙùÚÙÚÙÙÚÙÙûÚÙÙÚÙÙøÚÙÙÚÙÙÚÙÙÚÙØþÙØØÙØÙûØÙØÙØØõÙØÙØÙØÙØØÙØØüÙØÙØØÙôØÙÙØÙØØÙÙØÙØ?ØþרØîרØ×Ø×Ø×ררØ×ØØ×ØØüררØþרØûרØ×ØØ×Ø?×ýÖ×Ö Öþ×ÖÖü×Ö×ÖÖþ×ÖÖû×Ö××ÖÖ×þÖ×× Öù×ÖÖÕÕÖÕÕýÖÕÖÖÕþÖÕÕÖüÕÖÕÖÖÕûÖÕÖÖÕÕõÖÕÕÖÕÖÕÖÖÕÖÖÕþÔÕÕÔüÕÔÕÔÔÕÔÕûÔÕÕÔÕÕúÔÕÕÔÕÔÔûÕÔÕÔÕÕöÔÕÔÕÕÔÕÔÕÔCÔþÓÔ=Ô ÓþÔÓÓþÔÓÓûÔÓÓÔÓÓûÔÓÓÔÓÓøÔÓÓÔÔÓÔÓÓþÔÓÓÒøÓÒÒÓÓÒÓÒÒíÓÒÒÓÒÓÒÓÓÒÒÓÒÓÒÓÓÒÓÓÒÓóÒÓÓÒÓÓÒÓÓÒÓÓÒÒÓÒüÓÒÑÒÒÑÒ÷ÑÒÑÑÒÒÑÑÒÒñÑÒÑÑÒÑÑÒÑÒÒÑÒÑÒÒÑøÒÑÑÒÑÒÑÒÒÑÒÑÐþÑÐÐþÑÐÐûÑÐÐÑÐÐþÑÐÐþÑÐÐþÑÐÐÑÐþÑÐÐÏÐÏñÐÏÐÏÏÐÏÐÐÏÐÐÏÏÐÐýÏÐÏÏÐ÷ÏÐÏÐÏÐÏÏÐÐÏÐýÏÐÏÏþÐÏÏÐÏÎÏÎûÏÎÏÎÏÏûÎÏÏÎÏÏýÎÏÎÎûÏÎÏÎÏÏÎÏþÎÏÏþÎÏÏýÎÏÎ ÎþÍÎÎüÍÎÍÎÎûÍÎÎÍÎÎûÍÎÍÍÎÎÍÎüÍÎÍÎÎÍ΂ÍÌûÍÌÌÍÌÌûÍÌÌÍÌÌüÍÌÌÍÍÌÍÌýÍÌÍÍÌüÍÌÍÌÌþÍÌÌüÍÌÌÍÍýÌÍÌÌËþÌËËùÌËÌËËÌËËÌËÌþËÌÌËÌËÌËþÌËËÌþËÌÌËÌþËÌÌúËÌÌÊÊËËþÊËËþÊËËùÊËÊËÊÊËËþÊËËøÊËÊËÊËÊËËúÊËËÊÊËËþÊËËÊËüÊËËÊ>ÊÉþÊÉÉþÊÉÉþÊÉÉùÊÉÉÊÉÊÉÉþÊÉÉþÊÉÉþÊÉ ÉþÊÉÉúÊÉÉÊÊÉGÉÈÉúÈÉÈÉÉÈÈÉþÈÉÉúÈÉÉÈÈÉÉÈüÉÈÈÉÉÈÉÈúÉÈÉÈÉÈ ÈþÇÈÈûÇÈÈÇÈÈÇÈþÇÈÈõÇÈÇÇÈÈÇÈÈÇÈÈþÇÈÈÇÈ@ÇÆþÇÆÆþÇÆÆþÇÆÆþÇÆ ÆþÇÆÆÇÆþÇÆDÆ?ä“çþæçÅçþæçdçùæçæçæçææçæçæçæþçææçæþçææûçæççææåæåæúåæååæååèæåæååæåæåæåæåæåææååææåæååæåþæååøæååääååääåüäåäååäúåääåäååþäååäøåäååäåäååäåäþåääãäþãääþãääþãääþãääãýäãääþãääþãää€ãâþãââãýâãââüãââããâõãâããâãââããââûãââãââãýâãââþãââûãââãââþáââþáââáâüáâáââøáââááâáââüáâáââýáâááúâááâáââõáâáâáââááàá áþàá áþàááþàá áþàááþàááàá€àßàßàßûàßßàßßöàßààßßàßàßßàßþàßßþàßßÞýßÞßßÞßþÞßßÞßúÞßßÞÞßßÞßéÞßßÞÞßßÞßßÞßÞÞßÞÝÞÝÞÝÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞÝ ÞþÝÞÞÝÞ%ÝþÜÝÝÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜùÝÜÜÝÜÝÜFÜÛÜçÛÜÛÜÛÜÛÛÜÛÜÛÛÜÛÜÜÛÜÛÜÛÜÛÜÜÛÜÛÜÛÜüÛÜÜÛÛÜóÛÜÜÚÚÛÚÚÛÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛÚÛÚöÛÚÛÛÚÛÛÚÛÚ>ÚýÙÚÙÙþÚÙÙþÚÙÙþÚÙÙÚÙüÚÙÚÙÙþÚÙÙþÚÙÙØÙúØÙÙØÙØØüÙØÙØ ØÙøØÙØØÙØÙØØüÙØÙØØøÙØØÙÙØØÙÙØüÙØÙØ@Ø×ØþרØþרØ×ØþרØþרØþרØ?×Öþ×ÖÖþ×Ö Ö×Ö×Öþ×ÖÖþ×ÖÖù×Ö×ÖÖ×ÖÖÕþÖÕÕòÖÕÖÕÕÖÕÕÖÖÕÕÖÕÕøÖÕÖÕÕÖÖÕÕþÖÕÕùÖÕÕÖÕÖÕÕÖõÕÖÖÕÖÕÖÕÕÖÕÕûÔÕÔÔÕÕÔþÕÔÔûÕÔÕÔÕÕþÔÕÕúÔÕÔÕÔÕÕúÔÕÔÕÔÕÕüÔÕÔÕÕûÔÕÕÔÕÕ€ÔÓûÔÓÔÔÓ ÓùÔÓÔÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓÒðÓÒÓÓÒÓÒÓÒÒÓÓÒÒÓÒÒöÓÒÓÒÒÓÓÒÓÒÒþÓÒÒÓýÒÓÒ ÒúÓÒÒÑÑÒÒÑÒþÑÒÒ÷ÑÒÑÒÑÑÒÑÒÒþÑÒÒÑþÒÑÑÒþÑÒÒûÑÒÑÒуÑÐþÑÐÐÑýÐÑÐÐþÑÐÐÑÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÏÐÐÏþÐÏÏÐýÏÐÏÏöÐÏÐÏÏÐÏÏÐÏÏûÐÏÐÏÐÐÏþÐÏÏþÐÏÏ÷ÐÏÐÏÐÏÐÐÏÏþÎÏÏÎÏÎÏüÎÏÎÏÏúÎÏÎÏÏÎÎÏöÎÏÎÎÏÏÎÎÏÎÎþÏÎÎÏÎþÍÎÎÍÎÍÎþÍÎÎöÍÎÎÍÍÎÍÎÍÎ ÎþÍÎÎÍüÌÍÍÌÌÍÌþÍÌÌÍÌÍøÌÍÌÍÌÌÍÌÌÍÌÍÌÍúÌÍÌÌÍÌÌËþÌËËýÌËÌÌËÌËÌþËÌÌþËÌÌïËÌËÌËËÌËËÌËËÌËÌËÌÌýËÌËËõÌËÌÌËËÌÌÊÊË ËþÊËËÊËþÊËËþÊËËúÊËÊËÊËËþÊËËüÊËËÊ>Ê ÉþÊÉ ÉþÊÉÉþÊÉÉùÊÉÊÉÉÊÉÉþÊÉÉþÊÉ?ÉÈýÉÈÉÉûÈÉÈÉÈÈýÉÈÉÉüÈÉÉÈÈúÉÈÉÈÉÈÈõÉÈÉÈÈÉÈÈÉÉÈÈÉûÈÉÈÈÉÉÈþÉÈÈþÇÈÈüÇÈÇÈÈôÇÈÇÇÈÇÈÇÈÈÇÈÈûÇÈÈÇÈÈþÇÈÈÇÈþÇÈÈüÇÈÈÇ?ÇýÆÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆüÇÆÇÆÆûÇÆÆÇÆ>Æ?ÿ|çþæçAçýæçææþçææþçææþçææüçæçææþçæ æþçææ÷çæçææçæçææýåæååþæååæøåææååææååæåæõåæåææååææåææåæåäýåäååäýåäååäýåäååùäååääåääåþäååäåþäååäþåä äãäþãääãäúãäãäãääúãäããäã~ãýâãââùãââãâãââã÷âãââããâãââãüâããââüãâãââõãââããâãââãââþáââúáââááââþáââüáâáââüáâáââþáââþáââáâùáââáâáââûáâáàááþàááþàááþàááþàááþàáá€àýßàßßàßùàßàßààßßþàßßàßàøßàßààßàßßàýßàßßðàßààßàßàßßÞÞßÞÞßßÞüßÞÞß ßúÞßÞßÞßßÞßÞßÞþßÞÞßÝúÞÝÝÞÝÞÞþÝÞÞþÝÞÞõÝÞÞÝÞÝÞÝÞÝÞÞüÝÞÝÞÞ@ÝÜøÝÜÝÝÜÜÝÜÜþÝÜ ÜþÝÜÜ÷ÝÜÜÝÜÜÝÝÜÜüÝÜÝÜÜüÝÜÝÜCÜþÛÜÜÛÜÛþÜÛÛÜÛÜÛÜÛíÜÛÜÛÛÜÜÛÛÜÜÛÜÛÜÜÛÜÛÛÜýÛÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛùÚÛÛÚÛÚÛÛûÚÛÛÚÛÛøÚÛÚÛÚÛÚÛÛþÚÛÛ?ÚÙ÷ÚÙÚÙÙÚÙÚÙÙÚ ÙþÚÙÙþÚÙÙþÚÙÙÚýÙÚÙÙþÚÙÙûÚÙÙÚÙÙýØÙØØþÙØØýÙØÙÙþØÙÙñØÙÙØØÙØÙØÙØÙØÙØØþÙØØþÙØØÙýØÙØØþÙØAØ× Ø×ØþרØþרØþרØþר Ø×Ø@×Öþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖ×Öþ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×ÖÖÕÕþÖÕÕÖÕþÖÕÕþÖÕÕýÖÕÖÖÕþÖÕÕùÖÕÖÕÕÖÕÕüÖÕÖÕÕþÖÕÕþÔÕÕÔüÕÔÔÕÕþÔÕÕÔÕÔùÕÔÕÔÔÕÔÔøÕÔÕÕÔÕÔÕÕÔÕÔþÕÔoÔþÓÔÔüÓÔÔÓÓþÔÓÓþÔÓÓ÷ÔÓÓÔÓÓÔÔÓÓûÔÓÓÔÓÓþÔÓÓþÔÓÓýÒÓÒÒÓüÒÓÓÒÒíÓÒÓÒÒÓÒÓÓÒÓÓÒÓÓÒÒÓÒÒþÓÒÒÓÒòÓÒÓÓÒÓÒÒÓÒÓÒÓÑÑÒýÑÒÑÑÒÑöÒÑÒÑÑÒÒÑÑÒÒþÑÒÒùÑÒÒÑÒÑÒÒþÑÒÒÑÒ€ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐüÑÐÑÐÐûÑÐÐÑÐÐùÑÐÐÑÐÑÐÐþÑÐÐóÑÐÑÐÐÑÑÐÐÏÐÐÏÏÐÏþÐÏÏÐûÏÐÏÐÏÏÐÏþÐÏÏþÐÏÏÐýÏÐÏÏÐþÏÐÐÎùÏÎÏÏÎÎÏÏöÎÏÎÎÏÏÎÏÎÏÏòÎÏÏÎÏÎÏÏÎÏÏÎÎÏÏÎÏÎÏÎþÍÎÎÍÎþÍÎÎþÍÎÎÍÎüÍÎÍÎ ÎþÍÎÎÍþÎÍ€ÍüÌÍÍÌÌýÍÌÍÍÌÍþÌÍÍüÌÍÍÌÌÍÌÍÌìÍÌÍÍÌÌÍÌÍÌÌÍÌÌÍÌÍÌÍÌÌËÌûËÌËËÌÌþËÌÌËÌ÷ËÌÌËÌËÌÌËËÌüËÌËÌÌüËÌËÌÌùËÌËÌËÌËËþÊËËüÊËÊËËþÊËËûÊËËÊËËÊËþÊËËþÊËËþÊËËþÊËËÊË@ÊÉÊÉþÊÉÉþÊÉÉÊÉùÊÉÉÊÉÊÉÉþÊÉÉûÊÉÉÊÉÉþÊÉÉþÊÉEÉýÈÉÈÈÉÈÉÈøÉÈÉÈÈÉÉÈÈÉÈûÉÈÉÉÈÈÉÈÉÈþÉÈÈÉÈþÇÈÈþÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈùÇÈÇÈÇÇÈÈ@ÇýÆÇÆÆþÇÆÆüÇÆÇÆÆûÇÆÇÇÆÆÇÆþÇÆYÆ@ÀÿÐÕü×½¨)çþë+çþí,çþí-ç-çþë.ç.çæþçææþçææüçæçææçæúçææççåþæååæåþæååæýåæååæåþæååüæåæ÷äåääåäåäååäåäåúäåäååääýåäååûäåäääùãäãääãääþãääþãä äþãääãäã.ã.ãâûãâããââãâãâøãâããââãââúãâãâãâ âáþâááûâáââááâþáââ÷áâáââáâáââáüâáâáúàáàáàá áýàáààöáàááàááààá áûàáá¬.àþ².àþßûàßàßààùßààßààßßþàßßùàßàßàßààßþàßßþmþÞßßûÞßÞÞßßüÞßÞßßþÞßßÞ÷ßÞßÞßÞßßÞÞßùÞßÞÞßhÞþÝÞÞúÝÞÝÞÝÞÞüÝÞÝÞÞþlþÜÝ,ÝþeýÜÝÜÜÝÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜýÝf.ÜþfÜÛÜþÛÜÜöÛÜÛÜÜÛÜÛÜÛÛþÜÛÛÜùÛÜÛÜÛfÛþÚÛÛüÚÛÚÛÛþÚÛÛÚÛþÚÛ ÛûÚÛÚf.ÚþfÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙÚûÙÚÙÙÚÚýÙÚÙÙüÚÙfØÙØõÙØØÙØØÙÙØØÙÙúØÙØØÙØØöÙØÙÙØØÙØÙØØÙØýÙf.Øþfרöרר×רØ×ØØûרØ×ØØþרØüררØþf.×þfÖþ×ÖÖü×Ö×ÖÖþ×ÖÖþ×ÖÖû×Ö××ÖÖ×Öü×Ö×ÖÖû×ÖÖfÖÕûÖÕÕÖÕÕüÖÕÖÕÕþÖÕÕþÖÕÕõÖÕÖÕÖÖÕÕÖÖÕÕûÖÕÕföÕÔÕÔÔÕÕÔÕÔÔÕÔùÕÔÕÕÔÕÔÔÕÔÕÔÕøÔÕÔÕÔÕf.Ôþf.ÔþfÓþÔÓÓþÔÓÓûÔÓÓÔÓÓùÔÓÓÔÓÔÓÓÔÓûÔÓÓfûÓÒÒÓÒÒüÓÒÓÒÒùÓÒÓÒÓÓÒÒÓýÒÓÒÒþÓÒÒþfþÒÑÑÒýÑÒÑÑíÒÑÒÒÑÑÒÒÑÑÒÒÑÒÑÑÒÒÑÑÒþÑÒÒûÑÒÑf.Ñþf.ÑþfýÐÑÐÐüÑÐÑÐ ÐùÑÐÑÐÐÑÐÐøÑÐÐÑÐÐÑÐÐþfÐùÏÐÐÏÏÐÏÏÐÏÐþÏÐÐÏþÐÏÏþÐÏÏúÐÏÐÏfþÏÎÎÏûÎÏÏÎÏÏüÎÏÎÏ ÏüÎÏÏÎÎúÏÎÏÎÎÏÏþfüÎÍÍÎÎûÍÎÍÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎÍüÎÍf.Íþf.ÍþfüÌÍÌÍÍÌüÍÌÌÍÍÌþÍÌÌýÍÌÍÍýÌÍÌÌøÍÌÍÌÌÍfÌûËÌËËÌÌþËÌÌËÌùËÌÌËÌÌËËÌûËÌËÌËËüÌËfËúÊËÊËÊËËúÊËÊËÊËËþÊËËüÊËf.ÊþfÉûÊÉÊÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉüÊÉÊÉÉþf.ÉþfúÈÉÈÉÈÉÉþÈÉÉÈÉüÈÉÉÈÈÉÈÉùÈÉÈÉÈÉÈÈÉúÈÉÈÉfÈüÇÈÇÈÈüÇÈÇÈÈÇÈÇÈÇÈþÇÈÈúÇÈÈÇÈ.Çü[ÆÆþÇÆ ÆûÇÆÆÇÆÆþÇÆÆüÇÆÇÆÆ.ÆÐäãüäÓÄ)çþë+çþíçþæççþí-ç-çþê.ç.çæçæþçææþçæ æùçæçææçæ æçúåæååæååæúåæåææååæåþæååþæåå÷æåæååæåæþäååûäååäååýäåääåòäåäåäåääååääåääåäåýäåäþãääþãääùãäããäãääþãääþãääüãää.ã.ãâúãâãâãââãâûãââãââþãââãâýãââá÷âááââáââááûâáâáââþáââöáâáâááâááââüáââýáàááàáüàáàááþàááàáþàááþàááþÊ.àþÏ.àþÄßà ßþàßßàßàßôàßàßßààßßà§ÞßûÞßßÞßßÞßÞßðÞßÞßÞßÞÞßÞÞßÞßÞßßþ¥ ÞþÝÞÞúÝÞÝÞÝÞÞþÝÞÞþÝÞÞþ¨ÝþÜÝÝþ¤ ÜþÝÜÜþÝÜÜÝùÜÝÜÜÝÝÜÜþÝÜÜþ¦.Üþ¦ÜÛÜþÛÜÜþÛÜÜýÛÜÛÛÜÛõÜÛÛÜÛÜÛÜÜÛÜÜüÛܦÛþÚÛÛþÚÛÛþÚÛÛ÷ÚÛÛÚÛÛÚÚÛ Ûþ¦.Úþ¦ÙüÚÙÚÙÙþÚÙÙþÚÙÙÚÙþÚÙÙþÚÙÙþÚÙÙýÚ¦øÙØØÙØØÙØØ÷ÙØÙØÙØÙÙØØÙøØÙØØÙØÙØØÙØþ¦.Øþ¦üררØþרØþרØýר××ýئ.×þ¦Öþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖþ×ÖÖþ×ÖÖü×Ö×ÖÖþ¦øÖÕÕÖÕÖÕÖÖÕðÖÕÖÕÕÖÖÕÕÖÕÖÕÖÕÖÖÕÖúÕÖÕÖÕÖÖÕýÖ¦ÖÔÕÔÕÔÕÔÕÕÔÔÕÔÕÔÕÕÔÔÕÕÔÕÕÔÕÕÔÔÕÔÕÔÕÔÕÔÔÕÔÕÔÔüÕÔ¦.Ôþ¦-ÔýÓ¦ÔýÓÔÓÓþÔÓÓùÔÓÔÓÔÔÓÓûÔÓÓÔÓÓþÔÓÓýÔ¦ùÒÓÒÓÒÒÓÓÒ÷ÓÒÓÓÒÓÒÓÒÒþÓÒÒÓûÒÓÓ¦úÑÒÒÑÑÒÒÑÒÑøÒÑÒÑÒÒÑÒÒþÑÒÒÑúÒÑÒÑÑÒÒûÑÒÒ¦.Ñþ¦.Ñþ¦ÐÑÐÑøÐÑÐÐÑÐÑÐÐþÑÐÐüÑЦþÐÏÏûÐÏÐÐÏÏþÐÏÏïÐÏÏÐÏÐÐÏÏÐÐÏÐÏÏÐÏÏûÐÏЦþÏÎÎÏÎÏúÎÏÏÎÏÎÎÏýÎÏÎÎþÏÎÎÏÎûÏÎϦÎþÍÎÎþÍÎÎþÍÎÎûÍÎÍÍÎÎþÍÎ Îþ¦.Íþ¦.Íþ¦þÍÌÌøÍÌÍÌÍÌÍÌÌþÍÌÌóÍÌÌÍÌÍÌÌÍÍÌÌÍÍþÌÍÍûÌÍÌÍÌÌþ¦ÌöËÌÌËÌËËÌËÌÌúËÌÌËËÌÌËýÌËÌÌþËÌÌüË̦ ËÊ ËÊüËÊÊËËþÊËËþ¥.Êþ¤ÉþÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉÊÉüÊɤ.Éþ¢ÉñÈÉÈÉÈÈÉÈÉÈÉÉÈÉÈÈÉþÈÉÉüÈÉÈÉÉÈÉüÈÉ¡ûÇÈÈÇÈÈÇÈþÇÈÈþÇÈÈÇÈþÇÈÈþÇÈÈ.ÇüzÆ ÆûÇÆÇÇÆÆþÇÆÆþÇÆÆ.ÆÐÿ)çþë+çþí,çþí-ç-çþë.ç.çæþçæ æþçæ æüçæçææåþæååþæååæåûæåææååþæååöæåææååæååææþåüäåäååûäåäåääåþäååäåäåüäåääã äþãääþãääãäüãäãääúãäãää.ã.ãâ÷ãâãâãââãââüãâãââãþâããýâãââãúáâáâáââþáââþáââáâ÷áâáâááâáââóáââáâáâáââáâáùàááàáàááüàáàááþàááþàááàýáÿ.àþÿ.àþÿþàßßþàßßýàßààßàßàøßàßßàßàßßàßýàÿßþÞßßþÞßßþÞßßùÞßßÞßÞßßÞßÞßøÞßÞßÞßÿÞþÝÞÞûÝÞÝÝÞÞþÝÞÞþÝÞ Þþÿ.ÝþÿþÝÜÜþÝÜ ÜÝÜÝöÜÝÜÜÝÝÜÜÝÜÜüÝÜÿ.ÜþÿüÜÛÛÜÜöÛÜÛÜÜÛÜÜÛÜÜÛ÷ÜÛÜÛÜÛÛÜÛÛþÜÛÛüÜÛÛÜÜþÿÛþÚÛÛþÚÛÛÚÛüÚÛÛÚÚÛþÚÛÛüÚÛÚÛÛþÿÚþÙÚÚþÿÙþÚÙÙüÚÙÚÙÙùÚÙÙÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÿØþÙØØòÙØÙØÙÙØØÙØÙÙØÙÙØûÙØÙÙØØöÙØÙØØÙØÙØÙÙýØÿ.Øþÿ Øþר ØþרØþרØüררØþÿ.×þÿÖþ×ÖÖô×Ö×Ö×ÖÖ××Ö×ÖÖþ×ÖÖü×Ö×ÖÖü×Ö×ÖÖþÿãÕÖÕÖÖÕÕÖÕÖÕÕÖÕÖÕÕÖÕÕÖÖÕÖÖÕÕÖÕÕÖýÕÖÕÕøÖÕÕÖÖÕÿþÕÔÔþÕÔÔýÕÔÕÕþÔÕÕöÔÕÕÔÕÕÔÕÔÕÕþÔÕÕþÔÕÕýÔÿ.Ôþÿ.ÔþÿÓüÔÓÔÓÓÔ÷ÓÔÓÔÔÓÓÔÓ ÓûÔÓÓÔÓÓþÿÒþÓÒÒüÓÒÓÒÒÓÒñÓÒÒÓÓÒÒÓÒÒÓÒÒÓÒÒûÓÒÒÿòÒÑÑÒÑÒÒÑÒÒÑÒÑÒÒÑÒÑøÒÑÒÒÑÒÒÑÑÒÑÒþÿ.Ñþÿ.ÑþÿÐþÑÐÐúÑÐÑÐÑÐÐþÿÏüÐÏÐÏÏÐÏÐÏÐÏÐÏþÐÏÏþÐÏÏúÐÏÐÏÿÎøÏÎÎÏÏÎÏÎÎýÏÎÏÏüÎÏÏÎÎÏüÎÏÎÏÏÎúÏÎÏÏÎÏÏþÿ ÎþÍÎÎüÍÎÍÎÎþÍÎ ÎýÍÿ.Íþÿ.ÍþÿþÍÌÌþÍÌÌþÍÌÌþÍÌÌþÍÌÌèÍÌÍÍÌÍÌÍÌÌÍÌÌÍÍÌÍÌÌÍÌÌÿþËÌÌøËÌÌËÌÌËÌÌûËÌÌËÌÌ÷ËÌÌËÌÌËËÌÌóËÌËËÌËÌËËÌÌÿËþÊËËøÊËÊËËÊÊËËþÊËËÊýËÊËËùÊËÊËËÿ.ÊþÿÉþÊÉÉùÊÉÉÊÉÊÉÉÊÉûÊÉÉÊÉÉþÊÉÉüÊÉÿ.ÉþÿýÉÈÉÉÈþÉÈÈÉþÈÉÉûÈÉÉÈÉÉüÈÉÈÉÉüÈÉÈÉÉÈþÿÈûÇÈÈÇÈÈÇÈúÇÈÇÈÇÈÈÇÈûÇÈÈÇÈÈ.ÇüÿÆÆÇÆþÇÆ ÆÇÆûÇÆÆÇÆ Æ.Æ(ÿýýå+ÿþ,ÿþ-ÿ-ÿþå-ÿþý.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿÆþÅÆ ÆþÅÆÆÅýÆÅÆÆúÅÆÅÆÆÅÅÆÅýÆÅÆÆþÅÆÆÅÅþÄÅÅþÄÅÅþÄÅÅüÄÅÄÅÅýÄÅ:ÄþÄÃÃþÄÃÃþÄÃÃÄÃþÄÃÃÄÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄóÂÃÃÂÂÃÂÃÃÂÃÃÂÂÃúÂÃÂÃÃÂÂÃþÂÃÃÂÃÂýÃÂÃÃÂöÃÂÃÂÃÂÃÂÃþÅÂ8ÂþÊÂÂþÁÂÂþÁ ÂþÁÂÂþÁÂÂÁÂüÁÂÁÂÂÁþÂÁ7ÁþÑÁ7ÁýÑÂÁ5ÁýÉÃÁ3Á þZ,fü†a[íÆòÅÆÆÅÆÆÅÅÆÅÆÅÅÆÆÅ ÆþÅÆÆúÅÆÅÆÅÆÆöÅÆÅÆÆÅÆÅÆÅÅÅøÄÅÅÄÅÅÄÅÅûÄÅÅÄÅÅþÄÅÅþÄÅÅúÄÅÅÄÄÅÅþÄÅÅûÄÅÅÄ:ÄþÄÃÃÄÃþÄÃÃûÄÃÃÄÃÃÄÃûÄÃÃÄÃÃûÄÃÃÄÃÃÂÃÂýÃÂÃÃÂþÃÂÂöÃÂÃÂÂÃÂÂÃÂÂÃøÂÃÃÂÂÃÃÂÂöÃÂÃÂÂÃÃÂÃÂÂþÄÂ8ÂýÉÁÂÂÁýÂÁÂÂôÁÂÂÁÂÂÁÂÁÂÁÂÂþÁÂÂúÁÂÂÁÁÂÂÁÂüÁÂÂþÂÁ7ÁþÑÁ7ÁýÑÂÁ5ÁýÉÃÁ)ÁþÀÁÁ þvù £¥§¨¨ª%ªü’y~íÆÅÆöÅÆÅÆÅÅÆÅÅÆÆúÅÆÅÆÅÆ ÆÅüÆÅÅÆÆÅÆúÅÆÆÅÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅ ÅþÄÅÅúÄÅÄÅÄÅÅýÄÃÄ7ÄþÃÄÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃöÂÃÃÂÃÂÃÂÃÂÂÃÂÃÂþÃÂÂÃüÂÃÃÂÂÃÂ÷ÃÂÂÃÂÂÃÃÂÂúÃÂÂÃÃþÄÂ8ÂþÊ ÂþÁÂÂÁ ÂþÁÂÂþÁÂÂÁÂþÁÂÂþÂÁ7ÁþÑÁ7ÁýÑÂÁ5ÁýÉÃÁ3Á þÿ,ÿÿî:ÿ:ÿ:ÿ:ÿ:ÿþýÿ8ÿþåÿ8ÿ9ÿþÿ7ÿþÿ6ÿýåýÿ3ÿ@ÆýÅÆÅÅäÆÅÅÆÆÅÆÆÅÅÆÅÅÆÅÅÆÆÅÆÅÆÆÅÆÆÅÆÆþÅÆÆÅÆûÅÆÆÅÆÆÅÆÅÄøÅÄÅÄÅÄÄÅÅüÄÅÄÅÅþÄÅÅùÄÅÅÄÅÅÄ>ÄÃþÄÃÃøÄÃÃÄÄÃÄà ÃþÄÃÃþÄà ÃþÄÃÃþÄÃÃÂýÃÂÃÃÂþÃÂÂàÃÂÃÂÃÂÃÂÂÃÃÂÃÃÂÃÂÂÃÃÂÃÃÂÃÃÂÃÃÂÂÃÃÂÃýÂÃÂDÂþÁÂÂþÁ ÂþÁÂÂûÁÂÂÁÂÂêÁÂÂÁÂÁÂÁÂÁÂÂÁÂÂÁÂÁÁÂÁÂÂþÁÂÂýÁÂÁ¿ÁþÀÁ=Á?føÅÆÅÆÆÅÆÅÅùÆÅÅÆÅÅÆÆüÅÆÅÆÆûÅÆÅÅÆÆÅýÆÅÆÆÅðÆÅÆÅÆÆÅÆÆÅÅÆÆÅÆÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅÄ Å÷ÄÅÅÄÅÅÄÅÄ?ÄÃþÄÃÃþÄÃÃþÄÃÃøÄÃÄÄÃÃÄÃÃÄøÃÄÃÄÃÃÄà ÃþÄÃÃÂýÃÂÃÃÂüÃÂÃÂÂÃúÂÃÃÂÃÂÂþÃÂÂúÃÂÃÂÂÃÃïÂÃÂÂÃÂÃÂÂÃÂÃÂÃÂÂÃÃýÂÃÂCÂþÁÂÂþÁÂÂÁÂþÁÂÂþÁÂÂþÁ ÂûÁÂÂÁÂÂÁÂÁþÀÁàÁ?ªþÅÆÆÅÆÅõÆÅÆÅÆÆÅÅÆÅÆÆðÅÆÅÅÆÆÅÅÆÅÆÆÅÆÅÆÆûÅÆÅÅÆÆöÅÆÆÅÅÆÆÅÆÅ ÅþÄÅÅøÄÅÅÄÅÅÄÅÅþÄÅÅþÄÅÅÄÅþÄÅÅþÄÅÅþÄÅÅ?Ä ÃÄ ÃÄûÃÄÃÄÃÃþÄÃÃÄÃüÄÃÄÃÃýÂÃÂÂûÃÂÂÃÂÂþÃÂÂÃÂÃÂÃÂÃûÂÃÂÃÂÂþÃÂÂúÃÂÂÃÃÂÂüÃÂÃÂCÂþÁÂÂþÁÂÂþÁÂÂþÁÂÂþÁÂÂûÁÂÁÁÂÂþÁÂÂÁþÀÁsÁþÀÁÁþÀÁ]Á?ÿÀÿ@ýÅÆÅÅÆöÅÆÅÆÅÆÆÅÆÅÅÆþÅÆÆþÅÆÆøÅÆÆÅÆÆÅÆÆÅÆþÅÆÆÅÆÄÅûÄÅÄÄÅÅþÄÅÅþÄÅÅÄýÅÄÅÅþÄÅÅþÄÅ Å?ÄÃþÄÃÃÄýÃÄÃÃþÄÃÃþÄà ÃÂýÃÂÃÃÂÃÂÃÂðÃÂÃÂÃÂÂÃÂÂÃÃÂÃÃÂÂþÃÂÂþÃÂÂÃýÂÃÂÂþÃÂHÂþÁÂÂþÁÂÂþÁÂÂüÁÂÂÁÁÂýÁÂÁÁ?føÆÅÆÅÅÆÆÅÅÆýÅÆÅÅÆüÅÆÅÆÆÅÆÅýÆÅÆÆüÅÆÆÅÅÆþÅÆÆþÄÅÅþÄÅÅÄ÷ÅÄÅÄÅÅÄÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅÄ ÅýÄÅÄ>ÄÃþÄÃÃþÄà ÃÄÃþÄÃÃþÄÃÃþÄÃÃÂÃÂøÃÂÃÂÂÃÃÂÂþÃÂÂüÃÂÃÂÂþÃÂÂÃþÂÃÃýÂÃÂÂöÃÂÂÃÃÂÂÃÃÂBÂûÁÂÂÁÂÂÁÂÁÂôÁÂÂÁÂÁÂÂÁÂÁÂÂûÁÂÁÁÂÂÁÂÁ?ªÅÆæÅÆÅÅÆÅÆÆÅÅÆÆÅÆÆÅÆÆÅÆÆÅÅÆÅÆÆþÅÆÆþÅÆÆÅÆüÅÆÆÅÅ÷ÆÅÆÅÅÄÅÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅÄÅþÄÅÅ?ÄÃúÄÃÄÃÄà ÃþÄÃÃþÄà ÃþÄÃÃÄÃþÄÃÃùÄÃÄÃÃÄÂÂÃÂÃÂÃÂ÷ÃÂÃÂÃÃÂÃÂÂÃýÂÃÂÂþÃÂÂõÃÂÃÂÂÃÃÂÃÃÂÂþÃÂÂÃýÂÃÂ?ÂõÁÂÂÁÂÂÁÂÁÁÂÂþÁÂÂÁÂÁÂüÁÂÁÂÂþÁÂÂþÁÂÂûÁÂÂÁÂÂ÷ÁÂÁÂÂÁÂÂÁpÁþÀÁŒÁ?ÿÀÿ@ÆûÅÆÅÆÅÅÆÅÆøÅÆÆÅÆÅÅÆÆÅþÆÅÅþÆÅÅÆëÅÆÆÅÆÅÅÆÅÆÅÆÅÅÆÅÅÄÅÄÅÅúÄÅÅÄÄÅÅþÄÅÅÄÅþÄÅÅ@Ä ÃþÄÃÃÄÃþÄÃÃþÄÃÃûÄÃÃÄÃÃÄÃÄüÃÄÄÃÃùÄÃÃÂÃÃÂÂýÃÂÃÃÂÃÂÃÂþÃÂÂýÃÂÃÃÂþÃÂÂöÃÂÂÃÂÂÃÂÃÂÂþÃÂPÂþÁÂÂôÁÂÁÁÂÁÂÁÂÂÁÂÂþÁÂÂþÁÂÂþÁÂÂêÁþÀÁ ÁþÀÁÁ?fÆýÅÆÅÅÆþÅÆÆÅÆÅÆûÅÆÆÅÆÆÅþÆÅÅÆûÅÆÆÅÆÆÅÆÅþÄÅÅûÄÅÅÄÅÅþÄÅÅÄÅþÄÅ ÅûÄÅÄÄÅÅÄùÅÄÄÅÅÄÅÅ?ÄÃþÄÃÃôÄÃÄÃÃÄÃÃÄÃÄÃÃþÄà ÃþÄÃÃüÄÃÄÃÃüÄÃÄÃÃþÄÃÃÂÃÂÃýÂÃÂÂùÃÂÂÃÂÃÂÂÃÂÃõÂÃÂÃÃÂÂÃÃÂÃÃÂÃýÂÃÂBÂÁÂþÁÂÂþÁÂÂüÁÂÁÂÂþÁÂÂþÁÂÂÁÂþÁÂÂúÁÂÂÁÁÂÂüÁÂÂÁÿÁ?ªÆüÅÆÅÆÆÅÆøÅÆÅÆÅÆÅÆÆþÅÆÆùÅÆÅÅÆÅÆÆùÅÆÅÆÆÅÆÆûÅÆÅÅÆÆýÅÆÅÅüÄÅÄÅÅÄÅÄÅÄÅþÄÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅüÄÅÅÄ>ÄÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃÄÃøÄÃÃÂÃÂÃÂÂþÃÂÂþÃÂÂüÃÂÂÃÃÂÃýÂÃÂÂõÃÂÂÃÃÂÃÂÂÃÂÂÃþÂÃÃÂþÃÂTÂÁÂüÁÂÁÂÂþÁÂÂþÁÂÂþÁÂÂúÁÂÂÁÁ Â–ÁþÀÁgÁ?ÿÀÿ@ÆþÅÆÆüÅÆÆÅÅÆÅÆýÅÆÅÅýÆÅÆÆÅÆÅüÆÅÅÆÆþÅÆÆÅÆÅþÄÅ ÅþÄÅÅ÷ÄÅÅÄÄÅÅÄÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅùÄÅÅÄÄÅÄ>ÄýÃÄà ÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄà ÃþÄÃÃõÂÃÃÂÃÂÃÃÂÃÂÂþÃÂÂüÃÂÃÂÂþÃÂÂ÷ÃÂÂÃÃÂÃÃÂÂÃûÂÃÂÃÂJÂÁýÂÁÂÂþÁÂÂþÁÂÂüÁÂÁÂÂþÁÂÂùÁÂÂÁÂÁÂÂôÁÂÁÂÂÁÂÁÂÂÀÁæÁþÀÁÁ?fýÆÅÆÆüÅÆÅÆÆÅÆÅøÆÅÅÆÅÆÅÆÆøÅÆÅÆÅÅÆÅÅÆüÅÆÅÆÆÅÆ÷ÅÆÆÅÆÅÅÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅ?ÄÃóÄÃÄÃÃÄÃÃÄÃÃÄÃÃüÄÃÄÃÃÄÃÄÃûÄÃÃÄÃÃÄÃþÄÃÃøÂÃÂÂÃÂÃÂÂüÃÂÃÂÂþÃÂÂÃöÂÃÂÂÃÂÃÂÂÃÃòÂÃÂÃÂÃÂÂÃÂÂÃÂÃÃÂÃýÂÃÂÂþÃÂWÂþÁÂÂþÁÂÂþÁÂÂÁ?ªÅÆþÅÆÆþÅÆÆíÅÆÆÅÆÅÅÆÅÆÆÅÆÅÆÅÆÅÆÆþÅÆÆÅÆýÅÆÅÅÆÅÆýÅÆÅÅþÄÅÅþÄÅ ÅÄýÅÄÅ ÅûÄÅÄÄÅÅþÄÅÅÄÅ@ÄÃþÄÃÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃÄûÃÂÃÂÃÃÂþÃÂÂÃýÂÃÂÂûÃÂÂÃÂÂÃúÂÃÂÂÃÂÂþÃÂÂÃÂüÃÂÃÂBÂÁÂüÁÂÁÂÂÁÂþÁÂÂÁÂûÁÂÂÁÂÂþÁ ÂÁ?ÿÀÿ@ýÆÅÆÆùÅÆÆÅÆÅÆÆÅÆúÅÆÆÅÅÆÆýÅÆÅÅÆÅúÆÅÆÅÅÆÆþÅÆÆþÅÆÆöÅÆÅÆÆÄÄÅÄÅÅþÄÅ ÅúÄÅÄÅÄÅÅùÄÅÅÄÅÄÅÅÄÅÄùÅÄÅÄÅÄÅÅüÄÅÅÄ?Ä ÃþÄÃÃÄÃÄÃþÄÃÃÄÃþÄÃÃÂÃÂÃÂþÃÂÂþÃÂÂýÃÂÃÃÂÃøÂÃÂÃÂÃÃÂÂüÃÂÃÂÂþÃÂÂþÃÂ@ÂûÁÂÂÁÂÂþÁÂÂþÁÂÂûÁÂÂÁÂÂúÁÂÂÁÁÂÂþÁÂÂþÁÂÂþÁÂÂÁÁþÀÁ<Á?fÅÆÅÆþÅÆÆÅòÆÅÅÆÆÅÆÅÆÅÆÅÆÅÅÆÅúÆÅÆÅÆÅÅÆþÅÆÆÅþÄÅÅþÄÅÅþÄÅÅøÄÅÅÄÄÅÄÅÅüÄÅÅÄÄÅþÄÅÅÄÅþÄÅÅÄþÃÄÄÃÄÃûÄÃÃÄÃÃüÄÃÄÃÃöÄÃÃÄÃÄÃÃÄÃÃøÄÃÃÄÃÃÄÃÃüÄÃÄÃÃÄÂÃúÂÃÃÂÃÂÂüÃÂÃÂÂþÃÂÂþÃÂÂÃÂÃÂñÃÂÃÂÂÃÂÂÃÂÂÃÂÃÂÂÃDÂþÁÂÂþÁÂÂÁ ÂþÁÂÂÁÂûÁÂÂÁÂÂ~ÁþÀÁ€Á?ªÆÅüÆÅÅÆÆêÅÆÆÅÅÆÅÅÆÆÅÆÆÅÅÆÅÅÆÆÅÆÆÅÆþÅÆÆöÅÆÅÅÆÆÅÆÅÆÆýÅÄÅÅþÄÅÅþÄÅ ÅöÄÅÄÅÄÅÅÄÄÅÅÄÅþÄÅÅ2ÄþÃÄ ÄÃþÄÃÃüÄÃÄÃÃúÄÃÃÄÄÃÃüÄÃÄÃÃÄÃþÄà ÃüÄÃÄÃÃþÂÃÃÂÃþÂÃÃùÂÃÃÂÃÂÃÃþÂÃÃÂüÃÂÂÃÃÂÃÂüÃÂÂÃÃAÂÁýÂÁ ÂûÁÂÁÁÂÂþÁÂÂùÁÂÂÁÂÁÂÂÁ ÂþÁÂÂþÁÂÂÁ?ÿÀÿ@øÆÅÅÆÆÅÅÆÆÅÆþÅÆÆûÅÆÆÅÆÆûÅÆÅÆÅÅþÆÅÅøÆÅÆÆÅÆÅÆÆÅñÆÅÆÆÅÆÆÅÆÅÅÄÅÄÅ ÅþÄÅÅÄÅûÄÅÅÄÅÅþÄÅÅüÄÅÄÅÅÄþÅÄ>ÄÃüÄÃÄà ÃüÄÃÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃ÷ÄÃÄÃÄÄÃÄÃÃþÄÃÃüÂÃÂÃÃÂÃýÂÃÂÂøÃÂÂÃÂÂÃÂÂÃþÂÃÃÂÃýÂÃÂÂÃÂÃFÂþÁÂÂþÁÂÂþÁÂÂ÷ÁÂÂÁÁÂÁÁÂÂüÁÂÁÂÂÁÂþÁÂÂþÁÂÂÁ?fûÅÆÆÅÆÆÅÆøÅÆÅÆÆÅÅÆÆÅÆÅÆùÅÆÅÆÅÅÆÆùÅÆÅÅÆÅÆÆ÷ÅÆÅÅÆÅÆÄÅÅûÄÅÄÄÅÅþÄÅÅþÄÅÅüÄÅÄÅÅûÄÅÅÄÅÅÄÅýÄÅÄ+ÄþÃÄÄÃþÄÃÃþÄÃÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃÄÃÂþÃÂÂùÃÂÂÃÂÃÂÂõÃÂÂÃÂÂÃÂÂÃÂÂÃþÂÃÃÂÃÂÃûÂÃÂÃÂ@ÂþÁÂÂþÁÂÂòÁÂÁÁÂÂÁÁÂÂÁÂÁÂÂþÁÂÂïÁÂÁÂÁÂÁÂÂÁÁÂÁÂÂÁÂÂûÁÂÂÁÂÂÁþÀÁúÁ?ªÆùÅÆÅÅÆÅÆÆÅÆøÅÆÅÆÆÅÅÆÆÅ÷ÆÅÆÅÅÆÅÆÅÅøÆÅÆÅÆÆÅÆÆþÅÆÆÅÆøÄÅÄÅÄÅÄÅÅüÄÅÄÅÅþÄÅÅþÄÅÅþÄÅÅôÄÅÅÄÄÅÄÅÅÄÅÄ>ÄÃþÄÃÃûÄÃÃÄÃÃþÄÃÃþÄà ÃúÄÃÄÃÄÃÃþÄÃÃúÄÃÄÃÃÂÂ÷ÃÂÂÃÂÂÃÃÂÂÃÂÃÂùÃÂÃÂÂÃÂÂþÃÂÂþÃÂÂÃôÂÃÂÃÂÃÂÂÃÂÃÂEÂûÁÂÂÁÂÂþÁÂÂúÁÂÂÁÁÂÂüÁÂÁÂÂþÁÂÂüÁÂÂÁnÁþÀÁÁ?ÿÀÿ@þÅÆÆÅùÆÅÅÆÆÅÆÆüÅÆÆÅÅÆþÅÆÆþÅÆÆûÅÆÅÅÄÅÄÅùÄÅÅÄÅÄÅ ÅÄÅýÄÅ.ÄÃüÄÃÄÃÃþÄÃÃûÄÃÄÄÃÃÄÃþÄÃÃüÄÃÃÂÃÂþÃÂÂþÃÂÂüÃÂÃÂÂýÃÂÃÃÂÃÂÃùÂÃÂÃÂÃ-ÂþÄÂüÁÂÁ ÂþÁÂÂüÁÂÁÂÂþÊ,ÁþÂ,ÁþÑ*ÁýÂÑ(ÁýÃÉ fþZ.ü[a†ªýÅÆÅÅûÆÅÆÅÆÆüÅÆÅÆÆÅüÆÅÆÅÅþÆÅÅÆþÅôÅÄÄÅÅÄÅÄÅÅÄÅÅþÄÅÅÄýÅÄÅÅöÄÅÄÅÅÄÅÅÄÅÅ.ÄýÃÄÃÃþÄÃÃþÄÃÃûÄÃÃÄÃÃÄÃõÂÃÂÂÃÂÂÃÂÂÃÃüÂÃÃÂÂùÃÂÂÃÂÃÂÂþÃÂÂþÃÂÂÃüÂÃÃ-ÂþÅÂüÁÂÁÂÂûÁÂÂÁÂÂþÁÂÂþÊ,ÁþÂ,ÁþÑÁþÀÁ!ÁýÂÐ(ÁýÃɪ¨û§¥£ þv.ü~y’ªóÆÅÆÅÆÆÅÆÅÆÆÅÆÆÅðÆÅÆÅÆÅÅÆÅÆÅÆÅÅÆÅÅÆÅùÆÅÆÆÅÅÅÄüÅÄÅÄÄÅþÄÅÅüÄÅÄÅÅöÄÅÄÅÅÄÅÅÄÅÅþÄ.ÄÃþÄÃÃþÄÃÃÄ ÃþÄÃÃûÄÃÃÄÃÃÂþÃÂÂÃÂüÃÂÂÃÃÂÃÂüÃÂÃÂÂþÃÂÂûÃÂÂÃ-ÂþÅûÂÁÁÂÁÁ÷ÂÁÂÁÂÁÂÁÂÂþÁÂÂüÁÂÁÂÂûÁÂÂÁÂÂþÁÂÂþÊ ÁþÀÁÁþÂÁþÀÁÁþÀÁÁþÑ*ÁýÂÑÁþÀÁÁýÃÉ ÿþÿ.ÿ«.ÿ.ÿ.ÿ.ÿ.ÿ-ÿþý-ÿþå-ÿ,ÿþ+ÿþ(ÿýýå ú(}> ôP New Layerÿ     ÀžôPÀ¾ÌºÌÆÌÒôPÁ ÅÅ2ÅRÅrŒŲÅÒÉâÊòËË2ËRËr˒˲þÇÍ5ÍýÕÎÍ6ÍþÕÍ8ÍþÎÍ8ÍþÇÍ9Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;ÍþÇÍ5ÍýÕÎÍ6ÍþÕÍ8ÍþÎÍ8ÍþÇÍ9Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;ÍþÇÍ5ÍýÕÎÍ6ÍþÕÍ8ÍþÎÍ8ÍþÇÍ9Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;Í;ÍýGùÿ4ÿþÿ7ÿþÿ8ÿ:ÿþGÿ9ÿþùÿ9ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿÍÍÍÿÍÍÍÿÍÍÍÿÍÍÍÿÍÍÍÿÍÍÍÿÐ*ÍþÇ+ÍýÎÕ-ÍþÕ-ÍþÎ.ÍþÇ/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/ÍÐ*ÍþÇ+ÍýÎÕ-ÍþÕ-ÍþÎ.ÍþÇ/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/ÍÐ*ÍþÇ+ÍýÎÕ-ÍþÕ-ÍþÎ.ÍþÇ/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/Í/ÍÐ)ÿýùG,ÿþ-ÿþ.ÿ.ÿþG.ÿþù/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ;Í;Í;Í;Í;Í;Í;ÍþÇÍ9ÍþÎÍ8ÍþÕÍ8ÍýÕÎÍ6ÍþÇÍ5Í;Í;Í;Í;Í;Í;Í;ÍþÇÍ9ÍþÎÍ8ÍþÕÍ8ÍýÕÎÍ6ÍþÇÍ5Í;Í;Í;Í;Í;Í;Í;ÍþÇÍ9ÍþÎÍ8ÍþÕÍ8ÍýÕÎÍ6ÍþÇÍ5Í;ÿ;ÿ;ÿ;ÿ;ÿ;ÿþùÿ9ÿþGÿ9ÿ:ÿþÿ8ÿþÿ7ÿýGùÿ4ÿÍÍÍÿÍÍÍÿÍÍÍÿÍÍÍÿÍÍÍÿÍÍÍÿ/Í/Í/Í/Í/Í/Í/Í.ÍþÇ-ÍþÎ-ÍþÕ+ÍýÎÕ*ÍþÇ×/Í/Í/Í/Í/Í/Í/Í.ÍþÇ-ÍþÎ-ÍþÕ+ÍýÎÕ*ÍþÇ×/Í/Í/Í/Í/Í/Í/Í.ÍþÇ-ÍþÎ-ÍþÕ+ÍýÎÕ*ÍþÇ×/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ.ÿþù.ÿþG.ÿ-ÿþ,ÿþ)ÿýùG×ú(}> ôP New Layer#1ÿ      ͆ôPͦÎòÎþÏ ôPÍòÎÎÎ"Î2ÎBÎRÎbÎr΂Β΢βÎÂÎÒÎâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ÿ@ÿ@ÿ@ÿú(}> stem-1.7.1/docs/_static/buttons/resources/download.xcf0000664000175000017500000024415013157571677023642 0ustar atagaratagar00000000000000gimp xcf fileôPBœBœABgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) gamma0.45454999804496765µ MûˆÊÊ> Downloadÿ     g 'Egimp-text-layer)(text "Download") (font "FreeSerif") (font-size 50.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 202.000000) (box-height 62.000000) (box-unit pixels) §Ê>ÃóÿÊ>ß  ³€€€Àþ ý.ý,óÿ ÿøõæÔ§s? )ü`ÞÿÿûèÈÖøÿÿûø«N(þ>ÿÿô·ChŒ¼þÿÿüée'þóÿÿþaü"ˆóÿÿýÍ)&þÞÿÿþL ý¸ÿÿýå!%þÍÿÿþL þ¡ÿÿýÜ$þÌÿÿþL ýÈÿÿýÒ#þÌÿÿþL ýåÿÿþ¾#þÌÿÿþL þ;ÿÿþ="þÌÿÿþLþÊÿÿþ¯"þÌÿÿþLþhÿÿýý#ôBr¡ÐôСrBüz€€þÌÿÿþLýöÿÿþ’÷%Èÿï¶}˜àÿÿýÂ"üvíÿþÌÿÿþLþ«ÿÿþÌúgôÿ¾ù1åÿÿófýCÿþÌÿÿþLþ‡ÿÿþëú–ÿÿ±ý*ìÿÿþþ¼þÌÿÿþLþmÿÿþ ú=þÿû"ù3ùÿÿþ:þDþÌÿÿþLþSÿÿþ'úÔÿÿ¡þ©ÿÿýÖþþÌÿÿþLþ<ÿÿþ7þvÿÿþMþBÿÿþ€þÌÿÿþLþVÿÿþþÜÿÿþ,ýÚÿÿþÖþÌÿÿþLþÿÿùüýÿÿþ þ‚ÿÿýûþÌÿÿþLþ§ÿÿþâþ0ÿÿþû þaÿÿþ/þÌÿÿþLþÏÿÿþÂþZÿÿþ þFÿÿþ\þÌÿÿþLýõÿÿþjþ€ÿÿþ+ þ+ÿÿþsþÌÿÿþLþÿÿýò þjÿÿþE þÿÿþKþÌÿÿþLþ‡ÿÿþ”þ>ÿÿþ^ þ ÿÿþ!þÌÿÿþL ý3üÿÿþ*þÿÿþŒ þ(ÿÿýôþÌÿÿþL ýÒÿÿþ•þèÿÿýâþCÿÿþËþÌÿÿþL þ€ÿÿý´þ£ÿÿþ>þ_ÿÿþoþÎÿÿþL ýNúÿÿýÍ ýñÿÿþ˜ú¯ÿÿÏþâÿÿþL ý3¾ÿÿýáþmÿÿýïúüÿþ8ý÷ÿÿþnü!¦þÿÿý¶ýÌÿÿýÈûÿÿš þTÿÿôÊ! .Oq’µùÿÿýÚW ýÆÿÿþútÿÿ–û5}ïÿÿýíëÿÿû÷¨B ñƒýÿÿ¼e C˜ÿîRþ2ÿ ÿ÷øçÖŧo6ô=¼îÿÿüûÿߦ6ú!TrG €€€¿þ :û"n»ú6ûZœÞÿÿ6û ÓÇöÿÿ9ý ÿÿ:þ5ÿÿ:þÿÿ:þÿÿ:þÿÿ:þÿÿ:þÿÿ:þÿÿ€ût€€þ þ:€€þZðG›è H‰ËðÁ‰þÿÿø¸gpíÿÿûû¤eó%‘íÿÿïVM¡ïÿÿû !ÃÿÿýÙ*þÿÿýçý¢ÿÿþ›÷gÿÿS(íúÿÿø AïÿòÎõÿÿýÝþÿÿþÝýòÿÿþoönÿÙ£ÿÿögù´7þÿÿþbþÿÿþþŽÿÿþ°ü°ÿoþ$ÿÿýþuþ¬ÿÿþÍþÿÿþÜÿÿþuþ0ÿÿýøûî÷þ ÿÿþgþDÿÿþòþÿÿþxÿÿþÖþÒÿÿþdüBÿ£ÿþ4þÿÿþþÿÿýûÿÿþ8þŽÿÿþÄüªÿ=ÿþ4þÿÿþ/þÿÿý®ÿÿþ™ýãÿÿþ$üúÖÿþ4ÿþ4þÿÿýIÿÿýð ü^ÿùÿÿþ„üzÿpÿþ4ÿþ4þÿÿüáÿÿþ[÷Òÿ^þÿÿáûß÷ÿþ4ÿþ4þÿÿþÿÿþ½úHÿÆ»ÿÿþDüIÿ¤ÿþ4ÿþ4þÿÿùýÿÿþ ú½ÿOXÿÿþ¤ü±ÿ>ÿþ4ÿþ4þÿÿþµÿÿí2ÿÖíÿÿõü×ÿþ4ÿþ4þÿÿþPÿÿùÞ§ÿ`þ’ÿÿúd€ÿqÿþ4ÿþ4þÿÿýæÿÿúA üãþ/ÿÿúÄäøÿþ4ÿþ4þÿÿþ…ÿÿû¢‘ÿrþÌÿÿütÿ¥ ÿþ4ÿþ4þÿÿ÷"þÿÿõôî þiÿÿüûÿ? ÿþ4ÿþ4þÿÿþ»ÿÿþƒýöÿÿþ× þÿÿþ4þ ÿÿþ4þÿÿþVÿÿýöþ£ÿÿþr þÿÿþ9þÿÿþAþ0ÿÿúëÿÿ”ú@ÿÿø þAÿÿþ‚þVÿÿþfþeÿÿûŠÿû!ûÚÿ¡ ýÆÿÿýâ.ý,ØÿÿýÜ1üQçÿÿüù›üpþ,üÜþÿÿúèeâÿÿûæ1Êùÿÿý`ý f*€€€€þ=þ=þ<ý<ýU=þ=þ=þ=þ=þ=þ=þ=þôBr¡ÐôСrB õe©ÉéóÏ«~ ÷=yµíÙ¥÷%Èÿï¶}˜àÿÿýÂ"ò|êÿË‚C[ªÿÿàA öÎÿøÁ‚†»úgôÿ¾ù1åÿÿófú¦ÿÿwú}ÿÿùú7çÿÊþú–ÿÿ±ý*ìÿÿþúÿÿüúíÿÿŽúU÷ÿà þú=þÿû"ù3ùÿÿþ:þåÿÿþ úÅÿÿôúòÿüþúÔÿÿ¡þ©ÿÿýÖþÿÿþ$þªÿÿþ û—ÿÿ®þþvÿÿþMþBÿÿþ€ûÒÿÿÍþ¨ÿÿþ=ú)üÿÿBþþÜÿÿþ,ýÚÿÿþÖû!Žˆþ¨ÿÿþYú²ÿÿýþýýÿÿþ þ‚ÿÿýû üCÖÿÿþhúúÿÿçþþ0ÿÿþû þaÿÿþ/úyÞëâÿÿþhþ'ÿÿþËþþZÿÿþ þFÿÿþ\ø8¦úÎa¨ÿÿþhþOÿÿþ°þþ€ÿÿþ+ þ+ÿÿþsú=¾ÿ×Bþ¨ÿÿþhþwÿÿþ½þþjÿÿþE þÿÿþKù ÿý‚þ¨ÿÿþhþœÿÿþÚþþ>ÿÿþ^ þ ÿÿþ!úÒÿÿ~þ¨ÿÿþhþŒÿÿþöþþÿÿþŒ þ(ÿÿõôÎÿÿÄþ¨ÿÿþhþgÿÿþþþèÿÿýâþCÿÿþËþzÿÿþzþ¨ÿÿþhþAÿÿþeþþ£ÿÿþ>þ_ÿÿþoþéÿÿþJþ¨ÿÿþhþÿÿþÔþýñÿÿþ˜÷¯ÿÿÏÿÿþ€þÂÿÿþhþÊÿÿþEþþmÿÿýïúüÿþ8þÿÿþ×ýîÿÿþrþ>ÿÿý×þ)ýÌÿÿýÈûÿÿšþìÿÿþMûLÝúÿÿ÷”¯ÿÿýÝ!þPýÆÿÿþútÿÿ–þ¢ÿÿ÷ü t•×ùw{ÿÿöøšö$æÿÿøêšZ%=Ò2ñƒýÿÿ¼e C˜ÿîRýìÿÿûÑ.=ÿÿþ„ý¼ÿÿýï®ô=¼îÿÿüûÿߦý(Çÿÿü×~ù¦ýÿÿûcü}ãÿÿýþÓ ú!TrG ú7ecûjJúIrJllliý ô[¯ö44|Ãûÿÿú4Ñùÿÿþ4ý wÿÿþ4þÿÿþ4þÿÿþ4ÿþ4ÿþ4ÿþ4ÿþ4ÿù4^ÿÿù4þÅ,ÿÿù4Dâûÿÿþ4ý)öÿÿþ4þwÿÿþ4þ0ÿÿþ4þÿÿþ4ÿþ4ÿþ4ÿþ4ÿþ4ÿþ4ÿþ4ÿþ4ÿþ4ÿþ4ÿþ4ÿþ8þ8ÿÿþLýÞÿÿù®ó™ÿÿûàÿÿÿôò¡Gaÿù±V ý_¤e2XP Icon (red)ÿ     @ºXPÞMËM×MãMïXP:2!FuF…F•F¥FµFÅFÕFåFõK.MKM[MkM{M‹M›M«M»ðóÿ™ª¹¿Ä¶°¹ªª/íÿ¶¼»½¼½¼½½¼¾¼½¼½¹Ì(è¿»¾½¼½½ÀÂÅÆÇÈÇÅÃÁ¾½½¼¼#ä'ÿ¿º½¼¾ÁÇÐÙàæêíïïîìèãÜÔËľ!(󺽽¼ÀÉÕáëïòôôóûñíæÛò& )+¶¼¼öÁÎÝêñòóôôõõôóþòþ88ð67)+)½¼½¿Íßîòóóüôõõööõôþóæ:Kjd(*(ªº½½ÈÙëðñòóôôõõööõöø÷ööõõôôÖ!;Q|$++$+Ƽ¼¿Ðäïñòòóôõöö÷ø÷õòðññðóöøø÷ööõå($0@'+'+¿½¾ÄØëïñòóôõö÷÷øøðõðñõööõðñöøùø÷÷ß:KG@',',¿½½ÆÜíïðòóôõö÷øøùùøòóùÿÿ÷øòóùúùøøç3LXK*+4*+²½¼Èßíîðñòôõö÷øùùúúöð÷þÿÿ÷þöð÷ûúùùà2M*+*+ª¼¾ÆÞìîðñòôõ÷÷øùúûûüöóýÿÿøüòøüüûúæ.'+'+;¼½ÃÛëíïñòôõ÷øùúûüýýüöòþÿÿøýòøþýýüæ-',4',4½¼¿Öéìîðòôõ÷øùúûýýþþüöòþÿÿüþòøþþà$+.$+.¶¼½Îæëíïñóõöøùûüýþþÿÿþöòþÿÿûþñøþÿÿç+,+,X¼½Æßêìîðòôö÷ùûüýþþÿÿûþöòþÿÿûþñøþÿÿè(+<(+<º¼¿Ôçêíïñôö÷ùûýþþÿÿûþõñþÿÿûþð÷þÿÿé(+0(+0ÿ»¼Êãéëîðóõ÷øúýþÿÿûþõðþÿÿûýð÷þÿÿê),J),J¿½À×çêìïñôöøúüþÿÿûþôðþÿÿûýï÷þÿÿé*3*3rº½Êãçêíïòô÷ùûýþÿÿûþôïþÿÿûýî÷þÿÿê),L),L¿¾ÀÔåèëíñóõøûýþÿÿûþôîþÿÿûýî÷þÿÿé$+.$+.i»¾ÅÝåéìïòô÷ùüþþÿÿûþóîþÿÿûýíöþÿÿç(+A(+A‚¼¾Îâæéìðóõøûýþÿþþÿÿûþóíþÿÿûýìöþÿÿå+,+,V¼ÀÕãæéíñóöùüþþûúúûþÿÿûþóìþÿÿûýìõþÿÿé+0+0k¶¾ÄÛãçêîñôöúü÷ñëëûêñøþÿÿûþòìþÿÿûýëõþÿÿÛ'+<'+ACDB@_Áýÿ ÿûüµT@ÞJMNJMNP'))*,.//1245439JOQRSSTz×þÿÿúþËnTSñ?KM?KMOb%()*+.//ö233/MœÒâãääþõÿ ÿþðääéKMOKMOQ&())*-.//02/A¶ýÿÿöGLNGLNP())ý+.//û0/‘úÿÿLíNLLN&'))*,.//.4ÉþÿÿöDKMDKMO%))÷*-./.4ÐþÿÿëlKLNKLN$'())+-..0°ýÿÿë‡?LM?LMN[#())*+-.+oìÿÿó©JLNJLNNf&'))ø+-,+Óøþþó„«HLHLNO&))÷+-+,MzŒŽŽŽð‚§¶?JM?JMNU$&())ô+-,+**+,-..//0/.ï=‘ª­ªIMIMNa!&())û+-..//û01223343ý21ïswjm{JMJMMc'))û*,..//ý012232þ100óù3õü(çŸ )16;<94-$"㪜£ $8UtŽ °¹Áý´¨—€dD, 𑪨‘ "LTVWX\]]~Ìýÿÿ 㯪­¯ª­³'2>IQWZ[ZyÈþÿÿ ♫¬™«¬² !'/;HQUWsÆþÿÿ ªã«ªª«° !"%+09?BfÄýÿÿᨫ¯¨«¯¶ !"#'*-011Z¿ýÿÿþû ªâ­ªª­´ !"%),/11/X¼ýÿÿýú§ ߟª¬Ÿª¬²f !"$'+-0220R¶þÿ ÿüü¦@ Þ¿¨«¿¨«°¶ !!#%(*./10/R¼ýÿ ÿûü¯F/Þ¨ª®¨ª®´ !! (;@ABDEFoÔþÿÿúþÇbEE檩«ª©«±b ?•Ïàááâþôÿ ÿþïââö§ª®§ª®´ù3±ýÿÿ꣪¬£ª¬±‰úÿÿö©ª®©ª®÷$Åþÿÿªô«ªª«°û%Íþÿÿ릨ª¬¨ª¬!«ýÿÿôË”¨«”¨«®[ùfëÿÿóÌÿ§ª¬§ª¬¯føxÐøþþñÂþ§ª§ª¬°÷Aq„…†† ‡†ð%Çþþ¿ªª¿ªª¬U ø ïYÚÿþÿ¿¦ª¿¦ª¬a þ ! î*ª®›Ÿµ¨ª¨ª«cþ ðó  /í=_€ž²ÁÉÊõ¢…dB!)ø-cœÌìýþ þûðÒ¥l%øR›Øôüÿÿýý÷$ú^´ëýÿÿ#ûP¬ïÿÿ"ü†êÿÿ úJ´úþÿÿû cÔþÿÿü xäÿÿü …óÿÿû xóþÿÿücäÿÿýIÓÿ ÿüµþÿ ÿü†úÿ!ÿüPêþÿ!ÿý¬ÿ#ÿü_ïÿ#ÿý´ÿ$ÿýRëÿ$ÿüšýÿ$ÿý-Øÿ%ÿýdôÿ%ÿüýÿ%ÿýÌÿ&ÿý=ìÿ&ÿü_ýÿ&ÿü€þÿ&ÿü žþÿ&ÿü ³þÿ&ÿü Áþÿ&ÿü Éþÿ&ÿüÊþÿ&ÿü Ãþÿ&ÿü µþÿ&ÿü ¢þÿ&ÿü…þÿ&ÿüdþÿ&ÿýBðÿ&ÿý"Òÿ&ÿü¥ýÿ%ÿým÷ÿ%ÿý5ßÿ%ÿü ¦þÿ$ÿý^ïÿ$ÿý!¾ÿ$ÿül÷ÿ#ÿý!¹ÿ#ÿü_ðÿ"ÿü”ûÿ!ÿý2Êÿ!ÿý]àÿ ÿü wìÿÿüŠõÿÿüŒúÿÿü‰òÿÿ@ý»°<ú½¼½¹ÿ9øÍ½½¼¹ù*#ýëòóóé÷üýûöñìçáÛÕÎÈÁ½¼ƒYR:#þÙÚÚçÜÝèôøóîéäÞØÒËÅ¿¼½*Q…ZR;"øçòåØàððëçáÛÕÎȽ½¿)Q‡ZSC"ÿèþèÏßìèãÝ×ÑËÅ¿¾·?TQˆZSG"ÿéûÝÓæåßÚÔÎȾ¼¿(TQ‰ZSF"ÿéþæÊàáÛÖÐÊÄ¿½¹_TQ‰ZSE-"ÿêåÅÜÜ×ÒÌÆÀ½¼¿*TTQ‰ZSG="ÿéýÞÅØØÓÍȾ¼º?XWPˆZSH@"ÿèñÌÇ×ÓÎÉÄ¿¾¼b$glbRˆ[TH=!ÿåþüëÏÀÍÔÏÊÅ¿½¼¿*^d\ZP‡[THB2!âáàßÝÕÅÁÊÓÏÊÅÀ½½¿?``[_Q†[TMJ@!âÓÐÎËÉÊÏÒÎÊÅÀ¼¼´fbhff_Q…[TQN<!áåâàÜØÖÒÍÉÅÀ¼¼½b"VUVVWUQ„[TIG= ááÞÛ×ÔÐÌÈÄ¿½¼¶f&jda`^_`^…dSC;8 @ý&<û('%:ùY9*(%&ù$Fm…Ž*꿟p>*)(h~Š„wlho|†ŽŒm)êÌËȨs:)'#€…†…„„……’’„R)ÉçÈÛ`0(&ŽŒŒ”—˜”‰wz…‰’#ÇÆ÷ŵ€D(($”••–—û–Ÿ™…#ÄÃê¿•S,(!·¶µ´²¯¬ª¨¥©·™|#ÁÀ¿ú£c+(¬¬­ù®¯µÃ {#¾½¼ú«e+'¦¦§û­·˜{#»º¹ú¨a*'§§û­·™{#¸·ô¶··¶µµ¢X+%§§û¬·š|#µ´³÷²±±E)&§§û¬·š~#þ³²²±°¯ú®~6)§§û¬·›€#ý±°¯¯þ®­­¬«ú¤`*'§§û¬·œ€#ü¯®­««ª©ø¨§ŽE'!¦§§û¬¶œ‚#ù­««©¨¨§§þ¦¥¥ù£ l+(§§û¬µž…#ôª©©§¦¥¤¤££¢¡¡ò Ÿ“G(%§§¬´ž†#ø©§¦¥¤¢¡  îŸžžœšj,'©§¬³ž‡#¥ú¤£¡ žœœî›š™™š™—‰@(¨§­²Ÿ‰#󣢡 Ÿœš™™˜—––ô”“\+&H§®± ‰#ä ŸŸžš™—–•””““’’‘t3&§¯± ‰#äœ›š™—••“’‘ŽŽŒ‚C)(¯±¡‰#ñš˜•”›˜ŽŽŒŠŠõ‰†T)$D°°¢‹#÷”“«ËÞÚÞŠŠð‰ˆ‡‡†…„d/'I±°¢‹#ñ³çþÿÿüÙ™„†‡†…ƒƒõ‚€n4(K¯£‹#ý´ëÿÿ÷ýÊ…‚~~ö|s:'L?®£‹#ýîþÿÿ÷þê}~}|{{öyrB':­£‹#þþÿÿøñ”y{zzywwöuqI(!G¬¤‹#ÿëþã…vwwvustsqnL(F«¤‹#ÿëû·ustsrrpponkK("G«¤‹#ÿöýÁyqqpponllöj`<)(H«¥‹#ÿõýÇ}nomllkjhhö]D*)&Lª¥‹#ÿèüÇ€mnmjihgfc\O:+)(Iª¥‹#ÿçüÃ}klkifed_TE90+))(Hª¦#ÿæû¼vjkjhd]TH=4/..*))(Hª¦Œ#äÿüÀsghd\SF=6320//-+)((Hª¦‹#äû¼kUUOG@<75432//.-*)(&M8ª¦‰#ä³ZCFFB?<955431//.+))(%KU©¦‡#íUBEFDA=:754320//-+))ùI¾©¦„#äCFGEC?<9654310//-*)((G¿©§#DæCA?<;755320//.,*)(%3Àª§v#ãSRQOJ9445431//.-*))' H¥Á©¦t"äåãâΔF/3320//.+))('J¥Âª¦,"ÿùü®­þÿÎ#ÿüý¼nccûbaa`__÷V.­þÿÎ#ÿúýÂra`^^ñ]\\[ZQ7ªþÿÎ#ÿèüÂt__][ZZYXUN@+«þÿÎ#ÿçü¾r]]\YWWTPE6(ªþÿÎ#ÿæû·j[\ZWTMC7+"­þÿÌ#äÿü»hXXSK@3*# £þÿË#äû·_FB<3,&"! ©ªþÿÈ#ð­M221.+($"! øªªþÿÅ#äG021/,)&#!! «ýþÿÁ#ä1321.+($"! §ýþÿº#1æ/.+(&#"! ™ýþÿ¯#ùDCB?;'!! ðªÿýþÿ°"áæàËŒ8 ¬ÿýþÿ¿B"ÿõü¨-õ?ÿÿýþÿÉM"ÿöôtõªÿÿýþÿÅT"ÿúþ©ñ_ªÿÿýþÿÃu"ÿñþ¯ªÿÿúýþÿÇœ"ÿýû’÷?ªþþúýþÿÉ£"ÿùØTñb­ûúüþýþÿÈ›<!þøöÆgðªüûüýÿýþÿȨ…!†÷…ƒm<ï ?ªüüýüþýþþȸª!þüîf‘ûúúûüÿýþþȹ›!þúb™þþõýþÿýþÿȵžB ýþüf¥þþøýþþ½–“^ @ý5 <úߦ^!9øÿþï¾l!7ÿû÷¹^6ÿüð”25ÿûûÊ] 3ÿüàw2 ÿüìŠ1 ÿüõŒ0 ÿüú‰/ ÿüò| . ÿüá^-ÿýË<-ÿüý› ,ÿüñh+ÿüþÆ&+ÿüü}*ÿýÈ)*ÿüøo)ÿý·)ÿýæH)ÿüúƒ(ÿý¹(ÿýá1(ÿýóU(ÿýù(ÿýý¡(ÿüþ» 'ÿýÈ'ÿýÑ 'ÿýÖ%'ÿýÖ&'ÿýÒ!'ÿýÊ'ÿý½ 'ÿüý¥'ÿýú…(ÿýõ\(ÿýå6(ÿýÀ(ÿüüŒ(ÿýêQ)ÿýÁ)ÿüú|)ÿýÔ2*ÿý*ÿüþÒ0+ÿüõv+ÿüý±,ÿýÙM- ÿüíp- ÿüù. ÿüû/ ÿüûž#0 ÿüù#1á&@J)+)+,f¸½½¾ÁÆÉÍÑÔ×ÚÝßâäæçèééøèçæäâàÝÔ3FEE*+*+-c¿»¼¾ÀÄÇËÎÑÔ×ÙÛÝßàáâãääããâáßÝÛÙ×ß  )+)++j»½½¾ÁÅÈËÍÐÒÔרÙÚÛÜÝÝ÷ÜÛÚØ×ÕÓÑç(+(+j¢¼½½¿ÁÅÇÊÌÎÐÒÓÔÕÖÖ÷ÕÔÓÒÐÎÌÊ*ß+**+f»»½½¿ÀÃÅÇÉÊÌÍÎÎÏÏÎÎÍÌËÉÈÅÃß')')dªÀ¼¼½¾¾ÀÂÄÅÆÇÇÈÈÇÇÆÅÅÃÁ¿¾ î$))$)UiÿÁ»¼¼½½¾¾¿ÀÀù¿¾¾½½»#ñ&ffÿ»»½¼¾¼½½õ¾½½¾¾½¾¼´&è]hijj¢¼·ºÀ¹·°kjgj1ý\cggüdfb…ñCntHLHLMf'())ú*+-..//01210/ñXxvwKLKLNc%))ú*+-..//ð, MLMLLj&))û*+--.. /.-ó?HM?HMj''())*ø+--..//..÷/..--++*óHLLHLLf!&(())*þ+,,û+*+*))òIJIJd%$()())*)þ( óHLLHLUi&&'(()(ý'(#ñDIDff$'(''(()(ü$%'è?:?]hijj!")&kjgj1ý\cggüdfb…ñe¤¢U©ªU©ª«fþ®¯ªªªª«cí(B1,'ÿ¦ªÿ¦ªªjþþ󯩫¯©«jªõ©ªª©fªò©ªª©dþ òª¨©ª¨Uiü"ðUœªUœff ü&矜Ÿ]hijj kjgj1ý\cggüdfb…ü|áÿÿ û ^Ìýÿÿ!ú<›ñþÿÿ#û hÆüÿÿ$ú&}Èøÿÿ&ø)o·æúþÿÿþü'õHƒ¹áóùýþÿÿùýúôåÀŒ*ë1U¡»ÈÑÖÖÒʽ¥…[60ö  %%! ÄâÛØÕÑÎÊÆÂ¿¾½½f"afmry~€~nT;!äÕÒÎËÈÄÀ¾¾¼¿bQSTUTTSSRPmYSC#äÎËÈÅ¿½¼¼¿f05:?>>=:<<>FHLA#õÈÅ¿¾½½ºi?ø #÷Á¿½¾¼¿¿b6ø½¼½·¿j?7ú¹´¿f_9ügb?<ù/..-,*))ì( fD­°´¶º½¾¾½Í´¦w!ú.-,**))í(&b$£¥¨©©¨§§¦¤³©¦†#ü,**))(ì'f`lx}}zwwz~‰‘™„#þ*))ú('i?÷#2B-#)(û'%b6(ú'#j?7ú% f_9ügb?<úf™þþýùüýÿ¶)4!þ÷ b‘ùüÿÿûýþÿÍ#éfª•¥µº·³±°³»ÂÏÞëÊ#úi?÷(8MfI#úbª5øj?7úf_9ügb?<ÿüì2ÿûýÙp3ÿúþõ±M4ÿüÒu6ÿúúÔ07úêÁ|29üQ|€€€€,(–K %XP Icon (smoke)ÿ     >N¤XPNÈˆšˆ¦ˆ²ˆ¾XPO$lV€»€Ë€Û€ë€û +;…*ˆ:ˆJˆZˆjˆzˆŠ1õfU\jb[b\UU,ñ"dhhijkkjkiihýdf$ç''_fijkjjpv{~‚€}xrlkjj"(ä(_fikks€“¦¸ÃÍÓØÙÖÐȽ®œ‡wnæ& )+)+bijkp‚¹ÍÙÞááúàÛÓêþ88î67)+)+Hijjr°ÌÜßß àßê:Kjd(*(*,jkjnŒ³ÕÝÝÞÞ ßÞí!;Q|$++$++Ujjk‚¨ÏÚÜÜÝÞÝê($0@'+'+,Uikq“ÁÖÙÚÛÛÜÝ÷ÜÚÚÜÜÚÚÜÝÝÜè:KG@',',.jjkx¦ÍרØÙÙÚÛÛÜóÚØÞêïïéÜØÛÜÜÛÛç3LXK*+4*+4jik¯ÓÕÖ×רØÙÙÚÚúÛÚ×âõÿÿûþñÞØÛÛÚæ2M*+*+#ä‹•™˜—•“‘Ї„}zvsolkƒYR:#üŽ’‘鑎Œ‰†ƒ€|xtqmkg*Q…ZR;"㎎Œ‚„‹Š‡„~zwsplkb)Q‡ZSC"íìç߸ˆˆˆ…‚|xuqnlj?TQˆZSG"ÿèýÈ~†ƒ€}zvsolkf(TQ‰ZSF"ÿé÷©xƒ{xurnlj_TQ‰ZSE-"ÿéþÇt|yvroljj*TTQ‰ZSG="ÿéþÉr}}ywspmki?XWPˆZSH@"ÿèü¸q{zwtqmkjb$glbRˆ[TH=!ÿèäqzxurolji*^d\ZP‡[THB2!þæùÙ›mtxuromkk?``[_Q†[TMJ@!â´³²°¡nrwurolkjfbhff_Q…[TQN<!áxvtsrruwuromkkb"VUVVWUQ„[TIG= á‚€~|{ywtrolkjf&jda`^_`^…dSC;8 €ýib<ûkiidù$Fm…Ž*êwlkjdGh~Š„wlho|†ŽŒm)êÕ¾{lji[z€…†…„„……’’„R)äÞÝÚÅŸwkjkEŽŒŒ”—˜”‰wz…‰’#ÜõÛ×»‘pkhU”••–—û–Ÿ™…#ÛÚéÙͨ~kka?·¶µ´²¯¬ª¨¥©·™|#ñÛÚÚÙÙØ×Ô¸‰mic?¬¬­ù®¯µÃ {#ðÚÙØØ××ÖÕÕÁ“mif?¦¦§û­·˜{#ïÙØØ×ÖÖÕÔÓÒÆ•mjc§§û­·™{#îØ××ÖÖÕÔÓÓÒÑÅ’ljb§§û¬·š|#í×ÖÕÕÔÓÒÑÑÐÏÍÀŒli§§û¬·š~#íÖÕÔÔÓÒÑÐÏÎÍÌË´ljG§§û¬·›€#ìÕÔÔÓÓÑÑÏÏÎÍÌÊɧtj\?§§û¬·œ€#ëÔÓÓÒÑÐÏÎÎÍËÊÉÈ“li¦§§û¬¶œ‚#ëÓÒÑÑÐÏÎÍÌËÊÈÇÆÅ³jdH§§û¬µž…#ÑæÐÏÏÎÍÌËÊÈÇÅÄÃÀ›mjU§§¬´ž†#þÐÏÏèÎÍÌËÊÉÇÆÄÃÂÀ¶kiI©§¬³ž‡#þÏÎÎèÍÌËÊÉÇÆÅÃÂÀ¿¼™ni¨§­²Ÿ‰#ÍÌèËÊÉÈÈÆÅÃÂÀ¾½»°|kfH§®± ‰#äÌËËÊÊÉÈÇÆÅÃÁÀ¿¼»¹·ljL§¯± ‰#ÊÉèÈÇÆÅÄÃÁÀ¾½º¸·µ¡sk¯±¡‰#úÉÈÇÅÄÃÃíÂÀ¾½»¹·µ³«~jkD°°¢‹#äǽ»¿½¹»¾À¿½»º¸¶³²¯‹khI±°¢‹#äÀºÉÜèæ×À¶»½¼º¹¶´²°­•olK¯£‹#ä·Íïþÿÿýå¼´ºº¸¶´²°®«žsjL?®£‹#ýÎñÿÿëþܱµ¸¶´²°­¬©¡wjL:­£‹#ýóþÿÿëþñ·²¶´²°®«ª§¡~j\G¬¤‹#þþÿÿìö»¯´²±®¬©¨¥ ƒkcF«¤‹#ÿëþì°®³°¯­ª§¥¢ž…kgG«¤‹#ÿëüШ®°®¬ª§¥£ œ„kgH«¥‹#ÿêþÕ§©¯¯­ª¨¦£ ž•zkdLª¥‹#ÿéýÚ«¦­®­ª¨¦£ ž•‚njdIª¥‹#ÿèýÙ¬¥¬®¬ª¨¦£Ÿ™Ž~rmkfHª¦#ÿçýÖ«¤ª­¬ª¨¥ ˜‚ztpmkbHª¦Œ#ÿæüÑ¥£ª¬«©¤ž•Œ…{xspljHª¦‹#äÿýÔ¢¡¨©¥Ÿ˜’Œˆ…‚zxsolkM8ª¦‰#äüÓŸ—™•“Ї…}zwrnkiKU©¦‡#äÌ“‹”˜–•“‘Œ‰†„€|yuqmjgI¾©¦„#䊔˜—–”’Ž‹ˆ…‚~{wtplkjG¿©§#ä‹•™˜—•“‘Ї„}zvsolk3Àª§v#üŽ’‘鑎Œ‰†ƒ€|xtqmkgH¥Á©¦t"㎎Œ‚„‹Š‡„~zwsplkbJ¥Âª¦,"íìç߸ˆˆˆ…‚|xuqnlj?§¥Âª¦†3"ÿèýÈ~†ƒ€}zvsolkfL§¥Â©¦ƒ7"ÿé÷©xƒ{xurnlj_*§¥Ã©¦‚O"ÿéþÇt|yvroljjK§§¥Ã©¦„i"ÿéþÉr}}ywspmki?U¨¨¥Âª§†m"ÿèü¸q{zwtqmkjbH±´¯¦Âª§…i%!ÿèäqzxuroljiH¬°«ª¥Âª§…rX!þæùÙ›mtxuromkk?®­«­¥Áª§ˆ}s!â´³²°¡nrwurolkjf$¯²±±­¥Á«§‹€i!ïxvtsrruwuromkkbD¨¨ö§¥À«§…zj, í‚€~|{ywtrolkjfL²¯­¬¬ö­¬À¯¦}ea8 €ýib<ûkiidø6cÇÖÄ*êwlkjdhšºÎDz œ§·ÉÔÒ¢)ñÕ¾{lji[¸ÁÈÉÈÆÄÄûÆÅÅ{)äÞÝÚÅŸwkjk¢îëèæåäãâÞÙÄÉÑÕÜèÁ#ÜöÛ×»‘pkhUÿ ÿüþÿÒ#ÛÚ÷Ùͨ~kkaýýþýýþÈ#ñÛÚÚÙÙØ×Ô¸‰mic¿þþûýüþÃ#ðÚÙØØ××ÖÕÕÁ“mif¿ÿÿþüýþÃ#ïÙØØ×ÖÖÕÔÓÒÆ•mjcUÿÿûþýÿÃ#îØ××ÖÖÕÔÓÓÒÑÅ’ljbÿÿûþýÿÃ#î×ÖÕÕÔÓÒÑÑÐÏÍÀŒliÿÿûþýÿÅ#íÖÕÔÔÓÒÑÐÏÎÍÌË´lj¦ÿÿûþýÿÅ#ìÕÔÔÓÓÑÑÏÏÎÍÌÊɧtj\¯ÿÿûþýÿÅ#ìÔÓÓÒÑÐÏÎÎÍËÊÉÈ“liÿÿûþýÿÈ#ëÓÒÑÑÐÏÎÍÌËÊÈÇÆÅ³jdªÿÿûþýÿË#ÑæÐÏÏÎÍÌËÊÈÇÅÄÃÀ›mjUUþÿþýÿÌ#þÐÏÏèÎÍÌËÊÉÇÆÄÃÂÀ¶kiªýÿþýÿÎ#þÏÎÎèÍÌËÊÉÇÆÅÃÂÀ¿¼™niýÿþýÿÎ#ÍÌèËÊÉÈÈÆÅÃÂÀ¾½»°|kfªþþýÿÎ#äÌËËÊÊÉÈÇÆÅÃÁÀ¿¼»¹·lj¨ÿþýÿÎ#ÊÉèÈÇÆÅÄÃÁÀ¾½º¸·µ¡skªþýÿÎ#úÉÈÇÅÄÃÃíÂÀ¾½»¹·µ³«~jk¦þýÿÎ#äǽ»¿½¹»¾À¿½»º¸¶³²¯‹kh¦þþÿÎ#äÀºÉÜèæ×À¶»½¼º¹¶´²°­•olªªþÿÎ#ä·Íïþÿÿýå¼´ºº¸¶´²°®«žsjªŸþÿÎ#ýÎñÿÿëþܱµ¸¶´²°­¬©¡wjªœþÿÎ#ýóþÿÿëþñ·²¶´²°®«ª§¡~j\­þÿÎ#þþÿÿìö»¯´²±®¬©¨¥ ƒkc¥þÿÎ#ÿëþì°®³°¯­ª§¥¢ž…kg­þÿÎ#ÿëüШ®°®¬ª§¥£ œ„kg­þÿÎ#ÿêþÕ§©¯¯­ª¨¦£ ž•zkdªþÿÎ#ÿéýÚ«¦­®­ª¨¦£ ž•‚njd«þÿÎ#ÿèýÙ¬¥¬®¬ª¨¦£Ÿ™Ž~rmkfªþÿÎ#ÿçýÖ«¤ª­¬ª¨¥ ˜‚ztpmkb­þÿÌ#ÿæüÑ¥£ª¬«©¤ž•Œ…{xsplj£þÿË#äÿýÔ¢¡¨©¥Ÿ˜’Œˆ…‚zxsolk©ªþÿÈ#äüÓŸ—™•“Ї…}zwrnkiªªþÿÅ#äÌ“‹”˜–•“‘Œ‰†„€|yuqmjg«ýþÿÁ#䊔˜—–”’Ž‹ˆ…‚~{wtplkj§ýþÿº#ä‹•™˜—•“‘Ї„}zvsolk™ýþÿ¯#üŽ’‘鑎Œ‰†ƒ€|xtqmkgªÿýþÿ°"㎎Œ‚„‹Š‡„~zwsplkb¬ÿýþÿ¿B"íìç߸ˆˆˆ…‚|xuqnlj?ÿÿýþÿÉM"ÿèýÈ~†ƒ€}zvsolkfªÿÿýþÿÅT"ÿé÷©xƒ{xurnlj_ªÿÿýþÿÃu"ÿñþÇt|yvroljjªÿÿúýþÿÇœ"ÿñþÉr}}ywspmki?ªþþúýþÿÉ£"ÿèü¸q{zwtqmkjb­ûúüþýþÿÈ›<!ÿèäqzxuroljiªüûüýÿýþÿȨ…!þæùÙ›mtxuromkk?ªüüýüþýþþȸª!â´³²°¡nrwurolkjf‘ûúúûüÿýþþȹ›!ïxvtsrruwuromkkb™þþõýþÿýþÿȵžB ð‚€~|{ywtrolkjf¥þþøýþþ½–“^ €ý5 <úߦ^!9øÿþï¾l!7ÿû÷¹^6ÿüð”25ÿûûÊ] 3ÿüàw2 ÿüìŠ1 ÿüõŒ0 ÿüú‰/ ÿüò| . ÿüá^-ÿýË<-ÿüý› ,ÿüñh+ÿüþÆ&+ÿüü}*ÿýÈ)*ÿüøo)ÿý·)ÿýæH)ÿüúƒ(ÿý¹(ÿýá1(ÿýóU(ÿýù(ÿýý¡(ÿüþ» 'ÿýÈ'ÿýÑ 'ÿýÖ%'ÿýÖ&'ÿýÒ!'ÿýÊ'ÿý½ 'ÿüý¥'ÿýú…(ÿýõ\(ÿýå6(ÿýÀ(ÿüüŒ(ÿýêQ)ÿýÁ)ÿüú|)ÿýÔ2*ÿý*ÿüþÒ0+ÿüõv+ÿüý±,ÿýÙM- ÿüíp- ÿüù. ÿüû/ ÿüûž#0á&@J)+)+,fjklnpsuxz{}‚ƒ„…††‡‡†…ü„‚á3FEE*+*+-cjklmprtvxy|}~‚ƒƒ„„ƒú‚€~}â  )+)++jikkmoqstvxzz|}~€€€û}|{zç(+(+jijlmoqstvwxyz{{|}}|ù{zzywv*ì+**+fijklmoqrsuvwxxyyxûwutsì')')djkjlmooqrsttuuõvuutssrqpo ù$))$)Uii÷kllmmoppqqpúonmll#ñ&ffijjllklmmùklkjkk&÷]hijjk÷jkjjkjgj1ý\cggüdfb…áCntHLHLMfjklnpsuxz{}‚ƒ„…††‡‡†…ü„‚áXxvwKLKLNcjklmprtvxy|}~‚ƒƒ„„ƒú‚€~}â, MLMLLjikkmoqstvxzz|}~€€€û}|{zç?HM?HMjijlmoqstvwxyz{{|}}|ù{zzywvêHLLHLLfijklmoqrsuvwxxyyxûwutsìIJIJdjkjlmooqrsttuuõvuutssrqpo ùHLLHLUii÷kllmmoppqqpúonmll#ñDIDffijjllklmmùklkjkk&÷?:?]hijjk÷jkjjkjgj1ý\cggüdfb…áe¤¢U©ªU©ª«fjklnpsuxz{}‚ƒ„…††‡‡†…ü„‚ᄳ®¯ªªªª«cjklmprtvxy|}~‚ƒƒ„„ƒú‚€~}â(B1,'ÿ¦ªÿ¦ªªjikkmoqstvxzz|}~€€€û}|{z篩«¯©«jijlmoqstvwxyz{{|}}|ù{zzywvªì©ªª©fijklmoqrsuvwxxyyxûwutsªí©ªª©djkjlmooqrsttuuõvuutssrqpo ùª¨©ª¨Uii÷kllmmoppqqpúonmll"ðUœªUœffijjllklmmùklkjkk%öŸœŸ]hijjk÷jkjjkjgj1ý\cggüdfb…ü‰òÿÿü|áÿÿ û ^Ìýÿÿ!ú<›ñþÿÿ#û hÆüÿÿ$ú&}Èøÿÿ&ø)o·æúþÿÿþü'õHƒ¹áóùýþÿÿùýúôåÀŒ*ë1U¡»ÈÑÖÖÒʽ¥…[60ö  %%! „â€~|zxvsqomkkf"afmry~€~nT;!ä|zxvurpmlljbQSTUTTSSRPmYSC#äxwusromkjhf05:?>>=:<<>FHLA#õtsqonlkji?ø #÷qpnlljjb6ømllkjj?7küjf_9ügb?<â€~|zxvsqomkkfD­°´¶º½¾¾½Í´¦w!ä|zxvurpmlljb$£¥¨©©¨§§¦¤³©¦†#äxwusromkjhf`lx}}zwwz~‰‘™„#õtsqonlkji?÷#2B-#÷qpnlljjb6ømllkjj?7küjf_9ügb?<ñ€~|zxvsqomkkf™þþýùüýÿ¶)4!ð|zxvurpmlljb‘ùüÿÿûýþÿÍ#äxwusromkjhfª•¥µº·³±°³»ÂÏÞëÊ#õtsqonlkji?÷(8MfI#öqpnlljjbª5ømllkjj?7küjf_9ügb?< ÿüù#1ÿüì2ÿûýÙp3ÿúþõ±M4ÿüÒu6ÿúúÔ07úêÁ|29üQ<€€€€,(–K %XP Backgroundÿ     ‰qXP‰•H8HDHPH\XP‰ñ¡Hµ_ÉUÝEñËùa-ã-ó.1ô58!;H>?AdD¢HH(þÇÍ5ÍúÕÎÍçæççþæç çþæççþæççüÕÍÜç6çýÎÜççþæççýÇÍççþæççþæççþÍç9çýÍæç8çþÍç9çþÍææþçææþçææþçææñçæççæçæçææçææçææþçææþçææüçæçææþÍååæåèæååææåæåææååæåææåææååææååüæåæååüæååææåýÍäååûäååäååùäåäååäååäåøäåääåääååõäååääååäååþÍääþãääþãääùãääãäãääþãääãäþãääþãääþÍã9ãþÍã9ãþÍââûãââãââúãâãâãââùãâãâãâããâãâüãâãââãâþÍââáâáýâáââþáââþáââáâùáâáââáââáûâáââááþâááâþÍááþàááàýáàááüàáàááûàááàááüàáàááþàááþÍà9àþÍà9àüÍààßßàßüàßàßßàßûàßààßßàúßààßàßßàößààßßàßààùÍÞßßÞÞßßüÞßßÞÞßÞßõÞßßÞßßÞßÞßÞÞßþÞßßýÞßÞÞüßÞÞûÍÞÞÝÞÞÝÞþÝÞ ÞþÝÞÞûÝÞÞÝÞÞþÝÞÞýÝÞþÍÝ-ÝþÜÝÝþÜÝÝþÍÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜþÝÜÜûÝÜÝÝÜÜþÝÜÜþÝÜÜþÝÜÜþÍÜ9ÜþÍÜÜÛùÜÛÜÜÛÛÜÜÛÜöÛÜÛÜÜÛÛÜÜÛÛÜÛÜýÛÜÛÛÜÛýÜÛþÍÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛûÚÛÚÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛÛþÍÚ(ÚþÙÚÚþÍÙÙûÚÙÙÚÙÙþÚÙÙÚÙþÚÙÙùÚÙÙÚÙÚÙÙþÚÙÙüÍØÙØØÙØÙúØÙÙØÙØØõÙØÙØØÙÙØØÙØØÙØÙøØÙÙØÙÙØÙÙûØÙÙØþÍØ9ØþÍØØùרר×רØúרØ×רØø×Ø×Ø×Ø×ØØþרØûר×רØþרØþÍ×9×þÍÖÖþ×ÖÖþ×Ö Öþ×ÖÖþ×Ö Ö×Öú×Ö×Ö×ÖÖþÍÕÕþÖÕÕøÖÕÖÖÕÕÖÕÕÖÕþÖÕÕÖÕôÖÕÖÖÕÖÖÕÖÖÕÖÖÕøÍÔÕÔÕÕÔÕÕÔÕþÔÕÕÔÕÔýÕÔÕÕøÔÕÕÔÔÕÔÕÕþÔÕÕÔÕüÔÕÔþÍÔ9ÔþÍÔ9ÔþÍÓ ÓþÔÓÓþÔÓÓûÔÓÓÔÓÓþÔÓÓþÔÓÓüÍÒÓÒÒÓýÒÓÒÒþÓÒÒøÓÒÒÓÒÓÒÓÓÒûÓÒÓÒÓÓÒûÓÒÒÓÒÒýÍÑÒÒþÑÒÒÑøÒÑÒÑÒÑÒÑÑÒüÑÒÒÑÑÒÑûÒÑÒÒÑÑöÒÑÒÒÑÒÒÑÑÒÒýÑÒþÍÑ9ÑþÍÑ9ÑþÍÐÐÑýÐÑÐÐþÑÐ ÐÑýÐÑÐÐûÑÐÐÑÐÐúÑÐÐÑÑÐÐþÑÐÐûÍÐÏÏÐÐõÏÐÏÐÏÐÐÏÏÐÏÏôÐÏÏÐÏÐÏÐÐÏÐÏÏ÷ÐÏÏÐÏÐÏÐÏ ÏÐþÍÎÎÏþÎÏÏúÎÏÎÏÏÎÎüÏÎÎÏÏøÎÏÏÎÏÎÏÎÎÏþÎÏÏÎÏýÎÏÍÎþÍÎÎþÍÎÎþÍÎÎûÍÎÎÍÎ ÎüÍÎÍÎÎ;Í;ÍÍÌüÍÌÍÌÌÍÌæÍÌÌÍÌÍÍÌÍÍÌÍÌÍÍÌÍÌÌÍÌÌÍÌÌÍÍÌùÍÌÍÍÌÌýÍÌËËýÌËÌÌöËÌÌËÌËÌÌËÌÌËÌËøÌËÌËÌËËÌÌþËÌÌýËÌËËÌËþÍËËþÊËËþÊËËþÊËËþÊËËûÊËËÊËËþÊËËþÍÊ9ÊüÍÉÊÉÉöÊÉÉÊÉÊÉÉÊÉÉþÊÉÉþÊÉÉþÊÉÉÊÉüÊÉÉþÍÉ9ÉþÍÈÈýÉÈÉÉÈýÉÈÉÉþÈÉÉüÈÉÈÉÉýÈÉÈÈùÉÈÈÉÉÈÉÉÈüÉÈÈÉÉüÈÉÉþÍÈ ÈþÇÈÈþÇÈÈûÇÈÇÇÈÈÇÈþÇÈÈþÇÈÈþÇÈÈþÍÇ9ÇþÍÆÆûÇÆÆÇÆÆþÇÆÆþÇÆÆþÇÆÆùÇÆÇÆÇÇÆÆþÇÆÆþÍÆ9ÆþÇÍ5ÍúÕÎÍçæç3çüÕÍÜç6çýÎÜç7çýÇÍç8çþÍç9çýÍæç8çþÍç9çýÍçææûçææçææþçææþçææøçæççææçææçþæçç æüÍåæååæüåææååþæååþæååæåæåæåûæååæååûæåæåþÍååäûåäåäååäåüäåäååþäååþäååäåïäåääååääåäååäååäþÍääþãääþãääã äãäøãäããääãääþãääþãääþÍã9ãþÍã9ãüÍâãââãþâããâãâãâãâãñâãââãâãââããâããââãâùãââãââûÍáâáââáâöáâáâáâááâááâúáâáâáââáâûáâáâááâáþâááþÍá áþàááàáþàááúàáàáàááúàáààáþÍà9àþÍà9àýÍàßßöàßààßààßàßßþàßßþàßßüàßßààßüàßàßßàßàß÷àßßàßàßàûÍßßÞßßÞßüÞßÞßßýÞßÞÞìßÞßßÞßÞßßÞÞßßÞßßÞßßÞÞßÞßûÞßßÞþÍÞÞþÝÞÞûÝÞÞÝÞÞÝÞúÝÞÞÝÝÞÞÝÞþÝÞÞþÍÝ9ÝþÍÝÝÜþÝÜÜüÝÜÝÜÜþÝÜÜûÝÜÝÜÝÝýÜÝÜÜþÝÜÜþÝÜÜþÍÜ9ÜþÍÛÛÜÛÜÛüÜÛÛÜÜÛÜüÛÜÛÜÜþÛÜÜþÛÜÜÛÜþÛÜÜÛþÍÛÛþÚÛÛüÚÛÚÛÛþÚÛÛûÚÛÛÚÛÛüÚÛÚÛÛþÚÛÛõÚÛÛÚÛÛÚÛÚÚþÍÚ9ÚþÍÙ ÙûÚÙÙÚÙÙÚÙúÚÙÚÙÚÙÙþÚÙÙþÚÙ ÙöÍØÙÙØÙÙØÙØØýÙØÙÙØûÙØØÙØØÙýØÙØØðÙØÙÙØÙÙØØÙÙØØÙÙØØþÍØ9ØûÍØØ×ØØ×Ø×ýØ×Ø Ø×Øø×ØØ×ØØ×ØØþר Øþ×þÍ×9×þÍÖÖ×Öö×ÖÖ×Ö××ÖÖ××úÖ×ÖÖ×ÖÖþ×ÖÖþ×ÖÖ÷ÍÕÖÕÕÖÕÕÖÖÕÖÕÖÕÖÕþÖÕÕþÖÕÕñÖÕÕÖÕÕÖÕÕÖÖÕÖÖùÍÕÕÔÕÔÕÕüÔÕÔÕÕüÔÕÔÕÕûÔÕÕÔÕÕÔÕÔÕúÔÕÕÔÕþÍÔ9ÔþÍÔ+ÔþÓÔ ÔüÍÔÔÓÓüÔÓÔÓÓÔÓþÔÓÓþÔÓÓþÔÓÓüÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓüÍÒÒÓÓÒýÓÒÓÓÒÓÒÓÒÓÒúÓÒÒÓÓÒÒÓÒüÓÒÒÓÓÒüÓÒÓþÍÒÒÑøÒÑÑÒÑÒÑÒÒÑÒÑÒüÑÒÑÒÒÑÒÑÒÑÒûÑÒÑÑÒÒþÍÑ9ÑþÍÑ9ÑþÍÐÐþÑÐÐþÑÐÐÑÐÑÐõÑÐÐÑÐÐÑÑÐÑÐÐÑ÷ÍÏÏÐÐÏÐÏÐÐûÏÐÏÐÏÏñÐÏÐÐÏÐÏÏÐÐÏÐÏÐÏÏÐÏüÐÏÏÐÐþÏÐÐÏþÐùÍÎÎÏÎÏÎÎøÏÎÏÎÏÎÎÏÏÎõÏÎÏÎÏÏÎÏÎÎÏÏùÎÏÏÎÏÏÎÎþÏÎÎùÏÎÎÏÎÏûÍÎÍÍÎÎþÍÎÎÍÎþÍÎÎüÍÎÍÎÎûÍÎÎÍÎÎþÍÎÎ;Í;ÍÍÌÍÌüÍÌÍÌÌúÍÌÍÌÌÍÍÌüÍÌÌÍÍúÌÍÌÍÍÌÌýÍÌÍÍÌÍûÌÍÌÍùÍËËÌËËÌÌúËÌÌËËÌÌËÌþËÌÌþËÌÌËüÌËËÌÌËÌþËÌÌËûÍÊËÊËËûÊËËÊËËþÊËËþÊËËþÊËËüÊËËÊÊËÊËþÊþÍÊ9ÊþÍÉÉÊÉþÊÉÉþÊÉÉ÷ÊÉÊÉÉÊÉÊÉÉùÊÉÊÉÉÊÉÉÊ ÉþÊÉÉþÍÉ9ÉóÍÉÈÉÈÉÉÈÉÉÈÈÉÉÈÉøÈÉÉÈÉÉÈÉÉÈÉÈÉÈÉÈþÉÈÈÉþÍÈÈûÇÈÈÇÈÈþÇÈÈûÇÈÇÇÈÈþÇÈÈüÇÈÇÈÈþÇÈ ÈþÇÈÈþÍÇ ÇþÆÇÇûÍÆÇÇÆÆþÇÆÆÇÆþÇÆÆþÇÆÆüÇÆÇÆÆÇùÆÇÆÆÇÆþÍÆ9ÆþÇÍ5ÍúÕÎÍçæç3çüÕÍÜç6çýÎÜç%çþæççýÇÍç8çþÍç9çýÍæç8çþÍç9çþÍææüçæçææüçæçææûçææçææçæøçæçææççææþçææþçúÍåæåæååæåõæåææåæååæåææåûæååæååæåüæååææåûæåæåüÍääååøäåäåääåääåûäååäååþäååäåøäååäåäåääåþäååþÍä äþãä äþãääþãääþãä äãäýãäþÍã9ãþÍã9ãýÍãââùãââãâãââãâãøâããâãâãââþãââãâãâþãûÍáââááøâáâááâáââþáââáüâáâááâúáâááâááâ÷áââááâáâþÍááþàááþàááþàá áàüáààááþàþÍà9àþÍà9àòÍßààßßàßßàßßàßßþàßßýàßààûßàßàßßþàßßàßàþßààßýÍÞßßôÞßÞßÞßÞßÞßÞßßÞßýÞßÞÞóßÞÞßÞßÞÞßßÞÞßßúÞßÞßÞßßþÍÞÞÝÞþÝÞÞþÝÞ ÞÝÞþÝÞÞûÝÞÞÝÞÞüÝÞÞÝÝÞþÍÝ9ÝûÍÜÜÝÜÜþÝÜÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜüÝÜÝþÍÜ9ÜþÍÜÜÛÜþÛÜÜîÛÜÜÛÜÜÛÜÛÜÛÛÜÛÜÛÛÜÜÛÜûÛÜÛÛÜÜþÛÜÜÛþÜüÍÛÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛþÚÛÛÚýÛÚÛÛþÍÚ*ÚþÙÚ ÚûÍÚÙÚÙÙþÚÙÙþÚÙÙþÚÙ ÙþÚÙÙþÚÙÙýÍØÙÙüØÙÙØØÙøØÙØÙÙØÙØØÙûØÙØÙØØÙúØÙØØÙØØþÙØØýÙØþÍØ9ØùÍרØ×רØ×ýØ×ØØø×Ø×ØØ×רØ×üØ×רØþÍ×9×þÍÖÖþ×ÖÖþ×ÖÖ×Öþ×ÖÖþ×ÖÖþ×ÖÖú×ÖÖ×Ö×× Öü×Ö×ûÍÕÖÕÖÖøÕÖÖÕÖÕÖÕÕþÖÕÕþÖÕÕÖÕþÖÕÕÖÕÖÕÖþÕÖÖÕøÍÕÕÔÕÔÔÕÕüÔÕÔÕÕÔÕþÔÕÕÔþÕÔÔùÕÔÕÔÕÕÔÔÕÔýÕÔþÍÔ9ÔþÍÔ9ÔþÍÓÓþÔÓÓÔýÓÔÓ ÓþÔÓÓÔÓþÔÓÓüÔÓÔÓÓûÍÓÒÒÓÓÒþÓÒÒôÓÒÓÒÓÓÒÒÓÒÓÒÒüÓÒÓÒÒüÓÒÓÒÒöÓÒÒÓÒÒÓÒÒÓÓþÒþÍÒÒþÑÒÒþÑÒÒÑÒÑÒêÑÒÒÑÑÒÒÑÒÒÑÑÒÒÑÒÑÒÑÒÑÒÒúÑÒÑÒÒþÍÑ9ÑþÍÑ9ÑþÍÐ ÐþÑÐÐÑþÐÑÑ ÐþÑÐÐüÑÐÑÐÐúÍÏÏÐÏÐÐÏûÐÏÐÐÏÏúÐÏÏÐÐÏÏùÐÏÐÏÐÐÏÏóÐÏÏÐÏÐÐÏÐÏÏÐÏÏÐþÏüÍÏÏÎÎÏþÎÏÏøÎÏÎÎÏÎÎÏÏþÎÏÏþÎÏÏúÎÏÏÎÏÎÎõÏÎÎÏÎÎÏÎÎÏÎÎûÍÎÎÍÎÎþÍÎÎèÍÎÎÍÍÎÍÎÍÎÎÍÎÎÍÍÎÎÍÎÎÍÍÎÎýÍÎ;Í;ÍþÍÌÌÍÌþÍÌÌþÍÌÌýÍÌÍÍüÌÍÌÍÍÌÍýÌÍÌÌþÍÌÌúÍÌÍÌÌÍÍþÍÌÌüËÌËÌÌþËÌÌËóÌËËÌÌËÌÌËÌËËÌÌûËÌÌËÌÌðËÌÌËÌÌËËÌÌËÌËËÌþÍË ËþÊËËþÊËËþÊË ËþÊËËüÊËËÊÊýËÊþÍÊ9ÊþÍÊÊÉüÊÉÊÉÉÊÉþÊÉÉùÊÉÊÉÊÉÊÊÉþÊÉÉüÊÉÉþÍÉ9ÉþÍÈÈÉÈÉÈÉùÈÉÈÉÈÈÉÉ÷ÈÉÈÉÈÈÉÉÈÈÉÈùÉÈÉÉÈÉÈÈþÉûÍÈÈÇÈÈþÇÈÈþÇÈÈþÇÈÈÇûÈÇÈÇÈÈþÇÈÈþÍÇ9ÇþÍÆÆüÇÆÇÆÆþÇÆÆÇÆþÇÆÆþÇÆÆÇ ÆþÍÆ9ÆýGùÿ4ÿþÿ7ÿþÿ8ÿ:ÿþGÿ9ÿþùÿ9ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ?ͳçþæççþæçïçþæççæþçææþçææ÷çææççæççææþçææþçææüçæçææþçææþçææýåæååûæåææååæøåæåæååæååþæååþæååæøåæåææåæååæúåæåææååüæåæååôäåääååääåäåääåüäååääøåäåääåäååþäååþäååþäååþäååøäåääåäãääþãääþãääãäþãääþãääþãääãä€ãüâããâ âãâóãâããâãââããâãââüãâãââãâãâãâùãâãááâááâþáââýáâááýâáââþáââõáâááâáâááâááâøáâáâáâáââûáàáàááþàááþàááüàáàááþàá áûàááàá áþàááþàáá€àßþàßßàßàßþàßßàßþàßßàüßààßßþàßßàùßàßßààßßþàßßàþÞßßÞßÞûßÞßÞßßÞßþÞßßþÞßßøÞßßÞßÞßÞÞþßÞÞþßÞÞþÝÞÞþÝÞÞþÝÞÞýÝÞÝÝÞ÷ÝÞÞÝÞÝÞÝÞÞþÝÞÞþÝÞÞÝýÞÝÞÞýÝÞÝ7ÝþÜÝÝÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜûÝÜÝÝÜÜûÝÜÝÝÜÜÝÜÝBÜøÛÜÛÛÜÛÜÛÛúÜÛÜÜÛÜÜÛýÜÛÜÜÛÜþÛÜÜöÛÜÜÛÜÜÛÜÛÜÜÛÜýÛÜÛÛüÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛñÚÛÛÚÛÚÛÚÛÚÛÚÛÚÛÛüÚÛÚÛ ÛÚûÛÚÛÛÚ>ÚüÙÚÚÙ ÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÚÙÙîØÙØØÙÙØÙØØÙØØÙØÙÙØØþÙØØñÙØÙØÙØÙØØÙÙØÙÙØØîÙØÙÙØÙØÙØÙÙØØÙØØÙØBØþרØòר×רØ×ØØ×Ø×Ø×רüררØþרØ?×ýÖ×ÖÖü×Ö×ÖÖþ×ÖÖ×ýÖ×ÖÖþ×Ö Ö×Öþ×ÖÖÕþÖÕÕüÖÕÖÕÕþÖÕÕÖöÕÖÕÖÕÕÖÕÖÕÕûÖÕÖÖÕÕìÖÕÖÖÕÖÖÕÖÕÕÖÖÕÖÕÖÕÔÕÕþÔÕÕÔÕþÔÕÕÔÕÔøÕÔÕÕÔÕÔÕÕùÔÕÔÕÕÔÕÕÔÕúÔÕÕÔÔÕÕ€ÔúÓÔÔÓÔÓÓþÔÓÓúÔÓÔÓÔÓÓðÔÓÔÔÓÔÓÓÔÓÓÔÓÓÔÓ ÓÔÓþÔÓÓþÒÓÓñÒÓÒÓÓÒÓÓÒÓÒÒÓÓÒÒÓÒûÓÒÓÓÒÒÓûÒÓÒÓÒÒÓýÒÓÒÒÓúÒÓÑÒÑÒÒþÑÒÒþÑÒÒþÑÒÒþÑÒÒõÑÒÑÒÑÒÒÑÒÑÒÒÑÒûÑÒÑÑÒÒýÑÒÑ~ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐùÑÐÐÑÐÐÑÑÐþÑÐÐøÏÐÐÏÐÏÐÏÏôÐÏÐÏÏÐÏÐÐÏÐÏÏÐÏþÐÏÏüÐÏÐÏÏþÐÏÏþÐÏÏûÐÏÐÐÏÏ÷ÐÏÏÐÎÏÎÏÎÎÏÎÏüÎÏÎÏÏþÎÏÏþÎÏÏÎÏýÎÏÎÎÏÎÏÎÏÎùÏÎÏÎÎÍÎÎþÍÎ ÎþÍÎÎÍÎÍÎþÍÎÎûÍÎÎÍÎÎþÍÎÎýÍÎÍ~ÍÌùÍÌÍÌÌÍÌÌþÍÌÌþÍÌÌÍýÌÍÌÌþÍÌÌÍÌþÍÌÌüËÌÌËËÌþËÌÌËúÌËÌËÌËËýÌËÌÌþËÌÌËÌþËÌÌüËÌËÌÌôËÌÌËÌËËÌÌËËÌÌýËÊËËþÊË ËþÊËËÊüËÊËÊÊËþÊËËÊËüÊËËÊ>ÊÉþÊÉÉÊÉþÊÉÉüÊÉÊÉÉþÊÉÉüÊÉÊÉÉþÊÉEÉÈÉÈÉÈÉþÈÉÉÈÉÈýÉÈÉÉüÈÉÈÉÉøÈÉÉÈÉÈÈÉÉüÈÉÈÉÉýÈÉÈÈþÇÈ ÈþÇÈÈþÇÈÈûÇÈÈÇÈÈüÇÈÇÈ ÈþÇÈÈüÇÈÈÇ ÇþÆÇ1ÇûÆÇÆÇÆÆÇÆûÇÆÆÇÆÆüÇÆÇÆÆÇÆþÇÆÆûÇÆÆÇÆÆþÇÆDÆ?ÍÀçæçæþçææüçæçææçýæçææûçææçææþçææçæþçææüçåæååùæåæåææååüæååææå÷æåæåæååæååþæååþæååþæååþæååüæåæååþäååþäååäåäþåääåûäååäååþäååüäåäååäåòäååäåäååäååäãääþãääãäúãäãäãääþãääøãäãääããää‡ãâøãâãâããâããüâããââóãâãââãâããâãâããâãâãâãâúãââáâáá âáûâáâáââþáââúáâáâáââáúâááâáââáùâááââáââáüàáàááþàááþàááàýáàááàáúàááààááùàáàáààáá‚àßþàßßýàßààßþàßß÷àßßàßßààßßàýßàßßüàßàßßùàßàßàßÞÞûßÞßßÞÞúßÞÞßßÞÞßõÞßßÞßÞßÞßßÞÞßþÞßßÞßüÞßÞßß ÞüÝÞÝÞÞÝüÞÝÝÞÞþÝÞÞúÝÞÞÝÝÞÞüÝÞÝÞÞÝÞþÝÞÞ?ÝÜþÝÜÜÝÜþÝÜÜÝÜûÝÜÜÝÜÜþÝÜÜþÝÜÜúÝÜÜÝÝÜÜûÝÜÜÝÜ@ÜÛÜøÛÜÛÛÜÜÛÜÜÛÜûÛÜÜÛÜÜùÛÜÛÜÛÛÜÜöÛÜÛÜÛÜÛÜÛÜÜÛÚýÛÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛýÚÛÚ>ÚÙÚÙþÚÙÙþÚÙÙþÚÙ ÙþÚÙÙþÚÙÙþÚÙÙØÙØÙØþÙØØÙüØÙØÙÙØîÙØÙØÙØÙØØÙØØÙÙØÙØÙÙØÙNØþרØø×ØØ×Ø×רØþר Øþר Ø?×üÖ×Ö××ýÖ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×ÖÖ××Öú×ÖÖ××ÖÖþ×ÖÖ×ûÖÕÕÖÕÕÖÕÖÕþÖÕÕÖÕÖÕÖÕýÖÕÖÖÕþÖÕÕüÔÕÕÔÔýÕÔÕÕýÔÕÔÔÕþÔÕÕÔÕÔúÕÔÔÕÕÔÔÕþÔÕÕþÔÕÕýÔÕÔ~ÔÓþÔÓÓþÔÓÓüÔÓÔÓ ÓÔÓúÔÓÔÓÔÓÓþÔÓÓóÒÓÓÒÒÓÓÒÒÓÒÓÒÒúÓÒÓÒÒÓÓÒÓÒúÓÒÓÒÓÒÒÓÒôÓÒÓÓÒÒÓÓÑÒÑÒÒÑÒÑÒýÑÒÑÑòÒÑÒÑÑÒÑÑÒÑÒÑÑÒÒÑÒùÑÒÑÒÑÒÑÑþÒÑÑüÒÑÒÑ~ÑýÐÑÐÐÑÐüÑÐÑÐÐþÑÐÐÑÐþÑÐÐÑýÐÏÐÐüÏÐÐÏÏõÐÏÐÏÐÏÏÐÏÐÏÏÐûÏÐÏÏÐÐÏÐÏùÐÏÏÐÏÐÏÏÐÏÐÏûÎÏÏÎÏÏþÎÏÏþÎÏÏÎ÷ÏÎÎÏÏÎÎÏÎÎ ÏÎÏÎÏ ÎÍÎÍÎþÍÎÎþÍÎÎþÍÎ΀ÍÌþÍÌÌþÍÌÌÍÌÍÌÍÌÍùÌÍÍÌÌÍÌÌóÍÌÍÌÌÍÌÍÌÍÌÍÌÌúÍÌÌÍÍÌÌþËÌÌËÌËÌËÌüËÌËÌ ÌËÌËýÌËÌÌýËÌËËÌËÌÊ ËþÊËËÊËüÊËÊËËþÊËËþÊËËÊ Ë?ÊÉþÊÉÉúÊÉÊÉÊÉÉÊÉøÊÉÉÊÉÉÊÉÉþÊÉÉÊÉþÊÉDÉþÈÉÉþÈÉÉþÈÉÉøÈÉÈÈÉÈÉÈÈòÉÈÈÉÈÉÉÈÉÈÈÉÈÉÉÈùÉÈÉÈÈÉÈÈýÉÈÉÉþÈÉÉÈûÇÈÈÇÈ ÈþÇÈÈþÇÈÈþÇÈÈþÇÈÈþÇÈÈùÇÈÈÇÈÈÇAÇÆþÇÆÆþÇÆÆùÇÆÆÇÆÇÆÆþÇÆÆüÇÆÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆ@Æ?ÍçþæççþæçUçþæçCç æûçææçææþçææþçææùçæççæçææüçæçææþçææçæçøæåææåææååüæååææåôæåæååæååæåæååþæå åæåþæååõæåæäååääåäååäûåääåääüåäåääåäåäþåääüåääååùäååääåääãäþãääøãääãääãääûãäããääãäøãäãääããääþãääãâòãâããââããââãâãââãúâããâãââþãââãâþãââãâþãââãâáâüáâáââùáâáââáââáâùáâáââáââáâøáââááâáââöáâáàáàáààááüàáàááþàááàáþàááþàááàáþàááàßàßàßþàßßþàßßðàßßàßßàßßàßßàßàß ßþàßßàßìÞßßÞßßÞßßÞßßÞßßÞßßÞßßüÞßÞßßüÞßÞß ß÷ÞßÞÞßÞßÞßßþÞßßýÞÝÞÞþÝÞÞûÝÞÞÝÞÞÝÞþÝÞÞÝÞþÝÞÞüÝÞÞÝ?Ý ÜûÝÜÜÝÜÜúÝÜÝÜÝÜÜþÝÜÜ÷ÝÜÜÝÜÜÝÝÜÜþÝÜÜþÝÜÜùÝÜÝÝÜÝÜ@ÜÛÜÛÜýÛÜÛÛõÜÛÛÜÜÛÜÛÜÛÜÜúÛÜÛÛÜÛÛÜþÛÜÜþÛÜÜÛÜÛøÚÛÛÚÛÛÚÛÛúÚÛÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛúÚÛÛÚÚÛÛþÚÛÛþÚÛÛ?ÚÙþÚÙÙþÚÙ ÙþÚÙ ÙþÚÙÙÚÙÚÙþÚÙÙØþÙØØþÙØØúÙØØÙÙØØüÙØÙØØÙØþÙØØÙØøÙØØÙÙØÙØØþÙØØÙCØ×úØ×Ø×רØþרØþרØþרØþרØø×ØØ×ØØ×ØØþרØýר×?×Öþ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×Ö×ÖÖø×ÖÖ×ÕÕÖÕÕüÖÕÖÕÕöÖÕÖÕÕÖÕÕÖÕÕÖ ÕÖÕäÖÕÕÖÕÕÖÕÖÕÖÕÕÖÕÖÔÔÕÕÔÕÔÔÕÕÔÕÕÔùÕÔÕÕÔÕÔÔÕ÷ÔÕÕÔÕÕÔÔÕÕüÔÕÔÕÕüÔÕÔÕÕÔÕüÔÕÕÔÔÓûÔÓÓÔÓÓþÔÓÓþÔÓÓúÔÓÔÓÔÓÓûÔÓÓÔÓÓÒÓòÒÓÓÒÒÓÒÒÓÓÒÓÓÒÒûÓÒÓÓÒÒüÓÒÓÒÒÓÒþÓÒÒÓÒÓúÒÓÓÒÑÒÒüÑÒÑÒÒþÑÒÒÑ ÒêÑÒÒÑÑÒÒÑÑÒÑÑÒÑÒÑÑÒÑÒÒÑÑþÒÑÑýÒÑÒÒ€ÑÐþÑÐÐþÑÐÐþÑÐÐûÑÐÐÑÐÐüÑÐÑÐÐþÑÐÐþÏÐÐÏÐÏÐûÏÐÏÏÐÐÏÐ ÏÐúÏÐÏÐÐÏÏþÐÏÏýÐÏÐÐöÏÐÏÏÐÎÏÏÎÏÏùÎÏÎÏÎÎÏÏýÎÏÎÎúÏÎÎÏÏÎÎþÏÎÎûÏÎÎÏÎÎøÏÎÏÎÏÎÏÎÎÏÎûÏÍÎÍÎÎÍ ÎüÍÎÍÎÎüÍÎÍÎÎþÍÎÎÍÎþÍÎÎþÍÎÎüÍÎÎÍ‚ÍûÌÍÍÌÍÍÌùÍÌÍÌÌÍÌÌþÍÌÌþÍÌÌÍþÌÍÍÌÍÌþÍÌÌÍáÌÍËÌËËÌËÌËÌËÌËÌÌËËÌËËÌÌËËÌËÌËËÌÌúËÌËÌËÌÌËòÌËËÌËÌËËÌÌËËÌËËÌýËÌËËþÊËËüÊËÊËËÊËþÊËËÊËýÊËÊÊùËÊÊËËÊËË?ÊýÉÊÉÉÊ ÉÊÉþÊÉÉþÊÉÉþÊÉBÉþÈÉÉÈùÉÈÈÉÉÈÉÉüÈÉÈÉÉ÷ÈÉÉÈÉÉÈÈÉÉøÈÉÉÈÉÈÈÉÉÈÉÈüÉÈÇÈÈþÇÈ ÈüÇÈÇÈÈûÇÈÈÇÈÈûÇÈÈÇÈÈþÇÈ ÈúÇÈÈÇÈÇ?ÇÆþÇÆÆÇÆþÇÆÆþÇÆÆüÇÆÇÆÆÇÆþÇÆÆþÇÆÆþÇÆÆþÇÆ?Æÿ?Í?çþæç}çæçæþçææøçæçæçææççüæççææþçææþçææçûæåææååæåþæååæþåææåæðåæåæååææååæååææååæûåæåæååþæååþäååýäåääåþäåå÷äååääååäååäåäþåääýåäååäþãääûãääãääùãäããäãääüãäãääüãäãääãâõãââãâãâãâãââúãââããââöãâããââãâãââãýâãââøãââãâããââãõâáââáââáâáââáâþáââáþâááâôáââáâáââáâáââáâáâüáâáââáþàááàáþàááüàáàááþàááøàááààáàááþàáá‡àßðàßàßßàßßàßààßßàßßþàßßþàßßöàßßààßßààßßàßòàßàßßàßàÞÞßÞÞßßÞßøÞßÞÞßßÞßßÞßúÞßßÞÞßßôÞßßÞßßÞÞßßÞßßûÞßÞÝÞÞþÝÞÞøÝÞÞÝÞÝÝÞÞûÝÞÞÝÞÞþÝÞÞþÝÞÞþÝÞÞöÝÞÞÝÞÝÝÞÞÝ>ÝÜþÝÜÜÝ ÜþÝÜÜþÝÜÜÝÜÝÜÝDÜúÛÜÜÛÛÜÜûÛÜÜÛÜÜùÛÜÛÛÜÛÜÜþÛÜÜþÛÜÜþÛÜ ÜøÛÜÛÜÛÛÜÛÛþÚÛÛþÚÛÛÚÛþÚÛÛÚÛÚþÙÚÚþÙÚ ÚÙôÚÙÙÚÚÙÚÙÙÚÙÚÚÙùÚÙÙÚÙÚÙÙüÚÙÚÙÙüØÙÙØØÙØýÙØÙÙØþÙØØÙýØÙØØÙØðÙØØÙØÙØÙØÙØÙØÙÙØØüÙØÙØ?Øþר ØþרØüררØþרØþרØôרØ×ØØ×ØØ×רØþרØüרØ×>×Öþ×ÖÖõ×ÖÖ×ÖÖ××Ö×ÖÖ× Ö×Ö× ÖÕûÖÕÕÖÕÕïÖÕÕÖÕÕÖÕÖÕÕÖÕÖÕÖÕÕÖ÷ÕÖÕÖÖÕÕÖÕÕûÖÕÕÖÕÕüÖÕÖÕÕÖÕþÔÕÕÔþÕÔÔþÕÔÔÕýÔÕÔÔÕüÔÕÔÕÕûÔÕÔÔÕÕþÔÕÕýÔÕÔÔþÕÔÔþÕÔ~ÔÓûÔÓÓÔÓÓüÔÓÔÓÓþÔÓÓüÔÓÔÓÓÔÓüÔÓÔÓÓþÔÓÓùÒÓÓÒÒÓÒÒþÓÒÒÓÒ÷ÓÒÒÓÓÒÒÓÒÒ÷ÓÒÓÓÒÓÓÒÓÓýÒÓÒÒþÓÒÒüÑÒÑÒÒÑÒúÑÒÒÑÒÑÑÒþÑÒÒöÑÒÒÑÒÒÑÒÑÒÒÑÒôÑÒÑÑÒÒÑÒÑÒÒÑÑþÒÑÑüÐÑÐÑÑÐÑúÐÑÐÐÑÐÐüÑÐÑÐ ÐüÑÐÑÐÐþÑÐÐþÑÐÐöÏÐÏÐÐÏÐÏÏÐÐýÏÐÏÏÐÏøÐÏÐÏÐÏÏÐÐýÏÐÏÏüÐÏÏÐÐÏÐÏÐ÷ÏÐÏÐÏÏÎÏÎÎÏÎÏ÷ÎÏÎÎÏÎÏÎÏÏþÎÏÏþÎÏÏùÎÏÎÏÎÎÏÏùÎÏÏÎÏÎÏÏÎÏÎüÍÎÍÎÎÍÎúÍÎÎÍÍÎÎöÍÎÍÍÎÍÍÎÍÎÎûÍÎÎÍÎ ÎÍ΀ÍÌþÍÌ ÌôÍÌÍÍÌÍÌÌÍÌÍÌÌþÍÌÌÍÌÍÌÍÌõÍÌÍÌÍÍÌÌËËÌÌýËÌËËÌËÌËýÌËÌÌËöÌËËÌÌËËÌËÌÌËýÌËÌÌËÌþËÌÌËÊËÊËþÊËËúÊËËÊÊËËøÊËËÊËËÊËËþÊËËþÊËËÊËAÊýÉÊÉÉþÊÉÉùÊÉÊÉÉÊÉ ÉüÊÉÊÉÉþÊÉÉþÊÉÉþÊÉIÉ÷ÈÉÈÉÈÉÈÈÉÉÈÉÈÉíÈÉÈÉÉÈÉÈÉÈÈÉÈÈÉÉÈÉÈÈúÉÈÉÈÇÈÈÇýÈÇÈÈüÇÈÇÈÈþÇÈ ÈÇÈÇýÈÇÈÈþÇÈÈ?ÇûÆÇÆÇÆÆþÇÆÆþÇÆÆþÇÆ ÆþÇÆÆþÇÆÆüÇÆÇÆCÆ?Í+çþæçƒçþæçÞçþæççþæçç æþçææûçææçææûçææçææþçææþçææþçææþçææþçææúåæååæåå÷æååæåæåæååýæåææüåæåææåæåõæåæååæåæåæååæåäå÷äåäåääåäååäýåäååþäååäåäýåäååýäåääãäþãääüãäãääãäãäþãääþãääóãääããääãäãäãääãþäã~ãüâããââüãâãââãùâãâããâããâãâñãâããâããâãââãâãââãâáòâáââááââáââááââáûâáâáââøáââáââáâ âáâáþàááà áþàááøàááàááàááàáþàááþàááàßàßýàßààþßààßàøßàßßàßàßßöàßàßßààßàßßàößààßàßàßàßßÞùßÞßßÞÞßßãÞßßÞßÞßÞÞßßÞßÞßÞÞßÞßÞßßÞßÞßÞßßúÞßÞÞßÞÞüßÞßÞÞþßÞÞþÝÞÞøÝÞÞÝÞÞÝÞÞþÝÞÞüÝÞÝÞÞþÝÞÞûÝÞÞÝÞÞþÝÞÞúÝÞÞÝÞÝ6ÝþÜÝÝÜûÝÜÜÝÜÜøÝÜÝÜÜÝÝÜÜþÝÜÜÝÜþÝÜÜþÝÜEÜÛÜÛÜþÛÜÜúÛÜÜÛÜÛÛÜöÛÜÜÛÛÜÛÜÛÜÜìÛÜÛÜÛÛÜÛÛÜÜÛÛÜÛÜÜÛÜÛÛþÚÛÛþÚÛÛûÚÛÛÚÛÛÚÛÚúÛÚÛÛÚÛÛ?ÚÙþÚÙÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÚÙÙüÚÙÚÙÙüÚÙÚÙÙÚÙýØÙØØÙØÙØøÙØÙØÙØÙØØÙØþÙØØÙØþÙØØýÙØÙÙØÙúØÙÙØÙØBØûרØ×ØØþרØþרØöרØ×Ø×ØØ×ØØ×ØþרØ×ýØ×ØØýר×?×ýÖ×ÖÖþ×ÖÖþ×ÖÖ÷×Ö××Ö×Ö×ÖÖþ×ÖÖþ×ÖÖ÷×ÖÕÖÖÕÕÖÕÕÖÕÖÕíÖÕÕÖÕÕÖÕÕÖÕÖÖÕÖÖÕÖÕÕÖýÕÖÕÕÖ÷ÕÖÕÖÖÕÕÖÕÕõÔÕÕÔÕÕÔÕÕÔÕÕþÔÕÕþÔÕÕóÔÕÔÔÕÔÕÔÕÕÔÕÔÔÕøÔÕÔÕÔÕÔÕÕýÔÕÔ~Ô ÓÔÓþÔÓ ÓþÔÓÓþÔÓÓøÔÓÓÔÔÓÔÓÓþÔÓÓþÔÓÓûÔÓÒÒÓÓúÒÓÒÓÓÒÒúÓÒÒÓÓÒÒûÓÒÓÓÒÒÓúÒÓÒÒÓÒÒõÓÒÓÓÒÒÓÒÓÓÒÒòÑÒÒÑÑÒÑÒÑÒÒÑÒÑÑýÒÑÒÒúÑÒÑÒÑÒÒûÑÒÒÑÒÒüÑÒÑÒÒòÑÒÑÑÒÑÒÑÒÑÒÑÑÒÒÑÐÑ ÐÑ ÐþÑÐ ÐüÑÐÑÐÐþÑÐÐüÑÐÐÏÏÐÏûÐÏÏÐÏÏÐÏûÐÏÏÐÏÏúÐÏÐÐÏÐÐüÏÐÐÏÏöÐÏÏÐÏÐÏÐÐÏÏÎüÏÎÎÏÏÎÏøÎÏÎÎÏÏÎÏÏûÎÏÏÎÏÏÎþÏÎÎÏöÎÏÎÏÏÎÎÏÎÏÏþÎÏÏÎÍ ÎþÍÎÎþÍÎÎÍúÎÍÎÎÍÎÎùÍÎÍÎÎÍÎÎþÍÎÎüÍÎÍÎ΃ÍÌúÍÌÍÌÍÌÌÍÌÍûÌÍÌÌÍÍÌÍÌþÍÌÌÍÌõÍÌÌÍÌÍÌÍÌÌÍÍýÌÍÌÌËÌþËÌÌËÌËÌüËÌÌËËüÌËÌËËþÌËËÌûËÌËËÌÌËÊËþÊËËþÊËËÊ÷ËÊËÊËÊËÊËËþÊËËþÊËËüÊËÊËËÊË?ÊúÉÊÉÉÊÉÉÊúÉÊÉÉÊÉÉÊÉþÊÉÉûÊÉÉÊÉÉþÊÉAÉþÈÉÉÈÉþÈÉÉþÈÉÉÈÉüÈÉÉÈÈÉôÈÉÈÉÈÉÈÉÈÉÈÉÉúÈÉÈÈÉÈÈþÇÈÈûÇÈÇÇÈÈþÇÈÈÇÈûÇÈÈÇÈÈ@ÇÆÇÆÇÆøÇÆÇÆÆÇÇÆÆþÇÆÆþÇÆÆþÇÆÆÇÆþÇÆ>Æ?ÍkçþæçRçæþçææûçæççææùçæçææçææþçææþçææþçæ æçþæååýæåææ åþæååýæåææåúæåææåææåùæåææåæååäåéäåääååääååääåäåäåäååäåääþåääñåääåäåäåäåäååäååäþãääãäûãääãääþãä äþãä äñãääããääãääãäãäã€ãâØãâããâãâãââãâãâãââãâããâããâãâããââãââãââãâããâõãââãââããâãââúáâááâááýâáââþáââáñâáâááââáââáâááââáâþáââûáâááââáþàá áôàááàááààááàá áþàááàáüàáàááûàááàáá€àøßààßààßààßàßûàßßàßßàßüàßàßßàößàßàßßàßßààüßààßßÞßÞßþÞßßÞüßÞßÞÞßÞýßÞßßùÞßÞÞßÞßßýÞßÞÞýßÞßßÞÝÞþÝÞÞüÝÞÝÞÞÝÞÝþÞÝÝÞþÝÞÞÝÞüÝÞÝÞÞ?ÝÜþÝÜÜÝÜûÝÜÜÝÜÜþÝÜÜúÝÜÜÝÝÜBÜúÛÜÛÜÜÛÛüÜÛÛÜÜÛÜÛÜûÛÜÛÜÛÛþÜÛÛýÜÛÜÜýÛÜÛÛÜÛüÜÛÚÛÛÚÛþÚÛÛÚÛÚÛúÚÛÚÛÚÛÛÚÛþÚÛÛ?ÚÙÚÙþÚÙÙþÚÙÙùÚÙÚÙÚÚÙÙþÚÙÙ÷ØÙØØÙØØÙØØúÙØÙØØÙÙõØÙÙØÙÙØÙÙØÙÙØÙýØÙØØûÙØÙÙØEØø×Ø×רØ×ØØùררØ×Ø'Ø?×ýÖ×ÖÖû×ÖÖ×ÖÖþ×Ö Öþ×Ö Öþ×ÖÖþ×ÖÖ×ÖÕþÖÕÕýÖÕÖÖýÕÖÕÕÖùÕÖÖÕÖÖÕÕôÖÕÕÖÕÖÕÕÖÕÕÖÖÕþÖÕÕþÖÕÕõÖÕÖÖÕÕÖÕÖÕÔÔÕþÔÕÕøÔÕÕÔÕÕÔÕÕøÔÕÔÔÕÔÔÕÕÔ÷ÕÔÕÔÕÔÕÕÔÔÕýÔÕÔÔûÕÔÕÕÔ~ÔøÓÔÓÔÓÓÔÓÓþÔÓÓûÔÓÓÔÓÓþÔÓÓùÔÓÔÔÓÔÓÓûÔÓÔÔÓÓüÔÓÔÓ ÓÒÓÒþÓÒÒÓôÒÓÒÓÓÒÒÓÒÒÓÒÒþÓÒÒþÓÒÒÓÒÓôÒÓÒÒÓÒÓÒÒÓÑÒÒÑÒÑÒÑ÷ÒÑÒÒÑÒÒÑÒÒÑÒÑÒÑÒöÑÒÑÒÒÑÒÑÑÒÒüÑÒÒÑÑþÒÑ~ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐÑÐùÑÐÐÑÐÑÐÐÑÐþÑÐÐÏÐÏÐýÏÐÏÏòÐÏÏÐÏÏÐÐÏÏÐÏÐÏÏÐÏÐÏþÐÏÏþÐÏÏÐÏöÐÏÏÎÏÏÎÏÎÏÏñÎÏÎÏÎÏÏÎÎÏÎÏÎÎÏÏÎöÏÎÎÏÎÏÏÎÎÏÏõÎÏÎÏÎÏÎÎÏÎÏÏÎÏÍþÎÍÍýÎÍÎÎþÍÎÎÍÎûÍÎÎÍÎÎûÍÎÎÍÎÎûÍÎÍÍÎÎùÍÎÍÎÎÍÎ΀ÍÌûÍÌÌÍÌÌÍÌÍÌÍÌÍþÌÍÍôÌÍÌÍÌÍÌÌÍÌÍÌ ÌþÍÌÌËÌËÌöËÌÌËËÌÌËËÌÌËðÌËËÌËÌÌËËÌÌËÌËËÌÌúËÌËÌËÌÌüËÌÌËËþÊËËþÊË ËÊ ËüÊËÊËËþÊËËÊËúÊËËÊËÊ?ÊÉþÊÉÉûÊÉÉÊÉÉÊÉúÊÉÊÉÊÉÉþÊÉÉþÊÉÉÊÉÊÉÊúÉÊÉÉÊÉ?ÉùÈÉÈÈÉÈÉÉýÈÉÈÈÉÈÉÈÉöÈÉÈÉÈÉÉÈÉÈÈÉûÈÉÉÈÉÉöÈÉÈÉÉÇÈÈÇÈÈþÇÈÈþÇÈÈøÇÈÈÇÈÈÇÈÈþÇÈÈûÇÈÇÈÇ>ÇýÆÇÆÆûÇÆÆÇÆÆÇÆþÇÆÆÇÆûÇÆÆÇÆÆþÇÆÆþÇÆÆþÇÆCÆÿ?ÍFçþæçwçæüçæçææþçæ æûçæççæ æõçææçææççæçææþçææåæýåæååæåæåùæååæååææåþæååæåöæååææåæåæååùæåæåæåææåýæäååäüåäåääåþäååøäåäåäååääåäåýäåääýåäååäåäþåääùåäãäããä äþãääüãäãääþãääûãäããä äþãää‚ãâãâãâûãââãââãâòãâããâãâãâããââããâóãââãââãâãâããââáâáâþáââáâáýâáââûáâáâááâúáââááââáâáûàááàááþàááþàááþàá áþàááüàáàáá€àþßààûßàßàßßàýßàßßãàßàßààßààßààßßààßàßßààßààßßàßßàßàßÞßýÞßÞÞßüÞßßÞÞßÞûßÞÞßÞÞßûÞßÞßÞÞßûÞßÞÞßßÞÝùÞÝÞÝÞÝÞ ÞüÝÞÝÞÞþÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞþÝÞÞ?ÝÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜÝÜþÝÜÜÝBÜþÛÜÜþÛÜÜûÛÜÛÜÛÛÜöÛÜÜÛÜÛÛÜÜÛÛÜÛÜüÛÜÜÛÛüÜÛÜÛÛÜùÛÜÜÛÚÚÛÛþÚÛÛÚÛþÚÛÛÚÛûÚÛÛÚÛÛþÚÛÛþÚÛÛþÚÛÛ@ÚÙÚÙÚÙÚýÙÚÙ ÙûÚÙÙÚÙÙþÚÙÙüÚÙÚØØøÙØÙÙØØÙØØÙòØÙÙØØÙÙØØÙØØÙØØÙØÙñØÙØØÙØØÙÙØÙØÙÙØDØ×ØþרØþרØþרØþרØþרØ×ýØ×ØØùר×ררØùרØ×ØØ×@×Öþ×ÖÖþ×ÖÖþ×ÖÖø×Ö×Ö×Ö×ÖÖþ×Ö Öþ×ÖÖÕþÖÕÕøÖÕÖÕÖÕÖÕÕþÖÕÕûÖÕÕÖÕÕþÖÕÕÖÕûÖÕÕÖÕÕþÖÕÕÖÕÖÕþÔÕÕÔÕüÔÕÔÕÕúÔÕÔÕÔÕÕ÷ÔÕÔÕÔÕÔÕÔÔóÕÔÔÕÕÔÔÕÔÔÕÔÕÕ€ÔúÓÔÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓùÔÓÓÔÓÔÓÓúÒÓÓÒÓÒÒýÓÒÓÓÒòÓÒÒÓÓÒÒÓÒÓÒÓÒÓÓÒÓÒôÓÒÓÒÓÒÓÒÓÒÓÒÒûÑÒÑÑÒÒÑúÒÑÑÒÒÑÑøÒÑÒÑÒÑÒÑÑþÒÑÑÒôÑÒÒÑÑÒÑÒÒÑÑÒÒÑÒÑÒÑÐþÑÐÐþÑÐÐùÑÐÐÑÐÑÐÐþÑÐÐþÑÐÐüÑÐÐÑÑÐûÑÐÐÑÐÐþÑÐÐÏûÐÏÐÐÏÏþÐÏÏÐþÏÐÐûÏÐÐÏÐÐüÏÐÏÐÐÏþÐÏÏåÐÏÏÐÏÏÐÏÐÏÏÐÏÏÐÏÐÎÏÎÏÎÏÎÏÎÏÏùÎÏÏÎÏÎÏÏ÷ÎÏÎÎÏÎÏÎÏÏõÎÏÎÎÏÏÎÏÏÎÏÏþÎÏÏÎÏûÎÏÎÍÎÎþÍÎÎûÍÎÍÍÎÎúÍÎÍÎÍÎÎøÍÎÎÍÎÎÍÎÎþÍÎÎÍ ÎþÍÎ΀ÍÌÍüÌÍÍÌÌûÍÌÍÍÌÌÍÌÍýÌÍÌÌøÍÌÍÌÍÍÌÍÍÌþËÌÌùËÌËÌËÌËËüÌËÌËËùÌËÌËËÌËËüÌËÌËËÌþËÌÌþËÌÌËÌþËÌÌËýÌÊËËÊýËÊË ËÊýËÊËËûÊËËÊËËþÊËËùÊËÊËÊËÊ>ÊÉóÊÉÊÊÉÊÊÉÊÉÉÊÉÉþÊÉÉúÊÉÉÊÊÉÉüÊÉÊÉÉþÊÉAÉÈ÷ÉÈÉÉÈÉÉÈÉÉÈÉÈÉþÈÉÉüÈÉÈÉÉþÈÉÉøÈÉÈÈÉÉÈÉÉÈõÇÈÈÇÈÇÇÈÈÇÈ ÈþÇÈÈþÇÈÈÇÈûÇÈÈÇÈ È÷ÇÈÇÈÇÇÈÈÇ<ÇüÆÇÇÆÆÇÆþÇÆÆÇÆÇýÆÇÆ ÆúÇÆÆÇÇÆEÆ?Íçþæç™çþæç&çþæçóçæþçææþçææûçææçææúçææççææûçææçææüçæçææþçææþçææúçæçææååæüåææååþæååóæååæååæååæååææåæåþæååýæåææåùæåæåæäååþäååþäååþäååöäååääååääååöäååääååääååäåùäååääåääþãää÷ãäãääãäãääüãäãääúãääããääãòäãäãäãääãääãäã~ãøâãâãâããââýãâããâãùâãâãâãââþãââã âýãâããâþáââþáââþáââüáâáââüáâáââüáâáââáðâáâáâáâááââáâáàá áþàááàýáàááþàááüàáàááàáàá€àßàßüàßßààßàßàûßàßàßßàøßààßßàßààüßàßààßàßþÞßßûÞßßÞßßÞßûÞßßÞßßÞßþÞßßÞößÞßÞÞßßÞÞßßþÞßßþÞßßÞþÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞûÝÞÝÝÞÞÝÞÝÞþÝÞÞ@ÝÜþÝÜÜþÝÜ ÜøÝÜÝÝÜÜÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜGÜÛñÜÛÛÜÛÛÜÛÛÜÜÛÛÜÛÛÜÛÜõÛÜÜÛÛÜÛÜÜÛÜÜýÛÜÛÛýÜÛÜÜ÷ÛÜÛÜÜÛÜÚÛÛüÚÛÛÚÚÛþÚÛÛþÚÛÛþÚÛÛ?ÚýÙÚÙÙþÚÙ ÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙ ÙùÚÙÚÙÙØÙÙýØÙØØùÙØÙÙØØÙÙþØÙÙØþÙØØÙüØÙØÙÙùØÙØØÙÙØØ÷ÙØØÙÙØØÙØØþÙØCØþר ØþרØþרØþרØòרØ×ØØ×ØØ×ØØ×ØØø×ØØ×Ø×Ø×>×Öó×ÖÖ×Ö×ÖÖ××Ö×ÖÖþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖþ×ÖÖ÷×Ö×Ö××Ö×ÖÖþ×ÖÖÕÖÕÖÕúÖÕÖÕÕÖÖùÕÖÕÕÖÖÕÕÖÕÖþÕÖÖýÕÖÕÕþÖÕÕúÖÕÖÕÖÕÕÔÕÔøÕÔÕÔÕÔÔÕÕüÔÕÔÕÕùÔÕÔÕÕÔÕÕïÔÕÕÔÔÕÔÔÕÔÕÕÔÕÔÔÕÕþÔÕÕ€ÔýÓÔÓÓþÔÓÓþÔÓÓþÔÓÓÒùÓÒÓÒÓÓÒÒûÓÒÒÓÒÒÓÒÓþÒÓÓÒþÓÒÒÓÒÓ ÒÑÒüÑÒÑÒÒûÑÒÒÑÒÒüÑÒÑÒÒøÑÒÑÒÑÒÑÒÒþÑÒÒþÑÒÒ‚ÑÐüÑÐÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐÑÐþÑÐÐùÏÐÏÐÐÏÐÐíÏÐÏÏÐÏÐÏÐÏÏÐÏÏÐÐÏÐÏÏÐüÏÐÐÏÏøÐÏÏÐÐÏÐÏÏÐïÏÐÏÐÏÎÏÎÏÎÎÏÎÏÎÏÎÎûÏÎÏÎÏÏþÎÏÏÎÏÎôÏÎÏÏÎÎÏÏÎÏÎÏÏùÎÏÎÎÏÎÏÏýÎÏÎÎþÍÎ ÎûÍÎÎÍÎÎþÍÎÎþÍÎÎþÍÎÎûÍÎÎÍÎÎÍÎÍüÌÍÍÌÌÍþÌÍÍÌøÍÌÍÍÌÍÍÌÌöÍÌÌÍÍÌÍÌÌÍÍöÌÍÌÍÌÌÍÌÍÌÌìÍÌÍÍÌÌÍÌÌËÌËÌÌËÌÌËÌËËüÌËËÌÌË÷ÌËÌËËÌËÌËËýÌËÌÌËÌËÌúËÌËÌËÌÌðËÌËÌÌËÊÊËËÊÊËËÊËËÊËþÊËËùÊËËÊËÊËËþÊËËüÊËËÊÊËþÊËËþÊËË?ÊÉüÊÉÊÉÉýÊÉÊÊ ÉþÊÉÉþÊÉÉÊÉþÊÉÉúÊÉÊÉÊÉEÉÈîÉÈÉÈÈÉÈÉÈÉÉÈÉÉÈÉÉÈÈüÉÈÈÉÉÈýÉÈÉÉÈÉüÈÉÈÉÉÈÉüÈÉÉÈÈüÇÈÇÈÈþÇÈÈûÇÈÇÇÈÈÇ ÈÇÈþÇÈÈþÇÈÈÇÈ@ÇÆüÇÆÇÆ ÆþÇÆÆûÇÆÆÇÆÆÇýÆÇÆÆþÇÆÆþÇÆÆÇ?Æ?ÍÀçýæçææçýæçææúçææçæççòæçæçææçæçææççæ æþçææåþæååùæååæååææúåææåæååþæååþæååøæååæåææååæþåææåäùåääååäååûäåäåääúåäååäååùäåäååäååéäååäåääåäåäåäåäåäåääååääòãääããääãäããäãääãäøãäããääãääþãääþãääãäãâøãââãââãââöãââãâãâãâããýâãââãâãâþãââþãââúãââããââ÷áâááââááââáâáøâááââááââóáâááââááâáââááâþáââáþàááþàááþàááúàáàáàááàáþàááþàááüàáàáá„àþßààüßààßßþàßßàþßààüßààßßàßúàßßààßßàýßàßßþàßßÞþßÞÞßþÞßßøÞßßÞÞßÞßßÞþßÞÞþßÞÞßþÞßßÞÝÞÝÞüÝÞÝÞÞõÝÞÞÝÞÞÝÞÞÝÞÞþÝÞÞþÝÞÞþÝÞÞAÝÜþÝÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜöÝÜÝÜÝÜÜÝÝÜÜÝýÜÝÜÜÝ?ÜÛÜûÛÜÜÛÜÜúÛÜÜÛÛÜÜúÛÜÛÛÜÛÛýÜÛÜÜþÛÜÜìÛÜÛÜÜÛÜÛÜÜÛÜÜÛÜÜÛÜÛÜÜþÚÛÛøÚÛÚÛÛÚÚÛÛþÚÛ#ÛþÚÛÛ?ÚýÙÚÙÙþÚÙ ÙúÚÙÙÚÚÙÙþÚÙÙÚÙÚÙþÚÙÙØþÙØØúÙØØÙÙØØÙòØÙØÙØÙØØÙÙØÙÙØØùÙØÙÙØÙØØùÙØÙÙØÙØØûÙØØÙØCØþרØþרØüררØ×ØþרØþרØýר×@×Öþ×ÖÖú×ÖÖ××ÖÖ×Öü×Ö×Ö Ö×Ö×Öø×ÖÖ×ÖÖ×ÖÖÕÖÕÖúÕÖÖÕÖÕÕëÖÕÕÖÖÕÕÖÖÕÕÖÕÖÕÖÖÕÕÖÕÕþÖÕÕþÖÕÕÖûÕÖÕÖÕÕþÖÕÕüÔÕÔÕÕüÔÕÔÕÕûÔÕÔÕÔÔúÕÔÔÕÕÔÔÕþÔÕÕþÔÕÕùÔÕÕÔÕÕÔÔÕýÔÕÔÔüÕÔÕÔÔÓûÔÓÓÔÓÓùÔÓÔÔÓÔÓ ÓÔÓÔÓûÔÓÔÔÓÓþÔÓÓ ÒþÓÒÒþÓÒÒúÓÒÓÒÓÒÒþÓÒÒÓÒÓ÷ÒÓÓÒÒÓÒÓÒÒÓóÒÓÒÓÒÓÒÒÑÒÑÒÑÑÒþÑÒÒÑÒýÑÒÑÑÒÑÒþÑÒÒõÑÒÑÒÑÑÒÒÑÑÒÒ€ÑÐþÑÐÐþÑÐÐÑÐüÑÐÑÐÐùÑÐÑÐÐÑÐÐþÑÐ ÐüÑÐÑÐÐúÑÐÏÏÐÏÏýÐÏÐÐøÏÐÏÐÏÏÐÏ ÏýÐÏÐÐÏÐÏþÐÏÏþÐÏÏþÎÏÏûÎÏÏÎÏÏÎÏÎÏÎþÏÎÎÏúÎÏÏÎÎÏÏÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎûÍÎÍÍÎÎþÍÎÎÍÎþÍÎ ÎÍýÌÍÌÌùÍÌÍÌÌÍÌÌþÍÌÌüÍÌÍÌÌÍÌúÍÌÌÍÌÍÍÌÍÌüÍÌÌÍÍúÌÍËÌËÌÌúËÌÌËÌËËûÌËÌÌËËÌËÌöËÌÌËËÌÌËËÌÌþËÌÌËþÌËËòÌËËÌÌËÌËËÌËËÊËËüÊËÊËËûÊËËÊËËúÊËËÊÊË ËþÊËË@ÊÉüÊÉÊÉ ÉûÊÉÉÊÉÉþÊÉÉÊõÉÊÉÉÊÉÊÉÉÊÉBÉÈýÉÈÉ ÉþÈÉÉÈûÉÈÉÈÉÉüÈÉÈÉÉÈÉþÈÉÉÈÉýÈÇÈ ÈöÇÈÇÈÇÈÈÇÇÈÈÇöÈÇÈÈÇÈÈÇÇÈÈÇÈþÇÈÈ?ÇÆüÇÆÇÆÆûÇÆÆÇÆ ÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆûÇÆÇÇÆ@Æÿ?ÍÀçæþçææþçææþçææûçæççæ æþçææçæþçææýçæççæþçææýåæååæúåæååæååæýåæååôæåææåæååæåæååæåæùåæåææåææþåääåùäåäåääååþäååôäååääåääååäååäøåäåääååääüåääååäûãääãääþãä äûãääãä äãäþãää€ãôâãâãâããâããâããúâããââããþâããâöãââããâãâãââþãââãâþãââãýâãââùãâááââááâûáââáââþáââáøâáâááâáââáýâáââáâþáââúáââáâááþâááþàááüàáàááþàááþàááàúáàááàááüàáàááàáúàáàáàááàßàüßàßààßþàßßþàßßûàßßàßßàüßààßßàýßàßßþàßßëÞßÞßßÞÞßÞßßÞßÞßÞßÞßÞßßóÞßÞßÞÞßßÞÞßÞßßÞýßÞßßþÞßßÞýßÞßßÞüßÞÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞûÝÞÞÝÞÞÝÞþÝÞ Þ+ÝþÜÝÝÜþÝÜÜþÝÜÜûÝÜÜÝÜÜúÝÜÜÝÝÜÜþÝÜÜþÝÜÜüÝÜÝÜÜÝFÜÛøÜÛÛÜÛÜÛÜÜýÛÜÛÛÜüÛÜÛÜÜ÷ÛÜÜÛÜÜÛÜÛÛÜþÛÜÜÛÜùÛÜÜÛÜÜÛÛþÚÛ ÛþÚÛÛûÚÛÛÚÛ ÛþÚÛÛþÚÛ Û@ÚûÙÚÙÚÙÙþÚÙÙûÚÙÚÚÙ ÙþÚÙÙþÚÙÙÚ ÙØþÙØØûÙØÙÙØØûÙØØÙØØ÷ÙØÙØÙØÙØÙÙïØÙØÙØÙØØÙØØÙÙØÙÙØ>Ø×ØþרØþרØ×Ø×ØþרØþרØ×ØþרØþרØûרØ×Ø Ø?×Öþ×Ö Öþ×ÖÖþ×ÖÖþ×ÖÖú×Ö×Ö×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖù×ÖÖÕÖÕÖÖìÕÖÖÕÖÕÖÕÖÖÕÕÖÖÕÖÕÕÖÕÕøÖÕÕÖÕÖÕÖÖÕÖ÷ÕÖÖÕÖÕÕÖÕÕýÔÕÔÔÕüÔÕÕÔÔÕùÔÕÔÔÕÔÕÕþÔÕÕôÔÕÕÔÔÕÔÕÔÔÕÔÔûÕÔÕÔÕÕõÔÕÕÔÔÕÔÔÕÕÔ~ÔýÓÔÓÓãÔÓÓÔÓÔÓÓÔÓÔÓÔÔÓÔÓÓÔÔÓÔÓÓÔÓÓÔÓÓ÷ÔÓÔÓÓÔÓÔÓ ÓÔÓÔüÓÒÓÒÒÓýÒÓÒÒýÓÒÓÓÒþÓÒÒÓüÒÓÓÒÒùÓÒÓÒÒÓÒÒÓýÒÓÒÒþÓÒÒÓýÒÓÒÒÑýÒÑÒÒÑÒöÑÒÑÒÑÒÑÒÑÒÒÑÒÑüÒÑÑÒÒþÑÒÒøÑÒÒÑÒÒÑÒÒüÑÒÒÑ~ÑÐ÷ÑÐÑÐÑÐÑÑÐÐûÑÐÐÑÐÐþÑÐÐþÑÐÐóÑÐÐÑÐÑÐÐÏÐÏÐÏÏÐÏþÐÏÏÐÏúÐÏÐÏÐÏÏþÐÏÏùÐÏÏÐÏÐÏÏûÐÏÏÐÏÏÐûÏÐÏÐÏÏÎÏùÎÏÎÎÏÎÏÏüÎÏÎÏÏþÎÏÏóÎÏÎÏÏÎÎÏÏÎÏÎÏÏÎÏÎþÏÎÎþÏÎÎüÍÎÍÎÎþÍÎÎûÍÎÎÍÎÎíÍÎÎÍÎÎÍÎÎÍÎÎÍÍÎÎÍÍÎÎúÍÎÍÎÍÎÎÍÌ÷ÍÌÍÌÍÍÌÍÌÌüÍÌÍÌÌøÍÌÌÍÌÌÍÌÌþÍÌÌþÍÌÌøÍÌÌÍÌÍÌÍÍÌøÍÌÍËÌÌËÌÌËþÌËËÌòËÌÌËÌÌËÌËÌÌËËÌÌüËÌËÌÌüËÌÌËËúÌËÌËËÌÌËúÊËÊËÊËËþÊËËþÊËËþÊËËúÊËËÊÊËËúÊËËÊËÊ>ÊÉöÊÉÊÉÉÊÊÉÊÉÉûÊÉÉÊÉÉÊÉþÊÉÉÊ÷ÉÊÉÊÊÉÉÊÉÉþÊÉAÉúÈÉÈÉÉÈÈþÉÈÈøÉÈÉÈÈÉÉÈÈýÉÈÉÉüÈÉÉÈÈõÉÈÉÉÈÉÉÈÉÈÉÉþÈÉÉþÈÉÉûÈÉÈÇÈÈþÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈùÇÈÇÈÈÇÈÈ@ÇÆþÇÆÆþÇÆÆôÇÆÆÇÆÇÆÇÆÆÇÆÆüÇÆÇÆÆûÇÆÆÇÆ ÆþÇÆBÆ?Í çþæç"çþæçŒçæûçææçææçæþçææûçææçææþçææþçææþçææþçææöåæåæåæåææååöæåæåæåææåææåæåæõåæåææåææåæååæåûæåææååäýåäååþäååþäååäüåääååüäåäååùäåäååäååäåøäåäåääåääþãä-äþãääúãäãäãää€ãýâãââãâã÷âãâãâããâããâñãâããââããââãâãâããâãüâããââüãâãââáâáþâááâáâáâüáâáââüáâáââáâþáââáâøáâáàáààááúàááààáá÷àáààááàáààáþàááþàááýàáà~àßüàßàßßþàßßüàßàßßöàßàßàßààßààßüàßßààþßààßàýßÞßßÞßüÞßßÞÞùßÞÞßÞßÞÞûßÞÞßÞÞßøÞßÞÞßßÞßßþÞßßþÞßßþÞßßúÞßßÞÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞÝÞþÝÞÞþÝÞÞÝÞÝÞøÝÞÞÝÞÝÝÞÞÝþÜÝ"Ý ÜþÝÜÜþÝÜÜÝÜüÝÜÝÜÜþÝÜHÜÛÜýÛÜÛÛüÜÛÜÛÛøÜÛÜÛÜÜÛÜÜúÛÜÛÜÛÜÜøÛÜÛÛÜÛÜÛÛÜÛÜÛýÜÛÜÜÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛÚÛþÚÛÛÚÛÚÛýÚÛÚÚþÙÚ+ÚýÙÚÙÙÚÙüÚÙÚÙÙûÚÙÙÚÙÙþÚÙÙÚûÙÚÙÚÙÙøÚÙÚÙÙÚÚÙÙîØÙØÙØØÙÙØÙØÙØØÙØØÙÙØÙüØÙÙØØþÙØØÙýØÙØØþÙØØùÙØÙØÙÙØBØþרØùרר×רØþר ØöררØ×ØØ×ØØûר×רØþרØ@×Öþ×ÖÖþ×ÖÖö×Ö×Ö×Ö×Ö×ÖÖû×ÖÖ×ÖÖ×÷Ö××Ö×ÖÖ×ÖÖ×ýÖ×ÖÖþÕÖÖÕöÖÕÖÖÕÕÖÕÖÕ ÕýÖÕÖÖÕÖÕùÖÕÖÕÕÖÕÕÖûÕÖÕÖÕÕþÔÕÕöÔÕÔÔÕÕÔÕÔÕÕÔÕüÔÕÕÔÔýÕÔÕÕûÔÕÕÔÕÕûÔÕÕÔÕÕÔüÕÔÔÕÕÔóÓÔÓÔÓÔÓÓÔÔÓÔÓÓÔÓþÔÓ ÓÔÞÓÔÓÓÔÓÓÔÓÓÔÓÔÓÓÔÓÔÓÓÔÓÓÔÒÒÓÒÒÓÒÒÓÒÒüÓÒÒÓÓÒÓòÒÓÓÒÓÓÒÓÒÓÒÒÓÒÒÓÒÓÒÓòÒÓÒÒÓÒÒÓÒÒÑÒÒÑÑûÒÑÑÒÑÑÒÑÒãÑÒÑÑÒÑÒÑÑÒÑÑÒÑÒÒÑÑÒÒÑÑÒÑÑÒÑÒÑÑüÒÑÑÒÒÑýÐÑÐ ÐþÑÐÐÑÐÑÐüÑÐÑÐÐüÑÐÑÐÐÑÐþÑÐÐÑÏüÐÏÐÏÏþÐÏÏûÐÏÏÐÏÏóÐÏÐÏÏÐÐÏÏÐÏÐÏÏ ÐÏþÐÏÏÐÏÐÏþÎÏÏÎÏÎÏþÎÏÏÎýÏÎÏÏÎúÏÎÏÏÎÏÏúÎÏÏÎÏÎÎÏÎÏ ÎþÍÎÎ÷ÍÎÎÍÎÎÍÍÎÎÍÎÍÎþÍÎÎþÍÎÎýÍÎÍ~ÍÌÍÌøÍÌÌÍÍÌÍÌÌÍÌúÍÌÍÌÌÍÍÌþÍÌÌþÍÌÌÍÌþÍÌÌûËÌËËÌÌùËÌÌËÌËÌÌËÌþËÌÌýËÌËËøÌËÌËÌËËÌÌþËÌÌüËÌÌËËþÊËËþÊËËÊöËÊÊËËÊÊËÊËËûÊËËÊËËÊËÊËûÊËËÊËËAÊüÉÊÊÉÉþÊÉÉÊÉþÊÉ ÉÊÉÊÉúÊÉÉÊÊÉ@ÉþÈÉÉþÈÉÉþÈÉÉöÈÉÉÈÉÈÈÉÈÉÉüÈÉÈÉÉÈðÉÈÉÉÈÈÉÈÉÉÈÉÈÉÈÉÉÈùÉÈÈÇÈÇÈÈÇÈÇúÈÇÈÈÇÈÈûÇÈÈÇÈÈÇÈÇüÈÇÇÈ È?ÇÆþÇÆÆþÇÆÆþÇÆÆÇþÆÇÇùÆÇÇÆÆÇÆÆûÇÆÆÇÆÆþÇÆÆþÇÆ@Æ?ÍþæçäçþæçØçæþçææþçææçæçæüçæçææþçææþçææåúæåæåæååûæåææååþæååæùåææååæåå÷æåæåæåææååæåæüåææååøäåäååääååþäååä åüäååääåäåäåäûãääãääûãäããääþãääãøäãääãäãää€ãþâããâòãââãââãâããâãâããâþãââüãâãââãýâãââþãââáâýáâááâüáâáââáâþáââáâðáâáâáâááââááâáâááþàáá÷àááààááàááüàáàááþàááàáþàá áþàááàßàßüàßßààßüàßàßßüàßàßßûàßààßßàþßààßþàßßýàßààßþÞßßüÞßÞßßþÞßßüÞßÞßßÞûßÞßÞßßõÞßÞßÞßÞßßÞßßÞýßÞßßüÞßßÞÞûÝÞÝÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞýÝÞÝ>ÝÜþÝÜÜùÝÜÜÝÜÝÜÜÝÜûÝÜÝÝÜÜûÝÜÜÝÜÜÝÜüÝÜÝÜÜþÝÜCÜÛýÜÛÜ ÜþÛÜÜýÛÜÛÛúÜÛÜÛÛÜÜþÛÜÜûÛÜÜÛÜÜÛÜõÛÜÛÛÜÚÛÚÛÚÛÛþÚÛÛþÚÛÛþÚÛÛÚ ÛþÚÛÛþÚÛÛþÚÛÛ+ÚþÙÚÚÙûÚÙÙÚÙÙþÚÙ ÙþÚÙÙüÚÙÚÙÙÚÙþÚÙÙþÚÙÙþÚÙÙØþÙØØþÙØØþÙØØÙûØÙØØÙÙØöÙØÙØØÙØÙØÙÙúØÙØÙØÙÙýØÙØDØþרØþרØþרØ×Ø×ýØ×ØØþרØþרØþרØüרØ×>×Öþ×ÖÖû×Ö××ÖÖþ×ÖÖû×Ö××ÖÖ×ýÖ×ÖÖþ×ÖÖ×Öþ×ÕÕÖÕùÖÕÖÕÕÖÕÕÖüÕÖÕÖÖûÕÖÕÕÖÖÕþÖÕÕÖýÕÖÕÕÖúÕÔÕÔÕÔÔÕþÔÕÕÔÕÔÕÔýÕÔÕÕÔüÕÔÕÔÔÕÔþÕÔ~ÔýÓÔÓÓÔÓÔÓþÔÓÓþÔÓ ÓþÔÒÒüÓÒÓÒÒõÓÒÒÓÒÒÓÒÓÒÓÓüÒÓÒÓÓÒþÓÒÒÓøÒÓÓÒÒÓÓÒÒÓïÒÓÓÒÓÒÒÓÒÒÑÒÒÑÒÑÒÒûÑÒÒÑÒÒþÑÒÒÑþÒÑÑþÒÑÑÒþÑÒÒÑÒüÑÒÒÑ~ÑÐþÑÐÐþÑÐÐÑÐÑøÐÑÐÑÐÐÑÐÐþÑÐÐýÏÐÏÏþÐÏÏïÐÏÐÏÐÐÏÐÏÐÏÐÏÐÏÐÏÏÐÏÐüÏÐÐÏÏÐÏõÐÏÏÐÐÏÏÐÏÏÎÎÏÎÏøÎÏÏÎÏÎÎÏÏþÎÏÏÎÏÎÏéÎÏÎÏÎÏÎÏÎÏÏÎÏÏÎÏÎÎÍÎÎÍÎÎÍÎþÍÎÎùÍÎÎÍÎÍÎÎÍýÎÍÎÎùÍÎÎÍÎÍÎÎûÍÎÎÍÎÎýÍÎÍ€ÍúÌÍÍÌÍÌÌÍûÌÍÌÍÌÌÍÌõÍÌÍÌÌÍÌÌÍÍÌÌþÍÌÌùÍÌÍÌÌÍÌÌþÍÌÌþËÌÌþËÌÌüËÌËÌÌËÌúËÌÌËËÌÌþËÌÌùËÌËÌËËÌÌËÌøËÌËÌÌËÌËËþÊËËþÊËËþÊËËûÊËËÊËËþÊËËþÊË ËüÊËÊËË@ÊùÉÊÉÊÉÊÉÉþÊÉÉüÊÉÊÉÉÊÉùÊÉÊÉÉÊÉÉüÊÉÊÉÉúÊÉÊÉÊÉBÉÈøÉÈÈÉÉÈÉÈÈÉíÈÉÈÉÈÉÉÈÉÈÈÉÈÉÈÉÉÈÉÉþÈÉÉÈúÉÈÉÉÈÉÉþÈÉÉýÈÉÈ ÈþÇÈÈþÇÈÈþÇÈÈúÇÈÈÇÈÇÇ ÈþÇÈÈþÇÈ ÈÇþÆÇ'ÇÆþÇÆÆþÇÆÆûÇÆÆÇÆÆüÇÆÇÆÆÇÆøÇÆÇÇÆÆÇÆ ÆþÇÆÆþÇÆCÆÿ?ÍýçæçîçþæçDçþæç†çæþçææïçææçææçææççæçææçææþçæ æûçææçææûçææçææçæûåææåææåæýåæååúæååææååøæåææååæååþæååþæååæþäååäåäûåääåääýåäååüäåäååþäååäåúäååääååäå äþãääþãääþãääãäþãääùãäãäããääþãääüãääã~ãâãâþãââûãâãâããâùãâãââãââûãââãââãâãâãâüãâãââþáââáâþáââáâüáââááâïáââááââáââááââááââûáâáàááüàáàá áþàááûàááàááúàáàáàááþàááüàááà~àóßàßàßßàßàßààßßüàßàßßàßûàßààßß÷àßàßààßàßßàß÷àßßààßÞÞßßûÞßßÞßßýÞßÞÞòßÞßÞßßÞßÞßßÞÞßßÞßÞïßÞÞßÞßÞÞßßÞÞßßÞÞßßÞüÝÞÝÞ ÞøÝÞÞÝÞÞÝÞÞüÝÞÝÞÞ?ÝýÜÝÜÜÝÜüÝÜÝÜÜþÝÜÜüÝÜÝÜÜùÝÜÜÝÜÝÜÜúÝÜÜÝÝÜÜûÝÜÝÜÝÝEÜ÷ÛÜÜÛÜÛÛÜÛÛÜþÛÜÜþÛÜÜûÛÜÛÜÛÛýÜÛÜÜþÛÜÜþÛÜÜÛÜþÛÜÜýÛÜÛÛÚüÛÚÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛ Û=ÚþÙÚÚõÙÚÙÚÙÚÙÚÙÚÙÙøÚÙÙÚÙÚÚÙÙþÚÙÙûÚÙÙÚÙÙþÚÙÙüÚÙÙÚÚÙÚÙþÚØØüÙØÙØØÙüØÙÙØØÙØûÙØØÙØØúÙØØÙØÙÙØþÙØØùÙØÙØÙØÙÙGØ×ØþרØþרØþרØþרØþרØûרØ×ØØþרØüרØ×>× Öþ×ÖÖü×Ö×ÖÖü×Ö×ÖÖü×Ö×ÖÖ× Öþ×Ö ÖýÕÖÕÕþÖÕÕýÖÕÖÖÕÖÕúÖÕÖÕÖÕÕýÖÕÖÖÕûÖÕÖÖÕÕÔøÕÔÕÔÕÕÔÕÕÔÕþÔÕÕÔÕÔÕÔþÕÔÔýÕÔÕÕþÔÕÕúÔÕÕÔÕÔZÔþÓÔ!ÔÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓ ÓþÔÓÓìÔÓÒÓÒÓÒÓÓÒÓÒÓÒÓÓÒÒÓÒÒÓþÒÓÓÒúÓÒÒÓÓÒÒþÓÒÒÓýÒÓÒÒëÓÒÓÒÒÓÒÒÑÒÒÑÒÑÒÑÒÒÑÑÒÒÑÒ÷ÑÒÑÑÒÒÑÒÑÑ÷ÒÑÒÒÑÒÑÑÒÒþÑÒÒùÑÒÑÒÒÑÒÒ€ÑÐÑøÐÑÐÐÑÐÑÐÐÑÐþÑÐÐÑÐþÑÐÐþÑÐÐþÑÐÐöÑÐÑÐÐÑÐÐÑÐÐÏþÐÏÏþÐÏÏÐþÏÐÐÏðÐÏÏÐÏÐÏÏÐÏÐÏÐÏÐÏÏþÐÏÏÐÏüÐÏÐÏÏþÎÏÏÎÏþÎÏÏþÎÏÏÎÏþÎÏÏÎÏûÎÏÏÎÏÏýÎÏÎÎÏòÎÏÎÏÏÎÏÎÏÎÏÎÍÎÎÍúÎÍÎÎÍÎÎúÍÎÎÍÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎÍÌûÍÌÍÍÌÌþÍÌÌïÍÌÌÍÌÍÍÌÍÌÍÌÌÍÌÍÌÌøÍÌÍÌÍÌÍÌÌþÍÌÌùÍÌÌÍÌÍÌÌýËÌËËÌËùÌËÌÌËÌËËôÌËËÌËËÌÌËËÌËËÌþËÌÌõËÌÌËÌÌËÌËÌËËüÊËÊËËûÊËÊÊËËüÊËÊËËüÊËÊËËûÊËÊÊËËýÊËÊ>ÊýÉÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉCÉÈÉüÈÉÈÉÉûÈÉÈÈÉÉÈþÉÈÈÉÈÉÈñÉÈÉÉÈÈÉÈÉÉÈÉÉÈÉÉüÈÉÉÈÈûÇÈÈÇÈÈþÇÈÈûÇÈÈÇÈÈþÇÈÈþÇÈÈÇÈýÇÈÇ@ÇÆÇÆþÇÆÆûÇÆÆÇÆÆüÇÆÇÆÆûÇÆÇÇÆÆüÇÆÇÆ>Æ?Í=çþæççþæç/çþæç8çæçæþçææþçææüçæçææþçææüçæçææüçæçææþçææûçææçææûåææåææåæåæåæûåæååææåæþåææåþæååúæååææååæåäüåääååäåþäååäåþäååäåäåþäååäåøäåääååäååþãääþãääþãääãäþãääþãääòãääãäãäãääãäãääúãääãäã€ãýâãââúãâãâãââþãââãýâãââãýâãââãâûãââãââãâãôâãââááââááâááþâááâûáââáââáâüáâáââþáââáûâááâááâáâþàááøàáàáàáàááûàááàááàáþàááþàááþàááþàááúàáàááà~àßúàßßààßßþàßßûàßààßßùàßààßàßßàóßàßààßßàßààßààûßàßàßßþàßßýÞßÞÞýßÞßßÞüßÞÞßßýÞßÞÞþßÞÞßþÞßßÞßûÞßßÞßßÞÝÞüÝÞÝÞÞûÝÞÞÝÞÞþÝÞÞüÝÞÝÞÞÝþÜÝÝþÜÝÝÜÝÜÝÜþÝÜÜÝ ÜÝÜüÝÜÝÜCÜÛÜÛûÜÛÜÛÜÜüÛÜÛÜÜþÛÜÜÛÜÛþÜÛÛîÜÛÛÜÜÛÜÛÜÜÛÛÜÛÛÚÚÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛ?ÚÙÚÙþÚÙÙþÚÙÙÚ ÙüÚÙÚÙÙþÚÙÙûÚÙØÙØØÙØÙüØÙÙØØÙØýÙØÙÙØüÙØÙØØÙþØÙÙØÙýØÙØCØ×Øþר ØþרØþרØø×Ø×ØØ×Ø×רþר ØüרØ×>×Ö×Ö×Öþ×ÖÖ×Öþ×ÖÖ×Ö×þÖÕÕÖÕøÖÕÖÕÖÕÖÕÕÖ÷ÕÖÕÕÖÕÕÖÕÕÖþÕÖÖúÕÖÕÖÖÕÕ÷ÖÕÕÖÕÖÕÕÖÖúÕÖÕÕÖÕÕÔÕþÔÕÕÔÕûÔÕÔÔÕÕúÔÕÔÔÕÔÔÕÔÕÔÕÔÕûÔÕÔÔÕÕÔÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓÔÓþÔÓÓþÔÓÓþÔÓÓÔÓÒ÷ÓÒÒÓÒÒÓÓÒÒøÓÒÒÓÓÒÓÒÒüÓÒÒÓÓùÒÓÒÒÓÓÒÒþÓÒÒÓøÒÓÒÒÓÓÑÒÒÑ÷ÒÑÑÒÑÒÒÑÒÒÑÒÑÒÑÒüÑÒÑÒÒÑõÒÑÒÑÑÒÑÒÒÑÒÒÑÐÑÐþÑÐÐÑÐþÑÐÐþÑÐÐûÑÐÐÑÏÏóÐÏÏÐÏÏÐÏÐÏÐÐÏÏÐÏúÐÏÐÐÏÐÐüÏÐÏÐÐÏÐÏýÐÏÐÐÏÐÏÎÏùÎÏÎÏÏÎÏÏÎúÏÎÏÏÎÏÏüÎÏÎÏÏÎÏÎÏúÎÏÎÏÏÎÎÏùÎÏÏÎÎÏÎÎþÍÎÎþÍÎ ÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎ ÎÍ΂ÍýÌÍÌÌûÍÌÍÌÍÍÌûÍÌÌÍÌÌüÍÌÍÌÌþÍÌÌüÍÌÍÌÌþÍÌÌÍ÷ÌÍÌÍÌÍÌÍËËÌùËÌËËÌÌËËÌËÌþËÌÌýËÌËËþÌËËÌËÊËþÊËËõÊËËÊËËÊËËÊËËþÊËËþÊËËøÊËËÊËËÊËËýÊËÊ?ÊÉþÊÉÉóÊÉÉÊÉÉÊÉÊÉÊÊÉÉÊ ÉÊ ÉüÊÉÊÉAÉÈÉÈÉþÈÉÉþÈÉÉúÈÉÈÈÉÈÈÉýÈÉÈÈøÉÈÉÉÈÉÈÉÉÈÉùÈÉÈÈÉÈÉÉ ÈÇÈþÇÈÈÇÈùÇÈÈÇÈÇÈÈþÇÈÈÇÈûÇÈÇÇÈÈüÇÈÈÇ?ÇõÆÇÇÆÆÇÆÆÇÇÆÆþÇÆÆûÇÆÇÇÆÆþÇÆÆùÇÆÇÆÇÇÆÆÇAÆ?Í çþæçÛçþæçÖçæþçææþçææþçæ æþçææçæùçæçææçææþçææåûæååæååüæååææåæåýæåææåþæååæåæåùæåææåäååäþåääåõäååääåääååääïåääåäåäåääåäåäåäååþäååùäåääåäååùäãääããääþãääúãäãäãääùãäãäããääþãääþãääãäãäãýâãââüãââããâãâúãââããââûãââãââþãââãâãûâããâããâáùâááââáââáâáâáùâááââáââ÷áâááâááâááâáúâáââáââøáâáââáàááþàááþàááàýáàááüàáàááþàááþàááþàááþàáá€àßüàßàßßþàßßüàßàßßàßøàßàßàßàßßàßàßûàßßàßßüàßÞßßÞßþÞßßÞßþÞßßþÞßßÞýßÞßßÞßÞþßÞÞüßÞÞßßûÞÝÞÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞÝÞþÝÞÞÝÞõÝÞÝÞÞÝÞÝÞÞÝ?Ý ÜÝÜþÝÜÜÝ ÜþÝÜÜþÝÜÜþÝÜÜÝCÜÛúÜÛÜÜÛÜÜÛÜþÛÜÜÛýÜÛÜÜÛýÜÛÜÜýÛÜÛÛÜôÛÜÛÜÜÛÜÜÛÛÜÛÛþÚÛÛüÚÛÚÛÛÚýÛÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛÚþÙÚ4ÚÙÚÙÚÙþÚÙÙ÷ÚÙÙÚÚÙÙÚÙÙÚöÙÚÙÚÙÙÚÙÙÚÚýÙÚÙÙûÚØØÙØØþÙØØüÙØØÙÙØÙ ØÙ÷ØÙÙØØÙÙØÙÙþØÙÙØþÙØCØüרר Øýר××Ø×Ø× ØþרØ×ØþרØ?×Öþ×ÖÖþ×ÖÖ×Öþ×Ö Öþ×Ö Ö×Öü×ÕÕÖÖÕÖÕÖÕþÖÕÕûÖÕÖÖÕÕÖýÕÖÕÕÖÕþÖÕÕÖÕüÔÕÔÕÕþÔÕÕûÔÕÕÔÕÕÔÕüÔÕÔÕÕûÔÕÔÔÕÕÔ÷ÕÔÕÕÔÔÕÔÕÕýÔÕÔÔûÓÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓüÔÓÔÓÓÔÓÒÓûÒÓÓÒÓÓÒÓýÒÓÒÒÓÒÓúÒÓÒÒÓÒÒûÓÒÓÒÓÓùÒÓÒÒÓÓÒÒÓÒûÓÒÒÑÒÒêÑÒÒÑÒÑÑÒÒÑÑÒÑÒÑÑÒÑÑÒÒÑÑÒÑ÷ÒÑÒÒÑÒÑÑÒÒÑúÒÑÒÒÑÒÒ€ÑÐÑÐþÑÐ ÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐúÑÐÏÐÐÏÏÐÏõÐÏÐÐÏÏÐÐÏÏÐÐýÏÐÏÏúÐÏÐÏÐÏÏÐÏùÐÏÐÏÏÐÏÏûÐÎÏÏÎÎòÏÎÎÏÎÎÏÏÎÏÏÎÏÎÎýÏÎÏÏüÎÏÏÎÎýÏÎÏÏüÎÏÎÏÏþÎÏÏöÎÏÏÎÏÎÏÎÏÎÎýÍÎÍÍÎþÍÎ ÎþÍÎÎþÍÎÎÍûÎÍÎÍÎÎýÍÎÍ~ÍÌöÍÌÌÍÌÍÌÌÍÌÌÍÌýÍÌÍÍÌüÍÌÍÌÌþÍÌÌôÍÌÍÍÌÍÍÌÍÌÍÌÌþÍÌÌþÍÌÌËÌËÌòËÌÌËÌÌËËÌËÌÌËÌÌËþÌËËüÌËËÌÌüËÌËÌÌòËÌÌËËÌËÌÌËËÌÌËËÊËþÊËËøÊËÊÊËÊÊËËûÊËËÊËËüÊËÊËËþÊËËÊË?ÊÉþÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉûÊÉÊÊÉÉúÊÉÊÉÊÉÉþÊÉÉþÊÉEÉüÈÉÈÉÉÈÉþÈÉÉùÈÉÈÉÈÈÉÉÈýÉÈÉÉÈÉûÈÉÉÈÉÉüÈÉÉÈ ÈûÇÈÈÇÈ ÈûÇÈÈÇÈÈþÇÈÈüÇÈÇÈÈúÇÈÈÇÇÈ È?ÇÆþÇÆÆþÇÆÆþÇÆÆûÇÆÇÇÆÆþÇÆÆþÇÆÆþÇÆDÆÿ?ÍéçþæçÖçæþçæ æüçæçææçæçæûçæççææþçææþçææøçæçæåæåææüåææååþæååúæåæååææùåæåæåæååüæåæååûæåææååüæåæååöæååääåäåäååþäååäøåäåäååäååëäåääååääååääåäåäåäåäååþäå åüäãäããäãäãäþãääãäüãäãääãäûãääãää„ãûâãââããüâããââüãâãââþãââöãâãâããââãââãâúãâãâãââþáââýáâááþâááâáúâáâááââüáââááâùáââáâáââáëâááââáàááàáàáàááàááàááþàááþàááþàááþàá áþàááþàáá€àýßàßßàßàßöàßßàßßààßààßàßþàßßòàßßàßßàßàßßààßß÷àßàßßàßßÞÞýßÞßßüÞßßÞÞýßÞßßþÞßßûÞßßÞßßüÞßÞßßûÞßÞÞßßýÞßÞÞðßÞÞßßÞßßÞßÞÞÝÞÝÞÞÝúÞÝÞÝÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞÝ Þ@ÝÜþÝÜÜþÝÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜøÝÜÜÝÜÜÝÜÜÝÜþÝÜEÜÛþÜÛÛÜÛðÜÛÜÜÛÜÛÜÛÛÜÛÛÜÜÛÛÜÛúÜÛÛÜÛÜÜÛÜòÛÜÛÛÜÛÜÛÜÛÛÜÚÛ ÛþÚÛ ÛþÚÛÛþÚÛÛüÚÛÚÛÛ?ÚÙþÚÙÙûÚÙÙÚÙÙúÚÙÙÚÚÙÙùÚÙÚÙÙÚÙÙûÚÙÙÚÙÙøÚÙÙÚÙÙÚÙÙÚÙØþÙØØÙØÙûØÙØÙØØõÙØÙØÙØÙØØÙØØüÙØÙØØÙôØÙÙØÙØØÙÙØÙØ?ØþרØîרØ×Ø×Ø×ררØ×ØØ×ØØüררØþרØûרØ×ØØ×Ø?×ýÖ×Ö Öþ×ÖÖü×Ö×ÖÖþ×ÖÖû×Ö××ÖÖ×þÖ×× Öù×ÖÖÕÕÖÕÕýÖÕÖÖÕþÖÕÕÖüÕÖÕÖÖÕûÖÕÖÖÕÕõÖÕÕÖÕÖÕÖÖÕÖÖÕþÔÕÕÔüÕÔÕÔÔÕÔÕûÔÕÕÔÕÕúÔÕÕÔÕÔÔûÕÔÕÔÕÕöÔÕÔÕÕÔÕÔÕÔCÔþÓÔ=Ô ÓþÔÓÓþÔÓÓûÔÓÓÔÓÓûÔÓÓÔÓÓøÔÓÓÔÔÓÔÓÓþÔÓÓÒøÓÒÒÓÓÒÓÒÒíÓÒÒÓÒÓÒÓÓÒÒÓÒÓÒÓÓÒÓÓÒÓóÒÓÓÒÓÓÒÓÓÒÓÓÒÒÓÒüÓÒÑÒÒÑÒ÷ÑÒÑÑÒÒÑÑÒÒñÑÒÑÑÒÑÑÒÑÒÒÑÒÑÒÒÑøÒÑÑÒÑÒÑÒÒÑÒÑÐþÑÐÐþÑÐÐûÑÐÐÑÐÐþÑÐÐþÑÐÐþÑÐÐÑÐþÑÐÐÏÐÏñÐÏÐÏÏÐÏÐÐÏÐÐÏÏÐÐýÏÐÏÏÐ÷ÏÐÏÐÏÐÏÏÐÐÏÐýÏÐÏÏþÐÏÏÐÏÎÏÎûÏÎÏÎÏÏûÎÏÏÎÏÏýÎÏÎÎûÏÎÏÎÏÏÎÏþÎÏÏþÎÏÏýÎÏÎ ÎþÍÎÎüÍÎÍÎÎûÍÎÎÍÎÎûÍÎÍÍÎÎÍÎüÍÎÍÎÎÍ΂ÍÌûÍÌÌÍÌÌûÍÌÌÍÌÌüÍÌÌÍÍÌÍÌýÍÌÍÍÌüÍÌÍÌÌþÍÌÌüÍÌÌÍÍýÌÍÌÌËþÌËËùÌËÌËËÌËËÌËÌþËÌÌËÌËÌËþÌËËÌþËÌÌËÌþËÌÌúËÌÌÊÊËËþÊËËþÊËËùÊËÊËÊÊËËþÊËËøÊËÊËÊËÊËËúÊËËÊÊËËþÊËËÊËüÊËËÊ>ÊÉþÊÉÉþÊÉÉþÊÉÉùÊÉÉÊÉÊÉÉþÊÉÉþÊÉÉþÊÉ ÉþÊÉÉúÊÉÉÊÊÉGÉÈÉúÈÉÈÉÉÈÈÉþÈÉÉúÈÉÉÈÈÉÉÈüÉÈÈÉÉÈÉÈúÉÈÉÈÉÈ ÈþÇÈÈûÇÈÈÇÈÈÇÈþÇÈÈõÇÈÇÇÈÈÇÈÈÇÈÈþÇÈÈÇÈ@ÇÆþÇÆÆþÇÆÆþÇÆÆþÇÆ ÆþÇÆÆÇÆþÇÆDÆ?Í“çþæçÅçþæçdçùæçæçæçææçæçæçæþçææçæþçææûçæççææåæåæúåæååæååèæåæååæåæåæåæåæåææååææåæååæåþæååøæååääååääåüäåäååäúåääåäååþäååäøåäååäåäååäåäþåääãäþãääþãääþãääþãääãýäãääþãääþãää€ãâþãââãýâãââüãââããâõãâããâãââããââûãââãââãýâãââþãââûãââãââþáââþáââáâüáâáââøáââááâáââüáâáââýáâááúâááâáââõáâáâáââááàá áþàá áþàááþàá áþàááþàááàá€àßàßàßûàßßàßßöàßààßßàßàßßàßþàßßþàßßÞýßÞßßÞßþÞßßÞßúÞßßÞÞßßÞßéÞßßÞÞßßÞßßÞßÞÞßÞÝÞÝÞÝÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞÝ ÞþÝÞÞÝÞ%ÝþÜÝÝÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜùÝÜÜÝÜÝÜFÜÛÜçÛÜÛÜÛÜÛÛÜÛÜÛÛÜÛÜÜÛÜÛÜÛÜÛÜÜÛÜÛÜÛÜüÛÜÜÛÛÜóÛÜÜÚÚÛÚÚÛÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛÚÛÚöÛÚÛÛÚÛÛÚÛÚ>ÚýÙÚÙÙþÚÙÙþÚÙÙþÚÙÙÚÙüÚÙÚÙÙþÚÙÙþÚÙÙØÙúØÙÙØÙØØüÙØÙØ ØÙøØÙØØÙØÙØØüÙØÙØØøÙØØÙÙØØÙÙØüÙØÙØ@Ø×ØþרØþרØ×ØþרØþרØþרØ?×Öþ×ÖÖþ×Ö Ö×Ö×Öþ×ÖÖþ×ÖÖù×Ö×ÖÖ×ÖÖÕþÖÕÕòÖÕÖÕÕÖÕÕÖÖÕÕÖÕÕøÖÕÖÕÕÖÖÕÕþÖÕÕùÖÕÕÖÕÖÕÕÖõÕÖÖÕÖÕÖÕÕÖÕÕûÔÕÔÔÕÕÔþÕÔÔûÕÔÕÔÕÕþÔÕÕúÔÕÔÕÔÕÕúÔÕÔÕÔÕÕüÔÕÔÕÕûÔÕÕÔÕÕ€ÔÓûÔÓÔÔÓ ÓùÔÓÔÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓÒðÓÒÓÓÒÓÒÓÒÒÓÓÒÒÓÒÒöÓÒÓÒÒÓÓÒÓÒÒþÓÒÒÓýÒÓÒ ÒúÓÒÒÑÑÒÒÑÒþÑÒÒ÷ÑÒÑÒÑÑÒÑÒÒþÑÒÒÑþÒÑÑÒþÑÒÒûÑÒÑÒуÑÐþÑÐÐÑýÐÑÐÐþÑÐÐÑÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÏÐÐÏþÐÏÏÐýÏÐÏÏöÐÏÐÏÏÐÏÏÐÏÏûÐÏÐÏÐÐÏþÐÏÏþÐÏÏ÷ÐÏÐÏÐÏÐÐÏÏþÎÏÏÎÏÎÏüÎÏÎÏÏúÎÏÎÏÏÎÎÏöÎÏÎÎÏÏÎÎÏÎÎþÏÎÎÏÎþÍÎÎÍÎÍÎþÍÎÎöÍÎÎÍÍÎÍÎÍÎ ÎþÍÎÎÍüÌÍÍÌÌÍÌþÍÌÌÍÌÍøÌÍÌÍÌÌÍÌÌÍÌÍÌÍúÌÍÌÌÍÌÌËþÌËËýÌËÌÌËÌËÌþËÌÌþËÌÌïËÌËÌËËÌËËÌËËÌËÌËÌÌýËÌËËõÌËÌÌËËÌÌÊÊË ËþÊËËÊËþÊËËþÊËËúÊËÊËÊËËþÊËËüÊËËÊ>Ê ÉþÊÉ ÉþÊÉÉþÊÉÉùÊÉÊÉÉÊÉÉþÊÉÉþÊÉ?ÉÈýÉÈÉÉûÈÉÈÉÈÈýÉÈÉÉüÈÉÉÈÈúÉÈÉÈÉÈÈõÉÈÉÈÈÉÈÈÉÉÈÈÉûÈÉÈÈÉÉÈþÉÈÈþÇÈÈüÇÈÇÈÈôÇÈÇÇÈÇÈÇÈÈÇÈÈûÇÈÈÇÈÈþÇÈÈÇÈþÇÈÈüÇÈÈÇ?ÇýÆÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆüÇÆÇÆÆûÇÆÆÇÆ>Æ?Í|çþæçAçýæçææþçææþçææþçææüçæçææþçæ æþçææ÷çæçææçæçææýåæååþæååæøåææååææååæåæõåæåææååææåææåæåäýåäååäýåäååäýåäååùäååääåääåþäååäåþäååäþåä äãäþãääãäúãäãäãääúãäããäã~ãýâãââùãââãâãââã÷âãââããâãââãüâããââüãâãââõãââããâãââãââþáââúáââááââþáââüáâáââüáâáââþáââþáââáâùáââáâáââûáâáàááþàááþàááþàááþàááþàáá€àýßàßßàßùàßàßààßßþàßßàßàøßàßààßàßßàýßàßßðàßààßàßàßßÞÞßÞÞßßÞüßÞÞß ßúÞßÞßÞßßÞßÞßÞþßÞÞßÝúÞÝÝÞÝÞÞþÝÞÞþÝÞÞõÝÞÞÝÞÝÞÝÞÝÞÞüÝÞÝÞÞ@ÝÜøÝÜÝÝÜÜÝÜÜþÝÜ ÜþÝÜÜ÷ÝÜÜÝÜÜÝÝÜÜüÝÜÝÜÜüÝÜÝÜCÜþÛÜÜÛÜÛþÜÛÛÜÛÜÛÜÛíÜÛÜÛÛÜÜÛÛÜÜÛÜÛÜÜÛÜÛÛÜýÛÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛùÚÛÛÚÛÚÛÛûÚÛÛÚÛÛøÚÛÚÛÚÛÚÛÛþÚÛÛ?ÚÙ÷ÚÙÚÙÙÚÙÚÙÙÚ ÙþÚÙÙþÚÙÙþÚÙÙÚýÙÚÙÙþÚÙÙûÚÙÙÚÙÙýØÙØØþÙØØýÙØÙÙþØÙÙñØÙÙØØÙØÙØÙØÙØÙØØþÙØØþÙØØÙýØÙØØþÙØAØ× Ø×ØþרØþרØþרØþר Ø×Ø@×Öþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖ×Öþ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×ÖÖÕÕþÖÕÕÖÕþÖÕÕþÖÕÕýÖÕÖÖÕþÖÕÕùÖÕÖÕÕÖÕÕüÖÕÖÕÕþÖÕÕþÔÕÕÔüÕÔÔÕÕþÔÕÕÔÕÔùÕÔÕÔÔÕÔÔøÕÔÕÕÔÕÔÕÕÔÕÔþÕÔoÔþÓÔÔüÓÔÔÓÓþÔÓÓþÔÓÓ÷ÔÓÓÔÓÓÔÔÓÓûÔÓÓÔÓÓþÔÓÓþÔÓÓýÒÓÒÒÓüÒÓÓÒÒíÓÒÓÒÒÓÒÓÓÒÓÓÒÓÓÒÒÓÒÒþÓÒÒÓÒòÓÒÓÓÒÓÒÒÓÒÓÒÓÑÑÒýÑÒÑÑÒÑöÒÑÒÑÑÒÒÑÑÒÒþÑÒÒùÑÒÒÑÒÑÒÒþÑÒÒÑÒ€ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐüÑÐÑÐÐûÑÐÐÑÐÐùÑÐÐÑÐÑÐÐþÑÐÐóÑÐÑÐÐÑÑÐÐÏÐÐÏÏÐÏþÐÏÏÐûÏÐÏÐÏÏÐÏþÐÏÏþÐÏÏÐýÏÐÏÏÐþÏÐÐÎùÏÎÏÏÎÎÏÏöÎÏÎÎÏÏÎÏÎÏÏòÎÏÏÎÏÎÏÏÎÏÏÎÎÏÏÎÏÎÏÎþÍÎÎÍÎþÍÎÎþÍÎÎÍÎüÍÎÍÎ ÎþÍÎÎÍþÎÍ€ÍüÌÍÍÌÌýÍÌÍÍÌÍþÌÍÍüÌÍÍÌÌÍÌÍÌìÍÌÍÍÌÌÍÌÍÌÌÍÌÌÍÌÍÌÍÌÌËÌûËÌËËÌÌþËÌÌËÌ÷ËÌÌËÌËÌÌËËÌüËÌËÌÌüËÌËÌÌùËÌËÌËÌËËþÊËËüÊËÊËËþÊËËûÊËËÊËËÊËþÊËËþÊËËþÊËËþÊËËÊË@ÊÉÊÉþÊÉÉþÊÉÉÊÉùÊÉÉÊÉÊÉÉþÊÉÉûÊÉÉÊÉÉþÊÉÉþÊÉEÉýÈÉÈÈÉÈÉÈøÉÈÉÈÈÉÉÈÈÉÈûÉÈÉÉÈÈÉÈÉÈþÉÈÈÉÈþÇÈÈþÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈùÇÈÇÈÇÇÈÈ@ÇýÆÇÆÆþÇÆÆüÇÆÇÆÆûÇÆÇÇÆÆÇÆþÇÆYÆÿ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕ,çýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæþçææþçææüçæçææçæùçææççÍåþæååæåþæååæýåæååæåþæååûæåæÍ÷äåääåäåäååäåäåúäåäååääýåäååúäåääÍäùãäãääãääþãääþãä äþãääãäãþÍ.ãþÍ.ãþÍâûãâããââãâãâøãâããââãââúãâãâãâ âþÍáþâááûâáââááâþáââ÷áâáââáâáââáûâáâÍáúàáàáàá áýàáààöáàááàááààá áûàááÍ.àþÍ.àþÍßûàßàßààùßààßààßßþàßßùàßàßàßààßþàßßþÍþÞßßûÞßÞÞßßüÞßÞßßþÞßßÞ÷ßÞßÞßÞßßÞÞßùÞßÞÞßÍÞþÝÞÞúÝÞÝÞÝÞÞüÝÞÝÞÞþÍþÜÝ,ÝþÍýÜÝÜÜÝÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜýÝÍ.ÜþÍÜÛÜþÛÜÜöÛÜÛÜÜÛÜÛÜÛÛþÜÛÛÜùÛÜÛÜÛÍÛþÚÛÛüÚÛÚÛÛþÚÛÛÚÛþÚÛ ÛûÚÛÚÍ.ÚþÍÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙÚûÙÚÙÙÚÚýÙÚÙÙüÚÙÍØÙØõÙØØÙØØÙÙØØÙÙúØÙØØÙØØöÙØÙÙØØÙØÙØØÙØýÙÍ.ØþÍרöרר×רØ×ØØûרØ×ØØþרØüררØþÍ.×þÍÖþ×ÖÖü×Ö×ÖÖþ×ÖÖþ×ÖÖû×Ö××ÖÖ×Öü×Ö×ÖÖû×ÖÖÍÖÕûÖÕÕÖÕÕüÖÕÖÕÕþÖÕÕþÖÕÕõÖÕÖÕÖÖÕÕÖÖÕÕûÖÕÕÍöÕÔÕÔÔÕÕÔÕÔÔÕÔùÕÔÕÕÔÕÔÔÕÔÕÔÕøÔÕÔÕÔÕÍ.ÔþÍ.ÔþÍÓþÔÓÓþÔÓÓûÔÓÓÔÓÓùÔÓÓÔÓÔÓÓÔÓûÔÓÓÍûÓÒÒÓÒÒüÓÒÓÒÒùÓÒÓÒÓÓÒÒÓýÒÓÒÒþÓÒÒþÍþÒÑÑÒýÑÒÑÑíÒÑÒÒÑÑÒÒÑÑÒÒÑÒÑÑÒÒÑÑÒþÑÒÒûÑÒÑÍ.ÑþÍ.ÑþÍýÐÑÐÐüÑÐÑÐ ÐùÑÐÑÐÐÑÐÐøÑÐÐÑÐÐÑÐÐþÍÐùÏÐÐÏÏÐÏÏÐÏÐþÏÐÐÏþÐÏÏþÐÏÏúÐÏÐÏÍþÏÎÎÏûÎÏÏÎÏÏüÎÏÎÏ ÏüÎÏÏÎÎúÏÎÏÎÎÏÏþÍüÎÍÍÎÎûÍÎÍÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎÍüÎÍÍ/Í/ÍüÌÍÌÍÍÌüÍÌÌÍÍÌþÍÌÌýÍÌÍÍýÌÍÌÌøÍÌÍÌÌÍÍÌûËÌËËÌÌþËÌÌËÌùËÌÌËÌÌËËÌûËÌËÌËËüÌËÍËúÊËÊËÊËËúÊËÊËÊËËþÊËËüÊËÍ.ÊþÍÉûÊÉÊÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉüÊÉÊÉÉþÍ.ÉþÍúÈÉÈÉÈÉÉþÈÉÉÈÉüÈÉÉÈÈÉÈÉùÈÉÈÉÈÉÈÈÉúÈÉÈÉÍÈüÇÈÇÈÈüÇÈÇÈÈÇÈÇÈÇÈþÇÈÈùÇÈÈÇÈÍ.ÇþÍÆþÇÆ ÆûÇÆÆÇÆÆþÇÆÆüÇÆÇÆÆþÍ.ÆþÍ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕçþæççýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæçæþçææþçæ æùçæçææçæ æçþÍúåæååæååæúåæåææååæåþæååþæååöæåæååæåæÍþäååûäååäååýäåääåòäåäåäåääååääåääåäåüäåÍäþãääþãääùãäããäãääþãääþãääûãääÍ.ãþÍ.ãþÍâúãâãâãââãâûãââãââþãââãâüãâÍâá÷âááââáââááûâáâáââþáââöáâáâááâááââûáââÍýáàááàáüàáàááþàááàáþàááþàááþÍ.àþÍ.àþÍßà ßþàßßàßàßôàßàßßààßßàÍÞßûÞßßÞßßÞßÞßðÞßÞßÞßÞÞßÞÞßÞßÞßßþÍ ÞþÝÞÞúÝÞÝÞÝÞÞþÝÞÞþÝÞÞþÍÝþÜÝÝþÍ ÜþÝÜÜþÝÜÜÝùÜÝÜÜÝÝÜÜþÝÜÜþÍ.ÜþÍÜÛÜþÛÜÜþÛÜÜýÛÜÛÛÜÛõÜÛÛÜÛÜÛÜÜÛÜÜüÛÜÍÛþÚÛÛþÚÛÛþÚÛÛ÷ÚÛÛÚÛÛÚÚÛ ÛþÍ.ÚþÍÙüÚÙÚÙÙþÚÙÙþÚÙÙÚÙþÚÙÙþÚÙÙþÚÙÙýÚÍøÙØØÙØØÙØØ÷ÙØÙØÙØÙÙØØÙøØÙØØÙØÙØØÙØþÍ.ØþÍüררØþרØþרØýר××ýØÍ.×þÍÖþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖþ×ÖÖþ×ÖÖü×Ö×ÖÖþÍøÖÕÕÖÕÖÕÖÖÕðÖÕÖÕÕÖÖÕÕÖÕÖÕÖÕÖÖÕÖúÕÖÕÖÕÖÖÕýÖÍÖÔÕÔÕÔÕÔÕÕÔÔÕÔÕÔÕÕÔÔÕÕÔÕÕÔÕÕÔÔÕÔÕÔÕÔÕÔÔÕÔÕÔÔüÕÔÍ.ÔþÍ-ÔýÓÍÔýÓÔÓÓþÔÓÓùÔÓÔÓÔÔÓÓûÔÓÓÔÓÓþÔÓÓýÔÍùÒÓÒÓÒÒÓÓÒ÷ÓÒÓÓÒÓÒÓÒÒþÓÒÒÓûÒÓÓÍúÑÒÒÑÑÒÒÑÒÑøÒÑÒÑÒÒÑÒÒþÑÒÒÑúÒÑÒÑÑÒÒûÑÒÒÍ.ÑþÍ.ÑþÍÐÑÐÑøÐÑÐÐÑÐÑÐÐþÑÐÐüÑÐÍþÐÏÏûÐÏÐÐÏÏþÐÏÏïÐÏÏÐÏÐÐÏÏÐÐÏÐÏÏÐÏÏûÐÏÐÍþÏÎÎÏÎÏúÎÏÏÎÏÎÎÏýÎÏÎÎþÏÎÎÏÎûÏÎÏÍÎþÍÎÎþÍÎÎþÍÎÎûÍÎÍÍÎÎþÍÎ ÎþÍ/Í/ÍþÍÌÌøÍÌÍÌÍÌÍÌÌþÍÌÌóÍÌÌÍÌÍÌÌÍÍÌÌÍÍþÌÍÍûÌÍÌÍÌÌþÍÌöËÌÌËÌËËÌËÌÌúËÌÌËËÌÌËýÌËÌÌþËÌÌüËÌÍ ËÊ ËÊüËÊÊËËþÊËËþÍ.ÊþÍÉþÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉÊÉüÊÉÍ.ÉþÍÉñÈÉÈÉÈÈÉÈÉÈÉÉÈÉÈÈÉþÈÉÉüÈÉÈÉÉÈÉüÈÉÍûÇÈÈÇÈÈÇÈþÇÈÈþÇÈÈÇÈþÇÈÈþÇÈÈþÍ.ÇþÍ ÆûÇÆÇÇÆÆþÇÆÆþÇÆÆþÍ.ÆþÍ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕ,çýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæþçæ æþçæ æüçæçææþÍåþæååþæååæåûæåææååþæååöæåææååæååææýåÍüäåäååûäåäåääåþäååäåäåûäåäÍäã äþãääþãääãäüãäãääùãäãääÍ.ãþÍ.ãþÍâ÷ãâãâãââãââüãâãââãþâããýâãââãþÍúáâáâáââþáââþáââáâ÷áâáâááâáââòáââáâáâáââáâÍáùàááàáàááüàáàááþàááþàááàýáÍ.àþÍ.àþÍþàßßþàßßýàßààßàßàøßàßßàßàßßàßýàÍßþÞßßþÞßßþÞßßùÞßßÞßÞßßÞßÞßøÞßÞßÞßÍÞþÝÞÞûÝÞÝÝÞÞþÝÞÞþÝÞ ÞþÍ.ÝþÍþÝÜÜþÝÜ ÜÝÜÝöÜÝÜÜÝÝÜÜÝÜÜüÝÜÍ.ÜþÍüÜÛÛÜÜöÛÜÛÜÜÛÜÜÛÜÜÛ÷ÜÛÜÛÜÛÛÜÛÛþÜÛÛüÜÛÛÜÜþÍÛþÚÛÛþÚÛÛÚÛüÚÛÛÚÚÛþÚÛÛüÚÛÚÛÛþÍÚþÙÚÚþÍÙþÚÙÙüÚÙÚÙÙùÚÙÙÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÍØþÙØØòÙØÙØÙÙØØÙØÙÙØÙÙØûÙØÙÙØØöÙØÙØØÙØÙØÙÙýØÍ.ØþÍ Øþר ØþרØþרØüררØþÍ.×þÍÖþ×ÖÖô×Ö×Ö×ÖÖ××Ö×ÖÖþ×ÖÖü×Ö×ÖÖü×Ö×ÖÖþÍãÕÖÕÖÖÕÕÖÕÖÕÕÖÕÖÕÕÖÕÕÖÖÕÖÖÕÕÖÕÕÖýÕÖÕÕøÖÕÕÖÖÕÍþÕÔÔþÕÔÔýÕÔÕÕþÔÕÕöÔÕÕÔÕÕÔÕÔÕÕþÔÕÕþÔÕÕýÔÍ.ÔþÍ.ÔþÍÓüÔÓÔÓÓÔ÷ÓÔÓÔÔÓÓÔÓ ÓûÔÓÓÔÓÓþÍÒþÓÒÒüÓÒÓÒÒÓÒñÓÒÒÓÓÒÒÓÒÒÓÒÒÓÒÒûÓÒÒÍòÒÑÑÒÑÒÒÑÒÒÑÒÑÒÒÑÒÑøÒÑÒÒÑÒÒÑÑÒÑÒþÍ.ÑþÍ.ÑþÍÐþÑÐÐúÑÐÑÐÑÐÐþÍÏüÐÏÐÏÏÐÏÐÏÐÏÐÏþÐÏÏþÐÏÏúÐÏÐÏÍÎøÏÎÎÏÏÎÏÎÎýÏÎÏÏüÎÏÏÎÎÏüÎÏÎÏÏÎúÏÎÏÏÎÏÏþÍ ÎþÍÎÎüÍÎÍÎÎþÍÎ ÎÍ/Í/ÍþÍÌÌþÍÌÌþÍÌÌþÍÌÌþÍÌÌèÍÌÍÍÌÍÌÍÌÌÍÌÌÍÍÌÍÌÌÍÌÌÍþËÌÌøËÌÌËÌÌËÌÌûËÌÌËÌÌ÷ËÌÌËÌÌËËÌÌóËÌËËÌËÌËËÌÌÍËþÊËËøÊËÊËËÊÊËËþÊËËÊýËÊËËùÊËÊËËÍ.ÊþÍÉþÊÉÉùÊÉÉÊÉÊÉÉÊÉûÊÉÉÊÉÉþÊÉÉüÊÉÍ.ÉþÍýÉÈÉÉÈþÉÈÈÉþÈÉÉûÈÉÉÈÉÉüÈÉÈÉÉüÈÉÈÉÉÈþÍÈûÇÈÈÇÈÈÇÈúÇÈÇÈÇÈÈÇÈûÇÈÈÇÈÈþÍ.ÇþÍÆÇÆþÇÆ ÆÇÆûÇÆÆÇÆ ÆþÍ.ÆþÍ)ÿýùG,ÿþ-ÿþ.ÿ.ÿþG.ÿþù/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿþÍÆÆþÅÆ ÆþÅÆÆÅýÆÅÆÆúÅÆÅÆÆÅÅÆÅýÆÅÆÆþÅÆÆÅþÍÅÅþÄÅÅþÄÅÅþÄÅÅüÄÅÄÅÅýÄÅþÍÄ9ÄýÍÄÃÃþÄÃÃþÄÃÃÄÃþÄÃÃÄÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄòÍÂÃÃÂÂÃÂÃÃÂÃÃÂÂÃúÂÃÂÃÃÂÂÃþÂÃÃÂÃÂýÃÂÃÃÂöÃÂÃÂÃÂÃÂÃýÍÅÂ8ÂýÍÊÂÂþÁÂÂþÁ ÂþÁÂÂþÁÂÂÁÂüÁÂÁÂÂÁüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ3ÁþÇÍ5ÍïÍÆÆÅÆÆÅÆÆÅÅÆÅÆÅÅÆÆÅ ÆþÅÆÆúÅÆÅÆÅÆÆöÅÆÅÆÆÅÆÅÆÅÅþÍÅÅøÄÅÅÄÅÅÄÅÅûÄÅÅÄÅÅþÄÅÅþÄÅÅúÄÅÅÄÄÅÅþÄÅÅûÄÅÅÄþÍÄ9ÄýÍÄÃÃÄÃþÄÃÃûÄÃÃÄÃÃÄÃûÄÃÃÄÃÃûÄÃÃÄÃÃüÍÂÂÃÃÂýÃÂÃÃÂþÃÂÂöÃÂÃÂÂÃÂÂÃÂÂÃøÂÃÃÂÂÃÃÂÂöÃÂÃÂÂÃÃÂÃÂÂýÍÄÂ8ÂüÍÉÁÂÂÁýÂÁÂÂôÁÂÂÁÂÂÁÂÁÂÁÂÂþÁÂÂúÁÂÂÁÁÂÂÁÂüÁÂÂüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ)ÁþÀÁÁþÇÍ5ÍúÍÆÆÅÅÆÆöÅÆÅÆÅÅÆÅÅÆÆúÅÆÅÆÅÆ ÆÅüÆÅÅÆÆÅÆúÅÆÆÅÅþÍÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅ ÅþÄÅÅúÄÅÄÅÄÅÅüÍÄÃÄ7ÄýÍÃÄÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃõÍÂÃÃÂÃÂÃÂÃÂÂÃÂÃÂþÃÂÂÃüÂÃÃÂÂÃÂ÷ÃÂÂÃÂÂÃÃÂÂúÃÂÂÃÃýÍÄÂ8ÂýÍÊ ÂþÁÂÂÁ ÂþÁÂÂþÁÂÂÁÂþÁÂÂüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ3ÁþÇÍ5Í;ÿ;ÿ;ÿ;ÿ;ÿ;ÿþùÿ9ÿþGÿ9ÿ:ÿþÿ8ÿþÿ7ÿýGùÿ4ÿÆýÅÆÅÅäÆÅÅÆÆÅÆÆÅÅÆÅÅÆÅÅÆÆÅÆÅÆÆÅÆÆÅÆÆþÅÆÆÅÆûÅÆÆÅÆÆÅÆÅÄøÅÄÅÄÅÄÄÅÅüÄÅÄÅÅþÄÅÅùÄÅÅÄÅÅÄ>ÄÃþÄÃÃøÄÃÃÄÄÃÄà ÃþÄÃÃþÄà ÃþÄÃÃþÄÃÃÂýÃÂÃÃÂþÃÂÂàÃÂÃÂÃÂÃÂÂÃÃÂÃÃÂÃÂÂÃÃÂÃÃÂÃÃÂÃÃÂÂÃÃÂÃýÂÃÂDÂþÁÂÂþÁ ÂþÁÂÂûÁÂÂÁÂÂêÁÂÂÁÂÁÂÁÂÁÂÂÁÂÂÁÂÁÁÂÁÂÂþÁÂÂýÁÂÁ¿ÁþÀÁ=Á?ÍøÅÆÅÆÆÅÆÅÅùÆÅÅÆÅÅÆÆüÅÆÅÆÆûÅÆÅÅÆÆÅýÆÅÆÆÅðÆÅÆÅÆÆÅÆÆÅÅÆÆÅÆÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅÄ Å÷ÄÅÅÄÅÅÄÅÄ?ÄÃþÄÃÃþÄÃÃþÄÃÃøÄÃÄÄÃÃÄÃÃÄøÃÄÃÄÃÃÄà ÃþÄÃÃÂýÃÂÃÃÂüÃÂÃÂÂÃúÂÃÃÂÃÂÂþÃÂÂúÃÂÃÂÂÃÃïÂÃÂÂÃÂÃÂÂÃÂÃÂÃÂÂÃÃýÂÃÂCÂþÁÂÂþÁÂÂÁÂþÁÂÂþÁÂÂþÁ ÂûÁÂÂÁÂÂÁÂÁþÀÁàÁ?ÍþÅÆÆÅÆÅõÆÅÆÅÆÆÅÅÆÅÆÆðÅÆÅÅÆÆÅÅÆÅÆÆÅÆÅÆÆûÅÆÅÅÆÆöÅÆÆÅÅÆÆÅÆÅ ÅþÄÅÅøÄÅÅÄÅÅÄÅÅþÄÅÅþÄÅÅÄÅþÄÅÅþÄÅÅþÄÅÅ?Ä ÃÄ ÃÄûÃÄÃÄÃÃþÄÃÃÄÃüÄÃÄÃÃýÂÃÂÂûÃÂÂÃÂÂþÃÂÂÃÂÃÂÃÂÃûÂÃÂÃÂÂþÃÂÂúÃÂÂÃÃÂÂüÃÂÃÂCÂþÁÂÂþÁÂÂþÁÂÂþÁÂÂþÁÂÂûÁÂÁÁÂÂþÁÂÂÁþÀÁsÁþÀÁÁþÀÁ]Á?ÍÿýÅÆÅÅÆöÅÆÅÆÅÆÆÅÆÅÅÆþÅÆÆþÅÆÆøÅÆÆÅÆÆÅÆÆÅÆþÅÆÆÅÆÄÅûÄÅÄÄÅÅþÄÅÅþÄÅÅÄýÅÄÅÅþÄÅÅþÄÅ Å?ÄÃþÄÃÃÄýÃÄÃÃþÄÃÃþÄà ÃÂýÃÂÃÃÂÃÂÃÂðÃÂÃÂÃÂÂÃÂÂÃÃÂÃÃÂÂþÃÂÂþÃÂÂÃýÂÃÂÂþÃÂHÂþÁÂÂþÁÂÂþÁÂÂüÁÂÂÁÁÂýÁÂÁÁ?ÍøÆÅÆÅÅÆÆÅÅÆýÅÆÅÅÆüÅÆÅÆÆÅÆÅýÆÅÆÆüÅÆÆÅÅÆþÅÆÆþÄÅÅþÄÅÅÄ÷ÅÄÅÄÅÅÄÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅÄ ÅýÄÅÄ>ÄÃþÄÃÃþÄà ÃÄÃþÄÃÃþÄÃÃþÄÃÃÂÃÂøÃÂÃÂÂÃÃÂÂþÃÂÂüÃÂÃÂÂþÃÂÂÃþÂÃÃýÂÃÂÂöÃÂÂÃÃÂÂÃÃÂBÂûÁÂÂÁÂÂÁÂÁÂôÁÂÂÁÂÁÂÂÁÂÁÂÂûÁÂÁÁÂÂÁÂÁ?ÍÅÆæÅÆÅÅÆÅÆÆÅÅÆÆÅÆÆÅÆÆÅÆÆÅÅÆÅÆÆþÅÆÆþÅÆÆÅÆüÅÆÆÅÅ÷ÆÅÆÅÅÄÅÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅÄÅþÄÅÅ?ÄÃúÄÃÄÃÄà ÃþÄÃÃþÄà ÃþÄÃÃÄÃþÄÃÃùÄÃÄÃÃÄÂÂÃÂÃÂÃÂ÷ÃÂÃÂÃÃÂÃÂÂÃýÂÃÂÂþÃÂÂõÃÂÃÂÂÃÃÂÃÃÂÂþÃÂÂÃýÂÃÂ?ÂõÁÂÂÁÂÂÁÂÁÁÂÂþÁÂÂÁÂÁÂüÁÂÁÂÂþÁÂÂþÁÂÂûÁÂÂÁÂÂ÷ÁÂÁÂÂÁÂÂÁpÁþÀÁŒÁ?ÍÿÆûÅÆÅÆÅÅÆÅÆøÅÆÆÅÆÅÅÆÆÅþÆÅÅþÆÅÅÆëÅÆÆÅÆÅÅÆÅÆÅÆÅÅÆÅÅÄÅÄÅÅúÄÅÅÄÄÅÅþÄÅÅÄÅþÄÅÅ@Ä ÃþÄÃÃÄÃþÄÃÃþÄÃÃûÄÃÃÄÃÃÄÃÄüÃÄÄÃÃùÄÃÃÂÃÃÂÂýÃÂÃÃÂÃÂÃÂþÃÂÂýÃÂÃÃÂþÃÂÂöÃÂÂÃÂÂÃÂÃÂÂþÃÂPÂþÁÂÂôÁÂÁÁÂÁÂÁÂÂÁÂÂþÁÂÂþÁÂÂþÁÂÂêÁþÀÁ ÁþÀÁÁ?ÍÆýÅÆÅÅÆþÅÆÆÅÆÅÆûÅÆÆÅÆÆÅþÆÅÅÆûÅÆÆÅÆÆÅÆÅþÄÅÅûÄÅÅÄÅÅþÄÅÅÄÅþÄÅ ÅûÄÅÄÄÅÅÄùÅÄÄÅÅÄÅÅ?ÄÃþÄÃÃôÄÃÄÃÃÄÃÃÄÃÄÃÃþÄà ÃþÄÃÃüÄÃÄÃÃüÄÃÄÃÃþÄÃÃÂÃÂÃýÂÃÂÂùÃÂÂÃÂÃÂÂÃÂÃõÂÃÂÃÃÂÂÃÃÂÃÃÂÃýÂÃÂBÂÁÂþÁÂÂþÁÂÂüÁÂÁÂÂþÁÂÂþÁÂÂÁÂþÁÂÂúÁÂÂÁÁÂÂüÁÂÂÁÿÁ?ÍÆüÅÆÅÆÆÅÆøÅÆÅÆÅÆÅÆÆþÅÆÆùÅÆÅÅÆÅÆÆùÅÆÅÆÆÅÆÆûÅÆÅÅÆÆýÅÆÅÅüÄÅÄÅÅÄÅÄÅÄÅþÄÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅüÄÅÅÄ>ÄÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃÄÃøÄÃÃÂÃÂÃÂÂþÃÂÂþÃÂÂüÃÂÂÃÃÂÃýÂÃÂÂõÃÂÂÃÃÂÃÂÂÃÂÂÃþÂÃÃÂþÃÂTÂÁÂüÁÂÁÂÂþÁÂÂþÁÂÂþÁÂÂúÁÂÂÁÁ Â–ÁþÀÁgÁ?ÍÿÆþÅÆÆüÅÆÆÅÅÆÅÆýÅÆÅÅýÆÅÆÆÅÆÅüÆÅÅÆÆþÅÆÆÅÆÅþÄÅ ÅþÄÅÅ÷ÄÅÅÄÄÅÅÄÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅùÄÅÅÄÄÅÄ>ÄýÃÄà ÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄà ÃþÄÃÃõÂÃÃÂÃÂÃÃÂÃÂÂþÃÂÂüÃÂÃÂÂþÃÂÂ÷ÃÂÂÃÃÂÃÃÂÂÃûÂÃÂÃÂJÂÁýÂÁÂÂþÁÂÂþÁÂÂüÁÂÁÂÂþÁÂÂùÁÂÂÁÂÁÂÂôÁÂÁÂÂÁÂÁÂÂÀÁæÁþÀÁÁ?ÍýÆÅÆÆüÅÆÅÆÆÅÆÅøÆÅÅÆÅÆÅÆÆøÅÆÅÆÅÅÆÅÅÆüÅÆÅÆÆÅÆ÷ÅÆÆÅÆÅÅÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅ?ÄÃóÄÃÄÃÃÄÃÃÄÃÃÄÃÃüÄÃÄÃÃÄÃÄÃûÄÃÃÄÃÃÄÃþÄÃÃøÂÃÂÂÃÂÃÂÂüÃÂÃÂÂþÃÂÂÃöÂÃÂÂÃÂÃÂÂÃÃòÂÃÂÃÂÃÂÂÃÂÂÃÂÃÃÂÃýÂÃÂÂþÃÂWÂþÁÂÂþÁÂÂþÁÂÂÁ?ÍÅÆþÅÆÆþÅÆÆíÅÆÆÅÆÅÅÆÅÆÆÅÆÅÆÅÆÅÆÆþÅÆÆÅÆýÅÆÅÅÆÅÆýÅÆÅÅþÄÅÅþÄÅ ÅÄýÅÄÅ ÅûÄÅÄÄÅÅþÄÅÅÄÅ@ÄÃþÄÃÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃÄûÃÂÃÂÃÃÂþÃÂÂÃýÂÃÂÂûÃÂÂÃÂÂÃúÂÃÂÂÃÂÂþÃÂÂÃÂüÃÂÃÂBÂÁÂüÁÂÁÂÂÁÂþÁÂÂÁÂûÁÂÂÁÂÂþÁ ÂÁ?ÍÿýÆÅÆÆùÅÆÆÅÆÅÆÆÅÆúÅÆÆÅÅÆÆýÅÆÅÅÆÅúÆÅÆÅÅÆÆþÅÆÆþÅÆÆöÅÆÅÆÆÄÄÅÄÅÅþÄÅ ÅúÄÅÄÅÄÅÅùÄÅÅÄÅÄÅÅÄÅÄùÅÄÅÄÅÄÅÅüÄÅÅÄ?Ä ÃþÄÃÃÄÃÄÃþÄÃÃÄÃþÄÃÃÂÃÂÃÂþÃÂÂþÃÂÂýÃÂÃÃÂÃøÂÃÂÃÂÃÃÂÂüÃÂÃÂÂþÃÂÂþÃÂ@ÂûÁÂÂÁÂÂþÁÂÂþÁÂÂûÁÂÂÁÂÂúÁÂÂÁÁÂÂþÁÂÂþÁÂÂþÁÂÂÁÁþÀÁ<Á?ÍÅÆÅÆþÅÆÆÅòÆÅÅÆÆÅÆÅÆÅÆÅÆÅÅÆÅúÆÅÆÅÆÅÅÆþÅÆÆÅþÄÅÅþÄÅÅþÄÅÅøÄÅÅÄÄÅÄÅÅüÄÅÅÄÄÅþÄÅÅÄÅþÄÅÅÄþÃÄÄÃÄÃûÄÃÃÄÃÃüÄÃÄÃÃöÄÃÃÄÃÄÃÃÄÃÃøÄÃÃÄÃÃÄÃÃüÄÃÄÃÃÄÂÃúÂÃÃÂÃÂÂüÃÂÃÂÂþÃÂÂþÃÂÂÃÂÃÂñÃÂÃÂÂÃÂÂÃÂÂÃÂÃÂÂÃDÂþÁÂÂþÁÂÂÁ ÂþÁÂÂÁÂûÁÂÂÁÂÂ~ÁþÀÁ€Á?ÍÆÅüÆÅÅÆÆêÅÆÆÅÅÆÅÅÆÆÅÆÆÅÅÆÅÅÆÆÅÆÆÅÆþÅÆÆöÅÆÅÅÆÆÅÆÅÆÆýÅÄÅÅþÄÅÅþÄÅ ÅöÄÅÄÅÄÅÅÄÄÅÅÄÅþÄÅÅ2ÄþÃÄ ÄÃþÄÃÃüÄÃÄÃÃúÄÃÃÄÄÃÃüÄÃÄÃÃÄÃþÄà ÃüÄÃÄÃÃþÂÃÃÂÃþÂÃÃùÂÃÃÂÃÂÃÃþÂÃÃÂüÃÂÂÃÃÂÃÂüÃÂÂÃÃAÂÁýÂÁ ÂûÁÂÁÁÂÂþÁÂÂùÁÂÂÁÂÁÂÂÁ ÂþÁÂÂþÁÂÂÁ?ÍÿøÆÅÅÆÆÅÅÆÆÅÆþÅÆÆûÅÆÆÅÆÆûÅÆÅÆÅÅþÆÅÅøÆÅÆÆÅÆÅÆÆÅñÆÅÆÆÅÆÆÅÆÅÅÄÅÄÅ ÅþÄÅÅÄÅûÄÅÅÄÅÅþÄÅÅüÄÅÄÅÅÄþÅÄ>ÄÃüÄÃÄà ÃüÄÃÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃ÷ÄÃÄÃÄÄÃÄÃÃþÄÃÃüÂÃÂÃÃÂÃýÂÃÂÂøÃÂÂÃÂÂÃÂÂÃþÂÃÃÂÃýÂÃÂÂÃÂÃFÂþÁÂÂþÁÂÂþÁÂÂ÷ÁÂÂÁÁÂÁÁÂÂüÁÂÁÂÂÁÂþÁÂÂþÁÂÂÁ?ÍûÅÆÆÅÆÆÅÆøÅÆÅÆÆÅÅÆÆÅÆÅÆùÅÆÅÆÅÅÆÆùÅÆÅÅÆÅÆÆ÷ÅÆÅÅÆÅÆÄÅÅûÄÅÄÄÅÅþÄÅÅþÄÅÅüÄÅÄÅÅûÄÅÅÄÅÅÄÅýÄÅÄ+ÄþÃÄÄÃþÄÃÃþÄÃÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃÄÃÂþÃÂÂùÃÂÂÃÂÃÂÂõÃÂÂÃÂÂÃÂÂÃÂÂÃþÂÃÃÂÃÂÃûÂÃÂÃÂ@ÂþÁÂÂþÁÂÂòÁÂÁÁÂÂÁÁÂÂÁÂÁÂÂþÁÂÂïÁÂÁÂÁÂÁÂÂÁÁÂÁÂÂÁÂÂûÁÂÂÁÂÂÁþÀÁúÁ?ÍÆùÅÆÅÅÆÅÆÆÅÆøÅÆÅÆÆÅÅÆÆÅ÷ÆÅÆÅÅÆÅÆÅÅøÆÅÆÅÆÆÅÆÆþÅÆÆÅÆøÄÅÄÅÄÅÄÅÅüÄÅÄÅÅþÄÅÅþÄÅÅþÄÅÅôÄÅÅÄÄÅÄÅÅÄÅÄ>ÄÃþÄÃÃûÄÃÃÄÃÃþÄÃÃþÄà ÃúÄÃÄÃÄÃÃþÄÃÃúÄÃÄÃÃÂÂ÷ÃÂÂÃÂÂÃÃÂÂÃÂÃÂùÃÂÃÂÂÃÂÂþÃÂÂþÃÂÂÃôÂÃÂÃÂÃÂÂÃÂÃÂEÂûÁÂÂÁÂÂþÁÂÂúÁÂÂÁÁÂÂüÁÂÁÂÂþÁÂÂüÁÂÂÁnÁþÀÁÁ?ÍÿþÅÆÆÅùÆÅÅÆÆÅÆÆüÅÆÆÅÅÆþÅÆÆþÅÆÆúÅÆÅÅÍÄÅÄÅùÄÅÅÄÅÄÅ ÅÄÅüÄÅÍ.ÄþÍÃüÄÃÄÃÃþÄÃÃûÄÃÄÄÃÃÄÃþÄÃÃûÄÃÃÍÂÃÂþÃÂÂþÃÂÂüÃÂÃÂÂýÃÂÃÃÂÃÂÃøÂÃÂÃÂÃÍ-ÂýÄÍÂüÁÂÁ ÂþÁÂÂüÁÂÁÂÂýÊÍ,ÁüÂÍÇ,ÁÎ*ÁûÂÎÍÕ(ÁúÃÉÍÎÕ*ÍþÇýÅÆÅÅûÆÅÆÅÆÆüÅÆÅÆÆÅüÆÅÆÅÅþÆÅÅÆýÅÍôÅÄÄÅÅÄÅÄÅÅÄÅÅþÄÅÅÄýÅÄÅÅöÄÅÄÅÅÄÅÅÄÅÅþÍ.ÄþÍýÃÄÃÃþÄÃÃþÄÃÃûÄÃÃÄÃÃÄÃþÍõÂÃÂÂÃÂÂÃÂÂÃÃüÂÃÃÂÂùÃÂÂÃÂÃÂÂþÃÂÂþÃÂÂÃûÂÃÃÍ-ÂýÅÍÂüÁÂÁÂÂûÁÂÂÁÂÂþÁÂÂýÊÍ,ÁüÂÍÇ,ÁÎÁþÀÁ!ÁûÂÎÍÕ(ÁúÃÉÍÎÕ*ÍþÇóÆÅÆÅÆÆÅÆÅÆÆÅÆÆÅðÆÅÆÅÆÅÅÆÅÆÅÆÅÅÆÅÅÆÅøÆÅÆÆÅÅÍÅÄüÅÄÅÄÄÅþÄÅÅüÄÅÄÅÅöÄÅÄÅÅÄÅÅÄÅÅýÄÍ.ÄþÍÃþÄÃÃþÄÃÃÄ ÃþÄÃÃûÄÃÃÄÃÃþÍÂþÃÂÂÃÂüÃÂÂÃÃÂÃÂüÃÂÃÂÂþÃÂÂúÃÂÂÃÍ-ÂýÅÍûÂÁÁÂÁÁ÷ÂÁÂÁÂÁÂÁÂÂþÁÂÂüÁÂÁÂÂûÁÂÂÁÂÂþÁÂÂýÊÍ ÁþÀÁÁüÂÍÇÁþÀÁÁþÀÁÁÎ*ÁûÂÎÍÕÁþÀÁÁúÃÉÍÎÕ*ÍþÇ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ.ÿþù.ÿþG.ÿ-ÿþ,ÿþ)ÿýùG€€€€,(–K %stem-1.7.1/docs/_static/buttons/resources/back.xcf0000664000175000017500000001302013157571677022721 0ustar atagaratagar00000000000000gimp xcf filedBB'gimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ‡í< Backÿ     !ÿÿÿþ Dgimp-text-layer((text "Back") (font "Ubuntu Italic") (font-size 27.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.152941 0.152941 0.152941)) (justify left) (box-mode fixed) (box-width 60.000000) (box-height 32.000000) (box-unit pixels) |< <  €'€'€'^üÿä7ü[ÿ§ þÿÿúðصgü˜ÿi þQÿÿýÑüÕÿ, ó‡ÿŽ.qêÿœûþì ü½ÿJü=ÿêüOÿ° ûñÿüÿòüŒÿs ü)ÿÜü5ÿÉ÷4‡Êåøá³Kø6˜ÙôóØŠüÉÿ5úÿÿ~ü_ÿ¥ûÉÿZý °ÿÿþãü˜þÿÿñ© ûó¸ÿûhò•ÿo<†çÿšô8êÿ÷—GXÿ«é³ÿó{$–BCÿº3ßÿìAþËÿÿýàcú îÿ½ü‘ÿrûzÿä&ö€ÿ|eøÿÌ!ýùÿÿýàUûÀÿ³öÉÿ:öý7÷½ÿHŸÿÿ“ü6ÿÆø ,yôþUû>ÿêöùùrÿ¨øõÿÙÿèMülÿ’üQÿÓü–ÿzü:ÿÉü¶ÿNþ7ÿÿýþD ü¢ÿ^üÿ÷üÕÿ-üsÿüäÿøtÿµŠÿô>üØÿ*üÿãüñÿ ü¬ÿXüøÿ÷±ÿquÿò/ûþóüuÿ¯üúÿüïÿ*üôÿõíÿ/”ÿäüDÿÂûVøÿDüàÿWúŒÿÿ üÉÿiô+ÿëËÿÅòzÿœ0d¾ÿÿ‹÷˜ÿìR D¿ÿÿñiÿòa%g¨hÿªû)÷ÿþ°ÿÿýìiýéÿÿûÚ…ÿÿý²ÿÿùò¥ÿgû‰ÿû)þåÿÿù÷êÌ¡\ õ ¢èùÞ‡ &ÿÿòhÈôùà¥Bâÿ%ûïÿ·iÈ0 New Layerÿ     “È0¯øÈ0ËÈØè ýhWVVýUTþXVVýWU*úUZUUTUUûTÇUUúTUUWx)êKMNOPOORUVPLOPPOQSVh(ê`DDFFEFGICDFGFEFHHTýwVUUTé49<==<<==8<<==<==4TTýJTSSTý0122ú3B022ú5LMSTKLûKMSTé%')**(*-.'&(**))+-$GEõD@DEEDDEGEð ! !# !  ö"!=046==þ0ç 48<ü534554ý8<Ú   /0v9)+..-,-/0vþýü&%kký"&&þ%kkýù ô!``Îü%!``û ø ðTTTì&!þIIê%!"!!"$;!#"!"$#$ü >>!æ*)+-,++.0')*,,++,/$22$æ64566557<; 5456556858 &ü?;>??í>?AA9=>??>?ACD%ýCFHH÷GHKgU>EGHHøINVb!þòOQRSRSTVVCNQRRöSUVi$!þþ\XXëWVV[&&$XWXWWVWˆ%%&&$!þëi[\[XWWb--/\Z\ZXXY..--ü/1 û845655ý8<û845655ý8<!þ%''ý96==ú*''96==þ*"þ433õC@DEDDCDGE33õC@DEDDCDGE"ý@?>>ýKJLLûKMTU>>ýKJLLûKMTU"þGIIýJSTTUIýJSTTU%þWUUþwWWVUþWUUþwWWVU'ý^a``ý^a``,ý€lkký€lkk;þqww=ýƒ‚ þfYYXýWVüXYYXXýYW*ûTYWXWWóV¨VWWVWWYz)ñILNQRQQTWXQLOQQûSUXj(ê]CEGGFGHIBEFGGFHIHVýtWXXWVé8:=>>==>>9<=>>=>>5VVüJTTUUVû433433û4C 33ú6MNUVKMüNUVé%)*+*)+./')++**,/%HFõCAEFFEEFHFã ! "$ ! !#">187=>>þ1ç 59=ü845665ý9=Ú   01x9+-//.-.01xþûü'&mmü"(''þ&mmýù ô"aa¿ü&"aaû ø  ðVVVì(!þJJä%"#""#%<!#""#$$% ??!æ+*+.-,,/1(++--,,-0%33$æ84677668=< 5467667979 &ü??@@?@BDE%úDGII÷HILhV=FHIIøJOWc!þòOQSTSTUWWBORSSöTVWj%"þç\XYYXWW\''%WXYXXWX‰&&''%!þëi\]\YXXc..0\[][YYZ//..ü02 û856766ý9=û856766ý9=!ý%)((ü87=>>ù+((87=>>þ+"4õCADFEEDEHF44õCADFEEDEHF"þ@??KþLMMûLNUV??KþLMMûLNUV"ýGIJJýSTUUVJýSTUUV%ùWUVVtWXXWVùWUVVtWXXWV'þbaaþbaa,ý€nmmý€nmm;þ€yy=ýƒ„ ü_VVUUýTSþVUUýVT*úVUTUSTTóSRSTTSTTVv)êJKLOPNNQTUPJMOONPRUg(ê]ACEEDDFHABDEDDEGGSýeUTTSü48:;;ô89:;;:;;2SSûIORSRRSû/11211÷2;/11211ú4BLRSýJIKKûJLRSé#&(*)(*,-!%&))()*,%FDõA?BDCCBCFDñ " ö! ;-45;;þ-ç 369ú5234433ý69á   ./t;(*--,,û./tþúü%$iiý"%%þ$iiýþ ýö ^^Îü$ ^^ü ø  ðSSSæ% þHHê# ! !#2 "! !#"#ü <>í=?A?8<=>>=>@BC%ýBEGGøHJbS:DFGGøINT`!þæMNPQPQSTTGKOQQPRSTg# þþZUUTîY%%#VTTUUTU„$$%%#!ýiXWWðUT_,,.[VWWVVW--,,ü.0 ýû534544ý7;û534544ý7;!þ%&&ü56;<<ù)&&56;<<þ)"þ122õA?CDCCBCFD22õA?CDCCBCFD"þ@==õJIJKKJJLRS==õJIJKKJJLRS"þGHHýIORRSHýIORRS%þQSSýeUTTSþQSSýeUTTS'^^,þ€iiþ€ii;ûqstt<ý|€ ýü ýþ,ìr•’–˜]GŠ”’šŒ1)û&ŽïÿÿøÒg OÂÿÿûó¨5(ë;¢ùÿÿï¤6gÖÿÿþ×q )ü=½ÿÿñì— yèÿÿüÒS)ëZßþÿýÞy &™ôÿÿùº<)ëtÖÿÿüÍe>¥ðÿÿôž:(ë‰æÿÿõÀR J¸üÿÿä'*ò8Ÿóÿÿ÷¦?eËÿÿüÙw)ëH²ÿÿüá˜+"tÝÿÿöÇb *ý.Õÿÿ÷ø¢ sùÿÿýãV,ì'·òÿÿù¯& bÞýÿÿçn+ë 4•òÿýê°G[Ãûÿù×}!,ì#yèÿÿýÃ\F±ýÿÿê—',ìjÕÿÿþ×p2õÿÿó®=,ü YÃÿÿ÷â~!'Œçÿÿü¸P+ë C·ôÿþé˜*wÜÿÿûÍa+ë/œðÿÿó¬?`ÊûÿþÝs,ì$ƒòÿÿùÃNGÃþÿÿî‘,üfãÿÿøë‚+§ÿÿüÌD+÷UsosxK ÷1iqovp(+ýü ýþ'þ $ä   !ç  &è ¨        €€€€d2 stem-1.7.1/docs/_static/buttons/resources/faq.xcf0000664000175000017500000025615613157571677022613 0ustar atagaratagar00000000000000gimp xcf fileôPBœBœUBgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) gamma0.45454999804496765µ ¾XOœÈÊ>FAQÿ     g '@gimp-text-layer$(text "FAQ") (font "FreeSerif") (font-size 50.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 202.000000) (box-height 62.000000) (box-unit pixels) Ê>¹ ¦ ²Ê>Õn † –€€€Àþ þ ý‘Yý[ùÿÿþ* û+ÿÜû&‹ùÿÿþÙÌÌûÎÞðþÿÿþ/ û—ÿÿOþÿÿþJø8öÿÿ4 úôÿÿ¿þ9ÿÿþ ûbÿÿ9 þpÿÿþ/þ ÿÿþ ü¼ÿ> ýÚÿÿþŸþ ÿÿþ ükÿC þIÿÿýøþ ÿÿþ üÿH üµÿÚÿÿþ€þ ÿÿþ ý  ú#ýû'ñÿÿýè þ!þ ÿÿþ úŽÿ«’ÿÿþ` þ™þ ÿÿþ ý& ø ïÿ@(þÿÿþÐ ýùþ ÿÿþ ý]ô üfÿÕþ»ÿÿþA ý`ÿþ ÿÿþ ý›ô üÒÿjþOÿÿþ± ý¤ÿþ ÿÿþ ü åô û?ÿò ýàÿÿýý# ýæÿþ ÿÿþ û—ÿô ü«ÿ”þwÿÿþ‘üÿÿþ ÿÿþohhøm‚šçÿÿô ûûÿ*ý÷ÿÿýòü#ÿÿþ ÿÿþô ü„ÿ¾þŸÿÿþrü7ÿÿþ ÿÿþ¬¨¨ü­ÃÚÿÿþô ûéÿRþ3ÿÿýÞüEÿÿþ ÿÿþ û+¿ÿô û]ÿãþÇÿÿþRü,ÿÿþ ÿÿþ üôô üÉÿ|þ[ÿÿþÃü ÿÿþ ÿÿþ ýªôû6ÿùýèÿÿþ2ýçÿþ ÿÿþ ýnôü¢ÿùØ Øþóÿÿþ£ýÅÿþ ÿÿþ ýnýøÿÿýùý£ÿþ ÿÿþ ü{ÿÖ4 4þÓÿÿþƒýzÿþ ÿÿþ ûâÿq þfÿÿýëýóþ ÿÿþ ûUÿø ý îÿÿþdþ„þ ÿÿþ üÄÿ§ þŒÿÿþÓþþ ÿÿþ û5ÿÿC ý!ýÿÿþD þÿÿþû¬ÿÝþÄÿÿþµ þ(ÿÿþ"û)ýÿþ{ÿÿþ3þDÿÿþ<û®ÿÿZþ2ÿÿþµþÿÿþ˜þUÿÿþ‡ýþÿÿþRûA¤þÿÿûü< ü"}üÿÿû÷d. ü%«ÿÿüð‹6þfÿ ÿþ• þ>ÿÿþ¦ þpÿ ÿþKA€€€Éõ(p‘¨¿Áª“u/1ü‡Üÿÿüã“,ëvïÿÿþÁc0 'Nªùÿÿö… )ýÊÿÿýíBýÅÿÿýÙ#'ý)ßÿÿýØ$ýÿÿýë9%ýêÿÿýÆ ýºÿÿýõ-#ýÇÿÿýþ0 ýõÿÿýÚ"þŽÿÿþ©þ–ÿÿþ¬"þûÿÿýü'ý'þÿÿþ9!ÿþ®þ´ÿÿþ¸!ÿþhþBÿÿþ1 ÿþ%þöÿÿþ~ ÿþâþÚÿÿþ ÿþ«þ½ÿÿýú ÿþ—þŸÿÿþ+ÿþ†þ‚ÿÿþ?ÿþtþeÿÿþTÿþlþQÿÿþaÿþ{þaÿÿþHÿþŠþsÿÿþ)ÿþšþ„ÿÿþ ÿþ±þÿÿþí ÿþåþÙÿÿþÉ ÿþþÿÿþt ÿþSþWÿÿýû ÿþ©þÿÿþ±!þîÿÿýúýùÿÿþI!þyÿÿþþšÿÿþž"ý Éÿÿý÷, ý"ûÿÿýÖ #ý »ÿÿýÔ ýÀÿÿýï-%ý¬ÿÿýÞ9ý!Öÿÿýß)'÷•þÿÿüý<êÿÿýÅ*ò/®þÿÿÛži4$AkÇÿÿüà[-ü.­þÿÿûþ¿^1þ^ÿÿý­5þƒÿÿýþX5ý¦ÿÿýùD5ý—ÿÿýó76ýxþÿÿýøl6ýSÞÿÿý¯5ü`ÙÿÿüëŒ)5ûR›ØÿÿúÅ`?4ôS‡›¬½ÎßãÚ €€€€lllle2XPIconÿ     % _XP ƒXX+X7XCXP ß5TNN$N4NDNTNdNtN„N”TªWŸW¯W¿WÏWßWïWÿX¯ü  ú-ú ý&û õ(å  "%&$! "ã   2F[q‚Ž–—“ˆydN7 í  %Be޵ÕìþÿÿúöÝ»Uè&   6dšÊíÿ ÿýŒ!þ88ï677 32"%,3;CJQX`o|ƒ”®¿ÄÃÆÑâèççéêìëëêÓ°›‹……Ò¿3:`B70(.6>EMT[eu€‚ޤ·¾ÆØççèêëëììéãÊ®­’†…Òw1A.7:,#+19AHOW_hw‚ƒƒ‰š°ÇàêéìîíëéâÖȺ´¸–‡…ÒK7@19='%-3;CKR[bju}‚†‡†‰š½ãêèéèãÛÔɾ¾¼Á—‡…Ñÿ;A{Z+BP4"*3;CKT\dlt|…Ž–¤¬µ¾ÆÐÚâðô÷ùÿÒ˜‰……„††×=B\2ER3#+3BFJNRTVcv~~ö}~s_YWURÝAZs‰hd/C4|šd,$(-27;?CGKMN[r{||}ø~nXQOMKÐ @UryouzHa>†›g1!'+047Þÿ±µÅ¼¶³«©­¯²´·º½ÀŽh(Os—Ðûøöùøøöù÷õíãÿ`Ò̲·Á¶¶°¨©®°³µ¸»¾Âƺf#9cžçÿö÷úú÷÷ôïëçãÿoÒ¹³·¼··¯¨«¯²´¶¸¼¿ÂÇÁ˜kZJ;.(Gœóýö÷øöòñêêèèéÿ_Ñÿ¶·Éº¸·­¨«¯²´¶¹½ÁÃÇÊÐÖÑÈ»¦Œ‡·ñöôôòìòóòóìíÿæ9 Ñÿ´»å»º¶«©¬°²µ·¹½ÁÄÇÊÎÔÙßãéïóëèêíðóòõù÷ôòÿÿl ß¶´¾Æ¸¼µªª­°³¶¹»¾ÁÃÇËÍÏÔØÛÞàçééêð÷÷ù÷úÿÿv  ÑÄ´¿½¸¼´ªª­¯³·¹¼¾ÂÄÈÌÎÐÔÙÝÞàåééíó÷÷ý÷öýÿéVÞ¶À¼¹¼´©ª­°³·¸¼¿ÂÅÊÌÎÑÕÛÝÞáåéìñõûÿÿ÷¥3¸áÁ¼º¾³¨ª­°³·¸¼ÀÂÆËÍÏÒÖÚÝÝàäéîòûÿÿö7ß¶¹Þ·¼¿³¨ª­°³¶¸¼ÀÂÇËÍÏÒÖÚÜßáåìðõýÿÿõÚ³ºÆ¸½Á´§ª­±³¶¸¼ÀÂÆÊÍÏÒÕÚÝÞáåìïòùúÿÿ#ûÚ±º¸º¼Â´§ª­°³¶¹¼¿ÁÅÉÍÏÑÕÚÝßâæêëðöþÿW ûÛ¯¹¢¶»Ã¶§ª­°³¶¹¼¿ÁÄÈÌÍÏÕÚÜßáåèèîùÿ”ý0ܪ·’­¹Å¹¨©­°³µ¸»¿ÂÃÇÊÍÏÔÙÛÝßâçéíÿê:û 7¤ܪ¶Í­·Æ¼©¨¬¯³µ¶º½ÁÃÇÉÎÏÓ×ÚÜÝàåèóÿ‚û @´ñݶ²Î¨³ÆÁ«§«®²´¶¹¼ÀÂÇÉÌÎÑ×ÙÛÜÞääøôM ú G»óäÑÿ®Ì}¯Äů§«®°³¶¹»¾ÁÅÈÊÍÐÕ×ÙÚÝâàüÇ4 D¿òæÞݪƨ§¿Èµ§ª®¯²´·º¼ÀÂÇÈÌÏÒÖ×ÙÝÞáÿ©)÷/­óæßÝݧ¿ ¨¹Ê½©¨¬¯±³·º¼ÀÃÅÆÉÎÒÓÔ×ÚÛáù–$÷ bâéáÝÛÝ ¶™¤²ÉÅ­§ª®°²¶¹º¾ÃÄÅÇÍÐÑÓÖØÚáðŽ$÷€áâÞÛÙÒª­ÐR¦ÃË´¦¨¬°²µ·¹¼ÀÂÃÆÉÎÐÐÓÖÖÝì$"’áÞÛÙ×Ñ m¤Ä¤¡»ÎÀª¨«®°³·¸º½ÁÂÄÇËÌÎÐÓÓÚæ“*  +›àÚÙÖÓå#‰¢·•¯É̲§©¬¯²¶·¸»¿ÂÃÅÇÊÍÏÏîÔÜ­]<:;;:6]³ÙØÕÒÐâ,Ÿª© ® ½Ñ¿ª¨«®°´µ·º½ÀÂÃÅÉËÍÍÏÑÑñÇÁÁÂÁÂÁÊÕÕÓÒÐÏÑ%¤¦Ÿ¾ž±Ì䨩¬¯³´µ¹»½ÀÁÃÅÈÊËÍÎÎÒÓÓÔÖÖ×ÖÏÎÑÐÐÍËÜ+ž¦œ­Š ¾ÒÄ­¨«­°²³¶¹¼½¿ÁÄÄÆÇÉÍѵz][\\÷[YˆÄÐÎËÊÑE›¨¸¡À¡‹¬ÉÔ¼©¨«®°±´·¹»½¿ÂÃÄÄÆËÒš>SµÏËÈÈÜl ª¾”¬³ž·Óд¨ª¬­¯±´¶¹º¼¾ÀÁÂÃÇΘ:÷P²ËÈÆÅч§«Á¥ž»Ÿo¤ÂÖɲ©©¬­¯±´·¸¹»¼¿ÁÁÅËš?U°ÇÅÃÂÑ©«¿¦ª£‚«“°ÊÙÆ°©ª¬®°³µµ·¸¹»¾¾ÂÈ›BX°Å¿¾Ñ„«·Ã±¯ ±—¸Ÿ³ÎÙű©©¬¯±³²´¶·¸»»¾Ä™EZ®Á¾¼ºÐ‚§¶»µ¸» º¤Ã›¸ÒÙDz©¨¬®¯°±³µ¶¸¸»À™G [¬¾º¹¸ù=‘ª­ª§¦¦ÙžŽ¨I¢ºÓÚʶ«¨ª¬®¯±²³µµ¸½—FY©»¸¸µÑswjm{ƒƒ…™¢‰­q£¼ÑÜμ°©©«­®°±±³µ¸^=;=<<99mª¸¶µ³rÿþÔÿÿ2÷ÿççíðïîðïïîûìðõß)ôÿìñîîðïæÿ÷ý÷÷öþ÷õú÷òÿïï%òéïðïïðõÿüÿüõøõõúùôóõôÿÿþõ#ïðíîïîÐÿýùòóññòòóòòþðññôýõû!îÚíîïîàÿùôóññòôôõöùùøø÷÷öôñò þëïïò½ÿøññòóôöùûþþÿÿûþüõñè§yfZOB4$Ôïïð+ÿõóððô÷úýÿÿýùóëRâäàÞßÞßíîïðâøòññó÷üÿÿüþøóé]îþýýþþðíîÞÿöðñôöüþÿÿþÿÿ þÿüýõóü‹ñþýýïîïïõýóðñöúþÿÿþýþÿÿ ýüûõóëXm`®úþýþïîðæùòðóöüþþÿÿþÿþûÿþýýþþýüùõôìš¾®ÅÿþÿñïñòüòòôùýÿþÿÿþÿþÿþüùõôëˆÁ·Ìÿþñïðùùóòõúýþÿÿþÿÿþÿùþüûúùùúúùýÿÿü÷ô¸Ôÿðñðèþóòöúýþýþþÿíþùóîéææåãäåçëòéæõùò{¼·àÿñïðÿõñôûýýþÿ÷ýöìáÚÖÕÓÒÒ÷ÓÒÕÛ¨…©Úñw¹·ÿðïððôòñ÷üüýýþ÷ýÿþøêÛÑÌÊÊóÉÊÊÌÌËÎÉs9FtÝq·´éïðôõñðñòöûüýýþþýþþõßÌÄÄÃÂÃÄÄÃÃÄÄùË´\,)1ül´ÿññõúóòñòññõúüýýþúóÙü¼½½»ºø»ÆœH'*'ùdÿøññÿóóîòññóóõøúýþÿö×»µ·¶µµ²ô³´´±²»‚6#&#÷bÿòñÿýôóòòßóôóôøüþúÞ¹®¯¯®­¬«ª­¶ÁÈÌÊ»±f'"!ÓUñðñÿ÷ôóòòñòóôóóõùüè¾§§¨§¦¥£¤¯Èáðõ÷öòêÊ_!ùÿðòõôóòòüóòóôôðõ÷ê²”¡¢Ÿžšœ®Õöÿÿùû 5Úðññÿòóóñòóòóóôôõ÷øÃ^M–˜–“’£Òüÿÿþþÿÿþÿÿû€)öÿîòòøóôóñóóõâôùö¡4@j‡Š’»óÿþüýþÿÿþþýÿãHøÿðòð÷ôóòòóýòóõõîøí‚#,Su‚™Õÿþüýýÿÿøþüýÿlùÿòòÿõóññóýòôööðøæ~+";e¢ëÿþþÿÿ÷ýüüÿÿvâóòóÿ÷ôòññóôóòôöõõøîºkXF5.L¢öÿÿòþÿþÿþýüþÿÿfáÿõóøùöõóñòóôóòôõö÷øùýÿøìÚÀ —Çüÿÿþûÿÿøþÿÿù?éÿòóÿùõôòññôôóóõöö÷÷øúýÿÿþþÿÿþþÿÿût äÚóôÿ÷öôòñòôôóôõö÷õ÷øø÷ùüýüýÿ ÿú# ôëóôÿ÷õóòòñóôôûõö÷õøø÷úüýûûýþþÿÿøëY øòóóÿöôóòòôþõööøøûýüûûýþÿÿ÷¤5 âöôóÿöõóòñòôôóôõ÷õõøø÷øûüüùùûýÿÿö6âðôÿø÷õóòñòôôóôõöõöøù÷øúüýúùûþÿÿõøñôÿøööôòò÷ôóóôõ÷ö÷øøùúüýüûýÿÿý!ùáðóÿÿööóðòòôóóôô÷öö÷ùøùùûýüûýÿýÿÿüZ ûáïóïýööóññòóôóôõ÷öõ÷ø÷øùûüüúüþüÿÿüšý 6ñôòåùööôññóóôóóööíõøö÷÷úüûüúûþþÿÿí=ü ?³øîóöÿööõòòòóôóòôõöôøöø÷úüüúÿü†úFÃÿÝÿñöÿõööññòóóôóôõõô÷ö÷÷ùüûûøùÿþÿ÷R úNËÿþûÿðõÿööØòñòòóóòôöôõ÷÷ö÷ùüûûùùýýÿÌ9 JÐÿýúÞïõñ÷ööôñòóóòòôõôõõøö÷ùûûùúúûýÿ²-÷4¼ÿÿøúöòõïÿööõññóóþôõõùö÷÷öùûùù÷úûýÿ¦)÷løÿþüüÝìóüÿôööññóòòóõôôõø÷÷öùúúùúùûÿÿ (÷ûþýüûöÿðöÿóö÷óñòòôãöø÷ö÷ùùøùúùýÿ¡)&¦þþüùøõ§ïôï÷÷øõñòòóúõôôõ÷ööèø÷÷øûùþÿ©0 1²ÿüüúùÑ5Õðôîÿø÷öòòññòóõôôõö÷õõööøúù÷úÿÊlFEEDC?mÐýûúùúõBïÿñìô÷ôøõññýòóôôðõö÷õöö÷÷ø÷÷øùõáÓÓõÑÒÑäùüúùøùô8ðÿîóòþõ÷÷óññúõôóôõööõêø÷÷øø÷ùøöõõö÷÷òóùûû÷öôEìÿëñðAõõ÷õòòþñóóúôõ÷öõööø÷ùüÚ“pmnn÷mk¢ëûúö÷èníþýîôðÿóöøôñðòóóòóôôõõööëõööúÿ½LeÜüùöøê¦õþýéñîóòóøøóñòóòñòôóõõöõîùÿ½IcÛûùö÷èËýþüþíóðÿôöù÷òòóñðòóôôóõõöíõùÿÂPjÜúøõõÑÌÿþüþÿðäñúõ÷úõôòòñòóôôóõôôõöõøþÄT"!! oÞú÷öõÛÂþýüýþðòóóøô÷øöôòñòóôôóôóóôõõ÷ýÅX%#$$÷" sßúööôý%Çþþýñîóñõòôøùöóññòòóóôî÷ýÇ])'('(%#vßøöõòûYÚÿþÿÿïïðñíóôøù÷óñóòóóòóóìôòõûÈ]'$&%&$!vß÷õôóå*ª®›ŸµºÁÉÌïèòðñõ÷ú÷ôóòóññòóóîôõùÒ~QNPOONL“äõóôóñ0ì$,49<94,#(é$868=A=ÏâÕšòðäÛÓÌĽµ­¥•…}wrpqspfdeVF80,+,.267B—ØáÔ/µ÷íáÚÑÊû²ª£›’‹„{qibZSKFB=4.*(&%&(+-/d¾ââÔEÈøëáÙÑȹ²ª¡›’‰zqiaZSKC;5/*%! !(Q§ÝäâÔY×÷êáÙÑÈÁ¹±© ™‰xog_XQI@:2+%Q¥ßèäãÔ hãöèß×ÏÈ¿·¯§ —Žˆ€vme_WOG?7/'  W­ãëèåäÔ séöçß×ÏÈ¿·¯§ –ކ~ume]VOG>5-%cºéîêèæåÔzí÷çß×ÏÇ¿·¯§Ÿ–ކ~ume]UNF=4,$ pÊðñíìêçæÔ}îöèß×ÏÈ¿·¯§Ÿ–އ~ume]UNF=5-%}Ø÷õðïîìéìÔ|î÷éß×ÏÈÀ¸¯§ —†€wnf^VNF>7/((…àüùôòñîîðåÔ vìøéáÙÑȺ±©¢š‘‡€yph`XQHA:1*)~Þÿüùöôññóà¥Ú lçøêâÚÒÊú±©£š‘Š‚zqibZSLD<5*(fËûþúùöôôüÙ–\Ô`ÞùìâÚÒÊﳫ£œ“Œ„|skd\VOGA9,H¦ïüúù÷õöõÒ‹SIàNÓûïäÜÔÌľµ­¥ž•އwnha[TLF<7qÏøøöùö÷÷ЃNFPÔ8ÁýñåÝÖÏÇ¿·°¨¡™‘Šƒ{rle_XQL@G’â÷õõöõúÚ‡MENVà!©üôèàØÑʺ³¬¤ž”ކ~voic]WPEW©ëõòò÷÷ïŸTFMUZàˆóøëãÛÔÍŽ¶¯¨ ˜‘Š‚ztnhb\VLe¶íòðð÷úØzLNTY_ÕaáýðæÞ×ÐÉÁ¹²«£œ•‡xrlgb\Tp¼îðîïïúÈqRUZ_dÕ9ÄÿôêâÚÓÌĽ¶¯§Ÿ™”…~ysmic[wÁîðîïðúÂpY]afkÖ•÷ùíäÝÖÏÈÀº³¬¤ž—‘‹†€ztpjc|Àéëéêìô¼t`ehmrÖ]àþñçáÚÓÌľ·°©£—‘‹…{wqlx´´³´µ¸™rhkotx×(¶üöìäÝÖÐÈ»´­§¢œ–‹†‚}yurssrqqpqomorvz~× sëþñèáÚÔËÆÀ¹²¬§¢˜’ŽŠ„~yvtrqppqtwx{}‚†×0¼þøíæßÚÒÌÅ¿¸²­¨¢™”Œ‡ƒŠŸ¬«ª©©«¬—ƒ‚…‰ŒØ lèÿóëåÞ×ÑËž¹³®©¤Ÿ›—“މšÈäååæåæçº‰Œ“Ù$ªüúñéâÜÖÑËÿ¸´¯ª¦¢žš•‘¢ÐìíìííîïÁ–“—šÙLÑÿ÷ðçàÛÖÐËÅ¿ºµ±­¨¥¢™§ÐéêéêêëìÞ˜›Ÿ£äuêÿ÷îæàÛÖÐËÅÁ¼¸´°¬©¥¡­ÒêëêëëùÆ¥ £¦ªÛ šúÿõíæáÜÕÐËÈÿ»·³°¬©µÕêëêêéëìˬ§ª­±Ü0°þþõïèáÜ×ÒÎÊÆÂ¿»¸´±¼Øëìëëêìîϳ¯²µ¹è<·þþöïéâÞÙÔÑÍÉÆÂÀ½¹ÂÜíîîïùÔ»·º¼Àç@µÿÿ÷ñêåßÛÙÕÑÍÊÇÅÁÆØääãååúÓ¿ÂÃÈü;ù 38÷ ª6õ 'ÿù*951,'!).//-fSSTTû_yA5#íHD?:3/+'".424j™TTû_yB6#ìOHB@>90)$!"374/9ÿTTû_yC6#ì_]sˆ’~]7" '::201TTû_xD9#ë|žÅÖßäÞÉ•N#0@;0&UTTû^xE9#ë”Éßäçëñöê²R";D7%TTû_xF9#äšËÖÚÞáæëõî«F +GB0TT_vG;#ä¼ÍÒ×ÛàâèðÞƒ. =L=%TT_tG<#ä‚¥ÃÌÏÕÙÜàäè´M"(LH0T_rH=#ä²ÄÊÎÒÕØÛãÊl(#BQ;S_pI=#䄃–µÃÆËÎÐÔÚу2&.TH* aoJ?#ä…ƒƒ˜±¿ÅÈÉÌÑÏ;($OT5bmK?#…æ‚“«ºÁÃÅÊÉ?+&A[C%dlK?#ä…„ƒ‚œ®·½Á¶y6,$(y`.PB#äšž—†~unf^UME=5,#,}b-PB#ä ¦•ކ}tme]TMD<4,#2a) PB#䬣›’‹…|tld[SLC;3+";…_#QD#ä§Ÿ˜ˆ‚yqjbZRJB:2* I‡[ QD#䣜•Œ…xog`XPH@91([…RQC#ä ™’‰ƒ|umd\VNE>7/&$p€GRB#äš”†xpibZRKC<4,#2„w:RA#䕈‚|tme^XPH@92*Gk+ R@#䑌„}voib[TMF=70'%e\ YR>#ä‹…xqjd^WPIB:3-#6ƒˆKYR:#ã„zsmg`YRLE>71($S–x4ZR;"ã~ytmgb\UNGA:3,#5w–_#ZSC"ãxsnga\WPIC<5/'&S“„AˆZSG"ãqlga\WQLD>81+!;yšg*‰ZSF"ëifa]VQLG?93-%.^—‹Hú‰ZSE-"ãc`ZUOKF@:4.'&N†œi+Q‰ZSG="ã]XSNID?94/(!Cvžƒ@PˆZSH@"íUQLHD>94/)! ;j—•Z÷bRˆ[TH=!âNKFB>93/(!!8dŸr1\ZP‡[THB2!âFC@;72.( :d‹ €?[_Q†[TMJ@!ï?<950+&#>f‹¢‡Gf÷_Q…[TQN<!á851.)"(HlŒ¢‰NVVWUQ„[TIG= á1.)$3UrŽ¢‰N`^_`^…dSC;8 Àþ¥=û ­ ª:ù«ÕŒž£²8£ù¤«¡§ÿ6õ¥¤£§¨°”Ÿ°ÿù$Fm…Ž*§¦î§ªª±^Âÿ„wlho|†ŽŒm)ꫪ©©¨§©­·á«¸…„„……’’„R)ä­¬«ª©¨ªª¬±Áµ´Œ”—˜”‰wz…‰’#ñ°¯®¬«©ªª«­°¼²¶••–—û–Ÿ™…#ù´³°¯®¬««í­®°¸íùµ´²¯¬ª¨¥©·™|#ï¶µ³²°¯­«©«®¯²¾Â´¬¬­ù®¯µÃ {#¸ï¶µ²°°­ª©«¯²µ·µ»¦§§û­·˜{#í¼º¸·´²°°®¬©¬²´³ºÿ̧§û­·™{#ì¾½¹¸·µ²°¯®¬ª­´µ´»²ÿ§§û¬·š|#싼ÍÒÖÕÎö®­«ª±·¶¶ß¯§§û¬·š~#ëJ°çòóôóëÙ¿®¬«ª³¸·º´ª§§û¬·›€#ëHªÝó÷øùûøä¿­­ª¬¶º¶¸–§§û¬·œ€#äN£¾Úòôõ÷üùອ¬©°º¸²É§§¬¶œ‚#ä8‹«»Þòôô÷ùòѲ­©ª¶½¸¶½§§¬µž…#ä `˜§Àèòóôõöä¾­¬¨°½¼¶ß£§¬´ž†#ä3t—§Ñïñðñôëɯ®ª©º¾¸¶¼§¬³ž‡#äAz•·èïìïòîг¯¬¦²¿»²À›­²Ÿ‰#äCtÛîêìîíÕ·°®ª«¾À¸Á¢®± ‰#ä>.C|¡‹\8""&),/05?FGGHøG?521.,ý3FEEåF0;sœyP5" $')+,-.//ø.--+)&!à   / 4b‹¥”nQ<)!$%&&%ù$"ì#!Jv™¥”rZM>- ú#0D[ á 6Wz¬œj`\TJ@931149BMZgmmq!í<9Xv”ª¯ž‡ukhikmm÷nllmv†­"ã& 8M`y”ª¶µ­¢™’’˜¡­µ·ª”|$å, $9IVdr~‡Ž‘’’އ~sgWK=&ç-4Ldy‰‘’‡ydM3(ü"8ð6Vr†‘’„qU5+ë+?Sgy†Ž’‘Œ‚saM9%.ñ6Tm€‹‘ˆ{dJ+ ÔCntpll¡¤—±ˆ¦¹ÏÜÔĶ­©©«­¯¯°²´¬˜ŒŽŒ‹ž±´²±°ÛXxvwwvw¦˜²q ·ÌÛÚÍ¿´­¨©«­­¯¯°±²³³´´³²²°ý®­Ô, ¢£±@¡´ÄÓÝ×ʾ¶°«©©«­®®¯°¯¯°¯®¯­¬ªª¬ë •­£­¼ÌÙÞ×ÊÁ¼·²­ª©¨¨©úª®²ºÃêU ­gš¦´ÀÍÚàÙÏÇÿ»¸µ³³÷¶¸½ÂÆÉÇÊàž¨µd©·ÂÌ×ÞáÛÒÌÉÇÆÈÈÇÉÊÉÈÈÌÓÛà ᔎŸ®s™®®µ¾ÄÍÖßääàÜÙÖÕ×ÚÜàäåß×Ï"ãš—¦¯–ª¤¨­µ¼ÀÆÌÏÒÕÕÖÖÕÓÐÌÇÀ»¹$åz—«±‘pܲ©¬¸¾ÆÏÖ×ÖÖÔÏǾµ©ª¹&犢§¬´¤”¯¶ÁÎרÖÕÓͶª˜Ÿ¤(éuž¦«¯·¿ÆÌÒÔÕÖÔÐËļµ­ª+ì…”œ¨´¾ÈÏÓÕÖÒÍÅ»¯¤—ÿée¤¢¢¡ ñïðñÿõôøùøöôóñðñòòðóôõëϾ½¾½½¾¼ÖïôóóÙ„³®¯°¯°æïíñòóö÷ùúøöôòñòñòòóòóôôóôôõôóôóóýñòå(B1,'"$(óîñòÇ÷ôöøúù÷õôóóññòòóòøóôóòñòòêâðëókþõöøùúù÷öõôóóòññððöñðòññòóôöëªñíôÿþõöõ÷ùúùøöö÷öôôóóò÷õôõö÷øö÷íðéñòÑøôõö÷ùùúúùø÷ö÷÷õõöøø÷÷øùùú ûéîðóÿÿøùö÷õ÷øùúúòùúøøùûúúûûúøø"ûïðññÿÿùùóôõööøøþ÷øøùúø÷ôôø$åãëñòÿÉÿÿùõú÷øûüúøøùúùøöñûÿ&ïäüóòóÿÿöþ÷øýÿüøùúúúøöïïÿ(éìêñïòòóõõ÷ø÷÷øø÷÷öôóññ+ùçîïñóô÷÷øöúõòñîîÿé;¬ûÿúòíçãàÜØÕÒÎÌÉÊÎÑÐÎÎøÏËÇÇÉÌÏß1šïÿüöðìçãÞÜÚ×ÔÓÐÎÍÌËÊÉËÌÌÎÐÒÕ×ì$zÓÿÿúôñìçãáÞÛÙ×ÖÕÔÔøÕÔÖ×ÙÛÝ ðQ©ñÿþùõòîêæãáÞÞÝõÜÛÜÛÜÞßâæê"î+qÀøÿþúöõòïíìéèçææøçéëìïóô#ä7xÀöÿÿýù÷öõôóòòóòñòóôôöøý%ø2e¢Üýÿÿôþúùøùø÷÷øúþÿÿþý'÷ @lšÄèÿÿúþæÁ—g)ê )5?DEEFGGFEC>4( , ‚â)$)Gf|”£…Lry~€~nT;!ä'C^qˆŸž~HUTTSSRPmYSC#ä.Iao~•¦“f9?>>=:<<>FHLA#òio|”¨œ|R#ø #÷‚­Ÿ[9þ2ôª•{[=,3úcP; þ5ü& ý# 6þý%9ü0 :þ~⯭¬«°¼ÆÏØÝÒ¼¡Š¨t¶º½¾¾½Í´¦w!«æ¯¹ÄËÓÛÛϼ¢Šˆ©y©©¨§§¦¤³©¦†#ä²¼ÄÉÏØÞׯµ¢¤‡©}}zwwz~‰‘™„#ñÇÈÍÖÞÚÏ¿«Ž_ˆ©p÷#2B-#òÐÚàÚÏ·¦œ™T¨€1óßÙζ­˜_°¢w2ôž¸ª¥¡ž<©ŠD3ö²©šŒ›„­¦ƒ5øÔ|˜b®¤7ù·°«¥d8ü©¨Ž;þ€>òòóô÷øøú÷ôñõòñäýýùüýÿ¶)4!ïðòòô÷÷øúùøöõÿîñíÿÿûýþÿÍ#äóõõöøúúùöõ÷ÿññ康³±°³»ÂÏÞëÊ#÷ôøúùøõõëüøòà÷(8MfI#òøúûúøö÷øÿòËóï1úõøööûñÏðóòç2ö÷õÿÿø³ñï½3öù÷ðòðÿóôë5øÿÛîÐóóð7ùÿññïëÿ8ü÷ùë;þÿ>ñÒÕ×Ûßæíòùÿö©;0òÙÛàåëðõüÿç”11óáçíñô÷ÿÿÑs#2ôîòõøýÿë¨L3öõ÷ýÿõ¿i(5ÿùñ¾s3 6ùØ `18û< :ýý€€€€,(–K %XPAlternate Iconÿ     2XúXPYœ˜œ¤œ°œ¼XPYz{Ô’’’"’2’B’R’b’r’‚™œœ(œ8œHœXœhœxœˆ«î+Mz™§¯¶º¶®§“oC)*èd—ÀÝëïóö÷øùøõôóîèØ¶‹Y$ôd¥Òëõø÷÷ööõõö÷úøôåɘ!ó"zÃåóøøöôóòñððïðñùóôõ÷÷ò ñpÇëøøöôóñïîíëëêêëøìíïðòôõîWµçùøõóñïíëééçæååääöåææèéêìîðü&íŒÙõøöóðîìéèæäãâáàßßöàááãäåçéëü88ï#µçù÷ôñîëéçäãáßÞÝ ÝùÞßàâäæþñGÄôùõòïìéæäâßÞÝÝÞßÞÝüÞßáódÏöøôðíêçäáßÝÝìÞßßàÜØÔÑÏÎÐÒÕÙÞàßßÞÝÝü($ôlÙù÷óðìèåâßÝÝþÞßßëÍ¥‚iUD618FWk‡®ÔßàßÞÞý:KØYÓù÷óïìèäáÞÝÝÞßßÊ£nC)(4?HQTND:. 'Gu©Ñàßþ3×CË÷÷óïëçãàÝÝÞßßÉI1>Sk‹Ž‘“”’Œ†yaH2)PÒæ%Ç÷÷óïëçãßÝÝÞßÕ—T2Jm„“–—˜˜ò—–••“’Žˆ{_9)WÖ£ïøóïëçãßÝÝßß¼i1Ko†‘’“‘ŽŒŠ‰ˆ‰Š‹ŒŒŠ†{`8䂿ùôðìçãßÝÝßà©R9b}‡ŒŒŠ†€ztrrqörx~ƒ……ƒ}pÔ#ÌøõñíèäàÝÝßÙ“GHl~„‡ˆ…€wno”¥¯·¹²§’yinw}~zãªõ÷óîéåáÝÝß߉3Kq|€€ymt™Ëìùÿÿöøæ·€_luwwî]ÞùôïêæáÞÝÞà BLlv{{øzwp•Þ÷þÿÿ÷þüä—^dmpæ®ööñìèãÞÝÞÞ²OIgptuutsod—üÿ ÿúò¡Y`eåLàùôîéåàÝÝßÇ`>_imnnmlli]nåÿ ÿûåyR[ä¤ô÷ñìçâÞÝÞØw3Ubghhggfec[QÁþÿ ÿûþ³ORÛÓøôïéäßÝÞß°FHY_aa``_^^]WJ–øûîÜȾÐìþÿÿüÞZHðtî÷òíçâÞÝßÜq9OWZZYîXWVVRImÑ¥lPHCIrÉþÿÿüïg?ÙµùöñëåàÝÝߥ@@û=5?ÎÿÿüíZ0ãbë÷òíçâÝÝßÁB7BFGFEEDCCBA@@?=<<;ú:81@ÑÿÿüàD+Ù›ôöñìæàÝÝà™,6=@??>==<;:998776531/.+&dîÿÿü¼3%Ù¹øõïêåßÝÞØm(3798766554321/-)&"%¦üÿÿûöxñÊùôîéãÞÝßÈE'/22ê10/.--*(% yôÿÿúþÄ2Ú>ÙùóíèâÞÞà²/#*,,+*)(&$"U×ÿÿúðm ÚVäøòíçâÝÞàŸ( %&&%$#"! 4¼þÿÿùôŠ ò\è÷òìçáÝÞà#!%%ë$#"! —øÿÿûû¥*  òaî÷òìçáÝÞà!%%ë$#"! iôþÿÿ÷þ³5 ògñ÷ñìæáÝÞáw!%%ì$#"! ,¸þÿÿ÷ÔI òjñ÷ñìæáÝßáw!%%í$#"! `ìÿÿöòo ò`ì÷ñìæáÝÞá!%%í$#"! ”þÿÿöÀ% ò\è÷òìçáÝÞà#!%%î$#"! %»ÿÿõú‚  ÞVã÷òíçáÝÞàŸ( $%%$#"! .ÎÿÿõëW  ÞAÙøòíèâÝÞà±-#%%$#"! 2ÖÿÿõåB  ÞÌùóîèâÞÝßÈA#%%$#"! 0ÄííõÐ8  лøôïéäÞÝß×j!$%$#"! MZYXXYQ ÙœóõðëåàÝÞà— #%$#"! ù édëöñìæàÝÝàÀ9"$$#"! î ì3Ú÷óíèâÞÝßÚf #$#"!  ü!"#$$ï#9`{qN& ì·÷õïéäßÝÞà£.!##""!!ú"$&(*,,î+bºîúõà™:&&$!ïxíöñëæáÝÝàÛk"#""ò#%(,/24662XÏþÿÿôþù”/..,($àÔ÷óîèãßÝÞà¯7 ""#$'+047:<=;8ùÿÿöãZ2531-)$á§ôõðëæáÝÝߨs "#&+17;>@A@=@Éþÿÿöö}488641,âRà÷òíèãßÝÞàÆZ!$(.6<@BCCA=GÕÿÿüø†499ü852á±õõïëæáÝÝßß°A"(08>ACDDB>8¶ýÿÿöñi39::963â`Þ÷òíéäßÝÝßáž1&-6<@ABBA>5víÿÿûþÄC399ü751â¬ôõðìçãÞÝÞà߆&!(06;>@@A?70—ñÿÿôþÍg+587630+Ô&ÍõóïêæâÞÝÞàÙ‘: '-369;<<8/4u³ÑÇ›O*/4420+'!þAÕ…åöòîéåáÞÝÞàà§K#(,035651*%-51)$*./-*&!ü @UÖ¦îöñíéåáÞÝÞàá¼e!%(+,--+(%##$&''%# üHUÖ-ÈöõñíéåáÞÝÞßàÓ”O !"##""!  Tû9<5ØHËõôðìéåáÞÝÝßààÈC LšÑ«î+Mz™§¯¶º¶®§“oC)*èd—ÀÝëïóö÷øùøõôóîèØ¶‹Y$ôd¥Òëõø÷÷ööõõö÷úøôåɘ!ó"zÃåóøøöôóòñððïðñùóôõ÷÷ò ñpÇëøøöôóñïîíëëêêëøìíïðòôõîWµçùøõóñïíëééçæååääöåææèéêìîðü_F9íŒÙõøöóðîìéèæäãâáàßßöàááãäåçéëü,†…ï#µçù÷ôñîëéçäãáßÞÝ ÝùÞßàâäæþ7ñGÄôùõòïìéæäâßÞÝÝÞßÞÝüÞßáódÏöøôðíêçäáßÝÝìÞßßàÞÛÙ×ÕÔÕ×ÚÜßàßßÞÝÝü7HAôlÙù÷óðìèåâßÝÝþÞßßëÕ¼¦–‰|rnr}‰–¨ÁÙààßÞÞýgØYÓù÷óïìèäáÞÝÝÞßàÓ»œrqy„ŠŒ‡€zrhlœ½×àßþZ×CË÷÷óïëçãàÝÝÞßàÓ±†xŽŸ­´¶¸º»¹¶³¯¦•ƒslƒµØè%Ç÷÷óïëçãßÝÝÞßÚ¶zŠ¡±º¾ÀÀó¿¾½¼º·±§’xlˆÞ£ïøóïëçãßÝÝßßËšyФ´»¾¿¿¾¼º¹¶µ´µ¶·¸¸úµ°§“vã‚æùôðìçãßÝÝßàÀ€œ¯¸¼¾¼º¶°©£¡ŸŸôžŸ¡§¬°²²°ªŸÔ#ÌøõñíèäàÝÝßÝ´ˆŠ¤²¸»»¹³© §´¾ÅËÌÇ¿±¡—ž§¬®­©ãªõ÷óîéåáÝÝßà®|©³¸¹¹·¯¢ ¸Úñûÿÿöùíˤ‘Ÿ§©©ä]ÞùôïêæáÞÝÞà»…§±µ¶¶µ±¨¹çúþÿÿ÷þü뵚¢¥æ®ööñìèãÞÝÞ߯¥®²³³²±¬Ÿ¹üÿ ÿúõ½Ž˜žåLàùôîéåàÝÝßÒ—…Ÿ«¯°¯¯®¬©œžìÿ ÿûì¡‹–ä¤ô÷ñìçâÞÝÞܤ~˜¦«­­¬«ª©§ŒÔþÿ ÿûþɇÛÓøôïéäßÝÞßʼn ¨ªª©¨§¦¥¤Œ·úüóæ×ÐÜñþÿÿüç‡Útî÷òíçâÞÝßÞ¡„™¤¦§¦¥¤¤¢¡ œŸàÀ˜‡ƒ~šÖþÿÿüô•€ÙµùöñëåàÝÝß¾ƒŽ£¤££¢  žžœš”Œ–‚‚†‰ˆƒv–ðÿÿüõ˜{Ù4ÛøôïéãßÝÞÝ“  Ÿžœ›šš™—”Œ‹ŒŽŽ‰~zÛÿÿüòwÙbë÷òíçâÝÝßφ‡–œœ›šš˜˜––•“‘ŒŒŠ‡}|Þÿÿüé~uÙ›ôöñìæàÝÝà¸|‹—šš™˜—–””’‘ŽŒŠ‰‡†„t•óÿÿüÏtrÙ¹øõïêåßÝÞÜŸ|•—–”““’ŽŒŠˆ…ƒ€}{yuopÂýÿÿûù¡hoÙÊùôîéãÞÝßÓˆ“”“‘ŽŒŠ‡…‚}|zyxvpi¥÷ÿÿúþÕsflÚ>ÙùóíèâÞÞàÆ|€ŒŒ‹Š‡†ƒ‚~}|zywskäÿÿúô™\cfÚVäøòíçâÝÞà»x€ŠŒŠ‰ˆ‡…„ƒ‚~}|zyun|Òþÿÿù÷¬^`eeÛ\è÷òìçáÝÞà±u‹ŒŠ‰ˆ‡…„ƒ‚~}|zxrq¹úÿÿøû¿m_dfeÛaî÷òìçáÝÞà§r‚ŒŒŠ‰ˆ‡…„ƒ‚~}|zvn÷þÿÿ÷þÈs]dffeÜgñ÷ñìæáÝÞáŸpƒŒŒŠ‰ˆ‡…„ƒ‚~}|ysxÏþÿÿûà€^dggþeÝjñ÷ñìæáÝßáŸpƒŒŒŠ‰ˆ‡…„ƒ‚~}{wo—ñÿÿöõš]dhihgeÝ`ì÷ñìæáÝÞá§sƒŒŒŠ‰ˆ‡…„ƒ‚~}{uk¸þÿÿöÒjbhjihgeÞ\è÷òìçáÝÞà°u‹ŒŠ‰ˆ‡…„ƒ‚~}{ttÑÿÿõû§]gjjihgeÞVã÷òíçáÝÞà»xŠŒŠ‰ˆ‡…„ƒ‚~}zsxÞÿÿõñ‹aikjihgeÞAÙøòíèâÝÞàÆ{}ˆŒŒŠ‰ˆ‡…„ƒ‚~|zrzãÿÿõì~djkjihgeÝÌùóîèâÞÝßÓ†z‡ŒŒŠ‰ˆ‡…„ƒ‚~|zsz×òññõÞzfkkjihgeлøôïéäÞÝßÜžvƒŠŒ‹Š‰ˆ‡…„ƒ‚~}{vp‰Š‰‰Š‰kjlljihgeМóõðëåàÝÞà·v‰‹‹Š‰ˆ‡…„ƒ‚€~}yskfcbabejnnmkjigeÐdëöñìæàÝÝà΂z†Š‹Š‰ˆ‡…„ƒ‚€}{wtpnmnpqrqomkihfè3Ú÷óíèâÞÝßÝ›vˆ‹Š‰ˆ‡……„ƒƒí€{†œ¬¥wvxvtrpljhë·÷õïéäßÝÞà¾|{…ŠŠ‰ˆ‡††è‡ˆ‰‰ˆ†Óóüøê½ƒ{}{yvrolßxíöñëæáÝÝàÞžu‡‰‰ˆ‡‡ˆŠ‹ŒŽˆ˜àþÿÿôþûº}‚‚€~zvrçÔ÷óîèãßÝÞàÄ€w‚‡ˆˆ‰ŠŒŽ’””û‘ˆÀûÿÿö앃‡†„~yá§ôõðëæáÝÝßÜ¢q{ƒ†ˆŠ“•—˜—–‰Ûþÿÿöù¨€ˆ‰ˆ†ƒ€âRà÷òíèãßÝÞàÒ“s|„ˆ‹Ž“–˜™š™—‹ãÿÿöú­‰‹Šˆ‡ƒá±õõïëæáÝÝßàÅ…s~…Š”˜š›š™˜Íþÿÿöõš‰Œ‹‰ˆ…â`Þ÷òíéäßÝÝßáº{t†’–˜™™˜—‘¢òÿÿõþÕŠ‹Šˆ†ƒâ¬ôõðìçãÞÝÞàà¬ut~‡Ž’”–˜—–“†vµõÿÿôþÛ•u„Љˆ…‚~Ô&ÍõóïêæâÞÝÞàݳr|„ŠŽ‘“””’Œ}uÇÜÕ¶ƒq~†‡…ƒ{uþ„Õ…åöòîéåáÞÝÞàΈpw…‰ŒŽŒ†znnqnknzƒ‚|vpiü‚§ê¦îöñíéåáÞÝÞàáÌ™ppw~‚…‡‡î†‚|vrrty}~|zvqjc[ü=‘ªâ-ÈöõñíéåáÞÝÞßàÙµ‹pouy|~~}{yxxöwurnic]d†ûswjçHËõôðìéåáÞÝÝßàáÓ¯ƒolmqstuuótrpnlida_c´Ø«î+Mz™§¯¶º¶®§“oC)*èd—ÀÝëïóö÷øùøõôóîèØ¶‹Y$ôd¥Òëõø÷÷ööõõö÷úøôåɘ!ó"zÃåóøøöôóòñððïðñùóôõ÷÷ò ñpÇëøøöôóñïîíëëêêëøìíïðòôõîWµçùøõóñïíëééçæååääöåææèéêìîðû§yfíŒÙõøöóðîìéèæäãâáàßßöàááãäåçéëüRâäï#µçù÷ôñîëéçäãáßÞÝ ÝùÞßàâäæþ]ñGÄôùõòïìéæäâßÞÝÝÞßÞÝüÞßáódÏöøôðíêçäáßÝÝìÞßßààÞÞÜÜÛÜÝÞßààßßÞÝÝüXm`ôlÙù÷óðìèåâßÝÝçÞßààÜÓÉü´­«®´»ÁÈÓÞààßÞÞýš¾ØYÓù÷óïìèäáÞÝÝÞßàÜÔǽ¸·º½¿ÁÂÀ¼¸´¯°·ÄÒÝàßþˆæCË÷÷óïëçãàÝÝÞßàÜÐÀ»ÀÈÑØÜÝßßóÞÜÚ×ÑȽ´¯¸ÎÝæ%Ç÷÷óïëçãßÝÝÞàßÑþÆÒÛáäæçææòåäããâàÝÙÓÆ¶®¹Ö£ïøóïëçãßÝÝßßÙȽÇÔÞäççèææãáàÞÝÞÞßààßÞÙÓÆ´â‚æùôðìçãßÝÝßàÖÅÃÑÝãçèçåâÜ×ÑÎÌËËõÌÎÓØÜÞÝÛÖÎÔ#ÌøõñíèäàÝÝßßÒÃÇ×áæééæáÙÏÊÍÓÙÜßàÝÙÑÉÆÍÕÚÜÚ×ãªõ÷óîéåáÝÝßàÐÀËÛäèééçàÔÌÖèöüÿÿöûóàËÄÑ×ÙÙä]ÞùôïêæáÞÝÞàÔÃÌÜäèêéèäÚÛñûþÿÿ÷þýóÔÂÎÕ׿®ööñìèãÞÝÞßÙÆÊÜåèééèçãÕÚýÿ ÿúùØÂÎÓåLàùôîéåàÝÝßÜÉÇÙäèéèèçåâÕËôÿ ÿûóÊÅÏä¤ô÷ñìçâÞÝÞßÎÃÕâèéèççæäâØÄæþÿ ÿûþß¿ÊÛÓøôïéäßÝÞߨÆÏßçéèçæååãâÛÉØüý÷ðçãêöþÿÿüñÀÅÚtî÷òíçâÞÝßàÍÈÙäèèçæååäâáÝÐÏîÛž½º¹ÄåþÿÿüøÄÀÙµùöñëåàÝÝßÖÅÑàçèççæääãáàÞ×ÍÍÃÅÊÌËŸÂõÿÿüùƾÙ4ÛøôïéãßÝÞàËÈÚäççæåäãâáàßÝÚÕÒÒÓÔÔÓεéÿÿü÷¿¼Ùbë÷òíçâÝÝßÜÅÏßåçæåäãâáàßÞÝÛÙØ××ÖÕÔÐĸëÿÿüò¸¼Ù›ôöñìæàÝÝàÔÄÕâæçæåãâáàßÞÝÜÚÙØ×ÖÕÓÑÌ¾Æøÿÿüãµ¼Ù¹øõïêåßÝÞßÍÈÚäææääâáàßÞÜÛÙØ×ÖÓÒÐÎ˹Ýþÿÿûûʲ¾ÙÊùôîéãÞÝßÝÅÍÝåæåãâáàßÝÜÛÙ×ÖÕÓÒÑÏÌÆºÐúÿÿúþæ´¶¾Ú>ÙùóíèâÞÞàÙÂÐßååäãâàßÝÜÛÙØ×ÕÔÓÒÐÎɾÇðÿÿúøÆ­¹¼ÚVäøòíçâÝÞàÕÂÓàååäâáàÞÝÜÛÙØ×ÕÔÓÒÐÌÿæþÿÿùúЪ´»¼Û\è÷òìçáÝÞàÐÀÔáååäâáàÞÝÜÛÙØ×ÕÔÓÑÎȽÛüÿÿøýÚ±²º½½Ûaî÷òìçáÝÞàÊ¿ÖâååäâáàÞÝÜÛÙØ×ÕÔÓÑÌÁÏúþÿÿúþß³°º½½Ügñ÷ñìæáÝÞážØâååäâáàÞÝÜÛÙØ×ÕÔÓÐÈÁæþÿÿû츮¹¾¾þ½Ýjñ÷ñìæáÝßážØâååäâáàÞÝÜÛÙØ×ÕÔÓÎÃÌ÷ÿÿöùÅ«¸¾À¿¾½Ý`ì÷ñìæáÝÞáÊ¿×âååäâáàÞÝÜÛÙØ×ÕÔÒ̽Ûþÿÿö䮵¾ÀÀ¿¾½Þ\è÷òìçáÝÞàÐÀÔáååäâáàÞÝÜÛÙØ×ÕÔÒʾæÿÿûüÍ­¼ÁÁü¿¾½ÞVã÷òíçáÝÞàÕÂÓàååäâáàÞÝÜÛÙØ×ÕÔÑȾìÿÿõö¿³ÀÂÂÁ¿¾½ÞAÙøòíèâÝÞàÙÂÐÞäåäâáàÞÝÜÛÙØ×ÕÔÑÈ¿ïÿÿõôº¸ÁÃÂÁ¿¾½ÝÌùóîèâÞÝßÝÅÌÜãåäâáàÞÝÜÛÙØ×ÕÔÑÈÀé÷ööô÷í»»ÂÃÂÁ¿¾½лøôïéäÞÝßßÍÇØâäãâáàÞÝÜÛÙØ×ÕÔÒ˿¿¼»»½À¸¾ÃÃÂÁ¿¾½МóõðëåàÝÞàÔÃÒßããâáàÞÝÜÛÙØ×ÕÔÓÏǽµ²°°±¶¾ÃÄÃÂÀ¿¾½ÐdëöñìæàÝÝàÜÅÌÜâãâáàÞÝÜÛÙØ×ÕÔÓÑÎÉÄÀ½¼¾ÀÃÆÅÃÂÁ¿¾½Ð3Ú÷óíèâÞÝßàËÅÖßââáàÞÝÛÛÙØ×ÖÕÔÒÏÈÈÐ×ÓÊÁÃÆÆÅÃÂÀ¿¾Ð·÷õïéäßÝÞàÖÃÎÛáâáàÞÝÛÛÙÙ××ÖÔÐÉÑéùýûôÞÃÃÇÇÅÄ¿¾ßxíöñëæáÝÝààÍÅÔÞááßÞÝÛÛÚÙ××ÖÔÌÍîþÿÿôþüÚ¿ÆÈÇÅÄÁÀàÔ÷óîèãßÝÞàÙÄÊØÞàßÞÝÜÛÚÙØ×ÖÒÆÞüÿÿöôÆÃÈÉÈÆÄÂá§ôõðëæáÝÝßàÍÁÏÙÞßÞÝÜÛÛÚÙØÕÐÄëþÿÿöûÏ¿ÇÉÉÈÆÄâRà÷òíèãßÝÞàÝÈÃÐÚÞÞÝÝÜÛÚÙ×ÕÎÂîÿÿöüмÇÊÉÈÇÅá±õõïëæáÝÝßàÙÅÅÒÙÜÝÝÜÛÚÙØÕνâþÿÿûùļÇÉÉýÇÆâ`Þ÷òíéäßÝÝßáÕÁÆÑØÛÜÜÛÚÙØÖпÈ÷ÿÿõþä·¿ÈÊÉÈÇÅí¬ôõðìçãÞÝÞàáпÄÏÖÙÚÚ÷ÙØÖÒÆ²Òøÿÿôþè¿´ÃÉÊÉÇÅÃÔ&ÍõóïêæâÞÝÞààÒÁÁËÒ×ÙÙØ×ÖÔͽ°ÂÛèäѳ¯¾ÇÉÉÇÅþýÂë…åöòîéåáÞÝÞàáÖľÅÎÓÕÖÖìÕÑɽ®©©¨ª°½ÅÈÈÆÄÀ¼µü%ÇþÖ¦îöñíéåáÞÝÞàáÛȺ¿ÇÍÑÓÔÔÒÐË»·¸¼ÁÅÈÇž¸±¨üYÚÿÖ-ÈöõñíéåáÞÝÞßáßÑû¾ÄÉËÎÏÎÍÊÈÅÄÄÅÄÃÀ½¸²«ª¸û*ª®›èHËõôðìéåáÞÝÝßàáÜÏ¿¸¹½ÁÄÅÅóÃÂÀ¾¼¹µ¯¬«·ÎÞ)ì 'æ !$%&%#! "ã ".:H^s€‡‘Œ…}oYD7+  á $4TvžÆÜèñöùüþûùöïæ×¾”nM/!ñ .Q€³Ýõüþþÿ ÿøþýûñÖ¨uõ4^ŸÕòýÿÿýüíö +[¤Ýýÿÿö"IÚüþÿÿø /kÀòÿÿø 9Ûþÿÿ÷ G¡òþÿÿø!Q²öÿ ÿù U½ýÿ!ÿù M·ýÿ"ÿù D¬÷ÿ#ÿù6¢ùÿ$ÿú(~êÿ%ÿù `Óþÿ%ÿù9¬úÿ&ÿú &‚óÿ'ÿùLÇþÿ'ÿú(‰õÿ(ÿûIÉÿ)ÿú $ñÿ)ÿú7·ýÿ)ÿú`åÿ*ÿú *’ûÿ*ÿú:Àþÿ*ÿûSßÿ+ÿ úvñÿ+ÿ ú '“üÿ+ÿ û1ªÿ,ÿ û=¿ÿ,ÿ ûGÑÿ,ÿ ûMÛÿ,ÿ ûQáÿ,ÿ ûTçÿ,ÿ ûTçÿ,ÿ ûRâÿ,ÿ ûMÛÿ,ÿ ûGÒÿ,ÿ û>Àÿ,ÿ û1ªÿ,ÿ ú '“üÿ+ÿ ú wòÿ+ÿûTßÿ+ÿú<Âþÿ*ÿú +“üÿ*ÿúaçÿ*ÿú8¹ýÿ)ÿú $€òÿ)ÿûJËÿ)ÿú)‹öÿ(ÿùMÉþÿ'ÿú'…ôÿ'ÿù;®ûÿ&ÿù cÖþÿ%ÿú)ìÿ%ÿù8¤ùÿ$ÿù F®øÿ#ÿýU<ûß¶c:ú÷öá½V9øòõ÷÷ß©3ù*±áßÝÝßäéíòõÈTT_vG;#ìgfd^S0QÁàßÝÝáæêïõí‹úT_tG<#^ç[VL(gÛàÞÝÞãèíòöÍ)T_rH=#WîVSM<%ßßÝÝàåêðôì€û_pI=#þMNNèLJC.FÇáÞÝÞâèíòô¾aoJ?#äEGGFED?7zßßÞÝàæëðõßMbmK?#þ>??î>=:5(;ºàÞÝßäéîôð’ülK?#ê57765430*áßÝÝâçìòóÀükLA#ä/0/.-,+*&LÒàÞÝàåêðõ×#jLA#ä(''&%$#" %µáßÝßäéïôéiiMA#ýë„áßÝÞãèíóóŒgNA#æ PÜàÞÝáæìñõ¥ eNB#  ê -ÇáÞÝáæëñõÀcOB#ä ·áÞÝàåëðôÒ'`OB#ä ªáßÝßäêðôÚ-_OB#ä  žáßÝßäêðôá/^OB#ä –âßÝßäêïôå2^PB#ä –âßÝßäêïôå2^PB#ä  žâßÝßäêïôà.]PB#ä ©áßÝßäêðóÚ-]QD#ä ·áßÝßåêðôÒ'\QD#ä ,ÇáÞÝàåëðôÀC#ä MÛáÞÝáæëñõ¦ ZRB#ä  ‚áàÝÝâçíòóZRA#ä ´áßÝÞãéîóèjYR@#ä EÒáßÝßäéïô×&YR>#ê {âàÞÝáæëñóÀüYR:#ê 0¹áßÝÞâèíóð“ûZR;"ã vßàÞÝßäéïôÞP‡ZSC"ã :ÅáßÝÝáçìñô¿ˆZSG"ë& ‹ààÞÝßäéîóë„ú‰ZSF"ã,# aÚáßÝÝáæëðôÌ-Q‰ZSE-"ì-%H¿áàÞÝßäéîóíùQ‰ZSG="ã+" 2¯âßÞÝÞâçìñôÉWPˆZSH@"í$ )’áàßÝÝáåêïóæˆ÷bRˆ[TH=!â ?£àáßÝÝàäèíòò¹\ZP‡[THB2!îWµâàßÝÝßãèìðôÕZö[_Q†[TMJ@!ïrÐâàßÝÝßãçìðôä…f÷_Q…[TQN<!á£ØáàÞÝÝßãçëïóì­VVWUQ„[TIG= ðáàßÞÝÝàãçëïóð»%ó`^_`^…dSC;8 ýU<ûß¶c:ú÷öá½V9øòõ÷÷ß©3ù$Fm…Ž*÷íðòõöðÎuöwlho|†ŽŒm)õèëíðóõ÷ߢ„…’ý„R)ôãåèëîðô÷ïº/ò”—˜”‰wz…‰’#óÞàãæéìïóöðÀE•–—û–Ÿ™…#ÝôÞáäçëîòõòÉ7ô´²¯¬ª¨¥©·™|#þÞÝÝõßãçêîñõ÷Æ9¬­ù®¯µÃ {#ðáßÞÝÝÞâæéíñõñº!§û­·˜{#ð»ÜàßÝÝÞâåéíñõî®§û­·™{#ïk›ÖàßÞÝÞâåéîòöæ‚§û¬·š|#î…jˆÆáßÞÝÞâæêîóöÖY§û¬·š~#롎p|ºáàÞÝÞâçëïôó·§§û¬·›€#í¦Ÿ”sn°áßÞÝßãèìñõç…§û¬·œ€#䤠›rvÂáßÝÝßäéíòõȧ§¬¶œ‚#쟛–Šn‚ÌàßÝÝáæêïõí‹ú§¬µž…#™æ˜•„gÝàÞÝÞãèíòöÍ)§¬´ž†#”î’‰xe©àßÝÝàåêðôì€û¬³ž‡#䎎Œ‰€mzÐáÞÝÞâèíòô¾­²Ÿ‰#äˆŠŠ‰‡†v`àßÞÝàæëðõßM®± ‰#ꄆ…„ƒ‚xisÇàÞÝßäéîôð’ü± ‰#ꀀ~}zvm^ áßÝÝâçìòóÀü±¡‰#{çzyxvtm`~×àÞÝàåêðõ×#°¢‹#vçusrqokbdÃáßÝßäéïôéi°¢‹#qæponmljf`Y£áßÝÞãèíó󌯣‹#änlkjihgfc^UÞàÞÝáæìñõ¥ ®£‹#ägffedcb`^ZQhÐáÞÝáæëñõÀ­£‹#ädcba`_]\ZWO^ÅáÞÝàåëðôÒ'¬¤‹#ädcba_^]\ZWPV»áßÝßäêðôÚ-«¤‹#ädcba_^]\ZWPN³áßÝßäêðôá/«¤‹#ädcba_^]\[XQI¬âßÝßäêïôå2«¥‹#ädcba_^]\[XQI¬âßÝßäêïôå2ª¥‹#ädcba_^]\ZXPO³âßÝßäêïôà.ª¥‹#ädcba_^]\ZWPV»áßÝßäêðóÚ-ª¦#ädcba_^]\YVO^ÅáßÝßåêðôÒ'ª¦Œ#ädcba_^]\YUNhÐáÞÝàåëðôÀª¦‹#ädcba_^]\YUN~ÞáÞÝáæëñõ¦ ª¦‰#ädcba_^][XSQ¢áàÝÝâçíò󩦇#ädcba_^][WQ]ÃáßÝÞãéîóèj©¦„#äecba_^\ZVOyØáßÝßäéïô×&©§#êfdba_^\YSQâàÞÝáæëñóÀüª§v#êheca`^[VPlÆáßÝÞâèíóð“û©¦t"ãmidb`^ZTOšààÞÝßäéïôÞPª¦,"ãtnhd`]WQrÏáßÝÝáçìñô¿ª¦†3"ëzslf`[RW¨ààÞÝßäéîóë„ú©¦ƒ7"ã~wog^WQŒÝáßÝÝáæëðôÌ-¥Ã©¦‚O"ì€yoe[R|ËáàÞÝßäéîóíù¥Ã©¦„i"ã~vk`UnÀâßÞÝÞâçìñôɨ¥Âª§†m"íxncXi®âàßÝÝáåêïóæˆ÷¯¦Âª§…i%!âlbYx¹ááßÝÝàäèíòò¹«ª¥Âª§…rX!î`\ˆÅâàßÝÝßãèìðôÕZö«­¥Áª§ˆ}s!ïd™×âàßÝÝßãçìðôä…±÷­¥Á«§‹€i!í¹ÜáàÞÝÝßãçëïóì­¨¨ö§¥À«§…zj, ðáàßÞÝÝàãçëïóð»%¬ö­¬À¯¦}ea8 ýU<ûß¶c:ú÷öá½V9øòõ÷÷ß©3ø6cÇÖÄ*÷íðòõöðÎuö² œ§·ÉÔÒ¢)õèëíðóõ÷ߢþÆÄÄûÆÅÅ{)ôãåèëîðô÷ïº/òåäãâÞÙÄÉÑÕÜèÁ#óÞàãæéìïóöðÀEÿüþÿÒ#ÝôÞáäçëîòõòÉ7ýþýýþÈ#þÞÝÝõßãçêîñõ÷Æ9þûýüþÃ#ðáßÞÝÝÞâæéíñõñº!ÿþüýþÃ#ðÐßàßÝÝÞâåéíñõî®ÿûþýÿÃ#ï¬ÂÝàßÞÝÞâåéîòöæ‚ÿûþýÿÃ#¹ÕáßÞÝÞâæêîóöÖYÿûþýÿÅ#ëÐð³ÏáàÞÝÞâçëïôó·ÿÿûþýÿÅ#íÖÐDz¬ÊáßÞÝßãèìñõç…ÿûþýÿÅ#äÖÓÏŰ¯ÓáßÝÝßäéíòõÈÿÿþýÿÈ#ìÔÓÑÌÁ®´ØàßÝÝáæêïõí‹úÿþýÿË#äÒÑÑÎȾ©»ààÞÝÞãèíòöÍ)ÿþýÿÌ#ëÏÐÏÎÊͧÇàßÝÝàåêðôì€ûþýÿÎ#äÌÍÍÌÊǾ¯±ÙáÞÝÞâèíòô¾þýÿÎ#äÊËËÉÈÇÁ·¦ÁáßÞÝàæëðõßMþýÿÎ#êÈÉÉÇÇÅ»­­ÕàÞÝßäéîôð’üýÿÎ#êÅÆÆÅÄÃÀ¼²¤ÂáßÝÝâçìòóÀüýÿÎ#ÄçÃÁÁ¿½¶¨²ÝàÞÝàåêðõ×#ýÿÎ#ÂçÁ¿¿½»¶ª¦ÔáßÝßäéïôéiþÿÎ#äÁÀ¿¾½¼º¹µ¬¢ÄâßÝÞãèíóóŒþÿÎ#俾½¼º¹¸·´­¡²ààÞÝáæìñõ¥ þÿÎ#ä¼»»º¸·¶´²­¡¦ÚáÞÝáæëñõÀþÿÎ#仺¹¸·¶´³±¬ ¡ÔáÞÝàåëðôÒ'þÿÎ#伺¹¸¶µ´³±¬¡ÏáßÝßäêðôÚ-þÿÎ#伺¹¸¶µ´³±­¢˜ÉáßÝßäêðôá/þÿÎ#伺¹¸¶µ´³±­£•ÅâßÝßäêïôå2þÿÎ#伺¹¸¶µ´³±­£•ÆâßÝßäêïôå2þÿÎ#伺¹¸¶µ´³±­£˜ÊâßÝßäêïôà.þÿÎ#伺¹¸¶µ´³±¬¡œÎáßÝßäêðóÚ-þÿÎ#伺¹¸¶µ´³°« ¡ÔáßÝßåêðôÒ'þÿÌ#伺¹¸¶µ´²°ªŸ¦ÚáÞÝàåëðôÀþÿË#伺¹¸¶µ´²¯©ž±àáÞÝáæëñõ¦ þÿÈ#伺¹¸¶µ´²®¦žÃâàÝÝâçíòóþÿÅ#伺¹¸¶µ´²¬£¢ÓáßÝÞãéîóèjþÿÁ#伺¹¸¶µ³±ª °ÞáßÝßäéïô×&þÿº#꼺¹¸¶µ²¯¦žÁâàÞÝáæëñóÀüþÿ¯#ê½»¹¸¶µ±¬¢ªÕáßÝÞâèíóð“ûþÿ°"ã¾»º¸¶´¯§žÀáàÞÝßäéïôÞPýþÿ¿B"ãÀ½»¹¶²«¢­ÚáßÝÝáçìñô¿ýþÿÉM"뿼¹´®¥¡ÆáàÞÝßäéîóë„úýþÿÅT"ãÃÀ½¸²© ºàáßÝÝáæëðôÌ-ÿýþÿÃu"ìÃÀ¼µ¬¢²×áàÞÝßäéîóíùÿýþÿÇœ"㾸¯¥¬ÓâßÞÝÞâçìñôÉþþýþÿÉ£"í¿¹°¥ªÉâàßÝÝáåêïóæˆ÷üþýþÿÈ›<!â·®¥±ÏâáßÝÝàäèíòò¹üýÿýþÿȨ…!¹ÕâàßÝÝßãèìðôÕZöýüþýþþȸª!ïªÁÝâàßÝÝßãçìðôä…õúûüÿýþþȹ›!áÐßáàÞÝÝßãçëïóì­þþýþÿýþÿȵžB ðâàßÞÝÝàãçëïóð»%þøýþþ½–“^ €ü;ú 9øH)7÷ËR-6õÿùÒ—M& 4ÿöþùÊ€<3ÿ÷þì¯[' 2ÿøýÍ|0 1ÿøþê’; 0ÿøþì›B / ÿùò¦@ . ÿùù£> - ÿøþð•6, ÿúè…*, ÿùþÚf" + ÿùþ¼J*ÿúö“.*ÿúÚe )ÿúû©5)ÿúél! (ÿúý¯7(ÿùþåc 'ÿúüš,'ÿûÍH'ÿúîq &ÿúúž)&ÿûÁ:&ÿûßU&ÿûôm &ÿûú†& &ÿûü¢. &ÿûý¸4&ÿûþÅ8&ÿûþÍ;&ÿûþÕ=&ÿûþÕ=&ÿûþÎ<&ÿûþÅ8&ÿûý¹4&ÿûü£. &ÿûú‡& &ÿûôn &ÿûàV&ÿûÂ;&ÿúúŸ*&ÿúïr &ÿûÏI'ÿúüœ-'ÿùþçd 'ÿúý²8(ÿúên! (ÿúû«6)ÿúÜg )ÿú÷–/* ÿùþ¾L* ÿúÝi# + ÿúê‡+, ÿøþò˜7,þ&ØZÔ÷õðíéåâÞÝÝÞßààÉ h= Ap¦Ñááý3FõqÙ÷ôñíéæãßÝÝæÞßààÝË¢~eRA3.4BTgƒªÐßááàßý ôiÐôõñîêçäáßÝÝèÞßààáÝØÔÐÎÍÎÑÕÙÞâáàßÞÝÝóKÇóöòïìéæãáßÝÝüÞßßààáàüßÞÞÝÝþÞñ)¯äõóðíëèæãáßÞÝÝÞþßÞÞÝüßàâî|ÐðõòïíëèæäâààÞÞÝÝÞùßàáãåçî:Þöôòðíëéçæåãââáààá÷âãäææèëìïO¯ßöõóñïíìêéèèçææç÷èéêëìîñò!ñS¤Ùîõõóñðïîííììíøîïñòôóë#ù?€¹àñôôþóòòñò÷óôôõîÚ¯t&è Gw¦ÍàçíðòôöóñïëæÝÇm<*î5[|Œ•¢›“‰vS.þCêZÔ÷õðíéåâÞÝÝÞßàáÓº˜~keeócb`^\e{™»×ááýXxõqÙ÷ôñíéæãßÝÝæÞßààßÔ»¤”‡zpkq{‡”¦¿×àááàßý,ôiÐôõñîêçäáßÝÝèÞßààáßÜÙ×ÕÔÕ×ÚÜàâáàßÞÝÝóKÇóöòïìéæãáßÝÝüÞßßààáàüßÞÞÝÝþÞñ)¯äõóðíëèæãáßÞÝÝÞþßÞÞÝüßàâî|ÐðõòïíëèæäâààÞÞÝÝÞùßàáãåçî:Þöôòðíëéçæåãââáààá÷âãäææèëìïO¯ßöõóñïíìêéèèçææç÷èéêëìîñò!ñS¤Ùîõõóñðïîííììíøîïñòôóë#ù?€¹àñôôþóòòñò÷óôôõîÚ¯t&è Gw¦ÍàçíðòôöóñïëæÝÇm<*î5[|Œ•¢›“‰vS.þeèZÔ÷õðíéåâÞÝÝÞßàáÝÓÆ¼µ³´µµò³²±¯­ª­µÃÑÞááý„³õqÙ÷ôñíéæãßÝÝæÞßàááÝÓɼ´­ª®´¹ÀÇÓÞáâáàßý(BôiÐôõñîêçäáßÝÝèÞßààááàßÝÜÛÜÝÞàáâáàßÞÝÝóKÇóöòïìéæãáßÝÝüÞßßààáàüßÞÞÝÝþÞñ)¯äõóðíëèæãáßÞÝÝÞþßÞÞÝüßàâî|ÐðõòïíëèæäâààÞÞÝÝÞùßàáãåçî:Þöôòðíëéçæåãââáààá÷âãäææèëìïO¯ßöõóñïíìêéèèçææç÷èéêëìîñò!ñS¤Ùîõõóñðïîííììíøîïñòôóë#ù?€¹àñôôþóòòñò÷óôôõîÚ¯t&è Gw¦ÍàçíðòôöóñïëæÝÇm<*î5[|Œ•¢›“‰vS.ù Oºþÿ"ÿù!XÀýÿ!ÿø!U´÷ÿ ÿø J¥ôÿÿ÷#D™àþÿÿô  0IƒÍöÿÿð %.GR`t•Âå÷þÿÿýýôè #(-16>=:<<>FHLA#ôßâåèêîñôí½2ø #õäçéìïòôÝ4÷éìîñóëÄh6øîñóôÒ"7úôñÕ¥<9ûЖD :ý3½ñßÞÝÝÞàäçëïóõÉ<󶺽¾¾½Í´¦w!òÞÝÝÞáåèìïóðÈ@©ö¨§§¦¤³©¦†#óÝÞàãæéíðóî¾Kó}}zwwz~‰‘™„#ôßâåèêîñôí½2÷#2B-#õäçéìïòôÝ4÷éìîñóëÄh6øîñóôÒ"7úôñÕ¥<9ûЖD :ý3½ñßÞÝÝÞàäçëïóõÉ<ýùüýÿ¶)4!òÞÝÝÞáåèìïóðÈ@ÿûýþÿÍ#óÝÞàãæéíðóî¾Kóº·³±°³»ÂÏÞëÊ#ôßâåèêîñôí½2÷(8MfI#õäçéìïòôÝ4÷éìîñóëÄh6øîñóôÒ"7úôñÕ¥<9ûЖD :ý3½ ÿùû§? - ÿùó©C .ÿøþïŸD /ÿøþí—= 0ÿøýÒƒ6 1ÿõþñ¼p;& 0ÿòüÙ_C1% .íÿûá¶{XG9/'! ,íݵ‡hUG<4-(# ,îgYLA:3-(# -ïQF>71,'" .ò2,(# 1õ 4ý½€€€€,(–K %XP Backgroundÿ     wXP›\>\J\V\bXP÷µNÉeÝ[ñKÑÿ.gAéAùB EúI%L'ONREUjX¨\\.þÇÍ5ÍúÕÎÍçæççþæç çþæççþæççüÕÍÜç6çýÎÜççþæççýÇÍççþæççþæççþÍç9çýÍæç8çþÍç9çþÍææþçææþçææþçææñçæççæçæçææçææçææþçææþçææüçæçææþÍååæåèæååææåæåææååæåææåææååææååüæåæååüæååææåýÍäååûäååäååùäåäååäååäåøäåääåääååõäååääååäååþÍääþãääþãääùãääãäãääþãääãäþãääþãääþÍã9ãþÍã9ãþÍââûãââãââúãâãâãââùãâãâãâããâãâüãâãââãâþÍââáâáýâáââþáââþáââáâùáâáââáââáûâáââááþâááâþÍááþàááàýáàááüàáàááûàááàááüàáàááþàááþÍà9àþÍà9àüÍààßßàßüàßàßßàßûàßààßßàúßààßàßßàößààßßàßààùÍÞßßÞÞßßüÞßßÞÞßÞßõÞßßÞßßÞßÞßÞÞßþÞßßýÞßÞÞüßÞÞûÍÞÞÝÞÞÝÞþÝÞ ÞþÝÞÞûÝÞÞÝÞÞþÝÞÞýÝÞþÍÝ-ÝþÜÝÝþÜÝÝþÍÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜþÝÜÜûÝÜÝÝÜÜþÝÜÜþÝÜÜþÝÜÜþÍÜ9ÜþÍÜÜÛùÜÛÜÜÛÛÜÜÛÜöÛÜÛÜÜÛÛÜÜÛÛÜÛÜýÛÜÛÛÜÛýÜÛþÍÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛûÚÛÚÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛÛþÍÚ(ÚþÙÚÚþÍÙÙûÚÙÙÚÙÙþÚÙÙÚÙþÚÙÙùÚÙÙÚÙÚÙÙþÚÙÙüÍØÙØØÙØÙúØÙÙØÙØØõÙØÙØØÙÙØØÙØØÙØÙøØÙÙØÙÙØÙÙûØÙÙØþÍØ9ØþÍØØùרר×רØúרØ×רØø×Ø×Ø×Ø×ØØþרØûר×רØþרØþÍ×9×þÍÖÖþ×ÖÖþ×Ö Öþ×ÖÖþ×Ö Ö×Öú×Ö×Ö×ÖÖþÍÕÕþÖÕÕøÖÕÖÖÕÕÖÕÕÖÕþÖÕÕÖÕôÖÕÖÖÕÖÖÕÖÖÕÖÖÕøÍÔÕÔÕÕÔÕÕÔÕþÔÕÕÔÕÔýÕÔÕÕøÔÕÕÔÔÕÔÕÕþÔÕÕÔÕüÔÕÔþÍÔ9ÔþÍÔ9ÔþÍÓ ÓþÔÓÓþÔÓÓûÔÓÓÔÓÓþÔÓÓþÔÓÓüÍÒÓÒÒÓýÒÓÒÒþÓÒÒøÓÒÒÓÒÓÒÓÓÒûÓÒÓÒÓÓÒûÓÒÒÓÒÒýÍÑÒÒþÑÒÒÑøÒÑÒÑÒÑÒÑÑÒüÑÒÒÑÑÒÑûÒÑÒÒÑÑöÒÑÒÒÑÒÒÑÑÒÒýÑÒþÍÑ9ÑþÍÑ9ÑþÍÐÐÑýÐÑÐÐþÑÐ ÐÑýÐÑÐÐûÑÐÐÑÐÐúÑÐÐÑÑÐÐþÑÐÐûÍÐÏÏÐÐõÏÐÏÐÏÐÐÏÏÐÏÏôÐÏÏÐÏÐÏÐÐÏÐÏÏ÷ÐÏÏÐÏÐÏÐÏ ÏÐþÍÎÎÏþÎÏÏúÎÏÎÏÏÎÎüÏÎÎÏÏøÎÏÏÎÏÎÏÎÎÏþÎÏÏÎÏýÎÏÍÎþÍÎÎþÍÎÎþÍÎÎûÍÎÎÍÎ ÎüÍÎÍÎÎ;Í;ÍÍÌüÍÌÍÌÌÍÌæÍÌÌÍÌÍÍÌÍÍÌÍÌÍÍÌÍÌÌÍÌÌÍÌÌÍÍÌùÍÌÍÍÌÌýÍÌËËýÌËÌÌöËÌÌËÌËÌÌËÌÌËÌËøÌËÌËÌËËÌÌþËÌÌýËÌËËÌËþÍËËþÊËËþÊËËþÊËËþÊËËûÊËËÊËËþÊËËþÍÊ9ÊüÍÉÊÉÉöÊÉÉÊÉÊÉÉÊÉÉþÊÉÉþÊÉÉþÊÉÉÊÉüÊÉÉþÍÉ9ÉþÍÈÈýÉÈÉÉÈýÉÈÉÉþÈÉÉüÈÉÈÉÉýÈÉÈÈùÉÈÈÉÉÈÉÉÈüÉÈÈÉÉüÈÉÉþÍÈ ÈþÇÈÈþÇÈÈûÇÈÇÇÈÈÇÈþÇÈÈþÇÈÈþÇÈÈþÍÇ9ÇþÍÆÆûÇÆÆÇÆÆþÇÆÆþÇÆÆþÇÆÆùÇÆÇÆÇÇÆÆþÇÆÆþÍÆ9ÆþÇÍ5ÍúÕÎÍçæç3çüÕÍÜç6çýÎÜç7çýÇÍç8çþÍç9çýÍæç8çþÍç9çýÍçææûçææçææþçææþçææøçæççææçææçþæçç æüÍåæååæüåææååþæååþæååæåæåæåûæååæååûæåæåþÍååäûåäåäååäåüäåäååþäååþäååäåïäåääååääåäååäååäþÍääþãääþãääã äãäøãäããääãääþãääþãääþÍã9ãþÍã9ãüÍâãââãþâããâãâãâãâãñâãââãâãââããâããââãâùãââãââûÍáâáââáâöáâáâáâááâááâúáâáâáââáâûáâáâááâáþâááþÍá áþàááàáþàááúàáàáàááúàáààáþÍà9àþÍà9àýÍàßßöàßààßààßàßßþàßßþàßßüàßßààßüàßàßßàßàß÷àßßàßàßàûÍßßÞßßÞßüÞßÞßßýÞßÞÞìßÞßßÞßÞßßÞÞßßÞßßÞßßÞÞßÞßûÞßßÞþÍÞÞþÝÞÞûÝÞÞÝÞÞÝÞúÝÞÞÝÝÞÞÝÞþÝÞÞþÍÝ9ÝþÍÝÝÜþÝÜÜüÝÜÝÜÜþÝÜÜûÝÜÝÜÝÝýÜÝÜÜþÝÜÜþÝÜÜþÍÜ9ÜþÍÛÛÜÛÜÛüÜÛÛÜÜÛÜüÛÜÛÜÜþÛÜÜþÛÜÜÛÜþÛÜÜÛþÍÛÛþÚÛÛüÚÛÚÛÛþÚÛÛûÚÛÛÚÛÛüÚÛÚÛÛþÚÛÛõÚÛÛÚÛÛÚÛÚÚþÍÚ9ÚþÍÙ ÙûÚÙÙÚÙÙÚÙúÚÙÚÙÚÙÙþÚÙÙþÚÙ ÙöÍØÙÙØÙÙØÙØØýÙØÙÙØûÙØØÙØØÙýØÙØØðÙØÙÙØÙÙØØÙÙØØÙÙØØþÍØ9ØûÍØØ×ØØ×Ø×ýØ×Ø Ø×Øø×ØØ×ØØ×ØØþר Øþ×þÍ×9×þÍÖÖ×Öö×ÖÖ×Ö××ÖÖ××úÖ×ÖÖ×ÖÖþ×ÖÖþ×ÖÖ÷ÍÕÖÕÕÖÕÕÖÖÕÖÕÖÕÖÕþÖÕÕþÖÕÕñÖÕÕÖÕÕÖÕÕÖÖÕÖÖùÍÕÕÔÕÔÕÕüÔÕÔÕÕüÔÕÔÕÕûÔÕÕÔÕÕÔÕÔÕúÔÕÕÔÕþÍÔ9ÔþÍÔ+ÔþÓÔ ÔüÍÔÔÓÓüÔÓÔÓÓÔÓþÔÓÓþÔÓÓþÔÓÓüÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓüÍÒÒÓÓÒýÓÒÓÓÒÓÒÓÒÓÒúÓÒÒÓÓÒÒÓÒüÓÒÒÓÓÒüÓÒÓþÍÒÒÑøÒÑÑÒÑÒÑÒÒÑÒÑÒüÑÒÑÒÒÑÒÑÒÑÒûÑÒÑÑÒÒþÍÑ9ÑþÍÑ9ÑþÍÐÐþÑÐÐþÑÐÐÑÐÑÐõÑÐÐÑÐÐÑÑÐÑÐÐÑ÷ÍÏÏÐÐÏÐÏÐÐûÏÐÏÐÏÏñÐÏÐÐÏÐÏÏÐÐÏÐÏÐÏÏÐÏüÐÏÏÐÐþÏÐÐÏþÐùÍÎÎÏÎÏÎÎøÏÎÏÎÏÎÎÏÏÎõÏÎÏÎÏÏÎÏÎÎÏÏùÎÏÏÎÏÏÎÎþÏÎÎùÏÎÎÏÎÏûÍÎÍÍÎÎþÍÎÎÍÎþÍÎÎüÍÎÍÎÎûÍÎÎÍÎÎþÍÎÎ;Í;ÍÍÌÍÌüÍÌÍÌÌúÍÌÍÌÌÍÍÌüÍÌÌÍÍúÌÍÌÍÍÌÌýÍÌÍÍÌÍûÌÍÌÍùÍËËÌËËÌÌúËÌÌËËÌÌËÌþËÌÌþËÌÌËüÌËËÌÌËÌþËÌÌËûÍÊËÊËËûÊËËÊËËþÊËËþÊËËþÊËËüÊËËÊÊËÊËþÊþÍÊ9ÊþÍÉÉÊÉþÊÉÉþÊÉÉ÷ÊÉÊÉÉÊÉÊÉÉùÊÉÊÉÉÊÉÉÊ ÉþÊÉÉþÍÉ9ÉóÍÉÈÉÈÉÉÈÉÉÈÈÉÉÈÉøÈÉÉÈÉÉÈÉÉÈÉÈÉÈÉÈþÉÈÈÉþÍÈÈûÇÈÈÇÈÈþÇÈÈûÇÈÇÇÈÈþÇÈÈüÇÈÇÈÈþÇÈ ÈþÇÈÈþÍÇ ÇþÆÇÇûÍÆÇÇÆÆþÇÆÆÇÆþÇÆÆþÇÆÆüÇÆÇÆÆÇùÆÇÆÆÇÆþÍÆ9ÆþÇÍ5ÍúÕÎÍçæç3çüÕÍÜç6çýÎÜç%çþæççýÇÍç8çþÍç9çýÍæç8çþÍç9çþÍææüçæçææüçæçææûçææçææçæøçæçææççææþçææþçúÍåæåæååæåõæåææåæååæåææåûæååæååæåüæååææåûæåæåüÍääååøäåäåääåääåûäååäååþäååäåøäååäåäåääåþäååþÍä äþãä äþãääþãääþãä äãäýãäþÍã9ãþÍã9ãýÍãââùãââãâãââãâãøâããâãâãââþãââãâãâþãûÍáââááøâáâááâáââþáââáüâáâááâúáâááâááâ÷áââááâáâþÍááþàááþàááþàá áàüáààááþàþÍà9àþÍà9àòÍßààßßàßßàßßàßßþàßßýàßààûßàßàßßþàßßàßàþßààßýÍÞßßôÞßÞßÞßÞßÞßÞßßÞßýÞßÞÞóßÞÞßÞßÞÞßßÞÞßßúÞßÞßÞßßþÍÞÞÝÞþÝÞÞþÝÞ ÞÝÞþÝÞÞûÝÞÞÝÞÞüÝÞÞÝÝÞþÍÝ9ÝûÍÜÜÝÜÜþÝÜÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜüÝÜÝþÍÜ9ÜþÍÜÜÛÜþÛÜÜîÛÜÜÛÜÜÛÜÛÜÛÛÜÛÜÛÛÜÜÛÜûÛÜÛÛÜÜþÛÜÜÛþÜüÍÛÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛþÚÛÛÚýÛÚÛÛþÍÚ*ÚþÙÚ ÚûÍÚÙÚÙÙþÚÙÙþÚÙÙþÚÙ ÙþÚÙÙþÚÙÙýÍØÙÙüØÙÙØØÙøØÙØÙÙØÙØØÙûØÙØÙØØÙúØÙØØÙØØþÙØØýÙØþÍØ9ØùÍרØ×רØ×ýØ×ØØø×Ø×ØØ×רØ×üØ×רØþÍ×9×þÍÖÖþ×ÖÖþ×ÖÖ×Öþ×ÖÖþ×ÖÖþ×ÖÖú×ÖÖ×Ö×× Öü×Ö×ûÍÕÖÕÖÖøÕÖÖÕÖÕÖÕÕþÖÕÕþÖÕÕÖÕþÖÕÕÖÕÖÕÖþÕÖÖÕøÍÕÕÔÕÔÔÕÕüÔÕÔÕÕÔÕþÔÕÕÔþÕÔÔùÕÔÕÔÕÕÔÔÕÔýÕÔþÍÔ9ÔþÍÔ9ÔþÍÓÓþÔÓÓÔýÓÔÓ ÓþÔÓÓÔÓþÔÓÓüÔÓÔÓÓûÍÓÒÒÓÓÒþÓÒÒôÓÒÓÒÓÓÒÒÓÒÓÒÒüÓÒÓÒÒüÓÒÓÒÒöÓÒÒÓÒÒÓÒÒÓÓþÒþÍÒÒþÑÒÒþÑÒÒÑÒÑÒêÑÒÒÑÑÒÒÑÒÒÑÑÒÒÑÒÑÒÑÒÑÒÒúÑÒÑÒÒþÍÑ9ÑþÍÑ9ÑþÍÐ ÐþÑÐÐÑþÐÑÑ ÐþÑÐÐüÑÐÑÐÐúÍÏÏÐÏÐÐÏûÐÏÐÐÏÏúÐÏÏÐÐÏÏùÐÏÐÏÐÐÏÏóÐÏÏÐÏÐÐÏÐÏÏÐÏÏÐþÏüÍÏÏÎÎÏþÎÏÏøÎÏÎÎÏÎÎÏÏþÎÏÏþÎÏÏúÎÏÏÎÏÎÎõÏÎÎÏÎÎÏÎÎÏÎÎûÍÎÎÍÎÎþÍÎÎèÍÎÎÍÍÎÍÎÍÎÎÍÎÎÍÍÎÎÍÎÎÍÍÎÎýÍÎ;Í;ÍþÍÌÌÍÌþÍÌÌþÍÌÌýÍÌÍÍüÌÍÌÍÍÌÍýÌÍÌÌþÍÌÌúÍÌÍÌÌÍÍþÍÌÌüËÌËÌÌþËÌÌËóÌËËÌÌËÌÌËÌËËÌÌûËÌÌËÌÌðËÌÌËÌÌËËÌÌËÌËËÌþÍË ËþÊËËþÊËËþÊË ËþÊËËüÊËËÊÊýËÊþÍÊ9ÊþÍÊÊÉüÊÉÊÉÉÊÉþÊÉÉùÊÉÊÉÊÉÊÊÉþÊÉÉüÊÉÉþÍÉ9ÉþÍÈÈÉÈÉÈÉùÈÉÈÉÈÈÉÉ÷ÈÉÈÉÈÈÉÉÈÈÉÈùÉÈÉÉÈÉÈÈþÉûÍÈÈÇÈÈþÇÈÈþÇÈÈþÇÈÈÇûÈÇÈÇÈÈþÇÈÈþÍÇ9ÇþÍÆÆüÇÆÇÆÆþÇÆÆÇÆþÇÆÆþÇÆÆÇ ÆþÍÆ9ÆýGùÿ4ÿþÿ7ÿþÿ8ÿ:ÿþGÿ9ÿþùÿ9ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ?ͳçþæççþæçïçþæççæþçææþçææ÷çææççæççææþçææþçææüçæçææþçææþçææýåæååûæåææååæøåæåæååæååþæååþæååæøåæåææåæååæúåæåææååüæåæååôäåääååääåäåääåüäååääøåäåääåäååþäååþäååþäååþäååøäåääåäãääþãääþãääãäþãääþãääþãääãä€ãüâããâ âãâóãâããâãââããâãââüãâãââãâãâãâùãâãááâááâþáââýáâááýâáââþáââõáâááâáâááâááâøáâáâáâáââûáàáàááþàááþàááüàáàááþàá áûàááàá áþàááþàáá€àßþàßßàßàßþàßßàßþàßßàüßààßßþàßßàùßàßßààßßþàßßàþÞßßÞßÞûßÞßÞßßÞßþÞßßþÞßßøÞßßÞßÞßÞÞþßÞÞþßÞÞþÝÞÞþÝÞÞþÝÞÞýÝÞÝÝÞ÷ÝÞÞÝÞÝÞÝÞÞþÝÞÞþÝÞÞÝýÞÝÞÞýÝÞÝ7ÝþÜÝÝÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜûÝÜÝÝÜÜûÝÜÝÝÜÜÝÜÝBÜøÛÜÛÛÜÛÜÛÛúÜÛÜÜÛÜÜÛýÜÛÜÜÛÜþÛÜÜöÛÜÜÛÜÜÛÜÛÜÜÛÜýÛÜÛÛüÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛñÚÛÛÚÛÚÛÚÛÚÛÚÛÚÛÛüÚÛÚÛ ÛÚûÛÚÛÛÚ>ÚüÙÚÚÙ ÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÚÙÙîØÙØØÙÙØÙØØÙØØÙØÙÙØØþÙØØñÙØÙØÙØÙØØÙÙØÙÙØØîÙØÙÙØÙØÙØÙÙØØÙØØÙØBØþרØòר×רØ×ØØ×Ø×Ø×רüררØþרØ?×ýÖ×ÖÖü×Ö×ÖÖþ×ÖÖ×ýÖ×ÖÖþ×Ö Ö×Öþ×ÖÖÕþÖÕÕüÖÕÖÕÕþÖÕÕÖöÕÖÕÖÕÕÖÕÖÕÕûÖÕÖÖÕÕìÖÕÖÖÕÖÖÕÖÕÕÖÖÕÖÕÖÕÔÕÕþÔÕÕÔÕþÔÕÕÔÕÔøÕÔÕÕÔÕÔÕÕùÔÕÔÕÕÔÕÕÔÕúÔÕÕÔÔÕÕ€ÔúÓÔÔÓÔÓÓþÔÓÓúÔÓÔÓÔÓÓðÔÓÔÔÓÔÓÓÔÓÓÔÓÓÔÓ ÓÔÓþÔÓÓþÒÓÓñÒÓÒÓÓÒÓÓÒÓÒÒÓÓÒÒÓÒûÓÒÓÓÒÒÓûÒÓÒÓÒÒÓýÒÓÒÒÓúÒÓÑÒÑÒÒþÑÒÒþÑÒÒþÑÒÒþÑÒÒõÑÒÑÒÑÒÒÑÒÑÒÒÑÒûÑÒÑÑÒÒýÑÒÑ~ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐùÑÐÐÑÐÐÑÑÐþÑÐÐøÏÐÐÏÐÏÐÏÏôÐÏÐÏÏÐÏÐÐÏÐÏÏÐÏþÐÏÏüÐÏÐÏÏþÐÏÏþÐÏÏûÐÏÐÐÏÏ÷ÐÏÏÐÎÏÎÏÎÎÏÎÏüÎÏÎÏÏþÎÏÏþÎÏÏÎÏýÎÏÎÎÏÎÏÎÏÎùÏÎÏÎÎÍÎÎþÍÎ ÎþÍÎÎÍÎÍÎþÍÎÎûÍÎÎÍÎÎþÍÎÎýÍÎÍ~ÍÌùÍÌÍÌÌÍÌÌþÍÌÌþÍÌÌÍýÌÍÌÌþÍÌÌÍÌþÍÌÌüËÌÌËËÌþËÌÌËúÌËÌËÌËËýÌËÌÌþËÌÌËÌþËÌÌüËÌËÌÌôËÌÌËÌËËÌÌËËÌÌýËÊËËþÊË ËþÊËËÊüËÊËÊÊËþÊËËÊËüÊËËÊ>ÊÉþÊÉÉÊÉþÊÉÉüÊÉÊÉÉþÊÉÉüÊÉÊÉÉþÊÉEÉÈÉÈÉÈÉþÈÉÉÈÉÈýÉÈÉÉüÈÉÈÉÉøÈÉÉÈÉÈÈÉÉüÈÉÈÉÉýÈÉÈÈþÇÈ ÈþÇÈÈþÇÈÈûÇÈÈÇÈÈüÇÈÇÈ ÈþÇÈÈüÇÈÈÇ ÇþÆÇ1ÇûÆÇÆÇÆÆÇÆûÇÆÆÇÆÆüÇÆÇÆÆÇÆþÇÆÆûÇÆÆÇÆÆþÇÆDÆ?ÍÀçæçæþçææüçæçææçýæçææûçææçææþçææçæþçææüçåæååùæåæåææååüæååææå÷æåæåæååæååþæååþæååþæååþæååüæåæååþäååþäååäåäþåääåûäååäååþäååüäåäååäåòäååäåäååäååäãääþãääãäúãäãäãääþãääøãäãääããää‡ãâøãâãâããâããüâããââóãâãââãâããâãâããâãâãâãâúãââáâáá âáûâáâáââþáââúáâáâáââáúâááâáââáùâááââáââáüàáàááþàááþàááàýáàááàáúàááààááùàáàáààáá‚àßþàßßýàßààßþàßß÷àßßàßßààßßàýßàßßüàßàßßùàßàßàßÞÞûßÞßßÞÞúßÞÞßßÞÞßõÞßßÞßÞßÞßßÞÞßþÞßßÞßüÞßÞßß ÞüÝÞÝÞÞÝüÞÝÝÞÞþÝÞÞúÝÞÞÝÝÞÞüÝÞÝÞÞÝÞþÝÞÞ?ÝÜþÝÜÜÝÜþÝÜÜÝÜûÝÜÜÝÜÜþÝÜÜþÝÜÜúÝÜÜÝÝÜÜûÝÜÜÝÜ@ÜÛÜøÛÜÛÛÜÜÛÜÜÛÜûÛÜÜÛÜÜùÛÜÛÜÛÛÜÜöÛÜÛÜÛÜÛÜÛÜÜÛÚýÛÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛýÚÛÚ>ÚÙÚÙþÚÙÙþÚÙÙþÚÙ ÙþÚÙÙþÚÙÙþÚÙÙØÙØÙØþÙØØÙüØÙØÙÙØîÙØÙØÙØÙØØÙØØÙÙØÙØÙÙØÙNØþרØø×ØØ×Ø×רØþר Øþר Ø?×üÖ×Ö××ýÖ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×ÖÖ××Öú×ÖÖ××ÖÖþ×ÖÖ×ûÖÕÕÖÕÕÖÕÖÕþÖÕÕÖÕÖÕÖÕýÖÕÖÖÕþÖÕÕüÔÕÕÔÔýÕÔÕÕýÔÕÔÔÕþÔÕÕÔÕÔúÕÔÔÕÕÔÔÕþÔÕÕþÔÕÕýÔÕÔ~ÔÓþÔÓÓþÔÓÓüÔÓÔÓ ÓÔÓúÔÓÔÓÔÓÓþÔÓÓóÒÓÓÒÒÓÓÒÒÓÒÓÒÒúÓÒÓÒÒÓÓÒÓÒúÓÒÓÒÓÒÒÓÒôÓÒÓÓÒÒÓÓÑÒÑÒÒÑÒÑÒýÑÒÑÑòÒÑÒÑÑÒÑÑÒÑÒÑÑÒÒÑÒùÑÒÑÒÑÒÑÑþÒÑÑüÒÑÒÑ~ÑýÐÑÐÐÑÐüÑÐÑÐÐþÑÐÐÑÐþÑÐÐÑýÐÏÐÐüÏÐÐÏÏõÐÏÐÏÐÏÏÐÏÐÏÏÐûÏÐÏÏÐÐÏÐÏùÐÏÏÐÏÐÏÏÐÏÐÏûÎÏÏÎÏÏþÎÏÏþÎÏÏÎ÷ÏÎÎÏÏÎÎÏÎÎ ÏÎÏÎÏ ÎÍÎÍÎþÍÎÎþÍÎÎþÍÎ΀ÍÌþÍÌÌþÍÌÌÍÌÍÌÍÌÍùÌÍÍÌÌÍÌÌóÍÌÍÌÌÍÌÍÌÍÌÍÌÌúÍÌÌÍÍÌÌþËÌÌËÌËÌËÌüËÌËÌ ÌËÌËýÌËÌÌýËÌËËÌËÌÊ ËþÊËËÊËüÊËÊËËþÊËËþÊËËÊ Ë?ÊÉþÊÉÉúÊÉÊÉÊÉÉÊÉøÊÉÉÊÉÉÊÉÉþÊÉÉÊÉþÊÉDÉþÈÉÉþÈÉÉþÈÉÉøÈÉÈÈÉÈÉÈÈòÉÈÈÉÈÉÉÈÉÈÈÉÈÉÉÈùÉÈÉÈÈÉÈÈýÉÈÉÉþÈÉÉÈûÇÈÈÇÈ ÈþÇÈÈþÇÈÈþÇÈÈþÇÈÈþÇÈÈùÇÈÈÇÈÈÇAÇÆþÇÆÆþÇÆÆùÇÆÆÇÆÇÆÆþÇÆÆüÇÆÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆ@Æ?ÍçþæççþæçUçþæçCç æûçææçææþçææþçææùçæççæçææüçæçææþçææçæçøæåææåææååüæååææåôæåæååæååæåæååþæå åæåþæååõæåæäååääåäååäûåääåääüåäåääåäåäþåääüåääååùäååääåääãäþãääøãääãääãääûãäããääãäøãäãääããääþãääãâòãâããââããââãâãââãúâããâãââþãââãâþãââãâþãââãâáâüáâáââùáâáââáââáâùáâáââáââáâøáââááâáââöáâáàáàáààááüàáàááþàááàáþàááþàááàáþàááàßàßàßþàßßþàßßðàßßàßßàßßàßßàßàß ßþàßßàßìÞßßÞßßÞßßÞßßÞßßÞßßÞßßüÞßÞßßüÞßÞß ß÷ÞßÞÞßÞßÞßßþÞßßýÞÝÞÞþÝÞÞûÝÞÞÝÞÞÝÞþÝÞÞÝÞþÝÞÞüÝÞÞÝ?Ý ÜûÝÜÜÝÜÜúÝÜÝÜÝÜÜþÝÜÜ÷ÝÜÜÝÜÜÝÝÜÜþÝÜÜþÝÜÜùÝÜÝÝÜÝÜ@ÜÛÜÛÜýÛÜÛÛõÜÛÛÜÜÛÜÛÜÛÜÜúÛÜÛÛÜÛÛÜþÛÜÜþÛÜÜÛÜÛøÚÛÛÚÛÛÚÛÛúÚÛÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛúÚÛÛÚÚÛÛþÚÛÛþÚÛÛ?ÚÙþÚÙÙþÚÙ ÙþÚÙ ÙþÚÙÙÚÙÚÙþÚÙÙØþÙØØþÙØØúÙØØÙÙØØüÙØÙØØÙØþÙØØÙØøÙØØÙÙØÙØØþÙØØÙCØ×úØ×Ø×רØþרØþרØþרØþרØø×ØØ×ØØ×ØØþרØýר×?×Öþ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×Ö×ÖÖø×ÖÖ×ÕÕÖÕÕüÖÕÖÕÕöÖÕÖÕÕÖÕÕÖÕÕÖ ÕÖÕäÖÕÕÖÕÕÖÕÖÕÖÕÕÖÕÖÔÔÕÕÔÕÔÔÕÕÔÕÕÔùÕÔÕÕÔÕÔÔÕ÷ÔÕÕÔÕÕÔÔÕÕüÔÕÔÕÕüÔÕÔÕÕÔÕüÔÕÕÔÔÓûÔÓÓÔÓÓþÔÓÓþÔÓÓúÔÓÔÓÔÓÓûÔÓÓÔÓÓÒÓòÒÓÓÒÒÓÒÒÓÓÒÓÓÒÒûÓÒÓÓÒÒüÓÒÓÒÒÓÒþÓÒÒÓÒÓúÒÓÓÒÑÒÒüÑÒÑÒÒþÑÒÒÑ ÒêÑÒÒÑÑÒÒÑÑÒÑÑÒÑÒÑÑÒÑÒÒÑÑþÒÑÑýÒÑÒÒ€ÑÐþÑÐÐþÑÐÐþÑÐÐûÑÐÐÑÐÐüÑÐÑÐÐþÑÐÐþÏÐÐÏÐÏÐûÏÐÏÏÐÐÏÐ ÏÐúÏÐÏÐÐÏÏþÐÏÏýÐÏÐÐöÏÐÏÏÐÎÏÏÎÏÏùÎÏÎÏÎÎÏÏýÎÏÎÎúÏÎÎÏÏÎÎþÏÎÎûÏÎÎÏÎÎøÏÎÏÎÏÎÏÎÎÏÎûÏÍÎÍÎÎÍ ÎüÍÎÍÎÎüÍÎÍÎÎþÍÎÎÍÎþÍÎÎþÍÎÎüÍÎÎÍ‚ÍûÌÍÍÌÍÍÌùÍÌÍÌÌÍÌÌþÍÌÌþÍÌÌÍþÌÍÍÌÍÌþÍÌÌÍáÌÍËÌËËÌËÌËÌËÌËÌÌËËÌËËÌÌËËÌËÌËËÌÌúËÌËÌËÌÌËòÌËËÌËÌËËÌÌËËÌËËÌýËÌËËþÊËËüÊËÊËËÊËþÊËËÊËýÊËÊÊùËÊÊËËÊËË?ÊýÉÊÉÉÊ ÉÊÉþÊÉÉþÊÉÉþÊÉBÉþÈÉÉÈùÉÈÈÉÉÈÉÉüÈÉÈÉÉ÷ÈÉÉÈÉÉÈÈÉÉøÈÉÉÈÉÈÈÉÉÈÉÈüÉÈÇÈÈþÇÈ ÈüÇÈÇÈÈûÇÈÈÇÈÈûÇÈÈÇÈÈþÇÈ ÈúÇÈÈÇÈÇ?ÇÆþÇÆÆÇÆþÇÆÆþÇÆÆüÇÆÇÆÆÇÆþÇÆÆþÇÆÆþÇÆÆþÇÆ?Æÿ?Í?çþæç}çæçæþçææøçæçæçææççüæççææþçææþçææçûæåææååæåþæååæþåææåæðåæåæååææååæååææååæûåæåæååþæååþäååýäåääåþäåå÷äååääååäååäåäþåääýåäååäþãääûãääãääùãäããäãääüãäãääüãäãääãâõãââãâãâãâãââúãââããââöãâããââãâãââãýâãââøãââãâããââãõâáââáââáâáââáâþáââáþâááâôáââáâáââáâáââáâáâüáâáââáþàááàáþàááüàáàááþàááøàááààáàááþàáá‡àßðàßàßßàßßàßààßßàßßþàßßþàßßöàßßààßßààßßàßòàßàßßàßàÞÞßÞÞßßÞßøÞßÞÞßßÞßßÞßúÞßßÞÞßßôÞßßÞßßÞÞßßÞßßûÞßÞÝÞÞþÝÞÞøÝÞÞÝÞÝÝÞÞûÝÞÞÝÞÞþÝÞÞþÝÞÞþÝÞÞöÝÞÞÝÞÝÝÞÞÝ>ÝÜþÝÜÜÝ ÜþÝÜÜþÝÜÜÝÜÝÜÝDÜúÛÜÜÛÛÜÜûÛÜÜÛÜÜùÛÜÛÛÜÛÜÜþÛÜÜþÛÜÜþÛÜ ÜøÛÜÛÜÛÛÜÛÛþÚÛÛþÚÛÛÚÛþÚÛÛÚÛÚþÙÚÚþÙÚ ÚÙôÚÙÙÚÚÙÚÙÙÚÙÚÚÙùÚÙÙÚÙÚÙÙüÚÙÚÙÙüØÙÙØØÙØýÙØÙÙØþÙØØÙýØÙØØÙØðÙØØÙØÙØÙØÙØÙØÙÙØØüÙØÙØ?Øþר ØþרØüררØþרØþרØôרØ×ØØ×ØØ×רØþרØüרØ×>×Öþ×ÖÖõ×ÖÖ×ÖÖ××Ö×ÖÖ× Ö×Ö× ÖÕûÖÕÕÖÕÕïÖÕÕÖÕÕÖÕÖÕÕÖÕÖÕÖÕÕÖ÷ÕÖÕÖÖÕÕÖÕÕûÖÕÕÖÕÕüÖÕÖÕÕÖÕþÔÕÕÔþÕÔÔþÕÔÔÕýÔÕÔÔÕüÔÕÔÕÕûÔÕÔÔÕÕþÔÕÕýÔÕÔÔþÕÔÔþÕÔ~ÔÓûÔÓÓÔÓÓüÔÓÔÓÓþÔÓÓüÔÓÔÓÓÔÓüÔÓÔÓÓþÔÓÓùÒÓÓÒÒÓÒÒþÓÒÒÓÒ÷ÓÒÒÓÓÒÒÓÒÒ÷ÓÒÓÓÒÓÓÒÓÓýÒÓÒÒþÓÒÒüÑÒÑÒÒÑÒúÑÒÒÑÒÑÑÒþÑÒÒöÑÒÒÑÒÒÑÒÑÒÒÑÒôÑÒÑÑÒÒÑÒÑÒÒÑÑþÒÑÑüÐÑÐÑÑÐÑúÐÑÐÐÑÐÐüÑÐÑÐ ÐüÑÐÑÐÐþÑÐÐþÑÐÐöÏÐÏÐÐÏÐÏÏÐÐýÏÐÏÏÐÏøÐÏÐÏÐÏÏÐÐýÏÐÏÏüÐÏÏÐÐÏÐÏÐ÷ÏÐÏÐÏÏÎÏÎÎÏÎÏ÷ÎÏÎÎÏÎÏÎÏÏþÎÏÏþÎÏÏùÎÏÎÏÎÎÏÏùÎÏÏÎÏÎÏÏÎÏÎüÍÎÍÎÎÍÎúÍÎÎÍÍÎÎöÍÎÍÍÎÍÍÎÍÎÎûÍÎÎÍÎ ÎÍ΀ÍÌþÍÌ ÌôÍÌÍÍÌÍÌÌÍÌÍÌÌþÍÌÌÍÌÍÌÍÌõÍÌÍÌÍÍÌÌËËÌÌýËÌËËÌËÌËýÌËÌÌËöÌËËÌÌËËÌËÌÌËýÌËÌÌËÌþËÌÌËÊËÊËþÊËËúÊËËÊÊËËøÊËËÊËËÊËËþÊËËþÊËËÊËAÊýÉÊÉÉþÊÉÉùÊÉÊÉÉÊÉ ÉüÊÉÊÉÉþÊÉÉþÊÉÉþÊÉIÉ÷ÈÉÈÉÈÉÈÈÉÉÈÉÈÉíÈÉÈÉÉÈÉÈÉÈÈÉÈÈÉÉÈÉÈÈúÉÈÉÈÇÈÈÇýÈÇÈÈüÇÈÇÈÈþÇÈ ÈÇÈÇýÈÇÈÈþÇÈÈ?ÇûÆÇÆÇÆÆþÇÆÆþÇÆÆþÇÆ ÆþÇÆÆþÇÆÆüÇÆÇÆCÆ?Í+çþæçƒçþæçÞçþæççþæçç æþçææûçææçææûçææçææþçææþçææþçææþçææþçææúåæååæåå÷æååæåæåæååýæåææüåæåææåæåõæåæååæåæåæååæåäå÷äåäåääåäååäýåäååþäååäåäýåäååýäåääãäþãääüãäãääãäãäþãääþãääóãääããääãäãäãääãþäã~ãüâããââüãâãââãùâãâããâããâãâñãâããâããâãââãâãââãâáòâáââááââáââááââáûâáâáââøáââáââáâ âáâáþàááà áþàááøàááàááàááàáþàááþàááàßàßýàßààþßààßàøßàßßàßàßßöàßàßßààßàßßàößààßàßàßàßßÞùßÞßßÞÞßßãÞßßÞßÞßÞÞßßÞßÞßÞÞßÞßÞßßÞßÞßÞßßúÞßÞÞßÞÞüßÞßÞÞþßÞÞþÝÞÞøÝÞÞÝÞÞÝÞÞþÝÞÞüÝÞÝÞÞþÝÞÞûÝÞÞÝÞÞþÝÞÞúÝÞÞÝÞÝ6ÝþÜÝÝÜûÝÜÜÝÜÜøÝÜÝÜÜÝÝÜÜþÝÜÜÝÜþÝÜÜþÝÜEÜÛÜÛÜþÛÜÜúÛÜÜÛÜÛÛÜöÛÜÜÛÛÜÛÜÛÜÜìÛÜÛÜÛÛÜÛÛÜÜÛÛÜÛÜÜÛÜÛÛþÚÛÛþÚÛÛûÚÛÛÚÛÛÚÛÚúÛÚÛÛÚÛÛ?ÚÙþÚÙÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÚÙÙüÚÙÚÙÙüÚÙÚÙÙÚÙýØÙØØÙØÙØøÙØÙØÙØÙØØÙØþÙØØÙØþÙØØýÙØÙÙØÙúØÙÙØÙØBØûרØ×ØØþרØþרØöרØ×Ø×ØØ×ØØ×ØþרØ×ýØ×ØØýר×?×ýÖ×ÖÖþ×ÖÖþ×ÖÖ÷×Ö××Ö×Ö×ÖÖþ×ÖÖþ×ÖÖ÷×ÖÕÖÖÕÕÖÕÕÖÕÖÕíÖÕÕÖÕÕÖÕÕÖÕÖÖÕÖÖÕÖÕÕÖýÕÖÕÕÖ÷ÕÖÕÖÖÕÕÖÕÕõÔÕÕÔÕÕÔÕÕÔÕÕþÔÕÕþÔÕÕóÔÕÔÔÕÔÕÔÕÕÔÕÔÔÕøÔÕÔÕÔÕÔÕÕýÔÕÔ~Ô ÓÔÓþÔÓ ÓþÔÓÓþÔÓÓøÔÓÓÔÔÓÔÓÓþÔÓÓþÔÓÓûÔÓÒÒÓÓúÒÓÒÓÓÒÒúÓÒÒÓÓÒÒûÓÒÓÓÒÒÓúÒÓÒÒÓÒÒõÓÒÓÓÒÒÓÒÓÓÒÒòÑÒÒÑÑÒÑÒÑÒÒÑÒÑÑýÒÑÒÒúÑÒÑÒÑÒÒûÑÒÒÑÒÒüÑÒÑÒÒòÑÒÑÑÒÑÒÑÒÑÒÑÑÒÒÑÐÑ ÐÑ ÐþÑÐ ÐüÑÐÑÐÐþÑÐÐüÑÐÐÏÏÐÏûÐÏÏÐÏÏÐÏûÐÏÏÐÏÏúÐÏÐÐÏÐÐüÏÐÐÏÏöÐÏÏÐÏÐÏÐÐÏÏÎüÏÎÎÏÏÎÏøÎÏÎÎÏÏÎÏÏûÎÏÏÎÏÏÎþÏÎÎÏöÎÏÎÏÏÎÎÏÎÏÏþÎÏÏÎÍ ÎþÍÎÎþÍÎÎÍúÎÍÎÎÍÎÎùÍÎÍÎÎÍÎÎþÍÎÎüÍÎÍÎ΃ÍÌúÍÌÍÌÍÌÌÍÌÍûÌÍÌÌÍÍÌÍÌþÍÌÌÍÌõÍÌÌÍÌÍÌÍÌÌÍÍýÌÍÌÌËÌþËÌÌËÌËÌüËÌÌËËüÌËÌËËþÌËËÌûËÌËËÌÌËÊËþÊËËþÊËËÊ÷ËÊËÊËÊËÊËËþÊËËþÊËËüÊËÊËËÊË?ÊúÉÊÉÉÊÉÉÊúÉÊÉÉÊÉÉÊÉþÊÉÉûÊÉÉÊÉÉþÊÉAÉþÈÉÉÈÉþÈÉÉþÈÉÉÈÉüÈÉÉÈÈÉôÈÉÈÉÈÉÈÉÈÉÈÉÉúÈÉÈÈÉÈÈþÇÈÈûÇÈÇÇÈÈþÇÈÈÇÈûÇÈÈÇÈÈ@ÇÆÇÆÇÆøÇÆÇÆÆÇÇÆÆþÇÆÆþÇÆÆþÇÆÆÇÆþÇÆ>Æ?ÍkçþæçRçæþçææûçæççææùçæçææçææþçææþçææþçæ æçþæååýæåææ åþæååýæåææåúæåææåææåùæåææåæååäåéäåääååääååääåäåäåäååäåääþåääñåääåäåäåäåäååäååäþãääãäûãääãääþãä äþãä äñãääããääãääãäãäã€ãâØãâããâãâãââãâãâãââãâããâããâãâããââãââãââãâããâõãââãââããâãââúáâááâááýâáââþáââáñâáâááââáââáâááââáâþáââûáâááââáþàá áôàááàááààááàá áþàááàáüàáàááûàááàáá€àøßààßààßààßàßûàßßàßßàßüàßàßßàößàßàßßàßßààüßààßßÞßÞßþÞßßÞüßÞßÞÞßÞýßÞßßùÞßÞÞßÞßßýÞßÞÞýßÞßßÞÝÞþÝÞÞüÝÞÝÞÞÝÞÝþÞÝÝÞþÝÞÞÝÞüÝÞÝÞÞ?ÝÜþÝÜÜÝÜûÝÜÜÝÜÜþÝÜÜúÝÜÜÝÝÜBÜúÛÜÛÜÜÛÛüÜÛÛÜÜÛÜÛÜûÛÜÛÜÛÛþÜÛÛýÜÛÜÜýÛÜÛÛÜÛüÜÛÚÛÛÚÛþÚÛÛÚÛÚÛúÚÛÚÛÚÛÛÚÛþÚÛÛ?ÚÙÚÙþÚÙÙþÚÙÙùÚÙÚÙÚÚÙÙþÚÙÙ÷ØÙØØÙØØÙØØúÙØÙØØÙÙõØÙÙØÙÙØÙÙØÙÙØÙýØÙØØûÙØÙÙØEØø×Ø×רØ×ØØùררØ×Ø'Ø?×ýÖ×ÖÖû×ÖÖ×ÖÖþ×Ö Öþ×Ö Öþ×ÖÖþ×ÖÖ×ÖÕþÖÕÕýÖÕÖÖýÕÖÕÕÖùÕÖÖÕÖÖÕÕôÖÕÕÖÕÖÕÕÖÕÕÖÖÕþÖÕÕþÖÕÕõÖÕÖÖÕÕÖÕÖÕÔÔÕþÔÕÕøÔÕÕÔÕÕÔÕÕøÔÕÔÔÕÔÔÕÕÔ÷ÕÔÕÔÕÔÕÕÔÔÕýÔÕÔÔûÕÔÕÕÔ~ÔøÓÔÓÔÓÓÔÓÓþÔÓÓûÔÓÓÔÓÓþÔÓÓùÔÓÔÔÓÔÓÓûÔÓÔÔÓÓüÔÓÔÓ ÓÒÓÒþÓÒÒÓôÒÓÒÓÓÒÒÓÒÒÓÒÒþÓÒÒþÓÒÒÓÒÓôÒÓÒÒÓÒÓÒÒÓÑÒÒÑÒÑÒÑ÷ÒÑÒÒÑÒÒÑÒÒÑÒÑÒÑÒöÑÒÑÒÒÑÒÑÑÒÒüÑÒÒÑÑþÒÑ~ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐÑÐùÑÐÐÑÐÑÐÐÑÐþÑÐÐÏÐÏÐýÏÐÏÏòÐÏÏÐÏÏÐÐÏÏÐÏÐÏÏÐÏÐÏþÐÏÏþÐÏÏÐÏöÐÏÏÎÏÏÎÏÎÏÏñÎÏÎÏÎÏÏÎÎÏÎÏÎÎÏÏÎöÏÎÎÏÎÏÏÎÎÏÏõÎÏÎÏÎÏÎÎÏÎÏÏÎÏÍþÎÍÍýÎÍÎÎþÍÎÎÍÎûÍÎÎÍÎÎûÍÎÎÍÎÎûÍÎÍÍÎÎùÍÎÍÎÎÍÎ΀ÍÌûÍÌÌÍÌÌÍÌÍÌÍÌÍþÌÍÍôÌÍÌÍÌÍÌÌÍÌÍÌ ÌþÍÌÌËÌËÌöËÌÌËËÌÌËËÌÌËðÌËËÌËÌÌËËÌÌËÌËËÌÌúËÌËÌËÌÌüËÌÌËËþÊËËþÊË ËÊ ËüÊËÊËËþÊËËÊËúÊËËÊËÊ?ÊÉþÊÉÉûÊÉÉÊÉÉÊÉúÊÉÊÉÊÉÉþÊÉÉþÊÉÉÊÉÊÉÊúÉÊÉÉÊÉ?ÉùÈÉÈÈÉÈÉÉýÈÉÈÈÉÈÉÈÉöÈÉÈÉÈÉÉÈÉÈÈÉûÈÉÉÈÉÉöÈÉÈÉÉÇÈÈÇÈÈþÇÈÈþÇÈÈøÇÈÈÇÈÈÇÈÈþÇÈÈûÇÈÇÈÇ>ÇýÆÇÆÆûÇÆÆÇÆÆÇÆþÇÆÆÇÆûÇÆÆÇÆÆþÇÆÆþÇÆÆþÇÆCÆÿ?ÍFçþæçwçæüçæçææþçæ æûçæççæ æõçææçææççæçææþçææåæýåæååæåæåùæååæååææåþæååæåöæååææåæåæååùæåæåæåææåýæäååäüåäåääåþäååøäåäåäååääåäåýäåääýåäååäåäþåääùåäãäããä äþãääüãäãääþãääûãäããä äþãää‚ãâãâãâûãââãââãâòãâããâãâãâããââããâóãââãââãâãâããââáâáâþáââáâáýâáââûáâáâááâúáââááââáâáûàááàááþàááþàááþàá áþàááüàáàáá€àþßààûßàßàßßàýßàßßãàßàßààßààßààßßààßàßßààßààßßàßßàßàßÞßýÞßÞÞßüÞßßÞÞßÞûßÞÞßÞÞßûÞßÞßÞÞßûÞßÞÞßßÞÝùÞÝÞÝÞÝÞ ÞüÝÞÝÞÞþÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞþÝÞÞ?ÝÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜÝÜþÝÜÜÝBÜþÛÜÜþÛÜÜûÛÜÛÜÛÛÜöÛÜÜÛÜÛÛÜÜÛÛÜÛÜüÛÜÜÛÛüÜÛÜÛÛÜùÛÜÜÛÚÚÛÛþÚÛÛÚÛþÚÛÛÚÛûÚÛÛÚÛÛþÚÛÛþÚÛÛþÚÛÛ@ÚÙÚÙÚÙÚýÙÚÙ ÙûÚÙÙÚÙÙþÚÙÙüÚÙÚØØøÙØÙÙØØÙØØÙòØÙÙØØÙÙØØÙØØÙØØÙØÙñØÙØØÙØØÙÙØÙØÙÙØDØ×ØþרØþרØþרØþרØþרØ×ýØ×ØØùר×ררØùרØ×ØØ×@×Öþ×ÖÖþ×ÖÖþ×ÖÖø×Ö×Ö×Ö×ÖÖþ×Ö Öþ×ÖÖÕþÖÕÕøÖÕÖÕÖÕÖÕÕþÖÕÕûÖÕÕÖÕÕþÖÕÕÖÕûÖÕÕÖÕÕþÖÕÕÖÕÖÕþÔÕÕÔÕüÔÕÔÕÕúÔÕÔÕÔÕÕ÷ÔÕÔÕÔÕÔÕÔÔóÕÔÔÕÕÔÔÕÔÔÕÔÕÕ€ÔúÓÔÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓùÔÓÓÔÓÔÓÓúÒÓÓÒÓÒÒýÓÒÓÓÒòÓÒÒÓÓÒÒÓÒÓÒÓÒÓÓÒÓÒôÓÒÓÒÓÒÓÒÓÒÓÒÒûÑÒÑÑÒÒÑúÒÑÑÒÒÑÑøÒÑÒÑÒÑÒÑÑþÒÑÑÒôÑÒÒÑÑÒÑÒÒÑÑÒÒÑÒÑÒÑÐþÑÐÐþÑÐÐùÑÐÐÑÐÑÐÐþÑÐÐþÑÐÐüÑÐÐÑÑÐûÑÐÐÑÐÐþÑÐÐÏûÐÏÐÐÏÏþÐÏÏÐþÏÐÐûÏÐÐÏÐÐüÏÐÏÐÐÏþÐÏÏåÐÏÏÐÏÏÐÏÐÏÏÐÏÏÐÏÐÎÏÎÏÎÏÎÏÎÏÏùÎÏÏÎÏÎÏÏ÷ÎÏÎÎÏÎÏÎÏÏõÎÏÎÎÏÏÎÏÏÎÏÏþÎÏÏÎÏûÎÏÎÍÎÎþÍÎÎûÍÎÍÍÎÎúÍÎÍÎÍÎÎøÍÎÎÍÎÎÍÎÎþÍÎÎÍ ÎþÍÎ΀ÍÌÍüÌÍÍÌÌûÍÌÍÍÌÌÍÌÍýÌÍÌÌøÍÌÍÌÍÍÌÍÍÌþËÌÌùËÌËÌËÌËËüÌËÌËËùÌËÌËËÌËËüÌËÌËËÌþËÌÌþËÌÌËÌþËÌÌËýÌÊËËÊýËÊË ËÊýËÊËËûÊËËÊËËþÊËËùÊËÊËÊËÊ>ÊÉóÊÉÊÊÉÊÊÉÊÉÉÊÉÉþÊÉÉúÊÉÉÊÊÉÉüÊÉÊÉÉþÊÉAÉÈ÷ÉÈÉÉÈÉÉÈÉÉÈÉÈÉþÈÉÉüÈÉÈÉÉþÈÉÉøÈÉÈÈÉÉÈÉÉÈõÇÈÈÇÈÇÇÈÈÇÈ ÈþÇÈÈþÇÈÈÇÈûÇÈÈÇÈ È÷ÇÈÇÈÇÇÈÈÇ<ÇüÆÇÇÆÆÇÆþÇÆÆÇÆÇýÆÇÆ ÆúÇÆÆÇÇÆEÆ?Íçþæç™çþæç&çþæçóçæþçææþçææûçææçææúçææççææûçææçææüçæçææþçææþçææúçæçææååæüåææååþæååóæååæååæååæååææåæåþæååýæåææåùæåæåæäååþäååþäååþäååöäååääååääååöäååääååääååäåùäååääåääþãää÷ãäãääãäãääüãäãääúãääããääãòäãäãäãääãääãäã~ãøâãâãâããââýãâããâãùâãâãâãââþãââã âýãâããâþáââþáââþáââüáâáââüáâáââüáâáââáðâáâáâáâááââáâáàá áþàááàýáàááþàááüàáàááàáàá€àßàßüàßßààßàßàûßàßàßßàøßààßßàßààüßàßààßàßþÞßßûÞßßÞßßÞßûÞßßÞßßÞßþÞßßÞößÞßÞÞßßÞÞßßþÞßßþÞßßÞþÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞûÝÞÝÝÞÞÝÞÝÞþÝÞÞ@ÝÜþÝÜÜþÝÜ ÜøÝÜÝÝÜÜÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜGÜÛñÜÛÛÜÛÛÜÛÛÜÜÛÛÜÛÛÜÛÜõÛÜÜÛÛÜÛÜÜÛÜÜýÛÜÛÛýÜÛÜÜ÷ÛÜÛÜÜÛÜÚÛÛüÚÛÛÚÚÛþÚÛÛþÚÛÛþÚÛÛ?ÚýÙÚÙÙþÚÙ ÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙ ÙùÚÙÚÙÙØÙÙýØÙØØùÙØÙÙØØÙÙþØÙÙØþÙØØÙüØÙØÙÙùØÙØØÙÙØØ÷ÙØØÙÙØØÙØØþÙØCØþר ØþרØþרØþרØòרØ×ØØ×ØØ×ØØ×ØØø×ØØ×Ø×Ø×>×Öó×ÖÖ×Ö×ÖÖ××Ö×ÖÖþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖþ×ÖÖ÷×Ö×Ö××Ö×ÖÖþ×ÖÖÕÖÕÖÕúÖÕÖÕÕÖÖùÕÖÕÕÖÖÕÕÖÕÖþÕÖÖýÕÖÕÕþÖÕÕúÖÕÖÕÖÕÕÔÕÔøÕÔÕÔÕÔÔÕÕüÔÕÔÕÕùÔÕÔÕÕÔÕÕïÔÕÕÔÔÕÔÔÕÔÕÕÔÕÔÔÕÕþÔÕÕ€ÔýÓÔÓÓþÔÓÓþÔÓÓþÔÓÓÒùÓÒÓÒÓÓÒÒûÓÒÒÓÒÒÓÒÓþÒÓÓÒþÓÒÒÓÒÓ ÒÑÒüÑÒÑÒÒûÑÒÒÑÒÒüÑÒÑÒÒøÑÒÑÒÑÒÑÒÒþÑÒÒþÑÒÒ‚ÑÐüÑÐÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐÑÐþÑÐÐùÏÐÏÐÐÏÐÐíÏÐÏÏÐÏÐÏÐÏÏÐÏÏÐÐÏÐÏÏÐüÏÐÐÏÏøÐÏÏÐÐÏÐÏÏÐïÏÐÏÐÏÎÏÎÏÎÎÏÎÏÎÏÎÎûÏÎÏÎÏÏþÎÏÏÎÏÎôÏÎÏÏÎÎÏÏÎÏÎÏÏùÎÏÎÎÏÎÏÏýÎÏÎÎþÍÎ ÎûÍÎÎÍÎÎþÍÎÎþÍÎÎþÍÎÎûÍÎÎÍÎÎÍÎÍüÌÍÍÌÌÍþÌÍÍÌøÍÌÍÍÌÍÍÌÌöÍÌÌÍÍÌÍÌÌÍÍöÌÍÌÍÌÌÍÌÍÌÌìÍÌÍÍÌÌÍÌÌËÌËÌÌËÌÌËÌËËüÌËËÌÌË÷ÌËÌËËÌËÌËËýÌËÌÌËÌËÌúËÌËÌËÌÌðËÌËÌÌËÊÊËËÊÊËËÊËËÊËþÊËËùÊËËÊËÊËËþÊËËüÊËËÊÊËþÊËËþÊËË?ÊÉüÊÉÊÉÉýÊÉÊÊ ÉþÊÉÉþÊÉÉÊÉþÊÉÉúÊÉÊÉÊÉEÉÈîÉÈÉÈÈÉÈÉÈÉÉÈÉÉÈÉÉÈÈüÉÈÈÉÉÈýÉÈÉÉÈÉüÈÉÈÉÉÈÉüÈÉÉÈÈüÇÈÇÈÈþÇÈÈûÇÈÇÇÈÈÇ ÈÇÈþÇÈÈþÇÈÈÇÈ@ÇÆüÇÆÇÆ ÆþÇÆÆûÇÆÆÇÆÆÇýÆÇÆÆþÇÆÆþÇÆÆÇ?Æ?ÍÀçýæçææçýæçææúçææçæççòæçæçææçæçææççæ æþçææåþæååùæååæååææúåææåæååþæååþæååøæååæåææååæþåææåäùåääååäååûäåäåääúåäååäååùäåäååäååéäååäåääåäåäåäåäåäåääååääòãääããääãäããäãääãäøãäããääãääþãääþãääãäãâøãââãââãââöãââãâãâãâããýâãââãâãâþãââþãââúãââããââ÷áâááââááââáâáøâááââááââóáâááââááâáââááâþáââáþàááþàááþàááúàáàáàááàáþàááþàááüàáàáá„àþßààüßààßßþàßßàþßààüßààßßàßúàßßààßßàýßàßßþàßßÞþßÞÞßþÞßßøÞßßÞÞßÞßßÞþßÞÞþßÞÞßþÞßßÞÝÞÝÞüÝÞÝÞÞõÝÞÞÝÞÞÝÞÞÝÞÞþÝÞÞþÝÞÞþÝÞÞAÝÜþÝÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜöÝÜÝÜÝÜÜÝÝÜÜÝýÜÝÜÜÝ?ÜÛÜûÛÜÜÛÜÜúÛÜÜÛÛÜÜúÛÜÛÛÜÛÛýÜÛÜÜþÛÜÜìÛÜÛÜÜÛÜÛÜÜÛÜÜÛÜÜÛÜÛÜÜþÚÛÛøÚÛÚÛÛÚÚÛÛþÚÛ#ÛþÚÛÛ?ÚýÙÚÙÙþÚÙ ÙúÚÙÙÚÚÙÙþÚÙÙÚÙÚÙþÚÙÙØþÙØØúÙØØÙÙØØÙòØÙØÙØÙØØÙÙØÙÙØØùÙØÙÙØÙØØùÙØÙÙØÙØØûÙØØÙØCØþרØþרØüררØ×ØþרØþרØýר×@×Öþ×ÖÖú×ÖÖ××ÖÖ×Öü×Ö×Ö Ö×Ö×Öø×ÖÖ×ÖÖ×ÖÖÕÖÕÖúÕÖÖÕÖÕÕëÖÕÕÖÖÕÕÖÖÕÕÖÕÖÕÖÖÕÕÖÕÕþÖÕÕþÖÕÕÖûÕÖÕÖÕÕþÖÕÕüÔÕÔÕÕüÔÕÔÕÕûÔÕÔÕÔÔúÕÔÔÕÕÔÔÕþÔÕÕþÔÕÕùÔÕÕÔÕÕÔÔÕýÔÕÔÔüÕÔÕÔÔÓûÔÓÓÔÓÓùÔÓÔÔÓÔÓ ÓÔÓÔÓûÔÓÔÔÓÓþÔÓÓ ÒþÓÒÒþÓÒÒúÓÒÓÒÓÒÒþÓÒÒÓÒÓ÷ÒÓÓÒÒÓÒÓÒÒÓóÒÓÒÓÒÓÒÒÑÒÑÒÑÑÒþÑÒÒÑÒýÑÒÑÑÒÑÒþÑÒÒõÑÒÑÒÑÑÒÒÑÑÒÒ€ÑÐþÑÐÐþÑÐÐÑÐüÑÐÑÐÐùÑÐÑÐÐÑÐÐþÑÐ ÐüÑÐÑÐÐúÑÐÏÏÐÏÏýÐÏÐÐøÏÐÏÐÏÏÐÏ ÏýÐÏÐÐÏÐÏþÐÏÏþÐÏÏþÎÏÏûÎÏÏÎÏÏÎÏÎÏÎþÏÎÎÏúÎÏÏÎÎÏÏÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎûÍÎÍÍÎÎþÍÎÎÍÎþÍÎ ÎÍýÌÍÌÌùÍÌÍÌÌÍÌÌþÍÌÌüÍÌÍÌÌÍÌúÍÌÌÍÌÍÍÌÍÌüÍÌÌÍÍúÌÍËÌËÌÌúËÌÌËÌËËûÌËÌÌËËÌËÌöËÌÌËËÌÌËËÌÌþËÌÌËþÌËËòÌËËÌÌËÌËËÌËËÊËËüÊËÊËËûÊËËÊËËúÊËËÊÊË ËþÊËË@ÊÉüÊÉÊÉ ÉûÊÉÉÊÉÉþÊÉÉÊõÉÊÉÉÊÉÊÉÉÊÉBÉÈýÉÈÉ ÉþÈÉÉÈûÉÈÉÈÉÉüÈÉÈÉÉÈÉþÈÉÉÈÉýÈÇÈ ÈöÇÈÇÈÇÈÈÇÇÈÈÇöÈÇÈÈÇÈÈÇÇÈÈÇÈþÇÈÈ?ÇÆüÇÆÇÆÆûÇÆÆÇÆ ÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆûÇÆÇÇÆ@Æÿ?ÍÀçæþçææþçææþçææûçæççæ æþçææçæþçææýçæççæþçææýåæååæúåæååæååæýåæååôæåææåæååæåæååæåæùåæåææåææþåääåùäåäåääååþäååôäååääåääååäååäøåäåääååääüåääååäûãääãääþãä äûãääãä äãäþãää€ãôâãâãâããâããâããúâããââããþâããâöãââããâãâãââþãââãâþãââãýâãââùãâááââááâûáââáââþáââáøâáâááâáââáýâáââáâþáââúáââáâááþâááþàááüàáàááþàááþàááàúáàááàááüàáàááàáúàáàáàááàßàüßàßààßþàßßþàßßûàßßàßßàüßààßßàýßàßßþàßßëÞßÞßßÞÞßÞßßÞßÞßÞßÞßÞßßóÞßÞßÞÞßßÞÞßÞßßÞýßÞßßþÞßßÞýßÞßßÞüßÞÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞûÝÞÞÝÞÞÝÞþÝÞ Þ+ÝþÜÝÝÜþÝÜÜþÝÜÜûÝÜÜÝÜÜúÝÜÜÝÝÜÜþÝÜÜþÝÜÜüÝÜÝÜÜÝFÜÛøÜÛÛÜÛÜÛÜÜýÛÜÛÛÜüÛÜÛÜÜ÷ÛÜÜÛÜÜÛÜÛÛÜþÛÜÜÛÜùÛÜÜÛÜÜÛÛþÚÛ ÛþÚÛÛûÚÛÛÚÛ ÛþÚÛÛþÚÛ Û@ÚûÙÚÙÚÙÙþÚÙÙûÚÙÚÚÙ ÙþÚÙÙþÚÙÙÚ ÙØþÙØØûÙØÙÙØØûÙØØÙØØ÷ÙØÙØÙØÙØÙÙïØÙØÙØÙØØÙØØÙÙØÙÙØ>Ø×ØþרØþרØ×Ø×ØþרØþרØ×ØþרØþרØûרØ×Ø Ø?×Öþ×Ö Öþ×ÖÖþ×ÖÖþ×ÖÖú×Ö×Ö×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖù×ÖÖÕÖÕÖÖìÕÖÖÕÖÕÖÕÖÖÕÕÖÖÕÖÕÕÖÕÕøÖÕÕÖÕÖÕÖÖÕÖ÷ÕÖÖÕÖÕÕÖÕÕýÔÕÔÔÕüÔÕÕÔÔÕùÔÕÔÔÕÔÕÕþÔÕÕôÔÕÕÔÔÕÔÕÔÔÕÔÔûÕÔÕÔÕÕõÔÕÕÔÔÕÔÔÕÕÔ~ÔýÓÔÓÓãÔÓÓÔÓÔÓÓÔÓÔÓÔÔÓÔÓÓÔÔÓÔÓÓÔÓÓÔÓÓ÷ÔÓÔÓÓÔÓÔÓ ÓÔÓÔüÓÒÓÒÒÓýÒÓÒÒýÓÒÓÓÒþÓÒÒÓüÒÓÓÒÒùÓÒÓÒÒÓÒÒÓýÒÓÒÒþÓÒÒÓýÒÓÒÒÑýÒÑÒÒÑÒöÑÒÑÒÑÒÑÒÑÒÒÑÒÑüÒÑÑÒÒþÑÒÒøÑÒÒÑÒÒÑÒÒüÑÒÒÑ~ÑÐ÷ÑÐÑÐÑÐÑÑÐÐûÑÐÐÑÐÐþÑÐÐþÑÐÐóÑÐÐÑÐÑÐÐÏÐÏÐÏÏÐÏþÐÏÏÐÏúÐÏÐÏÐÏÏþÐÏÏùÐÏÏÐÏÐÏÏûÐÏÏÐÏÏÐûÏÐÏÐÏÏÎÏùÎÏÎÎÏÎÏÏüÎÏÎÏÏþÎÏÏóÎÏÎÏÏÎÎÏÏÎÏÎÏÏÎÏÎþÏÎÎþÏÎÎüÍÎÍÎÎþÍÎÎûÍÎÎÍÎÎíÍÎÎÍÎÎÍÎÎÍÎÎÍÍÎÎÍÍÎÎúÍÎÍÎÍÎÎÍÌ÷ÍÌÍÌÍÍÌÍÌÌüÍÌÍÌÌøÍÌÌÍÌÌÍÌÌþÍÌÌþÍÌÌøÍÌÌÍÌÍÌÍÍÌøÍÌÍËÌÌËÌÌËþÌËËÌòËÌÌËÌÌËÌËÌÌËËÌÌüËÌËÌÌüËÌÌËËúÌËÌËËÌÌËúÊËÊËÊËËþÊËËþÊËËþÊËËúÊËËÊÊËËúÊËËÊËÊ>ÊÉöÊÉÊÉÉÊÊÉÊÉÉûÊÉÉÊÉÉÊÉþÊÉÉÊ÷ÉÊÉÊÊÉÉÊÉÉþÊÉAÉúÈÉÈÉÉÈÈþÉÈÈøÉÈÉÈÈÉÉÈÈýÉÈÉÉüÈÉÉÈÈõÉÈÉÉÈÉÉÈÉÈÉÉþÈÉÉþÈÉÉûÈÉÈÇÈÈþÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈùÇÈÇÈÈÇÈÈ@ÇÆþÇÆÆþÇÆÆôÇÆÆÇÆÇÆÇÆÆÇÆÆüÇÆÇÆÆûÇÆÆÇÆ ÆþÇÆBÆ?Í çþæç"çþæçŒçæûçææçææçæþçææûçææçææþçææþçææþçææþçææöåæåæåæåææååöæåæåæåææåææåæåæõåæåææåææåæååæåûæåææååäýåäååþäååþäååäüåääååüäåäååùäåäååäååäåøäåäåääåääþãä-äþãääúãäãäãää€ãýâãââãâã÷âãâãâããâããâñãâããââããââãâãâããâãüâããââüãâãââáâáþâááâáâáâüáâáââüáâáââáâþáââáâøáâáàáààááúàááààáá÷àáààááàáààáþàááþàááýàáà~àßüàßàßßþàßßüàßàßßöàßàßàßààßààßüàßßààþßààßàýßÞßßÞßüÞßßÞÞùßÞÞßÞßÞÞûßÞÞßÞÞßøÞßÞÞßßÞßßþÞßßþÞßßþÞßßúÞßßÞÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞÝÞþÝÞÞþÝÞÞÝÞÝÞøÝÞÞÝÞÝÝÞÞÝþÜÝ"Ý ÜþÝÜÜþÝÜÜÝÜüÝÜÝÜÜþÝÜHÜÛÜýÛÜÛÛüÜÛÜÛÛøÜÛÜÛÜÜÛÜÜúÛÜÛÜÛÜÜøÛÜÛÛÜÛÜÛÛÜÛÜÛýÜÛÜÜÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛÚÛþÚÛÛÚÛÚÛýÚÛÚÚþÙÚ+ÚýÙÚÙÙÚÙüÚÙÚÙÙûÚÙÙÚÙÙþÚÙÙÚûÙÚÙÚÙÙøÚÙÚÙÙÚÚÙÙîØÙØÙØØÙÙØÙØÙØØÙØØÙÙØÙüØÙÙØØþÙØØÙýØÙØØþÙØØùÙØÙØÙÙØBØþרØùרר×רØþר ØöררØ×ØØ×ØØûר×רØþרØ@×Öþ×ÖÖþ×ÖÖö×Ö×Ö×Ö×Ö×ÖÖû×ÖÖ×ÖÖ×÷Ö××Ö×ÖÖ×ÖÖ×ýÖ×ÖÖþÕÖÖÕöÖÕÖÖÕÕÖÕÖÕ ÕýÖÕÖÖÕÖÕùÖÕÖÕÕÖÕÕÖûÕÖÕÖÕÕþÔÕÕöÔÕÔÔÕÕÔÕÔÕÕÔÕüÔÕÕÔÔýÕÔÕÕûÔÕÕÔÕÕûÔÕÕÔÕÕÔüÕÔÔÕÕÔóÓÔÓÔÓÔÓÓÔÔÓÔÓÓÔÓþÔÓ ÓÔÞÓÔÓÓÔÓÓÔÓÓÔÓÔÓÓÔÓÔÓÓÔÓÓÔÒÒÓÒÒÓÒÒÓÒÒüÓÒÒÓÓÒÓòÒÓÓÒÓÓÒÓÒÓÒÒÓÒÒÓÒÓÒÓòÒÓÒÒÓÒÒÓÒÒÑÒÒÑÑûÒÑÑÒÑÑÒÑÒãÑÒÑÑÒÑÒÑÑÒÑÑÒÑÒÒÑÑÒÒÑÑÒÑÑÒÑÒÑÑüÒÑÑÒÒÑýÐÑÐ ÐþÑÐÐÑÐÑÐüÑÐÑÐÐüÑÐÑÐÐÑÐþÑÐÐÑÏüÐÏÐÏÏþÐÏÏûÐÏÏÐÏÏóÐÏÐÏÏÐÐÏÏÐÏÐÏÏ ÐÏþÐÏÏÐÏÐÏþÎÏÏÎÏÎÏþÎÏÏÎýÏÎÏÏÎúÏÎÏÏÎÏÏúÎÏÏÎÏÎÎÏÎÏ ÎþÍÎÎ÷ÍÎÎÍÎÎÍÍÎÎÍÎÍÎþÍÎÎþÍÎÎýÍÎÍ~ÍÌÍÌøÍÌÌÍÍÌÍÌÌÍÌúÍÌÍÌÌÍÍÌþÍÌÌþÍÌÌÍÌþÍÌÌûËÌËËÌÌùËÌÌËÌËÌÌËÌþËÌÌýËÌËËøÌËÌËÌËËÌÌþËÌÌüËÌÌËËþÊËËþÊËËÊöËÊÊËËÊÊËÊËËûÊËËÊËËÊËÊËûÊËËÊËËAÊüÉÊÊÉÉþÊÉÉÊÉþÊÉ ÉÊÉÊÉúÊÉÉÊÊÉ@ÉþÈÉÉþÈÉÉþÈÉÉöÈÉÉÈÉÈÈÉÈÉÉüÈÉÈÉÉÈðÉÈÉÉÈÈÉÈÉÉÈÉÈÉÈÉÉÈùÉÈÈÇÈÇÈÈÇÈÇúÈÇÈÈÇÈÈûÇÈÈÇÈÈÇÈÇüÈÇÇÈ È?ÇÆþÇÆÆþÇÆÆþÇÆÆÇþÆÇÇùÆÇÇÆÆÇÆÆûÇÆÆÇÆÆþÇÆÆþÇÆ@Æ?ÍþæçäçþæçØçæþçææþçææçæçæüçæçææþçææþçææåúæåæåæååûæåææååþæååæùåææååæåå÷æåæåæåææååæåæüåææååøäåäååääååþäååä åüäååääåäåäåäûãääãääûãäããääþãääãøäãääãäãää€ãþâããâòãââãââãâããâãâããâþãââüãâãââãýâãââþãââáâýáâááâüáâáââáâþáââáâðáâáâáâááââááâáâááþàáá÷àááààááàááüàáàááþàááàáþàá áþàááàßàßüàßßààßüàßàßßüàßàßßûàßààßßàþßààßþàßßýàßààßþÞßßüÞßÞßßþÞßßüÞßÞßßÞûßÞßÞßßõÞßÞßÞßÞßßÞßßÞýßÞßßüÞßßÞÞûÝÞÝÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞýÝÞÝ>ÝÜþÝÜÜùÝÜÜÝÜÝÜÜÝÜûÝÜÝÝÜÜûÝÜÜÝÜÜÝÜüÝÜÝÜÜþÝÜCÜÛýÜÛÜ ÜþÛÜÜýÛÜÛÛúÜÛÜÛÛÜÜþÛÜÜûÛÜÜÛÜÜÛÜõÛÜÛÛÜÚÛÚÛÚÛÛþÚÛÛþÚÛÛþÚÛÛÚ ÛþÚÛÛþÚÛÛþÚÛÛ+ÚþÙÚÚÙûÚÙÙÚÙÙþÚÙ ÙþÚÙÙüÚÙÚÙÙÚÙþÚÙÙþÚÙÙþÚÙÙØþÙØØþÙØØþÙØØÙûØÙØØÙÙØöÙØÙØØÙØÙØÙÙúØÙØÙØÙÙýØÙØDØþרØþרØþרØ×Ø×ýØ×ØØþרØþרØþרØüרØ×>×Öþ×ÖÖû×Ö××ÖÖþ×ÖÖû×Ö××ÖÖ×ýÖ×ÖÖþ×ÖÖ×Öþ×ÕÕÖÕùÖÕÖÕÕÖÕÕÖüÕÖÕÖÖûÕÖÕÕÖÖÕþÖÕÕÖýÕÖÕÕÖúÕÔÕÔÕÔÔÕþÔÕÕÔÕÔÕÔýÕÔÕÕÔüÕÔÕÔÔÕÔþÕÔ~ÔýÓÔÓÓÔÓÔÓþÔÓÓþÔÓ ÓþÔÒÒüÓÒÓÒÒõÓÒÒÓÒÒÓÒÓÒÓÓüÒÓÒÓÓÒþÓÒÒÓøÒÓÓÒÒÓÓÒÒÓïÒÓÓÒÓÒÒÓÒÒÑÒÒÑÒÑÒÒûÑÒÒÑÒÒþÑÒÒÑþÒÑÑþÒÑÑÒþÑÒÒÑÒüÑÒÒÑ~ÑÐþÑÐÐþÑÐÐÑÐÑøÐÑÐÑÐÐÑÐÐþÑÐÐýÏÐÏÏþÐÏÏïÐÏÐÏÐÐÏÐÏÐÏÐÏÐÏÐÏÏÐÏÐüÏÐÐÏÏÐÏõÐÏÏÐÐÏÏÐÏÏÎÎÏÎÏøÎÏÏÎÏÎÎÏÏþÎÏÏÎÏÎÏéÎÏÎÏÎÏÎÏÎÏÏÎÏÏÎÏÎÎÍÎÎÍÎÎÍÎþÍÎÎùÍÎÎÍÎÍÎÎÍýÎÍÎÎùÍÎÎÍÎÍÎÎûÍÎÎÍÎÎýÍÎÍ€ÍúÌÍÍÌÍÌÌÍûÌÍÌÍÌÌÍÌõÍÌÍÌÌÍÌÌÍÍÌÌþÍÌÌùÍÌÍÌÌÍÌÌþÍÌÌþËÌÌþËÌÌüËÌËÌÌËÌúËÌÌËËÌÌþËÌÌùËÌËÌËËÌÌËÌøËÌËÌÌËÌËËþÊËËþÊËËþÊËËûÊËËÊËËþÊËËþÊË ËüÊËÊËË@ÊùÉÊÉÊÉÊÉÉþÊÉÉüÊÉÊÉÉÊÉùÊÉÊÉÉÊÉÉüÊÉÊÉÉúÊÉÊÉÊÉBÉÈøÉÈÈÉÉÈÉÈÈÉíÈÉÈÉÈÉÉÈÉÈÈÉÈÉÈÉÉÈÉÉþÈÉÉÈúÉÈÉÉÈÉÉþÈÉÉýÈÉÈ ÈþÇÈÈþÇÈÈþÇÈÈúÇÈÈÇÈÇÇ ÈþÇÈÈþÇÈ ÈÇþÆÇ'ÇÆþÇÆÆþÇÆÆûÇÆÆÇÆÆüÇÆÇÆÆÇÆøÇÆÇÇÆÆÇÆ ÆþÇÆÆþÇÆCÆÿ?ÍýçæçîçþæçDçþæç†çæþçææïçææçææçææççæçææçææþçæ æûçææçææûçææçææçæûåææåææåæýåæååúæååææååøæåææååæååþæååþæååæþäååäåäûåääåääýåäååüäåäååþäååäåúäååääååäå äþãääþãääþãääãäþãääùãäãäããääþãääüãääã~ãâãâþãââûãâãâããâùãâãââãââûãââãââãâãâãâüãâãââþáââáâþáââáâüáââááâïáââááââáââááââááââûáâáàááüàáàá áþàááûàááàááúàáàáàááþàááüàááà~àóßàßàßßàßàßààßßüàßàßßàßûàßààßß÷àßàßààßàßßàß÷àßßààßÞÞßßûÞßßÞßßýÞßÞÞòßÞßÞßßÞßÞßßÞÞßßÞßÞïßÞÞßÞßÞÞßßÞÞßßÞÞßßÞüÝÞÝÞ ÞøÝÞÞÝÞÞÝÞÞüÝÞÝÞÞ?ÝýÜÝÜÜÝÜüÝÜÝÜÜþÝÜÜüÝÜÝÜÜùÝÜÜÝÜÝÜÜúÝÜÜÝÝÜÜûÝÜÝÜÝÝEÜ÷ÛÜÜÛÜÛÛÜÛÛÜþÛÜÜþÛÜÜûÛÜÛÜÛÛýÜÛÜÜþÛÜÜþÛÜÜÛÜþÛÜÜýÛÜÛÛÚüÛÚÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛ Û=ÚþÙÚÚõÙÚÙÚÙÚÙÚÙÚÙÙøÚÙÙÚÙÚÚÙÙþÚÙÙûÚÙÙÚÙÙþÚÙÙüÚÙÙÚÚÙÚÙþÚØØüÙØÙØØÙüØÙÙØØÙØûÙØØÙØØúÙØØÙØÙÙØþÙØØùÙØÙØÙØÙÙGØ×ØþרØþרØþרØþרØþרØûרØ×ØØþרØüרØ×>× Öþ×ÖÖü×Ö×ÖÖü×Ö×ÖÖü×Ö×ÖÖ× Öþ×Ö ÖýÕÖÕÕþÖÕÕýÖÕÖÖÕÖÕúÖÕÖÕÖÕÕýÖÕÖÖÕûÖÕÖÖÕÕÔøÕÔÕÔÕÕÔÕÕÔÕþÔÕÕÔÕÔÕÔþÕÔÔýÕÔÕÕþÔÕÕúÔÕÕÔÕÔZÔþÓÔ!ÔÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓ ÓþÔÓÓìÔÓÒÓÒÓÒÓÓÒÓÒÓÒÓÓÒÒÓÒÒÓþÒÓÓÒúÓÒÒÓÓÒÒþÓÒÒÓýÒÓÒÒëÓÒÓÒÒÓÒÒÑÒÒÑÒÑÒÑÒÒÑÑÒÒÑÒ÷ÑÒÑÑÒÒÑÒÑÑ÷ÒÑÒÒÑÒÑÑÒÒþÑÒÒùÑÒÑÒÒÑÒÒ€ÑÐÑøÐÑÐÐÑÐÑÐÐÑÐþÑÐÐÑÐþÑÐÐþÑÐÐþÑÐÐöÑÐÑÐÐÑÐÐÑÐÐÏþÐÏÏþÐÏÏÐþÏÐÐÏðÐÏÏÐÏÐÏÏÐÏÐÏÐÏÐÏÏþÐÏÏÐÏüÐÏÐÏÏþÎÏÏÎÏþÎÏÏþÎÏÏÎÏþÎÏÏÎÏûÎÏÏÎÏÏýÎÏÎÎÏòÎÏÎÏÏÎÏÎÏÎÏÎÍÎÎÍúÎÍÎÎÍÎÎúÍÎÎÍÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎÍÌûÍÌÍÍÌÌþÍÌÌïÍÌÌÍÌÍÍÌÍÌÍÌÌÍÌÍÌÌøÍÌÍÌÍÌÍÌÌþÍÌÌùÍÌÌÍÌÍÌÌýËÌËËÌËùÌËÌÌËÌËËôÌËËÌËËÌÌËËÌËËÌþËÌÌõËÌÌËÌÌËÌËÌËËüÊËÊËËûÊËÊÊËËüÊËÊËËüÊËÊËËûÊËÊÊËËýÊËÊ>ÊýÉÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉCÉÈÉüÈÉÈÉÉûÈÉÈÈÉÉÈþÉÈÈÉÈÉÈñÉÈÉÉÈÈÉÈÉÉÈÉÉÈÉÉüÈÉÉÈÈûÇÈÈÇÈÈþÇÈÈûÇÈÈÇÈÈþÇÈÈþÇÈÈÇÈýÇÈÇ@ÇÆÇÆþÇÆÆûÇÆÆÇÆÆüÇÆÇÆÆûÇÆÇÇÆÆüÇÆÇÆ>Æ?Í=çþæççþæç/çþæç8çæçæþçææþçææüçæçææþçææüçæçææüçæçææþçææûçææçææûåææåææåæåæåæûåæååææåæþåææåþæååúæååææååæåäüåääååäåþäååäåþäååäåäåþäååäåøäåääååäååþãääþãääþãääãäþãääþãääòãääãäãäãääãäãääúãääãäã€ãýâãââúãâãâãââþãââãýâãââãýâãââãâûãââãââãâãôâãââááââááâááþâááâûáââáââáâüáâáââþáââáûâááâááâáâþàááøàáàáàáàááûàááàááàáþàááþàááþàááþàááúàáàááà~àßúàßßààßßþàßßûàßààßßùàßààßàßßàóßàßààßßàßààßààûßàßàßßþàßßýÞßÞÞýßÞßßÞüßÞÞßßýÞßÞÞþßÞÞßþÞßßÞßûÞßßÞßßÞÝÞüÝÞÝÞÞûÝÞÞÝÞÞþÝÞÞüÝÞÝÞÞÝþÜÝÝþÜÝÝÜÝÜÝÜþÝÜÜÝ ÜÝÜüÝÜÝÜCÜÛÜÛûÜÛÜÛÜÜüÛÜÛÜÜþÛÜÜÛÜÛþÜÛÛîÜÛÛÜÜÛÜÛÜÜÛÛÜÛÛÚÚÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛ?ÚÙÚÙþÚÙÙþÚÙÙÚ ÙüÚÙÚÙÙþÚÙÙûÚÙØÙØØÙØÙüØÙÙØØÙØýÙØÙÙØüÙØÙØØÙþØÙÙØÙýØÙØCØ×Øþר ØþרØþרØø×Ø×ØØ×Ø×רþר ØüרØ×>×Ö×Ö×Öþ×ÖÖ×Öþ×ÖÖ×Ö×þÖÕÕÖÕøÖÕÖÕÖÕÖÕÕÖ÷ÕÖÕÕÖÕÕÖÕÕÖþÕÖÖúÕÖÕÖÖÕÕ÷ÖÕÕÖÕÖÕÕÖÖúÕÖÕÕÖÕÕÔÕþÔÕÕÔÕûÔÕÔÔÕÕúÔÕÔÔÕÔÔÕÔÕÔÕÔÕûÔÕÔÔÕÕÔÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓÔÓþÔÓÓþÔÓÓþÔÓÓÔÓÒ÷ÓÒÒÓÒÒÓÓÒÒøÓÒÒÓÓÒÓÒÒüÓÒÒÓÓùÒÓÒÒÓÓÒÒþÓÒÒÓøÒÓÒÒÓÓÑÒÒÑ÷ÒÑÑÒÑÒÒÑÒÒÑÒÑÒÑÒüÑÒÑÒÒÑõÒÑÒÑÑÒÑÒÒÑÒÒÑÐÑÐþÑÐÐÑÐþÑÐÐþÑÐÐûÑÐÐÑÏÏóÐÏÏÐÏÏÐÏÐÏÐÐÏÏÐÏúÐÏÐÐÏÐÐüÏÐÏÐÐÏÐÏýÐÏÐÐÏÐÏÎÏùÎÏÎÏÏÎÏÏÎúÏÎÏÏÎÏÏüÎÏÎÏÏÎÏÎÏúÎÏÎÏÏÎÎÏùÎÏÏÎÎÏÎÎþÍÎÎþÍÎ ÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎ ÎÍ΂ÍýÌÍÌÌûÍÌÍÌÍÍÌûÍÌÌÍÌÌüÍÌÍÌÌþÍÌÌüÍÌÍÌÌþÍÌÌÍ÷ÌÍÌÍÌÍÌÍËËÌùËÌËËÌÌËËÌËÌþËÌÌýËÌËËþÌËËÌËÊËþÊËËõÊËËÊËËÊËËÊËËþÊËËþÊËËøÊËËÊËËÊËËýÊËÊ?ÊÉþÊÉÉóÊÉÉÊÉÉÊÉÊÉÊÊÉÉÊ ÉÊ ÉüÊÉÊÉAÉÈÉÈÉþÈÉÉþÈÉÉúÈÉÈÈÉÈÈÉýÈÉÈÈøÉÈÉÉÈÉÈÉÉÈÉùÈÉÈÈÉÈÉÉ ÈÇÈþÇÈÈÇÈùÇÈÈÇÈÇÈÈþÇÈÈÇÈûÇÈÇÇÈÈüÇÈÈÇ?ÇõÆÇÇÆÆÇÆÆÇÇÆÆþÇÆÆûÇÆÇÇÆÆþÇÆÆùÇÆÇÆÇÇÆÆÇAÆ?Í çþæçÛçþæçÖçæþçææþçææþçæ æþçææçæùçæçææçææþçææåûæååæååüæååææåæåýæåææåþæååæåæåùæåææåäååäþåääåõäååääåääååääïåääåäåäåääåäåäåäååþäååùäåääåäååùäãääããääþãääúãäãäãääùãäãäããääþãääþãääãäãäãýâãââüãââããâãâúãââããââûãââãââþãââãâãûâããâããâáùâááââáââáâáâáùâááââáââ÷áâááâááâááâáúâáââáââøáâáââáàááþàááþàááàýáàááüàáàááþàááþàááþàááþàáá€àßüàßàßßþàßßüàßàßßàßøàßàßàßàßßàßàßûàßßàßßüàßÞßßÞßþÞßßÞßþÞßßþÞßßÞýßÞßßÞßÞþßÞÞüßÞÞßßûÞÝÞÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞÝÞþÝÞÞÝÞõÝÞÝÞÞÝÞÝÞÞÝ?Ý ÜÝÜþÝÜÜÝ ÜþÝÜÜþÝÜÜþÝÜÜÝCÜÛúÜÛÜÜÛÜÜÛÜþÛÜÜÛýÜÛÜÜÛýÜÛÜÜýÛÜÛÛÜôÛÜÛÜÜÛÜÜÛÛÜÛÛþÚÛÛüÚÛÚÛÛÚýÛÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛÚþÙÚ4ÚÙÚÙÚÙþÚÙÙ÷ÚÙÙÚÚÙÙÚÙÙÚöÙÚÙÚÙÙÚÙÙÚÚýÙÚÙÙûÚØØÙØØþÙØØüÙØØÙÙØÙ ØÙ÷ØÙÙØØÙÙØÙÙþØÙÙØþÙØCØüרר Øýר××Ø×Ø× ØþרØ×ØþרØ?×Öþ×ÖÖþ×ÖÖ×Öþ×Ö Öþ×Ö Ö×Öü×ÕÕÖÖÕÖÕÖÕþÖÕÕûÖÕÖÖÕÕÖýÕÖÕÕÖÕþÖÕÕÖÕüÔÕÔÕÕþÔÕÕûÔÕÕÔÕÕÔÕüÔÕÔÕÕûÔÕÔÔÕÕÔ÷ÕÔÕÕÔÔÕÔÕÕýÔÕÔÔûÓÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓüÔÓÔÓÓÔÓÒÓûÒÓÓÒÓÓÒÓýÒÓÒÒÓÒÓúÒÓÒÒÓÒÒûÓÒÓÒÓÓùÒÓÒÒÓÓÒÒÓÒûÓÒÒÑÒÒêÑÒÒÑÒÑÑÒÒÑÑÒÑÒÑÑÒÑÑÒÒÑÑÒÑ÷ÒÑÒÒÑÒÑÑÒÒÑúÒÑÒÒÑÒÒ€ÑÐÑÐþÑÐ ÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐúÑÐÏÐÐÏÏÐÏõÐÏÐÐÏÏÐÐÏÏÐÐýÏÐÏÏúÐÏÐÏÐÏÏÐÏùÐÏÐÏÏÐÏÏûÐÎÏÏÎÎòÏÎÎÏÎÎÏÏÎÏÏÎÏÎÎýÏÎÏÏüÎÏÏÎÎýÏÎÏÏüÎÏÎÏÏþÎÏÏöÎÏÏÎÏÎÏÎÏÎÎýÍÎÍÍÎþÍÎ ÎþÍÎÎþÍÎÎÍûÎÍÎÍÎÎýÍÎÍ~ÍÌöÍÌÌÍÌÍÌÌÍÌÌÍÌýÍÌÍÍÌüÍÌÍÌÌþÍÌÌôÍÌÍÍÌÍÍÌÍÌÍÌÌþÍÌÌþÍÌÌËÌËÌòËÌÌËÌÌËËÌËÌÌËÌÌËþÌËËüÌËËÌÌüËÌËÌÌòËÌÌËËÌËÌÌËËÌÌËËÊËþÊËËøÊËÊÊËÊÊËËûÊËËÊËËüÊËÊËËþÊËËÊË?ÊÉþÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉûÊÉÊÊÉÉúÊÉÊÉÊÉÉþÊÉÉþÊÉEÉüÈÉÈÉÉÈÉþÈÉÉùÈÉÈÉÈÈÉÉÈýÉÈÉÉÈÉûÈÉÉÈÉÉüÈÉÉÈ ÈûÇÈÈÇÈ ÈûÇÈÈÇÈÈþÇÈÈüÇÈÇÈÈúÇÈÈÇÇÈ È?ÇÆþÇÆÆþÇÆÆþÇÆÆûÇÆÇÇÆÆþÇÆÆþÇÆÆþÇÆDÆÿ?ÍéçþæçÖçæþçæ æüçæçææçæçæûçæççææþçææþçææøçæçæåæåææüåææååþæååúæåæååææùåæåæåæååüæåæååûæåææååüæåæååöæååääåäåäååþäååäøåäåäååäååëäåääååääååääåäåäåäåäååþäå åüäãäããäãäãäþãääãäüãäãääãäûãääãää„ãûâãââããüâããââüãâãââþãââöãâãâããââãââãâúãâãâãââþáââýáâááþâááâáúâáâááââüáââááâùáââáâáââáëâááââáàááàáàáàááàááàááþàááþàááþàááþàá áþàááþàáá€àýßàßßàßàßöàßßàßßààßààßàßþàßßòàßßàßßàßàßßààßß÷àßàßßàßßÞÞýßÞßßüÞßßÞÞýßÞßßþÞßßûÞßßÞßßüÞßÞßßûÞßÞÞßßýÞßÞÞðßÞÞßßÞßßÞßÞÞÝÞÝÞÞÝúÞÝÞÝÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞÝ Þ@ÝÜþÝÜÜþÝÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜøÝÜÜÝÜÜÝÜÜÝÜþÝÜEÜÛþÜÛÛÜÛðÜÛÜÜÛÜÛÜÛÛÜÛÛÜÜÛÛÜÛúÜÛÛÜÛÜÜÛÜòÛÜÛÛÜÛÜÛÜÛÛÜÚÛ ÛþÚÛ ÛþÚÛÛþÚÛÛüÚÛÚÛÛ?ÚÙþÚÙÙûÚÙÙÚÙÙúÚÙÙÚÚÙÙùÚÙÚÙÙÚÙÙûÚÙÙÚÙÙøÚÙÙÚÙÙÚÙÙÚÙØþÙØØÙØÙûØÙØÙØØõÙØÙØÙØÙØØÙØØüÙØÙØØÙôØÙÙØÙØØÙÙØÙØ?ØþרØîרØ×Ø×Ø×ררØ×ØØ×ØØüררØþרØûרØ×ØØ×Ø?×ýÖ×Ö Öþ×ÖÖü×Ö×ÖÖþ×ÖÖû×Ö××ÖÖ×þÖ×× Öù×ÖÖÕÕÖÕÕýÖÕÖÖÕþÖÕÕÖüÕÖÕÖÖÕûÖÕÖÖÕÕõÖÕÕÖÕÖÕÖÖÕÖÖÕþÔÕÕÔüÕÔÕÔÔÕÔÕûÔÕÕÔÕÕúÔÕÕÔÕÔÔûÕÔÕÔÕÕöÔÕÔÕÕÔÕÔÕÔCÔþÓÔ=Ô ÓþÔÓÓþÔÓÓûÔÓÓÔÓÓûÔÓÓÔÓÓøÔÓÓÔÔÓÔÓÓþÔÓÓÒøÓÒÒÓÓÒÓÒÒíÓÒÒÓÒÓÒÓÓÒÒÓÒÓÒÓÓÒÓÓÒÓóÒÓÓÒÓÓÒÓÓÒÓÓÒÒÓÒüÓÒÑÒÒÑÒ÷ÑÒÑÑÒÒÑÑÒÒñÑÒÑÑÒÑÑÒÑÒÒÑÒÑÒÒÑøÒÑÑÒÑÒÑÒÒÑÒÑÐþÑÐÐþÑÐÐûÑÐÐÑÐÐþÑÐÐþÑÐÐþÑÐÐÑÐþÑÐÐÏÐÏñÐÏÐÏÏÐÏÐÐÏÐÐÏÏÐÐýÏÐÏÏÐ÷ÏÐÏÐÏÐÏÏÐÐÏÐýÏÐÏÏþÐÏÏÐÏÎÏÎûÏÎÏÎÏÏûÎÏÏÎÏÏýÎÏÎÎûÏÎÏÎÏÏÎÏþÎÏÏþÎÏÏýÎÏÎ ÎþÍÎÎüÍÎÍÎÎûÍÎÎÍÎÎûÍÎÍÍÎÎÍÎüÍÎÍÎÎÍ΂ÍÌûÍÌÌÍÌÌûÍÌÌÍÌÌüÍÌÌÍÍÌÍÌýÍÌÍÍÌüÍÌÍÌÌþÍÌÌüÍÌÌÍÍýÌÍÌÌËþÌËËùÌËÌËËÌËËÌËÌþËÌÌËÌËÌËþÌËËÌþËÌÌËÌþËÌÌúËÌÌÊÊËËþÊËËþÊËËùÊËÊËÊÊËËþÊËËøÊËÊËÊËÊËËúÊËËÊÊËËþÊËËÊËüÊËËÊ>ÊÉþÊÉÉþÊÉÉþÊÉÉùÊÉÉÊÉÊÉÉþÊÉÉþÊÉÉþÊÉ ÉþÊÉÉúÊÉÉÊÊÉGÉÈÉúÈÉÈÉÉÈÈÉþÈÉÉúÈÉÉÈÈÉÉÈüÉÈÈÉÉÈÉÈúÉÈÉÈÉÈ ÈþÇÈÈûÇÈÈÇÈÈÇÈþÇÈÈõÇÈÇÇÈÈÇÈÈÇÈÈþÇÈÈÇÈ@ÇÆþÇÆÆþÇÆÆþÇÆÆþÇÆ ÆþÇÆÆÇÆþÇÆDÆ?Í“çþæçÅçþæçdçùæçæçæçææçæçæçæþçææçæþçææûçæççææåæåæúåæååæååèæåæååæåæåæåæåæåææååææåæååæåþæååøæååääååääåüäåäååäúåääåäååþäååäøåäååäåäååäåäþåääãäþãääþãääþãääþãääãýäãääþãääþãää€ãâþãââãýâãââüãââããâõãâããâãââããââûãââãââãýâãââþãââûãââãââþáââþáââáâüáâáââøáââááâáââüáâáââýáâááúâááâáââõáâáâáââááàá áþàá áþàááþàá áþàááþàááàá€àßàßàßûàßßàßßöàßààßßàßàßßàßþàßßþàßßÞýßÞßßÞßþÞßßÞßúÞßßÞÞßßÞßéÞßßÞÞßßÞßßÞßÞÞßÞÝÞÝÞÝÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞÝ ÞþÝÞÞÝÞ%ÝþÜÝÝÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜùÝÜÜÝÜÝÜFÜÛÜçÛÜÛÜÛÜÛÛÜÛÜÛÛÜÛÜÜÛÜÛÜÛÜÛÜÜÛÜÛÜÛÜüÛÜÜÛÛÜóÛÜÜÚÚÛÚÚÛÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛÚÛÚöÛÚÛÛÚÛÛÚÛÚ>ÚýÙÚÙÙþÚÙÙþÚÙÙþÚÙÙÚÙüÚÙÚÙÙþÚÙÙþÚÙÙØÙúØÙÙØÙØØüÙØÙØ ØÙøØÙØØÙØÙØØüÙØÙØØøÙØØÙÙØØÙÙØüÙØÙØ@Ø×ØþרØþרØ×ØþרØþרØþרØ?×Öþ×ÖÖþ×Ö Ö×Ö×Öþ×ÖÖþ×ÖÖù×Ö×ÖÖ×ÖÖÕþÖÕÕòÖÕÖÕÕÖÕÕÖÖÕÕÖÕÕøÖÕÖÕÕÖÖÕÕþÖÕÕùÖÕÕÖÕÖÕÕÖõÕÖÖÕÖÕÖÕÕÖÕÕûÔÕÔÔÕÕÔþÕÔÔûÕÔÕÔÕÕþÔÕÕúÔÕÔÕÔÕÕúÔÕÔÕÔÕÕüÔÕÔÕÕûÔÕÕÔÕÕ€ÔÓûÔÓÔÔÓ ÓùÔÓÔÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓÒðÓÒÓÓÒÓÒÓÒÒÓÓÒÒÓÒÒöÓÒÓÒÒÓÓÒÓÒÒþÓÒÒÓýÒÓÒ ÒúÓÒÒÑÑÒÒÑÒþÑÒÒ÷ÑÒÑÒÑÑÒÑÒÒþÑÒÒÑþÒÑÑÒþÑÒÒûÑÒÑÒуÑÐþÑÐÐÑýÐÑÐÐþÑÐÐÑÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÏÐÐÏþÐÏÏÐýÏÐÏÏöÐÏÐÏÏÐÏÏÐÏÏûÐÏÐÏÐÐÏþÐÏÏþÐÏÏ÷ÐÏÐÏÐÏÐÐÏÏþÎÏÏÎÏÎÏüÎÏÎÏÏúÎÏÎÏÏÎÎÏöÎÏÎÎÏÏÎÎÏÎÎþÏÎÎÏÎþÍÎÎÍÎÍÎþÍÎÎöÍÎÎÍÍÎÍÎÍÎ ÎþÍÎÎÍüÌÍÍÌÌÍÌþÍÌÌÍÌÍøÌÍÌÍÌÌÍÌÌÍÌÍÌÍúÌÍÌÌÍÌÌËþÌËËýÌËÌÌËÌËÌþËÌÌþËÌÌïËÌËÌËËÌËËÌËËÌËÌËÌÌýËÌËËõÌËÌÌËËÌÌÊÊË ËþÊËËÊËþÊËËþÊËËúÊËÊËÊËËþÊËËüÊËËÊ>Ê ÉþÊÉ ÉþÊÉÉþÊÉÉùÊÉÊÉÉÊÉÉþÊÉÉþÊÉ?ÉÈýÉÈÉÉûÈÉÈÉÈÈýÉÈÉÉüÈÉÉÈÈúÉÈÉÈÉÈÈõÉÈÉÈÈÉÈÈÉÉÈÈÉûÈÉÈÈÉÉÈþÉÈÈþÇÈÈüÇÈÇÈÈôÇÈÇÇÈÇÈÇÈÈÇÈÈûÇÈÈÇÈÈþÇÈÈÇÈþÇÈÈüÇÈÈÇ?ÇýÆÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆüÇÆÇÆÆûÇÆÆÇÆ>Æ?Í|çþæçAçýæçææþçææþçææþçææüçæçææþçæ æþçææ÷çæçææçæçææýåæååþæååæøåææååææååæåæõåæåææååææåææåæåäýåäååäýåäååäýåäååùäååääåääåþäååäåþäååäþåä äãäþãääãäúãäãäãääúãäããäã~ãýâãââùãââãâãââã÷âãââããâãââãüâããââüãâãââõãââããâãââãââþáââúáââááââþáââüáâáââüáâáââþáââþáââáâùáââáâáââûáâáàááþàááþàááþàááþàááþàáá€àýßàßßàßùàßàßààßßþàßßàßàøßàßààßàßßàýßàßßðàßààßàßàßßÞÞßÞÞßßÞüßÞÞß ßúÞßÞßÞßßÞßÞßÞþßÞÞßÝúÞÝÝÞÝÞÞþÝÞÞþÝÞÞõÝÞÞÝÞÝÞÝÞÝÞÞüÝÞÝÞÞ@ÝÜøÝÜÝÝÜÜÝÜÜþÝÜ ÜþÝÜÜ÷ÝÜÜÝÜÜÝÝÜÜüÝÜÝÜÜüÝÜÝÜCÜþÛÜÜÛÜÛþÜÛÛÜÛÜÛÜÛíÜÛÜÛÛÜÜÛÛÜÜÛÜÛÜÜÛÜÛÛÜýÛÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛùÚÛÛÚÛÚÛÛûÚÛÛÚÛÛøÚÛÚÛÚÛÚÛÛþÚÛÛ?ÚÙ÷ÚÙÚÙÙÚÙÚÙÙÚ ÙþÚÙÙþÚÙÙþÚÙÙÚýÙÚÙÙþÚÙÙûÚÙÙÚÙÙýØÙØØþÙØØýÙØÙÙþØÙÙñØÙÙØØÙØÙØÙØÙØÙØØþÙØØþÙØØÙýØÙØØþÙØAØ× Ø×ØþרØþרØþרØþר Ø×Ø@×Öþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖ×Öþ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×ÖÖÕÕþÖÕÕÖÕþÖÕÕþÖÕÕýÖÕÖÖÕþÖÕÕùÖÕÖÕÕÖÕÕüÖÕÖÕÕþÖÕÕþÔÕÕÔüÕÔÔÕÕþÔÕÕÔÕÔùÕÔÕÔÔÕÔÔøÕÔÕÕÔÕÔÕÕÔÕÔþÕÔoÔþÓÔÔüÓÔÔÓÓþÔÓÓþÔÓÓ÷ÔÓÓÔÓÓÔÔÓÓûÔÓÓÔÓÓþÔÓÓþÔÓÓýÒÓÒÒÓüÒÓÓÒÒíÓÒÓÒÒÓÒÓÓÒÓÓÒÓÓÒÒÓÒÒþÓÒÒÓÒòÓÒÓÓÒÓÒÒÓÒÓÒÓÑÑÒýÑÒÑÑÒÑöÒÑÒÑÑÒÒÑÑÒÒþÑÒÒùÑÒÒÑÒÑÒÒþÑÒÒÑÒ€ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐüÑÐÑÐÐûÑÐÐÑÐÐùÑÐÐÑÐÑÐÐþÑÐÐóÑÐÑÐÐÑÑÐÐÏÐÐÏÏÐÏþÐÏÏÐûÏÐÏÐÏÏÐÏþÐÏÏþÐÏÏÐýÏÐÏÏÐþÏÐÐÎùÏÎÏÏÎÎÏÏöÎÏÎÎÏÏÎÏÎÏÏòÎÏÏÎÏÎÏÏÎÏÏÎÎÏÏÎÏÎÏÎþÍÎÎÍÎþÍÎÎþÍÎÎÍÎüÍÎÍÎ ÎþÍÎÎÍþÎÍ€ÍüÌÍÍÌÌýÍÌÍÍÌÍþÌÍÍüÌÍÍÌÌÍÌÍÌìÍÌÍÍÌÌÍÌÍÌÌÍÌÌÍÌÍÌÍÌÌËÌûËÌËËÌÌþËÌÌËÌ÷ËÌÌËÌËÌÌËËÌüËÌËÌÌüËÌËÌÌùËÌËÌËÌËËþÊËËüÊËÊËËþÊËËûÊËËÊËËÊËþÊËËþÊËËþÊËËþÊËËÊË@ÊÉÊÉþÊÉÉþÊÉÉÊÉùÊÉÉÊÉÊÉÉþÊÉÉûÊÉÉÊÉÉþÊÉÉþÊÉEÉýÈÉÈÈÉÈÉÈøÉÈÉÈÈÉÉÈÈÉÈûÉÈÉÉÈÈÉÈÉÈþÉÈÈÉÈþÇÈÈþÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈùÇÈÇÈÇÇÈÈ@ÇýÆÇÆÆþÇÆÆüÇÆÇÆÆûÇÆÇÇÆÆÇÆþÇÆYÆÿ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕ,çýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæþçææþçææüçæçææçæùçææççÍåþæååæåþæååæýåæååæåþæååûæåæÍ÷äåääåäåäååäåäåúäåäååääýåäååúäåääÍäùãäãääãääþãääþãä äþãääãäãþÍ.ãþÍ.ãþÍâûãâããââãâãâøãâããââãââúãâãâãâ âþÍáþâááûâáââááâþáââ÷áâáââáâáââáûâáâÍáúàáàáàá áýàáààöáàááàááààá áûàááÍ.àþÍ.àþÍßûàßàßààùßààßààßßþàßßùàßàßàßààßþàßßþÍþÞßßûÞßÞÞßßüÞßÞßßþÞßßÞ÷ßÞßÞßÞßßÞÞßùÞßÞÞßÍÞþÝÞÞúÝÞÝÞÝÞÞüÝÞÝÞÞþÍþÜÝ,ÝþÍýÜÝÜÜÝÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜýÝÍ.ÜþÍÜÛÜþÛÜÜöÛÜÛÜÜÛÜÛÜÛÛþÜÛÛÜùÛÜÛÜÛÍÛþÚÛÛüÚÛÚÛÛþÚÛÛÚÛþÚÛ ÛûÚÛÚÍ.ÚþÍÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙÚûÙÚÙÙÚÚýÙÚÙÙüÚÙÍØÙØõÙØØÙØØÙÙØØÙÙúØÙØØÙØØöÙØÙÙØØÙØÙØØÙØýÙÍ.ØþÍרöרר×רØ×ØØûרØ×ØØþרØüררØþÍ.×þÍÖþ×ÖÖü×Ö×ÖÖþ×ÖÖþ×ÖÖû×Ö××ÖÖ×Öü×Ö×ÖÖû×ÖÖÍÖÕûÖÕÕÖÕÕüÖÕÖÕÕþÖÕÕþÖÕÕõÖÕÖÕÖÖÕÕÖÖÕÕûÖÕÕÍöÕÔÕÔÔÕÕÔÕÔÔÕÔùÕÔÕÕÔÕÔÔÕÔÕÔÕøÔÕÔÕÔÕÍ.ÔþÍ.ÔþÍÓþÔÓÓþÔÓÓûÔÓÓÔÓÓùÔÓÓÔÓÔÓÓÔÓûÔÓÓÍûÓÒÒÓÒÒüÓÒÓÒÒùÓÒÓÒÓÓÒÒÓýÒÓÒÒþÓÒÒþÍþÒÑÑÒýÑÒÑÑíÒÑÒÒÑÑÒÒÑÑÒÒÑÒÑÑÒÒÑÑÒþÑÒÒûÑÒÑÍ.ÑþÍ.ÑþÍýÐÑÐÐüÑÐÑÐ ÐùÑÐÑÐÐÑÐÐøÑÐÐÑÐÐÑÐÐþÍÐùÏÐÐÏÏÐÏÏÐÏÐþÏÐÐÏþÐÏÏþÐÏÏúÐÏÐÏÍþÏÎÎÏûÎÏÏÎÏÏüÎÏÎÏ ÏüÎÏÏÎÎúÏÎÏÎÎÏÏþÍüÎÍÍÎÎûÍÎÍÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎÍüÎÍÍ/Í/ÍüÌÍÌÍÍÌüÍÌÌÍÍÌþÍÌÌýÍÌÍÍýÌÍÌÌøÍÌÍÌÌÍÍÌûËÌËËÌÌþËÌÌËÌùËÌÌËÌÌËËÌûËÌËÌËËüÌËÍËúÊËÊËÊËËúÊËÊËÊËËþÊËËüÊËÍ.ÊþÍÉûÊÉÊÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉüÊÉÊÉÉþÍ.ÉþÍúÈÉÈÉÈÉÉþÈÉÉÈÉüÈÉÉÈÈÉÈÉùÈÉÈÉÈÉÈÈÉúÈÉÈÉÍÈüÇÈÇÈÈüÇÈÇÈÈÇÈÇÈÇÈþÇÈÈùÇÈÈÇÈÍ.ÇþÍÆþÇÆ ÆûÇÆÆÇÆÆþÇÆÆüÇÆÇÆÆþÍ.ÆþÍ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕçþæççýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæçæþçææþçæ æùçæçææçæ æçþÍúåæååæååæúåæåææååæåþæååþæååöæåæååæåæÍþäååûäååäååýäåääåòäåäåäåääååääåääåäåüäåÍäþãääþãääùãäããäãääþãääþãääûãääÍ.ãþÍ.ãþÍâúãâãâãââãâûãââãââþãââãâüãâÍâá÷âááââáââááûâáâáââþáââöáâáâááâááââûáââÍýáàááàáüàáàááþàááàáþàááþàááþÍ.àþÍ.àþÍßà ßþàßßàßàßôàßàßßààßßàÍÞßûÞßßÞßßÞßÞßðÞßÞßÞßÞÞßÞÞßÞßÞßßþÍ ÞþÝÞÞúÝÞÝÞÝÞÞþÝÞÞþÝÞÞþÍÝþÜÝÝþÍ ÜþÝÜÜþÝÜÜÝùÜÝÜÜÝÝÜÜþÝÜÜþÍ.ÜþÍÜÛÜþÛÜÜþÛÜÜýÛÜÛÛÜÛõÜÛÛÜÛÜÛÜÜÛÜÜüÛÜÍÛþÚÛÛþÚÛÛþÚÛÛ÷ÚÛÛÚÛÛÚÚÛ ÛþÍ.ÚþÍÙüÚÙÚÙÙþÚÙÙþÚÙÙÚÙþÚÙÙþÚÙÙþÚÙÙýÚÍøÙØØÙØØÙØØ÷ÙØÙØÙØÙÙØØÙøØÙØØÙØÙØØÙØþÍ.ØþÍüררØþרØþרØýר××ýØÍ.×þÍÖþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖþ×ÖÖþ×ÖÖü×Ö×ÖÖþÍøÖÕÕÖÕÖÕÖÖÕðÖÕÖÕÕÖÖÕÕÖÕÖÕÖÕÖÖÕÖúÕÖÕÖÕÖÖÕýÖÍÖÔÕÔÕÔÕÔÕÕÔÔÕÔÕÔÕÕÔÔÕÕÔÕÕÔÕÕÔÔÕÔÕÔÕÔÕÔÔÕÔÕÔÔüÕÔÍ.ÔþÍ-ÔýÓÍÔýÓÔÓÓþÔÓÓùÔÓÔÓÔÔÓÓûÔÓÓÔÓÓþÔÓÓýÔÍùÒÓÒÓÒÒÓÓÒ÷ÓÒÓÓÒÓÒÓÒÒþÓÒÒÓûÒÓÓÍúÑÒÒÑÑÒÒÑÒÑøÒÑÒÑÒÒÑÒÒþÑÒÒÑúÒÑÒÑÑÒÒûÑÒÒÍ.ÑþÍ.ÑþÍÐÑÐÑøÐÑÐÐÑÐÑÐÐþÑÐÐüÑÐÍþÐÏÏûÐÏÐÐÏÏþÐÏÏïÐÏÏÐÏÐÐÏÏÐÐÏÐÏÏÐÏÏûÐÏÐÍþÏÎÎÏÎÏúÎÏÏÎÏÎÎÏýÎÏÎÎþÏÎÎÏÎûÏÎÏÍÎþÍÎÎþÍÎÎþÍÎÎûÍÎÍÍÎÎþÍÎ ÎþÍ/Í/ÍþÍÌÌøÍÌÍÌÍÌÍÌÌþÍÌÌóÍÌÌÍÌÍÌÌÍÍÌÌÍÍþÌÍÍûÌÍÌÍÌÌþÍÌöËÌÌËÌËËÌËÌÌúËÌÌËËÌÌËýÌËÌÌþËÌÌüËÌÍ ËÊ ËÊüËÊÊËËþÊËËþÍ.ÊþÍÉþÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉÊÉüÊÉÍ.ÉþÍÉñÈÉÈÉÈÈÉÈÉÈÉÉÈÉÈÈÉþÈÉÉüÈÉÈÉÉÈÉüÈÉÍûÇÈÈÇÈÈÇÈþÇÈÈþÇÈÈÇÈþÇÈÈþÇÈÈþÍ.ÇþÍ ÆûÇÆÇÇÆÆþÇÆÆþÇÆÆþÍ.ÆþÍ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕ,çýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæþçæ æþçæ æüçæçææþÍåþæååþæååæåûæåææååþæååöæåææååæååææýåÍüäåäååûäåäåääåþäååäåäåûäåäÍäã äþãääþãääãäüãäãääùãäãääÍ.ãþÍ.ãþÍâ÷ãâãâãââãââüãâãââãþâããýâãââãþÍúáâáâáââþáââþáââáâ÷áâáâááâáââòáââáâáâáââáâÍáùàááàáàááüàáàááþàááþàááàýáÍ.àþÍ.àþÍþàßßþàßßýàßààßàßàøßàßßàßàßßàßýàÍßþÞßßþÞßßþÞßßùÞßßÞßÞßßÞßÞßøÞßÞßÞßÍÞþÝÞÞûÝÞÝÝÞÞþÝÞÞþÝÞ ÞþÍ.ÝþÍþÝÜÜþÝÜ ÜÝÜÝöÜÝÜÜÝÝÜÜÝÜÜüÝÜÍ.ÜþÍüÜÛÛÜÜöÛÜÛÜÜÛÜÜÛÜÜÛ÷ÜÛÜÛÜÛÛÜÛÛþÜÛÛüÜÛÛÜÜþÍÛþÚÛÛþÚÛÛÚÛüÚÛÛÚÚÛþÚÛÛüÚÛÚÛÛþÍÚþÙÚÚþÍÙþÚÙÙüÚÙÚÙÙùÚÙÙÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÍØþÙØØòÙØÙØÙÙØØÙØÙÙØÙÙØûÙØÙÙØØöÙØÙØØÙØÙØÙÙýØÍ.ØþÍ Øþר ØþרØþרØüררØþÍ.×þÍÖþ×ÖÖô×Ö×Ö×ÖÖ××Ö×ÖÖþ×ÖÖü×Ö×ÖÖü×Ö×ÖÖþÍãÕÖÕÖÖÕÕÖÕÖÕÕÖÕÖÕÕÖÕÕÖÖÕÖÖÕÕÖÕÕÖýÕÖÕÕøÖÕÕÖÖÕÍþÕÔÔþÕÔÔýÕÔÕÕþÔÕÕöÔÕÕÔÕÕÔÕÔÕÕþÔÕÕþÔÕÕýÔÍ.ÔþÍ.ÔþÍÓüÔÓÔÓÓÔ÷ÓÔÓÔÔÓÓÔÓ ÓûÔÓÓÔÓÓþÍÒþÓÒÒüÓÒÓÒÒÓÒñÓÒÒÓÓÒÒÓÒÒÓÒÒÓÒÒûÓÒÒÍòÒÑÑÒÑÒÒÑÒÒÑÒÑÒÒÑÒÑøÒÑÒÒÑÒÒÑÑÒÑÒþÍ.ÑþÍ.ÑþÍÐþÑÐÐúÑÐÑÐÑÐÐþÍÏüÐÏÐÏÏÐÏÐÏÐÏÐÏþÐÏÏþÐÏÏúÐÏÐÏÍÎøÏÎÎÏÏÎÏÎÎýÏÎÏÏüÎÏÏÎÎÏüÎÏÎÏÏÎúÏÎÏÏÎÏÏþÍ ÎþÍÎÎüÍÎÍÎÎþÍÎ ÎÍ/Í/ÍþÍÌÌþÍÌÌþÍÌÌþÍÌÌþÍÌÌèÍÌÍÍÌÍÌÍÌÌÍÌÌÍÍÌÍÌÌÍÌÌÍþËÌÌøËÌÌËÌÌËÌÌûËÌÌËÌÌ÷ËÌÌËÌÌËËÌÌóËÌËËÌËÌËËÌÌÍËþÊËËøÊËÊËËÊÊËËþÊËËÊýËÊËËùÊËÊËËÍ.ÊþÍÉþÊÉÉùÊÉÉÊÉÊÉÉÊÉûÊÉÉÊÉÉþÊÉÉüÊÉÍ.ÉþÍýÉÈÉÉÈþÉÈÈÉþÈÉÉûÈÉÉÈÉÉüÈÉÈÉÉüÈÉÈÉÉÈþÍÈûÇÈÈÇÈÈÇÈúÇÈÇÈÇÈÈÇÈûÇÈÈÇÈÈþÍ.ÇþÍÆÇÆþÇÆ ÆÇÆûÇÆÆÇÆ ÆþÍ.ÆþÍ)ÿýùG,ÿþ-ÿþ.ÿ.ÿþG.ÿþù/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿþÍÆÆþÅÆ ÆþÅÆÆÅýÆÅÆÆúÅÆÅÆÆÅÅÆÅýÆÅÆÆþÅÆÆÅþÍÅÅþÄÅÅþÄÅÅþÄÅÅüÄÅÄÅÅýÄÅþÍÄ9ÄýÍÄÃÃþÄÃÃþÄÃÃÄÃþÄÃÃÄÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄòÍÂÃÃÂÂÃÂÃÃÂÃÃÂÂÃúÂÃÂÃÃÂÂÃþÂÃÃÂÃÂýÃÂÃÃÂöÃÂÃÂÃÂÃÂÃýÍÅÂ8ÂýÍÊÂÂþÁÂÂþÁ ÂþÁÂÂþÁÂÂÁÂüÁÂÁÂÂÁüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ3ÁþÇÍ5ÍïÍÆÆÅÆÆÅÆÆÅÅÆÅÆÅÅÆÆÅ ÆþÅÆÆúÅÆÅÆÅÆÆöÅÆÅÆÆÅÆÅÆÅÅþÍÅÅøÄÅÅÄÅÅÄÅÅûÄÅÅÄÅÅþÄÅÅþÄÅÅúÄÅÅÄÄÅÅþÄÅÅûÄÅÅÄþÍÄ9ÄýÍÄÃÃÄÃþÄÃÃûÄÃÃÄÃÃÄÃûÄÃÃÄÃÃûÄÃÃÄÃÃüÍÂÂÃÃÂýÃÂÃÃÂþÃÂÂöÃÂÃÂÂÃÂÂÃÂÂÃøÂÃÃÂÂÃÃÂÂöÃÂÃÂÂÃÃÂÃÂÂýÍÄÂ8ÂüÍÉÁÂÂÁýÂÁÂÂôÁÂÂÁÂÂÁÂÁÂÁÂÂþÁÂÂúÁÂÂÁÁÂÂÁÂüÁÂÂüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ)ÁþÀÁÁþÇÍ5ÍúÍÆÆÅÅÆÆöÅÆÅÆÅÅÆÅÅÆÆúÅÆÅÆÅÆ ÆÅüÆÅÅÆÆÅÆúÅÆÆÅÅþÍÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅ ÅþÄÅÅúÄÅÄÅÄÅÅüÍÄÃÄ7ÄýÍÃÄÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃõÍÂÃÃÂÃÂÃÂÃÂÂÃÂÃÂþÃÂÂÃüÂÃÃÂÂÃÂ÷ÃÂÂÃÂÂÃÃÂÂúÃÂÂÃÃýÍÄÂ8ÂýÍÊ ÂþÁÂÂÁ ÂþÁÂÂþÁÂÂÁÂþÁÂÂüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ3ÁþÇÍ5Í;ÿ;ÿ;ÿ;ÿ;ÿ;ÿþùÿ9ÿþGÿ9ÿ:ÿþÿ8ÿþÿ7ÿýGùÿ4ÿÆýÅÆÅÅäÆÅÅÆÆÅÆÆÅÅÆÅÅÆÅÅÆÆÅÆÅÆÆÅÆÆÅÆÆþÅÆÆÅÆûÅÆÆÅÆÆÅÆÅÄøÅÄÅÄÅÄÄÅÅüÄÅÄÅÅþÄÅÅùÄÅÅÄÅÅÄ>ÄÃþÄÃÃøÄÃÃÄÄÃÄà ÃþÄÃÃþÄà ÃþÄÃÃþÄÃÃÂýÃÂÃÃÂþÃÂÂàÃÂÃÂÃÂÃÂÂÃÃÂÃÃÂÃÂÂÃÃÂÃÃÂÃÃÂÃÃÂÂÃÃÂÃýÂÃÂDÂþÁÂÂþÁ ÂþÁÂÂûÁÂÂÁÂÂêÁÂÂÁÂÁÂÁÂÁÂÂÁÂÂÁÂÁÁÂÁÂÂþÁÂÂýÁÂÁ¿ÁþÀÁ=Á?ÍøÅÆÅÆÆÅÆÅÅùÆÅÅÆÅÅÆÆüÅÆÅÆÆûÅÆÅÅÆÆÅýÆÅÆÆÅðÆÅÆÅÆÆÅÆÆÅÅÆÆÅÆÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅÄ Å÷ÄÅÅÄÅÅÄÅÄ?ÄÃþÄÃÃþÄÃÃþÄÃÃøÄÃÄÄÃÃÄÃÃÄøÃÄÃÄÃÃÄà ÃþÄÃÃÂýÃÂÃÃÂüÃÂÃÂÂÃúÂÃÃÂÃÂÂþÃÂÂúÃÂÃÂÂÃÃïÂÃÂÂÃÂÃÂÂÃÂÃÂÃÂÂÃÃýÂÃÂCÂþÁÂÂþÁÂÂÁÂþÁÂÂþÁÂÂþÁ ÂûÁÂÂÁÂÂÁÂÁþÀÁàÁ?ÍþÅÆÆÅÆÅõÆÅÆÅÆÆÅÅÆÅÆÆðÅÆÅÅÆÆÅÅÆÅÆÆÅÆÅÆÆûÅÆÅÅÆÆöÅÆÆÅÅÆÆÅÆÅ ÅþÄÅÅøÄÅÅÄÅÅÄÅÅþÄÅÅþÄÅÅÄÅþÄÅÅþÄÅÅþÄÅÅ?Ä ÃÄ ÃÄûÃÄÃÄÃÃþÄÃÃÄÃüÄÃÄÃÃýÂÃÂÂûÃÂÂÃÂÂþÃÂÂÃÂÃÂÃÂÃûÂÃÂÃÂÂþÃÂÂúÃÂÂÃÃÂÂüÃÂÃÂCÂþÁÂÂþÁÂÂþÁÂÂþÁÂÂþÁÂÂûÁÂÁÁÂÂþÁÂÂÁþÀÁsÁþÀÁÁþÀÁ]Á?ÍÿýÅÆÅÅÆöÅÆÅÆÅÆÆÅÆÅÅÆþÅÆÆþÅÆÆøÅÆÆÅÆÆÅÆÆÅÆþÅÆÆÅÆÄÅûÄÅÄÄÅÅþÄÅÅþÄÅÅÄýÅÄÅÅþÄÅÅþÄÅ Å?ÄÃþÄÃÃÄýÃÄÃÃþÄÃÃþÄà ÃÂýÃÂÃÃÂÃÂÃÂðÃÂÃÂÃÂÂÃÂÂÃÃÂÃÃÂÂþÃÂÂþÃÂÂÃýÂÃÂÂþÃÂHÂþÁÂÂþÁÂÂþÁÂÂüÁÂÂÁÁÂýÁÂÁÁ?ÍøÆÅÆÅÅÆÆÅÅÆýÅÆÅÅÆüÅÆÅÆÆÅÆÅýÆÅÆÆüÅÆÆÅÅÆþÅÆÆþÄÅÅþÄÅÅÄ÷ÅÄÅÄÅÅÄÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅÄ ÅýÄÅÄ>ÄÃþÄÃÃþÄà ÃÄÃþÄÃÃþÄÃÃþÄÃÃÂÃÂøÃÂÃÂÂÃÃÂÂþÃÂÂüÃÂÃÂÂþÃÂÂÃþÂÃÃýÂÃÂÂöÃÂÂÃÃÂÂÃÃÂBÂûÁÂÂÁÂÂÁÂÁÂôÁÂÂÁÂÁÂÂÁÂÁÂÂûÁÂÁÁÂÂÁÂÁ?ÍÅÆæÅÆÅÅÆÅÆÆÅÅÆÆÅÆÆÅÆÆÅÆÆÅÅÆÅÆÆþÅÆÆþÅÆÆÅÆüÅÆÆÅÅ÷ÆÅÆÅÅÄÅÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅÄÅþÄÅÅ?ÄÃúÄÃÄÃÄà ÃþÄÃÃþÄà ÃþÄÃÃÄÃþÄÃÃùÄÃÄÃÃÄÂÂÃÂÃÂÃÂ÷ÃÂÃÂÃÃÂÃÂÂÃýÂÃÂÂþÃÂÂõÃÂÃÂÂÃÃÂÃÃÂÂþÃÂÂÃýÂÃÂ?ÂõÁÂÂÁÂÂÁÂÁÁÂÂþÁÂÂÁÂÁÂüÁÂÁÂÂþÁÂÂþÁÂÂûÁÂÂÁÂÂ÷ÁÂÁÂÂÁÂÂÁpÁþÀÁŒÁ?ÍÿÆûÅÆÅÆÅÅÆÅÆøÅÆÆÅÆÅÅÆÆÅþÆÅÅþÆÅÅÆëÅÆÆÅÆÅÅÆÅÆÅÆÅÅÆÅÅÄÅÄÅÅúÄÅÅÄÄÅÅþÄÅÅÄÅþÄÅÅ@Ä ÃþÄÃÃÄÃþÄÃÃþÄÃÃûÄÃÃÄÃÃÄÃÄüÃÄÄÃÃùÄÃÃÂÃÃÂÂýÃÂÃÃÂÃÂÃÂþÃÂÂýÃÂÃÃÂþÃÂÂöÃÂÂÃÂÂÃÂÃÂÂþÃÂPÂþÁÂÂôÁÂÁÁÂÁÂÁÂÂÁÂÂþÁÂÂþÁÂÂþÁÂÂêÁþÀÁ ÁþÀÁÁ?ÍÆýÅÆÅÅÆþÅÆÆÅÆÅÆûÅÆÆÅÆÆÅþÆÅÅÆûÅÆÆÅÆÆÅÆÅþÄÅÅûÄÅÅÄÅÅþÄÅÅÄÅþÄÅ ÅûÄÅÄÄÅÅÄùÅÄÄÅÅÄÅÅ?ÄÃþÄÃÃôÄÃÄÃÃÄÃÃÄÃÄÃÃþÄà ÃþÄÃÃüÄÃÄÃÃüÄÃÄÃÃþÄÃÃÂÃÂÃýÂÃÂÂùÃÂÂÃÂÃÂÂÃÂÃõÂÃÂÃÃÂÂÃÃÂÃÃÂÃýÂÃÂBÂÁÂþÁÂÂþÁÂÂüÁÂÁÂÂþÁÂÂþÁÂÂÁÂþÁÂÂúÁÂÂÁÁÂÂüÁÂÂÁÿÁ?ÍÆüÅÆÅÆÆÅÆøÅÆÅÆÅÆÅÆÆþÅÆÆùÅÆÅÅÆÅÆÆùÅÆÅÆÆÅÆÆûÅÆÅÅÆÆýÅÆÅÅüÄÅÄÅÅÄÅÄÅÄÅþÄÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅüÄÅÅÄ>ÄÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃÄÃøÄÃÃÂÃÂÃÂÂþÃÂÂþÃÂÂüÃÂÂÃÃÂÃýÂÃÂÂõÃÂÂÃÃÂÃÂÂÃÂÂÃþÂÃÃÂþÃÂTÂÁÂüÁÂÁÂÂþÁÂÂþÁÂÂþÁÂÂúÁÂÂÁÁ Â–ÁþÀÁgÁ?ÍÿÆþÅÆÆüÅÆÆÅÅÆÅÆýÅÆÅÅýÆÅÆÆÅÆÅüÆÅÅÆÆþÅÆÆÅÆÅþÄÅ ÅþÄÅÅ÷ÄÅÅÄÄÅÅÄÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅùÄÅÅÄÄÅÄ>ÄýÃÄà ÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄà ÃþÄÃÃõÂÃÃÂÃÂÃÃÂÃÂÂþÃÂÂüÃÂÃÂÂþÃÂÂ÷ÃÂÂÃÃÂÃÃÂÂÃûÂÃÂÃÂJÂÁýÂÁÂÂþÁÂÂþÁÂÂüÁÂÁÂÂþÁÂÂùÁÂÂÁÂÁÂÂôÁÂÁÂÂÁÂÁÂÂÀÁæÁþÀÁÁ?ÍýÆÅÆÆüÅÆÅÆÆÅÆÅøÆÅÅÆÅÆÅÆÆøÅÆÅÆÅÅÆÅÅÆüÅÆÅÆÆÅÆ÷ÅÆÆÅÆÅÅÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅ?ÄÃóÄÃÄÃÃÄÃÃÄÃÃÄÃÃüÄÃÄÃÃÄÃÄÃûÄÃÃÄÃÃÄÃþÄÃÃøÂÃÂÂÃÂÃÂÂüÃÂÃÂÂþÃÂÂÃöÂÃÂÂÃÂÃÂÂÃÃòÂÃÂÃÂÃÂÂÃÂÂÃÂÃÃÂÃýÂÃÂÂþÃÂWÂþÁÂÂþÁÂÂþÁÂÂÁ?ÍÅÆþÅÆÆþÅÆÆíÅÆÆÅÆÅÅÆÅÆÆÅÆÅÆÅÆÅÆÆþÅÆÆÅÆýÅÆÅÅÆÅÆýÅÆÅÅþÄÅÅþÄÅ ÅÄýÅÄÅ ÅûÄÅÄÄÅÅþÄÅÅÄÅ@ÄÃþÄÃÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃÄûÃÂÃÂÃÃÂþÃÂÂÃýÂÃÂÂûÃÂÂÃÂÂÃúÂÃÂÂÃÂÂþÃÂÂÃÂüÃÂÃÂBÂÁÂüÁÂÁÂÂÁÂþÁÂÂÁÂûÁÂÂÁÂÂþÁ ÂÁ?ÍÿýÆÅÆÆùÅÆÆÅÆÅÆÆÅÆúÅÆÆÅÅÆÆýÅÆÅÅÆÅúÆÅÆÅÅÆÆþÅÆÆþÅÆÆöÅÆÅÆÆÄÄÅÄÅÅþÄÅ ÅúÄÅÄÅÄÅÅùÄÅÅÄÅÄÅÅÄÅÄùÅÄÅÄÅÄÅÅüÄÅÅÄ?Ä ÃþÄÃÃÄÃÄÃþÄÃÃÄÃþÄÃÃÂÃÂÃÂþÃÂÂþÃÂÂýÃÂÃÃÂÃøÂÃÂÃÂÃÃÂÂüÃÂÃÂÂþÃÂÂþÃÂ@ÂûÁÂÂÁÂÂþÁÂÂþÁÂÂûÁÂÂÁÂÂúÁÂÂÁÁÂÂþÁÂÂþÁÂÂþÁÂÂÁÁþÀÁ<Á?ÍÅÆÅÆþÅÆÆÅòÆÅÅÆÆÅÆÅÆÅÆÅÆÅÅÆÅúÆÅÆÅÆÅÅÆþÅÆÆÅþÄÅÅþÄÅÅþÄÅÅøÄÅÅÄÄÅÄÅÅüÄÅÅÄÄÅþÄÅÅÄÅþÄÅÅÄþÃÄÄÃÄÃûÄÃÃÄÃÃüÄÃÄÃÃöÄÃÃÄÃÄÃÃÄÃÃøÄÃÃÄÃÃÄÃÃüÄÃÄÃÃÄÂÃúÂÃÃÂÃÂÂüÃÂÃÂÂþÃÂÂþÃÂÂÃÂÃÂñÃÂÃÂÂÃÂÂÃÂÂÃÂÃÂÂÃDÂþÁÂÂþÁÂÂÁ ÂþÁÂÂÁÂûÁÂÂÁÂÂ~ÁþÀÁ€Á?ÍÆÅüÆÅÅÆÆêÅÆÆÅÅÆÅÅÆÆÅÆÆÅÅÆÅÅÆÆÅÆÆÅÆþÅÆÆöÅÆÅÅÆÆÅÆÅÆÆýÅÄÅÅþÄÅÅþÄÅ ÅöÄÅÄÅÄÅÅÄÄÅÅÄÅþÄÅÅ2ÄþÃÄ ÄÃþÄÃÃüÄÃÄÃÃúÄÃÃÄÄÃÃüÄÃÄÃÃÄÃþÄà ÃüÄÃÄÃÃþÂÃÃÂÃþÂÃÃùÂÃÃÂÃÂÃÃþÂÃÃÂüÃÂÂÃÃÂÃÂüÃÂÂÃÃAÂÁýÂÁ ÂûÁÂÁÁÂÂþÁÂÂùÁÂÂÁÂÁÂÂÁ ÂþÁÂÂþÁÂÂÁ?ÍÿøÆÅÅÆÆÅÅÆÆÅÆþÅÆÆûÅÆÆÅÆÆûÅÆÅÆÅÅþÆÅÅøÆÅÆÆÅÆÅÆÆÅñÆÅÆÆÅÆÆÅÆÅÅÄÅÄÅ ÅþÄÅÅÄÅûÄÅÅÄÅÅþÄÅÅüÄÅÄÅÅÄþÅÄ>ÄÃüÄÃÄà ÃüÄÃÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃ÷ÄÃÄÃÄÄÃÄÃÃþÄÃÃüÂÃÂÃÃÂÃýÂÃÂÂøÃÂÂÃÂÂÃÂÂÃþÂÃÃÂÃýÂÃÂÂÃÂÃFÂþÁÂÂþÁÂÂþÁÂÂ÷ÁÂÂÁÁÂÁÁÂÂüÁÂÁÂÂÁÂþÁÂÂþÁÂÂÁ?ÍûÅÆÆÅÆÆÅÆøÅÆÅÆÆÅÅÆÆÅÆÅÆùÅÆÅÆÅÅÆÆùÅÆÅÅÆÅÆÆ÷ÅÆÅÅÆÅÆÄÅÅûÄÅÄÄÅÅþÄÅÅþÄÅÅüÄÅÄÅÅûÄÅÅÄÅÅÄÅýÄÅÄ+ÄþÃÄÄÃþÄÃÃþÄÃÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃÄÃÂþÃÂÂùÃÂÂÃÂÃÂÂõÃÂÂÃÂÂÃÂÂÃÂÂÃþÂÃÃÂÃÂÃûÂÃÂÃÂ@ÂþÁÂÂþÁÂÂòÁÂÁÁÂÂÁÁÂÂÁÂÁÂÂþÁÂÂïÁÂÁÂÁÂÁÂÂÁÁÂÁÂÂÁÂÂûÁÂÂÁÂÂÁþÀÁúÁ?ÍÆùÅÆÅÅÆÅÆÆÅÆøÅÆÅÆÆÅÅÆÆÅ÷ÆÅÆÅÅÆÅÆÅÅøÆÅÆÅÆÆÅÆÆþÅÆÆÅÆøÄÅÄÅÄÅÄÅÅüÄÅÄÅÅþÄÅÅþÄÅÅþÄÅÅôÄÅÅÄÄÅÄÅÅÄÅÄ>ÄÃþÄÃÃûÄÃÃÄÃÃþÄÃÃþÄà ÃúÄÃÄÃÄÃÃþÄÃÃúÄÃÄÃÃÂÂ÷ÃÂÂÃÂÂÃÃÂÂÃÂÃÂùÃÂÃÂÂÃÂÂþÃÂÂþÃÂÂÃôÂÃÂÃÂÃÂÂÃÂÃÂEÂûÁÂÂÁÂÂþÁÂÂúÁÂÂÁÁÂÂüÁÂÁÂÂþÁÂÂüÁÂÂÁnÁþÀÁÁ?ÍÿþÅÆÆÅùÆÅÅÆÆÅÆÆüÅÆÆÅÅÆþÅÆÆþÅÆÆúÅÆÅÅÍÄÅÄÅùÄÅÅÄÅÄÅ ÅÄÅüÄÅÍ.ÄþÍÃüÄÃÄÃÃþÄÃÃûÄÃÄÄÃÃÄÃþÄÃÃûÄÃÃÍÂÃÂþÃÂÂþÃÂÂüÃÂÃÂÂýÃÂÃÃÂÃÂÃøÂÃÂÃÂÃÍ-ÂýÄÍÂüÁÂÁ ÂþÁÂÂüÁÂÁÂÂýÊÍ,ÁüÂÍÇ,ÁÎ*ÁûÂÎÍÕ(ÁúÃÉÍÎÕ*ÍþÇýÅÆÅÅûÆÅÆÅÆÆüÅÆÅÆÆÅüÆÅÆÅÅþÆÅÅÆýÅÍôÅÄÄÅÅÄÅÄÅÅÄÅÅþÄÅÅÄýÅÄÅÅöÄÅÄÅÅÄÅÅÄÅÅþÍ.ÄþÍýÃÄÃÃþÄÃÃþÄÃÃûÄÃÃÄÃÃÄÃþÍõÂÃÂÂÃÂÂÃÂÂÃÃüÂÃÃÂÂùÃÂÂÃÂÃÂÂþÃÂÂþÃÂÂÃûÂÃÃÍ-ÂýÅÍÂüÁÂÁÂÂûÁÂÂÁÂÂþÁÂÂýÊÍ,ÁüÂÍÇ,ÁÎÁþÀÁ!ÁûÂÎÍÕ(ÁúÃÉÍÎÕ*ÍþÇóÆÅÆÅÆÆÅÆÅÆÆÅÆÆÅðÆÅÆÅÆÅÅÆÅÆÅÆÅÅÆÅÅÆÅøÆÅÆÆÅÅÍÅÄüÅÄÅÄÄÅþÄÅÅüÄÅÄÅÅöÄÅÄÅÅÄÅÅÄÅÅýÄÍ.ÄþÍÃþÄÃÃþÄÃÃÄ ÃþÄÃÃûÄÃÃÄÃÃþÍÂþÃÂÂÃÂüÃÂÂÃÃÂÃÂüÃÂÃÂÂþÃÂÂúÃÂÂÃÍ-ÂýÅÍûÂÁÁÂÁÁ÷ÂÁÂÁÂÁÂÁÂÂþÁÂÂüÁÂÁÂÂûÁÂÂÁÂÂþÁÂÂýÊÍ ÁþÀÁÁüÂÍÇÁþÀÁÁþÀÁÁÎ*ÁûÂÎÍÕÁþÀÁÁúÃÉÍÎÕ*ÍþÇ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ.ÿþù.ÿþG.ÿ-ÿþ,ÿþ)ÿýùG€€€€,(–K %stem-1.7.1/docs/_static/buttons/resources/bug_tracker.xcf0000664000175000017500000024342413157571677024326 0ustar atagaratagar00000000000000gimp xcf fileôPBœBœBBgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) gamma0.45454999804496765µ5Nׇv'< Bug Trackerÿ     g 'Hgimp-text-layer,(text "Bug Tracker") (font "FreeSerif") (font-size 50.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 295.000000) (box-height 60.000000) (box-unit pixels) ­'<Í)'<í Û €«Àþ ý.ý"ïÿ ÿùðØÁ©Š3*üA²ÿÿúäÀÀÍëÿÿüÐl)ýÕÿÿýìû '‚îÿÿýî-)þƒÿÿþÁý …ÿÿýæ!(þlÿÿþÀþŸÿÿýÜ'þYÿÿþÀýÖÿÿþO'þXÿÿþÀ þŽÿÿþˆ'þXÿÿþÀ þ^ÿÿþÀ'þXÿÿþÀ þ4ÿÿþå'þXÿÿþÀ þSÿÿþ¹'þXÿÿþÀ þ‚ÿÿþƒþF€€þ`þ€€þlýQ“þXÿÿþÀý Õÿÿýþ7ü"_ÁÿÿþÀûiˆÙÿÿþØû³ÿÞþXÿÿþÀþœÿÿþœýÔÿÿþÀýÇÿÿþØú8ïÿÁþXÿÿþÀý(©ÿÿý²þŽÿÿþÀþuÿÿþØú ÛÿÿSþXÿÿþÓLLúPlŒµýÿÿýØ\þvÿÿþÀþ[ÿÿþØú˜ÿÿûþXÿ ÿýÉG þtÿÿþÀþXÿÿþØú ýÿÿÂþXÿÿøí¸½ÃÒåúÿÿüùªCþtÿÿþÀþXÿÿþØþ;ÿÿþŸþXÿÿþÀú&Y§üÿÿý¹"þtÿÿþÀþXÿÿþØþlÿÿþºþXÿÿþÀý,ÂÿÿýöSþtÿÿþÀþXÿÿþØþ€ÿÿþÖþXÿÿþÀý½ÿÿýñþtÿÿþÀþXÿÿþØþbÿÿýôþXÿÿþÀ ýñÿÿþ¿þtÿÿþÀþXÿÿþØþ-ÿÿþ\þXÿÿþÀ þÿÿþþtÿÿþÀþXÿÿþØþ¼ÿÿþÆþXÿÿþÀ þJÿÿþQþtÿÿþÀþXÿÿþØý$æÿÿþnþXÿÿþÀ þ*ÿÿþ‹þtÿÿþÀþXÿÿþØý(ÖÿÿþXÿÿþÀ þ1ÿÿþþtÿÿþÀþXÿÿþØû{þÿþXÿÿþÀ þiÿÿþ^þtÿÿþÀþXÿÿþØû–ósþXÿÿþÀ þ ÿÿþ-þtÿÿþÀþbÿÿþØû Ï!þZÿÿþÀ ýÝÿÿþ½þ`ÿÿþàþˆÿÿþÙû¦þ1þoÿÿþÀý¶ÿÿý÷$þ9ÿÿþ1ýìÿÿþíû‘ÿØþˆÿÿýåý»ÿÿþvýúÿÿýÑûcé­ÿÿþ2øøÿÿÃ|YýÝÿÿýbú _µúÿÿýütþŒÿÿ÷ê’u¡Úÿ—ÿÿùñ¡:ÿÿú LºÿÿûòÞãöÿÿüüª2ý Þÿÿûüÿÿøö®XÈÿÿý&þÿ ÿøüÜ·‘lF ý£ÿÿõ×6ÿôªV üvõÿÿ%úNsS"üP úiã2Ae7ûœü=9û­ÿ‡:û–ÿÿ%9ú2þÿø9þ|ÿÿþG9þpÿÿýìF8ýüÿÿûþÂp/6ýKòÿÿ8ü*²ûÿÿ:úr¢¾ÙÿÝþþ!þÞÿÿþ]!þçÿÿþf!óñÿÿü²T5 LÿÿöÌ)=vÛÿÿþp!ûúÿø0þLÿÿþÌú•ÿÿy ûÿÿsþLÿÿþÌû Úÿ‚ û ÿìþLÿÿþÌügÿŒ üÿ¡þLÿÿþÌüÿ• ü ÿRþLÿÿþÌýП üh þLÿÿþÌý?C,þLÿÿþÌøÂïÞ®~M þLÿÿþÌô-‘u¤úÿÿó¼aXXþ,þLÿÿþÌ ûrÐÿý.îÿÿþ€þLÿÿþÌ üE·üÿÿþeÿÿþÀ˜˜þLþLÿÿþÌ ùM^‚òÿÿýÁÿÿþŒþLÿÿþÌ üÿÿþRÿÿþÆþLÿÿþÌ üUÿÿùýÿÿøþLÿÿþÌ ü5ÿÿþÏÿÿþ8þLÿÿþÌ ü4ÿÿþ¬ÿÿþ*þLÿÿþÌ ü4ÿÿú–ÿÿ÷þLÿÿþÌ ü4ÿÿûÆÿÿÊþLÿÿþÌ ü4ÿÿúýÿÿOþLÿÿþÌ ü4ÿÿû`ÿÿ›þLÿÿþÌ ó4ÿÿu 6âÿ´ þLÿÿþÌ þ4ÿÿùúÆÛþèWþLÿÿþÌ ö4ÿÿdy„^/ þLÿÿþÌ ü4ÿÿ&þLÿÿþÌ ü4ÿÿ&þVÿÿþÎ ü4ÿÿ&þjÿÿþâ ÷4ÿÿ7(!þ„ÿÿýù þEÿÿùùíТfýßÿÿþW þqÿ ÿý×8û*XÇÿÿûí4übêÿ ÿýêþþÿ ÿþ•ý¡ýÿÿöˆœ¥®·ÁÍÙíÿÿþ£:û#}úÜ<üú;ýuÆ<ýÈ„;üsæ9û§ô32ô'=qÇþåG3üÿþúÿÿüò| 4ÿüû”6ùÖ¯ˆa:9¼ý9ú`¬óL5ú@‡ÏþÿÿþL5ü‰ÅíÿÿþL7ýsÿÿþL8ýþÿÿþL9þîÿÿþL9þèÿÿþL9þèÿÿþL9þèÿÿþL9þèÿÿþL9þèÿÿúLŠâù.°éÓyõe©ÉéóÏ«~ õ;p¥ÚôÔ²q þèÿÿöLÿÿXüÿÿþPò|êÿË‚C[ªÿÿàA òºÿöËœÞÿÿï}þèÿÿ÷LÿÿPüÿÿþ¦ú¦ÿÿwú}ÿÿùúMëÿ˜ýÚÿÿýœþèÿÿõLÿÿ$ðFÃÿÿþzúÿÿüúíÿÿŽû{ÿýnþWÿÿþhþèÿÿøLÿÿÐfûL¿þåÿÿþ úÅÿÿôû/ûÿ¦ýòÿÿþ¶þèÿÿùLÿÿ¤þÿÿþ$þªÿÿþ úÈÿü(þÿÿþ»þèÿÿùLÿÿ/ ûÒÿÿÍþ¨ÿÿþ=ûjÿÿ©úØÿà:þèÿÿùLÿÿ û!Žˆþ¨ÿÿþYúíÿÿr ý'þèÿÿúLÿÿüCÖÿÿþhþ ÿÿþPþèÿÿúL-äÿÿúyÞëâÿÿþhþJÿÿþ.þèÿÿýŒðÿÿø8¦úÎa¨ÿÿþhþsÿÿþ%þèÿÿþãÿÿú=¾ÿ×Bþ¨ÿÿþhþÿÿþGþèÿÿý[Ýÿÿ ù ÿý‚þ¨ÿÿþhþµÿÿþkþèÿÿúL3øÿÿ úÒÿÿ~þ¨ÿÿþhþ”ÿÿþŽþèÿÿúLlÿÿ ùÎÿÿÄþ¨ÿÿþhþnÿÿýÙþèÿÿúLÿÿ þzÿÿþzþ¨ÿÿþhþGÿÿþb ýRIþèÿÿúLÿÿ þéÿÿþJþ¨ÿÿþhþÿÿýàü+ð)þèÿÿúLÿÿþÿÿþ€þÂÿÿþhþ±ÿÿý¡üÚ”þèÿÿùLÿÿþÿÿþ×ýîÿÿþrý'ûÿÿýÅû-âÚ þèÿÿùLÿÿþìÿÿþMûLÝúÿÿ÷”’ÿÿõç›c,-P¨üò1þõÿÿùPÿÿWþ¢ÿÿ÷ü t•×ùw{ÿÿöøšöËÿ ÿýùCþÿÿ÷’ÿÿâJýìÿÿûÑ.=ÿÿþ„ý˜ÿÿýáHü<¸ÿÿüæBÿÿüõÖ0ý(Çÿÿü×~ù¦ýÿÿûcü\Ôýÿÿüë‚ ý‰øÿÿþð ú7ecûjJú >oX"‘‚þ€€öZŽÁñݱ†*ü-Šâù.°éÓyû KtúÿÿûçŠdEùcöÿîÙúÿÿüøuürÐÿÿýXüÿÿþPúØÿú„õ ¡ÿ©Oçÿÿþ°üE·üÿÿüPüÿÿþ¦û‡ÿÙ/ûÑÿ‰ý-ýÿÿøSM^‚òÿÿú$ðFÃÿÿþzú’ÿ« ûuÿÞ þ¥ÿÿýâ þÿÿýÐfûL¿ û¬ÿûðÿwþRÿÿþdþUÿÿþ¤ûÂüeû”ÿÿ7þÿÿþ¡þ5ÿÿþ/üÕöLú ûÿþxttþóÿÿþÝþ4ÿÿþýó> þ2ÿÿþþ4ÿÿýú< ûXÿÿì( (þ þ4ÿÿüÿçþ}ÿÿþþ4ÿÿÿýÆþ¢ÿÿþ6þ4ÿÿÿþ–þµÿÿþ_þ4ÿÿÿþ`þ–ÿÿþ‡þ4ÿÿþ«ÿÿý÷3þsÿÿþ¶ þþ4ÿÿýÝÿÿýàþQÿÿýû ù(å 4ÿÿý3ùÿÿý¼þ-ÿÿþ‘ üÑ‚þ4ÿÿþmÿÿþŠýÏÿÿýþIû«îþ4ÿÿþ¬ÿÿþWþIÿÿü÷uû¼ÿuþ4ÿÿþýÝÿÿýøAþÂÿÿôÈW)2‡ðÿ¡þEÿÿþý6ûÿÿýòJý2íÿÿþüÿÿý°þqÿÿþWþÁÿÿ÷ýIÈÿÿüú“übêÿÿüâJùÆ ~Îþÿÿøó2Œæÿÿüþ«%ý¡ýÿÿüõÖ0$ùJt[2 ¥ $ $ $ $“I$XPIcon (original)ÿ     @áXPN§N³N¿NËXPa4üIsIƒI“I£I³IÃIÓIãIóL N'N7NGNWNgNwN‡N—ø& 6þ88Û67789==<=?@@?@>=:7541/+(%#"!!$,ï:KjdJHGEC==B CDDCùBA@@??==ü>==>>?>â!;Q|}vy}ƒˆ=? Œ‰†ysojd^ZXVUTTUTýQO÷($0@Hp[VVÞWVAE; UUVVXZ\^afiloswyz{{zyxvtpn÷:KG@BK|QTTúJSW TTSùXbmndZRRúQRSTU÷3LXKCLƒPTTùGV\TTò;@KV`ghaXMC=aTT÷2M]NCN}RTTúNUTTóA=:GQX^_ZSI?==ü TT÷.JSKEUoSTTùS;T7TTða›N9ANSTQKC=?9>  ø-IOJEdcTTëSUX3X=XVUT=9PŠ’qUGGöC==:%AU ÷,HKGEs`STTÞS^YV2W^` ]==>>/#Jq{rX/0Eap^VTDò)FGFDz_XTSS^aSS÷;IWUQE3;==>ð7*%*'.^\IGMUZGæ%ECFFv^\`SRTNPRS$ 9KETŽ99==ñ>?>>('03=DKQW^á$ECGJn]Xuš¥¨ª¨§¦*>Aˇ7125:;==õ%!*19?FLS[à CDHSnZa`|¬ª{kiggаeèÏ¢†oXG;==õ%%-5;AGPTñAEH[uRSRKjš”X??ä?ÈÿÿÈz÷ÿÿì¤[A;=>"'/6=DJ3Ó@=>>1RTSROT nD@@ñÿùùÿ»l÷ÿÿÛ†L==>" "+19?+¬Ó@>719=SbmSQUx¤‹RÿÿüûúúÿŸqöÿù¼hA;>"$.42¤ëÓAGK2Scjqh\QE7Góÿüüúúûÿ¢^ÇÿðœR=>" =£æÑÓAINr^T!'3QWQE-‘þÿþüûúúüÿÕnwÑÖ‚C=!sÊãÓÒÓAKO„WTT'7\ôÿÿþüûúûüýÿÿÀql{U:.y¿æÞÑÒÛùBLOUTTø+(ˆÿÿæýüûüÿÿýýüÿùÈ{$ .”ÑæâÖÔÓÚ©ùBMP‰VTTß"ËÿÿþüûüùÛæÿýû÷ô÷ö³EÃêáÙ×ÖÕÖÅùEMVxVTTSûûþýüüéý°U;®ÿú÷ôñìè±ÜÚÛÛÙÖÓ× úHNdjTTùV^abdýüüèýôsI.ôûöóïëâ¯ØÚÜÛØÓÏÒ¦ùJMreSTTþWXXýùúüüçþ÷a%ìúôñîéà°ÖÚÜÚÖÐËËÈ:ùLMxeSTTSüKÛÿüüèÿ›nûõñðìéß±ÖÙÛÙÓÎÊÈϳùJNvdSTTûJGæþüüýèþüÁ°ï÷ñïîëçÝ°ÒØÚ×ÒÌÉÉÊÒù!KQq`STTøbZK¤ùùûüüÿì÷ñîíìéåÜ®Ð×ÙÖÏËÈÉËÍú.KVqXTTiöcUbÝ÷úûûúùù÷ëôñîìëéçãÙ®ÎÖ×ÓÍÉÈÉËÍÓ>N\yJT^dgg[:_üüùùøööõôòðîìééçäà×­ÍÔÖÑËÈÈÊËÎÓE7=?GEEAG6ƒûù÷õôòññîîìëéæåãàÝÕ­ËÒÔÏÊÇÈÊÌÏøC9!! Ý_ìñôòñîíììëêéçåãáßÝÙÒ«ÉÑÒÎÈÇÈËÍÏôAQap %!(úùèîììèèéçææãâàÝÛÙÖÏ©ÆÏÑÌÈÈÉËÎÐùDQlcSTTÛVæáçåãâãääããâàÞÜÚÙÖÓͨÄÎÏËÈÈËÍÏÑú&LP{\TTöWfR×ÚàÝÜÞààêßÞÝÛÙØÕÒÐË¥ÀËÏËËÑÑÒÏÒú/QO„[TTöVhRTÖÝÛÙÜÝÝêÛÚÙØÖÔÒÐÎÈ¢¼ÈÍÑÇ‚R©ÖÔú,RO[TTÚSUTWhSUÒÙÙÖØÙÙÛßÞÛÖÔÒÑÏÍËŹÆÏÁDbÖÖú+PTvZTTÚVagi}omÏÕ×ÒÓÕ×ËŠx·ØÑÏÎËÊÈÄš·ÄÒz(@dÏÙù5PapVTTÚSTUWiYTÀÎÕÐÏÑÓ|3*.ªÓÌËÉÈÆÁ—·ÃÒuG\~ÓÚù CQnrSTTÝU[]UT­ÕÍÌÏÆZE=!FÈÊÈÇÆÅÁ•¸ÄÏ­7Ul¥ÛÛùNRuvSTTùSRZXT‚ÈÈÊèn?;!1ÀÈÅÄÅÆÁ•ºÆËÑŸžÑÜÝùQRttSTTßW\Se£ÆÄÆÊ±X:D™ÉÄÄÅÆÆÀ’¹ÇÍÏÖÖÙÚÝàùNTrkSTTàZ]ZoºÀÂÃǽ¯ÀËÅÅÆÇÈÈÀ¸ÈÏÑÓÖÙÜßãú"MWu]T T[ôZ‡ÃÀÂÃÆÈÇÆÇÈÈñÊɾ޹ÉÑÔÖÙÝàâæû3PZT TSóD©ÃÁÄÅÆÆÇÈÈÉËË󿎼ÌÔ×ÙÜßâæéúBS[…PT TäXN¼ÂÃÅÇÈÈÉÊËÌÍÍÁÀÏÖÙÜÞáæéìúFT]‚RSSTå/aÄÃÄÆÈÊËËÌÎÏÏÑÂÏØÝßâåèêìúAZs‰hddÙeddb_]YVTSRRfoÅÄÄÇÉËÍÏÐÑÑÁŽÁÏÚßâäæééèÐ @Uryouz{{zwtrppsv{~UfÂÈÅÈËÍÐÒÓÒÀÃÐÝàâãäæéâ÷HUZVTSSRRÜTUWZ\]_``__CL®ÊÅÅÈÌÏÒоŒÇÒÚÝÞàåëÏjñ9<58BNHEGILMNOOPæQRs>$~¸ÆÅÄÇÉÉ·ˆÉÑÖÙàèÜ>ö_F91+%4Ö,†…„ƒ‚†‡’•–••“Š„zwqi`\VUQOMHKHIMXð7Œ›­ª›š™˜—— ——÷–•““’’‘ø’“”•’‘‘âQŸ¹»·º»¾Á Å ÂÁ¿¼·´±®«§¥¤£¢¡¡ü Ÿž÷7HAi“š³ª¨¨ú"% §§ó¨©ª««­°²´µ·¹»»øº¹¹·¶´³÷gw|—œº¥§§ú*26 § §ñ8BMOD9¦¦¥¥¦¦§§÷Z‚†ˆ˜¾¥§§ù(6;§§ò!+6@GHA8.#¯§§÷W‚‰˜ž»¥§§ú05§§ó"'18=>:2) ü §§÷Rƒ‘™£´¦§§ù¦ 7§§ð?|.#.330+#   øN~•𬮧§ß¦§©94¨¨§ 3ltP5(('#"")9 ÷L|}—𴬦§§ó¦­ª¨6>A ­î -S]P7.JZLJH)òHzz—™¸­©¦¦¥¬®¥¥÷+750$ð KJ<;BLO0æEwz—›¶¬«¬ ž™šœœ,'7õ"%.6>ENUá@v™ž³¬©µÇÍÏÐÏÏÎ(Ñt÷#*19@GSà8r†›£³ª¯¨³ÑѲ§¦¥¥ >,GïÈoV?*õ%-4;CLñ3p‰œ§¸¦¦¤š§ÄšŠŠä?`c:Vùþþè’B#  (/7A"Ó1o¦§¦¥Ÿ™¼É©‹‹_nqnl6NõþþÒp2 #*4 pÓ/p3BM¥¡¯Ì½—s{€ztp-Xõþø®P% ).n”Ó.t’Ÿ3CKRG<0&!{‡€{v3:¼þí‡7  1hw6Ó,w˜ ´¬§  270%Pª¢œ˜Š†ƒ~P ZÉÎk& D€d9:Ó({ž¡¿¨§§ (¤¼¯§ –Ž‹‰‚{k7Li: DiwO,5Aú$}¡¡Å§§Ü 4 ­­«¢—‹‡xqgQ- ?f`J2+19-ù$¡¢Â¨§§ßLŠš¢£”ˆmluomgZL='H8(*..0-ù+ˆ¡¥¹¨§§¦â,d’˜˜”ŽX%3!$("%úc›¦µ©§§IÝB9-CWaZVQNMJGB=7349>:/#& &Ó¡ªº*4=DGF;vuVMJFDA?:5200483*"$ (û ''Ú$*!usREA=;8630.,,..+$ !")øŒ Ý 7vabG=7420/.,*)'&%#$+ô‡¥­¶ àƒKT93.-,+,+)'&#!&.ú0¤³¯§§Û¨F7D.('))(('&$! ")0úS›¤»«§§õ©²¥'3'!#%$$ê#!  %,3úd¤£¿ª§§õ¨³¥§!/' !  ê17ú]§£¾ª§§ñ¦§§¨´¦§)'ë 4;ú\¥¦¹©§§Ú¨¯³´Á··#&  %7Aù m£­µ¨§§ô¦§§¨´©§$è  )5=Fù#‰¤´¶¦§§¬ï¨§ "   ó '9@BLù,Ÿ¥¸¸¦§§¦ù«©§è    &'1?BIRù%¤¦·¸¦§§ß©¬¦   %+17>GPZù+ž¦¶³¦§§úª­«þí!+17>FNXbúE›¨¸¬§ §«ý ì &18>ENV`jûl ª¾§ §¦ûë " -8?FMV^isú‡§«Á¥§ §ä !$'* #3@GNV_hqyû©«¿¦¦§å !#$&(*-0 %6GPW_hpttú„«·Ã±¯¯°ø¯®­¬©¨§¦¦å "$'*,/157" %7NYagkli]ø‚§¶»µ¸»»üº¹¸¶¶à·¹»½¾¾#&&)-159<;" ';T^ab_\VIù=‘ª­ª§¦¦§Þ¨ª««¬­­¬¬ !)(*/4:?< *MòUªÒüþýýùîéòøðííò0þŃ\B,  ÷  (09EÓK¥Øþþýÿÿûíæëôêæçç9ýþþè„0  "*7ðJ£  ÿÿþüóàéòíççå 5õþþÌ]  )RÓF¦ (1ý÷êåòñé ?õþù <  'RtÓE®çÿ (/6-" #+0.' ®þìv$  *JTÓ@¶óþýþÿ  '`LC>3*#?¾ÈW 1]Bå9½üþýþÿÿ h„eWL<0*" ð0T% .HP/ù5¾þþýþÿÿî Lc_^Q>0& ó(B8' ù9ÅþþýþÿÿñK %&þÿÿõ(h£·ûÿâJ+‡ÿÿò4l¦÷ó¾¸ÇœngYxÿÿòRcqdEKdgaL%?ÿÿû ý3ýÿÿ ýòÿÿ ýÛÿÿ!þµÿÿ!þÿÿ!þ?ÿÿ!ý áÿÿ"þ•ÿÿ"ý;þÿÿ"ýÆÿÿ#þ`ÿÿ#ýÇÿÿ$ý^óÿÿ$üŸþÿÿ%ýI¼ÿÿ%ümÆÿÿ&û+~¾ýÿÿ'ûA€¬îÿÿý÷Ë&ùL•Ïúÿ ÿüýá¶šÎù*EFC@>?CGKLKKLNOacM.)ý=?A AñCIOTXTF53689?6#öNLJGEDBA@??þ@AAû?NB9#lækjkmnpsvwx=>wvtqkgc_[czE6#äUVXZ[\]^_``(75_ __`bcfqP6#TSöD7S SSTTû_yA5#TóSTSTTSJ(S TTû_yB6#TSôU]^bZWCTTû_yC6#ðTW_\]b`b`PTTû_xD9#îTZWXY[e]ZTWTTû^xE9#í!XWW`bd?"^^]STTû_xF9#ëK@KQW]_X!`gk_TSTTû_vG;#ëZ2=NTTQ7 1VX`fZRVTTû_tG<#ä9€z@ $ ;>ifSZaVTT_rH=#ä®éË7*“/:œ hj_WS_pI=#äîÐÔ”.//%q d_XUSaoJ?#øÑÒÒÓx*î^R6A`]`[TbmK?#äÒÖÖÓ×~*Q`da\L* QaVTSTdlK?#ëÖÙÚÙÜŽ/PZ^^IOcUTTûekLA#÷ÞáÝÞÞÑmAGGöMfVTTûfjLA#ñ\™âààçµ9"!üMhVTTûgiMA%õ¤æáæÃûMhVTTûhgNA#ó@ÛàâäV(ú§{MgWTTûieNB#ôÈáàé·B?ù¨}SeVTTûjcOB%íC×ßàèÇ|I+=>C§|\eVTTûj`OB#ä^qÄÝÝáèÔlK3†~w¬tZl^VSTl_OB#äÖÚÚÙÞâèàeN9‰ŠŒ’ndpj\TSo^OB#äÐÒÖÛÞãèêiQIMNPSQWZc_SSs^PB#äÐÓ×Ûßãèðy:PVTSSTTWbTSu^PB#äÑÔØÜàäéòz2W]^]\^_`n^Sw]PB#äÒÕØÝàåéôLafY\^`bq_Sy]QD#äÒÖÙÝâæëôyVhje"TSSTlTSz\QD#äÓÖÚÞãèìôlPed_VLTVcUS|[QC#äÕØÜàäéîð\/CLQMASR}ZRB#äÖÙÝáæëñæA 26;= R~ZRA#ä×ÚßãèìôÑ%!9 YR@#õÙÝàæêîø® þû YR>#õÚÞãçìðö ûfcYSTTúRƒYR:#óÝàåéîóäG üVTSTTùQ…ZR;"õßãèìð÷¸TùQ‡ZSC"õáæêîñôrTùQˆZSG"ôåéìð÷Í+TùQ‰ZSF"ôèìîñóuTùQ‰ZSE-"öêîïöº!STùQ‰ZSG="öíïñßL$ðTZ^[Y[VXWPˆZSH@"îäêw.`dgcgiglbRˆ[TH=!ëä+'gc]cXZ^d\ZP‡[THB2!âç– $6XWWZaYY``[_Q†[TMJ@!≠1"SSWfcebhff_Q…[TQN<!ô.'QRRïWTVUVVWUQ„[TIG= á+"††ƒ~wqjda`^_`^…dSC;8 Îù$Fm…Ž/ï+Gh~Š„wlho|†ŽŒm)êgt~~yrpsz€…†…„„……’’„R)ý‘’““é’‘ŽŒŒ”—˜”‰wz…‰’#÷œ›™˜—––••þ”••–—û–Ÿ™…#ý²±°°é±²³´µ¶·¶µ´²¯¬ª¨¥©·™|#÷§¨©ª««¬¬­­ï¬ ¬¬­­®¯µÃ {#§¦÷% ¦¦§§û­·˜{#§ó¦§¦¦§2*§ §§û­·™{#§¦ô¨­­°97$ §§û¬·š|#ð§©®¬­°®¯@0  §§û¬·š~#î§«©©ª«D= «§¨§§û¬·›€#íª©¨@AD#­­«¦§§û¬·œ€#ë4!*17<>9  ®³µ®§¦§§û¬¶œ‚#ëM%.441¥§­±ª¦¨§§û¬µž…#ä&B,"  §©¢ª¯¨§§¬´ž†#äs}4ÁÇ ³´®©§¬³ž‡#ä›;<# « °®©¨§­²Ÿ‰#ø8>@;'ï>2Œ®¬®¬§®± ‰#ë;DID@(%0?DA;,¯¨§§û¯± ‰#ëDMTSL009>=+œ°¨§§û¯±¡‰#ëJTZ_ZN,"()) œ²¨§§°ý¢‹#ñ/XadbE3  üœ³¨§§û±°¢‹%ù5^egNþü³¨§§û±¯£‹%õ Q_dbúϲž³©§§û²®£‹%öCZ`gH=:ùд¢±¨§§û²­£‹%í GU^hT,C'‰‰Î´©±¨§§û²¬¤‹#ä7IS_j_%F.¹´¯Ò¯¨¶­¨¦§³«¤‹#ä/8@HT`li'I4ºº»À®¯¸µ¬¦§µ«¤‹#ä-5?JUamq/$C››œŸ¡¨«°®¦§·«¥‹#ä.7@KWcou4%2§¦¦¥¦§¨°§¦¸ª¥‹#ä/8BMYeqy+7< ­¬¬­®®·­¦¹ª¥‹#ä1:DO[hs|.-AFª¬­¯°¹­¦ºª¦#ä26,§¨°§¦¼ª¦‹#ö8BMXes}}ð&-0,"§¦¼ª¦‰#äA+úþþÿÿúýþÿ°"ø#*19A>üÿÿúýþÿ¿B"ø'/7>B7 þÿúýþÿÉM"ø,3;@?%üÿÿúýþÿÅT"ù18><5 ü"ÿÿúýþÿÃu"ñ6<<6"$ÿÿúýþÿÇœ"ï:<4%+'þýüýýþúýþÿÉ£"ñ91% $7'üûûöúüþýþÿÈ›<!ü* è3:ûûüûýýüûüýÿýþÿȨ…!ý ç$B0ýþýýüýýüüýüþýþþȸª!þæ7?"ÿÿþúûúûúúûüÿýþþȹ›%ù.B(ÿÿþõýþÿýþÿȵžB#ù(B0ýýþøýþþ½–“^  ý<;ü0‰:üº':ü/â†:ûîì:ü¥÷t:û=ü‘;8ù .ÉÇ_3õ">=Ý<;::;;<=>ABo?:}®ÄËË̸…ÑÛãàËšQý3FEEÚFEDCA>:73.($!h> +V|˜©§‘¯¨f9 ÷      ëS' (.$+öa?!  ø ".*-ïZD- (25$1ü €ÖCntpllkjihhfghilqtx}!(+-01=GG>*èXxvwwvwwvtpjc^XQF?92*ñ!(!,1) ÷, ö ý öý +ü  û -ú ø 1ý  þ×e¤¢¢¡  žš™˜˜šž¤ª¯¶½   脳®¯°¯°±®«§ž“Œƒxh]TJ@ó  ç(B1,'"$(%%&#  þ+ý ü-üù$0ú^K7+ú$+7<(øI}…¥Óôÿÿù÷áÁ£Ž~(é;u€‹£¾ÕäîòòîæÚʸ¦“„vg*ë"`}‚†•œ¡¢Ÿœ™•Žƒyn\?+ø5bx|{{||}øzvn_F*-ï)Kbnstsoh_O;%Àâ-"[[ZZ[^afmry~€~nT;!ä/(NMLLNPQSTUTTSSRPmYSC#ä/' &05:?>>=:<<>FHLA#ûø $ý;þ¾÷ ªªï¬­°´¶º½¾¾½Í´¦w!䜚™š £¥¨©©¨§§¦¤³©¦†#ä '4@P`lx}}zwwz~‰‘™„#þ÷#2B-$þýù$?0þþýùüýÿ¶)4!ð'<0ççéìñõùüÿÿûýþÿÍ#ä.B6$-=Qc|•¥µº·³±°³»ÂÏÞëÊ$û$7:0 ÷(8MfI#û6?7$:ý:+½ûmT/:üM) ;ý<þ>€€€€,(–K %XPIconÿ     BO€XPO¤‡F‡R‡^‡jXPPm›‚‚"‚2‚B‚R‚b‚r‚‚‚’…?†Æ†Ö†æ†ö‡‡‡&‡6ø& 6þ88Û67789==<=?@@?@>=:7541/+(%#"!!$,ï:KjdJHGEC==B CDDCùBA@@??==ü>==>>?>â!;Q|}vy}ƒˆ=? Œ‰†ysojd^ZXVUTTUTýQO÷($0@Hp[VVÞWVAE; UUVVXZ\^afiloswyz{{zyxvtpn÷:KG@BK|QTTúJSW TTSùXbmndZRRúQRSTU÷3LXKCLƒPTTùGV\TTò;@KV`ghaXMC=aTT÷2M]NCN}RTTúNUTTóA=:GQX^_ZSI?==ü TT÷.JSKEUoSTTùS;T7TTða›N9ANSTQKC=?9>  ø-IOJEdcTTëSUX3X=XVUT=9PŠ’qUGGöC==:%AU ÷,HKGEs`STTÞS^YV2W^` ]==>>/#Jq{rX/0Eap^VTDò)FGFDz_XTSS^aSS÷;IWUQE3;==>ð7*%*'.^\IGMUZGæ%ECFFv^\`SRTNPRS$ 9KETŽ99==ñ>?>>('03=DKQW^á$ECGJn]Xuš¥¨ª¨§¦*>Aˇ7125:;==õ%!*19?FLS[à CDHSnZa`|¬ª{kiggаeèÏ¢†oXG;==õ%%-5;AGPTñAEH[uRSRKjš”X??ä?ÈÿÿÈz÷ÿÿì¤[A;=>"'/6=DJ3Ó@=>>1RTSROT nD@@ñÿùùÿ»l÷ÿÿÛ†L==>" "+19?+¬Ó@>719=SbmSQUx¤‹RÿÿüûúúÿŸqöÿù¼hA;>"$.42¤ëÓAGK2Scjqh\QE7Góÿüüúúûÿ¢^ÇÿðœR=>" =£æÑÓAINr^T!'3QWQE-‘þÿþüûúúüÿÕnwÑÖ‚C=!sÊãÓÒÓAKO„WTT'7\ôÿÿþüûúûüýÿÿÀql{U:.y¿æÞÑÒÛùBLOUTTø+(ˆÿÿæýüûüÿÿýýüÿùÈ{$ .”ÑæâÖÔÓÚ©ùBMP‰VTTß"ËÿÿþüûüùÛæÿýû÷ô÷ö³EÃêáÙ×ÖÕÖÅùEMVxVTTSûûþýüüéý°U;®ÿú÷ôñìè±ÜÚÛÛÙÖÓ× úHNdjTTùV^abdýüüèýôsI.ôûöóïëâ¯ØÚÜÛØÓÏÒ¦ùJMreSTTþWXXýùúüüçþ÷a%ìúôñîéà°ÖÚÜÚÖÐËËÈ:ùLMxeSTTSüKÛÿüüèÿ›nûõñðìéß±ÖÙÛÙÓÎÊÈϳùJNvdSTTûJGæþüüýèþüÁ°ï÷ñïîëçÝ°ÒØÚ×ÒÌÉÉÊÒù!KQq`STTøbZK¤ùùûüüÿì÷ñîíìéåÜ®Ð×ÙÖÏËÈÉËÍú.KVqXTTiöcUbÝ÷úûûúùù÷ëôñîìëéçãÙ®ÎÖ×ÓÍÉÈÉËÍÓ>N\yJT^dgg[:_üüùùøööõôòðîìééçäà×­ÍÔÖÑËÈÈÊËÎÓE7=?GEEAG6ƒûù÷õôòññîîìëéæåãàÝÕ­ËÒÔÏÊÇÈÊÌÏøC9!! Ý_ìñôòñîíììëêéçåãáßÝÙÒ«ÉÑÒÎÈÇÈËÍÏôAQap %!(úùèîììèèéçææãâàÝÛÙÖÏ©ÆÏÑÌÈÈÉËÎÐùDQlcSTTÛVæáçåãâãääããâàÞÜÚÙÖÓͨÄÎÏËÈÈËÍÏÑú&LP{\TTöWfR×ÚàÝÜÞààêßÞÝÛÙØÕÒÐË¥ÀËÏËËÑÑÒÏÒú/QO„[TTöVhRTÖÝÛÙÜÝÝêÛÚÙØÖÔÒÐÎÈ¢¼ÈÍÑÇ‚R©ÖÔú,RO[TTÚSUTWhSUÒÙÙÖØÙÙÛßÞÛÖÔÒÑÏÍËŹÆÏÁDbÖÖú+PTvZTTÚVagi}omÏÕ×ÒÓÕ×ËŠx·ØÑÏÎËÊÈÄš·ÄÒz(@dÏÙù5PapVTTÚSTUWiYTÀÎÕÐÏÑÓ|3*.ªÓÌËÉÈÆÁ—·ÃÒuG\~ÓÚù CQnrSTTÝU[]UT­ÕÍÌÏÆZE=!FÈÊÈÇÆÅÁ•¸ÄÏ­7Ul¥ÛÛùNRuvSTTùSRZXT‚ÈÈÊèn?;!1ÀÈÅÄÅÆÁ•ºÆËÑŸžÑÜÝùQRttSTTßW\Se£ÆÄÆÊ±X:D™ÉÄÄÅÆÆÀ’¹ÇÍÏÖÖÙÚÝàùNTrkSTTàZ]ZoºÀÂÃǽ¯ÀËÅÅÆÇÈÈÀ¸ÈÏÑÓÖÙÜßãú"MWu]T T[ôZ‡ÃÀÂÃÆÈÇÆÇÈÈñÊɾ޹ÉÑÔÖÙÝàâæû3PZT TSóD©ÃÁÄÅÆÆÇÈÈÉËË󿎼ÌÔ×ÙÜßâæéúBS[…PT TäXN¼ÂÃÅÇÈÈÉÊËÌÍÍÁÀÏÖÙÜÞáæéìúFT]‚RSSTå/aÄÃÄÆÈÊËËÌÎÏÏÑÂÏØÝßâåèêìúAZs‰hddÙeddb_]YVTSRRfoÅÄÄÇÉËÍÏÐÑÑÁŽÁÏÚßâäæééèÐ @Uryouz{{zwtrppsv{~UfÂÈÅÈËÍÐÒÓÒÀÃÐÝàâãäæéâ÷HUZVTSSRRÜTUWZ\]_``__CL®ÊÅÅÈÌÏÒоŒÇÒÚÝÞàåëÏjñ9<58BNHEGILMNOOPæQRs>$~¸ÆÅÄÇÉÉ·ˆÉÑÖÙàèÜ>ö_F91+%4Ö,†…„ƒ‚†‡’•–••“Š„zwqi`\VUQOMHKHIMXð7Œ›­ª›š™˜—— ——÷–•““’’‘ø’“”•’‘‘âQŸ¹»·º»¾Á Å ÂÁ¿¼·´±®«§¥¤£¢¡¡ü Ÿž÷7HAi“š³ª¨¨ú"% §§ó¨©ª««­°²´µ·¹»»øº¹¹·¶´³÷gw|—œº¥§§ú*26 § §ñ8BMOD9¦¦¥¥¦¦§§÷Z‚†ˆ˜¾¥§§ù(6;§§ò!+6@GHA8.#¯§§÷W‚‰˜ž»¥§§ú05§§ó"'18=>:2) ü §§÷Rƒ‘™£´¦§§ù¦ 7§§ð?|.#.330+#   øN~•𬮧§ß¦§©94¨¨§ 3ltP5(('#"")9 ÷L|}—𴬦§§ó¦­ª¨6>A ­î -S]P7.JZLJH)òHzz—™¸­©¦¦¥¬®¥¥÷+750$ð KJ<;BLO0æEwz—›¶¬«¬ ž™šœœ,'7õ"%.6>ENUá@v™ž³¬©µÇÍÏÐÏÏÎ(Ñt÷#*19@GSà8r†›£³ª¯¨³ÑѲ§¦¥¥ >,GïÈoV?*õ%-4;CLñ3p‰œ§¸¦¦¤š§ÄšŠŠä?`c:Vùþþè’B#  (/7A"Ó1o¦§¦¥Ÿ™¼É©‹‹_nqnl6NõþþÒp2 #*4 pÓ/p3BM¥¡¯Ì½—s{€ztp-Xõþø®P% ).n”Ó.t’Ÿ3CKRG<0&!{‡€{v3:¼þí‡7  1hw6Ó,w˜ ´¬§  270%Pª¢œ˜Š†ƒ~P ZÉÎk& D€d9:Ó({ž¡¿¨§§ (¤¼¯§ –Ž‹‰‚{k7Li: DiwO,5Aú$}¡¡Å§§Ü 4 ­­«¢—‹‡xqgQ- ?f`J2+19-ù$¡¢Â¨§§ßLŠš¢£”ˆmluomgZL='H8(*..0-ù+ˆ¡¥¹¨§§¦â,d’˜˜”ŽX%3!$("%úc›¦µ©§§IÝB9-CWaZVQNMJGB=7349>:/#& &Ó¡ªº*4=DGF;vuVMJFDA?:5200483*"$ (û ''Ú$*!usREA=;8630.,,..+$ !")øŒ Ý 7vabG=7420/.,*)'&%#$+ô‡¥­¶ àƒKT93.-,+,+)'&#!&.ú0¤³¯§§Û¨F7D.('))(('&$! ")0úS›¤»«§§õ©²¥'3'!#%$$ê#!  %,3úd¤£¿ª§§õ¨³¥§!/' !  ê17ú]§£¾ª§§ñ¦§§¨´¦§)'ë 4;ú\¥¦¹©§§Ú¨¯³´Á··#&  %7Aù m£­µ¨§§ô¦§§¨´©§$è  )5=Fù#‰¤´¶¦§§¬ï¨§ "   ó '9@BLù,Ÿ¥¸¸¦§§¦ù«©§è    &'1?BIRù%¤¦·¸¦§§ß©¬¦   %+17>GPZù+ž¦¶³¦§§úª­«þí!+17>FNXbúE›¨¸¬§ §«ý ì &18>ENV`jûl ª¾§ §¦ûë " -8?FMV^isú‡§«Á¥§ §ä !$'* #3@GNV_hqyû©«¿¦¦§å !#$&(*-0 %6GPW_hpttú„«·Ã±¯¯°ø¯®­¬©¨§¦¦å "$'*,/157" %7NYagkli]ø‚§¶»µ¸»»üº¹¸¶¶à·¹»½¾¾#&&)-159<;" ';T^ab_\VIù=‘ª­ª§¦¦§Þ¨ª««¬­­¬¬ !)(*/4:?< *MòUªÒüþýýùîéòøðííò0þŃ\B,  ÷  (09EÓK¥Øþþýÿÿûíæëôêæçç9ýþþè„0  "*7ðJ£  ÿÿþüóàéòíççå 5õþþÌ]  )RÓF¦ (1ý÷êåòñé ?õþù <  'RtÓE®çÿ (/6-" #+0.' ®þìv$  *JTÓ@¶óþýþÿ  '`LC>3*#?¾ÈW 1]Bå9½üþýþÿÿ h„eWL<0*" ð0T% .HP/ù5¾þþýþÿÿî Lc_^Q>0& ó(B8' ù9ÅþþýþÿÿñK %&þÿÿõ(h£·ûÿâJ+‡ÿÿò4l¦÷ó¾¸ÇœngYxÿÿòRcqdEKdgaL%?ÿÿû ý3ýÿÿ ýòÿÿ ýÛÿÿ!þµÿÿ!þÿÿ!þ?ÿÿ!ý áÿÿ"þ•ÿÿ"ý;þÿÿ"ýÆÿÿ#þ`ÿÿ#ýÇÿÿ$ý^óÿÿ$üŸþÿÿ%ýI¼ÿÿ%ümÆÿÿ&û+~¾ýÿÿ'ûA€¬îÿÿý÷Ë&ùL•Ïúÿ ÿüýá¶šÎù*EFC@>?CGKLKKLNOacM.)ý=?A AñCIOTXTF53689?6#öNLJGEDBA@??þ@AAû?NB9#lækjkmnpsvwx=>wvtqkgc_[czE6#äUVXZ[\]^_``(75_ __`bcfqP6#TSöD7S SSTTû_yA5#TóSTSTTSJ(S TTû_yB6#TSôU]^bZWCTTû_yC6#ðTW_\]b`b`PTTû_xD9#îTZWXY[e]ZTWTTû^xE9#í!XWW`bd?"^^]STTû_xF9#ëK@KQW]_X!`gk_TSTTû_vG;#ëZ2=NTTQ7 1VX`fZRVTTû_tG<#ä9€z@ $ ;>ifSZaVTT_rH=#ä®éË7*“/:œ hj_WS_pI=#äîÐÔ”.//%q d_XUSaoJ?#øÑÒÒÓx*î^R6A`]`[TbmK?#äÒÖÖÓ×~*Q`da\L* QaVTSTdlK?#ëÖÙÚÙÜŽ/PZ^^IOcUTTûekLA#÷ÞáÝÞÞÑmAGGöMfVTTûfjLA#ñ\™âààçµ9"!üMhVTTûgiMA%õ¤æáæÃûMhVTTûhgNA#ó@ÛàâäV(ú§{MgWTTûieNB#ôÈáàé·B?ù¨}SeVTTûjcOB%íC×ßàèÇ|I+=>C§|\eVTTûj`OB#ä^qÄÝÝáèÔlK3†~w¬tZl^VSTl_OB#äÖÚÚÙÞâèàeN9‰ŠŒ’ndpj\TSo^OB#äÐÒÖÛÞãèêiQIMNPSQWZc_SSs^PB#äÐÓ×Ûßãèðy:PVTSSTTWbTSu^PB#äÑÔØÜàäéòz2W]^]\^_`n^Sw]PB#äÒÕØÝàåéôLafY\^`bq_Sy]QD#äÒÖÙÝâæëôyVhje"TSSTlTSz\QD#äÓÖÚÞãèìôlPed_VLTVcUS|[QC#äÕØÜàäéîð\/CLQMASR}ZRB#äÖÙÝáæëñæA 26;= R~ZRA#ä×ÚßãèìôÑ%!9 YR@#õÙÝàæêîø® þû YR>#õÚÞãçìðö ûfcYSTTúRƒYR:#óÝàåéîóäG üVTSTTùQ…ZR;"õßãèìð÷¸TùQ‡ZSC"õáæêîñôrTùQˆZSG"ôåéìð÷Í+TùQ‰ZSF"ôèìîñóuTùQ‰ZSE-"öêîïöº!STùQ‰ZSG="öíïñßL$ðTZ^[Y[VXWPˆZSH@"îäêw.`dgcgiglbRˆ[TH=!ëä+'gc]cXZ^d\ZP‡[THB2!âç– $6XWWZaYY``[_Q†[TMJ@!≠1"SSWfcebhff_Q…[TQN<!ô.'QRRïWTVUVVWUQ„[TIG= á+"††ƒ~wqjda`^_`^…dSC;8 Îù$Fm…Ž/ï+Gh~Š„wlho|†ŽŒm)êgt~~yrpsz€…†…„„……’’„R)ý‘’““é’‘ŽŒŒ”—˜”‰wz…‰’#÷œ›™˜—––••þ”••–—û–Ÿ™…#ý²±°°é±²³´µ¶·¶µ´²¯¬ª¨¥©·™|#÷§¨©ª««¬¬­­ï¬ ¬¬­­®¯µÃ {#§¦÷% ¦¦§§û­·˜{#§ó¦§¦¦§2*§ §§û­·™{#§¦ô¨­­°97$ §§û¬·š|#ð§©®¬­°®¯@0  §§û¬·š~#î§«©©ª«D= «§¨§§û¬·›€#íª©¨@AD#­­«¦§§û¬·œ€#ë4!*17<>9  ®³µ®§¦§§û¬¶œ‚#ëM%.441¥§­±ª¦¨§§û¬µž…#ä&B,"  §©¢ª¯¨§§¬´ž†#äs}4ÁÇ ³´®©§¬³ž‡#ä›;<# « °®©¨§­²Ÿ‰#ø8>@;'ï>2Œ®¬®¬§®± ‰#ë;DID@(%0?DA;,¯¨§§û¯± ‰#ëDMTSL009>=+œ°¨§§û¯±¡‰#ëJTZ_ZN,"()) œ²¨§§°ý¢‹#ñ/XadbE3  üœ³¨§§û±°¢‹%ù5^egNþü³¨§§û±¯£‹%õ Q_dbúϲž³©§§û²®£‹%öCZ`gH=:ùд¢±¨§§û²­£‹%í GU^hT,C'‰‰Î´©±¨§§û²¬¤‹#ä7IS_j_%F.¹´¯Ò¯¨¶­¨¦§³«¤‹#ä/8@HT`li'I4ºº»À®¯¸µ¬¦§µ«¤‹#ä-5?JUamq/$C››œŸ¡¨«°®¦§·«¥‹#ä.7@KWcou4%2§¦¦¥¦§¨°§¦¸ª¥‹#ä/8BMYeqy+7< ­¬¬­®®·­¦¹ª¥‹#ä1:DO[hs|.-AFª¬­¯°¹­¦ºª¦#ä26,§¨°§¦¼ª¦‹#ö8BMXes}}ð&-0,"§¦¼ª¦‰#äA+úþþÿÿúýþÿ°"ø#*19A>üÿÿúýþÿ¿B"ø'/7>B7 þÿúýþÿÉM"ø,3;@?%üÿÿúýþÿÅT"ù18><5 ü"ÿÿúýþÿÃu"ñ6<<6"$ÿÿúýþÿÇœ"ï:<4%+'þýüýýþúýþÿÉ£"ñ91% $7'üûûöúüþýþÿÈ›<!ü* è3:ûûüûýýüûüýÿýþÿȨ…!ý ç$B0ýþýýüýýüüýüþýþþȸª!þæ7?"ÿÿþúûúûúúûüÿýþþȹ›%ù.B(ÿÿþõýþÿýþÿȵžB#ù(B0ýýþøýþþ½–“^  ý<;ü0‰:üº':ü/â†:ûîì:ü¥÷t:û=ü‘;8ù .ÉÇ_3õ">=Ý<;::;;<=>ABo?:}®ÄËË̸…ÑÛãàËšQý3FEEÚFEDCA>:73.($!h> +V|˜©§‘¯¨f9 ÷      ëS' (.$+öa?!  ø ".*-ïZD- (25$1ü €ÖCntpllkjihhfghilqtx}!(+-01=GG>*èXxvwwvwwvtpjc^XQF?92*ñ!(!,1) ÷, ö ý öý +ü  û -ú ø 1ý  þ×e¤¢¢¡  žš™˜˜šž¤ª¯¶½   脳®¯°¯°±®«§ž“Œƒxh]TJ@ó  ç(B1,'"$(%%&#  þ+ý ü-üù$0ú^K7+ú$+7<(øI}…¥Óôÿÿù÷áÁ£Ž~(é;u€‹£¾ÕäîòòîæÚʸ¦“„vg*ë"`}‚†•œ¡¢Ÿœ™•Žƒyn\?+ø5bx|{{||}øzvn_F*-ï)Kbnstsoh_O;%Àâ-"[[ZZ[^afmry~€~nT;!ä/(NMLLNPQSTUTTSSRPmYSC#ä/' &05:?>>=:<<>FHLA#ûø $ý;þ¾÷ ªªï¬­°´¶º½¾¾½Í´¦w!䜚™š £¥¨©©¨§§¦¤³©¦†#ä '4@P`lx}}zwwz~‰‘™„#þ÷#2B-$þýù$?0þþýùüýÿ¶)4!ð'<0ççéìñõùüÿÿûýþÿÍ#ä.B6$-=Qc|•¥µº·³±°³»ÂÏÞëÊ$û$7:0 ÷(8MfI#û6?7$:ý:+½ûmT/:üM) ;ý<þ>€€€€,(–K %XP Backgroundÿ     ˆXPˆAFäFðFüGXPˆŸô´ ÈÛñðw¥ ,,Ÿ,¯0 3Ë6Í9ô<ë@CNFÄFÔþÇÍ5ÍúÕÎÍçæççþæç çþæççþæççüÕÍÜç6çýÎÜççþæççýÇÍççþæççþæççþÍç9çýÍæç8çþÍç9çþÍææþçææþçææþçææñçæççæçæçææçææçææþçææþçææüçæçææþÍååæåèæååææåæåææååæåææåææååææååüæåæååüæååææåýÍäååûäååäååùäåäååäååäåøäåääåääååõäååääååäååþÍääþãääþãääùãääãäãääþãääãäþãääþãääþÍã9ãþÍã9ãþÍââûãââãââúãâãâãââùãâãâãâããâãâüãâãââãâþÍââáâáýâáââþáââþáââáâùáâáââáââáûâáââááþâááâþÍááþàááàýáàááüàáàááûàááàááüàáàááþàááþÍà9àþÍà9àüÍààßßàßüàßàßßàßûàßààßßàúßààßàßßàößààßßàßààùÍÞßßÞÞßßüÞßßÞÞßÞßõÞßßÞßßÞßÞßÞÞßþÞßßýÞßÞÞüßÞÞûÍÞÞÝÞÞÝÞþÝÞ ÞþÝÞÞûÝÞÞÝÞÞþÝÞÞýÝÞþÍÝ-ÝþÜÝÝþÜÝÝþÍÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜþÝÜÜûÝÜÝÝÜÜþÝÜÜþÝÜÜþÝÜÜþÍÜ9ÜþÍÜÜÛùÜÛÜÜÛÛÜÜÛÜöÛÜÛÜÜÛÛÜÜÛÛÜÛÜýÛÜÛÛÜÛýÜÛþÍÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛûÚÛÚÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛÛþÍÚ(ÚþÙÚÚþÍÙÙûÚÙÙÚÙÙþÚÙÙÚÙþÚÙÙùÚÙÙÚÙÚÙÙþÚÙÙüÍØÙØØÙØÙúØÙÙØÙØØõÙØÙØØÙÙØØÙØØÙØÙøØÙÙØÙÙØÙÙûØÙÙØþÍØ9ØþÍØØùרר×רØúרØ×רØø×Ø×Ø×Ø×ØØþרØûר×רØþרØþÍ×9×þÍÖÖþ×ÖÖþ×Ö Öþ×ÖÖþ×Ö Ö×Öú×Ö×Ö×ÖÖþÍÕÕþÖÕÕøÖÕÖÖÕÕÖÕÕÖÕþÖÕÕÖÕôÖÕÖÖÕÖÖÕÖÖÕÖÖÕøÍÔÕÔÕÕÔÕÕÔÕþÔÕÕÔÕÔýÕÔÕÕøÔÕÕÔÔÕÔÕÕþÔÕÕÔÕüÔÕÔþÍÔ9ÔþÍÔ9ÔþÍÓ ÓþÔÓÓþÔÓÓûÔÓÓÔÓÓþÔÓÓþÔÓÓüÍÒÓÒÒÓýÒÓÒÒþÓÒÒøÓÒÒÓÒÓÒÓÓÒûÓÒÓÒÓÓÒûÓÒÒÓÒÒýÍÑÒÒþÑÒÒÑøÒÑÒÑÒÑÒÑÑÒüÑÒÒÑÑÒÑûÒÑÒÒÑÑöÒÑÒÒÑÒÒÑÑÒÒýÑÒþÍÑ9ÑþÍÑ9ÑþÍÐÐÑýÐÑÐÐþÑÐ ÐÑýÐÑÐÐûÑÐÐÑÐÐúÑÐÐÑÑÐÐþÑÐÐûÍÐÏÏÐÐõÏÐÏÐÏÐÐÏÏÐÏÏôÐÏÏÐÏÐÏÐÐÏÐÏÏ÷ÐÏÏÐÏÐÏÐÏ ÏÐþÍÎÎÏþÎÏÏúÎÏÎÏÏÎÎüÏÎÎÏÏøÎÏÏÎÏÎÏÎÎÏþÎÏÏÎÏýÎÏÍÎþÍÎÎþÍÎÎþÍÎÎûÍÎÎÍÎ ÎüÍÎÍÎÎ;Í;ÍÍÌüÍÌÍÌÌÍÌæÍÌÌÍÌÍÍÌÍÍÌÍÌÍÍÌÍÌÌÍÌÌÍÌÌÍÍÌùÍÌÍÍÌÌýÍÌËËýÌËÌÌöËÌÌËÌËÌÌËÌÌËÌËøÌËÌËÌËËÌÌþËÌÌýËÌËËÌËþÍËËþÊËËþÊËËþÊËËþÊËËûÊËËÊËËþÊËËþÍÊ9ÊüÍÉÊÉÉöÊÉÉÊÉÊÉÉÊÉÉþÊÉÉþÊÉÉþÊÉÉÊÉüÊÉÉþÍÉ9ÉþÍÈÈýÉÈÉÉÈýÉÈÉÉþÈÉÉüÈÉÈÉÉýÈÉÈÈùÉÈÈÉÉÈÉÉÈüÉÈÈÉÉüÈÉÉþÍÈ ÈþÇÈÈþÇÈÈûÇÈÇÇÈÈÇÈþÇÈÈþÇÈÈþÇÈÈþÍÇ9ÇþÍÆÆûÇÆÆÇÆÆþÇÆÆþÇÆÆþÇÆÆùÇÆÇÆÇÇÆÆþÇÆÆþÍÆ9ÆþÇÍ5ÍúÕÎÍçæç3çüÕÍÜç6çýÎÜç7çýÇÍç8çþÍç9çýÍæç8çþÍç9çýÍçææûçææçææþçææþçææøçæççææçææçþæçç æüÍåæååæüåææååþæååþæååæåæåæåûæååæååûæåæåþÍååäûåäåäååäåüäåäååþäååþäååäåïäåääååääåäååäååäþÍääþãääþãääã äãäøãäããääãääþãääþãääþÍã9ãþÍã9ãüÍâãââãþâããâãâãâãâãñâãââãâãââããâããââãâùãââãââûÍáâáââáâöáâáâáâááâááâúáâáâáââáâûáâáâááâáþâááþÍá áþàááàáþàááúàáàáàááúàáààáþÍà9àþÍà9àýÍàßßöàßààßààßàßßþàßßþàßßüàßßààßüàßàßßàßàß÷àßßàßàßàûÍßßÞßßÞßüÞßÞßßýÞßÞÞìßÞßßÞßÞßßÞÞßßÞßßÞßßÞÞßÞßûÞßßÞþÍÞÞþÝÞÞûÝÞÞÝÞÞÝÞúÝÞÞÝÝÞÞÝÞþÝÞÞþÍÝ9ÝþÍÝÝÜþÝÜÜüÝÜÝÜÜþÝÜÜûÝÜÝÜÝÝýÜÝÜÜþÝÜÜþÝÜÜþÍÜ9ÜþÍÛÛÜÛÜÛüÜÛÛÜÜÛÜüÛÜÛÜÜþÛÜÜþÛÜÜÛÜþÛÜÜÛþÍÛÛþÚÛÛüÚÛÚÛÛþÚÛÛûÚÛÛÚÛÛüÚÛÚÛÛþÚÛÛõÚÛÛÚÛÛÚÛÚÚþÍÚ9ÚþÍÙ ÙûÚÙÙÚÙÙÚÙúÚÙÚÙÚÙÙþÚÙÙþÚÙ ÙöÍØÙÙØÙÙØÙØØýÙØÙÙØûÙØØÙØØÙýØÙØØðÙØÙÙØÙÙØØÙÙØØÙÙØØþÍØ9ØûÍØØ×ØØ×Ø×ýØ×Ø Ø×Øø×ØØ×ØØ×ØØþר Øþ×þÍ×9×þÍÖÖ×Öö×ÖÖ×Ö××ÖÖ××úÖ×ÖÖ×ÖÖþ×ÖÖþ×ÖÖ÷ÍÕÖÕÕÖÕÕÖÖÕÖÕÖÕÖÕþÖÕÕþÖÕÕñÖÕÕÖÕÕÖÕÕÖÖÕÖÖùÍÕÕÔÕÔÕÕüÔÕÔÕÕüÔÕÔÕÕûÔÕÕÔÕÕÔÕÔÕúÔÕÕÔÕþÍÔ9ÔþÍÔ+ÔþÓÔ ÔüÍÔÔÓÓüÔÓÔÓÓÔÓþÔÓÓþÔÓÓþÔÓÓüÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓüÍÒÒÓÓÒýÓÒÓÓÒÓÒÓÒÓÒúÓÒÒÓÓÒÒÓÒüÓÒÒÓÓÒüÓÒÓþÍÒÒÑøÒÑÑÒÑÒÑÒÒÑÒÑÒüÑÒÑÒÒÑÒÑÒÑÒûÑÒÑÑÒÒþÍÑ9ÑþÍÑ9ÑþÍÐÐþÑÐÐþÑÐÐÑÐÑÐõÑÐÐÑÐÐÑÑÐÑÐÐÑ÷ÍÏÏÐÐÏÐÏÐÐûÏÐÏÐÏÏñÐÏÐÐÏÐÏÏÐÐÏÐÏÐÏÏÐÏüÐÏÏÐÐþÏÐÐÏþÐùÍÎÎÏÎÏÎÎøÏÎÏÎÏÎÎÏÏÎõÏÎÏÎÏÏÎÏÎÎÏÏùÎÏÏÎÏÏÎÎþÏÎÎùÏÎÎÏÎÏûÍÎÍÍÎÎþÍÎÎÍÎþÍÎÎüÍÎÍÎÎûÍÎÎÍÎÎþÍÎÎ;Í;ÍÍÌÍÌüÍÌÍÌÌúÍÌÍÌÌÍÍÌüÍÌÌÍÍúÌÍÌÍÍÌÌýÍÌÍÍÌÍûÌÍÌÍùÍËËÌËËÌÌúËÌÌËËÌÌËÌþËÌÌþËÌÌËüÌËËÌÌËÌþËÌÌËûÍÊËÊËËûÊËËÊËËþÊËËþÊËËþÊËËüÊËËÊÊËÊËþÊþÍÊ9ÊþÍÉÉÊÉþÊÉÉþÊÉÉ÷ÊÉÊÉÉÊÉÊÉÉùÊÉÊÉÉÊÉÉÊ ÉþÊÉÉþÍÉ9ÉóÍÉÈÉÈÉÉÈÉÉÈÈÉÉÈÉøÈÉÉÈÉÉÈÉÉÈÉÈÉÈÉÈþÉÈÈÉþÍÈÈûÇÈÈÇÈÈþÇÈÈûÇÈÇÇÈÈþÇÈÈüÇÈÇÈÈþÇÈ ÈþÇÈÈþÍÇ ÇþÆÇÇûÍÆÇÇÆÆþÇÆÆÇÆþÇÆÆþÇÆÆüÇÆÇÆÆÇùÆÇÆÆÇÆþÍÆ9ÆþÇÍ5ÍúÕÎÍçæç3çüÕÍÜç6çýÎÜç%çþæççýÇÍç8çþÍç9çýÍæç8çþÍç9çþÍææüçæçææüçæçææûçææçææçæøçæçææççææþçææþçúÍåæåæååæåõæåææåæååæåææåûæååæååæåüæååææåûæåæåüÍääååøäåäåääåääåûäååäååþäååäåøäååäåäåääåþäååþÍä äþãä äþãääþãääþãä äãäýãäþÍã9ãþÍã9ãýÍãââùãââãâãââãâãøâããâãâãââþãââãâãâþãûÍáââááøâáâááâáââþáââáüâáâááâúáâááâááâ÷áââááâáâþÍááþàááþàááþàá áàüáààááþàþÍà9àþÍà9àòÍßààßßàßßàßßàßßþàßßýàßààûßàßàßßþàßßàßàþßààßýÍÞßßôÞßÞßÞßÞßÞßÞßßÞßýÞßÞÞóßÞÞßÞßÞÞßßÞÞßßúÞßÞßÞßßþÍÞÞÝÞþÝÞÞþÝÞ ÞÝÞþÝÞÞûÝÞÞÝÞÞüÝÞÞÝÝÞþÍÝ9ÝûÍÜÜÝÜÜþÝÜÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜüÝÜÝþÍÜ9ÜþÍÜÜÛÜþÛÜÜîÛÜÜÛÜÜÛÜÛÜÛÛÜÛÜÛÛÜÜÛÜûÛÜÛÛÜÜþÛÜÜÛþÜüÍÛÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛþÚÛÛÚýÛÚÛÛþÍÚ*ÚþÙÚ ÚûÍÚÙÚÙÙþÚÙÙþÚÙÙþÚÙ ÙþÚÙÙþÚÙÙýÍØÙÙüØÙÙØØÙøØÙØÙÙØÙØØÙûØÙØÙØØÙúØÙØØÙØØþÙØØýÙØþÍØ9ØùÍרØ×רØ×ýØ×ØØø×Ø×ØØ×רØ×üØ×רØþÍ×9×þÍÖÖþ×ÖÖþ×ÖÖ×Öþ×ÖÖþ×ÖÖþ×ÖÖú×ÖÖ×Ö×× Öü×Ö×ûÍÕÖÕÖÖøÕÖÖÕÖÕÖÕÕþÖÕÕþÖÕÕÖÕþÖÕÕÖÕÖÕÖþÕÖÖÕøÍÕÕÔÕÔÔÕÕüÔÕÔÕÕÔÕþÔÕÕÔþÕÔÔùÕÔÕÔÕÕÔÔÕÔýÕÔþÍÔ9ÔþÍÔ9ÔþÍÓÓþÔÓÓÔýÓÔÓ ÓþÔÓÓÔÓþÔÓÓüÔÓÔÓÓûÍÓÒÒÓÓÒþÓÒÒôÓÒÓÒÓÓÒÒÓÒÓÒÒüÓÒÓÒÒüÓÒÓÒÒöÓÒÒÓÒÒÓÒÒÓÓþÒþÍÒÒþÑÒÒþÑÒÒÑÒÑÒêÑÒÒÑÑÒÒÑÒÒÑÑÒÒÑÒÑÒÑÒÑÒÒúÑÒÑÒÒþÍÑ9ÑþÍÑ9ÑþÍÐ ÐþÑÐÐÑþÐÑÑ ÐþÑÐÐüÑÐÑÐÐúÍÏÏÐÏÐÐÏûÐÏÐÐÏÏúÐÏÏÐÐÏÏùÐÏÐÏÐÐÏÏóÐÏÏÐÏÐÐÏÐÏÏÐÏÏÐþÏüÍÏÏÎÎÏþÎÏÏøÎÏÎÎÏÎÎÏÏþÎÏÏþÎÏÏúÎÏÏÎÏÎÎõÏÎÎÏÎÎÏÎÎÏÎÎûÍÎÎÍÎÎþÍÎÎèÍÎÎÍÍÎÍÎÍÎÎÍÎÎÍÍÎÎÍÎÎÍÍÎÎýÍÎ;Í;ÍþÍÌÌÍÌþÍÌÌþÍÌÌýÍÌÍÍüÌÍÌÍÍÌÍýÌÍÌÌþÍÌÌúÍÌÍÌÌÍÍþÍÌÌüËÌËÌÌþËÌÌËóÌËËÌÌËÌÌËÌËËÌÌûËÌÌËÌÌðËÌÌËÌÌËËÌÌËÌËËÌþÍË ËþÊËËþÊËËþÊË ËþÊËËüÊËËÊÊýËÊþÍÊ9ÊþÍÊÊÉüÊÉÊÉÉÊÉþÊÉÉùÊÉÊÉÊÉÊÊÉþÊÉÉüÊÉÉþÍÉ9ÉþÍÈÈÉÈÉÈÉùÈÉÈÉÈÈÉÉ÷ÈÉÈÉÈÈÉÉÈÈÉÈùÉÈÉÉÈÉÈÈþÉûÍÈÈÇÈÈþÇÈÈþÇÈÈþÇÈÈÇûÈÇÈÇÈÈþÇÈÈþÍÇ9ÇþÍÆÆüÇÆÇÆÆþÇÆÆÇÆþÇÆÆþÇÆÆÇ ÆþÍÆ9ÆýGùÿ4ÿþÿ7ÿþÿ8ÿ:ÿþGÿ9ÿþùÿ9ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ?ͳçþæççþæçïçþæççæþçææþçææ÷çææççæççææþçææþçææüçæçææþçææþçææýåæååûæåææååæøåæåæååæååþæååþæååæøåæåææåæååæúåæåææååüæåæååôäåääååääåäåääåüäååääøåäåääåäååþäååþäååþäååþäååøäåääåäãääþãääþãääãäþãääþãääþãääãä€ãüâããâ âãâóãâããâãââããâãââüãâãââãâãâãâùãâãááâááâþáââýáâááýâáââþáââõáâááâáâááâááâøáâáâáâáââûáàáàááþàááþàááüàáàááþàá áûàááàá áþàááþàáá€àßþàßßàßàßþàßßàßþàßßàüßààßßþàßßàùßàßßààßßþàßßàþÞßßÞßÞûßÞßÞßßÞßþÞßßþÞßßøÞßßÞßÞßÞÞþßÞÞþßÞÞþÝÞÞþÝÞÞþÝÞÞýÝÞÝÝÞ÷ÝÞÞÝÞÝÞÝÞÞþÝÞÞþÝÞÞÝýÞÝÞÞýÝÞÝ7ÝþÜÝÝÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜûÝÜÝÝÜÜûÝÜÝÝÜÜÝÜÝBÜøÛÜÛÛÜÛÜÛÛúÜÛÜÜÛÜÜÛýÜÛÜÜÛÜþÛÜÜöÛÜÜÛÜÜÛÜÛÜÜÛÜýÛÜÛÛüÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛñÚÛÛÚÛÚÛÚÛÚÛÚÛÚÛÛüÚÛÚÛ ÛÚûÛÚÛÛÚ>ÚüÙÚÚÙ ÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÚÙÙîØÙØØÙÙØÙØØÙØØÙØÙÙØØþÙØØñÙØÙØÙØÙØØÙÙØÙÙØØîÙØÙÙØÙØÙØÙÙØØÙØØÙØBØþרØòר×רØ×ØØ×Ø×Ø×רüררØþרØ?×ýÖ×ÖÖü×Ö×ÖÖþ×ÖÖ×ýÖ×ÖÖþ×Ö Ö×Öþ×ÖÖÕþÖÕÕüÖÕÖÕÕþÖÕÕÖöÕÖÕÖÕÕÖÕÖÕÕûÖÕÖÖÕÕìÖÕÖÖÕÖÖÕÖÕÕÖÖÕÖÕÖÕÔÕÕþÔÕÕÔÕþÔÕÕÔÕÔøÕÔÕÕÔÕÔÕÕùÔÕÔÕÕÔÕÕÔÕúÔÕÕÔÔÕÕ€ÔúÓÔÔÓÔÓÓþÔÓÓúÔÓÔÓÔÓÓðÔÓÔÔÓÔÓÓÔÓÓÔÓÓÔÓ ÓÔÓþÔÓÓþÒÓÓñÒÓÒÓÓÒÓÓÒÓÒÒÓÓÒÒÓÒûÓÒÓÓÒÒÓûÒÓÒÓÒÒÓýÒÓÒÒÓúÒÓÑÒÑÒÒþÑÒÒþÑÒÒþÑÒÒþÑÒÒõÑÒÑÒÑÒÒÑÒÑÒÒÑÒûÑÒÑÑÒÒýÑÒÑ~ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐùÑÐÐÑÐÐÑÑÐþÑÐÐøÏÐÐÏÐÏÐÏÏôÐÏÐÏÏÐÏÐÐÏÐÏÏÐÏþÐÏÏüÐÏÐÏÏþÐÏÏþÐÏÏûÐÏÐÐÏÏ÷ÐÏÏÐÎÏÎÏÎÎÏÎÏüÎÏÎÏÏþÎÏÏþÎÏÏÎÏýÎÏÎÎÏÎÏÎÏÎùÏÎÏÎÎÍÎÎþÍÎ ÎþÍÎÎÍÎÍÎþÍÎÎûÍÎÎÍÎÎþÍÎÎýÍÎÍ~ÍÌùÍÌÍÌÌÍÌÌþÍÌÌþÍÌÌÍýÌÍÌÌþÍÌÌÍÌþÍÌÌüËÌÌËËÌþËÌÌËúÌËÌËÌËËýÌËÌÌþËÌÌËÌþËÌÌüËÌËÌÌôËÌÌËÌËËÌÌËËÌÌýËÊËËþÊË ËþÊËËÊüËÊËÊÊËþÊËËÊËüÊËËÊ>ÊÉþÊÉÉÊÉþÊÉÉüÊÉÊÉÉþÊÉÉüÊÉÊÉÉþÊÉEÉÈÉÈÉÈÉþÈÉÉÈÉÈýÉÈÉÉüÈÉÈÉÉøÈÉÉÈÉÈÈÉÉüÈÉÈÉÉýÈÉÈÈþÇÈ ÈþÇÈÈþÇÈÈûÇÈÈÇÈÈüÇÈÇÈ ÈþÇÈÈüÇÈÈÇ ÇþÆÇ1ÇûÆÇÆÇÆÆÇÆûÇÆÆÇÆÆüÇÆÇÆÆÇÆþÇÆÆûÇÆÆÇÆÆþÇÆDÆ?ÍÀçæçæþçææüçæçææçýæçææûçææçææþçææçæþçææüçåæååùæåæåææååüæååææå÷æåæåæååæååþæååþæååþæååþæååüæåæååþäååþäååäåäþåääåûäååäååþäååüäåäååäåòäååäåäååäååäãääþãääãäúãäãäãääþãääøãäãääããää‡ãâøãâãâããâããüâããââóãâãââãâããâãâããâãâãâãâúãââáâáá âáûâáâáââþáââúáâáâáââáúâááâáââáùâááââáââáüàáàááþàááþàááàýáàááàáúàááààááùàáàáààáá‚àßþàßßýàßààßþàßß÷àßßàßßààßßàýßàßßüàßàßßùàßàßàßÞÞûßÞßßÞÞúßÞÞßßÞÞßõÞßßÞßÞßÞßßÞÞßþÞßßÞßüÞßÞßß ÞüÝÞÝÞÞÝüÞÝÝÞÞþÝÞÞúÝÞÞÝÝÞÞüÝÞÝÞÞÝÞþÝÞÞ?ÝÜþÝÜÜÝÜþÝÜÜÝÜûÝÜÜÝÜÜþÝÜÜþÝÜÜúÝÜÜÝÝÜÜûÝÜÜÝÜ@ÜÛÜøÛÜÛÛÜÜÛÜÜÛÜûÛÜÜÛÜÜùÛÜÛÜÛÛÜÜöÛÜÛÜÛÜÛÜÛÜÜÛÚýÛÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛýÚÛÚ>ÚÙÚÙþÚÙÙþÚÙÙþÚÙ ÙþÚÙÙþÚÙÙþÚÙÙØÙØÙØþÙØØÙüØÙØÙÙØîÙØÙØÙØÙØØÙØØÙÙØÙØÙÙØÙNØþרØø×ØØ×Ø×רØþר Øþר Ø?×üÖ×Ö××ýÖ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×ÖÖ××Öú×ÖÖ××ÖÖþ×ÖÖ×ûÖÕÕÖÕÕÖÕÖÕþÖÕÕÖÕÖÕÖÕýÖÕÖÖÕþÖÕÕüÔÕÕÔÔýÕÔÕÕýÔÕÔÔÕþÔÕÕÔÕÔúÕÔÔÕÕÔÔÕþÔÕÕþÔÕÕýÔÕÔ~ÔÓþÔÓÓþÔÓÓüÔÓÔÓ ÓÔÓúÔÓÔÓÔÓÓþÔÓÓóÒÓÓÒÒÓÓÒÒÓÒÓÒÒúÓÒÓÒÒÓÓÒÓÒúÓÒÓÒÓÒÒÓÒôÓÒÓÓÒÒÓÓÑÒÑÒÒÑÒÑÒýÑÒÑÑòÒÑÒÑÑÒÑÑÒÑÒÑÑÒÒÑÒùÑÒÑÒÑÒÑÑþÒÑÑüÒÑÒÑ~ÑýÐÑÐÐÑÐüÑÐÑÐÐþÑÐÐÑÐþÑÐÐÑýÐÏÐÐüÏÐÐÏÏõÐÏÐÏÐÏÏÐÏÐÏÏÐûÏÐÏÏÐÐÏÐÏùÐÏÏÐÏÐÏÏÐÏÐÏûÎÏÏÎÏÏþÎÏÏþÎÏÏÎ÷ÏÎÎÏÏÎÎÏÎÎ ÏÎÏÎÏ ÎÍÎÍÎþÍÎÎþÍÎÎþÍÎ΀ÍÌþÍÌÌþÍÌÌÍÌÍÌÍÌÍùÌÍÍÌÌÍÌÌóÍÌÍÌÌÍÌÍÌÍÌÍÌÌúÍÌÌÍÍÌÌþËÌÌËÌËÌËÌüËÌËÌ ÌËÌËýÌËÌÌýËÌËËÌËÌÊ ËþÊËËÊËüÊËÊËËþÊËËþÊËËÊ Ë?ÊÉþÊÉÉúÊÉÊÉÊÉÉÊÉøÊÉÉÊÉÉÊÉÉþÊÉÉÊÉþÊÉDÉþÈÉÉþÈÉÉþÈÉÉøÈÉÈÈÉÈÉÈÈòÉÈÈÉÈÉÉÈÉÈÈÉÈÉÉÈùÉÈÉÈÈÉÈÈýÉÈÉÉþÈÉÉÈûÇÈÈÇÈ ÈþÇÈÈþÇÈÈþÇÈÈþÇÈÈþÇÈÈùÇÈÈÇÈÈÇAÇÆþÇÆÆþÇÆÆùÇÆÆÇÆÇÆÆþÇÆÆüÇÆÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆ@Æ?ÍçþæççþæçUçþæçCç æûçææçææþçææþçææùçæççæçææüçæçææþçææçæçøæåææåææååüæååææåôæåæååæååæåæååþæå åæåþæååõæåæäååääåäååäûåääåääüåäåääåäåäþåääüåääååùäååääåääãäþãääøãääãääãääûãäããääãäøãäãääããääþãääãâòãâããââããââãâãââãúâããâãââþãââãâþãââãâþãââãâáâüáâáââùáâáââáââáâùáâáââáââáâøáââááâáââöáâáàáàáààááüàáàááþàááàáþàááþàááàáþàááàßàßàßþàßßþàßßðàßßàßßàßßàßßàßàß ßþàßßàßìÞßßÞßßÞßßÞßßÞßßÞßßÞßßüÞßÞßßüÞßÞß ß÷ÞßÞÞßÞßÞßßþÞßßýÞÝÞÞþÝÞÞûÝÞÞÝÞÞÝÞþÝÞÞÝÞþÝÞÞüÝÞÞÝ?Ý ÜûÝÜÜÝÜÜúÝÜÝÜÝÜÜþÝÜÜ÷ÝÜÜÝÜÜÝÝÜÜþÝÜÜþÝÜÜùÝÜÝÝÜÝÜ@ÜÛÜÛÜýÛÜÛÛõÜÛÛÜÜÛÜÛÜÛÜÜúÛÜÛÛÜÛÛÜþÛÜÜþÛÜÜÛÜÛøÚÛÛÚÛÛÚÛÛúÚÛÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛúÚÛÛÚÚÛÛþÚÛÛþÚÛÛ?ÚÙþÚÙÙþÚÙ ÙþÚÙ ÙþÚÙÙÚÙÚÙþÚÙÙØþÙØØþÙØØúÙØØÙÙØØüÙØÙØØÙØþÙØØÙØøÙØØÙÙØÙØØþÙØØÙCØ×úØ×Ø×רØþרØþרØþרØþרØø×ØØ×ØØ×ØØþרØýר×?×Öþ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×Ö×ÖÖø×ÖÖ×ÕÕÖÕÕüÖÕÖÕÕöÖÕÖÕÕÖÕÕÖÕÕÖ ÕÖÕäÖÕÕÖÕÕÖÕÖÕÖÕÕÖÕÖÔÔÕÕÔÕÔÔÕÕÔÕÕÔùÕÔÕÕÔÕÔÔÕ÷ÔÕÕÔÕÕÔÔÕÕüÔÕÔÕÕüÔÕÔÕÕÔÕüÔÕÕÔÔÓûÔÓÓÔÓÓþÔÓÓþÔÓÓúÔÓÔÓÔÓÓûÔÓÓÔÓÓÒÓòÒÓÓÒÒÓÒÒÓÓÒÓÓÒÒûÓÒÓÓÒÒüÓÒÓÒÒÓÒþÓÒÒÓÒÓúÒÓÓÒÑÒÒüÑÒÑÒÒþÑÒÒÑ ÒêÑÒÒÑÑÒÒÑÑÒÑÑÒÑÒÑÑÒÑÒÒÑÑþÒÑÑýÒÑÒÒ€ÑÐþÑÐÐþÑÐÐþÑÐÐûÑÐÐÑÐÐüÑÐÑÐÐþÑÐÐþÏÐÐÏÐÏÐûÏÐÏÏÐÐÏÐ ÏÐúÏÐÏÐÐÏÏþÐÏÏýÐÏÐÐöÏÐÏÏÐÎÏÏÎÏÏùÎÏÎÏÎÎÏÏýÎÏÎÎúÏÎÎÏÏÎÎþÏÎÎûÏÎÎÏÎÎøÏÎÏÎÏÎÏÎÎÏÎûÏÍÎÍÎÎÍ ÎüÍÎÍÎÎüÍÎÍÎÎþÍÎÎÍÎþÍÎÎþÍÎÎüÍÎÎÍ‚ÍûÌÍÍÌÍÍÌùÍÌÍÌÌÍÌÌþÍÌÌþÍÌÌÍþÌÍÍÌÍÌþÍÌÌÍáÌÍËÌËËÌËÌËÌËÌËÌÌËËÌËËÌÌËËÌËÌËËÌÌúËÌËÌËÌÌËòÌËËÌËÌËËÌÌËËÌËËÌýËÌËËþÊËËüÊËÊËËÊËþÊËËÊËýÊËÊÊùËÊÊËËÊËË?ÊýÉÊÉÉÊ ÉÊÉþÊÉÉþÊÉÉþÊÉBÉþÈÉÉÈùÉÈÈÉÉÈÉÉüÈÉÈÉÉ÷ÈÉÉÈÉÉÈÈÉÉøÈÉÉÈÉÈÈÉÉÈÉÈüÉÈÇÈÈþÇÈ ÈüÇÈÇÈÈûÇÈÈÇÈÈûÇÈÈÇÈÈþÇÈ ÈúÇÈÈÇÈÇ?ÇÆþÇÆÆÇÆþÇÆÆþÇÆÆüÇÆÇÆÆÇÆþÇÆÆþÇÆÆþÇÆÆþÇÆ?Æÿ?Í?çþæç}çæçæþçææøçæçæçææççüæççææþçææþçææçûæåææååæåþæååæþåææåæðåæåæååææååæååææååæûåæåæååþæååþäååýäåääåþäåå÷äååääååäååäåäþåääýåäååäþãääûãääãääùãäããäãääüãäãääüãäãääãâõãââãâãâãâãââúãââããââöãâããââãâãââãýâãââøãââãâããââãõâáââáââáâáââáâþáââáþâááâôáââáâáââáâáââáâáâüáâáââáþàááàáþàááüàáàááþàááøàááààáàááþàáá‡àßðàßàßßàßßàßààßßàßßþàßßþàßßöàßßààßßààßßàßòàßàßßàßàÞÞßÞÞßßÞßøÞßÞÞßßÞßßÞßúÞßßÞÞßßôÞßßÞßßÞÞßßÞßßûÞßÞÝÞÞþÝÞÞøÝÞÞÝÞÝÝÞÞûÝÞÞÝÞÞþÝÞÞþÝÞÞþÝÞÞöÝÞÞÝÞÝÝÞÞÝ>ÝÜþÝÜÜÝ ÜþÝÜÜþÝÜÜÝÜÝÜÝDÜúÛÜÜÛÛÜÜûÛÜÜÛÜÜùÛÜÛÛÜÛÜÜþÛÜÜþÛÜÜþÛÜ ÜøÛÜÛÜÛÛÜÛÛþÚÛÛþÚÛÛÚÛþÚÛÛÚÛÚþÙÚÚþÙÚ ÚÙôÚÙÙÚÚÙÚÙÙÚÙÚÚÙùÚÙÙÚÙÚÙÙüÚÙÚÙÙüØÙÙØØÙØýÙØÙÙØþÙØØÙýØÙØØÙØðÙØØÙØÙØÙØÙØÙØÙÙØØüÙØÙØ?Øþר ØþרØüררØþרØþרØôרØ×ØØ×ØØ×רØþרØüרØ×>×Öþ×ÖÖõ×ÖÖ×ÖÖ××Ö×ÖÖ× Ö×Ö× ÖÕûÖÕÕÖÕÕïÖÕÕÖÕÕÖÕÖÕÕÖÕÖÕÖÕÕÖ÷ÕÖÕÖÖÕÕÖÕÕûÖÕÕÖÕÕüÖÕÖÕÕÖÕþÔÕÕÔþÕÔÔþÕÔÔÕýÔÕÔÔÕüÔÕÔÕÕûÔÕÔÔÕÕþÔÕÕýÔÕÔÔþÕÔÔþÕÔ~ÔÓûÔÓÓÔÓÓüÔÓÔÓÓþÔÓÓüÔÓÔÓÓÔÓüÔÓÔÓÓþÔÓÓùÒÓÓÒÒÓÒÒþÓÒÒÓÒ÷ÓÒÒÓÓÒÒÓÒÒ÷ÓÒÓÓÒÓÓÒÓÓýÒÓÒÒþÓÒÒüÑÒÑÒÒÑÒúÑÒÒÑÒÑÑÒþÑÒÒöÑÒÒÑÒÒÑÒÑÒÒÑÒôÑÒÑÑÒÒÑÒÑÒÒÑÑþÒÑÑüÐÑÐÑÑÐÑúÐÑÐÐÑÐÐüÑÐÑÐ ÐüÑÐÑÐÐþÑÐÐþÑÐÐöÏÐÏÐÐÏÐÏÏÐÐýÏÐÏÏÐÏøÐÏÐÏÐÏÏÐÐýÏÐÏÏüÐÏÏÐÐÏÐÏÐ÷ÏÐÏÐÏÏÎÏÎÎÏÎÏ÷ÎÏÎÎÏÎÏÎÏÏþÎÏÏþÎÏÏùÎÏÎÏÎÎÏÏùÎÏÏÎÏÎÏÏÎÏÎüÍÎÍÎÎÍÎúÍÎÎÍÍÎÎöÍÎÍÍÎÍÍÎÍÎÎûÍÎÎÍÎ ÎÍ΀ÍÌþÍÌ ÌôÍÌÍÍÌÍÌÌÍÌÍÌÌþÍÌÌÍÌÍÌÍÌõÍÌÍÌÍÍÌÌËËÌÌýËÌËËÌËÌËýÌËÌÌËöÌËËÌÌËËÌËÌÌËýÌËÌÌËÌþËÌÌËÊËÊËþÊËËúÊËËÊÊËËøÊËËÊËËÊËËþÊËËþÊËËÊËAÊýÉÊÉÉþÊÉÉùÊÉÊÉÉÊÉ ÉüÊÉÊÉÉþÊÉÉþÊÉÉþÊÉIÉ÷ÈÉÈÉÈÉÈÈÉÉÈÉÈÉíÈÉÈÉÉÈÉÈÉÈÈÉÈÈÉÉÈÉÈÈúÉÈÉÈÇÈÈÇýÈÇÈÈüÇÈÇÈÈþÇÈ ÈÇÈÇýÈÇÈÈþÇÈÈ?ÇûÆÇÆÇÆÆþÇÆÆþÇÆÆþÇÆ ÆþÇÆÆþÇÆÆüÇÆÇÆCÆ?Í+çþæçƒçþæçÞçþæççþæçç æþçææûçææçææûçææçææþçææþçææþçææþçææþçææúåæååæåå÷æååæåæåæååýæåææüåæåææåæåõæåæååæåæåæååæåäå÷äåäåääåäååäýåäååþäååäåäýåäååýäåääãäþãääüãäãääãäãäþãääþãääóãääããääãäãäãääãþäã~ãüâããââüãâãââãùâãâããâããâãâñãâããâããâãââãâãââãâáòâáââááââáââááââáûâáâáââøáââáââáâ âáâáþàááà áþàááøàááàááàááàáþàááþàááàßàßýàßààþßààßàøßàßßàßàßßöàßàßßààßàßßàößààßàßàßàßßÞùßÞßßÞÞßßãÞßßÞßÞßÞÞßßÞßÞßÞÞßÞßÞßßÞßÞßÞßßúÞßÞÞßÞÞüßÞßÞÞþßÞÞþÝÞÞøÝÞÞÝÞÞÝÞÞþÝÞÞüÝÞÝÞÞþÝÞÞûÝÞÞÝÞÞþÝÞÞúÝÞÞÝÞÝ6ÝþÜÝÝÜûÝÜÜÝÜÜøÝÜÝÜÜÝÝÜÜþÝÜÜÝÜþÝÜÜþÝÜEÜÛÜÛÜþÛÜÜúÛÜÜÛÜÛÛÜöÛÜÜÛÛÜÛÜÛÜÜìÛÜÛÜÛÛÜÛÛÜÜÛÛÜÛÜÜÛÜÛÛþÚÛÛþÚÛÛûÚÛÛÚÛÛÚÛÚúÛÚÛÛÚÛÛ?ÚÙþÚÙÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÚÙÙüÚÙÚÙÙüÚÙÚÙÙÚÙýØÙØØÙØÙØøÙØÙØÙØÙØØÙØþÙØØÙØþÙØØýÙØÙÙØÙúØÙÙØÙØBØûרØ×ØØþרØþרØöרØ×Ø×ØØ×ØØ×ØþרØ×ýØ×ØØýר×?×ýÖ×ÖÖþ×ÖÖþ×ÖÖ÷×Ö××Ö×Ö×ÖÖþ×ÖÖþ×ÖÖ÷×ÖÕÖÖÕÕÖÕÕÖÕÖÕíÖÕÕÖÕÕÖÕÕÖÕÖÖÕÖÖÕÖÕÕÖýÕÖÕÕÖ÷ÕÖÕÖÖÕÕÖÕÕõÔÕÕÔÕÕÔÕÕÔÕÕþÔÕÕþÔÕÕóÔÕÔÔÕÔÕÔÕÕÔÕÔÔÕøÔÕÔÕÔÕÔÕÕýÔÕÔ~Ô ÓÔÓþÔÓ ÓþÔÓÓþÔÓÓøÔÓÓÔÔÓÔÓÓþÔÓÓþÔÓÓûÔÓÒÒÓÓúÒÓÒÓÓÒÒúÓÒÒÓÓÒÒûÓÒÓÓÒÒÓúÒÓÒÒÓÒÒõÓÒÓÓÒÒÓÒÓÓÒÒòÑÒÒÑÑÒÑÒÑÒÒÑÒÑÑýÒÑÒÒúÑÒÑÒÑÒÒûÑÒÒÑÒÒüÑÒÑÒÒòÑÒÑÑÒÑÒÑÒÑÒÑÑÒÒÑÐÑ ÐÑ ÐþÑÐ ÐüÑÐÑÐÐþÑÐÐüÑÐÐÏÏÐÏûÐÏÏÐÏÏÐÏûÐÏÏÐÏÏúÐÏÐÐÏÐÐüÏÐÐÏÏöÐÏÏÐÏÐÏÐÐÏÏÎüÏÎÎÏÏÎÏøÎÏÎÎÏÏÎÏÏûÎÏÏÎÏÏÎþÏÎÎÏöÎÏÎÏÏÎÎÏÎÏÏþÎÏÏÎÍ ÎþÍÎÎþÍÎÎÍúÎÍÎÎÍÎÎùÍÎÍÎÎÍÎÎþÍÎÎüÍÎÍÎ΃ÍÌúÍÌÍÌÍÌÌÍÌÍûÌÍÌÌÍÍÌÍÌþÍÌÌÍÌõÍÌÌÍÌÍÌÍÌÌÍÍýÌÍÌÌËÌþËÌÌËÌËÌüËÌÌËËüÌËÌËËþÌËËÌûËÌËËÌÌËÊËþÊËËþÊËËÊ÷ËÊËÊËÊËÊËËþÊËËþÊËËüÊËÊËËÊË?ÊúÉÊÉÉÊÉÉÊúÉÊÉÉÊÉÉÊÉþÊÉÉûÊÉÉÊÉÉþÊÉAÉþÈÉÉÈÉþÈÉÉþÈÉÉÈÉüÈÉÉÈÈÉôÈÉÈÉÈÉÈÉÈÉÈÉÉúÈÉÈÈÉÈÈþÇÈÈûÇÈÇÇÈÈþÇÈÈÇÈûÇÈÈÇÈÈ@ÇÆÇÆÇÆøÇÆÇÆÆÇÇÆÆþÇÆÆþÇÆÆþÇÆÆÇÆþÇÆ>Æ?ÍkçþæçRçæþçææûçæççææùçæçææçææþçææþçææþçæ æçþæååýæåææ åþæååýæåææåúæåææåææåùæåææåæååäåéäåääååääååääåäåäåäååäåääþåääñåääåäåäåäåäååäååäþãääãäûãääãääþãä äþãä äñãääããääãääãäãäã€ãâØãâããâãâãââãâãâãââãâããâããâãâããââãââãââãâããâõãââãââããâãââúáâááâááýâáââþáââáñâáâááââáââáâááââáâþáââûáâááââáþàá áôàááàááààááàá áþàááàáüàáàááûàááàáá€àøßààßààßààßàßûàßßàßßàßüàßàßßàößàßàßßàßßààüßààßßÞßÞßþÞßßÞüßÞßÞÞßÞýßÞßßùÞßÞÞßÞßßýÞßÞÞýßÞßßÞÝÞþÝÞÞüÝÞÝÞÞÝÞÝþÞÝÝÞþÝÞÞÝÞüÝÞÝÞÞ?ÝÜþÝÜÜÝÜûÝÜÜÝÜÜþÝÜÜúÝÜÜÝÝÜBÜúÛÜÛÜÜÛÛüÜÛÛÜÜÛÜÛÜûÛÜÛÜÛÛþÜÛÛýÜÛÜÜýÛÜÛÛÜÛüÜÛÚÛÛÚÛþÚÛÛÚÛÚÛúÚÛÚÛÚÛÛÚÛþÚÛÛ?ÚÙÚÙþÚÙÙþÚÙÙùÚÙÚÙÚÚÙÙþÚÙÙ÷ØÙØØÙØØÙØØúÙØÙØØÙÙõØÙÙØÙÙØÙÙØÙÙØÙýØÙØØûÙØÙÙØEØø×Ø×רØ×ØØùררØ×Ø'Ø?×ýÖ×ÖÖû×ÖÖ×ÖÖþ×Ö Öþ×Ö Öþ×ÖÖþ×ÖÖ×ÖÕþÖÕÕýÖÕÖÖýÕÖÕÕÖùÕÖÖÕÖÖÕÕôÖÕÕÖÕÖÕÕÖÕÕÖÖÕþÖÕÕþÖÕÕõÖÕÖÖÕÕÖÕÖÕÔÔÕþÔÕÕøÔÕÕÔÕÕÔÕÕøÔÕÔÔÕÔÔÕÕÔ÷ÕÔÕÔÕÔÕÕÔÔÕýÔÕÔÔûÕÔÕÕÔ~ÔøÓÔÓÔÓÓÔÓÓþÔÓÓûÔÓÓÔÓÓþÔÓÓùÔÓÔÔÓÔÓÓûÔÓÔÔÓÓüÔÓÔÓ ÓÒÓÒþÓÒÒÓôÒÓÒÓÓÒÒÓÒÒÓÒÒþÓÒÒþÓÒÒÓÒÓôÒÓÒÒÓÒÓÒÒÓÑÒÒÑÒÑÒÑ÷ÒÑÒÒÑÒÒÑÒÒÑÒÑÒÑÒöÑÒÑÒÒÑÒÑÑÒÒüÑÒÒÑÑþÒÑ~ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐÑÐùÑÐÐÑÐÑÐÐÑÐþÑÐÐÏÐÏÐýÏÐÏÏòÐÏÏÐÏÏÐÐÏÏÐÏÐÏÏÐÏÐÏþÐÏÏþÐÏÏÐÏöÐÏÏÎÏÏÎÏÎÏÏñÎÏÎÏÎÏÏÎÎÏÎÏÎÎÏÏÎöÏÎÎÏÎÏÏÎÎÏÏõÎÏÎÏÎÏÎÎÏÎÏÏÎÏÍþÎÍÍýÎÍÎÎþÍÎÎÍÎûÍÎÎÍÎÎûÍÎÎÍÎÎûÍÎÍÍÎÎùÍÎÍÎÎÍÎ΀ÍÌûÍÌÌÍÌÌÍÌÍÌÍÌÍþÌÍÍôÌÍÌÍÌÍÌÌÍÌÍÌ ÌþÍÌÌËÌËÌöËÌÌËËÌÌËËÌÌËðÌËËÌËÌÌËËÌÌËÌËËÌÌúËÌËÌËÌÌüËÌÌËËþÊËËþÊË ËÊ ËüÊËÊËËþÊËËÊËúÊËËÊËÊ?ÊÉþÊÉÉûÊÉÉÊÉÉÊÉúÊÉÊÉÊÉÉþÊÉÉþÊÉÉÊÉÊÉÊúÉÊÉÉÊÉ?ÉùÈÉÈÈÉÈÉÉýÈÉÈÈÉÈÉÈÉöÈÉÈÉÈÉÉÈÉÈÈÉûÈÉÉÈÉÉöÈÉÈÉÉÇÈÈÇÈÈþÇÈÈþÇÈÈøÇÈÈÇÈÈÇÈÈþÇÈÈûÇÈÇÈÇ>ÇýÆÇÆÆûÇÆÆÇÆÆÇÆþÇÆÆÇÆûÇÆÆÇÆÆþÇÆÆþÇÆÆþÇÆCÆÿ?ÍFçþæçwçæüçæçææþçæ æûçæççæ æõçææçææççæçææþçææåæýåæååæåæåùæååæååææåþæååæåöæååææåæåæååùæåæåæåææåýæäååäüåäåääåþäååøäåäåäååääåäåýäåääýåäååäåäþåääùåäãäããä äþãääüãäãääþãääûãäããä äþãää‚ãâãâãâûãââãââãâòãâããâãâãâããââããâóãââãââãâãâããââáâáâþáââáâáýâáââûáâáâááâúáââááââáâáûàááàááþàááþàááþàá áþàááüàáàáá€àþßààûßàßàßßàýßàßßãàßàßààßààßààßßààßàßßààßààßßàßßàßàßÞßýÞßÞÞßüÞßßÞÞßÞûßÞÞßÞÞßûÞßÞßÞÞßûÞßÞÞßßÞÝùÞÝÞÝÞÝÞ ÞüÝÞÝÞÞþÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞþÝÞÞ?ÝÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜÝÜþÝÜÜÝBÜþÛÜÜþÛÜÜûÛÜÛÜÛÛÜöÛÜÜÛÜÛÛÜÜÛÛÜÛÜüÛÜÜÛÛüÜÛÜÛÛÜùÛÜÜÛÚÚÛÛþÚÛÛÚÛþÚÛÛÚÛûÚÛÛÚÛÛþÚÛÛþÚÛÛþÚÛÛ@ÚÙÚÙÚÙÚýÙÚÙ ÙûÚÙÙÚÙÙþÚÙÙüÚÙÚØØøÙØÙÙØØÙØØÙòØÙÙØØÙÙØØÙØØÙØØÙØÙñØÙØØÙØØÙÙØÙØÙÙØDØ×ØþרØþרØþרØþרØþרØ×ýØ×ØØùר×ררØùרØ×ØØ×@×Öþ×ÖÖþ×ÖÖþ×ÖÖø×Ö×Ö×Ö×ÖÖþ×Ö Öþ×ÖÖÕþÖÕÕøÖÕÖÕÖÕÖÕÕþÖÕÕûÖÕÕÖÕÕþÖÕÕÖÕûÖÕÕÖÕÕþÖÕÕÖÕÖÕþÔÕÕÔÕüÔÕÔÕÕúÔÕÔÕÔÕÕ÷ÔÕÔÕÔÕÔÕÔÔóÕÔÔÕÕÔÔÕÔÔÕÔÕÕ€ÔúÓÔÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓùÔÓÓÔÓÔÓÓúÒÓÓÒÓÒÒýÓÒÓÓÒòÓÒÒÓÓÒÒÓÒÓÒÓÒÓÓÒÓÒôÓÒÓÒÓÒÓÒÓÒÓÒÒûÑÒÑÑÒÒÑúÒÑÑÒÒÑÑøÒÑÒÑÒÑÒÑÑþÒÑÑÒôÑÒÒÑÑÒÑÒÒÑÑÒÒÑÒÑÒÑÐþÑÐÐþÑÐÐùÑÐÐÑÐÑÐÐþÑÐÐþÑÐÐüÑÐÐÑÑÐûÑÐÐÑÐÐþÑÐÐÏûÐÏÐÐÏÏþÐÏÏÐþÏÐÐûÏÐÐÏÐÐüÏÐÏÐÐÏþÐÏÏåÐÏÏÐÏÏÐÏÐÏÏÐÏÏÐÏÐÎÏÎÏÎÏÎÏÎÏÏùÎÏÏÎÏÎÏÏ÷ÎÏÎÎÏÎÏÎÏÏõÎÏÎÎÏÏÎÏÏÎÏÏþÎÏÏÎÏûÎÏÎÍÎÎþÍÎÎûÍÎÍÍÎÎúÍÎÍÎÍÎÎøÍÎÎÍÎÎÍÎÎþÍÎÎÍ ÎþÍÎ΀ÍÌÍüÌÍÍÌÌûÍÌÍÍÌÌÍÌÍýÌÍÌÌøÍÌÍÌÍÍÌÍÍÌþËÌÌùËÌËÌËÌËËüÌËÌËËùÌËÌËËÌËËüÌËÌËËÌþËÌÌþËÌÌËÌþËÌÌËýÌÊËËÊýËÊË ËÊýËÊËËûÊËËÊËËþÊËËùÊËÊËÊËÊ>ÊÉóÊÉÊÊÉÊÊÉÊÉÉÊÉÉþÊÉÉúÊÉÉÊÊÉÉüÊÉÊÉÉþÊÉAÉÈ÷ÉÈÉÉÈÉÉÈÉÉÈÉÈÉþÈÉÉüÈÉÈÉÉþÈÉÉøÈÉÈÈÉÉÈÉÉÈõÇÈÈÇÈÇÇÈÈÇÈ ÈþÇÈÈþÇÈÈÇÈûÇÈÈÇÈ È÷ÇÈÇÈÇÇÈÈÇ<ÇüÆÇÇÆÆÇÆþÇÆÆÇÆÇýÆÇÆ ÆúÇÆÆÇÇÆEÆ?Íçþæç™çþæç&çþæçóçæþçææþçææûçææçææúçææççææûçææçææüçæçææþçææþçææúçæçææååæüåææååþæååóæååæååæååæååææåæåþæååýæåææåùæåæåæäååþäååþäååþäååöäååääååääååöäååääååääååäåùäååääåääþãää÷ãäãääãäãääüãäãääúãääããääãòäãäãäãääãääãäã~ãøâãâãâããââýãâããâãùâãâãâãââþãââã âýãâããâþáââþáââþáââüáâáââüáâáââüáâáââáðâáâáâáâááââáâáàá áþàááàýáàááþàááüàáàááàáàá€àßàßüàßßààßàßàûßàßàßßàøßààßßàßààüßàßààßàßþÞßßûÞßßÞßßÞßûÞßßÞßßÞßþÞßßÞößÞßÞÞßßÞÞßßþÞßßþÞßßÞþÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞûÝÞÝÝÞÞÝÞÝÞþÝÞÞ@ÝÜþÝÜÜþÝÜ ÜøÝÜÝÝÜÜÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜGÜÛñÜÛÛÜÛÛÜÛÛÜÜÛÛÜÛÛÜÛÜõÛÜÜÛÛÜÛÜÜÛÜÜýÛÜÛÛýÜÛÜÜ÷ÛÜÛÜÜÛÜÚÛÛüÚÛÛÚÚÛþÚÛÛþÚÛÛþÚÛÛ?ÚýÙÚÙÙþÚÙ ÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙ ÙùÚÙÚÙÙØÙÙýØÙØØùÙØÙÙØØÙÙþØÙÙØþÙØØÙüØÙØÙÙùØÙØØÙÙØØ÷ÙØØÙÙØØÙØØþÙØCØþר ØþרØþרØþרØòרØ×ØØ×ØØ×ØØ×ØØø×ØØ×Ø×Ø×>×Öó×ÖÖ×Ö×ÖÖ××Ö×ÖÖþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖþ×ÖÖ÷×Ö×Ö××Ö×ÖÖþ×ÖÖÕÖÕÖÕúÖÕÖÕÕÖÖùÕÖÕÕÖÖÕÕÖÕÖþÕÖÖýÕÖÕÕþÖÕÕúÖÕÖÕÖÕÕÔÕÔøÕÔÕÔÕÔÔÕÕüÔÕÔÕÕùÔÕÔÕÕÔÕÕïÔÕÕÔÔÕÔÔÕÔÕÕÔÕÔÔÕÕþÔÕÕ€ÔýÓÔÓÓþÔÓÓþÔÓÓþÔÓÓÒùÓÒÓÒÓÓÒÒûÓÒÒÓÒÒÓÒÓþÒÓÓÒþÓÒÒÓÒÓ ÒÑÒüÑÒÑÒÒûÑÒÒÑÒÒüÑÒÑÒÒøÑÒÑÒÑÒÑÒÒþÑÒÒþÑÒÒ‚ÑÐüÑÐÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐÑÐþÑÐÐùÏÐÏÐÐÏÐÐíÏÐÏÏÐÏÐÏÐÏÏÐÏÏÐÐÏÐÏÏÐüÏÐÐÏÏøÐÏÏÐÐÏÐÏÏÐïÏÐÏÐÏÎÏÎÏÎÎÏÎÏÎÏÎÎûÏÎÏÎÏÏþÎÏÏÎÏÎôÏÎÏÏÎÎÏÏÎÏÎÏÏùÎÏÎÎÏÎÏÏýÎÏÎÎþÍÎ ÎûÍÎÎÍÎÎþÍÎÎþÍÎÎþÍÎÎûÍÎÎÍÎÎÍÎÍüÌÍÍÌÌÍþÌÍÍÌøÍÌÍÍÌÍÍÌÌöÍÌÌÍÍÌÍÌÌÍÍöÌÍÌÍÌÌÍÌÍÌÌìÍÌÍÍÌÌÍÌÌËÌËÌÌËÌÌËÌËËüÌËËÌÌË÷ÌËÌËËÌËÌËËýÌËÌÌËÌËÌúËÌËÌËÌÌðËÌËÌÌËÊÊËËÊÊËËÊËËÊËþÊËËùÊËËÊËÊËËþÊËËüÊËËÊÊËþÊËËþÊËË?ÊÉüÊÉÊÉÉýÊÉÊÊ ÉþÊÉÉþÊÉÉÊÉþÊÉÉúÊÉÊÉÊÉEÉÈîÉÈÉÈÈÉÈÉÈÉÉÈÉÉÈÉÉÈÈüÉÈÈÉÉÈýÉÈÉÉÈÉüÈÉÈÉÉÈÉüÈÉÉÈÈüÇÈÇÈÈþÇÈÈûÇÈÇÇÈÈÇ ÈÇÈþÇÈÈþÇÈÈÇÈ@ÇÆüÇÆÇÆ ÆþÇÆÆûÇÆÆÇÆÆÇýÆÇÆÆþÇÆÆþÇÆÆÇ?Æ?ÍÀçýæçææçýæçææúçææçæççòæçæçææçæçææççæ æþçææåþæååùæååæååææúåææåæååþæååþæååøæååæåææååæþåææåäùåääååäååûäåäåääúåäååäååùäåäååäååéäååäåääåäåäåäåäåäåääååääòãääããääãäããäãääãäøãäããääãääþãääþãääãäãâøãââãââãââöãââãâãâãâããýâãââãâãâþãââþãââúãââããââ÷áâááââááââáâáøâááââááââóáâááââááâáââááâþáââáþàááþàááþàááúàáàáàááàáþàááþàááüàáàáá„àþßààüßààßßþàßßàþßààüßààßßàßúàßßààßßàýßàßßþàßßÞþßÞÞßþÞßßøÞßßÞÞßÞßßÞþßÞÞþßÞÞßþÞßßÞÝÞÝÞüÝÞÝÞÞõÝÞÞÝÞÞÝÞÞÝÞÞþÝÞÞþÝÞÞþÝÞÞAÝÜþÝÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜöÝÜÝÜÝÜÜÝÝÜÜÝýÜÝÜÜÝ?ÜÛÜûÛÜÜÛÜÜúÛÜÜÛÛÜÜúÛÜÛÛÜÛÛýÜÛÜÜþÛÜÜìÛÜÛÜÜÛÜÛÜÜÛÜÜÛÜÜÛÜÛÜÜþÚÛÛøÚÛÚÛÛÚÚÛÛþÚÛ#ÛþÚÛÛ?ÚýÙÚÙÙþÚÙ ÙúÚÙÙÚÚÙÙþÚÙÙÚÙÚÙþÚÙÙØþÙØØúÙØØÙÙØØÙòØÙØÙØÙØØÙÙØÙÙØØùÙØÙÙØÙØØùÙØÙÙØÙØØûÙØØÙØCØþרØþרØüררØ×ØþרØþרØýר×@×Öþ×ÖÖú×ÖÖ××ÖÖ×Öü×Ö×Ö Ö×Ö×Öø×ÖÖ×ÖÖ×ÖÖÕÖÕÖúÕÖÖÕÖÕÕëÖÕÕÖÖÕÕÖÖÕÕÖÕÖÕÖÖÕÕÖÕÕþÖÕÕþÖÕÕÖûÕÖÕÖÕÕþÖÕÕüÔÕÔÕÕüÔÕÔÕÕûÔÕÔÕÔÔúÕÔÔÕÕÔÔÕþÔÕÕþÔÕÕùÔÕÕÔÕÕÔÔÕýÔÕÔÔüÕÔÕÔÔÓûÔÓÓÔÓÓùÔÓÔÔÓÔÓ ÓÔÓÔÓûÔÓÔÔÓÓþÔÓÓ ÒþÓÒÒþÓÒÒúÓÒÓÒÓÒÒþÓÒÒÓÒÓ÷ÒÓÓÒÒÓÒÓÒÒÓóÒÓÒÓÒÓÒÒÑÒÑÒÑÑÒþÑÒÒÑÒýÑÒÑÑÒÑÒþÑÒÒõÑÒÑÒÑÑÒÒÑÑÒÒ€ÑÐþÑÐÐþÑÐÐÑÐüÑÐÑÐÐùÑÐÑÐÐÑÐÐþÑÐ ÐüÑÐÑÐÐúÑÐÏÏÐÏÏýÐÏÐÐøÏÐÏÐÏÏÐÏ ÏýÐÏÐÐÏÐÏþÐÏÏþÐÏÏþÎÏÏûÎÏÏÎÏÏÎÏÎÏÎþÏÎÎÏúÎÏÏÎÎÏÏÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎûÍÎÍÍÎÎþÍÎÎÍÎþÍÎ ÎÍýÌÍÌÌùÍÌÍÌÌÍÌÌþÍÌÌüÍÌÍÌÌÍÌúÍÌÌÍÌÍÍÌÍÌüÍÌÌÍÍúÌÍËÌËÌÌúËÌÌËÌËËûÌËÌÌËËÌËÌöËÌÌËËÌÌËËÌÌþËÌÌËþÌËËòÌËËÌÌËÌËËÌËËÊËËüÊËÊËËûÊËËÊËËúÊËËÊÊË ËþÊËË@ÊÉüÊÉÊÉ ÉûÊÉÉÊÉÉþÊÉÉÊõÉÊÉÉÊÉÊÉÉÊÉBÉÈýÉÈÉ ÉþÈÉÉÈûÉÈÉÈÉÉüÈÉÈÉÉÈÉþÈÉÉÈÉýÈÇÈ ÈöÇÈÇÈÇÈÈÇÇÈÈÇöÈÇÈÈÇÈÈÇÇÈÈÇÈþÇÈÈ?ÇÆüÇÆÇÆÆûÇÆÆÇÆ ÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆûÇÆÇÇÆ@Æÿ?ÍÀçæþçææþçææþçææûçæççæ æþçææçæþçææýçæççæþçææýåæååæúåæååæååæýåæååôæåææåæååæåæååæåæùåæåææåææþåääåùäåäåääååþäååôäååääåääååäååäøåäåääååääüåääååäûãääãääþãä äûãääãä äãäþãää€ãôâãâãâããâããâããúâããââããþâããâöãââããâãâãââþãââãâþãââãýâãââùãâááââááâûáââáââþáââáøâáâááâáââáýâáââáâþáââúáââáâááþâááþàááüàáàááþàááþàááàúáàááàááüàáàááàáúàáàáàááàßàüßàßààßþàßßþàßßûàßßàßßàüßààßßàýßàßßþàßßëÞßÞßßÞÞßÞßßÞßÞßÞßÞßÞßßóÞßÞßÞÞßßÞÞßÞßßÞýßÞßßþÞßßÞýßÞßßÞüßÞÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞûÝÞÞÝÞÞÝÞþÝÞ Þ+ÝþÜÝÝÜþÝÜÜþÝÜÜûÝÜÜÝÜÜúÝÜÜÝÝÜÜþÝÜÜþÝÜÜüÝÜÝÜÜÝFÜÛøÜÛÛÜÛÜÛÜÜýÛÜÛÛÜüÛÜÛÜÜ÷ÛÜÜÛÜÜÛÜÛÛÜþÛÜÜÛÜùÛÜÜÛÜÜÛÛþÚÛ ÛþÚÛÛûÚÛÛÚÛ ÛþÚÛÛþÚÛ Û@ÚûÙÚÙÚÙÙþÚÙÙûÚÙÚÚÙ ÙþÚÙÙþÚÙÙÚ ÙØþÙØØûÙØÙÙØØûÙØØÙØØ÷ÙØÙØÙØÙØÙÙïØÙØÙØÙØØÙØØÙÙØÙÙØ>Ø×ØþרØþרØ×Ø×ØþרØþרØ×ØþרØþרØûרØ×Ø Ø?×Öþ×Ö Öþ×ÖÖþ×ÖÖþ×ÖÖú×Ö×Ö×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖù×ÖÖÕÖÕÖÖìÕÖÖÕÖÕÖÕÖÖÕÕÖÖÕÖÕÕÖÕÕøÖÕÕÖÕÖÕÖÖÕÖ÷ÕÖÖÕÖÕÕÖÕÕýÔÕÔÔÕüÔÕÕÔÔÕùÔÕÔÔÕÔÕÕþÔÕÕôÔÕÕÔÔÕÔÕÔÔÕÔÔûÕÔÕÔÕÕõÔÕÕÔÔÕÔÔÕÕÔ~ÔýÓÔÓÓãÔÓÓÔÓÔÓÓÔÓÔÓÔÔÓÔÓÓÔÔÓÔÓÓÔÓÓÔÓÓ÷ÔÓÔÓÓÔÓÔÓ ÓÔÓÔüÓÒÓÒÒÓýÒÓÒÒýÓÒÓÓÒþÓÒÒÓüÒÓÓÒÒùÓÒÓÒÒÓÒÒÓýÒÓÒÒþÓÒÒÓýÒÓÒÒÑýÒÑÒÒÑÒöÑÒÑÒÑÒÑÒÑÒÒÑÒÑüÒÑÑÒÒþÑÒÒøÑÒÒÑÒÒÑÒÒüÑÒÒÑ~ÑÐ÷ÑÐÑÐÑÐÑÑÐÐûÑÐÐÑÐÐþÑÐÐþÑÐÐóÑÐÐÑÐÑÐÐÏÐÏÐÏÏÐÏþÐÏÏÐÏúÐÏÐÏÐÏÏþÐÏÏùÐÏÏÐÏÐÏÏûÐÏÏÐÏÏÐûÏÐÏÐÏÏÎÏùÎÏÎÎÏÎÏÏüÎÏÎÏÏþÎÏÏóÎÏÎÏÏÎÎÏÏÎÏÎÏÏÎÏÎþÏÎÎþÏÎÎüÍÎÍÎÎþÍÎÎûÍÎÎÍÎÎíÍÎÎÍÎÎÍÎÎÍÎÎÍÍÎÎÍÍÎÎúÍÎÍÎÍÎÎÍÌ÷ÍÌÍÌÍÍÌÍÌÌüÍÌÍÌÌøÍÌÌÍÌÌÍÌÌþÍÌÌþÍÌÌøÍÌÌÍÌÍÌÍÍÌøÍÌÍËÌÌËÌÌËþÌËËÌòËÌÌËÌÌËÌËÌÌËËÌÌüËÌËÌÌüËÌÌËËúÌËÌËËÌÌËúÊËÊËÊËËþÊËËþÊËËþÊËËúÊËËÊÊËËúÊËËÊËÊ>ÊÉöÊÉÊÉÉÊÊÉÊÉÉûÊÉÉÊÉÉÊÉþÊÉÉÊ÷ÉÊÉÊÊÉÉÊÉÉþÊÉAÉúÈÉÈÉÉÈÈþÉÈÈøÉÈÉÈÈÉÉÈÈýÉÈÉÉüÈÉÉÈÈõÉÈÉÉÈÉÉÈÉÈÉÉþÈÉÉþÈÉÉûÈÉÈÇÈÈþÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈùÇÈÇÈÈÇÈÈ@ÇÆþÇÆÆþÇÆÆôÇÆÆÇÆÇÆÇÆÆÇÆÆüÇÆÇÆÆûÇÆÆÇÆ ÆþÇÆBÆ?Í çþæç"çþæçŒçæûçææçææçæþçææûçææçææþçææþçææþçææþçææöåæåæåæåææååöæåæåæåææåææåæåæõåæåææåææåæååæåûæåææååäýåäååþäååþäååäüåääååüäåäååùäåäååäååäåøäåäåääåääþãä-äþãääúãäãäãää€ãýâãââãâã÷âãâãâããâããâñãâããââããââãâãâããâãüâããââüãâãââáâáþâááâáâáâüáâáââüáâáââáâþáââáâøáâáàáààááúàááààáá÷àáààááàáààáþàááþàááýàáà~àßüàßàßßþàßßüàßàßßöàßàßàßààßààßüàßßààþßààßàýßÞßßÞßüÞßßÞÞùßÞÞßÞßÞÞûßÞÞßÞÞßøÞßÞÞßßÞßßþÞßßþÞßßþÞßßúÞßßÞÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞÝÞþÝÞÞþÝÞÞÝÞÝÞøÝÞÞÝÞÝÝÞÞÝþÜÝ"Ý ÜþÝÜÜþÝÜÜÝÜüÝÜÝÜÜþÝÜHÜÛÜýÛÜÛÛüÜÛÜÛÛøÜÛÜÛÜÜÛÜÜúÛÜÛÜÛÜÜøÛÜÛÛÜÛÜÛÛÜÛÜÛýÜÛÜÜÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛÚÛþÚÛÛÚÛÚÛýÚÛÚÚþÙÚ+ÚýÙÚÙÙÚÙüÚÙÚÙÙûÚÙÙÚÙÙþÚÙÙÚûÙÚÙÚÙÙøÚÙÚÙÙÚÚÙÙîØÙØÙØØÙÙØÙØÙØØÙØØÙÙØÙüØÙÙØØþÙØØÙýØÙØØþÙØØùÙØÙØÙÙØBØþרØùרר×רØþר ØöררØ×ØØ×ØØûר×רØþרØ@×Öþ×ÖÖþ×ÖÖö×Ö×Ö×Ö×Ö×ÖÖû×ÖÖ×ÖÖ×÷Ö××Ö×ÖÖ×ÖÖ×ýÖ×ÖÖþÕÖÖÕöÖÕÖÖÕÕÖÕÖÕ ÕýÖÕÖÖÕÖÕùÖÕÖÕÕÖÕÕÖûÕÖÕÖÕÕþÔÕÕöÔÕÔÔÕÕÔÕÔÕÕÔÕüÔÕÕÔÔýÕÔÕÕûÔÕÕÔÕÕûÔÕÕÔÕÕÔüÕÔÔÕÕÔóÓÔÓÔÓÔÓÓÔÔÓÔÓÓÔÓþÔÓ ÓÔÞÓÔÓÓÔÓÓÔÓÓÔÓÔÓÓÔÓÔÓÓÔÓÓÔÒÒÓÒÒÓÒÒÓÒÒüÓÒÒÓÓÒÓòÒÓÓÒÓÓÒÓÒÓÒÒÓÒÒÓÒÓÒÓòÒÓÒÒÓÒÒÓÒÒÑÒÒÑÑûÒÑÑÒÑÑÒÑÒãÑÒÑÑÒÑÒÑÑÒÑÑÒÑÒÒÑÑÒÒÑÑÒÑÑÒÑÒÑÑüÒÑÑÒÒÑýÐÑÐ ÐþÑÐÐÑÐÑÐüÑÐÑÐÐüÑÐÑÐÐÑÐþÑÐÐÑÏüÐÏÐÏÏþÐÏÏûÐÏÏÐÏÏóÐÏÐÏÏÐÐÏÏÐÏÐÏÏ ÐÏþÐÏÏÐÏÐÏþÎÏÏÎÏÎÏþÎÏÏÎýÏÎÏÏÎúÏÎÏÏÎÏÏúÎÏÏÎÏÎÎÏÎÏ ÎþÍÎÎ÷ÍÎÎÍÎÎÍÍÎÎÍÎÍÎþÍÎÎþÍÎÎýÍÎÍ~ÍÌÍÌøÍÌÌÍÍÌÍÌÌÍÌúÍÌÍÌÌÍÍÌþÍÌÌþÍÌÌÍÌþÍÌÌûËÌËËÌÌùËÌÌËÌËÌÌËÌþËÌÌýËÌËËøÌËÌËÌËËÌÌþËÌÌüËÌÌËËþÊËËþÊËËÊöËÊÊËËÊÊËÊËËûÊËËÊËËÊËÊËûÊËËÊËËAÊüÉÊÊÉÉþÊÉÉÊÉþÊÉ ÉÊÉÊÉúÊÉÉÊÊÉ@ÉþÈÉÉþÈÉÉþÈÉÉöÈÉÉÈÉÈÈÉÈÉÉüÈÉÈÉÉÈðÉÈÉÉÈÈÉÈÉÉÈÉÈÉÈÉÉÈùÉÈÈÇÈÇÈÈÇÈÇúÈÇÈÈÇÈÈûÇÈÈÇÈÈÇÈÇüÈÇÇÈ È?ÇÆþÇÆÆþÇÆÆþÇÆÆÇþÆÇÇùÆÇÇÆÆÇÆÆûÇÆÆÇÆÆþÇÆÆþÇÆ@Æ?ÍþæçäçþæçØçæþçææþçææçæçæüçæçææþçææþçææåúæåæåæååûæåææååþæååæùåææååæåå÷æåæåæåææååæåæüåææååøäåäååääååþäååä åüäååääåäåäåäûãääãääûãäããääþãääãøäãääãäãää€ãþâããâòãââãââãâããâãâããâþãââüãâãââãýâãââþãââáâýáâááâüáâáââáâþáââáâðáâáâáâááââááâáâááþàáá÷àááààááàááüàáàááþàááàáþàá áþàááàßàßüàßßààßüàßàßßüàßàßßûàßààßßàþßààßþàßßýàßààßþÞßßüÞßÞßßþÞßßüÞßÞßßÞûßÞßÞßßõÞßÞßÞßÞßßÞßßÞýßÞßßüÞßßÞÞûÝÞÝÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞýÝÞÝ>ÝÜþÝÜÜùÝÜÜÝÜÝÜÜÝÜûÝÜÝÝÜÜûÝÜÜÝÜÜÝÜüÝÜÝÜÜþÝÜCÜÛýÜÛÜ ÜþÛÜÜýÛÜÛÛúÜÛÜÛÛÜÜþÛÜÜûÛÜÜÛÜÜÛÜõÛÜÛÛÜÚÛÚÛÚÛÛþÚÛÛþÚÛÛþÚÛÛÚ ÛþÚÛÛþÚÛÛþÚÛÛ+ÚþÙÚÚÙûÚÙÙÚÙÙþÚÙ ÙþÚÙÙüÚÙÚÙÙÚÙþÚÙÙþÚÙÙþÚÙÙØþÙØØþÙØØþÙØØÙûØÙØØÙÙØöÙØÙØØÙØÙØÙÙúØÙØÙØÙÙýØÙØDØþרØþרØþרØ×Ø×ýØ×ØØþרØþרØþרØüרØ×>×Öþ×ÖÖû×Ö××ÖÖþ×ÖÖû×Ö××ÖÖ×ýÖ×ÖÖþ×ÖÖ×Öþ×ÕÕÖÕùÖÕÖÕÕÖÕÕÖüÕÖÕÖÖûÕÖÕÕÖÖÕþÖÕÕÖýÕÖÕÕÖúÕÔÕÔÕÔÔÕþÔÕÕÔÕÔÕÔýÕÔÕÕÔüÕÔÕÔÔÕÔþÕÔ~ÔýÓÔÓÓÔÓÔÓþÔÓÓþÔÓ ÓþÔÒÒüÓÒÓÒÒõÓÒÒÓÒÒÓÒÓÒÓÓüÒÓÒÓÓÒþÓÒÒÓøÒÓÓÒÒÓÓÒÒÓïÒÓÓÒÓÒÒÓÒÒÑÒÒÑÒÑÒÒûÑÒÒÑÒÒþÑÒÒÑþÒÑÑþÒÑÑÒþÑÒÒÑÒüÑÒÒÑ~ÑÐþÑÐÐþÑÐÐÑÐÑøÐÑÐÑÐÐÑÐÐþÑÐÐýÏÐÏÏþÐÏÏïÐÏÐÏÐÐÏÐÏÐÏÐÏÐÏÐÏÏÐÏÐüÏÐÐÏÏÐÏõÐÏÏÐÐÏÏÐÏÏÎÎÏÎÏøÎÏÏÎÏÎÎÏÏþÎÏÏÎÏÎÏéÎÏÎÏÎÏÎÏÎÏÏÎÏÏÎÏÎÎÍÎÎÍÎÎÍÎþÍÎÎùÍÎÎÍÎÍÎÎÍýÎÍÎÎùÍÎÎÍÎÍÎÎûÍÎÎÍÎÎýÍÎÍ€ÍúÌÍÍÌÍÌÌÍûÌÍÌÍÌÌÍÌõÍÌÍÌÌÍÌÌÍÍÌÌþÍÌÌùÍÌÍÌÌÍÌÌþÍÌÌþËÌÌþËÌÌüËÌËÌÌËÌúËÌÌËËÌÌþËÌÌùËÌËÌËËÌÌËÌøËÌËÌÌËÌËËþÊËËþÊËËþÊËËûÊËËÊËËþÊËËþÊË ËüÊËÊËË@ÊùÉÊÉÊÉÊÉÉþÊÉÉüÊÉÊÉÉÊÉùÊÉÊÉÉÊÉÉüÊÉÊÉÉúÊÉÊÉÊÉBÉÈøÉÈÈÉÉÈÉÈÈÉíÈÉÈÉÈÉÉÈÉÈÈÉÈÉÈÉÉÈÉÉþÈÉÉÈúÉÈÉÉÈÉÉþÈÉÉýÈÉÈ ÈþÇÈÈþÇÈÈþÇÈÈúÇÈÈÇÈÇÇ ÈþÇÈÈþÇÈ ÈÇþÆÇ'ÇÆþÇÆÆþÇÆÆûÇÆÆÇÆÆüÇÆÇÆÆÇÆøÇÆÇÇÆÆÇÆ ÆþÇÆÆþÇÆCÆÿ?ÍýçæçîçþæçDçþæç†çæþçææïçææçææçææççæçææçææþçæ æûçææçææûçææçææçæûåææåææåæýåæååúæååææååøæåææååæååþæååþæååæþäååäåäûåääåääýåäååüäåäååþäååäåúäååääååäå äþãääþãääþãääãäþãääùãäãäããääþãääüãääã~ãâãâþãââûãâãâããâùãâãââãââûãââãââãâãâãâüãâãââþáââáâþáââáâüáââááâïáââááââáââááââááââûáâáàááüàáàá áþàááûàááàááúàáàáàááþàááüàááà~àóßàßàßßàßàßààßßüàßàßßàßûàßààßß÷àßàßààßàßßàß÷àßßààßÞÞßßûÞßßÞßßýÞßÞÞòßÞßÞßßÞßÞßßÞÞßßÞßÞïßÞÞßÞßÞÞßßÞÞßßÞÞßßÞüÝÞÝÞ ÞøÝÞÞÝÞÞÝÞÞüÝÞÝÞÞ?ÝýÜÝÜÜÝÜüÝÜÝÜÜþÝÜÜüÝÜÝÜÜùÝÜÜÝÜÝÜÜúÝÜÜÝÝÜÜûÝÜÝÜÝÝEÜ÷ÛÜÜÛÜÛÛÜÛÛÜþÛÜÜþÛÜÜûÛÜÛÜÛÛýÜÛÜÜþÛÜÜþÛÜÜÛÜþÛÜÜýÛÜÛÛÚüÛÚÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛ Û=ÚþÙÚÚõÙÚÙÚÙÚÙÚÙÚÙÙøÚÙÙÚÙÚÚÙÙþÚÙÙûÚÙÙÚÙÙþÚÙÙüÚÙÙÚÚÙÚÙþÚØØüÙØÙØØÙüØÙÙØØÙØûÙØØÙØØúÙØØÙØÙÙØþÙØØùÙØÙØÙØÙÙGØ×ØþרØþרØþרØþרØþרØûרØ×ØØþרØüרØ×>× Öþ×ÖÖü×Ö×ÖÖü×Ö×ÖÖü×Ö×ÖÖ× Öþ×Ö ÖýÕÖÕÕþÖÕÕýÖÕÖÖÕÖÕúÖÕÖÕÖÕÕýÖÕÖÖÕûÖÕÖÖÕÕÔøÕÔÕÔÕÕÔÕÕÔÕþÔÕÕÔÕÔÕÔþÕÔÔýÕÔÕÕþÔÕÕúÔÕÕÔÕÔZÔþÓÔ!ÔÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓ ÓþÔÓÓìÔÓÒÓÒÓÒÓÓÒÓÒÓÒÓÓÒÒÓÒÒÓþÒÓÓÒúÓÒÒÓÓÒÒþÓÒÒÓýÒÓÒÒëÓÒÓÒÒÓÒÒÑÒÒÑÒÑÒÑÒÒÑÑÒÒÑÒ÷ÑÒÑÑÒÒÑÒÑÑ÷ÒÑÒÒÑÒÑÑÒÒþÑÒÒùÑÒÑÒÒÑÒÒ€ÑÐÑøÐÑÐÐÑÐÑÐÐÑÐþÑÐÐÑÐþÑÐÐþÑÐÐþÑÐÐöÑÐÑÐÐÑÐÐÑÐÐÏþÐÏÏþÐÏÏÐþÏÐÐÏðÐÏÏÐÏÐÏÏÐÏÐÏÐÏÐÏÏþÐÏÏÐÏüÐÏÐÏÏþÎÏÏÎÏþÎÏÏþÎÏÏÎÏþÎÏÏÎÏûÎÏÏÎÏÏýÎÏÎÎÏòÎÏÎÏÏÎÏÎÏÎÏÎÍÎÎÍúÎÍÎÎÍÎÎúÍÎÎÍÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎÍÌûÍÌÍÍÌÌþÍÌÌïÍÌÌÍÌÍÍÌÍÌÍÌÌÍÌÍÌÌøÍÌÍÌÍÌÍÌÌþÍÌÌùÍÌÌÍÌÍÌÌýËÌËËÌËùÌËÌÌËÌËËôÌËËÌËËÌÌËËÌËËÌþËÌÌõËÌÌËÌÌËÌËÌËËüÊËÊËËûÊËÊÊËËüÊËÊËËüÊËÊËËûÊËÊÊËËýÊËÊ>ÊýÉÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉCÉÈÉüÈÉÈÉÉûÈÉÈÈÉÉÈþÉÈÈÉÈÉÈñÉÈÉÉÈÈÉÈÉÉÈÉÉÈÉÉüÈÉÉÈÈûÇÈÈÇÈÈþÇÈÈûÇÈÈÇÈÈþÇÈÈþÇÈÈÇÈýÇÈÇ@ÇÆÇÆþÇÆÆûÇÆÆÇÆÆüÇÆÇÆÆûÇÆÇÇÆÆüÇÆÇÆ>Æ?Í=çþæççþæç/çþæç8çæçæþçææþçææüçæçææþçææüçæçææüçæçææþçææûçææçææûåææåææåæåæåæûåæååææåæþåææåþæååúæååææååæåäüåääååäåþäååäåþäååäåäåþäååäåøäåääååäååþãääþãääþãääãäþãääþãääòãääãäãäãääãäãääúãääãäã€ãýâãââúãâãâãââþãââãýâãââãýâãââãâûãââãââãâãôâãââááââááâááþâááâûáââáââáâüáâáââþáââáûâááâááâáâþàááøàáàáàáàááûàááàááàáþàááþàááþàááþàááúàáàááà~àßúàßßààßßþàßßûàßààßßùàßààßàßßàóßàßààßßàßààßààûßàßàßßþàßßýÞßÞÞýßÞßßÞüßÞÞßßýÞßÞÞþßÞÞßþÞßßÞßûÞßßÞßßÞÝÞüÝÞÝÞÞûÝÞÞÝÞÞþÝÞÞüÝÞÝÞÞÝþÜÝÝþÜÝÝÜÝÜÝÜþÝÜÜÝ ÜÝÜüÝÜÝÜCÜÛÜÛûÜÛÜÛÜÜüÛÜÛÜÜþÛÜÜÛÜÛþÜÛÛîÜÛÛÜÜÛÜÛÜÜÛÛÜÛÛÚÚÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛ?ÚÙÚÙþÚÙÙþÚÙÙÚ ÙüÚÙÚÙÙþÚÙÙûÚÙØÙØØÙØÙüØÙÙØØÙØýÙØÙÙØüÙØÙØØÙþØÙÙØÙýØÙØCØ×Øþר ØþרØþרØø×Ø×ØØ×Ø×רþר ØüרØ×>×Ö×Ö×Öþ×ÖÖ×Öþ×ÖÖ×Ö×þÖÕÕÖÕøÖÕÖÕÖÕÖÕÕÖ÷ÕÖÕÕÖÕÕÖÕÕÖþÕÖÖúÕÖÕÖÖÕÕ÷ÖÕÕÖÕÖÕÕÖÖúÕÖÕÕÖÕÕÔÕþÔÕÕÔÕûÔÕÔÔÕÕúÔÕÔÔÕÔÔÕÔÕÔÕÔÕûÔÕÔÔÕÕÔÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓÔÓþÔÓÓþÔÓÓþÔÓÓÔÓÒ÷ÓÒÒÓÒÒÓÓÒÒøÓÒÒÓÓÒÓÒÒüÓÒÒÓÓùÒÓÒÒÓÓÒÒþÓÒÒÓøÒÓÒÒÓÓÑÒÒÑ÷ÒÑÑÒÑÒÒÑÒÒÑÒÑÒÑÒüÑÒÑÒÒÑõÒÑÒÑÑÒÑÒÒÑÒÒÑÐÑÐþÑÐÐÑÐþÑÐÐþÑÐÐûÑÐÐÑÏÏóÐÏÏÐÏÏÐÏÐÏÐÐÏÏÐÏúÐÏÐÐÏÐÐüÏÐÏÐÐÏÐÏýÐÏÐÐÏÐÏÎÏùÎÏÎÏÏÎÏÏÎúÏÎÏÏÎÏÏüÎÏÎÏÏÎÏÎÏúÎÏÎÏÏÎÎÏùÎÏÏÎÎÏÎÎþÍÎÎþÍÎ ÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎ ÎÍ΂ÍýÌÍÌÌûÍÌÍÌÍÍÌûÍÌÌÍÌÌüÍÌÍÌÌþÍÌÌüÍÌÍÌÌþÍÌÌÍ÷ÌÍÌÍÌÍÌÍËËÌùËÌËËÌÌËËÌËÌþËÌÌýËÌËËþÌËËÌËÊËþÊËËõÊËËÊËËÊËËÊËËþÊËËþÊËËøÊËËÊËËÊËËýÊËÊ?ÊÉþÊÉÉóÊÉÉÊÉÉÊÉÊÉÊÊÉÉÊ ÉÊ ÉüÊÉÊÉAÉÈÉÈÉþÈÉÉþÈÉÉúÈÉÈÈÉÈÈÉýÈÉÈÈøÉÈÉÉÈÉÈÉÉÈÉùÈÉÈÈÉÈÉÉ ÈÇÈþÇÈÈÇÈùÇÈÈÇÈÇÈÈþÇÈÈÇÈûÇÈÇÇÈÈüÇÈÈÇ?ÇõÆÇÇÆÆÇÆÆÇÇÆÆþÇÆÆûÇÆÇÇÆÆþÇÆÆùÇÆÇÆÇÇÆÆÇAÆ?Í çþæçÛçþæçÖçæþçææþçææþçæ æþçææçæùçæçææçææþçææåûæååæååüæååææåæåýæåææåþæååæåæåùæåææåäååäþåääåõäååääåääååääïåääåäåäåääåäåäåäååþäååùäåääåäååùäãääããääþãääúãäãäãääùãäãäããääþãääþãääãäãäãýâãââüãââããâãâúãââããââûãââãââþãââãâãûâããâããâáùâááââáââáâáâáùâááââáââ÷áâááâááâááâáúâáââáââøáâáââáàááþàááþàááàýáàááüàáàááþàááþàááþàááþàáá€àßüàßàßßþàßßüàßàßßàßøàßàßàßàßßàßàßûàßßàßßüàßÞßßÞßþÞßßÞßþÞßßþÞßßÞýßÞßßÞßÞþßÞÞüßÞÞßßûÞÝÞÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞÝÞþÝÞÞÝÞõÝÞÝÞÞÝÞÝÞÞÝ?Ý ÜÝÜþÝÜÜÝ ÜþÝÜÜþÝÜÜþÝÜÜÝCÜÛúÜÛÜÜÛÜÜÛÜþÛÜÜÛýÜÛÜÜÛýÜÛÜÜýÛÜÛÛÜôÛÜÛÜÜÛÜÜÛÛÜÛÛþÚÛÛüÚÛÚÛÛÚýÛÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛÚþÙÚ4ÚÙÚÙÚÙþÚÙÙ÷ÚÙÙÚÚÙÙÚÙÙÚöÙÚÙÚÙÙÚÙÙÚÚýÙÚÙÙûÚØØÙØØþÙØØüÙØØÙÙØÙ ØÙ÷ØÙÙØØÙÙØÙÙþØÙÙØþÙØCØüרר Øýר××Ø×Ø× ØþרØ×ØþרØ?×Öþ×ÖÖþ×ÖÖ×Öþ×Ö Öþ×Ö Ö×Öü×ÕÕÖÖÕÖÕÖÕþÖÕÕûÖÕÖÖÕÕÖýÕÖÕÕÖÕþÖÕÕÖÕüÔÕÔÕÕþÔÕÕûÔÕÕÔÕÕÔÕüÔÕÔÕÕûÔÕÔÔÕÕÔ÷ÕÔÕÕÔÔÕÔÕÕýÔÕÔÔûÓÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓüÔÓÔÓÓÔÓÒÓûÒÓÓÒÓÓÒÓýÒÓÒÒÓÒÓúÒÓÒÒÓÒÒûÓÒÓÒÓÓùÒÓÒÒÓÓÒÒÓÒûÓÒÒÑÒÒêÑÒÒÑÒÑÑÒÒÑÑÒÑÒÑÑÒÑÑÒÒÑÑÒÑ÷ÒÑÒÒÑÒÑÑÒÒÑúÒÑÒÒÑÒÒ€ÑÐÑÐþÑÐ ÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐúÑÐÏÐÐÏÏÐÏõÐÏÐÐÏÏÐÐÏÏÐÐýÏÐÏÏúÐÏÐÏÐÏÏÐÏùÐÏÐÏÏÐÏÏûÐÎÏÏÎÎòÏÎÎÏÎÎÏÏÎÏÏÎÏÎÎýÏÎÏÏüÎÏÏÎÎýÏÎÏÏüÎÏÎÏÏþÎÏÏöÎÏÏÎÏÎÏÎÏÎÎýÍÎÍÍÎþÍÎ ÎþÍÎÎþÍÎÎÍûÎÍÎÍÎÎýÍÎÍ~ÍÌöÍÌÌÍÌÍÌÌÍÌÌÍÌýÍÌÍÍÌüÍÌÍÌÌþÍÌÌôÍÌÍÍÌÍÍÌÍÌÍÌÌþÍÌÌþÍÌÌËÌËÌòËÌÌËÌÌËËÌËÌÌËÌÌËþÌËËüÌËËÌÌüËÌËÌÌòËÌÌËËÌËÌÌËËÌÌËËÊËþÊËËøÊËÊÊËÊÊËËûÊËËÊËËüÊËÊËËþÊËËÊË?ÊÉþÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉûÊÉÊÊÉÉúÊÉÊÉÊÉÉþÊÉÉþÊÉEÉüÈÉÈÉÉÈÉþÈÉÉùÈÉÈÉÈÈÉÉÈýÉÈÉÉÈÉûÈÉÉÈÉÉüÈÉÉÈ ÈûÇÈÈÇÈ ÈûÇÈÈÇÈÈþÇÈÈüÇÈÇÈÈúÇÈÈÇÇÈ È?ÇÆþÇÆÆþÇÆÆþÇÆÆûÇÆÇÇÆÆþÇÆÆþÇÆÆþÇÆDÆÿ?ÍéçþæçÖçæþçæ æüçæçææçæçæûçæççææþçææþçææøçæçæåæåææüåææååþæååúæåæååææùåæåæåæååüæåæååûæåææååüæåæååöæååääåäåäååþäååäøåäåäååäååëäåääååääååääåäåäåäåäååþäå åüäãäããäãäãäþãääãäüãäãääãäûãääãää„ãûâãââããüâããââüãâãââþãââöãâãâããââãââãâúãâãâãââþáââýáâááþâááâáúâáâááââüáââááâùáââáâáââáëâááââáàááàáàáàááàááàááþàááþàááþàááþàá áþàááþàáá€àýßàßßàßàßöàßßàßßààßààßàßþàßßòàßßàßßàßàßßààßß÷àßàßßàßßÞÞýßÞßßüÞßßÞÞýßÞßßþÞßßûÞßßÞßßüÞßÞßßûÞßÞÞßßýÞßÞÞðßÞÞßßÞßßÞßÞÞÝÞÝÞÞÝúÞÝÞÝÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞÝ Þ@ÝÜþÝÜÜþÝÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜøÝÜÜÝÜÜÝÜÜÝÜþÝÜEÜÛþÜÛÛÜÛðÜÛÜÜÛÜÛÜÛÛÜÛÛÜÜÛÛÜÛúÜÛÛÜÛÜÜÛÜòÛÜÛÛÜÛÜÛÜÛÛÜÚÛ ÛþÚÛ ÛþÚÛÛþÚÛÛüÚÛÚÛÛ?ÚÙþÚÙÙûÚÙÙÚÙÙúÚÙÙÚÚÙÙùÚÙÚÙÙÚÙÙûÚÙÙÚÙÙøÚÙÙÚÙÙÚÙÙÚÙØþÙØØÙØÙûØÙØÙØØõÙØÙØÙØÙØØÙØØüÙØÙØØÙôØÙÙØÙØØÙÙØÙØ?ØþרØîרØ×Ø×Ø×ררØ×ØØ×ØØüררØþרØûרØ×ØØ×Ø?×ýÖ×Ö Öþ×ÖÖü×Ö×ÖÖþ×ÖÖû×Ö××ÖÖ×þÖ×× Öù×ÖÖÕÕÖÕÕýÖÕÖÖÕþÖÕÕÖüÕÖÕÖÖÕûÖÕÖÖÕÕõÖÕÕÖÕÖÕÖÖÕÖÖÕþÔÕÕÔüÕÔÕÔÔÕÔÕûÔÕÕÔÕÕúÔÕÕÔÕÔÔûÕÔÕÔÕÕöÔÕÔÕÕÔÕÔÕÔCÔþÓÔ=Ô ÓþÔÓÓþÔÓÓûÔÓÓÔÓÓûÔÓÓÔÓÓøÔÓÓÔÔÓÔÓÓþÔÓÓÒøÓÒÒÓÓÒÓÒÒíÓÒÒÓÒÓÒÓÓÒÒÓÒÓÒÓÓÒÓÓÒÓóÒÓÓÒÓÓÒÓÓÒÓÓÒÒÓÒüÓÒÑÒÒÑÒ÷ÑÒÑÑÒÒÑÑÒÒñÑÒÑÑÒÑÑÒÑÒÒÑÒÑÒÒÑøÒÑÑÒÑÒÑÒÒÑÒÑÐþÑÐÐþÑÐÐûÑÐÐÑÐÐþÑÐÐþÑÐÐþÑÐÐÑÐþÑÐÐÏÐÏñÐÏÐÏÏÐÏÐÐÏÐÐÏÏÐÐýÏÐÏÏÐ÷ÏÐÏÐÏÐÏÏÐÐÏÐýÏÐÏÏþÐÏÏÐÏÎÏÎûÏÎÏÎÏÏûÎÏÏÎÏÏýÎÏÎÎûÏÎÏÎÏÏÎÏþÎÏÏþÎÏÏýÎÏÎ ÎþÍÎÎüÍÎÍÎÎûÍÎÎÍÎÎûÍÎÍÍÎÎÍÎüÍÎÍÎÎÍ΂ÍÌûÍÌÌÍÌÌûÍÌÌÍÌÌüÍÌÌÍÍÌÍÌýÍÌÍÍÌüÍÌÍÌÌþÍÌÌüÍÌÌÍÍýÌÍÌÌËþÌËËùÌËÌËËÌËËÌËÌþËÌÌËÌËÌËþÌËËÌþËÌÌËÌþËÌÌúËÌÌÊÊËËþÊËËþÊËËùÊËÊËÊÊËËþÊËËøÊËÊËÊËÊËËúÊËËÊÊËËþÊËËÊËüÊËËÊ>ÊÉþÊÉÉþÊÉÉþÊÉÉùÊÉÉÊÉÊÉÉþÊÉÉþÊÉÉþÊÉ ÉþÊÉÉúÊÉÉÊÊÉGÉÈÉúÈÉÈÉÉÈÈÉþÈÉÉúÈÉÉÈÈÉÉÈüÉÈÈÉÉÈÉÈúÉÈÉÈÉÈ ÈþÇÈÈûÇÈÈÇÈÈÇÈþÇÈÈõÇÈÇÇÈÈÇÈÈÇÈÈþÇÈÈÇÈ@ÇÆþÇÆÆþÇÆÆþÇÆÆþÇÆ ÆþÇÆÆÇÆþÇÆDÆ?Í“çþæçÅçþæçdçùæçæçæçææçæçæçæþçææçæþçææûçæççææåæåæúåæååæååèæåæååæåæåæåæåæåææååææåæååæåþæååøæååääååääåüäåäååäúåääåäååþäååäøåäååäåäååäåäþåääãäþãääþãääþãääþãääãýäãääþãääþãää€ãâþãââãýâãââüãââããâõãâããâãââããââûãââãââãýâãââþãââûãââãââþáââþáââáâüáâáââøáââááâáââüáâáââýáâááúâááâáââõáâáâáââááàá áþàá áþàááþàá áþàááþàááàá€àßàßàßûàßßàßßöàßààßßàßàßßàßþàßßþàßßÞýßÞßßÞßþÞßßÞßúÞßßÞÞßßÞßéÞßßÞÞßßÞßßÞßÞÞßÞÝÞÝÞÝÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞÝ ÞþÝÞÞÝÞ%ÝþÜÝÝÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜùÝÜÜÝÜÝÜFÜÛÜçÛÜÛÜÛÜÛÛÜÛÜÛÛÜÛÜÜÛÜÛÜÛÜÛÜÜÛÜÛÜÛÜüÛÜÜÛÛÜóÛÜÜÚÚÛÚÚÛÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛÚÛÚöÛÚÛÛÚÛÛÚÛÚ>ÚýÙÚÙÙþÚÙÙþÚÙÙþÚÙÙÚÙüÚÙÚÙÙþÚÙÙþÚÙÙØÙúØÙÙØÙØØüÙØÙØ ØÙøØÙØØÙØÙØØüÙØÙØØøÙØØÙÙØØÙÙØüÙØÙØ@Ø×ØþרØþרØ×ØþרØþרØþרØ?×Öþ×ÖÖþ×Ö Ö×Ö×Öþ×ÖÖþ×ÖÖù×Ö×ÖÖ×ÖÖÕþÖÕÕòÖÕÖÕÕÖÕÕÖÖÕÕÖÕÕøÖÕÖÕÕÖÖÕÕþÖÕÕùÖÕÕÖÕÖÕÕÖõÕÖÖÕÖÕÖÕÕÖÕÕûÔÕÔÔÕÕÔþÕÔÔûÕÔÕÔÕÕþÔÕÕúÔÕÔÕÔÕÕúÔÕÔÕÔÕÕüÔÕÔÕÕûÔÕÕÔÕÕ€ÔÓûÔÓÔÔÓ ÓùÔÓÔÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓÒðÓÒÓÓÒÓÒÓÒÒÓÓÒÒÓÒÒöÓÒÓÒÒÓÓÒÓÒÒþÓÒÒÓýÒÓÒ ÒúÓÒÒÑÑÒÒÑÒþÑÒÒ÷ÑÒÑÒÑÑÒÑÒÒþÑÒÒÑþÒÑÑÒþÑÒÒûÑÒÑÒуÑÐþÑÐÐÑýÐÑÐÐþÑÐÐÑÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÏÐÐÏþÐÏÏÐýÏÐÏÏöÐÏÐÏÏÐÏÏÐÏÏûÐÏÐÏÐÐÏþÐÏÏþÐÏÏ÷ÐÏÐÏÐÏÐÐÏÏþÎÏÏÎÏÎÏüÎÏÎÏÏúÎÏÎÏÏÎÎÏöÎÏÎÎÏÏÎÎÏÎÎþÏÎÎÏÎþÍÎÎÍÎÍÎþÍÎÎöÍÎÎÍÍÎÍÎÍÎ ÎþÍÎÎÍüÌÍÍÌÌÍÌþÍÌÌÍÌÍøÌÍÌÍÌÌÍÌÌÍÌÍÌÍúÌÍÌÌÍÌÌËþÌËËýÌËÌÌËÌËÌþËÌÌþËÌÌïËÌËÌËËÌËËÌËËÌËÌËÌÌýËÌËËõÌËÌÌËËÌÌÊÊË ËþÊËËÊËþÊËËþÊËËúÊËÊËÊËËþÊËËüÊËËÊ>Ê ÉþÊÉ ÉþÊÉÉþÊÉÉùÊÉÊÉÉÊÉÉþÊÉÉþÊÉ?ÉÈýÉÈÉÉûÈÉÈÉÈÈýÉÈÉÉüÈÉÉÈÈúÉÈÉÈÉÈÈõÉÈÉÈÈÉÈÈÉÉÈÈÉûÈÉÈÈÉÉÈþÉÈÈþÇÈÈüÇÈÇÈÈôÇÈÇÇÈÇÈÇÈÈÇÈÈûÇÈÈÇÈÈþÇÈÈÇÈþÇÈÈüÇÈÈÇ?ÇýÆÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆüÇÆÇÆÆûÇÆÆÇÆ>Æ?Í|çþæçAçýæçææþçææþçææþçææüçæçææþçæ æþçææ÷çæçææçæçææýåæååþæååæøåææååææååæåæõåæåææååææåææåæåäýåäååäýåäååäýåäååùäååääåääåþäååäåþäååäþåä äãäþãääãäúãäãäãääúãäããäã~ãýâãââùãââãâãââã÷âãââããâãââãüâããââüãâãââõãââããâãââãââþáââúáââááââþáââüáâáââüáâáââþáââþáââáâùáââáâáââûáâáàááþàááþàááþàááþàááþàáá€àýßàßßàßùàßàßààßßþàßßàßàøßàßààßàßßàýßàßßðàßààßàßàßßÞÞßÞÞßßÞüßÞÞß ßúÞßÞßÞßßÞßÞßÞþßÞÞßÝúÞÝÝÞÝÞÞþÝÞÞþÝÞÞõÝÞÞÝÞÝÞÝÞÝÞÞüÝÞÝÞÞ@ÝÜøÝÜÝÝÜÜÝÜÜþÝÜ ÜþÝÜÜ÷ÝÜÜÝÜÜÝÝÜÜüÝÜÝÜÜüÝÜÝÜCÜþÛÜÜÛÜÛþÜÛÛÜÛÜÛÜÛíÜÛÜÛÛÜÜÛÛÜÜÛÜÛÜÜÛÜÛÛÜýÛÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛùÚÛÛÚÛÚÛÛûÚÛÛÚÛÛøÚÛÚÛÚÛÚÛÛþÚÛÛ?ÚÙ÷ÚÙÚÙÙÚÙÚÙÙÚ ÙþÚÙÙþÚÙÙþÚÙÙÚýÙÚÙÙþÚÙÙûÚÙÙÚÙÙýØÙØØþÙØØýÙØÙÙþØÙÙñØÙÙØØÙØÙØÙØÙØÙØØþÙØØþÙØØÙýØÙØØþÙØAØ× Ø×ØþרØþרØþרØþר Ø×Ø@×Öþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖ×Öþ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×ÖÖÕÕþÖÕÕÖÕþÖÕÕþÖÕÕýÖÕÖÖÕþÖÕÕùÖÕÖÕÕÖÕÕüÖÕÖÕÕþÖÕÕþÔÕÕÔüÕÔÔÕÕþÔÕÕÔÕÔùÕÔÕÔÔÕÔÔøÕÔÕÕÔÕÔÕÕÔÕÔþÕÔoÔþÓÔÔüÓÔÔÓÓþÔÓÓþÔÓÓ÷ÔÓÓÔÓÓÔÔÓÓûÔÓÓÔÓÓþÔÓÓþÔÓÓýÒÓÒÒÓüÒÓÓÒÒíÓÒÓÒÒÓÒÓÓÒÓÓÒÓÓÒÒÓÒÒþÓÒÒÓÒòÓÒÓÓÒÓÒÒÓÒÓÒÓÑÑÒýÑÒÑÑÒÑöÒÑÒÑÑÒÒÑÑÒÒþÑÒÒùÑÒÒÑÒÑÒÒþÑÒÒÑÒ€ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐüÑÐÑÐÐûÑÐÐÑÐÐùÑÐÐÑÐÑÐÐþÑÐÐóÑÐÑÐÐÑÑÐÐÏÐÐÏÏÐÏþÐÏÏÐûÏÐÏÐÏÏÐÏþÐÏÏþÐÏÏÐýÏÐÏÏÐþÏÐÐÎùÏÎÏÏÎÎÏÏöÎÏÎÎÏÏÎÏÎÏÏòÎÏÏÎÏÎÏÏÎÏÏÎÎÏÏÎÏÎÏÎþÍÎÎÍÎþÍÎÎþÍÎÎÍÎüÍÎÍÎ ÎþÍÎÎÍþÎÍ€ÍüÌÍÍÌÌýÍÌÍÍÌÍþÌÍÍüÌÍÍÌÌÍÌÍÌìÍÌÍÍÌÌÍÌÍÌÌÍÌÌÍÌÍÌÍÌÌËÌûËÌËËÌÌþËÌÌËÌ÷ËÌÌËÌËÌÌËËÌüËÌËÌÌüËÌËÌÌùËÌËÌËÌËËþÊËËüÊËÊËËþÊËËûÊËËÊËËÊËþÊËËþÊËËþÊËËþÊËËÊË@ÊÉÊÉþÊÉÉþÊÉÉÊÉùÊÉÉÊÉÊÉÉþÊÉÉûÊÉÉÊÉÉþÊÉÉþÊÉEÉýÈÉÈÈÉÈÉÈøÉÈÉÈÈÉÉÈÈÉÈûÉÈÉÉÈÈÉÈÉÈþÉÈÈÉÈþÇÈÈþÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈùÇÈÇÈÇÇÈÈ@ÇýÆÇÆÆþÇÆÆüÇÆÇÆÆûÇÆÇÇÆÆÇÆþÇÆYÆÿ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕ,çýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæþçææþçææüçæçææçæùçææççÍåþæååæåþæååæýåæååæåþæååûæåæÍ÷äåääåäåäååäåäåúäåäååääýåäååúäåääÍäùãäãääãääþãääþãä äþãääãäãþÍ.ãþÍ.ãþÍâûãâããââãâãâøãâããââãââúãâãâãâ âþÍáþâááûâáââááâþáââ÷áâáââáâáââáûâáâÍáúàáàáàá áýàáààöáàááàááààá áûàááÍ.àþÍ.àþÍßûàßàßààùßààßààßßþàßßùàßàßàßààßþàßßþÍþÞßßûÞßÞÞßßüÞßÞßßþÞßßÞ÷ßÞßÞßÞßßÞÞßùÞßÞÞßÍÞþÝÞÞúÝÞÝÞÝÞÞüÝÞÝÞÞþÍþÜÝ,ÝþÍýÜÝÜÜÝÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜýÝÍ.ÜþÍÜÛÜþÛÜÜöÛÜÛÜÜÛÜÛÜÛÛþÜÛÛÜùÛÜÛÜÛÍÛþÚÛÛüÚÛÚÛÛþÚÛÛÚÛþÚÛ ÛûÚÛÚÍ.ÚþÍÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙÚûÙÚÙÙÚÚýÙÚÙÙüÚÙÍØÙØõÙØØÙØØÙÙØØÙÙúØÙØØÙØØöÙØÙÙØØÙØÙØØÙØýÙÍ.ØþÍרöרר×רØ×ØØûרØ×ØØþרØüררØþÍ.×þÍÖþ×ÖÖü×Ö×ÖÖþ×ÖÖþ×ÖÖû×Ö××ÖÖ×Öü×Ö×ÖÖû×ÖÖÍÖÕûÖÕÕÖÕÕüÖÕÖÕÕþÖÕÕþÖÕÕõÖÕÖÕÖÖÕÕÖÖÕÕûÖÕÕÍöÕÔÕÔÔÕÕÔÕÔÔÕÔùÕÔÕÕÔÕÔÔÕÔÕÔÕøÔÕÔÕÔÕÍ.ÔþÍ.ÔþÍÓþÔÓÓþÔÓÓûÔÓÓÔÓÓùÔÓÓÔÓÔÓÓÔÓûÔÓÓÍûÓÒÒÓÒÒüÓÒÓÒÒùÓÒÓÒÓÓÒÒÓýÒÓÒÒþÓÒÒþÍþÒÑÑÒýÑÒÑÑíÒÑÒÒÑÑÒÒÑÑÒÒÑÒÑÑÒÒÑÑÒþÑÒÒûÑÒÑÍ.ÑþÍ.ÑþÍýÐÑÐÐüÑÐÑÐ ÐùÑÐÑÐÐÑÐÐøÑÐÐÑÐÐÑÐÐþÍÐùÏÐÐÏÏÐÏÏÐÏÐþÏÐÐÏþÐÏÏþÐÏÏúÐÏÐÏÍþÏÎÎÏûÎÏÏÎÏÏüÎÏÎÏ ÏüÎÏÏÎÎúÏÎÏÎÎÏÏþÍüÎÍÍÎÎûÍÎÍÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎÍüÎÍÍ/Í/ÍüÌÍÌÍÍÌüÍÌÌÍÍÌþÍÌÌýÍÌÍÍýÌÍÌÌøÍÌÍÌÌÍÍÌûËÌËËÌÌþËÌÌËÌùËÌÌËÌÌËËÌûËÌËÌËËüÌËÍËúÊËÊËÊËËúÊËÊËÊËËþÊËËüÊËÍ.ÊþÍÉûÊÉÊÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉüÊÉÊÉÉþÍ.ÉþÍúÈÉÈÉÈÉÉþÈÉÉÈÉüÈÉÉÈÈÉÈÉùÈÉÈÉÈÉÈÈÉúÈÉÈÉÍÈüÇÈÇÈÈüÇÈÇÈÈÇÈÇÈÇÈþÇÈÈùÇÈÈÇÈÍ.ÇþÍÆþÇÆ ÆûÇÆÆÇÆÆþÇÆÆüÇÆÇÆÆþÍ.ÆþÍ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕçþæççýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæçæþçææþçæ æùçæçææçæ æçþÍúåæååæååæúåæåææååæåþæååþæååöæåæååæåæÍþäååûäååäååýäåääåòäåäåäåääååääåääåäåüäåÍäþãääþãääùãäããäãääþãääþãääûãääÍ.ãþÍ.ãþÍâúãâãâãââãâûãââãââþãââãâüãâÍâá÷âááââáââááûâáâáââþáââöáâáâááâááââûáââÍýáàááàáüàáàááþàááàáþàááþàááþÍ.àþÍ.àþÍßà ßþàßßàßàßôàßàßßààßßàÍÞßûÞßßÞßßÞßÞßðÞßÞßÞßÞÞßÞÞßÞßÞßßþÍ ÞþÝÞÞúÝÞÝÞÝÞÞþÝÞÞþÝÞÞþÍÝþÜÝÝþÍ ÜþÝÜÜþÝÜÜÝùÜÝÜÜÝÝÜÜþÝÜÜþÍ.ÜþÍÜÛÜþÛÜÜþÛÜÜýÛÜÛÛÜÛõÜÛÛÜÛÜÛÜÜÛÜÜüÛÜÍÛþÚÛÛþÚÛÛþÚÛÛ÷ÚÛÛÚÛÛÚÚÛ ÛþÍ.ÚþÍÙüÚÙÚÙÙþÚÙÙþÚÙÙÚÙþÚÙÙþÚÙÙþÚÙÙýÚÍøÙØØÙØØÙØØ÷ÙØÙØÙØÙÙØØÙøØÙØØÙØÙØØÙØþÍ.ØþÍüררØþרØþרØýר××ýØÍ.×þÍÖþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖþ×ÖÖþ×ÖÖü×Ö×ÖÖþÍøÖÕÕÖÕÖÕÖÖÕðÖÕÖÕÕÖÖÕÕÖÕÖÕÖÕÖÖÕÖúÕÖÕÖÕÖÖÕýÖÍÖÔÕÔÕÔÕÔÕÕÔÔÕÔÕÔÕÕÔÔÕÕÔÕÕÔÕÕÔÔÕÔÕÔÕÔÕÔÔÕÔÕÔÔüÕÔÍ.ÔþÍ-ÔýÓÍÔýÓÔÓÓþÔÓÓùÔÓÔÓÔÔÓÓûÔÓÓÔÓÓþÔÓÓýÔÍùÒÓÒÓÒÒÓÓÒ÷ÓÒÓÓÒÓÒÓÒÒþÓÒÒÓûÒÓÓÍúÑÒÒÑÑÒÒÑÒÑøÒÑÒÑÒÒÑÒÒþÑÒÒÑúÒÑÒÑÑÒÒûÑÒÒÍ.ÑþÍ.ÑþÍÐÑÐÑøÐÑÐÐÑÐÑÐÐþÑÐÐüÑÐÍþÐÏÏûÐÏÐÐÏÏþÐÏÏïÐÏÏÐÏÐÐÏÏÐÐÏÐÏÏÐÏÏûÐÏÐÍþÏÎÎÏÎÏúÎÏÏÎÏÎÎÏýÎÏÎÎþÏÎÎÏÎûÏÎÏÍÎþÍÎÎþÍÎÎþÍÎÎûÍÎÍÍÎÎþÍÎ ÎþÍ/Í/ÍþÍÌÌøÍÌÍÌÍÌÍÌÌþÍÌÌóÍÌÌÍÌÍÌÌÍÍÌÌÍÍþÌÍÍûÌÍÌÍÌÌþÍÌöËÌÌËÌËËÌËÌÌúËÌÌËËÌÌËýÌËÌÌþËÌÌüËÌÍ ËÊ ËÊüËÊÊËËþÊËËþÍ.ÊþÍÉþÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉÊÉüÊÉÍ.ÉþÍÉñÈÉÈÉÈÈÉÈÉÈÉÉÈÉÈÈÉþÈÉÉüÈÉÈÉÉÈÉüÈÉÍûÇÈÈÇÈÈÇÈþÇÈÈþÇÈÈÇÈþÇÈÈþÇÈÈþÍ.ÇþÍ ÆûÇÆÇÇÆÆþÇÆÆþÇÆÆþÍ.ÆþÍ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕ,çýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæþçæ æþçæ æüçæçææþÍåþæååþæååæåûæåææååþæååöæåææååæååææýåÍüäåäååûäåäåääåþäååäåäåûäåäÍäã äþãääþãääãäüãäãääùãäãääÍ.ãþÍ.ãþÍâ÷ãâãâãââãââüãâãââãþâããýâãââãþÍúáâáâáââþáââþáââáâ÷áâáâááâáââòáââáâáâáââáâÍáùàááàáàááüàáàááþàááþàááàýáÍ.àþÍ.àþÍþàßßþàßßýàßààßàßàøßàßßàßàßßàßýàÍßþÞßßþÞßßþÞßßùÞßßÞßÞßßÞßÞßøÞßÞßÞßÍÞþÝÞÞûÝÞÝÝÞÞþÝÞÞþÝÞ ÞþÍ.ÝþÍþÝÜÜþÝÜ ÜÝÜÝöÜÝÜÜÝÝÜÜÝÜÜüÝÜÍ.ÜþÍüÜÛÛÜÜöÛÜÛÜÜÛÜÜÛÜÜÛ÷ÜÛÜÛÜÛÛÜÛÛþÜÛÛüÜÛÛÜÜþÍÛþÚÛÛþÚÛÛÚÛüÚÛÛÚÚÛþÚÛÛüÚÛÚÛÛþÍÚþÙÚÚþÍÙþÚÙÙüÚÙÚÙÙùÚÙÙÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÍØþÙØØòÙØÙØÙÙØØÙØÙÙØÙÙØûÙØÙÙØØöÙØÙØØÙØÙØÙÙýØÍ.ØþÍ Øþר ØþרØþרØüררØþÍ.×þÍÖþ×ÖÖô×Ö×Ö×ÖÖ××Ö×ÖÖþ×ÖÖü×Ö×ÖÖü×Ö×ÖÖþÍãÕÖÕÖÖÕÕÖÕÖÕÕÖÕÖÕÕÖÕÕÖÖÕÖÖÕÕÖÕÕÖýÕÖÕÕøÖÕÕÖÖÕÍþÕÔÔþÕÔÔýÕÔÕÕþÔÕÕöÔÕÕÔÕÕÔÕÔÕÕþÔÕÕþÔÕÕýÔÍ.ÔþÍ.ÔþÍÓüÔÓÔÓÓÔ÷ÓÔÓÔÔÓÓÔÓ ÓûÔÓÓÔÓÓþÍÒþÓÒÒüÓÒÓÒÒÓÒñÓÒÒÓÓÒÒÓÒÒÓÒÒÓÒÒûÓÒÒÍòÒÑÑÒÑÒÒÑÒÒÑÒÑÒÒÑÒÑøÒÑÒÒÑÒÒÑÑÒÑÒþÍ.ÑþÍ.ÑþÍÐþÑÐÐúÑÐÑÐÑÐÐþÍÏüÐÏÐÏÏÐÏÐÏÐÏÐÏþÐÏÏþÐÏÏúÐÏÐÏÍÎøÏÎÎÏÏÎÏÎÎýÏÎÏÏüÎÏÏÎÎÏüÎÏÎÏÏÎúÏÎÏÏÎÏÏþÍ ÎþÍÎÎüÍÎÍÎÎþÍÎ ÎÍ/Í/ÍþÍÌÌþÍÌÌþÍÌÌþÍÌÌþÍÌÌèÍÌÍÍÌÍÌÍÌÌÍÌÌÍÍÌÍÌÌÍÌÌÍþËÌÌøËÌÌËÌÌËÌÌûËÌÌËÌÌ÷ËÌÌËÌÌËËÌÌóËÌËËÌËÌËËÌÌÍËþÊËËøÊËÊËËÊÊËËþÊËËÊýËÊËËùÊËÊËËÍ.ÊþÍÉþÊÉÉùÊÉÉÊÉÊÉÉÊÉûÊÉÉÊÉÉþÊÉÉüÊÉÍ.ÉþÍýÉÈÉÉÈþÉÈÈÉþÈÉÉûÈÉÉÈÉÉüÈÉÈÉÉüÈÉÈÉÉÈþÍÈûÇÈÈÇÈÈÇÈúÇÈÇÈÇÈÈÇÈûÇÈÈÇÈÈþÍ.ÇþÍÆÇÆþÇÆ ÆÇÆûÇÆÆÇÆ ÆþÍ.ÆþÍ)ÿýùG,ÿþ-ÿþ.ÿ.ÿþG.ÿþù/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿþÍÆÆþÅÆ ÆþÅÆÆÅýÆÅÆÆúÅÆÅÆÆÅÅÆÅýÆÅÆÆþÅÆÆÅþÍÅÅþÄÅÅþÄÅÅþÄÅÅüÄÅÄÅÅýÄÅþÍÄ9ÄýÍÄÃÃþÄÃÃþÄÃÃÄÃþÄÃÃÄÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄòÍÂÃÃÂÂÃÂÃÃÂÃÃÂÂÃúÂÃÂÃÃÂÂÃþÂÃÃÂÃÂýÃÂÃÃÂöÃÂÃÂÃÂÃÂÃýÍÅÂ8ÂýÍÊÂÂþÁÂÂþÁ ÂþÁÂÂþÁÂÂÁÂüÁÂÁÂÂÁüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ3ÁþÇÍ5ÍïÍÆÆÅÆÆÅÆÆÅÅÆÅÆÅÅÆÆÅ ÆþÅÆÆúÅÆÅÆÅÆÆöÅÆÅÆÆÅÆÅÆÅÅþÍÅÅøÄÅÅÄÅÅÄÅÅûÄÅÅÄÅÅþÄÅÅþÄÅÅúÄÅÅÄÄÅÅþÄÅÅûÄÅÅÄþÍÄ9ÄýÍÄÃÃÄÃþÄÃÃûÄÃÃÄÃÃÄÃûÄÃÃÄÃÃûÄÃÃÄÃÃüÍÂÂÃÃÂýÃÂÃÃÂþÃÂÂöÃÂÃÂÂÃÂÂÃÂÂÃøÂÃÃÂÂÃÃÂÂöÃÂÃÂÂÃÃÂÃÂÂýÍÄÂ8ÂüÍÉÁÂÂÁýÂÁÂÂôÁÂÂÁÂÂÁÂÁÂÁÂÂþÁÂÂúÁÂÂÁÁÂÂÁÂüÁÂÂüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ)ÁþÀÁÁþÇÍ5ÍúÍÆÆÅÅÆÆöÅÆÅÆÅÅÆÅÅÆÆúÅÆÅÆÅÆ ÆÅüÆÅÅÆÆÅÆúÅÆÆÅÅþÍÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅ ÅþÄÅÅúÄÅÄÅÄÅÅüÍÄÃÄ7ÄýÍÃÄÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃõÍÂÃÃÂÃÂÃÂÃÂÂÃÂÃÂþÃÂÂÃüÂÃÃÂÂÃÂ÷ÃÂÂÃÂÂÃÃÂÂúÃÂÂÃÃýÍÄÂ8ÂýÍÊ ÂþÁÂÂÁ ÂþÁÂÂþÁÂÂÁÂþÁÂÂüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ3ÁþÇÍ5Í;ÿ;ÿ;ÿ;ÿ;ÿ;ÿþùÿ9ÿþGÿ9ÿ:ÿþÿ8ÿþÿ7ÿýGùÿ4ÿÆýÅÆÅÅäÆÅÅÆÆÅÆÆÅÅÆÅÅÆÅÅÆÆÅÆÅÆÆÅÆÆÅÆÆþÅÆÆÅÆûÅÆÆÅÆÆÅÆÅÄøÅÄÅÄÅÄÄÅÅüÄÅÄÅÅþÄÅÅùÄÅÅÄÅÅÄ>ÄÃþÄÃÃøÄÃÃÄÄÃÄà ÃþÄÃÃþÄà ÃþÄÃÃþÄÃÃÂýÃÂÃÃÂþÃÂÂàÃÂÃÂÃÂÃÂÂÃÃÂÃÃÂÃÂÂÃÃÂÃÃÂÃÃÂÃÃÂÂÃÃÂÃýÂÃÂDÂþÁÂÂþÁ ÂþÁÂÂûÁÂÂÁÂÂêÁÂÂÁÂÁÂÁÂÁÂÂÁÂÂÁÂÁÁÂÁÂÂþÁÂÂýÁÂÁ¿ÁþÀÁ=Á?ÍøÅÆÅÆÆÅÆÅÅùÆÅÅÆÅÅÆÆüÅÆÅÆÆûÅÆÅÅÆÆÅýÆÅÆÆÅðÆÅÆÅÆÆÅÆÆÅÅÆÆÅÆÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅÄ Å÷ÄÅÅÄÅÅÄÅÄ?ÄÃþÄÃÃþÄÃÃþÄÃÃøÄÃÄÄÃÃÄÃÃÄøÃÄÃÄÃÃÄà ÃþÄÃÃÂýÃÂÃÃÂüÃÂÃÂÂÃúÂÃÃÂÃÂÂþÃÂÂúÃÂÃÂÂÃÃïÂÃÂÂÃÂÃÂÂÃÂÃÂÃÂÂÃÃýÂÃÂCÂþÁÂÂþÁÂÂÁÂþÁÂÂþÁÂÂþÁ ÂûÁÂÂÁÂÂÁÂÁþÀÁàÁ?ÍþÅÆÆÅÆÅõÆÅÆÅÆÆÅÅÆÅÆÆðÅÆÅÅÆÆÅÅÆÅÆÆÅÆÅÆÆûÅÆÅÅÆÆöÅÆÆÅÅÆÆÅÆÅ ÅþÄÅÅøÄÅÅÄÅÅÄÅÅþÄÅÅþÄÅÅÄÅþÄÅÅþÄÅÅþÄÅÅ?Ä ÃÄ ÃÄûÃÄÃÄÃÃþÄÃÃÄÃüÄÃÄÃÃýÂÃÂÂûÃÂÂÃÂÂþÃÂÂÃÂÃÂÃÂÃûÂÃÂÃÂÂþÃÂÂúÃÂÂÃÃÂÂüÃÂÃÂCÂþÁÂÂþÁÂÂþÁÂÂþÁÂÂþÁÂÂûÁÂÁÁÂÂþÁÂÂÁþÀÁsÁþÀÁÁþÀÁ]Á?ÍÿýÅÆÅÅÆöÅÆÅÆÅÆÆÅÆÅÅÆþÅÆÆþÅÆÆøÅÆÆÅÆÆÅÆÆÅÆþÅÆÆÅÆÄÅûÄÅÄÄÅÅþÄÅÅþÄÅÅÄýÅÄÅÅþÄÅÅþÄÅ Å?ÄÃþÄÃÃÄýÃÄÃÃþÄÃÃþÄà ÃÂýÃÂÃÃÂÃÂÃÂðÃÂÃÂÃÂÂÃÂÂÃÃÂÃÃÂÂþÃÂÂþÃÂÂÃýÂÃÂÂþÃÂHÂþÁÂÂþÁÂÂþÁÂÂüÁÂÂÁÁÂýÁÂÁÁ?ÍøÆÅÆÅÅÆÆÅÅÆýÅÆÅÅÆüÅÆÅÆÆÅÆÅýÆÅÆÆüÅÆÆÅÅÆþÅÆÆþÄÅÅþÄÅÅÄ÷ÅÄÅÄÅÅÄÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅÄ ÅýÄÅÄ>ÄÃþÄÃÃþÄà ÃÄÃþÄÃÃþÄÃÃþÄÃÃÂÃÂøÃÂÃÂÂÃÃÂÂþÃÂÂüÃÂÃÂÂþÃÂÂÃþÂÃÃýÂÃÂÂöÃÂÂÃÃÂÂÃÃÂBÂûÁÂÂÁÂÂÁÂÁÂôÁÂÂÁÂÁÂÂÁÂÁÂÂûÁÂÁÁÂÂÁÂÁ?ÍÅÆæÅÆÅÅÆÅÆÆÅÅÆÆÅÆÆÅÆÆÅÆÆÅÅÆÅÆÆþÅÆÆþÅÆÆÅÆüÅÆÆÅÅ÷ÆÅÆÅÅÄÅÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅÄÅþÄÅÅ?ÄÃúÄÃÄÃÄà ÃþÄÃÃþÄà ÃþÄÃÃÄÃþÄÃÃùÄÃÄÃÃÄÂÂÃÂÃÂÃÂ÷ÃÂÃÂÃÃÂÃÂÂÃýÂÃÂÂþÃÂÂõÃÂÃÂÂÃÃÂÃÃÂÂþÃÂÂÃýÂÃÂ?ÂõÁÂÂÁÂÂÁÂÁÁÂÂþÁÂÂÁÂÁÂüÁÂÁÂÂþÁÂÂþÁÂÂûÁÂÂÁÂÂ÷ÁÂÁÂÂÁÂÂÁpÁþÀÁŒÁ?ÍÿÆûÅÆÅÆÅÅÆÅÆøÅÆÆÅÆÅÅÆÆÅþÆÅÅþÆÅÅÆëÅÆÆÅÆÅÅÆÅÆÅÆÅÅÆÅÅÄÅÄÅÅúÄÅÅÄÄÅÅþÄÅÅÄÅþÄÅÅ@Ä ÃþÄÃÃÄÃþÄÃÃþÄÃÃûÄÃÃÄÃÃÄÃÄüÃÄÄÃÃùÄÃÃÂÃÃÂÂýÃÂÃÃÂÃÂÃÂþÃÂÂýÃÂÃÃÂþÃÂÂöÃÂÂÃÂÂÃÂÃÂÂþÃÂPÂþÁÂÂôÁÂÁÁÂÁÂÁÂÂÁÂÂþÁÂÂþÁÂÂþÁÂÂêÁþÀÁ ÁþÀÁÁ?ÍÆýÅÆÅÅÆþÅÆÆÅÆÅÆûÅÆÆÅÆÆÅþÆÅÅÆûÅÆÆÅÆÆÅÆÅþÄÅÅûÄÅÅÄÅÅþÄÅÅÄÅþÄÅ ÅûÄÅÄÄÅÅÄùÅÄÄÅÅÄÅÅ?ÄÃþÄÃÃôÄÃÄÃÃÄÃÃÄÃÄÃÃþÄà ÃþÄÃÃüÄÃÄÃÃüÄÃÄÃÃþÄÃÃÂÃÂÃýÂÃÂÂùÃÂÂÃÂÃÂÂÃÂÃõÂÃÂÃÃÂÂÃÃÂÃÃÂÃýÂÃÂBÂÁÂþÁÂÂþÁÂÂüÁÂÁÂÂþÁÂÂþÁÂÂÁÂþÁÂÂúÁÂÂÁÁÂÂüÁÂÂÁÿÁ?ÍÆüÅÆÅÆÆÅÆøÅÆÅÆÅÆÅÆÆþÅÆÆùÅÆÅÅÆÅÆÆùÅÆÅÆÆÅÆÆûÅÆÅÅÆÆýÅÆÅÅüÄÅÄÅÅÄÅÄÅÄÅþÄÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅüÄÅÅÄ>ÄÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃÄÃøÄÃÃÂÃÂÃÂÂþÃÂÂþÃÂÂüÃÂÂÃÃÂÃýÂÃÂÂõÃÂÂÃÃÂÃÂÂÃÂÂÃþÂÃÃÂþÃÂTÂÁÂüÁÂÁÂÂþÁÂÂþÁÂÂþÁÂÂúÁÂÂÁÁ Â–ÁþÀÁgÁ?ÍÿÆþÅÆÆüÅÆÆÅÅÆÅÆýÅÆÅÅýÆÅÆÆÅÆÅüÆÅÅÆÆþÅÆÆÅÆÅþÄÅ ÅþÄÅÅ÷ÄÅÅÄÄÅÅÄÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅùÄÅÅÄÄÅÄ>ÄýÃÄà ÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄà ÃþÄÃÃõÂÃÃÂÃÂÃÃÂÃÂÂþÃÂÂüÃÂÃÂÂþÃÂÂ÷ÃÂÂÃÃÂÃÃÂÂÃûÂÃÂÃÂJÂÁýÂÁÂÂþÁÂÂþÁÂÂüÁÂÁÂÂþÁÂÂùÁÂÂÁÂÁÂÂôÁÂÁÂÂÁÂÁÂÂÀÁæÁþÀÁÁ?ÍýÆÅÆÆüÅÆÅÆÆÅÆÅøÆÅÅÆÅÆÅÆÆøÅÆÅÆÅÅÆÅÅÆüÅÆÅÆÆÅÆ÷ÅÆÆÅÆÅÅÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅ?ÄÃóÄÃÄÃÃÄÃÃÄÃÃÄÃÃüÄÃÄÃÃÄÃÄÃûÄÃÃÄÃÃÄÃþÄÃÃøÂÃÂÂÃÂÃÂÂüÃÂÃÂÂþÃÂÂÃöÂÃÂÂÃÂÃÂÂÃÃòÂÃÂÃÂÃÂÂÃÂÂÃÂÃÃÂÃýÂÃÂÂþÃÂWÂþÁÂÂþÁÂÂþÁÂÂÁ?ÍÅÆþÅÆÆþÅÆÆíÅÆÆÅÆÅÅÆÅÆÆÅÆÅÆÅÆÅÆÆþÅÆÆÅÆýÅÆÅÅÆÅÆýÅÆÅÅþÄÅÅþÄÅ ÅÄýÅÄÅ ÅûÄÅÄÄÅÅþÄÅÅÄÅ@ÄÃþÄÃÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃÄûÃÂÃÂÃÃÂþÃÂÂÃýÂÃÂÂûÃÂÂÃÂÂÃúÂÃÂÂÃÂÂþÃÂÂÃÂüÃÂÃÂBÂÁÂüÁÂÁÂÂÁÂþÁÂÂÁÂûÁÂÂÁÂÂþÁ ÂÁ?ÍÿýÆÅÆÆùÅÆÆÅÆÅÆÆÅÆúÅÆÆÅÅÆÆýÅÆÅÅÆÅúÆÅÆÅÅÆÆþÅÆÆþÅÆÆöÅÆÅÆÆÄÄÅÄÅÅþÄÅ ÅúÄÅÄÅÄÅÅùÄÅÅÄÅÄÅÅÄÅÄùÅÄÅÄÅÄÅÅüÄÅÅÄ?Ä ÃþÄÃÃÄÃÄÃþÄÃÃÄÃþÄÃÃÂÃÂÃÂþÃÂÂþÃÂÂýÃÂÃÃÂÃøÂÃÂÃÂÃÃÂÂüÃÂÃÂÂþÃÂÂþÃÂ@ÂûÁÂÂÁÂÂþÁÂÂþÁÂÂûÁÂÂÁÂÂúÁÂÂÁÁÂÂþÁÂÂþÁÂÂþÁÂÂÁÁþÀÁ<Á?ÍÅÆÅÆþÅÆÆÅòÆÅÅÆÆÅÆÅÆÅÆÅÆÅÅÆÅúÆÅÆÅÆÅÅÆþÅÆÆÅþÄÅÅþÄÅÅþÄÅÅøÄÅÅÄÄÅÄÅÅüÄÅÅÄÄÅþÄÅÅÄÅþÄÅÅÄþÃÄÄÃÄÃûÄÃÃÄÃÃüÄÃÄÃÃöÄÃÃÄÃÄÃÃÄÃÃøÄÃÃÄÃÃÄÃÃüÄÃÄÃÃÄÂÃúÂÃÃÂÃÂÂüÃÂÃÂÂþÃÂÂþÃÂÂÃÂÃÂñÃÂÃÂÂÃÂÂÃÂÂÃÂÃÂÂÃDÂþÁÂÂþÁÂÂÁ ÂþÁÂÂÁÂûÁÂÂÁÂÂ~ÁþÀÁ€Á?ÍÆÅüÆÅÅÆÆêÅÆÆÅÅÆÅÅÆÆÅÆÆÅÅÆÅÅÆÆÅÆÆÅÆþÅÆÆöÅÆÅÅÆÆÅÆÅÆÆýÅÄÅÅþÄÅÅþÄÅ ÅöÄÅÄÅÄÅÅÄÄÅÅÄÅþÄÅÅ2ÄþÃÄ ÄÃþÄÃÃüÄÃÄÃÃúÄÃÃÄÄÃÃüÄÃÄÃÃÄÃþÄà ÃüÄÃÄÃÃþÂÃÃÂÃþÂÃÃùÂÃÃÂÃÂÃÃþÂÃÃÂüÃÂÂÃÃÂÃÂüÃÂÂÃÃAÂÁýÂÁ ÂûÁÂÁÁÂÂþÁÂÂùÁÂÂÁÂÁÂÂÁ ÂþÁÂÂþÁÂÂÁ?ÍÿøÆÅÅÆÆÅÅÆÆÅÆþÅÆÆûÅÆÆÅÆÆûÅÆÅÆÅÅþÆÅÅøÆÅÆÆÅÆÅÆÆÅñÆÅÆÆÅÆÆÅÆÅÅÄÅÄÅ ÅþÄÅÅÄÅûÄÅÅÄÅÅþÄÅÅüÄÅÄÅÅÄþÅÄ>ÄÃüÄÃÄà ÃüÄÃÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃ÷ÄÃÄÃÄÄÃÄÃÃþÄÃÃüÂÃÂÃÃÂÃýÂÃÂÂøÃÂÂÃÂÂÃÂÂÃþÂÃÃÂÃýÂÃÂÂÃÂÃFÂþÁÂÂþÁÂÂþÁÂÂ÷ÁÂÂÁÁÂÁÁÂÂüÁÂÁÂÂÁÂþÁÂÂþÁÂÂÁ?ÍûÅÆÆÅÆÆÅÆøÅÆÅÆÆÅÅÆÆÅÆÅÆùÅÆÅÆÅÅÆÆùÅÆÅÅÆÅÆÆ÷ÅÆÅÅÆÅÆÄÅÅûÄÅÄÄÅÅþÄÅÅþÄÅÅüÄÅÄÅÅûÄÅÅÄÅÅÄÅýÄÅÄ+ÄþÃÄÄÃþÄÃÃþÄÃÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃÄÃÂþÃÂÂùÃÂÂÃÂÃÂÂõÃÂÂÃÂÂÃÂÂÃÂÂÃþÂÃÃÂÃÂÃûÂÃÂÃÂ@ÂþÁÂÂþÁÂÂòÁÂÁÁÂÂÁÁÂÂÁÂÁÂÂþÁÂÂïÁÂÁÂÁÂÁÂÂÁÁÂÁÂÂÁÂÂûÁÂÂÁÂÂÁþÀÁúÁ?ÍÆùÅÆÅÅÆÅÆÆÅÆøÅÆÅÆÆÅÅÆÆÅ÷ÆÅÆÅÅÆÅÆÅÅøÆÅÆÅÆÆÅÆÆþÅÆÆÅÆøÄÅÄÅÄÅÄÅÅüÄÅÄÅÅþÄÅÅþÄÅÅþÄÅÅôÄÅÅÄÄÅÄÅÅÄÅÄ>ÄÃþÄÃÃûÄÃÃÄÃÃþÄÃÃþÄà ÃúÄÃÄÃÄÃÃþÄÃÃúÄÃÄÃÃÂÂ÷ÃÂÂÃÂÂÃÃÂÂÃÂÃÂùÃÂÃÂÂÃÂÂþÃÂÂþÃÂÂÃôÂÃÂÃÂÃÂÂÃÂÃÂEÂûÁÂÂÁÂÂþÁÂÂúÁÂÂÁÁÂÂüÁÂÁÂÂþÁÂÂüÁÂÂÁnÁþÀÁÁ?ÍÿþÅÆÆÅùÆÅÅÆÆÅÆÆüÅÆÆÅÅÆþÅÆÆþÅÆÆúÅÆÅÅÍÄÅÄÅùÄÅÅÄÅÄÅ ÅÄÅüÄÅÍ.ÄþÍÃüÄÃÄÃÃþÄÃÃûÄÃÄÄÃÃÄÃþÄÃÃûÄÃÃÍÂÃÂþÃÂÂþÃÂÂüÃÂÃÂÂýÃÂÃÃÂÃÂÃøÂÃÂÃÂÃÍ-ÂýÄÍÂüÁÂÁ ÂþÁÂÂüÁÂÁÂÂýÊÍ,ÁüÂÍÇ,ÁÎ*ÁûÂÎÍÕ(ÁúÃÉÍÎÕ*ÍþÇýÅÆÅÅûÆÅÆÅÆÆüÅÆÅÆÆÅüÆÅÆÅÅþÆÅÅÆýÅÍôÅÄÄÅÅÄÅÄÅÅÄÅÅþÄÅÅÄýÅÄÅÅöÄÅÄÅÅÄÅÅÄÅÅþÍ.ÄþÍýÃÄÃÃþÄÃÃþÄÃÃûÄÃÃÄÃÃÄÃþÍõÂÃÂÂÃÂÂÃÂÂÃÃüÂÃÃÂÂùÃÂÂÃÂÃÂÂþÃÂÂþÃÂÂÃûÂÃÃÍ-ÂýÅÍÂüÁÂÁÂÂûÁÂÂÁÂÂþÁÂÂýÊÍ,ÁüÂÍÇ,ÁÎÁþÀÁ!ÁûÂÎÍÕ(ÁúÃÉÍÎÕ*ÍþÇóÆÅÆÅÆÆÅÆÅÆÆÅÆÆÅðÆÅÆÅÆÅÅÆÅÆÅÆÅÅÆÅÅÆÅøÆÅÆÆÅÅÍÅÄüÅÄÅÄÄÅþÄÅÅüÄÅÄÅÅöÄÅÄÅÅÄÅÅÄÅÅýÄÍ.ÄþÍÃþÄÃÃþÄÃÃÄ ÃþÄÃÃûÄÃÃÄÃÃþÍÂþÃÂÂÃÂüÃÂÂÃÃÂÃÂüÃÂÃÂÂþÃÂÂúÃÂÂÃÍ-ÂýÅÍûÂÁÁÂÁÁ÷ÂÁÂÁÂÁÂÁÂÂþÁÂÂüÁÂÁÂÂûÁÂÂÁÂÂþÁÂÂýÊÍ ÁþÀÁÁüÂÍÇÁþÀÁÁþÀÁÁÎ*ÁûÂÎÍÕÁþÀÁÁúÃÉÍÎÕ*ÍþÇ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ.ÿþù.ÿþG.ÿ-ÿþ,ÿþ)ÿýùG€€€€,(–K %stem-1.7.1/docs/_static/buttons/resources/api.xcf0000664000175000017500000022450313157571677022604 0ustar atagaratagar00000000000000gimp xcf fileôPBœBœ2Bgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) gamma0.45454999804496765µ ˜9 i¥Ê>APIÿ     g '@gimp-text-layer$(text "API") (font "FreeSerif") (font-size 50.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 202.000000) (box-height 62.000000) (box-unit pixels) Ê>¹ € ŒÊ>Õð ` p€€€Ñý‘Yþ þ þû+ÿÜý,öÿ ÿùòÙÀ›Jþû—ÿÿOû)~òÿÿüÖÓîÿÿüï¡?úôÿÿ¿þsÿÿþ[û#[Ëÿÿýþwþpÿÿþ/þ&ÿÿþý>Ïÿÿý ýÚÿÿþŸþÿÿþýìÿÿý¾ þIÿÿýøþÿÿþýFþÿÿþM üµÿÚÿÿþ€ÿþþ×ÿÿþº ú#ýû'ñÿÿýèÿþþ©ÿÿþç úŽÿ«’ÿÿþ`ÿþþ{ÿÿþ ø ïÿ@(þÿÿþÐÿþþeÿÿýþ üfÿÕþ»ÿÿþAÿþþÿÿþè üÒÿjþOÿÿþ±ÿþþºÿÿþ½ û?ÿò ýàÿÿýý#ÿþý ìÿÿþP ü«ÿ”þwÿÿþ‘ÿþþ¡ÿÿýØ ûûÿ*ý÷ÿÿýò ÿþþ_ÿÿýî2 ü„ÿ¾þŸÿÿþr ÿþý=¿ÿÿýî2 ûéÿRþ3ÿÿýÞ ÿø‘zmx—µ×ÿÿý¾, û]ÿãþÇÿÿþR ÿüã“: üÉÿ|þ[ÿÿþà ÿö…ƒ“}aE( û6ÿùýèÿÿþ2 ÿþü¢ÿùØ Øþóÿÿþ£ ÿþýøÿÿýù ÿþü{ÿÖ4 4þÓÿÿþƒ ÿþûâÿq þfÿÿýë ÿþûUÿø ý îÿÿþd ÿþüÄÿ§ þŒÿÿþÓ ÿþû5ÿÿC ý!ýÿÿþDÿþû¬ÿÝþÄÿÿþµþÿÿþû)ýÿþ{ÿÿþ3þÿÿþ/û®ÿÿZþ2ÿÿþµþ0ÿÿþIþUÿÿþ‡ýþÿÿþRþÿÿþ§ü"}üÿÿû÷d. ü%«ÿÿöð‹6=ùÿÿúý < þ>ÿÿþ¦ þpÿ ÿýK2ÿ ÿþÉ þ?€€€À þ/þíÿ ÿýû«0ü;¥ÿÿûêt4þÀÿÿþ[7þkÿÿþ7þTÿÿþì8þAÿÿþÙ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þ@ÿÿþØ8þBÿÿþÚ8þWÿÿþð8þpÿÿþ 7þÉÿÿþl3ûE®ÿÿúóŠ4/þþÿ ÿþ½p€€€€lllle2XPIcon (original)ÿ     . DXP h9p9|9ˆ9”XP Ä"=494I4Y4i4y4‰4™4©4¹7 8ð999 909@9P9`ø& 6þ88Û677899;<=?@@?@>=:7541/+(%#"!!$,õ:KjdJHGECBBCDCùBA@@??==ü>==>>?>â!;Q|}vy}ƒˆŒŽŽŒ‰†ysojd^ZXVUTTUTýQO÷($0@Hp[VVþWVVUVéXZ\^afiloswyz{{zyxvtpn÷:KG@BK|QTTSRúQRSTU÷3LXKCLƒPTTþaTT÷2M]NCN}RTTþmTT÷.JSKEUoSTTS TþSTTþmTTø-IOJEdcTTòSUX\Y[YWXVUTSTTüSXZTTýlUTT÷,HKGEs`STTæS^YV[Z]^^a^]YTSTTafd[XVTSRRúhTSSTò)FGFDz_XTSS^aSSRþSRRSï`g`\]]_bdfhvhea_è%ECFFv^\`SRTNPRSSRQONNOQQïP]QPRSTUUTW_TSTVÖ$ECGJn]Xuš¥¨ª¨§¦§¦§©ª©§ –†vhi—¨£œ“‡~ukgg]\\Ó CDHSnZa`|¬ª{kigghjnrtwy|€ˆ•£§‚xy|ƒˆ’𣩬­«ñAEH[uRSRKjš”X??>ë?BEILO?>>?BCEHJKMMNOï@EI]{RTSROT nD@ @?@?ø@FJ]wSTT÷SQUx¤‹R?@@øAGKckSTT÷SRMh•¨wD@@ùAINr^TTöSPTzŸ_C?@@ùAKO„WTTõSRNb‡§‹\??@@ùBLOUTTSöQMj“§‡^F?@@ùBMP‰VT TòSTZ`pޤ“sRBA?@ @ùEMVxVTTSñZccXQM]£¦Ÿ{T?@ @úHNdjTTéV^abdfefmf\YWVSSUkƒ¤‚B@ @ùJMreSTTþWXXïYi^WY[]adggf_Œ”A@ @ùLMxeSTTSü]aSTTSRûOl¨R@ @ùJNvdSTTûSaXSTTúRQ¤r>@ @ù!KQq`STTúU\aUTSSTúSQŽA@ @ú.KVqXTTëSWbh]_adeei^STTSPt‰F@ @ú>N\ySTTôSZaUWXYXX\YTTúSPvˆF@ @úEQ]QTTøVTTV_UTSSTûSP•}@ @úCQ]}RTT÷U]USRbYSTTSúP^§f?@ @ßAQapSTTU[]\cYYZcbZYWVUTSQSQQ‘F@ @ùDQlcSTTèVY^lacdcmm^]]^_bc…–™R?@ @ú&LP{\TTüWfRSSòR[bSUVWX^pV@ @ú/QO„[TTüVhRTTSaö\XXW^ V??@ @ú,RO[TTùSUTWhSUUT÷X]eedg§R?? @ú+PTvZTTÚVagi}omkgb_\YXYYXd«kVUTRQNLIFCA>>=>>?ù5PapVTTÚSTUWiYTTUVX[^`cdbf𢩬®¬¨ ™“Љ††„}vù CQnrSTTûU[]UTTSëR^XVVWWY\afnv‰ŠŽ’••”ùNRuvSTTûSRZXTTêU`jefggdb_[XVSdUQPPNOùQRttSTTûW\STSSéTSZ]WWVVUUV[^]_sgeedb`ùNTrkSTTûZ]ZYWWþXVVTþUSSøZ[VSRgVSSú"MWu]T T[èZ[\^_`^_`_`_^]][[VTTRdVTTû3PZT TSTóVUTVVUVWYZVSTTüSbVTTúBS[…PTTSTSTý^VTTúFT]‚RSSTþVTTúAZs‰hddõeddb_]YVTSRRSTÞ @Uryouz{{zwtrppsv{~|uoib^\[ZZ[[YûXVUTSS÷HUZVTSSRRöTUWZ\]_``__è`cgnt{…‡†ƒyuroopsuvvuñ9<58BNHEGILMNOOPæQRRSSTTSSRQQPQRVY\chmsuvvtö_F91+%4Ö,†…„ƒ‚†‡‰‹’•–••“Š„zwqi`\VUQOMHKHIMXö7Œ›­ª›š™˜— —÷–•““’’‘ø’“”•’‘‘âQŸ¹»·º»¾ÁÃÄÅÅÄÂÁ¿¼·´±®«§¥¤£¢¡¡ü Ÿž÷7HAi“š³ª¨¨§ó¨©ª««­°²´µ·¹»»øº¹¹·¶´³÷gw|—œº¥§§¦¥¦§÷Z‚†ˆ˜¾¥§§þ¯§§÷W‚‰˜ž»¥§§þ·§§÷Rƒ‘™£´¦§§þ¦§§þ·§§øN~•𬮧§ò¦§©¬ª«ª©©¨¨§¦§§ü¦©«§§ý¦¶§§÷L|}—𴬦§§ò¦­ª¨««¬­­¯®­ª§§÷¯²±«ª¨§¦¥¥ú´§¦¦§òHzz—™¸­©¦¦¥¬®¥¥þ¤¥¥¦ï®²®«¬¬­¯±²³¼´²¯­ìEwz—›¶¬«¬ ž™šœœœ›™™ü›žŸ  óŸ¥ž ¢¢££¥«¤¤þ¦ì@v™ž³¬©µÇÍÏÐÏÏÎÎÏÏÐÐéÎÉ·¬£¢ÃÐÌÇÀ¸²¬¥£¤žžŸ ð8r†›£³ª¯¨³ÑѲ§¦¥¥å§ª¬­®°²µºÄÍз°±²´·ºÁÆÌÐÒÒÐñ3p‰œ§¸¦¦¤š§ÄšŠŠ‰ëŠŒŽ‘’”Š‰ŠŠŒŽ‘’““”•ï1oŒ¨»¦§¦¥Ÿ™¼É©‹ ‹Š‹Šø/pŽž¨¹¦§§÷¥¡¯Ì½—Š‹‹ù.t’Ÿ¬³§§÷¦¤œ¦Àϯ‹‹ù,w˜ ´¬§§õ¦¥ œ°È¿ŸŠ‹‹ù({ž¡¿¨§§õ¦¤¤¸Ï½ŠŠ‹‹ú$}¡¡Å§§ô¦¥¢š§ÁκŸŠ‹‹ù$¡¢Â¨§§¦ó¥¨§¬½ÌÁ­—ŒŒŠ‹ ‹ù+ˆ¡¥¹¨§§¦ñª±°©¢› ³ÌÎʲ˜Š‹ ‹ú/’¡­²§§é¨­¯°±³²²·²¬ª¨§¤ ©µÉ¶Œ‹ ‹ù1𡵰¦§§©ªðµ­©ª«­¯±²²°¤¹ÂŒ‹ ‹ù3¡¸°¦§§¦ü¬¯¦§§¦ú¥ ¨Ï–‹ ‹ù3¢·°¦§§û¦¯©¦§§ú¤šË«Š‹ ‹úE𣵭§§û¬¯§§¦¦§û¦¼´‹ ‹úc›¦µ©§§ë¦©°³¬­¯±±²´­¦§§¦Ÿ©»‹ ‹ú¡ªº¦§§ô¦«¯¨©©ªª©¬ª§§ú¦Ÿªº‹ ‹ú¥«½¥§§ø¨§§¨®§§¦¦§û¦œÁ³‹ ‹úŒ¥«¼¥§§÷¨­§¦¦°ª¦§§÷¦¥¥¡ŸÎ£Š‹ ‹ß‡¥­¶¦§§¨«¬¬°ªª«±°ªª©¨§§¦£ œ—¿¾‹ ‹ú0¤³¯§§è¨ª­¶¯°±°·¶®¬¬­®¯ª¸¼ÀÅ—Š‹ ‹úS›¤»«§§ü©²¥¦¦ó«¯¦§¨©¨¤Ç¶«™‹ ‹úd¤£¿ª§§ü¨³¥§§¦¯ö¬©©¨£É™ŠŠ‹ ‹ú]§£¾ª§§ù¦§§¨´¦§§ö¦©¬²²°©Î–ŠŠ ‹ú\¥¦¹©§§ó¨¯³´Á··µ³°®¬ªªï¨§Ñ§š˜˜—–”“‘ދЉ‰Šù m£­µ¨§§ù¦§§¨´©§§ã¨©«­¯°±¯ªÇÊÏÒÓÒÏÊÆÁ½»º¹¹¸¶´¯ù#‰¤´¶¦§§¬þ¨§§¦í¥¢¦ Ÿœœž £¨­º»¾ÀÁÁù,Ÿ¥¸¸¦§§¦ý«©§§ü®´±²²ñ°®«¨¦¥£¬¢Ÿ›™šù%¤¦·¸¦§§ü©¬¦§§ö¦§¦¦§¦ª¬©¨¨ô¬­¬­º²²±±¯®ù+ž¦¶³¦§§ôª­««©¨©©§¨¨§§¦øª«¨¦¥³¨¦¦úE›¨¸¬§ §«èª««­®®­®¯­®®­­¬««¨§§¦²©§§ûl ª¾§ §¦§¨þ§¨¨ú©ªª¨¦§§ü¦°©§§ú‡§«Á¥§§¦§¦§ý­¨§§û©«¿¦¦§þ¨§§ú„«·Ã±¯¯°ø¯®­¬©¨§¦¦§ø‚§¶»µ¸»»üº¹¸¶¶û·¹»½¾¾ø¼¸µ²®¬«ªªþ«ªª©ü¨§§¦¦ù=‘ª­ª§¦¦§ø¨ª««¬­­¬¬ì­®±´¸»¿ÁÂÂÀ½º¹¶µ´µ·¸¸ïswjm{ƒƒ…‰”—šœœùžŸ¡£¤¥§§¦¥ò¤¥¦§©«®±´·¸¹¸·ô§yfZOB4$ 3ÖRâäàÞßÞßàáãæçëíñóôööôîäÛÓÍŨ ™“ˆ‚|{yw}‹ú]îþýýþ þõÿýüûúúùø÷÷öö÷üöôôü‹ñþýýþøXm`®úþýþþ ýþþ÷š¾®Åÿþüþÿ"ÿ÷ˆÁ·Ìÿþüþÿÿüþûþÿÿ÷‚¾¸Ôÿþýþÿÿüþøþÿÿ÷{¼·àÿþýþÿÿþþÿÿüþøþÿÿ÷w¹·ìÿýýþÿÿúþýüýüýýþÿüþýýÿÿüþùþÿÿøq·´óÿýþÿÿèüýþüüûûüûûüýþÿÿþûúúýýþþÿÿüþùþÿÿ÷l´²ôÿýþýþþûúùüýüüýþøûøúûûüûúúùùöùúûüñd°¸öÿýþû÷òìèèéêêåéèèéìîñóôöóëìîïñòóôõõô÷øùùób®ÅøÿýþûðñòóôôéóðíèãàÝéôòîìèåãáßßáãæçòUªÒüþýýùîéòøðííþîïïúñóõ÷ñïïð÷ñóôõö÷öôðK¥ØþþýÿÿûíæëôêæççæçèþéææçèþéèèþéðJ£Ûÿþýÿÿþüóàéòíç çæçæùF¦ßÿþýÿÿ÷ý÷êåòñéæççùE®çÿþþÿÿøþûîçêöïççù@¶óþýþÿÿõþüõèçïòëçæççù9½üþýþÿÿõþúðèèôòêææççù5¾þþýþÿÿôþýøëçìòñëçæççù9ÅþþýþÿÿþöüôêåéòóîéççùBÓþþýþÿÿþþÿÿòýúûûøìåçðôõðêç çùHåþþýþÿÿûþüûûúúòøúüüýüøñççäéñç çúLîÿýýÿÿþþýýðüùûýýüûûúù÷ôäâôç çúKïÿýýÿÿûüûþÿþþûöåôéç çúNîÿýýÿÿüþúýÿÿúûæðîæç çúlðÿýþÿÿúþýûþþÿÿûþïéïç çú›ôþýþÿÿùýûùüûûúúýùüÿÿûþòßñç çûÈûþýÿÿûýûþþýýýüýÿÿúþòàñèç çûØÿþýÿÿþûÿþûþÿÿþÿúýìêïæç çûÏÿþýÿÿþùûýÿÿûýÿÿ÷þýýöäòìæç çúÍÿþýÿÿþþüü÷úüýýûúýýþþ÷ÿþûòëßêóç çúKÚÿþþÿÿùþýýüøûúúøøûüüûûúïééüòêæç çúðÿýþÿÿüþùþÿÿüþüûþþùûëïñîêç çú”ûÿýþÿÿüþùþÿÿõþûûüýýúéðêççú‡ûÿýþÿÿþýýùþþ÷ýüúú÷çòéææ çú‰úþýþÿÿóþûúùõøøùúûüüýýùùèõíêêééèçæù§úþýþÿÿþüýùüþþýüíûúúøêíðóôööõôòññððññýðïú5Õüýýÿÿûþüüþÿÿ÷þ÷íìëèçäááöäååëììííìúBïÿýýÿÿüþüýÿÿýþûøø÷öõ÷ôïðïìêçæú8ðÿýýÿÿûýûþþÿÿüþýüýýþüýû÷ùùúEìÿýþÿÿýýüýýþþýþþÿøýüþÿÿùýÿÿúníþýþÿÿþþüüûüüýüþÿÿýúþÿÿú¦õþýþÿ ÿ þûýüýþÿÿýûþÿÿúËýþüþÿÿþÿüþûþÿÿúÌÿþüþÿÿþÿùÂþýüýþþÿý%Çþþýþ ý þÿûYÚÿþÿÿ þýüýþýñ*ª®›ŸµºÁÉÐÙáæéëë÷íîñóõùûýþþý™4ú  é CEC>:61*%"  Ô (¾ÞÚÖÒÎɾ»¸¶³±®­¬««ª¦¢žš–‡ysojc\XUT^p…ûJáÿÿêþýüüûúù÷õôóòñðîííìîòöújïÿ%ÿù?b¬úÿ%ÿùeÙí÷þÿ%ÿüvôÿ(ÿüuóÿ(ÿüròÿ(ÿükðÿ(ÿügïÿ(ÿücîÿ(ÿü`íÿ(ÿü[ëÿ(ÿüVéÿ(ÿüTèÿ(ÿüRèÿ(ÿüPçÿ(ÿüMæÿ(ÿüKæÿ(ÿü Kåÿ(ÿü Låÿ(ÿû Låÿ(ÿûMåÿ(ÿûQåÿ(ÿûSæÿ(ÿûUæÿ(ÿû^èÿ(ÿûqîÿ(ÿûˆöÿ(ÿû›üÿ(ÿû "¤ÿ)ÿû *­ÿ)ÿû6¾ÿ)ÿûDÔÿ)ÿûOéÿ)ÿûVóÿ)ÿûbõÿ)ÿû |÷ÿ)ÿú &žúÿ)ÿú +½ýÿ)ÿú .Ðþÿ)ÿû6×ÿ*ÿûFÞÿ*ÿû_éÿ*ÿûvõÿ*ÿû†ýÿ*ÿûŽÿ+ÿû &œÿ+ÿû 0²ÿ+ÿû 6Ìÿ+ÿ÷ j‚”Ëþÿ'ÿÎù*EFC@>?CGKLKKLNOacM.)ý=?A AñCIOTXTF53689?6#öNLJGEDBA@??þ@AAû?NB9#lækjkmnpsvwxyxwvtqkgc_[czE6#öUVXZ[\]^_``_^_÷`bcfqP6#T STû_yA5#TüSTSTTþSTTû_yB6#TSõU]^b]]^\TSTTû_yC6#ñTW_\]b`bb`bbYZTTû_xD9#TðZWXY[[]^a^VXZTWTTû^xE9#ú\XXWWXXõYWVUTT^^]STTû_xF9#ëX[^bdffed`_^\^`gk_TSTTû_vG;#ë[YVTQNMLLNOQTVX`fZRVTTû_tG<#ä§Ÿ˜’ŠŠ‰ˆˆ„ypjifSZaVTT_rH=#ôQV]dnx€‰Ž‘’““ò•œœhhj_WS_pI=#?@?ê>=<<;=?DIq›bd_XUSaoJ?# @òAnU`]`[TbmK?# @òBw†QaVTSTdlK?# @ùC…‚OcUTTûekLA# @ùCMfVTTûfjLA# @ùB™~MhVTTûgiMA# @ùB¡|MhVTTûhgNA# @ùB§{MgWTTûieNB# @ùB¨}SeVTTûjcOB#@ý?><<ö=>>C§|\eVTTûj`OB#@êY‰“’Œ†~w¬tZl^VSTl_OB#@è?F’•€†ˆ‰‰ŠŒ’ndpj\TSo^OB#@úlŸ^NNMMñNPSQWZc_SSs^PB#@øB—ŠYYVUVVòTSSTTWbTSu^PB#@èC¦wT\bghea^]\^_`n^Sw]PB#@ûE¥qPSSRñTVY\^`bq_Sy]QD#@úC¦xNSTTS÷TlTSz\QD#@úC„MSTT÷VcUS|[QC#@ùe XOQSTTöSa]SR}ZRB#@÷?K›ƒraQSTTöWcTTR~ZRA#@ø?l›º„OSTTôST\^STR€YR@#@úBF”QSSóU[e_STTRYR>#?@ô’b]ZZ\fcYSTTúRƒYR:#íog^VQLIM”oS\cc^VTSTTùQ…ZR;"”ö—›Ÿ¦ª®´fQSSTùQ‡ZSC"ôQRW\`gil{WRT TùQˆZSG"ú^\]]^``ûobUSTTùQ‰ZSF"ôTUWYY[[Yc]RT TùQ‰ZSE-"TSýWTSSTùQ‰ZSG="TìU]b[TZ^[Y[VXWPˆZSH@"TäSWYWWVVYcfe`dgcgiglbRˆ[TH=!TäS\heca`jcdgc]cXZ^d\ZP‡[THB2!TûSTUUWWìSXWWZaYY``[_Q†[TMJ@!STSïWfcebhff_Q…[TQN<!ôrkgaZWSQPPQRRïWTVUVVWUQ„[TIG= ároopsw|‚…††ƒ~wqjda`^_`^…dSC;8 Îù$Fm…Ž/ï+Gh~Š„wlho|†ŽŒm)êgt~~yrpsz€…†…„„……’’„R)ý‘’““é’‘ŽŒŒ”—˜”‰wz…‰’#÷œ›™˜—––••þ”••–—û–Ÿ™…#ý²±°°ù±²³´µ¶··ò¶µ´²¯¬ª¨¥©·™|#÷§¨©ª««¬¬­­¬­ù®¯µÃ {#§ ¦§û­·˜{#§ù¦§¦¦§¦§ §û­·™{#§¦ö¨­­°­¬®­¨§§û¬·š|#ñ§©®¬­°®¯¯®¯°©ª§§û¬·š~#§ð«©©ª««¬­¯­¨©«§¨§§û¬·›€#í«©ª©¨©©ªª©¨§¦¦­­«¦§§û¬·œ€#먪¬®°²²±°®®­¬­®³µ®§¦§§û¬¶œ‚#ë¡ Ÿžœ›œ›œŸ¢¤¥§­±ª¦¨§§û¬µž…#úÎÉÿ¼ººî¸µ²«§§©¢ª¯¨§§¬´ž†#õ–™¢©¯µ»¾ÀÁÁòÂÇÇ­³´®©§¬³ž‡#Š‹Šþ‰ˆˆï‰Š‘«Å§°®©¨§­²Ÿ‰# ‹òŒ©» ®¬®¬§®± ‰# ‹ùŒ°¸¯¨§§û¯± ‰# ‹ùŒ¸´œ°¨§§û¯±¡‰# ‹ùÀ³œ²¨§§°ý¢‹# ‹ùƲœ³¨§§û±°¢‹# ‹ùŒË²³¨§§û±¯£‹# ‹ùŒÏ²ž³©§§û²®£‹# ‹ùŒÐ´¢±¨§§û²­£‹#‹ýЉˆˆ‰øŠÎ´©±¨§§û²¬¤‹#‹ê›»ÁÁÀ½¹´¯Ò¯¨¶­¨¦§³«¤‹#‹ùŠÁÁµ¸ººò»À®¯¸µ¬¦§µ«¤‹#‹èŠ¨È žœ››œŸ¡¨«°®¦§·«¥‹#‹èŒÄº£©¨§¨§§¦¦¥¦§¨°§¦¸ª¥‹#‹è࣫°³³²¯­¬¬­®®·­¦¹ª¥‹#‹ûŽÎ¬¡¦¦¥ñ¦¨ª¬­¯°¹­¦ºª¦#‹úŒÍ°Ÿ¦§§¦ø¶¦¦»ª¦Œ#‹úŒ¿¶›¦§§÷¨°§¦¼ª¦‹#‹øŠ£ÉœŸ¤¦§§ö¦¯­§¦¼ª¦‰#‹÷Š’Æ³«§£¦§§ö©°§§¦½©¦‡#‹øŠ¨ÇÛ¹ ¦§§ô¦§¬­¦§¦¾©¦„#‹úŒŽÂ´¡¦¦ó§«±®¦§§¦¿©§#þŠ‹‹ôÁ¶­­«ª¬³±ª¦§§ú¥Àª§v#íª¥ž™–“‘“Áª£«°±­¨§¦§§ù¥Á©¦t"ÀöÂÄÈÍÐÓצ£¦¦§ù¥Âª¦,"šõ ¢§¨¨´¢¤¦§§ù¥Âª¦†3"þ¬««¬ú«µ¯§¦§§ù¥Â©¦ƒ7"ô§¨©ªª««ª°­¥§ §ù¥Ã©¦‚O"§¦ý©§¦¦§ù¥Ã©¦„i" §ù¬®ª§ª¬ªª¨ù¥Âª§†m"§ä¦©ª¨¨§¨©¯°°­°²¯²²±´¯¦Âª§…i%!§ä¦¬²°¯­®³°°±¯¬¯©ª¬°«ª¥Âª§…rX!§þ¦§§é¨©©¦©¨©ª¯ª©®­«­¥Áª§ˆ}s!¦§¦ï©±°±¯²±±­¥Á«§‹€i!ø¶³±­ª¨¦¥¥¦ý©§¨¨ö§¥À«§…zj, þ¶µµñ·¹¼¿ÀÁÁÀ¼¹¶²¯­¬¬ö­¬À¯¦}ea8 Íø6cÇÖÄ/ïAhšºÎDz œ§·ÉÔÒ¢)ñ ²À¸°«¯¸ÁÈÉÈÆÄÄûÆÅÅ{)äôö÷ø÷öôòñïîëèæåäãâÞÙÄÉÑÕÜèÁ#þÿüþÿÒ#þýþýýþÈ#ÿþûýüþÃ#ÿþüýþÃ#ÿþ ÿûþýÿÃ#ÿûþüüûüüþÿûþýÿÃ#úÿýûüüûûúüýüþÿÿûþýÿÅ#ýÿþýýüûùýüüþýþÿÿûþýÿÅ#þüýýþûûüüþÿÿûþýÿÅ#úùúûøüûûùøûþÿÿûþýÿÈ#ëéëêìííïðñóôõ÷÷ø÷÷üþþÿÿûþýÿË#äóðíìêéêëëìëêêçæåèöüûþþÿþýÿÌ#éùëìîïðòóóðòññóíì÷øûýÿþýÿÎ#æçæñçèîëéùûýýÿþýÿÎ#çóîéíúûûüþþýÿÎ#çúïèîúþÿÿûþýÿÎ#çúòçîùþÿÿûþýÿÎ#çúóçðùýÿÿûþýÿÎ#çúõçñøýÿÿþýÿÎ#çúöéóùýÿÿþýÿÎ#çúöêôùþÿÿþýÿÎ#çúöéôúþÿÿþýÿÎ#çæùçõèôùþÿÿþýÿÎ#çýêòóóðòðïöéöøüþÿÿþþÿÎ#çúæçòéèëëðêéêëêö÷ùüþÿþþÿÎ#çéíïåòóòñîííîöüüúûÿÿýþÿÎ#çûôæìûýýüýþ÷ýúþÿýþÿÎ#çúõçôüúùùûüûøøûþýþÿÎ#çüôè÷þþýüûø÷ûþýþÿÎ#çûõèôþÿÿ÷þøþÿýþÿÌ#çûóèïþÿÿ÷þúþÿýþÿË#çøæìïäôúþÿÿûùþÿýþÿÈ#çøèòâæðúþÿÿöþúþÿÿýþÿÅ#çùîõùï÷þÿÿõþüüþÿÿýþÿÁ#çôòêöþÿÿþþüúûÿÿûýþÿº#çõñæôüýýüúûýÿÿûýþÿ¯#úîíëêéèèöñçøüúúüþþÿÿúýþÿ°"óìëíîïóõööèùþÿ ÿúýþÿ¿B"óæåæèçéèçéïüþÿ ÿúýþÿÉM"þúùùø÷öõôñøýÿ ÿúýþÿÅT"þýüüúüþÿ ÿúýþÿÃu"ÿýýþÿ ÿúýþÿÇœ"ÿøþýüýþýüýýþúýþÿÉ£"ÿýþýþþþýûûþüûûöúüþýþÿÈ›<!ÿþüûûþúûûðüûýýüûüýÿýþÿȨ…!ÿþíýþýýüýýüüýüþýþþȸª! ÿïþúûúûúúûüÿýþþȹ›!þýþþÿþõýþÿýþÿȵžB þýþþ ýþøýþþ½–“^ À õ)ä /=LUZ`k|“«ÁÐØÇ:#õ—¤ª­µ¿ÏÝîùþþõÿô] "ýûýÿÿõûº”Œˆ„}B !ÿüŠ!ÿû‘!  ÿû•%  ÿû•&  ÿû•&  ÿû•&  ÿû“&  ÿû“%  ÿû“%  ÿû‘#  ÿü! !ÿûŽ  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿûŽ  ÿû  ÿû‘!  ÿû“"  ÿû–$  ÿûœ'  ÿûª.  ÿûÅ9  ÿûàE  ÿûëO  ÿüðj!ÿûø‘ ÿûþ« ÿüº ÿüÒ7 ÿüïV ÿüþj ÿý~ ÿý§ ÿûëÖš û&@JD>>=â<;::;;<=>ABCDEEFFGIJKKLNQRSSRQQþPý3FEEéFEDCA>:73.($! ù %,18÷      þ?ÔCntpllkjihhfghilqtx}‚„…†ˆŠŒ“•˜¢¥¦§¥¤£¢££ÔXxvwwvwwvtpjc^XQF?92*&# !#$(--/15=??@?CMXdr÷, ö û ?Ýe¤¢¢¡  žš™˜˜šž¤ª¯¶½ÀÄÅÅÈÌÏÕÝàåêðöøøù÷ø÷øúúÔ„³®¯°¯°±®«§ž“Œƒxh]TJ@841048>CGIMR[\\[\dr†™¯ê(B1,'"$(%%&#  û ?ø,@žþÿÿþýúüûûúúùùøüöôõøøùûúûûüò èåãáàÞÜÛÛßÙÔÐÌż´°«¢š—•’Ž‹‹ŒŒ‹Š‹ŽŒŽ•›¢¬µÁÑ 3\WPMJE?==<:7788533420/010/0232346789;=?BDGû  þ þï .ÀøQSUVXYZ[[Zî[^afmry~€~nT;!ä?FKOPQONMLLNPQSTUTTSSRPmYSC#ä &05:?>>=:<<>FHLA7ø $¥ý§¨ªªþ«ªªï¬­°´¶º½¾¾½Í´¦w!ä‚—ž¡¡œš™š £¥¨©©¨§§¦¤³©¦†#ä'4@P`lx}}zwwz~‰‘™„6÷#2B-$üþÿþ þýùüýÿ¶)4!ùÈØæëëêççùéìñõùüÿÿûýþÿÍ#ä"('&$$-=Qc|•¥µº·³±°³»ÂÏÞëÊ6÷(8MfI$üýþþÿÿúþ¦P1 ðÌÓÙÜÝÞáãçìïóùûþÿÿúþŒ"  âIJKMPTZ`ht{…”™œž¢§­¶ÁÉÓÝày!â "#%')+-/12469dNd^dnd~dŽdžd®d¾ghõiii%i5iEiUieø& 6þ88Û677899;<=?@@?@>=:7541/+(%#"!!$,õ:KjdJHGECBBCDCùBA@@??==ü>==>>?>â!;Q|}vy}ƒˆŒŽŽŒ‰†ysojd^ZXVUTTUTýQO÷($0@Hp[VVþWVVUVéXZ\^afiloswyz{{zyxvtpn÷:KG@BK|QTTSRúQRSTU÷3LXKCLƒPTTþaTT÷2M]NCN}RTTþmTT÷.JSKEUoSTTS TþSTTþmTTø-IOJEdcTTòSUX\Y[YWXVUTSTTüSXZTTýlUTT÷,HKGEs`STTæS^YV[Z]^^a^]YTSTTafd[XVTSRRúhTSSTò)FGFDz_XTSS^aSSRþSRRSï`g`\]]_bdfhvhea_è%ECFFv^\`SRTNPRSSRQONNOQQïP]QPRSTUUTW_TSTVÖ$ECGJn]Xuš¥¨ª¨§¦§¦§©ª©§ –†vhi—¨£œ“‡~ukgg]\\Ó CDHSnZa`|¬ª{kigghjnrtwy|€ˆ•£§‚xy|ƒˆ’𣩬­«ñAEH[uRSRKjš”X??>ë?BEILO?>>?BCEHJKMMNOï@EI]{RTSROT nD@ @?@?ø@FJ]wSTT÷SQUx¤‹R?@@øAGKckSTT÷SRMh•¨wD@@ùAINr^TTöSPTzŸ_C?@@ùAKO„WTTõSRNb‡§‹\??@@ùBLOUTTSöQMj“§‡^F?@@ùBMP‰VT TòSTZ`pޤ“sRBA?@ @ùEMVxVTTSñZccXQM]£¦Ÿ{T?@ @úHNdjTTéV^abdfefmf\YWVSSUkƒ¤‚B@ @ùJMreSTTþWXXïYi^WY[]adggf_Œ”A@ @ùLMxeSTTSü]aSTTSRûOl¨R@ @ùJNvdSTTûSaXSTTúRQ¤r>@ @ù!KQq`STTúU\aUTSSTúSQŽA@ @ú.KVqXTTëSWbh]_adeei^STTSPt‰F@ @ú>N\ySTTôSZaUWXYXX\YTTúSPvˆF@ @úEQ]QTTøVTTV_UTSSTûSP•}@ @úCQ]}RTT÷U]USRbYSTTSúP^§f?@ @ßAQapSTTU[]\cYYZcbZYWVUTSQSQQ‘F@ @ùDQlcSTTèVY^lacdcmm^]]^_bc…–™R?@ @ú&LP{\TTüWfRSSòR[bSUVWX^pV@ @ú/QO„[TTüVhRTTSaö\XXW^ V??@ @ú,RO[TTùSUTWhSUUT÷X]eedg§R?? @ú+PTvZTTÚVagi}omkgb_\YXYYXd«kVUTRQNLIFCA>>=>>?ù5PapVTTÚSTUWiYTTUVX[^`cdbf𢩬®¬¨ ™“Љ††„}vù CQnrSTTûU[]UTTSëR^XVVWWY\afnv‰ŠŽ’••”ùNRuvSTTûSRZXTTêU`jefggdb_[XVSdUQPPNOùQRttSTTûW\STSSéTSZ]WWVVUUV[^]_sgeedb`ùNTrkSTTûZ]ZYWWþXVVTþUSSøZ[VSRgVSSú"MWu]T T[èZ[\^_`^_`_`_^]][[VTTRdVTTû3PZT TSTóVUTVVUVWYZVSTTüSbVTTúBS[…PTTSTSTý^VTTúFT]‚RSSTþVTTúAZs‰hddõeddb_]YVTSRRSTÞ @Uryouz{{zwtrppsv{~|uoib^\[ZZ[[YûXVUTSS÷HUZVTSSRRöTUWZ\]_``__è`cgnt{…‡†ƒyuroopsuvvuñ9<58BNHEGILMNOOPæQRRSSTTSSRQQPQRVY\chmsuvvtö_F91+%4Ö,†…„ƒ‚†‡‰‹’•–••“Š„zwqi`\VUQOMHKHIMXö7Œ›­ª›š™˜— —÷–•““’’‘ø’“”•’‘‘âQŸ¹»·º»¾ÁÃÄÅÅÄÂÁ¿¼·´±®«§¥¤£¢¡¡ü Ÿž÷7HAi“š³ª¨¨§ó¨©ª««­°²´µ·¹»»øº¹¹·¶´³÷gw|—œº¥§§¦¥¦§÷Z‚†ˆ˜¾¥§§þ¯§§÷W‚‰˜ž»¥§§þ·§§÷Rƒ‘™£´¦§§þ¦§§þ·§§øN~•𬮧§ò¦§©¬ª«ª©©¨¨§¦§§ü¦©«§§ý¦¶§§÷L|}—𴬦§§ò¦­ª¨««¬­­¯®­ª§§÷¯²±«ª¨§¦¥¥ú´§¦¦§òHzz—™¸­©¦¦¥¬®¥¥þ¤¥¥¦ï®²®«¬¬­¯±²³¼´²¯­ìEwz—›¶¬«¬ ž™šœœœ›™™ü›žŸ  óŸ¥ž ¢¢££¥«¤¤þ¦ì@v™ž³¬©µÇÍÏÐÏÏÎÎÏÏÐÐéÎÉ·¬£¢ÃÐÌÇÀ¸²¬¥£¤žžŸ ð8r†›£³ª¯¨³ÑѲ§¦¥¥å§ª¬­®°²µºÄÍз°±²´·ºÁÆÌÐÒÒÐñ3p‰œ§¸¦¦¤š§ÄšŠŠ‰ëŠŒŽ‘’”Š‰ŠŠŒŽ‘’““”•ï1oŒ¨»¦§¦¥Ÿ™¼É©‹ ‹Š‹Šø/pŽž¨¹¦§§÷¥¡¯Ì½—Š‹‹ù.t’Ÿ¬³§§÷¦¤œ¦Àϯ‹‹ù,w˜ ´¬§§õ¦¥ œ°È¿ŸŠ‹‹ù({ž¡¿¨§§õ¦¤¤¸Ï½ŠŠ‹‹ú$}¡¡Å§§ô¦¥¢š§ÁκŸŠ‹‹ù$¡¢Â¨§§¦ó¥¨§¬½ÌÁ­—ŒŒŠ‹ ‹ù+ˆ¡¥¹¨§§¦ñª±°©¢› ³ÌÎʲ˜Š‹ ‹ú/’¡­²§§é¨­¯°±³²²·²¬ª¨§¤ ©µÉ¶Œ‹ ‹ù1𡵰¦§§©ªðµ­©ª«­¯±²²°¤¹ÂŒ‹ ‹ù3¡¸°¦§§¦ü¬¯¦§§¦ú¥ ¨Ï–‹ ‹ù3¢·°¦§§û¦¯©¦§§ú¤šË«Š‹ ‹úE𣵭§§û¬¯§§¦¦§û¦¼´‹ ‹úc›¦µ©§§ë¦©°³¬­¯±±²´­¦§§¦Ÿ©»‹ ‹ú¡ªº¦§§ô¦«¯¨©©ªª©¬ª§§ú¦Ÿªº‹ ‹ú¥«½¥§§ø¨§§¨®§§¦¦§û¦œÁ³‹ ‹úŒ¥«¼¥§§÷¨­§¦¦°ª¦§§÷¦¥¥¡ŸÎ£Š‹ ‹ß‡¥­¶¦§§¨«¬¬°ªª«±°ªª©¨§§¦£ œ—¿¾‹ ‹ú0¤³¯§§è¨ª­¶¯°±°·¶®¬¬­®¯ª¸¼ÀÅ—Š‹ ‹úS›¤»«§§ü©²¥¦¦ó«¯¦§¨©¨¤Ç¶«™‹ ‹úd¤£¿ª§§ü¨³¥§§¦¯ö¬©©¨£É™ŠŠ‹ ‹ú]§£¾ª§§ù¦§§¨´¦§§ö¦©¬²²°©Î–ŠŠ ‹ú\¥¦¹©§§ó¨¯³´Á··µ³°®¬ªªï¨§Ñ§š˜˜—–”“‘ދЉ‰Šù m£­µ¨§§ù¦§§¨´©§§ã¨©«­¯°±¯ªÇÊÏÒÓÒÏÊÆÁ½»º¹¹¸¶´¯ù#‰¤´¶¦§§¬þ¨§§¦í¥¢¦ Ÿœœž £¨­º»¾ÀÁÁù,Ÿ¥¸¸¦§§¦ý«©§§ü®´±²²ñ°®«¨¦¥£¬¢Ÿ›™šù%¤¦·¸¦§§ü©¬¦§§ö¦§¦¦§¦ª¬©¨¨ô¬­¬­º²²±±¯®ù+ž¦¶³¦§§ôª­««©¨©©§¨¨§§¦øª«¨¦¥³¨¦¦úE›¨¸¬§ §«èª««­®®­®¯­®®­­¬««¨§§¦²©§§ûl ª¾§ §¦§¨þ§¨¨ú©ªª¨¦§§ü¦°©§§ú‡§«Á¥§§¦§¦§ý­¨§§û©«¿¦¦§þ¨§§ú„«·Ã±¯¯°ø¯®­¬©¨§¦¦§ø‚§¶»µ¸»»üº¹¸¶¶û·¹»½¾¾ø¼¸µ²®¬«ªªþ«ªª©ü¨§§¦¦ù=‘ª­ª§¦¦§ø¨ª««¬­­¬¬ì­®±´¸»¿ÁÂÂÀ½º¹¶µ´µ·¸¸ïswjm{ƒƒ…‰”—šœœùžŸ¡£¤¥§§¦¥ò¤¥¦§©«®±´·¸¹¸·ô§yfZOB4$ 3ÖRâäàÞßÞßàáãæçëíñóôööôîäÛÓÍŨ ™“ˆ‚|{yw}‹ú]îþýýþ þõÿýüûúúùø÷÷öö÷üöôôü‹ñþýýþøXm`®úþýþþ ýþþ÷š¾®Åÿþüþÿ"ÿ÷ˆÁ·Ìÿþüþÿÿüþûþÿÿ÷‚¾¸Ôÿþýþÿÿüþøþÿÿ÷{¼·àÿþýþÿÿþþÿÿüþøþÿÿ÷w¹·ìÿýýþÿÿúþýüýüýýþÿüþýýÿÿüþùþÿÿøq·´óÿýþÿÿèüýþüüûûüûûüýþÿÿþûúúýýþþÿÿüþùþÿÿ÷l´²ôÿýþýþþûúùüýüüýþøûøúûûüûúúùùöùúûüñd°¸öÿýþû÷òìèèéêêåéèèéìîñóôöóëìîïñòóôõõô÷øùùób®ÅøÿýþûðñòóôôéóðíèãàÝéôòîìèåãáßßáãæçòUªÒüþýýùîéòøðííþîïïúñóõ÷ñïïð÷ñóôõö÷öôðK¥ØþþýÿÿûíæëôêæççæçèþéææçèþéèèþéðJ£Ûÿþýÿÿþüóàéòíç çæçæùF¦ßÿþýÿÿ÷ý÷êåòñéæççùE®çÿþþÿÿøþûîçêöïççù@¶óþýþÿÿõþüõèçïòëçæççù9½üþýþÿÿõþúðèèôòêææççù5¾þþýþÿÿôþýøëçìòñëçæççù9ÅþþýþÿÿþöüôêåéòóîéççùBÓþþýþÿÿþþÿÿòýúûûøìåçðôõðêç çùHåþþýþÿÿûþüûûúúòøúüüýüøñççäéñç çúLîÿýýÿÿþþýýðüùûýýüûûúù÷ôäâôç çúKïÿýýÿÿûüûþÿþþûöåôéç çúNîÿýýÿÿüþúýÿÿúûæðîæç çúlðÿýþÿÿúþýûþþÿÿûþïéïç çú›ôþýþÿÿùýûùüûûúúýùüÿÿûþòßñç çûÈûþýÿÿûýûþþýýýüýÿÿúþòàñèç çûØÿþýÿÿþûÿþûþÿÿþÿúýìêïæç çûÏÿþýÿÿþùûýÿÿûýÿÿ÷þýýöäòìæç çúÍÿþýÿÿþþüü÷úüýýûúýýþþ÷ÿþûòëßêóç çúKÚÿþþÿÿùþýýüøûúúøøûüüûûúïééüòêæç çúðÿýþÿÿüþùþÿÿüþüûþþùûëïñîêç çú”ûÿýþÿÿüþùþÿÿõþûûüýýúéðêççú‡ûÿýþÿÿþýýùþþ÷ýüúú÷çòéææ çú‰úþýþÿÿóþûúùõøøùúûüüýýùùèõíêêééèçæù§úþýþÿÿþüýùüþþýüíûúúøêíðóôööõôòññððññýðïú5Õüýýÿÿûþüüþÿÿ÷þ÷íìëèçäááöäååëììííìúBïÿýýÿÿüþüýÿÿýþûøø÷öõ÷ôïðïìêçæú8ðÿýýÿÿûýûþþÿÿüþýüýýþüýû÷ùùúEìÿýþÿÿýýüýýþþýþþÿøýüþÿÿùýÿÿúníþýþÿÿþþüüûüüýüþÿÿýúþÿÿú¦õþýþÿ ÿ þûýüýþÿÿýûþÿÿúËýþüþÿÿþÿüþûþÿÿúÌÿþüþÿÿþÿùÂþýüýþþÿý%Çþþýþ ý þÿûYÚÿþÿÿ þýüýþýñ*ª®›ŸµºÁÉÐÙáæéëë÷íîñóõùûýþþý™4ú  é CEC>:61*%"  Ô (¾ÞÚÖÒÎɾ»¸¶³±®­¬««ª¦¢žš–‡ysojc\XUT^p…ûJáÿÿêþýüüûúù÷õôóòñðîííìîòöújïÿ%ÿù?b¬úÿ%ÿùeÙí÷þÿ%ÿüvôÿ(ÿüuóÿ(ÿüròÿ(ÿükðÿ(ÿügïÿ(ÿücîÿ(ÿü`íÿ(ÿü[ëÿ(ÿüVéÿ(ÿüTèÿ(ÿüRèÿ(ÿüPçÿ(ÿüMæÿ(ÿüKæÿ(ÿü Kåÿ(ÿü Låÿ(ÿû Låÿ(ÿûMåÿ(ÿûQåÿ(ÿûSæÿ(ÿûUæÿ(ÿû^èÿ(ÿûqîÿ(ÿûˆöÿ(ÿû›üÿ(ÿû "¤ÿ)ÿû *­ÿ)ÿû6¾ÿ)ÿûDÔÿ)ÿûOéÿ)ÿûVóÿ)ÿûbõÿ)ÿû |÷ÿ)ÿú &žúÿ)ÿú +½ýÿ)ÿú .Ðþÿ)ÿû6×ÿ*ÿûFÞÿ*ÿû_éÿ*ÿûvõÿ*ÿû†ýÿ*ÿûŽÿ+ÿû &œÿ+ÿû 0²ÿ+ÿû 6Ìÿ+ÿ÷ j‚”Ëþÿ'ÿÎù*EFC@>?CGKLKKLNOacM.)ý=?A AñCIOTXTF53689?6#öNLJGEDBA@??þ@AAû?NB9#lækjkmnpsvwxyxwvtqkgc_[czE6#öUVXZ[\]^_``_^_÷`bcfqP6#T STû_yA5#TüSTSTTþSTTû_yB6#TSõU]^b]]^\TSTTû_yC6#ñTW_\]b`bb`bbYZTTû_xD9#TðZWXY[[]^a^VXZTWTTû^xE9#ú\XXWWXXõYWVUTT^^]STTû_xF9#ëX[^bdffed`_^\^`gk_TSTTû_vG;#ë[YVTQNMLLNOQTVX`fZRVTTû_tG<#ä§Ÿ˜’ŠŠ‰ˆˆ„ypjifSZaVTT_rH=#ôQV]dnx€‰Ž‘’““ò•œœhhj_WS_pI=#?@?ê>=<<;=?DIq›bd_XUSaoJ?# @òAnU`]`[TbmK?# @òBw†QaVTSTdlK?# @ùC…‚OcUTTûekLA# @ùCMfVTTûfjLA# @ùB™~MhVTTûgiMA# @ùB¡|MhVTTûhgNA# @ùB§{MgWTTûieNB# @ùB¨}SeVTTûjcOB#@ý?><<ö=>>C§|\eVTTûj`OB#@êY‰“’Œ†~w¬tZl^VSTl_OB#@è?F’•€†ˆ‰‰ŠŒ’ndpj\TSo^OB#@úlŸ^NNMMñNPSQWZc_SSs^PB#@øB—ŠYYVUVVòTSSTTWbTSu^PB#@èC¦wT\bghea^]\^_`n^Sw]PB#@ûE¥qPSSRñTVY\^`bq_Sy]QD#@úC¦xNSTTS÷TlTSz\QD#@úC„MSTT÷VcUS|[QC#@ùe XOQSTTöSa]SR}ZRB#@÷?K›ƒraQSTTöWcTTR~ZRA#@ø?l›º„OSTTôST\^STR€YR@#@úBF”QSSóU[e_STTRYR>#?@ô’b]ZZ\fcYSTTúRƒYR:#íog^VQLIM”oS\cc^VTSTTùQ…ZR;"”ö—›Ÿ¦ª®´fQSSTùQ‡ZSC"ôQRW\`gil{WRT TùQˆZSG"ú^\]]^``ûobUSTTùQ‰ZSF"ôTUWYY[[Yc]RT TùQ‰ZSE-"TSýWTSSTùQ‰ZSG="TìU]b[TZ^[Y[VXWPˆZSH@"TäSWYWWVVYcfe`dgcgiglbRˆ[TH=!TäS\heca`jcdgc]cXZ^d\ZP‡[THB2!TûSTUUWWìSXWWZaYY``[_Q†[TMJ@!STSïWfcebhff_Q…[TQN<!ôrkgaZWSQPPQRRïWTVUVVWUQ„[TIG= ároopsw|‚…††ƒ~wqjda`^_`^…dSC;8 Îù$Fm…Ž/ï+Gh~Š„wlho|†ŽŒm)êgt~~yrpsz€…†…„„……’’„R)ý‘’““é’‘ŽŒŒ”—˜”‰wz…‰’#÷œ›™˜—––••þ”••–—û–Ÿ™…#ý²±°°ù±²³´µ¶··ò¶µ´²¯¬ª¨¥©·™|#÷§¨©ª««¬¬­­¬­ù®¯µÃ {#§ ¦§û­·˜{#§ù¦§¦¦§¦§ §û­·™{#§¦ö¨­­°­¬®­¨§§û¬·š|#ñ§©®¬­°®¯¯®¯°©ª§§û¬·š~#§ð«©©ª««¬­¯­¨©«§¨§§û¬·›€#í«©ª©¨©©ªª©¨§¦¦­­«¦§§û¬·œ€#먪¬®°²²±°®®­¬­®³µ®§¦§§û¬¶œ‚#ë¡ Ÿžœ›œ›œŸ¢¤¥§­±ª¦¨§§û¬µž…#úÎÉÿ¼ººî¸µ²«§§©¢ª¯¨§§¬´ž†#õ–™¢©¯µ»¾ÀÁÁòÂÇÇ­³´®©§¬³ž‡#Š‹Šþ‰ˆˆï‰Š‘«Å§°®©¨§­²Ÿ‰# ‹òŒ©» ®¬®¬§®± ‰# ‹ùŒ°¸¯¨§§û¯± ‰# ‹ùŒ¸´œ°¨§§û¯±¡‰# ‹ùÀ³œ²¨§§°ý¢‹# ‹ùƲœ³¨§§û±°¢‹# ‹ùŒË²³¨§§û±¯£‹# ‹ùŒÏ²ž³©§§û²®£‹# ‹ùŒÐ´¢±¨§§û²­£‹#‹ýЉˆˆ‰øŠÎ´©±¨§§û²¬¤‹#‹ê›»ÁÁÀ½¹´¯Ò¯¨¶­¨¦§³«¤‹#‹ùŠÁÁµ¸ººò»À®¯¸µ¬¦§µ«¤‹#‹èŠ¨È žœ››œŸ¡¨«°®¦§·«¥‹#‹èŒÄº£©¨§¨§§¦¦¥¦§¨°§¦¸ª¥‹#‹è࣫°³³²¯­¬¬­®®·­¦¹ª¥‹#‹ûŽÎ¬¡¦¦¥ñ¦¨ª¬­¯°¹­¦ºª¦#‹úŒÍ°Ÿ¦§§¦ø¶¦¦»ª¦Œ#‹úŒ¿¶›¦§§÷¨°§¦¼ª¦‹#‹øŠ£ÉœŸ¤¦§§ö¦¯­§¦¼ª¦‰#‹÷Š’Æ³«§£¦§§ö©°§§¦½©¦‡#‹øŠ¨ÇÛ¹ ¦§§ô¦§¬­¦§¦¾©¦„#‹úŒŽÂ´¡¦¦ó§«±®¦§§¦¿©§#þŠ‹‹ôÁ¶­­«ª¬³±ª¦§§ú¥Àª§v#íª¥ž™–“‘“Áª£«°±­¨§¦§§ù¥Á©¦t"ÀöÂÄÈÍÐÓצ£¦¦§ù¥Âª¦,"šõ ¢§¨¨´¢¤¦§§ù¥Âª¦†3"þ¬««¬ú«µ¯§¦§§ù¥Â©¦ƒ7"ô§¨©ªª««ª°­¥§ §ù¥Ã©¦‚O"§¦ý©§¦¦§ù¥Ã©¦„i" §ù¬®ª§ª¬ªª¨ù¥Âª§†m"§ä¦©ª¨¨§¨©¯°°­°²¯²²±´¯¦Âª§…i%!§ä¦¬²°¯­®³°°±¯¬¯©ª¬°«ª¥Âª§…rX!§þ¦§§é¨©©¦©¨©ª¯ª©®­«­¥Áª§ˆ}s!¦§¦ï©±°±¯²±±­¥Á«§‹€i!ø¶³±­ª¨¦¥¥¦ý©§¨¨ö§¥À«§…zj, þ¶µµñ·¹¼¿ÀÁÁÀ¼¹¶²¯­¬¬ö­¬À¯¦}ea8 Íø6cÇÖÄ/ïAhšºÎDz œ§·ÉÔÒ¢)ñ ²À¸°«¯¸ÁÈÉÈÆÄÄûÆÅÅ{)äôö÷ø÷öôòñïîëèæåäãâÞÙÄÉÑÕÜèÁ#þÿüþÿÒ#þýþýýþÈ#ÿþûýüþÃ#ÿþüýþÃ#ÿþ ÿûþýÿÃ#ÿûþüüûüüþÿûþýÿÃ#úÿýûüüûûúüýüþÿÿûþýÿÅ#ýÿþýýüûùýüüþýþÿÿûþýÿÅ#þüýýþûûüüþÿÿûþýÿÅ#úùúûøüûûùøûþÿÿûþýÿÈ#ëéëêìííïðñóôõ÷÷ø÷÷üþþÿÿûþýÿË#äóðíìêéêëëìëêêçæåèöüûþþÿþýÿÌ#éùëìîïðòóóðòññóíì÷øûýÿþýÿÎ#æçæñçèîëéùûýýÿþýÿÎ#çóîéíúûûüþþýÿÎ#çúïèîúþÿÿûþýÿÎ#çúòçîùþÿÿûþýÿÎ#çúóçðùýÿÿûþýÿÎ#çúõçñøýÿÿþýÿÎ#çúöéóùýÿÿþýÿÎ#çúöêôùþÿÿþýÿÎ#çúöéôúþÿÿþýÿÎ#çæùçõèôùþÿÿþýÿÎ#çýêòóóðòðïöéöøüþÿÿþþÿÎ#çúæçòéèëëðêéêëêö÷ùüþÿþþÿÎ#çéíïåòóòñîííîöüüúûÿÿýþÿÎ#çûôæìûýýüýþ÷ýúþÿýþÿÎ#çúõçôüúùùûüûøøûþýþÿÎ#çüôè÷þþýüûø÷ûþýþÿÎ#çûõèôþÿÿ÷þøþÿýþÿÌ#çûóèïþÿÿ÷þúþÿýþÿË#çøæìïäôúþÿÿûùþÿýþÿÈ#çøèòâæðúþÿÿöþúþÿÿýþÿÅ#çùîõùï÷þÿÿõþüüþÿÿýþÿÁ#çôòêöþÿÿþþüúûÿÿûýþÿº#çõñæôüýýüúûýÿÿûýþÿ¯#úîíëêéèèöñçøüúúüþþÿÿúýþÿ°"óìëíîïóõööèùþÿ ÿúýþÿ¿B"óæåæèçéèçéïüþÿ ÿúýþÿÉM"þúùùø÷öõôñøýÿ ÿúýþÿÅT"þýüüúüþÿ ÿúýþÿÃu"ÿýýþÿ ÿúýþÿÇœ"ÿøþýüýþýüýýþúýþÿÉ£"ÿýþýþþþýûûþüûûöúüþýþÿÈ›<!ÿþüûûþúûûðüûýýüûüýÿýþÿȨ…!ÿþíýþýýüýýüüýüþýþþȸª! ÿïþúûúûúúûüÿýþþȹ›!þýþþÿþõýþÿýþÿȵžB þýþþ ýþøýþþ½–“^ À õ)ä /=LUZ`k|“«ÁÐØÇ:#õ—¤ª­µ¿ÏÝîùþþõÿô] "ýûýÿÿõûº”Œˆ„}B !ÿüŠ!ÿû‘!  ÿû•%  ÿû•&  ÿû•&  ÿû•&  ÿû“&  ÿû“%  ÿû“%  ÿû‘#  ÿü! !ÿûŽ  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿû  ÿûŽ  ÿû  ÿû‘!  ÿû“"  ÿû–$  ÿûœ'  ÿûª.  ÿûÅ9  ÿûàE  ÿûëO  ÿüðj!ÿûø‘ ÿûþ« ÿüº ÿüÒ7 ÿüïV ÿüþj ÿý~ ÿý§ ÿûëÖš û&@JD>>=â<;::;;<=>ABCDEEFFGIJKKLNQRSSRQQþPý3FEEéFEDCA>:73.($! ù %,18÷      þ?ÔCntpllkjihhfghilqtx}‚„…†ˆŠŒ“•˜¢¥¦§¥¤£¢££ÔXxvwwvwwvtpjc^XQF?92*&# !#$(--/15=??@?CMXdr÷, ö û ?Ýe¤¢¢¡  žš™˜˜šž¤ª¯¶½ÀÄÅÅÈÌÏÕÝàåêðöøøù÷ø÷øúúÔ„³®¯°¯°±®«§ž“Œƒxh]TJ@841048>CGIMR[\\[\dr†™¯ê(B1,'"$(%%&#  û ?ø,@žþÿÿþýúüûûúúùùøüöôõøøùûúûûüò èåãáàÞÜÛÛßÙÔÐÌż´°«¢š—•’Ž‹‹ŒŒ‹Š‹ŽŒŽ•›¢¬µÁÑ 3\WPMJE?==<:7788533420/010/0232346789;=?BDGû  þ þï .ÀøQSUVXYZ[[Zî[^afmry~€~nT;!ä?FKOPQONMLLNPQSTUTTSSRPmYSC#ä &05:?>>=:<<>FHLA7ø $¥ý§¨ªªþ«ªªï¬­°´¶º½¾¾½Í´¦w!ä‚—ž¡¡œš™š £¥¨©©¨§§¦¤³©¦†#ä'4@P`lx}}zwwz~‰‘™„6÷#2B-$üþÿþ þýùüýÿ¶)4!ùÈØæëëêççùéìñõùüÿÿûýþÿÍ#ä"('&$$-=Qc|•¥µº·³±°³»ÂÏÞëÊ6÷(8MfI$üýþþÿÿúþ¦P1 ðÌÓÙÜÝÞáãçìïóùûþÿÿúþŒ"  âIJKMPTZ`ht{…”™œž¢§­¶ÁÉÓÝày!â "#%')+-/12469ÚüÙÚÚÙ ÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÚÙÙîØÙØØÙÙØÙØØÙØØÙØÙÙØØþÙØØñÙØÙØÙØÙØØÙÙØÙÙØØîÙØÙÙØÙØÙØÙÙØØÙØØÙØBØþרØòר×רØ×ØØ×Ø×Ø×רüררØþרØ?×ýÖ×ÖÖü×Ö×ÖÖþ×ÖÖ×ýÖ×ÖÖþ×Ö Ö×Öþ×ÖÖÕþÖÕÕüÖÕÖÕÕþÖÕÕÖöÕÖÕÖÕÕÖÕÖÕÕûÖÕÖÖÕÕìÖÕÖÖÕÖÖÕÖÕÕÖÖÕÖÕÖÕÔÕÕþÔÕÕÔÕþÔÕÕÔÕÔøÕÔÕÕÔÕÔÕÕùÔÕÔÕÕÔÕÕÔÕúÔÕÕÔÔÕÕ€ÔúÓÔÔÓÔÓÓþÔÓÓúÔÓÔÓÔÓÓðÔÓÔÔÓÔÓÓÔÓÓÔÓÓÔÓ ÓÔÓþÔÓÓþÒÓÓñÒÓÒÓÓÒÓÓÒÓÒÒÓÓÒÒÓÒûÓÒÓÓÒÒÓûÒÓÒÓÒÒÓýÒÓÒÒÓúÒÓÑÒÑÒÒþÑÒÒþÑÒÒþÑÒÒþÑÒÒõÑÒÑÒÑÒÒÑÒÑÒÒÑÒûÑÒÑÑÒÒýÑÒÑ~ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐùÑÐÐÑÐÐÑÑÐþÑÐÐøÏÐÐÏÐÏÐÏÏôÐÏÐÏÏÐÏÐÐÏÐÏÏÐÏþÐÏÏüÐÏÐÏÏþÐÏÏþÐÏÏûÐÏÐÐÏÏ÷ÐÏÏÐÎÏÎÏÎÎÏÎÏüÎÏÎÏÏþÎÏÏþÎÏÏÎÏýÎÏÎÎÏÎÏÎÏÎùÏÎÏÎÎÍÎÎþÍÎ ÎþÍÎÎÍÎÍÎþÍÎÎûÍÎÎÍÎÎþÍÎÎýÍÎÍ~ÍÌùÍÌÍÌÌÍÌÌþÍÌÌþÍÌÌÍýÌÍÌÌþÍÌÌÍÌþÍÌÌüËÌÌËËÌþËÌÌËúÌËÌËÌËËýÌËÌÌþËÌÌËÌþËÌÌüËÌËÌÌôËÌÌËÌËËÌÌËËÌÌýËÊËËþÊË ËþÊËËÊüËÊËÊÊËþÊËËÊËüÊËËÊ>ÊÉþÊÉÉÊÉþÊÉÉüÊÉÊÉÉþÊÉÉüÊÉÊÉÉþÊÉEÉÈÉÈÉÈÉþÈÉÉÈÉÈýÉÈÉÉüÈÉÈÉÉøÈÉÉÈÉÈÈÉÉüÈÉÈÉÉýÈÉÈÈþÇÈ ÈþÇÈÈþÇÈÈûÇÈÈÇÈÈüÇÈÇÈ ÈþÇÈÈüÇÈÈÇ ÇþÆÇ1ÇûÆÇÆÇÆÆÇÆûÇÆÆÇÆÆüÇÆÇÆÆÇÆþÇÆÆûÇÆÆÇÆÆþÇÆDÆ?ÍÀçæçæþçææüçæçææçýæçææûçææçææþçææçæþçææüçåæååùæåæåææååüæååææå÷æåæåæååæååþæååþæååþæååþæååüæåæååþäååþäååäåäþåääåûäååäååþäååüäåäååäåòäååäåäååäååäãääþãääãäúãäãäãääþãääøãäãääããää‡ãâøãâãâããâããüâããââóãâãââãâããâãâããâãâãâãâúãââáâáá âáûâáâáââþáââúáâáâáââáúâááâáââáùâááââáââáüàáàááþàááþàááàýáàááàáúàááààááùàáàáààáá‚àßþàßßýàßààßþàßß÷àßßàßßààßßàýßàßßüàßàßßùàßàßàßÞÞûßÞßßÞÞúßÞÞßßÞÞßõÞßßÞßÞßÞßßÞÞßþÞßßÞßüÞßÞßß ÞüÝÞÝÞÞÝüÞÝÝÞÞþÝÞÞúÝÞÞÝÝÞÞüÝÞÝÞÞÝÞþÝÞÞ?ÝÜþÝÜÜÝÜþÝÜÜÝÜûÝÜÜÝÜÜþÝÜÜþÝÜÜúÝÜÜÝÝÜÜûÝÜÜÝÜ@ÜÛÜøÛÜÛÛÜÜÛÜÜÛÜûÛÜÜÛÜÜùÛÜÛÜÛÛÜÜöÛÜÛÜÛÜÛÜÛÜÜÛÚýÛÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛýÚÛÚ>ÚÙÚÙþÚÙÙþÚÙÙþÚÙ ÙþÚÙÙþÚÙÙþÚÙÙØÙØÙØþÙØØÙüØÙØÙÙØîÙØÙØÙØÙØØÙØØÙÙØÙØÙÙØÙNØþרØø×ØØ×Ø×רØþר Øþר Ø?×üÖ×Ö××ýÖ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×ÖÖ××Öú×ÖÖ××ÖÖþ×ÖÖ×ûÖÕÕÖÕÕÖÕÖÕþÖÕÕÖÕÖÕÖÕýÖÕÖÖÕþÖÕÕüÔÕÕÔÔýÕÔÕÕýÔÕÔÔÕþÔÕÕÔÕÔúÕÔÔÕÕÔÔÕþÔÕÕþÔÕÕýÔÕÔ~ÔÓþÔÓÓþÔÓÓüÔÓÔÓ ÓÔÓúÔÓÔÓÔÓÓþÔÓÓóÒÓÓÒÒÓÓÒÒÓÒÓÒÒúÓÒÓÒÒÓÓÒÓÒúÓÒÓÒÓÒÒÓÒôÓÒÓÓÒÒÓÓÑÒÑÒÒÑÒÑÒýÑÒÑÑòÒÑÒÑÑÒÑÑÒÑÒÑÑÒÒÑÒùÑÒÑÒÑÒÑÑþÒÑÑüÒÑÒÑ~ÑýÐÑÐÐÑÐüÑÐÑÐÐþÑÐÐÑÐþÑÐÐÑýÐÏÐÐüÏÐÐÏÏõÐÏÐÏÐÏÏÐÏÐÏÏÐûÏÐÏÏÐÐÏÐÏùÐÏÏÐÏÐÏÏÐÏÐÏûÎÏÏÎÏÏþÎÏÏþÎÏÏÎ÷ÏÎÎÏÏÎÎÏÎÎ ÏÎÏÎÏ ÎÍÎÍÎþÍÎÎþÍÎÎþÍÎ΀ÍÌþÍÌÌþÍÌÌÍÌÍÌÍÌÍùÌÍÍÌÌÍÌÌóÍÌÍÌÌÍÌÍÌÍÌÍÌÌúÍÌÌÍÍÌÌþËÌÌËÌËÌËÌüËÌËÌ ÌËÌËýÌËÌÌýËÌËËÌËÌÊ ËþÊËËÊËüÊËÊËËþÊËËþÊËËÊ Ë?ÊÉþÊÉÉúÊÉÊÉÊÉÉÊÉøÊÉÉÊÉÉÊÉÉþÊÉÉÊÉþÊÉDÉþÈÉÉþÈÉÉþÈÉÉøÈÉÈÈÉÈÉÈÈòÉÈÈÉÈÉÉÈÉÈÈÉÈÉÉÈùÉÈÉÈÈÉÈÈýÉÈÉÉþÈÉÉÈûÇÈÈÇÈ ÈþÇÈÈþÇÈÈþÇÈÈþÇÈÈþÇÈÈùÇÈÈÇÈÈÇAÇÆþÇÆÆþÇÆÆùÇÆÆÇÆÇÆÆþÇÆÆüÇÆÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆ@Æ?ÍçþæççþæçUçþæçCç æûçææçææþçææþçææùçæççæçææüçæçææþçææçæçøæåææåææååüæååææåôæåæååæååæåæååþæå åæåþæååõæåæäååääåäååäûåääåääüåäåääåäåäþåääüåääååùäååääåääãäþãääøãääãääãääûãäããääãäøãäãääããääþãääãâòãâããââããââãâãââãúâããâãââþãââãâþãââãâþãââãâáâüáâáââùáâáââáââáâùáâáââáââáâøáââááâáââöáâáàáàáààááüàáàááþàááàáþàááþàááàáþàááàßàßàßþàßßþàßßðàßßàßßàßßàßßàßàß ßþàßßàßìÞßßÞßßÞßßÞßßÞßßÞßßÞßßüÞßÞßßüÞßÞß ß÷ÞßÞÞßÞßÞßßþÞßßýÞÝÞÞþÝÞÞûÝÞÞÝÞÞÝÞþÝÞÞÝÞþÝÞÞüÝÞÞÝ?Ý ÜûÝÜÜÝÜÜúÝÜÝÜÝÜÜþÝÜÜ÷ÝÜÜÝÜÜÝÝÜÜþÝÜÜþÝÜÜùÝÜÝÝÜÝÜ@ÜÛÜÛÜýÛÜÛÛõÜÛÛÜÜÛÜÛÜÛÜÜúÛÜÛÛÜÛÛÜþÛÜÜþÛÜÜÛÜÛøÚÛÛÚÛÛÚÛÛúÚÛÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛúÚÛÛÚÚÛÛþÚÛÛþÚÛÛ?ÚÙþÚÙÙþÚÙ ÙþÚÙ ÙþÚÙÙÚÙÚÙþÚÙÙØþÙØØþÙØØúÙØØÙÙØØüÙØÙØØÙØþÙØØÙØøÙØØÙÙØÙØØþÙØØÙCØ×úØ×Ø×רØþרØþרØþרØþרØø×ØØ×ØØ×ØØþרØýר×?×Öþ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×Ö×ÖÖø×ÖÖ×ÕÕÖÕÕüÖÕÖÕÕöÖÕÖÕÕÖÕÕÖÕÕÖ ÕÖÕäÖÕÕÖÕÕÖÕÖÕÖÕÕÖÕÖÔÔÕÕÔÕÔÔÕÕÔÕÕÔùÕÔÕÕÔÕÔÔÕ÷ÔÕÕÔÕÕÔÔÕÕüÔÕÔÕÕüÔÕÔÕÕÔÕüÔÕÕÔÔÓûÔÓÓÔÓÓþÔÓÓþÔÓÓúÔÓÔÓÔÓÓûÔÓÓÔÓÓÒÓòÒÓÓÒÒÓÒÒÓÓÒÓÓÒÒûÓÒÓÓÒÒüÓÒÓÒÒÓÒþÓÒÒÓÒÓúÒÓÓÒÑÒÒüÑÒÑÒÒþÑÒÒÑ ÒêÑÒÒÑÑÒÒÑÑÒÑÑÒÑÒÑÑÒÑÒÒÑÑþÒÑÑýÒÑÒÒ€ÑÐþÑÐÐþÑÐÐþÑÐÐûÑÐÐÑÐÐüÑÐÑÐÐþÑÐÐþÏÐÐÏÐÏÐûÏÐÏÏÐÐÏÐ ÏÐúÏÐÏÐÐÏÏþÐÏÏýÐÏÐÐöÏÐÏÏÐÎÏÏÎÏÏùÎÏÎÏÎÎÏÏýÎÏÎÎúÏÎÎÏÏÎÎþÏÎÎûÏÎÎÏÎÎøÏÎÏÎÏÎÏÎÎÏÎûÏÍÎÍÎÎÍ ÎüÍÎÍÎÎüÍÎÍÎÎþÍÎÎÍÎþÍÎÎþÍÎÎüÍÎÎÍ‚ÍûÌÍÍÌÍÍÌùÍÌÍÌÌÍÌÌþÍÌÌþÍÌÌÍþÌÍÍÌÍÌþÍÌÌÍáÌÍËÌËËÌËÌËÌËÌËÌÌËËÌËËÌÌËËÌËÌËËÌÌúËÌËÌËÌÌËòÌËËÌËÌËËÌÌËËÌËËÌýËÌËËþÊËËüÊËÊËËÊËþÊËËÊËýÊËÊÊùËÊÊËËÊËË?ÊýÉÊÉÉÊ ÉÊÉþÊÉÉþÊÉÉþÊÉBÉþÈÉÉÈùÉÈÈÉÉÈÉÉüÈÉÈÉÉ÷ÈÉÉÈÉÉÈÈÉÉøÈÉÉÈÉÈÈÉÉÈÉÈüÉÈÇÈÈþÇÈ ÈüÇÈÇÈÈûÇÈÈÇÈÈûÇÈÈÇÈÈþÇÈ ÈúÇÈÈÇÈÇ?ÇÆþÇÆÆÇÆþÇÆÆþÇÆÆüÇÆÇÆÆÇÆþÇÆÆþÇÆÆþÇÆÆþÇÆ?Æÿ?Í?çþæç}çæçæþçææøçæçæçææççüæççææþçææþçææçûæåææååæåþæååæþåææåæðåæåæååææååæååææååæûåæåæååþæååþäååýäåääåþäåå÷äååääååäååäåäþåääýåäååäþãääûãääãääùãäããäãääüãäãääüãäãääãâõãââãâãâãâãââúãââããââöãâããââãâãââãýâãââøãââãâããââãõâáââáââáâáââáâþáââáþâááâôáââáâáââáâáââáâáâüáâáââáþàááàáþàááüàáàááþàááøàááààáàááþàáá‡àßðàßàßßàßßàßààßßàßßþàßßþàßßöàßßààßßààßßàßòàßàßßàßàÞÞßÞÞßßÞßøÞßÞÞßßÞßßÞßúÞßßÞÞßßôÞßßÞßßÞÞßßÞßßûÞßÞÝÞÞþÝÞÞøÝÞÞÝÞÝÝÞÞûÝÞÞÝÞÞþÝÞÞþÝÞÞþÝÞÞöÝÞÞÝÞÝÝÞÞÝ>ÝÜþÝÜÜÝ ÜþÝÜÜþÝÜÜÝÜÝÜÝDÜúÛÜÜÛÛÜÜûÛÜÜÛÜÜùÛÜÛÛÜÛÜÜþÛÜÜþÛÜÜþÛÜ ÜøÛÜÛÜÛÛÜÛÛþÚÛÛþÚÛÛÚÛþÚÛÛÚÛÚþÙÚÚþÙÚ ÚÙôÚÙÙÚÚÙÚÙÙÚÙÚÚÙùÚÙÙÚÙÚÙÙüÚÙÚÙÙüØÙÙØØÙØýÙØÙÙØþÙØØÙýØÙØØÙØðÙØØÙØÙØÙØÙØÙØÙÙØØüÙØÙØ?Øþר ØþרØüררØþרØþרØôרØ×ØØ×ØØ×רØþרØüרØ×>×Öþ×ÖÖõ×ÖÖ×ÖÖ××Ö×ÖÖ× Ö×Ö× ÖÕûÖÕÕÖÕÕïÖÕÕÖÕÕÖÕÖÕÕÖÕÖÕÖÕÕÖ÷ÕÖÕÖÖÕÕÖÕÕûÖÕÕÖÕÕüÖÕÖÕÕÖÕþÔÕÕÔþÕÔÔþÕÔÔÕýÔÕÔÔÕüÔÕÔÕÕûÔÕÔÔÕÕþÔÕÕýÔÕÔÔþÕÔÔþÕÔ~ÔÓûÔÓÓÔÓÓüÔÓÔÓÓþÔÓÓüÔÓÔÓÓÔÓüÔÓÔÓÓþÔÓÓùÒÓÓÒÒÓÒÒþÓÒÒÓÒ÷ÓÒÒÓÓÒÒÓÒÒ÷ÓÒÓÓÒÓÓÒÓÓýÒÓÒÒþÓÒÒüÑÒÑÒÒÑÒúÑÒÒÑÒÑÑÒþÑÒÒöÑÒÒÑÒÒÑÒÑÒÒÑÒôÑÒÑÑÒÒÑÒÑÒÒÑÑþÒÑÑüÐÑÐÑÑÐÑúÐÑÐÐÑÐÐüÑÐÑÐ ÐüÑÐÑÐÐþÑÐÐþÑÐÐöÏÐÏÐÐÏÐÏÏÐÐýÏÐÏÏÐÏøÐÏÐÏÐÏÏÐÐýÏÐÏÏüÐÏÏÐÐÏÐÏÐ÷ÏÐÏÐÏÏÎÏÎÎÏÎÏ÷ÎÏÎÎÏÎÏÎÏÏþÎÏÏþÎÏÏùÎÏÎÏÎÎÏÏùÎÏÏÎÏÎÏÏÎÏÎüÍÎÍÎÎÍÎúÍÎÎÍÍÎÎöÍÎÍÍÎÍÍÎÍÎÎûÍÎÎÍÎ ÎÍ΀ÍÌþÍÌ ÌôÍÌÍÍÌÍÌÌÍÌÍÌÌþÍÌÌÍÌÍÌÍÌõÍÌÍÌÍÍÌÌËËÌÌýËÌËËÌËÌËýÌËÌÌËöÌËËÌÌËËÌËÌÌËýÌËÌÌËÌþËÌÌËÊËÊËþÊËËúÊËËÊÊËËøÊËËÊËËÊËËþÊËËþÊËËÊËAÊýÉÊÉÉþÊÉÉùÊÉÊÉÉÊÉ ÉüÊÉÊÉÉþÊÉÉþÊÉÉþÊÉIÉ÷ÈÉÈÉÈÉÈÈÉÉÈÉÈÉíÈÉÈÉÉÈÉÈÉÈÈÉÈÈÉÉÈÉÈÈúÉÈÉÈÇÈÈÇýÈÇÈÈüÇÈÇÈÈþÇÈ ÈÇÈÇýÈÇÈÈþÇÈÈ?ÇûÆÇÆÇÆÆþÇÆÆþÇÆÆþÇÆ ÆþÇÆÆþÇÆÆüÇÆÇÆCÆ?Í+çþæçƒçþæçÞçþæççþæçç æþçææûçææçææûçææçææþçææþçææþçææþçææþçææúåæååæåå÷æååæåæåæååýæåææüåæåææåæåõæåæååæåæåæååæåäå÷äåäåääåäååäýåäååþäååäåäýåäååýäåääãäþãääüãäãääãäãäþãääþãääóãääããääãäãäãääãþäã~ãüâããââüãâãââãùâãâããâããâãâñãâããâããâãââãâãââãâáòâáââááââáââááââáûâáâáââøáââáââáâ âáâáþàááà áþàááøàááàááàááàáþàááþàááàßàßýàßààþßààßàøßàßßàßàßßöàßàßßààßàßßàößààßàßàßàßßÞùßÞßßÞÞßßãÞßßÞßÞßÞÞßßÞßÞßÞÞßÞßÞßßÞßÞßÞßßúÞßÞÞßÞÞüßÞßÞÞþßÞÞþÝÞÞøÝÞÞÝÞÞÝÞÞþÝÞÞüÝÞÝÞÞþÝÞÞûÝÞÞÝÞÞþÝÞÞúÝÞÞÝÞÝ6ÝþÜÝÝÜûÝÜÜÝÜÜøÝÜÝÜÜÝÝÜÜþÝÜÜÝÜþÝÜÜþÝÜEÜÛÜÛÜþÛÜÜúÛÜÜÛÜÛÛÜöÛÜÜÛÛÜÛÜÛÜÜìÛÜÛÜÛÛÜÛÛÜÜÛÛÜÛÜÜÛÜÛÛþÚÛÛþÚÛÛûÚÛÛÚÛÛÚÛÚúÛÚÛÛÚÛÛ?ÚÙþÚÙÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÚÙÙüÚÙÚÙÙüÚÙÚÙÙÚÙýØÙØØÙØÙØøÙØÙØÙØÙØØÙØþÙØØÙØþÙØØýÙØÙÙØÙúØÙÙØÙØBØûרØ×ØØþרØþרØöרØ×Ø×ØØ×ØØ×ØþרØ×ýØ×ØØýר×?×ýÖ×ÖÖþ×ÖÖþ×ÖÖ÷×Ö××Ö×Ö×ÖÖþ×ÖÖþ×ÖÖ÷×ÖÕÖÖÕÕÖÕÕÖÕÖÕíÖÕÕÖÕÕÖÕÕÖÕÖÖÕÖÖÕÖÕÕÖýÕÖÕÕÖ÷ÕÖÕÖÖÕÕÖÕÕõÔÕÕÔÕÕÔÕÕÔÕÕþÔÕÕþÔÕÕóÔÕÔÔÕÔÕÔÕÕÔÕÔÔÕøÔÕÔÕÔÕÔÕÕýÔÕÔ~Ô ÓÔÓþÔÓ ÓþÔÓÓþÔÓÓøÔÓÓÔÔÓÔÓÓþÔÓÓþÔÓÓûÔÓÒÒÓÓúÒÓÒÓÓÒÒúÓÒÒÓÓÒÒûÓÒÓÓÒÒÓúÒÓÒÒÓÒÒõÓÒÓÓÒÒÓÒÓÓÒÒòÑÒÒÑÑÒÑÒÑÒÒÑÒÑÑýÒÑÒÒúÑÒÑÒÑÒÒûÑÒÒÑÒÒüÑÒÑÒÒòÑÒÑÑÒÑÒÑÒÑÒÑÑÒÒÑÐÑ ÐÑ ÐþÑÐ ÐüÑÐÑÐÐþÑÐÐüÑÐÐÏÏÐÏûÐÏÏÐÏÏÐÏûÐÏÏÐÏÏúÐÏÐÐÏÐÐüÏÐÐÏÏöÐÏÏÐÏÐÏÐÐÏÏÎüÏÎÎÏÏÎÏøÎÏÎÎÏÏÎÏÏûÎÏÏÎÏÏÎþÏÎÎÏöÎÏÎÏÏÎÎÏÎÏÏþÎÏÏÎÍ ÎþÍÎÎþÍÎÎÍúÎÍÎÎÍÎÎùÍÎÍÎÎÍÎÎþÍÎÎüÍÎÍÎ΃ÍÌúÍÌÍÌÍÌÌÍÌÍûÌÍÌÌÍÍÌÍÌþÍÌÌÍÌõÍÌÌÍÌÍÌÍÌÌÍÍýÌÍÌÌËÌþËÌÌËÌËÌüËÌÌËËüÌËÌËËþÌËËÌûËÌËËÌÌËÊËþÊËËþÊËËÊ÷ËÊËÊËÊËÊËËþÊËËþÊËËüÊËÊËËÊË?ÊúÉÊÉÉÊÉÉÊúÉÊÉÉÊÉÉÊÉþÊÉÉûÊÉÉÊÉÉþÊÉAÉþÈÉÉÈÉþÈÉÉþÈÉÉÈÉüÈÉÉÈÈÉôÈÉÈÉÈÉÈÉÈÉÈÉÉúÈÉÈÈÉÈÈþÇÈÈûÇÈÇÇÈÈþÇÈÈÇÈûÇÈÈÇÈÈ@ÇÆÇÆÇÆøÇÆÇÆÆÇÇÆÆþÇÆÆþÇÆÆþÇÆÆÇÆþÇÆ>Æ?ÍkçþæçRçæþçææûçæççææùçæçææçææþçææþçææþçæ æçþæååýæåææ åþæååýæåææåúæåææåææåùæåææåæååäåéäåääååääååääåäåäåäååäåääþåääñåääåäåäåäåäååäååäþãääãäûãääãääþãä äþãä äñãääããääãääãäãäã€ãâØãâããâãâãââãâãâãââãâããâããâãâããââãââãââãâããâõãââãââããâãââúáâááâááýâáââþáââáñâáâááââáââáâááââáâþáââûáâááââáþàá áôàááàááààááàá áþàááàáüàáàááûàááàáá€àøßààßààßààßàßûàßßàßßàßüàßàßßàößàßàßßàßßààüßààßßÞßÞßþÞßßÞüßÞßÞÞßÞýßÞßßùÞßÞÞßÞßßýÞßÞÞýßÞßßÞÝÞþÝÞÞüÝÞÝÞÞÝÞÝþÞÝÝÞþÝÞÞÝÞüÝÞÝÞÞ?ÝÜþÝÜÜÝÜûÝÜÜÝÜÜþÝÜÜúÝÜÜÝÝÜBÜúÛÜÛÜÜÛÛüÜÛÛÜÜÛÜÛÜûÛÜÛÜÛÛþÜÛÛýÜÛÜÜýÛÜÛÛÜÛüÜÛÚÛÛÚÛþÚÛÛÚÛÚÛúÚÛÚÛÚÛÛÚÛþÚÛÛ?ÚÙÚÙþÚÙÙþÚÙÙùÚÙÚÙÚÚÙÙþÚÙÙ÷ØÙØØÙØØÙØØúÙØÙØØÙÙõØÙÙØÙÙØÙÙØÙÙØÙýØÙØØûÙØÙÙØEØø×Ø×רØ×ØØùררØ×Ø'Ø?×ýÖ×ÖÖû×ÖÖ×ÖÖþ×Ö Öþ×Ö Öþ×ÖÖþ×ÖÖ×ÖÕþÖÕÕýÖÕÖÖýÕÖÕÕÖùÕÖÖÕÖÖÕÕôÖÕÕÖÕÖÕÕÖÕÕÖÖÕþÖÕÕþÖÕÕõÖÕÖÖÕÕÖÕÖÕÔÔÕþÔÕÕøÔÕÕÔÕÕÔÕÕøÔÕÔÔÕÔÔÕÕÔ÷ÕÔÕÔÕÔÕÕÔÔÕýÔÕÔÔûÕÔÕÕÔ~ÔøÓÔÓÔÓÓÔÓÓþÔÓÓûÔÓÓÔÓÓþÔÓÓùÔÓÔÔÓÔÓÓûÔÓÔÔÓÓüÔÓÔÓ ÓÒÓÒþÓÒÒÓôÒÓÒÓÓÒÒÓÒÒÓÒÒþÓÒÒþÓÒÒÓÒÓôÒÓÒÒÓÒÓÒÒÓÑÒÒÑÒÑÒÑ÷ÒÑÒÒÑÒÒÑÒÒÑÒÑÒÑÒöÑÒÑÒÒÑÒÑÑÒÒüÑÒÒÑÑþÒÑ~ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐÑÐùÑÐÐÑÐÑÐÐÑÐþÑÐÐÏÐÏÐýÏÐÏÏòÐÏÏÐÏÏÐÐÏÏÐÏÐÏÏÐÏÐÏþÐÏÏþÐÏÏÐÏöÐÏÏÎÏÏÎÏÎÏÏñÎÏÎÏÎÏÏÎÎÏÎÏÎÎÏÏÎöÏÎÎÏÎÏÏÎÎÏÏõÎÏÎÏÎÏÎÎÏÎÏÏÎÏÍþÎÍÍýÎÍÎÎþÍÎÎÍÎûÍÎÎÍÎÎûÍÎÎÍÎÎûÍÎÍÍÎÎùÍÎÍÎÎÍÎ΀ÍÌûÍÌÌÍÌÌÍÌÍÌÍÌÍþÌÍÍôÌÍÌÍÌÍÌÌÍÌÍÌ ÌþÍÌÌËÌËÌöËÌÌËËÌÌËËÌÌËðÌËËÌËÌÌËËÌÌËÌËËÌÌúËÌËÌËÌÌüËÌÌËËþÊËËþÊË ËÊ ËüÊËÊËËþÊËËÊËúÊËËÊËÊ?ÊÉþÊÉÉûÊÉÉÊÉÉÊÉúÊÉÊÉÊÉÉþÊÉÉþÊÉÉÊÉÊÉÊúÉÊÉÉÊÉ?ÉùÈÉÈÈÉÈÉÉýÈÉÈÈÉÈÉÈÉöÈÉÈÉÈÉÉÈÉÈÈÉûÈÉÉÈÉÉöÈÉÈÉÉÇÈÈÇÈÈþÇÈÈþÇÈÈøÇÈÈÇÈÈÇÈÈþÇÈÈûÇÈÇÈÇ>ÇýÆÇÆÆûÇÆÆÇÆÆÇÆþÇÆÆÇÆûÇÆÆÇÆÆþÇÆÆþÇÆÆþÇÆCÆÿ?ÍFçþæçwçæüçæçææþçæ æûçæççæ æõçææçææççæçææþçææåæýåæååæåæåùæååæååææåþæååæåöæååææåæåæååùæåæåæåææåýæäååäüåäåääåþäååøäåäåäååääåäåýäåääýåäååäåäþåääùåäãäããä äþãääüãäãääþãääûãäããä äþãää‚ãâãâãâûãââãââãâòãâããâãâãâããââããâóãââãââãâãâããââáâáâþáââáâáýâáââûáâáâááâúáââááââáâáûàááàááþàááþàááþàá áþàááüàáàáá€àþßààûßàßàßßàýßàßßãàßàßààßààßààßßààßàßßààßààßßàßßàßàßÞßýÞßÞÞßüÞßßÞÞßÞûßÞÞßÞÞßûÞßÞßÞÞßûÞßÞÞßßÞÝùÞÝÞÝÞÝÞ ÞüÝÞÝÞÞþÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞþÝÞÞ?ÝÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜÝÜþÝÜÜÝBÜþÛÜÜþÛÜÜûÛÜÛÜÛÛÜöÛÜÜÛÜÛÛÜÜÛÛÜÛÜüÛÜÜÛÛüÜÛÜÛÛÜùÛÜÜÛÚÚÛÛþÚÛÛÚÛþÚÛÛÚÛûÚÛÛÚÛÛþÚÛÛþÚÛÛþÚÛÛ@ÚÙÚÙÚÙÚýÙÚÙ ÙûÚÙÙÚÙÙþÚÙÙüÚÙÚØØøÙØÙÙØØÙØØÙòØÙÙØØÙÙØØÙØØÙØØÙØÙñØÙØØÙØØÙÙØÙØÙÙØDØ×ØþרØþרØþרØþרØþרØ×ýØ×ØØùר×ררØùרØ×ØØ×@×Öþ×ÖÖþ×ÖÖþ×ÖÖø×Ö×Ö×Ö×ÖÖþ×Ö Öþ×ÖÖÕþÖÕÕøÖÕÖÕÖÕÖÕÕþÖÕÕûÖÕÕÖÕÕþÖÕÕÖÕûÖÕÕÖÕÕþÖÕÕÖÕÖÕþÔÕÕÔÕüÔÕÔÕÕúÔÕÔÕÔÕÕ÷ÔÕÔÕÔÕÔÕÔÔóÕÔÔÕÕÔÔÕÔÔÕÔÕÕ€ÔúÓÔÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓùÔÓÓÔÓÔÓÓúÒÓÓÒÓÒÒýÓÒÓÓÒòÓÒÒÓÓÒÒÓÒÓÒÓÒÓÓÒÓÒôÓÒÓÒÓÒÓÒÓÒÓÒÒûÑÒÑÑÒÒÑúÒÑÑÒÒÑÑøÒÑÒÑÒÑÒÑÑþÒÑÑÒôÑÒÒÑÑÒÑÒÒÑÑÒÒÑÒÑÒÑÐþÑÐÐþÑÐÐùÑÐÐÑÐÑÐÐþÑÐÐþÑÐÐüÑÐÐÑÑÐûÑÐÐÑÐÐþÑÐÐÏûÐÏÐÐÏÏþÐÏÏÐþÏÐÐûÏÐÐÏÐÐüÏÐÏÐÐÏþÐÏÏåÐÏÏÐÏÏÐÏÐÏÏÐÏÏÐÏÐÎÏÎÏÎÏÎÏÎÏÏùÎÏÏÎÏÎÏÏ÷ÎÏÎÎÏÎÏÎÏÏõÎÏÎÎÏÏÎÏÏÎÏÏþÎÏÏÎÏûÎÏÎÍÎÎþÍÎÎûÍÎÍÍÎÎúÍÎÍÎÍÎÎøÍÎÎÍÎÎÍÎÎþÍÎÎÍ ÎþÍÎ΀ÍÌÍüÌÍÍÌÌûÍÌÍÍÌÌÍÌÍýÌÍÌÌøÍÌÍÌÍÍÌÍÍÌþËÌÌùËÌËÌËÌËËüÌËÌËËùÌËÌËËÌËËüÌËÌËËÌþËÌÌþËÌÌËÌþËÌÌËýÌÊËËÊýËÊË ËÊýËÊËËûÊËËÊËËþÊËËùÊËÊËÊËÊ>ÊÉóÊÉÊÊÉÊÊÉÊÉÉÊÉÉþÊÉÉúÊÉÉÊÊÉÉüÊÉÊÉÉþÊÉAÉÈ÷ÉÈÉÉÈÉÉÈÉÉÈÉÈÉþÈÉÉüÈÉÈÉÉþÈÉÉøÈÉÈÈÉÉÈÉÉÈõÇÈÈÇÈÇÇÈÈÇÈ ÈþÇÈÈþÇÈÈÇÈûÇÈÈÇÈ È÷ÇÈÇÈÇÇÈÈÇ<ÇüÆÇÇÆÆÇÆþÇÆÆÇÆÇýÆÇÆ ÆúÇÆÆÇÇÆEÆ?Íçþæç™çþæç&çþæçóçæþçææþçææûçææçææúçææççææûçææçææüçæçææþçææþçææúçæçææååæüåææååþæååóæååæååæååæååææåæåþæååýæåææåùæåæåæäååþäååþäååþäååöäååääååääååöäååääååääååäåùäååääåääþãää÷ãäãääãäãääüãäãääúãääããääãòäãäãäãääãääãäã~ãøâãâãâããââýãâããâãùâãâãâãââþãââã âýãâããâþáââþáââþáââüáâáââüáâáââüáâáââáðâáâáâáâááââáâáàá áþàááàýáàááþàááüàáàááàáàá€àßàßüàßßààßàßàûßàßàßßàøßààßßàßààüßàßààßàßþÞßßûÞßßÞßßÞßûÞßßÞßßÞßþÞßßÞößÞßÞÞßßÞÞßßþÞßßþÞßßÞþÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞûÝÞÝÝÞÞÝÞÝÞþÝÞÞ@ÝÜþÝÜÜþÝÜ ÜøÝÜÝÝÜÜÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜGÜÛñÜÛÛÜÛÛÜÛÛÜÜÛÛÜÛÛÜÛÜõÛÜÜÛÛÜÛÜÜÛÜÜýÛÜÛÛýÜÛÜÜ÷ÛÜÛÜÜÛÜÚÛÛüÚÛÛÚÚÛþÚÛÛþÚÛÛþÚÛÛ?ÚýÙÚÙÙþÚÙ ÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙ ÙùÚÙÚÙÙØÙÙýØÙØØùÙØÙÙØØÙÙþØÙÙØþÙØØÙüØÙØÙÙùØÙØØÙÙØØ÷ÙØØÙÙØØÙØØþÙØCØþר ØþרØþרØþרØòרØ×ØØ×ØØ×ØØ×ØØø×ØØ×Ø×Ø×>×Öó×ÖÖ×Ö×ÖÖ××Ö×ÖÖþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖþ×ÖÖ÷×Ö×Ö××Ö×ÖÖþ×ÖÖÕÖÕÖÕúÖÕÖÕÕÖÖùÕÖÕÕÖÖÕÕÖÕÖþÕÖÖýÕÖÕÕþÖÕÕúÖÕÖÕÖÕÕÔÕÔøÕÔÕÔÕÔÔÕÕüÔÕÔÕÕùÔÕÔÕÕÔÕÕïÔÕÕÔÔÕÔÔÕÔÕÕÔÕÔÔÕÕþÔÕÕ€ÔýÓÔÓÓþÔÓÓþÔÓÓþÔÓÓÒùÓÒÓÒÓÓÒÒûÓÒÒÓÒÒÓÒÓþÒÓÓÒþÓÒÒÓÒÓ ÒÑÒüÑÒÑÒÒûÑÒÒÑÒÒüÑÒÑÒÒøÑÒÑÒÑÒÑÒÒþÑÒÒþÑÒÒ‚ÑÐüÑÐÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐÑÐþÑÐÐùÏÐÏÐÐÏÐÐíÏÐÏÏÐÏÐÏÐÏÏÐÏÏÐÐÏÐÏÏÐüÏÐÐÏÏøÐÏÏÐÐÏÐÏÏÐïÏÐÏÐÏÎÏÎÏÎÎÏÎÏÎÏÎÎûÏÎÏÎÏÏþÎÏÏÎÏÎôÏÎÏÏÎÎÏÏÎÏÎÏÏùÎÏÎÎÏÎÏÏýÎÏÎÎþÍÎ ÎûÍÎÎÍÎÎþÍÎÎþÍÎÎþÍÎÎûÍÎÎÍÎÎÍÎÍüÌÍÍÌÌÍþÌÍÍÌøÍÌÍÍÌÍÍÌÌöÍÌÌÍÍÌÍÌÌÍÍöÌÍÌÍÌÌÍÌÍÌÌìÍÌÍÍÌÌÍÌÌËÌËÌÌËÌÌËÌËËüÌËËÌÌË÷ÌËÌËËÌËÌËËýÌËÌÌËÌËÌúËÌËÌËÌÌðËÌËÌÌËÊÊËËÊÊËËÊËËÊËþÊËËùÊËËÊËÊËËþÊËËüÊËËÊÊËþÊËËþÊËË?ÊÉüÊÉÊÉÉýÊÉÊÊ ÉþÊÉÉþÊÉÉÊÉþÊÉÉúÊÉÊÉÊÉEÉÈîÉÈÉÈÈÉÈÉÈÉÉÈÉÉÈÉÉÈÈüÉÈÈÉÉÈýÉÈÉÉÈÉüÈÉÈÉÉÈÉüÈÉÉÈÈüÇÈÇÈÈþÇÈÈûÇÈÇÇÈÈÇ ÈÇÈþÇÈÈþÇÈÈÇÈ@ÇÆüÇÆÇÆ ÆþÇÆÆûÇÆÆÇÆÆÇýÆÇÆÆþÇÆÆþÇÆÆÇ?Æ?ÍÀçýæçææçýæçææúçææçæççòæçæçææçæçææççæ æþçææåþæååùæååæååææúåææåæååþæååþæååøæååæåææååæþåææåäùåääååäååûäåäåääúåäååäååùäåäååäååéäååäåääåäåäåäåäåäåääååääòãääããääãäããäãääãäøãäããääãääþãääþãääãäãâøãââãââãââöãââãâãâãâããýâãââãâãâþãââþãââúãââããââ÷áâááââááââáâáøâááââááââóáâááââááâáââááâþáââáþàááþàááþàááúàáàáàááàáþàááþàááüàáàáá„àþßààüßààßßþàßßàþßààüßààßßàßúàßßààßßàýßàßßþàßßÞþßÞÞßþÞßßøÞßßÞÞßÞßßÞþßÞÞþßÞÞßþÞßßÞÝÞÝÞüÝÞÝÞÞõÝÞÞÝÞÞÝÞÞÝÞÞþÝÞÞþÝÞÞþÝÞÞAÝÜþÝÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜöÝÜÝÜÝÜÜÝÝÜÜÝýÜÝÜÜÝ?ÜÛÜûÛÜÜÛÜÜúÛÜÜÛÛÜÜúÛÜÛÛÜÛÛýÜÛÜÜþÛÜÜìÛÜÛÜÜÛÜÛÜÜÛÜÜÛÜÜÛÜÛÜÜþÚÛÛøÚÛÚÛÛÚÚÛÛþÚÛ#ÛþÚÛÛ?ÚýÙÚÙÙþÚÙ ÙúÚÙÙÚÚÙÙþÚÙÙÚÙÚÙþÚÙÙØþÙØØúÙØØÙÙØØÙòØÙØÙØÙØØÙÙØÙÙØØùÙØÙÙØÙØØùÙØÙÙØÙØØûÙØØÙØCØþרØþרØüררØ×ØþרØþרØýר×@×Öþ×ÖÖú×ÖÖ××ÖÖ×Öü×Ö×Ö Ö×Ö×Öø×ÖÖ×ÖÖ×ÖÖÕÖÕÖúÕÖÖÕÖÕÕëÖÕÕÖÖÕÕÖÖÕÕÖÕÖÕÖÖÕÕÖÕÕþÖÕÕþÖÕÕÖûÕÖÕÖÕÕþÖÕÕüÔÕÔÕÕüÔÕÔÕÕûÔÕÔÕÔÔúÕÔÔÕÕÔÔÕþÔÕÕþÔÕÕùÔÕÕÔÕÕÔÔÕýÔÕÔÔüÕÔÕÔÔÓûÔÓÓÔÓÓùÔÓÔÔÓÔÓ ÓÔÓÔÓûÔÓÔÔÓÓþÔÓÓ ÒþÓÒÒþÓÒÒúÓÒÓÒÓÒÒþÓÒÒÓÒÓ÷ÒÓÓÒÒÓÒÓÒÒÓóÒÓÒÓÒÓÒÒÑÒÑÒÑÑÒþÑÒÒÑÒýÑÒÑÑÒÑÒþÑÒÒõÑÒÑÒÑÑÒÒÑÑÒÒ€ÑÐþÑÐÐþÑÐÐÑÐüÑÐÑÐÐùÑÐÑÐÐÑÐÐþÑÐ ÐüÑÐÑÐÐúÑÐÏÏÐÏÏýÐÏÐÐøÏÐÏÐÏÏÐÏ ÏýÐÏÐÐÏÐÏþÐÏÏþÐÏÏþÎÏÏûÎÏÏÎÏÏÎÏÎÏÎþÏÎÎÏúÎÏÏÎÎÏÏÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎûÍÎÍÍÎÎþÍÎÎÍÎþÍÎ ÎÍýÌÍÌÌùÍÌÍÌÌÍÌÌþÍÌÌüÍÌÍÌÌÍÌúÍÌÌÍÌÍÍÌÍÌüÍÌÌÍÍúÌÍËÌËÌÌúËÌÌËÌËËûÌËÌÌËËÌËÌöËÌÌËËÌÌËËÌÌþËÌÌËþÌËËòÌËËÌÌËÌËËÌËËÊËËüÊËÊËËûÊËËÊËËúÊËËÊÊË ËþÊËË@ÊÉüÊÉÊÉ ÉûÊÉÉÊÉÉþÊÉÉÊõÉÊÉÉÊÉÊÉÉÊÉBÉÈýÉÈÉ ÉþÈÉÉÈûÉÈÉÈÉÉüÈÉÈÉÉÈÉþÈÉÉÈÉýÈÇÈ ÈöÇÈÇÈÇÈÈÇÇÈÈÇöÈÇÈÈÇÈÈÇÇÈÈÇÈþÇÈÈ?ÇÆüÇÆÇÆÆûÇÆÆÇÆ ÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆûÇÆÇÇÆ@Æÿ?ÍÀçæþçææþçææþçææûçæççæ æþçææçæþçææýçæççæþçææýåæååæúåæååæååæýåæååôæåææåæååæåæååæåæùåæåææåææþåääåùäåäåääååþäååôäååääåääååäååäøåäåääååääüåääååäûãääãääþãä äûãääãä äãäþãää€ãôâãâãâããâããâããúâããââããþâããâöãââããâãâãââþãââãâþãââãýâãââùãâááââááâûáââáââþáââáøâáâááâáââáýâáââáâþáââúáââáâááþâááþàááüàáàááþàááþàááàúáàááàááüàáàááàáúàáàáàááàßàüßàßààßþàßßþàßßûàßßàßßàüßààßßàýßàßßþàßßëÞßÞßßÞÞßÞßßÞßÞßÞßÞßÞßßóÞßÞßÞÞßßÞÞßÞßßÞýßÞßßþÞßßÞýßÞßßÞüßÞÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞûÝÞÞÝÞÞÝÞþÝÞ Þ+ÝþÜÝÝÜþÝÜÜþÝÜÜûÝÜÜÝÜÜúÝÜÜÝÝÜÜþÝÜÜþÝÜÜüÝÜÝÜÜÝFÜÛøÜÛÛÜÛÜÛÜÜýÛÜÛÛÜüÛÜÛÜÜ÷ÛÜÜÛÜÜÛÜÛÛÜþÛÜÜÛÜùÛÜÜÛÜÜÛÛþÚÛ ÛþÚÛÛûÚÛÛÚÛ ÛþÚÛÛþÚÛ Û@ÚûÙÚÙÚÙÙþÚÙÙûÚÙÚÚÙ ÙþÚÙÙþÚÙÙÚ ÙØþÙØØûÙØÙÙØØûÙØØÙØØ÷ÙØÙØÙØÙØÙÙïØÙØÙØÙØØÙØØÙÙØÙÙØ>Ø×ØþרØþרØ×Ø×ØþרØþרØ×ØþרØþרØûרØ×Ø Ø?×Öþ×Ö Öþ×ÖÖþ×ÖÖþ×ÖÖú×Ö×Ö×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖù×ÖÖÕÖÕÖÖìÕÖÖÕÖÕÖÕÖÖÕÕÖÖÕÖÕÕÖÕÕøÖÕÕÖÕÖÕÖÖÕÖ÷ÕÖÖÕÖÕÕÖÕÕýÔÕÔÔÕüÔÕÕÔÔÕùÔÕÔÔÕÔÕÕþÔÕÕôÔÕÕÔÔÕÔÕÔÔÕÔÔûÕÔÕÔÕÕõÔÕÕÔÔÕÔÔÕÕÔ~ÔýÓÔÓÓãÔÓÓÔÓÔÓÓÔÓÔÓÔÔÓÔÓÓÔÔÓÔÓÓÔÓÓÔÓÓ÷ÔÓÔÓÓÔÓÔÓ ÓÔÓÔüÓÒÓÒÒÓýÒÓÒÒýÓÒÓÓÒþÓÒÒÓüÒÓÓÒÒùÓÒÓÒÒÓÒÒÓýÒÓÒÒþÓÒÒÓýÒÓÒÒÑýÒÑÒÒÑÒöÑÒÑÒÑÒÑÒÑÒÒÑÒÑüÒÑÑÒÒþÑÒÒøÑÒÒÑÒÒÑÒÒüÑÒÒÑ~ÑÐ÷ÑÐÑÐÑÐÑÑÐÐûÑÐÐÑÐÐþÑÐÐþÑÐÐóÑÐÐÑÐÑÐÐÏÐÏÐÏÏÐÏþÐÏÏÐÏúÐÏÐÏÐÏÏþÐÏÏùÐÏÏÐÏÐÏÏûÐÏÏÐÏÏÐûÏÐÏÐÏÏÎÏùÎÏÎÎÏÎÏÏüÎÏÎÏÏþÎÏÏóÎÏÎÏÏÎÎÏÏÎÏÎÏÏÎÏÎþÏÎÎþÏÎÎüÍÎÍÎÎþÍÎÎûÍÎÎÍÎÎíÍÎÎÍÎÎÍÎÎÍÎÎÍÍÎÎÍÍÎÎúÍÎÍÎÍÎÎÍÌ÷ÍÌÍÌÍÍÌÍÌÌüÍÌÍÌÌøÍÌÌÍÌÌÍÌÌþÍÌÌþÍÌÌøÍÌÌÍÌÍÌÍÍÌøÍÌÍËÌÌËÌÌËþÌËËÌòËÌÌËÌÌËÌËÌÌËËÌÌüËÌËÌÌüËÌÌËËúÌËÌËËÌÌËúÊËÊËÊËËþÊËËþÊËËþÊËËúÊËËÊÊËËúÊËËÊËÊ>ÊÉöÊÉÊÉÉÊÊÉÊÉÉûÊÉÉÊÉÉÊÉþÊÉÉÊ÷ÉÊÉÊÊÉÉÊÉÉþÊÉAÉúÈÉÈÉÉÈÈþÉÈÈøÉÈÉÈÈÉÉÈÈýÉÈÉÉüÈÉÉÈÈõÉÈÉÉÈÉÉÈÉÈÉÉþÈÉÉþÈÉÉûÈÉÈÇÈÈþÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈùÇÈÇÈÈÇÈÈ@ÇÆþÇÆÆþÇÆÆôÇÆÆÇÆÇÆÇÆÆÇÆÆüÇÆÇÆÆûÇÆÆÇÆ ÆþÇÆBÆ?Í çþæç"çþæçŒçæûçææçææçæþçææûçææçææþçææþçææþçææþçææöåæåæåæåææååöæåæåæåææåææåæåæõåæåææåææåæååæåûæåææååäýåäååþäååþäååäüåääååüäåäååùäåäååäååäåøäåäåääåääþãä-äþãääúãäãäãää€ãýâãââãâã÷âãâãâããâããâñãâããââããââãâãâããâãüâããââüãâãââáâáþâááâáâáâüáâáââüáâáââáâþáââáâøáâáàáààááúàááààáá÷àáààááàáààáþàááþàááýàáà~àßüàßàßßþàßßüàßàßßöàßàßàßààßààßüàßßààþßààßàýßÞßßÞßüÞßßÞÞùßÞÞßÞßÞÞûßÞÞßÞÞßøÞßÞÞßßÞßßþÞßßþÞßßþÞßßúÞßßÞÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞÝÞþÝÞÞþÝÞÞÝÞÝÞøÝÞÞÝÞÝÝÞÞÝþÜÝ"Ý ÜþÝÜÜþÝÜÜÝÜüÝÜÝÜÜþÝÜHÜÛÜýÛÜÛÛüÜÛÜÛÛøÜÛÜÛÜÜÛÜÜúÛÜÛÜÛÜÜøÛÜÛÛÜÛÜÛÛÜÛÜÛýÜÛÜÜÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛÚÛþÚÛÛÚÛÚÛýÚÛÚÚþÙÚ+ÚýÙÚÙÙÚÙüÚÙÚÙÙûÚÙÙÚÙÙþÚÙÙÚûÙÚÙÚÙÙøÚÙÚÙÙÚÚÙÙîØÙØÙØØÙÙØÙØÙØØÙØØÙÙØÙüØÙÙØØþÙØØÙýØÙØØþÙØØùÙØÙØÙÙØBØþרØùרר×רØþר ØöררØ×ØØ×ØØûר×רØþרØ@×Öþ×ÖÖþ×ÖÖö×Ö×Ö×Ö×Ö×ÖÖû×ÖÖ×ÖÖ×÷Ö××Ö×ÖÖ×ÖÖ×ýÖ×ÖÖþÕÖÖÕöÖÕÖÖÕÕÖÕÖÕ ÕýÖÕÖÖÕÖÕùÖÕÖÕÕÖÕÕÖûÕÖÕÖÕÕþÔÕÕöÔÕÔÔÕÕÔÕÔÕÕÔÕüÔÕÕÔÔýÕÔÕÕûÔÕÕÔÕÕûÔÕÕÔÕÕÔüÕÔÔÕÕÔóÓÔÓÔÓÔÓÓÔÔÓÔÓÓÔÓþÔÓ ÓÔÞÓÔÓÓÔÓÓÔÓÓÔÓÔÓÓÔÓÔÓÓÔÓÓÔÒÒÓÒÒÓÒÒÓÒÒüÓÒÒÓÓÒÓòÒÓÓÒÓÓÒÓÒÓÒÒÓÒÒÓÒÓÒÓòÒÓÒÒÓÒÒÓÒÒÑÒÒÑÑûÒÑÑÒÑÑÒÑÒãÑÒÑÑÒÑÒÑÑÒÑÑÒÑÒÒÑÑÒÒÑÑÒÑÑÒÑÒÑÑüÒÑÑÒÒÑýÐÑÐ ÐþÑÐÐÑÐÑÐüÑÐÑÐÐüÑÐÑÐÐÑÐþÑÐÐÑÏüÐÏÐÏÏþÐÏÏûÐÏÏÐÏÏóÐÏÐÏÏÐÐÏÏÐÏÐÏÏ ÐÏþÐÏÏÐÏÐÏþÎÏÏÎÏÎÏþÎÏÏÎýÏÎÏÏÎúÏÎÏÏÎÏÏúÎÏÏÎÏÎÎÏÎÏ ÎþÍÎÎ÷ÍÎÎÍÎÎÍÍÎÎÍÎÍÎþÍÎÎþÍÎÎýÍÎÍ~ÍÌÍÌøÍÌÌÍÍÌÍÌÌÍÌúÍÌÍÌÌÍÍÌþÍÌÌþÍÌÌÍÌþÍÌÌûËÌËËÌÌùËÌÌËÌËÌÌËÌþËÌÌýËÌËËøÌËÌËÌËËÌÌþËÌÌüËÌÌËËþÊËËþÊËËÊöËÊÊËËÊÊËÊËËûÊËËÊËËÊËÊËûÊËËÊËËAÊüÉÊÊÉÉþÊÉÉÊÉþÊÉ ÉÊÉÊÉúÊÉÉÊÊÉ@ÉþÈÉÉþÈÉÉþÈÉÉöÈÉÉÈÉÈÈÉÈÉÉüÈÉÈÉÉÈðÉÈÉÉÈÈÉÈÉÉÈÉÈÉÈÉÉÈùÉÈÈÇÈÇÈÈÇÈÇúÈÇÈÈÇÈÈûÇÈÈÇÈÈÇÈÇüÈÇÇÈ È?ÇÆþÇÆÆþÇÆÆþÇÆÆÇþÆÇÇùÆÇÇÆÆÇÆÆûÇÆÆÇÆÆþÇÆÆþÇÆ@Æ?ÍþæçäçþæçØçæþçææþçææçæçæüçæçææþçææþçææåúæåæåæååûæåææååþæååæùåææååæåå÷æåæåæåææååæåæüåææååøäåäååääååþäååä åüäååääåäåäåäûãääãääûãäããääþãääãøäãääãäãää€ãþâããâòãââãââãâããâãâããâþãââüãâãââãýâãââþãââáâýáâááâüáâáââáâþáââáâðáâáâáâááââááâáâááþàáá÷àááààááàááüàáàááþàááàáþàá áþàááàßàßüàßßààßüàßàßßüàßàßßûàßààßßàþßààßþàßßýàßààßþÞßßüÞßÞßßþÞßßüÞßÞßßÞûßÞßÞßßõÞßÞßÞßÞßßÞßßÞýßÞßßüÞßßÞÞûÝÞÝÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞýÝÞÝ>ÝÜþÝÜÜùÝÜÜÝÜÝÜÜÝÜûÝÜÝÝÜÜûÝÜÜÝÜÜÝÜüÝÜÝÜÜþÝÜCÜÛýÜÛÜ ÜþÛÜÜýÛÜÛÛúÜÛÜÛÛÜÜþÛÜÜûÛÜÜÛÜÜÛÜõÛÜÛÛÜÚÛÚÛÚÛÛþÚÛÛþÚÛÛþÚÛÛÚ ÛþÚÛÛþÚÛÛþÚÛÛ+ÚþÙÚÚÙûÚÙÙÚÙÙþÚÙ ÙþÚÙÙüÚÙÚÙÙÚÙþÚÙÙþÚÙÙþÚÙÙØþÙØØþÙØØþÙØØÙûØÙØØÙÙØöÙØÙØØÙØÙØÙÙúØÙØÙØÙÙýØÙØDØþרØþרØþרØ×Ø×ýØ×ØØþרØþרØþרØüרØ×>×Öþ×ÖÖû×Ö××ÖÖþ×ÖÖû×Ö××ÖÖ×ýÖ×ÖÖþ×ÖÖ×Öþ×ÕÕÖÕùÖÕÖÕÕÖÕÕÖüÕÖÕÖÖûÕÖÕÕÖÖÕþÖÕÕÖýÕÖÕÕÖúÕÔÕÔÕÔÔÕþÔÕÕÔÕÔÕÔýÕÔÕÕÔüÕÔÕÔÔÕÔþÕÔ~ÔýÓÔÓÓÔÓÔÓþÔÓÓþÔÓ ÓþÔÒÒüÓÒÓÒÒõÓÒÒÓÒÒÓÒÓÒÓÓüÒÓÒÓÓÒþÓÒÒÓøÒÓÓÒÒÓÓÒÒÓïÒÓÓÒÓÒÒÓÒÒÑÒÒÑÒÑÒÒûÑÒÒÑÒÒþÑÒÒÑþÒÑÑþÒÑÑÒþÑÒÒÑÒüÑÒÒÑ~ÑÐþÑÐÐþÑÐÐÑÐÑøÐÑÐÑÐÐÑÐÐþÑÐÐýÏÐÏÏþÐÏÏïÐÏÐÏÐÐÏÐÏÐÏÐÏÐÏÐÏÏÐÏÐüÏÐÐÏÏÐÏõÐÏÏÐÐÏÏÐÏÏÎÎÏÎÏøÎÏÏÎÏÎÎÏÏþÎÏÏÎÏÎÏéÎÏÎÏÎÏÎÏÎÏÏÎÏÏÎÏÎÎÍÎÎÍÎÎÍÎþÍÎÎùÍÎÎÍÎÍÎÎÍýÎÍÎÎùÍÎÎÍÎÍÎÎûÍÎÎÍÎÎýÍÎÍ€ÍúÌÍÍÌÍÌÌÍûÌÍÌÍÌÌÍÌõÍÌÍÌÌÍÌÌÍÍÌÌþÍÌÌùÍÌÍÌÌÍÌÌþÍÌÌþËÌÌþËÌÌüËÌËÌÌËÌúËÌÌËËÌÌþËÌÌùËÌËÌËËÌÌËÌøËÌËÌÌËÌËËþÊËËþÊËËþÊËËûÊËËÊËËþÊËËþÊË ËüÊËÊËË@ÊùÉÊÉÊÉÊÉÉþÊÉÉüÊÉÊÉÉÊÉùÊÉÊÉÉÊÉÉüÊÉÊÉÉúÊÉÊÉÊÉBÉÈøÉÈÈÉÉÈÉÈÈÉíÈÉÈÉÈÉÉÈÉÈÈÉÈÉÈÉÉÈÉÉþÈÉÉÈúÉÈÉÉÈÉÉþÈÉÉýÈÉÈ ÈþÇÈÈþÇÈÈþÇÈÈúÇÈÈÇÈÇÇ ÈþÇÈÈþÇÈ ÈÇþÆÇ'ÇÆþÇÆÆþÇÆÆûÇÆÆÇÆÆüÇÆÇÆÆÇÆøÇÆÇÇÆÆÇÆ ÆþÇÆÆþÇÆCÆÿ?ÍýçæçîçþæçDçþæç†çæþçææïçææçææçææççæçææçææþçæ æûçææçææûçææçææçæûåææåææåæýåæååúæååææååøæåææååæååþæååþæååæþäååäåäûåääåääýåäååüäåäååþäååäåúäååääååäå äþãääþãääþãääãäþãääùãäãäããääþãääüãääã~ãâãâþãââûãâãâããâùãâãââãââûãââãââãâãâãâüãâãââþáââáâþáââáâüáââááâïáââááââáââááââááââûáâáàááüàáàá áþàááûàááàááúàáàáàááþàááüàááà~àóßàßàßßàßàßààßßüàßàßßàßûàßààßß÷àßàßààßàßßàß÷àßßààßÞÞßßûÞßßÞßßýÞßÞÞòßÞßÞßßÞßÞßßÞÞßßÞßÞïßÞÞßÞßÞÞßßÞÞßßÞÞßßÞüÝÞÝÞ ÞøÝÞÞÝÞÞÝÞÞüÝÞÝÞÞ?ÝýÜÝÜÜÝÜüÝÜÝÜÜþÝÜÜüÝÜÝÜÜùÝÜÜÝÜÝÜÜúÝÜÜÝÝÜÜûÝÜÝÜÝÝEÜ÷ÛÜÜÛÜÛÛÜÛÛÜþÛÜÜþÛÜÜûÛÜÛÜÛÛýÜÛÜÜþÛÜÜþÛÜÜÛÜþÛÜÜýÛÜÛÛÚüÛÚÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛ Û=ÚþÙÚÚõÙÚÙÚÙÚÙÚÙÚÙÙøÚÙÙÚÙÚÚÙÙþÚÙÙûÚÙÙÚÙÙþÚÙÙüÚÙÙÚÚÙÚÙþÚØØüÙØÙØØÙüØÙÙØØÙØûÙØØÙØØúÙØØÙØÙÙØþÙØØùÙØÙØÙØÙÙGØ×ØþרØþרØþרØþרØþרØûרØ×ØØþרØüרØ×>× Öþ×ÖÖü×Ö×ÖÖü×Ö×ÖÖü×Ö×ÖÖ× Öþ×Ö ÖýÕÖÕÕþÖÕÕýÖÕÖÖÕÖÕúÖÕÖÕÖÕÕýÖÕÖÖÕûÖÕÖÖÕÕÔøÕÔÕÔÕÕÔÕÕÔÕþÔÕÕÔÕÔÕÔþÕÔÔýÕÔÕÕþÔÕÕúÔÕÕÔÕÔZÔþÓÔ!ÔÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓ ÓþÔÓÓìÔÓÒÓÒÓÒÓÓÒÓÒÓÒÓÓÒÒÓÒÒÓþÒÓÓÒúÓÒÒÓÓÒÒþÓÒÒÓýÒÓÒÒëÓÒÓÒÒÓÒÒÑÒÒÑÒÑÒÑÒÒÑÑÒÒÑÒ÷ÑÒÑÑÒÒÑÒÑÑ÷ÒÑÒÒÑÒÑÑÒÒþÑÒÒùÑÒÑÒÒÑÒÒ€ÑÐÑøÐÑÐÐÑÐÑÐÐÑÐþÑÐÐÑÐþÑÐÐþÑÐÐþÑÐÐöÑÐÑÐÐÑÐÐÑÐÐÏþÐÏÏþÐÏÏÐþÏÐÐÏðÐÏÏÐÏÐÏÏÐÏÐÏÐÏÐÏÏþÐÏÏÐÏüÐÏÐÏÏþÎÏÏÎÏþÎÏÏþÎÏÏÎÏþÎÏÏÎÏûÎÏÏÎÏÏýÎÏÎÎÏòÎÏÎÏÏÎÏÎÏÎÏÎÍÎÎÍúÎÍÎÎÍÎÎúÍÎÎÍÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎÍÌûÍÌÍÍÌÌþÍÌÌïÍÌÌÍÌÍÍÌÍÌÍÌÌÍÌÍÌÌøÍÌÍÌÍÌÍÌÌþÍÌÌùÍÌÌÍÌÍÌÌýËÌËËÌËùÌËÌÌËÌËËôÌËËÌËËÌÌËËÌËËÌþËÌÌõËÌÌËÌÌËÌËÌËËüÊËÊËËûÊËÊÊËËüÊËÊËËüÊËÊËËûÊËÊÊËËýÊËÊ>ÊýÉÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉCÉÈÉüÈÉÈÉÉûÈÉÈÈÉÉÈþÉÈÈÉÈÉÈñÉÈÉÉÈÈÉÈÉÉÈÉÉÈÉÉüÈÉÉÈÈûÇÈÈÇÈÈþÇÈÈûÇÈÈÇÈÈþÇÈÈþÇÈÈÇÈýÇÈÇ@ÇÆÇÆþÇÆÆûÇÆÆÇÆÆüÇÆÇÆÆûÇÆÇÇÆÆüÇÆÇÆ>Æ?Í=çþæççþæç/çþæç8çæçæþçææþçææüçæçææþçææüçæçææüçæçææþçææûçææçææûåææåææåæåæåæûåæååææåæþåææåþæååúæååææååæåäüåääååäåþäååäåþäååäåäåþäååäåøäåääååäååþãääþãääþãääãäþãääþãääòãääãäãäãääãäãääúãääãäã€ãýâãââúãâãâãââþãââãýâãââãýâãââãâûãââãââãâãôâãââááââááâááþâááâûáââáââáâüáâáââþáââáûâááâááâáâþàááøàáàáàáàááûàááàááàáþàááþàááþàááþàááúàáàááà~àßúàßßààßßþàßßûàßààßßùàßààßàßßàóßàßààßßàßààßààûßàßàßßþàßßýÞßÞÞýßÞßßÞüßÞÞßßýÞßÞÞþßÞÞßþÞßßÞßûÞßßÞßßÞÝÞüÝÞÝÞÞûÝÞÞÝÞÞþÝÞÞüÝÞÝÞÞÝþÜÝÝþÜÝÝÜÝÜÝÜþÝÜÜÝ ÜÝÜüÝÜÝÜCÜÛÜÛûÜÛÜÛÜÜüÛÜÛÜÜþÛÜÜÛÜÛþÜÛÛîÜÛÛÜÜÛÜÛÜÜÛÛÜÛÛÚÚÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛ?ÚÙÚÙþÚÙÙþÚÙÙÚ ÙüÚÙÚÙÙþÚÙÙûÚÙØÙØØÙØÙüØÙÙØØÙØýÙØÙÙØüÙØÙØØÙþØÙÙØÙýØÙØCØ×Øþר ØþרØþרØø×Ø×ØØ×Ø×רþר ØüרØ×>×Ö×Ö×Öþ×ÖÖ×Öþ×ÖÖ×Ö×þÖÕÕÖÕøÖÕÖÕÖÕÖÕÕÖ÷ÕÖÕÕÖÕÕÖÕÕÖþÕÖÖúÕÖÕÖÖÕÕ÷ÖÕÕÖÕÖÕÕÖÖúÕÖÕÕÖÕÕÔÕþÔÕÕÔÕûÔÕÔÔÕÕúÔÕÔÔÕÔÔÕÔÕÔÕÔÕûÔÕÔÔÕÕÔÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓÔÓþÔÓÓþÔÓÓþÔÓÓÔÓÒ÷ÓÒÒÓÒÒÓÓÒÒøÓÒÒÓÓÒÓÒÒüÓÒÒÓÓùÒÓÒÒÓÓÒÒþÓÒÒÓøÒÓÒÒÓÓÑÒÒÑ÷ÒÑÑÒÑÒÒÑÒÒÑÒÑÒÑÒüÑÒÑÒÒÑõÒÑÒÑÑÒÑÒÒÑÒÒÑÐÑÐþÑÐÐÑÐþÑÐÐþÑÐÐûÑÐÐÑÏÏóÐÏÏÐÏÏÐÏÐÏÐÐÏÏÐÏúÐÏÐÐÏÐÐüÏÐÏÐÐÏÐÏýÐÏÐÐÏÐÏÎÏùÎÏÎÏÏÎÏÏÎúÏÎÏÏÎÏÏüÎÏÎÏÏÎÏÎÏúÎÏÎÏÏÎÎÏùÎÏÏÎÎÏÎÎþÍÎÎþÍÎ ÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎ ÎÍ΂ÍýÌÍÌÌûÍÌÍÌÍÍÌûÍÌÌÍÌÌüÍÌÍÌÌþÍÌÌüÍÌÍÌÌþÍÌÌÍ÷ÌÍÌÍÌÍÌÍËËÌùËÌËËÌÌËËÌËÌþËÌÌýËÌËËþÌËËÌËÊËþÊËËõÊËËÊËËÊËËÊËËþÊËËþÊËËøÊËËÊËËÊËËýÊËÊ?ÊÉþÊÉÉóÊÉÉÊÉÉÊÉÊÉÊÊÉÉÊ ÉÊ ÉüÊÉÊÉAÉÈÉÈÉþÈÉÉþÈÉÉúÈÉÈÈÉÈÈÉýÈÉÈÈøÉÈÉÉÈÉÈÉÉÈÉùÈÉÈÈÉÈÉÉ ÈÇÈþÇÈÈÇÈùÇÈÈÇÈÇÈÈþÇÈÈÇÈûÇÈÇÇÈÈüÇÈÈÇ?ÇõÆÇÇÆÆÇÆÆÇÇÆÆþÇÆÆûÇÆÇÇÆÆþÇÆÆùÇÆÇÆÇÇÆÆÇAÆ?Í çþæçÛçþæçÖçæþçææþçææþçæ æþçææçæùçæçææçææþçææåûæååæååüæååææåæåýæåææåþæååæåæåùæåææåäååäþåääåõäååääåääååääïåääåäåäåääåäåäåäååþäååùäåääåäååùäãääããääþãääúãäãäãääùãäãäããääþãääþãääãäãäãýâãââüãââããâãâúãââããââûãââãââþãââãâãûâããâããâáùâááââáââáâáâáùâááââáââ÷áâááâááâááâáúâáââáââøáâáââáàááþàááþàááàýáàááüàáàááþàááþàááþàááþàáá€àßüàßàßßþàßßüàßàßßàßøàßàßàßàßßàßàßûàßßàßßüàßÞßßÞßþÞßßÞßþÞßßþÞßßÞýßÞßßÞßÞþßÞÞüßÞÞßßûÞÝÞÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞÝÞþÝÞÞÝÞõÝÞÝÞÞÝÞÝÞÞÝ?Ý ÜÝÜþÝÜÜÝ ÜþÝÜÜþÝÜÜþÝÜÜÝCÜÛúÜÛÜÜÛÜÜÛÜþÛÜÜÛýÜÛÜÜÛýÜÛÜÜýÛÜÛÛÜôÛÜÛÜÜÛÜÜÛÛÜÛÛþÚÛÛüÚÛÚÛÛÚýÛÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛÚþÙÚ4ÚÙÚÙÚÙþÚÙÙ÷ÚÙÙÚÚÙÙÚÙÙÚöÙÚÙÚÙÙÚÙÙÚÚýÙÚÙÙûÚØØÙØØþÙØØüÙØØÙÙØÙ ØÙ÷ØÙÙØØÙÙØÙÙþØÙÙØþÙØCØüרר Øýר××Ø×Ø× ØþרØ×ØþרØ?×Öþ×ÖÖþ×ÖÖ×Öþ×Ö Öþ×Ö Ö×Öü×ÕÕÖÖÕÖÕÖÕþÖÕÕûÖÕÖÖÕÕÖýÕÖÕÕÖÕþÖÕÕÖÕüÔÕÔÕÕþÔÕÕûÔÕÕÔÕÕÔÕüÔÕÔÕÕûÔÕÔÔÕÕÔ÷ÕÔÕÕÔÔÕÔÕÕýÔÕÔÔûÓÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓüÔÓÔÓÓÔÓÒÓûÒÓÓÒÓÓÒÓýÒÓÒÒÓÒÓúÒÓÒÒÓÒÒûÓÒÓÒÓÓùÒÓÒÒÓÓÒÒÓÒûÓÒÒÑÒÒêÑÒÒÑÒÑÑÒÒÑÑÒÑÒÑÑÒÑÑÒÒÑÑÒÑ÷ÒÑÒÒÑÒÑÑÒÒÑúÒÑÒÒÑÒÒ€ÑÐÑÐþÑÐ ÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐúÑÐÏÐÐÏÏÐÏõÐÏÐÐÏÏÐÐÏÏÐÐýÏÐÏÏúÐÏÐÏÐÏÏÐÏùÐÏÐÏÏÐÏÏûÐÎÏÏÎÎòÏÎÎÏÎÎÏÏÎÏÏÎÏÎÎýÏÎÏÏüÎÏÏÎÎýÏÎÏÏüÎÏÎÏÏþÎÏÏöÎÏÏÎÏÎÏÎÏÎÎýÍÎÍÍÎþÍÎ ÎþÍÎÎþÍÎÎÍûÎÍÎÍÎÎýÍÎÍ~ÍÌöÍÌÌÍÌÍÌÌÍÌÌÍÌýÍÌÍÍÌüÍÌÍÌÌþÍÌÌôÍÌÍÍÌÍÍÌÍÌÍÌÌþÍÌÌþÍÌÌËÌËÌòËÌÌËÌÌËËÌËÌÌËÌÌËþÌËËüÌËËÌÌüËÌËÌÌòËÌÌËËÌËÌÌËËÌÌËËÊËþÊËËøÊËÊÊËÊÊËËûÊËËÊËËüÊËÊËËþÊËËÊË?ÊÉþÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉûÊÉÊÊÉÉúÊÉÊÉÊÉÉþÊÉÉþÊÉEÉüÈÉÈÉÉÈÉþÈÉÉùÈÉÈÉÈÈÉÉÈýÉÈÉÉÈÉûÈÉÉÈÉÉüÈÉÉÈ ÈûÇÈÈÇÈ ÈûÇÈÈÇÈÈþÇÈÈüÇÈÇÈÈúÇÈÈÇÇÈ È?ÇÆþÇÆÆþÇÆÆþÇÆÆûÇÆÇÇÆÆþÇÆÆþÇÆÆþÇÆDÆÿ?ÍéçþæçÖçæþçæ æüçæçææçæçæûçæççææþçææþçææøçæçæåæåææüåææååþæååúæåæååææùåæåæåæååüæåæååûæåææååüæåæååöæååääåäåäååþäååäøåäåäååäååëäåääååääååääåäåäåäåäååþäå åüäãäããäãäãäþãääãäüãäãääãäûãääãää„ãûâãââããüâããââüãâãââþãââöãâãâããââãââãâúãâãâãââþáââýáâááþâááâáúâáâááââüáââááâùáââáâáââáëâááââáàááàáàáàááàááàááþàááþàááþàááþàá áþàááþàáá€àýßàßßàßàßöàßßàßßààßààßàßþàßßòàßßàßßàßàßßààßß÷àßàßßàßßÞÞýßÞßßüÞßßÞÞýßÞßßþÞßßûÞßßÞßßüÞßÞßßûÞßÞÞßßýÞßÞÞðßÞÞßßÞßßÞßÞÞÝÞÝÞÞÝúÞÝÞÝÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞÝ Þ@ÝÜþÝÜÜþÝÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜøÝÜÜÝÜÜÝÜÜÝÜþÝÜEÜÛþÜÛÛÜÛðÜÛÜÜÛÜÛÜÛÛÜÛÛÜÜÛÛÜÛúÜÛÛÜÛÜÜÛÜòÛÜÛÛÜÛÜÛÜÛÛÜÚÛ ÛþÚÛ ÛþÚÛÛþÚÛÛüÚÛÚÛÛ?ÚÙþÚÙÙûÚÙÙÚÙÙúÚÙÙÚÚÙÙùÚÙÚÙÙÚÙÙûÚÙÙÚÙÙøÚÙÙÚÙÙÚÙÙÚÙØþÙØØÙØÙûØÙØÙØØõÙØÙØÙØÙØØÙØØüÙØÙØØÙôØÙÙØÙØØÙÙØÙØ?ØþרØîרØ×Ø×Ø×ררØ×ØØ×ØØüררØþרØûרØ×ØØ×Ø?×ýÖ×Ö Öþ×ÖÖü×Ö×ÖÖþ×ÖÖû×Ö××ÖÖ×þÖ×× Öù×ÖÖÕÕÖÕÕýÖÕÖÖÕþÖÕÕÖüÕÖÕÖÖÕûÖÕÖÖÕÕõÖÕÕÖÕÖÕÖÖÕÖÖÕþÔÕÕÔüÕÔÕÔÔÕÔÕûÔÕÕÔÕÕúÔÕÕÔÕÔÔûÕÔÕÔÕÕöÔÕÔÕÕÔÕÔÕÔCÔþÓÔ=Ô ÓþÔÓÓþÔÓÓûÔÓÓÔÓÓûÔÓÓÔÓÓøÔÓÓÔÔÓÔÓÓþÔÓÓÒøÓÒÒÓÓÒÓÒÒíÓÒÒÓÒÓÒÓÓÒÒÓÒÓÒÓÓÒÓÓÒÓóÒÓÓÒÓÓÒÓÓÒÓÓÒÒÓÒüÓÒÑÒÒÑÒ÷ÑÒÑÑÒÒÑÑÒÒñÑÒÑÑÒÑÑÒÑÒÒÑÒÑÒÒÑøÒÑÑÒÑÒÑÒÒÑÒÑÐþÑÐÐþÑÐÐûÑÐÐÑÐÐþÑÐÐþÑÐÐþÑÐÐÑÐþÑÐÐÏÐÏñÐÏÐÏÏÐÏÐÐÏÐÐÏÏÐÐýÏÐÏÏÐ÷ÏÐÏÐÏÐÏÏÐÐÏÐýÏÐÏÏþÐÏÏÐÏÎÏÎûÏÎÏÎÏÏûÎÏÏÎÏÏýÎÏÎÎûÏÎÏÎÏÏÎÏþÎÏÏþÎÏÏýÎÏÎ ÎþÍÎÎüÍÎÍÎÎûÍÎÎÍÎÎûÍÎÍÍÎÎÍÎüÍÎÍÎÎÍ΂ÍÌûÍÌÌÍÌÌûÍÌÌÍÌÌüÍÌÌÍÍÌÍÌýÍÌÍÍÌüÍÌÍÌÌþÍÌÌüÍÌÌÍÍýÌÍÌÌËþÌËËùÌËÌËËÌËËÌËÌþËÌÌËÌËÌËþÌËËÌþËÌÌËÌþËÌÌúËÌÌÊÊËËþÊËËþÊËËùÊËÊËÊÊËËþÊËËøÊËÊËÊËÊËËúÊËËÊÊËËþÊËËÊËüÊËËÊ>ÊÉþÊÉÉþÊÉÉþÊÉÉùÊÉÉÊÉÊÉÉþÊÉÉþÊÉÉþÊÉ ÉþÊÉÉúÊÉÉÊÊÉGÉÈÉúÈÉÈÉÉÈÈÉþÈÉÉúÈÉÉÈÈÉÉÈüÉÈÈÉÉÈÉÈúÉÈÉÈÉÈ ÈþÇÈÈûÇÈÈÇÈÈÇÈþÇÈÈõÇÈÇÇÈÈÇÈÈÇÈÈþÇÈÈÇÈ@ÇÆþÇÆÆþÇÆÆþÇÆÆþÇÆ ÆþÇÆÆÇÆþÇÆDÆ?Í“çþæçÅçþæçdçùæçæçæçææçæçæçæþçææçæþçææûçæççææåæåæúåæååæååèæåæååæåæåæåæåæåææååææåæååæåþæååøæååääååääåüäåäååäúåääåäååþäååäøåäååäåäååäåäþåääãäþãääþãääþãääþãääãýäãääþãääþãää€ãâþãââãýâãââüãââããâõãâããâãââããââûãââãââãýâãââþãââûãââãââþáââþáââáâüáâáââøáââááâáââüáâáââýáâááúâááâáââõáâáâáââááàá áþàá áþàááþàá áþàááþàááàá€àßàßàßûàßßàßßöàßààßßàßàßßàßþàßßþàßßÞýßÞßßÞßþÞßßÞßúÞßßÞÞßßÞßéÞßßÞÞßßÞßßÞßÞÞßÞÝÞÝÞÝÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞÝ ÞþÝÞÞÝÞ%ÝþÜÝÝÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜùÝÜÜÝÜÝÜFÜÛÜçÛÜÛÜÛÜÛÛÜÛÜÛÛÜÛÜÜÛÜÛÜÛÜÛÜÜÛÜÛÜÛÜüÛÜÜÛÛÜóÛÜÜÚÚÛÚÚÛÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛÚÛÚöÛÚÛÛÚÛÛÚÛÚ>ÚýÙÚÙÙþÚÙÙþÚÙÙþÚÙÙÚÙüÚÙÚÙÙþÚÙÙþÚÙÙØÙúØÙÙØÙØØüÙØÙØ ØÙøØÙØØÙØÙØØüÙØÙØØøÙØØÙÙØØÙÙØüÙØÙØ@Ø×ØþרØþרØ×ØþרØþרØþרØ?×Öþ×ÖÖþ×Ö Ö×Ö×Öþ×ÖÖþ×ÖÖù×Ö×ÖÖ×ÖÖÕþÖÕÕòÖÕÖÕÕÖÕÕÖÖÕÕÖÕÕøÖÕÖÕÕÖÖÕÕþÖÕÕùÖÕÕÖÕÖÕÕÖõÕÖÖÕÖÕÖÕÕÖÕÕûÔÕÔÔÕÕÔþÕÔÔûÕÔÕÔÕÕþÔÕÕúÔÕÔÕÔÕÕúÔÕÔÕÔÕÕüÔÕÔÕÕûÔÕÕÔÕÕ€ÔÓûÔÓÔÔÓ ÓùÔÓÔÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓÒðÓÒÓÓÒÓÒÓÒÒÓÓÒÒÓÒÒöÓÒÓÒÒÓÓÒÓÒÒþÓÒÒÓýÒÓÒ ÒúÓÒÒÑÑÒÒÑÒþÑÒÒ÷ÑÒÑÒÑÑÒÑÒÒþÑÒÒÑþÒÑÑÒþÑÒÒûÑÒÑÒуÑÐþÑÐÐÑýÐÑÐÐþÑÐÐÑÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÏÐÐÏþÐÏÏÐýÏÐÏÏöÐÏÐÏÏÐÏÏÐÏÏûÐÏÐÏÐÐÏþÐÏÏþÐÏÏ÷ÐÏÐÏÐÏÐÐÏÏþÎÏÏÎÏÎÏüÎÏÎÏÏúÎÏÎÏÏÎÎÏöÎÏÎÎÏÏÎÎÏÎÎþÏÎÎÏÎþÍÎÎÍÎÍÎþÍÎÎöÍÎÎÍÍÎÍÎÍÎ ÎþÍÎÎÍüÌÍÍÌÌÍÌþÍÌÌÍÌÍøÌÍÌÍÌÌÍÌÌÍÌÍÌÍúÌÍÌÌÍÌÌËþÌËËýÌËÌÌËÌËÌþËÌÌþËÌÌïËÌËÌËËÌËËÌËËÌËÌËÌÌýËÌËËõÌËÌÌËËÌÌÊÊË ËþÊËËÊËþÊËËþÊËËúÊËÊËÊËËþÊËËüÊËËÊ>Ê ÉþÊÉ ÉþÊÉÉþÊÉÉùÊÉÊÉÉÊÉÉþÊÉÉþÊÉ?ÉÈýÉÈÉÉûÈÉÈÉÈÈýÉÈÉÉüÈÉÉÈÈúÉÈÉÈÉÈÈõÉÈÉÈÈÉÈÈÉÉÈÈÉûÈÉÈÈÉÉÈþÉÈÈþÇÈÈüÇÈÇÈÈôÇÈÇÇÈÇÈÇÈÈÇÈÈûÇÈÈÇÈÈþÇÈÈÇÈþÇÈÈüÇÈÈÇ?ÇýÆÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆüÇÆÇÆÆûÇÆÆÇÆ>Æ?Í|çþæçAçýæçææþçææþçææþçææüçæçææþçæ æþçææ÷çæçææçæçææýåæååþæååæøåææååææååæåæõåæåææååææåææåæåäýåäååäýåäååäýåäååùäååääåääåþäååäåþäååäþåä äãäþãääãäúãäãäãääúãäããäã~ãýâãââùãââãâãââã÷âãââããâãââãüâããââüãâãââõãââããâãââãââþáââúáââááââþáââüáâáââüáâáââþáââþáââáâùáââáâáââûáâáàááþàááþàááþàááþàááþàáá€àýßàßßàßùàßàßààßßþàßßàßàøßàßààßàßßàýßàßßðàßààßàßàßßÞÞßÞÞßßÞüßÞÞß ßúÞßÞßÞßßÞßÞßÞþßÞÞßÝúÞÝÝÞÝÞÞþÝÞÞþÝÞÞõÝÞÞÝÞÝÞÝÞÝÞÞüÝÞÝÞÞ@ÝÜøÝÜÝÝÜÜÝÜÜþÝÜ ÜþÝÜÜ÷ÝÜÜÝÜÜÝÝÜÜüÝÜÝÜÜüÝÜÝÜCÜþÛÜÜÛÜÛþÜÛÛÜÛÜÛÜÛíÜÛÜÛÛÜÜÛÛÜÜÛÜÛÜÜÛÜÛÛÜýÛÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛùÚÛÛÚÛÚÛÛûÚÛÛÚÛÛøÚÛÚÛÚÛÚÛÛþÚÛÛ?ÚÙ÷ÚÙÚÙÙÚÙÚÙÙÚ ÙþÚÙÙþÚÙÙþÚÙÙÚýÙÚÙÙþÚÙÙûÚÙÙÚÙÙýØÙØØþÙØØýÙØÙÙþØÙÙñØÙÙØØÙØÙØÙØÙØÙØØþÙØØþÙØØÙýØÙØØþÙØAØ× Ø×ØþרØþרØþרØþר Ø×Ø@×Öþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖ×Öþ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×ÖÖÕÕþÖÕÕÖÕþÖÕÕþÖÕÕýÖÕÖÖÕþÖÕÕùÖÕÖÕÕÖÕÕüÖÕÖÕÕþÖÕÕþÔÕÕÔüÕÔÔÕÕþÔÕÕÔÕÔùÕÔÕÔÔÕÔÔøÕÔÕÕÔÕÔÕÕÔÕÔþÕÔoÔþÓÔÔüÓÔÔÓÓþÔÓÓþÔÓÓ÷ÔÓÓÔÓÓÔÔÓÓûÔÓÓÔÓÓþÔÓÓþÔÓÓýÒÓÒÒÓüÒÓÓÒÒíÓÒÓÒÒÓÒÓÓÒÓÓÒÓÓÒÒÓÒÒþÓÒÒÓÒòÓÒÓÓÒÓÒÒÓÒÓÒÓÑÑÒýÑÒÑÑÒÑöÒÑÒÑÑÒÒÑÑÒÒþÑÒÒùÑÒÒÑÒÑÒÒþÑÒÒÑÒ€ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐüÑÐÑÐÐûÑÐÐÑÐÐùÑÐÐÑÐÑÐÐþÑÐÐóÑÐÑÐÐÑÑÐÐÏÐÐÏÏÐÏþÐÏÏÐûÏÐÏÐÏÏÐÏþÐÏÏþÐÏÏÐýÏÐÏÏÐþÏÐÐÎùÏÎÏÏÎÎÏÏöÎÏÎÎÏÏÎÏÎÏÏòÎÏÏÎÏÎÏÏÎÏÏÎÎÏÏÎÏÎÏÎþÍÎÎÍÎþÍÎÎþÍÎÎÍÎüÍÎÍÎ ÎþÍÎÎÍþÎÍ€ÍüÌÍÍÌÌýÍÌÍÍÌÍþÌÍÍüÌÍÍÌÌÍÌÍÌìÍÌÍÍÌÌÍÌÍÌÌÍÌÌÍÌÍÌÍÌÌËÌûËÌËËÌÌþËÌÌËÌ÷ËÌÌËÌËÌÌËËÌüËÌËÌÌüËÌËÌÌùËÌËÌËÌËËþÊËËüÊËÊËËþÊËËûÊËËÊËËÊËþÊËËþÊËËþÊËËþÊËËÊË@ÊÉÊÉþÊÉÉþÊÉÉÊÉùÊÉÉÊÉÊÉÉþÊÉÉûÊÉÉÊÉÉþÊÉÉþÊÉEÉýÈÉÈÈÉÈÉÈøÉÈÉÈÈÉÉÈÈÉÈûÉÈÉÉÈÈÉÈÉÈþÉÈÈÉÈþÇÈÈþÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈùÇÈÇÈÇÇÈÈ@ÇýÆÇÆÆþÇÆÆüÇÆÇÆÆûÇÆÇÇÆÆÇÆþÇÆYÆÿ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕ,çýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæþçææþçææüçæçææçæùçææççÍåþæååæåþæååæýåæååæåþæååûæåæÍ÷äåääåäåäååäåäåúäåäååääýåäååúäåääÍäùãäãääãääþãääþãä äþãääãäãþÍ.ãþÍ.ãþÍâûãâããââãâãâøãâããââãââúãâãâãâ âþÍáþâááûâáââááâþáââ÷áâáââáâáââáûâáâÍáúàáàáàá áýàáààöáàááàááààá áûàááÍ.àþÍ.àþÍßûàßàßààùßààßààßßþàßßùàßàßàßààßþàßßþÍþÞßßûÞßÞÞßßüÞßÞßßþÞßßÞ÷ßÞßÞßÞßßÞÞßùÞßÞÞßÍÞþÝÞÞúÝÞÝÞÝÞÞüÝÞÝÞÞþÍþÜÝ,ÝþÍýÜÝÜÜÝÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜýÝÍ.ÜþÍÜÛÜþÛÜÜöÛÜÛÜÜÛÜÛÜÛÛþÜÛÛÜùÛÜÛÜÛÍÛþÚÛÛüÚÛÚÛÛþÚÛÛÚÛþÚÛ ÛûÚÛÚÍ.ÚþÍÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙÚûÙÚÙÙÚÚýÙÚÙÙüÚÙÍØÙØõÙØØÙØØÙÙØØÙÙúØÙØØÙØØöÙØÙÙØØÙØÙØØÙØýÙÍ.ØþÍרöרר×רØ×ØØûרØ×ØØþרØüררØþÍ.×þÍÖþ×ÖÖü×Ö×ÖÖþ×ÖÖþ×ÖÖû×Ö××ÖÖ×Öü×Ö×ÖÖû×ÖÖÍÖÕûÖÕÕÖÕÕüÖÕÖÕÕþÖÕÕþÖÕÕõÖÕÖÕÖÖÕÕÖÖÕÕûÖÕÕÍöÕÔÕÔÔÕÕÔÕÔÔÕÔùÕÔÕÕÔÕÔÔÕÔÕÔÕøÔÕÔÕÔÕÍ.ÔþÍ.ÔþÍÓþÔÓÓþÔÓÓûÔÓÓÔÓÓùÔÓÓÔÓÔÓÓÔÓûÔÓÓÍûÓÒÒÓÒÒüÓÒÓÒÒùÓÒÓÒÓÓÒÒÓýÒÓÒÒþÓÒÒþÍþÒÑÑÒýÑÒÑÑíÒÑÒÒÑÑÒÒÑÑÒÒÑÒÑÑÒÒÑÑÒþÑÒÒûÑÒÑÍ.ÑþÍ.ÑþÍýÐÑÐÐüÑÐÑÐ ÐùÑÐÑÐÐÑÐÐøÑÐÐÑÐÐÑÐÐþÍÐùÏÐÐÏÏÐÏÏÐÏÐþÏÐÐÏþÐÏÏþÐÏÏúÐÏÐÏÍþÏÎÎÏûÎÏÏÎÏÏüÎÏÎÏ ÏüÎÏÏÎÎúÏÎÏÎÎÏÏþÍüÎÍÍÎÎûÍÎÍÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎÍüÎÍÍ/Í/ÍüÌÍÌÍÍÌüÍÌÌÍÍÌþÍÌÌýÍÌÍÍýÌÍÌÌøÍÌÍÌÌÍÍÌûËÌËËÌÌþËÌÌËÌùËÌÌËÌÌËËÌûËÌËÌËËüÌËÍËúÊËÊËÊËËúÊËÊËÊËËþÊËËüÊËÍ.ÊþÍÉûÊÉÊÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉüÊÉÊÉÉþÍ.ÉþÍúÈÉÈÉÈÉÉþÈÉÉÈÉüÈÉÉÈÈÉÈÉùÈÉÈÉÈÉÈÈÉúÈÉÈÉÍÈüÇÈÇÈÈüÇÈÇÈÈÇÈÇÈÇÈþÇÈÈùÇÈÈÇÈÍ.ÇþÍÆþÇÆ ÆûÇÆÆÇÆÆþÇÆÆüÇÆÇÆÆþÍ.ÆþÍ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕçþæççýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæçæþçææþçæ æùçæçææçæ æçþÍúåæååæååæúåæåææååæåþæååþæååöæåæååæåæÍþäååûäååäååýäåääåòäåäåäåääååääåääåäåüäåÍäþãääþãääùãäããäãääþãääþãääûãääÍ.ãþÍ.ãþÍâúãâãâãââãâûãââãââþãââãâüãâÍâá÷âááââáââááûâáâáââþáââöáâáâááâááââûáââÍýáàááàáüàáàááþàááàáþàááþàááþÍ.àþÍ.àþÍßà ßþàßßàßàßôàßàßßààßßàÍÞßûÞßßÞßßÞßÞßðÞßÞßÞßÞÞßÞÞßÞßÞßßþÍ ÞþÝÞÞúÝÞÝÞÝÞÞþÝÞÞþÝÞÞþÍÝþÜÝÝþÍ ÜþÝÜÜþÝÜÜÝùÜÝÜÜÝÝÜÜþÝÜÜþÍ.ÜþÍÜÛÜþÛÜÜþÛÜÜýÛÜÛÛÜÛõÜÛÛÜÛÜÛÜÜÛÜÜüÛÜÍÛþÚÛÛþÚÛÛþÚÛÛ÷ÚÛÛÚÛÛÚÚÛ ÛþÍ.ÚþÍÙüÚÙÚÙÙþÚÙÙþÚÙÙÚÙþÚÙÙþÚÙÙþÚÙÙýÚÍøÙØØÙØØÙØØ÷ÙØÙØÙØÙÙØØÙøØÙØØÙØÙØØÙØþÍ.ØþÍüררØþרØþרØýר××ýØÍ.×þÍÖþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖþ×ÖÖþ×ÖÖü×Ö×ÖÖþÍøÖÕÕÖÕÖÕÖÖÕðÖÕÖÕÕÖÖÕÕÖÕÖÕÖÕÖÖÕÖúÕÖÕÖÕÖÖÕýÖÍÖÔÕÔÕÔÕÔÕÕÔÔÕÔÕÔÕÕÔÔÕÕÔÕÕÔÕÕÔÔÕÔÕÔÕÔÕÔÔÕÔÕÔÔüÕÔÍ.ÔþÍ-ÔýÓÍÔýÓÔÓÓþÔÓÓùÔÓÔÓÔÔÓÓûÔÓÓÔÓÓþÔÓÓýÔÍùÒÓÒÓÒÒÓÓÒ÷ÓÒÓÓÒÓÒÓÒÒþÓÒÒÓûÒÓÓÍúÑÒÒÑÑÒÒÑÒÑøÒÑÒÑÒÒÑÒÒþÑÒÒÑúÒÑÒÑÑÒÒûÑÒÒÍ.ÑþÍ.ÑþÍÐÑÐÑøÐÑÐÐÑÐÑÐÐþÑÐÐüÑÐÍþÐÏÏûÐÏÐÐÏÏþÐÏÏïÐÏÏÐÏÐÐÏÏÐÐÏÐÏÏÐÏÏûÐÏÐÍþÏÎÎÏÎÏúÎÏÏÎÏÎÎÏýÎÏÎÎþÏÎÎÏÎûÏÎÏÍÎþÍÎÎþÍÎÎþÍÎÎûÍÎÍÍÎÎþÍÎ ÎþÍ/Í/ÍþÍÌÌøÍÌÍÌÍÌÍÌÌþÍÌÌóÍÌÌÍÌÍÌÌÍÍÌÌÍÍþÌÍÍûÌÍÌÍÌÌþÍÌöËÌÌËÌËËÌËÌÌúËÌÌËËÌÌËýÌËÌÌþËÌÌüËÌÍ ËÊ ËÊüËÊÊËËþÊËËþÍ.ÊþÍÉþÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉÊÉüÊÉÍ.ÉþÍÉñÈÉÈÉÈÈÉÈÉÈÉÉÈÉÈÈÉþÈÉÉüÈÉÈÉÉÈÉüÈÉÍûÇÈÈÇÈÈÇÈþÇÈÈþÇÈÈÇÈþÇÈÈþÇÈÈþÍ.ÇþÍ ÆûÇÆÇÇÆÆþÇÆÆþÇÆÆþÍ.ÆþÍ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕ,çýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæþçæ æþçæ æüçæçææþÍåþæååþæååæåûæåææååþæååöæåææååæååææýåÍüäåäååûäåäåääåþäååäåäåûäåäÍäã äþãääþãääãäüãäãääùãäãääÍ.ãþÍ.ãþÍâ÷ãâãâãââãââüãâãââãþâããýâãââãþÍúáâáâáââþáââþáââáâ÷áâáâááâáââòáââáâáâáââáâÍáùàááàáàááüàáàááþàááþàááàýáÍ.àþÍ.àþÍþàßßþàßßýàßààßàßàøßàßßàßàßßàßýàÍßþÞßßþÞßßþÞßßùÞßßÞßÞßßÞßÞßøÞßÞßÞßÍÞþÝÞÞûÝÞÝÝÞÞþÝÞÞþÝÞ ÞþÍ.ÝþÍþÝÜÜþÝÜ ÜÝÜÝöÜÝÜÜÝÝÜÜÝÜÜüÝÜÍ.ÜþÍüÜÛÛÜÜöÛÜÛÜÜÛÜÜÛÜÜÛ÷ÜÛÜÛÜÛÛÜÛÛþÜÛÛüÜÛÛÜÜþÍÛþÚÛÛþÚÛÛÚÛüÚÛÛÚÚÛþÚÛÛüÚÛÚÛÛþÍÚþÙÚÚþÍÙþÚÙÙüÚÙÚÙÙùÚÙÙÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÍØþÙØØòÙØÙØÙÙØØÙØÙÙØÙÙØûÙØÙÙØØöÙØÙØØÙØÙØÙÙýØÍ.ØþÍ Øþר ØþרØþרØüררØþÍ.×þÍÖþ×ÖÖô×Ö×Ö×ÖÖ××Ö×ÖÖþ×ÖÖü×Ö×ÖÖü×Ö×ÖÖþÍãÕÖÕÖÖÕÕÖÕÖÕÕÖÕÖÕÕÖÕÕÖÖÕÖÖÕÕÖÕÕÖýÕÖÕÕøÖÕÕÖÖÕÍþÕÔÔþÕÔÔýÕÔÕÕþÔÕÕöÔÕÕÔÕÕÔÕÔÕÕþÔÕÕþÔÕÕýÔÍ.ÔþÍ.ÔþÍÓüÔÓÔÓÓÔ÷ÓÔÓÔÔÓÓÔÓ ÓûÔÓÓÔÓÓþÍÒþÓÒÒüÓÒÓÒÒÓÒñÓÒÒÓÓÒÒÓÒÒÓÒÒÓÒÒûÓÒÒÍòÒÑÑÒÑÒÒÑÒÒÑÒÑÒÒÑÒÑøÒÑÒÒÑÒÒÑÑÒÑÒþÍ.ÑþÍ.ÑþÍÐþÑÐÐúÑÐÑÐÑÐÐþÍÏüÐÏÐÏÏÐÏÐÏÐÏÐÏþÐÏÏþÐÏÏúÐÏÐÏÍÎøÏÎÎÏÏÎÏÎÎýÏÎÏÏüÎÏÏÎÎÏüÎÏÎÏÏÎúÏÎÏÏÎÏÏþÍ ÎþÍÎÎüÍÎÍÎÎþÍÎ ÎÍ/Í/ÍþÍÌÌþÍÌÌþÍÌÌþÍÌÌþÍÌÌèÍÌÍÍÌÍÌÍÌÌÍÌÌÍÍÌÍÌÌÍÌÌÍþËÌÌøËÌÌËÌÌËÌÌûËÌÌËÌÌ÷ËÌÌËÌÌËËÌÌóËÌËËÌËÌËËÌÌÍËþÊËËøÊËÊËËÊÊËËþÊËËÊýËÊËËùÊËÊËËÍ.ÊþÍÉþÊÉÉùÊÉÉÊÉÊÉÉÊÉûÊÉÉÊÉÉþÊÉÉüÊÉÍ.ÉþÍýÉÈÉÉÈþÉÈÈÉþÈÉÉûÈÉÉÈÉÉüÈÉÈÉÉüÈÉÈÉÉÈþÍÈûÇÈÈÇÈÈÇÈúÇÈÇÈÇÈÈÇÈûÇÈÈÇÈÈþÍ.ÇþÍÆÇÆþÇÆ ÆÇÆûÇÆÆÇÆ ÆþÍ.ÆþÍ)ÿýùG,ÿþ-ÿþ.ÿ.ÿþG.ÿþù/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿþÍÆÆþÅÆ ÆþÅÆÆÅýÆÅÆÆúÅÆÅÆÆÅÅÆÅýÆÅÆÆþÅÆÆÅþÍÅÅþÄÅÅþÄÅÅþÄÅÅüÄÅÄÅÅýÄÅþÍÄ9ÄýÍÄÃÃþÄÃÃþÄÃÃÄÃþÄÃÃÄÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄòÍÂÃÃÂÂÃÂÃÃÂÃÃÂÂÃúÂÃÂÃÃÂÂÃþÂÃÃÂÃÂýÃÂÃÃÂöÃÂÃÂÃÂÃÂÃýÍÅÂ8ÂýÍÊÂÂþÁÂÂþÁ ÂþÁÂÂþÁÂÂÁÂüÁÂÁÂÂÁüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ3ÁþÇÍ5ÍïÍÆÆÅÆÆÅÆÆÅÅÆÅÆÅÅÆÆÅ ÆþÅÆÆúÅÆÅÆÅÆÆöÅÆÅÆÆÅÆÅÆÅÅþÍÅÅøÄÅÅÄÅÅÄÅÅûÄÅÅÄÅÅþÄÅÅþÄÅÅúÄÅÅÄÄÅÅþÄÅÅûÄÅÅÄþÍÄ9ÄýÍÄÃÃÄÃþÄÃÃûÄÃÃÄÃÃÄÃûÄÃÃÄÃÃûÄÃÃÄÃÃüÍÂÂÃÃÂýÃÂÃÃÂþÃÂÂöÃÂÃÂÂÃÂÂÃÂÂÃøÂÃÃÂÂÃÃÂÂöÃÂÃÂÂÃÃÂÃÂÂýÍÄÂ8ÂüÍÉÁÂÂÁýÂÁÂÂôÁÂÂÁÂÂÁÂÁÂÁÂÂþÁÂÂúÁÂÂÁÁÂÂÁÂüÁÂÂüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ)ÁþÀÁÁþÇÍ5ÍúÍÆÆÅÅÆÆöÅÆÅÆÅÅÆÅÅÆÆúÅÆÅÆÅÆ ÆÅüÆÅÅÆÆÅÆúÅÆÆÅÅþÍÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅ ÅþÄÅÅúÄÅÄÅÄÅÅüÍÄÃÄ7ÄýÍÃÄÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃõÍÂÃÃÂÃÂÃÂÃÂÂÃÂÃÂþÃÂÂÃüÂÃÃÂÂÃÂ÷ÃÂÂÃÂÂÃÃÂÂúÃÂÂÃÃýÍÄÂ8ÂýÍÊ ÂþÁÂÂÁ ÂþÁÂÂþÁÂÂÁÂþÁÂÂüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ3ÁþÇÍ5Í;ÿ;ÿ;ÿ;ÿ;ÿ;ÿþùÿ9ÿþGÿ9ÿ:ÿþÿ8ÿþÿ7ÿýGùÿ4ÿÆýÅÆÅÅäÆÅÅÆÆÅÆÆÅÅÆÅÅÆÅÅÆÆÅÆÅÆÆÅÆÆÅÆÆþÅÆÆÅÆûÅÆÆÅÆÆÅÆÅÄøÅÄÅÄÅÄÄÅÅüÄÅÄÅÅþÄÅÅùÄÅÅÄÅÅÄ>ÄÃþÄÃÃøÄÃÃÄÄÃÄà ÃþÄÃÃþÄà ÃþÄÃÃþÄÃÃÂýÃÂÃÃÂþÃÂÂàÃÂÃÂÃÂÃÂÂÃÃÂÃÃÂÃÂÂÃÃÂÃÃÂÃÃÂÃÃÂÂÃÃÂÃýÂÃÂDÂþÁÂÂþÁ ÂþÁÂÂûÁÂÂÁÂÂêÁÂÂÁÂÁÂÁÂÁÂÂÁÂÂÁÂÁÁÂÁÂÂþÁÂÂýÁÂÁ¿ÁþÀÁ=Á?ÍøÅÆÅÆÆÅÆÅÅùÆÅÅÆÅÅÆÆüÅÆÅÆÆûÅÆÅÅÆÆÅýÆÅÆÆÅðÆÅÆÅÆÆÅÆÆÅÅÆÆÅÆÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅÄ Å÷ÄÅÅÄÅÅÄÅÄ?ÄÃþÄÃÃþÄÃÃþÄÃÃøÄÃÄÄÃÃÄÃÃÄøÃÄÃÄÃÃÄà ÃþÄÃÃÂýÃÂÃÃÂüÃÂÃÂÂÃúÂÃÃÂÃÂÂþÃÂÂúÃÂÃÂÂÃÃïÂÃÂÂÃÂÃÂÂÃÂÃÂÃÂÂÃÃýÂÃÂCÂþÁÂÂþÁÂÂÁÂþÁÂÂþÁÂÂþÁ ÂûÁÂÂÁÂÂÁÂÁþÀÁàÁ?ÍþÅÆÆÅÆÅõÆÅÆÅÆÆÅÅÆÅÆÆðÅÆÅÅÆÆÅÅÆÅÆÆÅÆÅÆÆûÅÆÅÅÆÆöÅÆÆÅÅÆÆÅÆÅ ÅþÄÅÅøÄÅÅÄÅÅÄÅÅþÄÅÅþÄÅÅÄÅþÄÅÅþÄÅÅþÄÅÅ?Ä ÃÄ ÃÄûÃÄÃÄÃÃþÄÃÃÄÃüÄÃÄÃÃýÂÃÂÂûÃÂÂÃÂÂþÃÂÂÃÂÃÂÃÂÃûÂÃÂÃÂÂþÃÂÂúÃÂÂÃÃÂÂüÃÂÃÂCÂþÁÂÂþÁÂÂþÁÂÂþÁÂÂþÁÂÂûÁÂÁÁÂÂþÁÂÂÁþÀÁsÁþÀÁÁþÀÁ]Á?ÍÿýÅÆÅÅÆöÅÆÅÆÅÆÆÅÆÅÅÆþÅÆÆþÅÆÆøÅÆÆÅÆÆÅÆÆÅÆþÅÆÆÅÆÄÅûÄÅÄÄÅÅþÄÅÅþÄÅÅÄýÅÄÅÅþÄÅÅþÄÅ Å?ÄÃþÄÃÃÄýÃÄÃÃþÄÃÃþÄà ÃÂýÃÂÃÃÂÃÂÃÂðÃÂÃÂÃÂÂÃÂÂÃÃÂÃÃÂÂþÃÂÂþÃÂÂÃýÂÃÂÂþÃÂHÂþÁÂÂþÁÂÂþÁÂÂüÁÂÂÁÁÂýÁÂÁÁ?ÍøÆÅÆÅÅÆÆÅÅÆýÅÆÅÅÆüÅÆÅÆÆÅÆÅýÆÅÆÆüÅÆÆÅÅÆþÅÆÆþÄÅÅþÄÅÅÄ÷ÅÄÅÄÅÅÄÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅÄ ÅýÄÅÄ>ÄÃþÄÃÃþÄà ÃÄÃþÄÃÃþÄÃÃþÄÃÃÂÃÂøÃÂÃÂÂÃÃÂÂþÃÂÂüÃÂÃÂÂþÃÂÂÃþÂÃÃýÂÃÂÂöÃÂÂÃÃÂÂÃÃÂBÂûÁÂÂÁÂÂÁÂÁÂôÁÂÂÁÂÁÂÂÁÂÁÂÂûÁÂÁÁÂÂÁÂÁ?ÍÅÆæÅÆÅÅÆÅÆÆÅÅÆÆÅÆÆÅÆÆÅÆÆÅÅÆÅÆÆþÅÆÆþÅÆÆÅÆüÅÆÆÅÅ÷ÆÅÆÅÅÄÅÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅÄÅþÄÅÅ?ÄÃúÄÃÄÃÄà ÃþÄÃÃþÄà ÃþÄÃÃÄÃþÄÃÃùÄÃÄÃÃÄÂÂÃÂÃÂÃÂ÷ÃÂÃÂÃÃÂÃÂÂÃýÂÃÂÂþÃÂÂõÃÂÃÂÂÃÃÂÃÃÂÂþÃÂÂÃýÂÃÂ?ÂõÁÂÂÁÂÂÁÂÁÁÂÂþÁÂÂÁÂÁÂüÁÂÁÂÂþÁÂÂþÁÂÂûÁÂÂÁÂÂ÷ÁÂÁÂÂÁÂÂÁpÁþÀÁŒÁ?ÍÿÆûÅÆÅÆÅÅÆÅÆøÅÆÆÅÆÅÅÆÆÅþÆÅÅþÆÅÅÆëÅÆÆÅÆÅÅÆÅÆÅÆÅÅÆÅÅÄÅÄÅÅúÄÅÅÄÄÅÅþÄÅÅÄÅþÄÅÅ@Ä ÃþÄÃÃÄÃþÄÃÃþÄÃÃûÄÃÃÄÃÃÄÃÄüÃÄÄÃÃùÄÃÃÂÃÃÂÂýÃÂÃÃÂÃÂÃÂþÃÂÂýÃÂÃÃÂþÃÂÂöÃÂÂÃÂÂÃÂÃÂÂþÃÂPÂþÁÂÂôÁÂÁÁÂÁÂÁÂÂÁÂÂþÁÂÂþÁÂÂþÁÂÂêÁþÀÁ ÁþÀÁÁ?ÍÆýÅÆÅÅÆþÅÆÆÅÆÅÆûÅÆÆÅÆÆÅþÆÅÅÆûÅÆÆÅÆÆÅÆÅþÄÅÅûÄÅÅÄÅÅþÄÅÅÄÅþÄÅ ÅûÄÅÄÄÅÅÄùÅÄÄÅÅÄÅÅ?ÄÃþÄÃÃôÄÃÄÃÃÄÃÃÄÃÄÃÃþÄà ÃþÄÃÃüÄÃÄÃÃüÄÃÄÃÃþÄÃÃÂÃÂÃýÂÃÂÂùÃÂÂÃÂÃÂÂÃÂÃõÂÃÂÃÃÂÂÃÃÂÃÃÂÃýÂÃÂBÂÁÂþÁÂÂþÁÂÂüÁÂÁÂÂþÁÂÂþÁÂÂÁÂþÁÂÂúÁÂÂÁÁÂÂüÁÂÂÁÿÁ?ÍÆüÅÆÅÆÆÅÆøÅÆÅÆÅÆÅÆÆþÅÆÆùÅÆÅÅÆÅÆÆùÅÆÅÆÆÅÆÆûÅÆÅÅÆÆýÅÆÅÅüÄÅÄÅÅÄÅÄÅÄÅþÄÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅüÄÅÅÄ>ÄÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃÄÃøÄÃÃÂÃÂÃÂÂþÃÂÂþÃÂÂüÃÂÂÃÃÂÃýÂÃÂÂõÃÂÂÃÃÂÃÂÂÃÂÂÃþÂÃÃÂþÃÂTÂÁÂüÁÂÁÂÂþÁÂÂþÁÂÂþÁÂÂúÁÂÂÁÁ Â–ÁþÀÁgÁ?ÍÿÆþÅÆÆüÅÆÆÅÅÆÅÆýÅÆÅÅýÆÅÆÆÅÆÅüÆÅÅÆÆþÅÆÆÅÆÅþÄÅ ÅþÄÅÅ÷ÄÅÅÄÄÅÅÄÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅùÄÅÅÄÄÅÄ>ÄýÃÄà ÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄà ÃþÄÃÃõÂÃÃÂÃÂÃÃÂÃÂÂþÃÂÂüÃÂÃÂÂþÃÂÂ÷ÃÂÂÃÃÂÃÃÂÂÃûÂÃÂÃÂJÂÁýÂÁÂÂþÁÂÂþÁÂÂüÁÂÁÂÂþÁÂÂùÁÂÂÁÂÁÂÂôÁÂÁÂÂÁÂÁÂÂÀÁæÁþÀÁÁ?ÍýÆÅÆÆüÅÆÅÆÆÅÆÅøÆÅÅÆÅÆÅÆÆøÅÆÅÆÅÅÆÅÅÆüÅÆÅÆÆÅÆ÷ÅÆÆÅÆÅÅÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅ?ÄÃóÄÃÄÃÃÄÃÃÄÃÃÄÃÃüÄÃÄÃÃÄÃÄÃûÄÃÃÄÃÃÄÃþÄÃÃøÂÃÂÂÃÂÃÂÂüÃÂÃÂÂþÃÂÂÃöÂÃÂÂÃÂÃÂÂÃÃòÂÃÂÃÂÃÂÂÃÂÂÃÂÃÃÂÃýÂÃÂÂþÃÂWÂþÁÂÂþÁÂÂþÁÂÂÁ?ÍÅÆþÅÆÆþÅÆÆíÅÆÆÅÆÅÅÆÅÆÆÅÆÅÆÅÆÅÆÆþÅÆÆÅÆýÅÆÅÅÆÅÆýÅÆÅÅþÄÅÅþÄÅ ÅÄýÅÄÅ ÅûÄÅÄÄÅÅþÄÅÅÄÅ@ÄÃþÄÃÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃÄûÃÂÃÂÃÃÂþÃÂÂÃýÂÃÂÂûÃÂÂÃÂÂÃúÂÃÂÂÃÂÂþÃÂÂÃÂüÃÂÃÂBÂÁÂüÁÂÁÂÂÁÂþÁÂÂÁÂûÁÂÂÁÂÂþÁ ÂÁ?ÍÿýÆÅÆÆùÅÆÆÅÆÅÆÆÅÆúÅÆÆÅÅÆÆýÅÆÅÅÆÅúÆÅÆÅÅÆÆþÅÆÆþÅÆÆöÅÆÅÆÆÄÄÅÄÅÅþÄÅ ÅúÄÅÄÅÄÅÅùÄÅÅÄÅÄÅÅÄÅÄùÅÄÅÄÅÄÅÅüÄÅÅÄ?Ä ÃþÄÃÃÄÃÄÃþÄÃÃÄÃþÄÃÃÂÃÂÃÂþÃÂÂþÃÂÂýÃÂÃÃÂÃøÂÃÂÃÂÃÃÂÂüÃÂÃÂÂþÃÂÂþÃÂ@ÂûÁÂÂÁÂÂþÁÂÂþÁÂÂûÁÂÂÁÂÂúÁÂÂÁÁÂÂþÁÂÂþÁÂÂþÁÂÂÁÁþÀÁ<Á?ÍÅÆÅÆþÅÆÆÅòÆÅÅÆÆÅÆÅÆÅÆÅÆÅÅÆÅúÆÅÆÅÆÅÅÆþÅÆÆÅþÄÅÅþÄÅÅþÄÅÅøÄÅÅÄÄÅÄÅÅüÄÅÅÄÄÅþÄÅÅÄÅþÄÅÅÄþÃÄÄÃÄÃûÄÃÃÄÃÃüÄÃÄÃÃöÄÃÃÄÃÄÃÃÄÃÃøÄÃÃÄÃÃÄÃÃüÄÃÄÃÃÄÂÃúÂÃÃÂÃÂÂüÃÂÃÂÂþÃÂÂþÃÂÂÃÂÃÂñÃÂÃÂÂÃÂÂÃÂÂÃÂÃÂÂÃDÂþÁÂÂþÁÂÂÁ ÂþÁÂÂÁÂûÁÂÂÁÂÂ~ÁþÀÁ€Á?ÍÆÅüÆÅÅÆÆêÅÆÆÅÅÆÅÅÆÆÅÆÆÅÅÆÅÅÆÆÅÆÆÅÆþÅÆÆöÅÆÅÅÆÆÅÆÅÆÆýÅÄÅÅþÄÅÅþÄÅ ÅöÄÅÄÅÄÅÅÄÄÅÅÄÅþÄÅÅ2ÄþÃÄ ÄÃþÄÃÃüÄÃÄÃÃúÄÃÃÄÄÃÃüÄÃÄÃÃÄÃþÄà ÃüÄÃÄÃÃþÂÃÃÂÃþÂÃÃùÂÃÃÂÃÂÃÃþÂÃÃÂüÃÂÂÃÃÂÃÂüÃÂÂÃÃAÂÁýÂÁ ÂûÁÂÁÁÂÂþÁÂÂùÁÂÂÁÂÁÂÂÁ ÂþÁÂÂþÁÂÂÁ?ÍÿøÆÅÅÆÆÅÅÆÆÅÆþÅÆÆûÅÆÆÅÆÆûÅÆÅÆÅÅþÆÅÅøÆÅÆÆÅÆÅÆÆÅñÆÅÆÆÅÆÆÅÆÅÅÄÅÄÅ ÅþÄÅÅÄÅûÄÅÅÄÅÅþÄÅÅüÄÅÄÅÅÄþÅÄ>ÄÃüÄÃÄà ÃüÄÃÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃ÷ÄÃÄÃÄÄÃÄÃÃþÄÃÃüÂÃÂÃÃÂÃýÂÃÂÂøÃÂÂÃÂÂÃÂÂÃþÂÃÃÂÃýÂÃÂÂÃÂÃFÂþÁÂÂþÁÂÂþÁÂÂ÷ÁÂÂÁÁÂÁÁÂÂüÁÂÁÂÂÁÂþÁÂÂþÁÂÂÁ?ÍûÅÆÆÅÆÆÅÆøÅÆÅÆÆÅÅÆÆÅÆÅÆùÅÆÅÆÅÅÆÆùÅÆÅÅÆÅÆÆ÷ÅÆÅÅÆÅÆÄÅÅûÄÅÄÄÅÅþÄÅÅþÄÅÅüÄÅÄÅÅûÄÅÅÄÅÅÄÅýÄÅÄ+ÄþÃÄÄÃþÄÃÃþÄÃÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃÄÃÂþÃÂÂùÃÂÂÃÂÃÂÂõÃÂÂÃÂÂÃÂÂÃÂÂÃþÂÃÃÂÃÂÃûÂÃÂÃÂ@ÂþÁÂÂþÁÂÂòÁÂÁÁÂÂÁÁÂÂÁÂÁÂÂþÁÂÂïÁÂÁÂÁÂÁÂÂÁÁÂÁÂÂÁÂÂûÁÂÂÁÂÂÁþÀÁúÁ?ÍÆùÅÆÅÅÆÅÆÆÅÆøÅÆÅÆÆÅÅÆÆÅ÷ÆÅÆÅÅÆÅÆÅÅøÆÅÆÅÆÆÅÆÆþÅÆÆÅÆøÄÅÄÅÄÅÄÅÅüÄÅÄÅÅþÄÅÅþÄÅÅþÄÅÅôÄÅÅÄÄÅÄÅÅÄÅÄ>ÄÃþÄÃÃûÄÃÃÄÃÃþÄÃÃþÄà ÃúÄÃÄÃÄÃÃþÄÃÃúÄÃÄÃÃÂÂ÷ÃÂÂÃÂÂÃÃÂÂÃÂÃÂùÃÂÃÂÂÃÂÂþÃÂÂþÃÂÂÃôÂÃÂÃÂÃÂÂÃÂÃÂEÂûÁÂÂÁÂÂþÁÂÂúÁÂÂÁÁÂÂüÁÂÁÂÂþÁÂÂüÁÂÂÁnÁþÀÁÁ?ÍÿþÅÆÆÅùÆÅÅÆÆÅÆÆüÅÆÆÅÅÆþÅÆÆþÅÆÆúÅÆÅÅÍÄÅÄÅùÄÅÅÄÅÄÅ ÅÄÅüÄÅÍ.ÄþÍÃüÄÃÄÃÃþÄÃÃûÄÃÄÄÃÃÄÃþÄÃÃûÄÃÃÍÂÃÂþÃÂÂþÃÂÂüÃÂÃÂÂýÃÂÃÃÂÃÂÃøÂÃÂÃÂÃÍ-ÂýÄÍÂüÁÂÁ ÂþÁÂÂüÁÂÁÂÂýÊÍ,ÁüÂÍÇ,ÁÎ*ÁûÂÎÍÕ(ÁúÃÉÍÎÕ*ÍþÇýÅÆÅÅûÆÅÆÅÆÆüÅÆÅÆÆÅüÆÅÆÅÅþÆÅÅÆýÅÍôÅÄÄÅÅÄÅÄÅÅÄÅÅþÄÅÅÄýÅÄÅÅöÄÅÄÅÅÄÅÅÄÅÅþÍ.ÄþÍýÃÄÃÃþÄÃÃþÄÃÃûÄÃÃÄÃÃÄÃþÍõÂÃÂÂÃÂÂÃÂÂÃÃüÂÃÃÂÂùÃÂÂÃÂÃÂÂþÃÂÂþÃÂÂÃûÂÃÃÍ-ÂýÅÍÂüÁÂÁÂÂûÁÂÂÁÂÂþÁÂÂýÊÍ,ÁüÂÍÇ,ÁÎÁþÀÁ!ÁûÂÎÍÕ(ÁúÃÉÍÎÕ*ÍþÇóÆÅÆÅÆÆÅÆÅÆÆÅÆÆÅðÆÅÆÅÆÅÅÆÅÆÅÆÅÅÆÅÅÆÅøÆÅÆÆÅÅÍÅÄüÅÄÅÄÄÅþÄÅÅüÄÅÄÅÅöÄÅÄÅÅÄÅÅÄÅÅýÄÍ.ÄþÍÃþÄÃÃþÄÃÃÄ ÃþÄÃÃûÄÃÃÄÃÃþÍÂþÃÂÂÃÂüÃÂÂÃÃÂÃÂüÃÂÃÂÂþÃÂÂúÃÂÂÃÍ-ÂýÅÍûÂÁÁÂÁÁ÷ÂÁÂÁÂÁÂÁÂÂþÁÂÂüÁÂÁÂÂûÁÂÂÁÂÂþÁÂÂýÊÍ ÁþÀÁÁüÂÍÇÁþÀÁÁþÀÁÁÎ*ÁûÂÎÍÕÁþÀÁÁúÃÉÍÎÕ*ÍþÇ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ.ÿþù.ÿþG.ÿ-ÿþ,ÿþ)ÿýùG€€€€,(–K %stem-1.7.1/docs/_static/buttons/resources/tutorials.xcf0000664000175000017500000021010113157571677024046 0ustar atagaratagar00000000000000gimp xcf fileôPBœBœ0Bgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) gamma0.45454999804496765±ÙP£Ê> Tutorialsÿ     h 'Fgimp-text-layer*(text "Tutorials") (font "FreeSerif") (font-size 50.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 202.000000) (box-height 62.000000) (box-unit pixels) ¥Ê>ÁÁÍÊ>ݺ 8±€€€Áþþ!þÞÿÿþ]!þçÿÿþf!óñÿÿü²T5 LÿÿöÌ)=vÛÿÿþp!ûúÿø0þLÿÿþÌú•ÿÿy ûÿÿsþLÿÿþÌû Úÿ‚øx ÿìþLÿÿþÌügÿŒù±´ÿ¡þLÿÿþÌüÿ•øvÿ´ ÿRþLÿÿþÌýП÷=ûÿ´h þLÿÿþÌý?Cúæÿÿ´ þLÿÿþÌ%ýÛÿÿþ´ þLÿÿþÌ þF€€þ`þ€€þlý/ÚÿÿýÚ€ þLÿÿþÌ ü"_ÁÿÿþÀûiˆÙÿÿþØý0øÿÿ þLÿÿþÌ ýÔÿÿþÀýÇÿÿþØûŒÿÿý» þLÿÿþÌ þŽÿÿþÀþuÿÿþØþ€ÿÿþ´ þLÿÿþÌ þvÿÿþÀþ[ÿÿþØþ€ÿÿþ´ þLÿÿþÌ þtÿÿþÀþXÿÿþØþ€ÿÿþ´ þLÿÿþÌ þtÿÿþÀþXÿÿþØþ€ÿÿþ´ þLÿÿþÌ þtÿÿþÀþXÿÿþØþ€ÿÿþ´ þLÿÿþÌ þtÿÿþÀþXÿÿþØþ€ÿÿþ´ þLÿÿþÌ þtÿÿþÀþXÿÿþØþ€ÿÿþ´ þLÿÿþÌ þtÿÿþÀþXÿÿþØþ€ÿÿþ´ þLÿÿþÌ þtÿÿþÀþXÿÿþØþ€ÿÿþ´ þLÿÿþÌ þtÿÿþÀþXÿÿþØþ€ÿÿþ´ þLÿÿþÌ þtÿÿþÀþXÿÿþØþ€ÿÿþ´ þLÿÿþÌ þtÿÿþÀþXÿÿþØþ€ÿÿþ´ þLÿÿþÌ þtÿÿþÀþXÿÿþØþ€ÿÿþ´ þLÿÿþÌ þtÿÿþÀþbÿÿþØþ€ÿÿþ· þVÿÿþÎ þ`ÿÿþàþˆÿÿþÙþwÿÿþÈ þjÿÿþâ þ9ÿÿþ1ýìÿÿþíþ^ÿÿþä þ„ÿÿýù ýúÿÿýÑûcé­ÿÿþ2þCÿÿþ3 ýßÿÿþW þŒÿÿ÷ê’u¡Úÿ—ÿÿüñ¡ý ðÿÿþÛû*XÇÿÿûí4 ý Þÿÿûüÿÿüö®Xþÿÿþþÿ ÿþ• ý£ÿÿõ×6ÿôªV ý «ÿÿ$úNsS"üP û4hXÿ€€€µþ;ú3Äý¶%9þ¸ÿÿþŸ8ý÷ÿÿþä9þ¨ÿÿþŒ9ú“Ù‡‡€þ`ôBr¡ÐôСrB ü-Šâù.°éÓyü3ŽÖÿþÀ÷%Èÿï¶}˜àÿÿýÂ"ürÐÿÿýXüÿÿþPù#}Øÿÿôþúgôÿ¾ù1åÿÿófüE·üÿÿüPüÿÿû¦mÇÿÿþôþú–ÿÿ±ý*ìÿÿþûM^‚òÿÿú$ðFÃÿÿùzt[„ôÿÿþôþú=þÿû"ù3ùÿÿþ:þÿÿýÐfûL¿þ‹ÿÿþôþåúÔÿÿ¡þ©ÿÿýÖþUÿÿþ¤ þaÿÿþôýÿþvÿÿþMþBÿÿþ€þ5ÿÿþ/ þAÿÿþôþÒþÜÿÿþ,ýÚÿÿþÖþ4ÿÿþ þ@ÿÿþôþ!ýýÿÿþ þ‚ÿÿýûþ4ÿÿ þ@ÿÿþô þ0ÿÿþû þaÿÿþ/þ4ÿÿ þ@ÿÿþô þZÿÿþ þFÿÿþ\þ4ÿÿ þ@ÿÿþô þ€ÿÿþ+ þ+ÿÿþsþ4ÿÿ þ@ÿÿþô þjÿÿþE þÿÿþKþ4ÿÿ þ@ÿÿþô þ>ÿÿþ^ þ ÿÿþ!þ4ÿÿ þ@ÿÿþôþþÿÿþŒ þ(ÿÿýôþ4ÿÿ þ@ÿÿþôýÎþèÿÿýâþCÿÿþËþ4ÿÿ þ@ÿÿþôýzÿþ£ÿÿþ>þ_ÿÿþoþ4ÿÿ þ@ÿÿþôýéÿýñÿÿþ˜ú¯ÿÿÏþ4ÿÿ þ@ÿÿþôüÿÿþmÿÿýïúüÿþ8þ4ÿÿþ þLÿÿýüüÿÿý0‹ýÌÿÿýÈûÿÿšþEÿÿþ þ_ÿÿþøìÿF,rç<ýÆÿÿþútÿÿ–þqÿÿþW þ”ÿÿþBþ¢ÿÿýøEñƒýÿÿ¼e C˜ÿîRübêÿÿüâJüZòÿÿýÊ0úìüÄJô=¼îÿÿüûÿߦý¡ýÿÿüõÖ0ü'Ùúÿÿýð†ý( ú!TrG+€€€™ý 9ú"n»ú5ûZœÞÿÿþ4û ÓÇöÿÿþ7ý ÿÿþ8þ5ÿÿþ8þÿÿþ8þÿÿþ8þÿÿþ8þÿÿþ8þÿÿþ8þÿÿþ%õe©ÉéóÏ«~ þÿÿþôf§ÐèÅp(4Fò|êÿË‚C[ªÿÿàAþÿÿþó7Ñÿ×€9W›þÿÿ“û¦ÿÿwú}ÿÿùþÿÿþûïÿqûHùÿ›ÿýüúíÿÿŽþÿÿþüÆÿÞü†ÿ¢ÿþ úÅÿÿôþÿÿþûÿÿ¶ü êªÿþ$þªÿÿþ þÿÿþúQÿÿéý˜²ÿþÍþ¨ÿÿþ=þÿÿþþeÿÿþNýD¹üŽˆþ¨ÿÿþYþÿÿþþ=ÿÿýùTý8üCÖÿÿþhþÿÿþý æÿÿüþ¡úyÞëâÿÿþhþÿÿþþaÿÿüñqø8¦úÎa¨ÿÿþhþÿÿþþŠÿÿýÕBú=¾ÿ×Bþ¨ÿÿþhþÿÿþýuûÿÿý¡ù ÿý‚þ¨ÿÿþhþÿÿþý1Îÿÿýà/ûÒÿÿ~þ¨ÿÿþhþÿÿþütñÿÿýé&ÿýÄþ¨ÿÿþhþÿÿþ ü™üÿÿþœÿþzþ¨ÿÿþhþÿÿþý=Jý?îÿÿýèÿþJþ¨ÿÿþhþÿÿþýh¹ý(äÿÿþ9ÿþ€þÂÿÿþhþÿÿþühø þÿÿþPÿþ×ýîÿÿþrþÿÿþühÿYþ2ÿÿþÿþMûLÝúÿÿ÷”0ÿÿþ)ûhÿ×û:ÿÿÔÿ÷ü t•×ùw{ÿÿ÷øšöeÿÿþPúhÿÿ†ûŽÿ÷0ÿûÑ.=ÿÿú„QçÿÿýÒ2þhÿÿý®ú'þø_þÇÿÿü×~ö¦ýÿÿûcÊùÿÿîï®h÷©ÀñþÙ©Õÿÿ½&ú7ecûjJô@ctLlllle2XPIconÿ     %‚XP¦PsPP‹P—XP2WH{H‹H›H«H»HËHÛHëHûLAOóPPP#P3PCPSPcÛý|vr!rú&h£©§!§æ8V ||||~}||~||~}|}„||}}û~}}~}}ú~}}„~Ö:R›qIIOIIMJIJNIILKIO[IILMJLOKKNMKMNKJ]PÖ!;P›qIIOIINKIJNIIMKIP\JKNOLNQMMPOMOPML^QÓ($0@PœsNNTNNRONOSNNQPOUbQQUURTWSSWUSUVSRcWÓ:KG@BPœqJKPKJOLJKOJJONMS`OORSQSUQQUSQSTQQbVê3LXKCPœqIIOIIMJIJNIINNëVaNORSPRUQQUSQTUQPbUÓ2M]NCPœrJKPKJOLJKPKOPV‹±µª¨©rSZXTTWVTVWSSdXÓ.JSKEPœsMMSNMROMOUe“o[¥´’†Å_—†^X\ZXZ[XWh]Ó-IOJEPœqIIOIIMJILu«È©aœžgR_·}„ÌÀš`ZXVXYVUfZÓ,HKGEPœqIIOIINKP€´“n³—¦iTa¹²‘|±­{ZXZ[WWg[Ó)FGFDPœsMMSMMRR‹»‡UT…ºÁ°oYfªe`j›¾ˆ^_`\\k`Ó%ECFFPœrKKQKKQP„·xRSZ”±ŽlY`«x^`]ÃŒ^_`]\k`Ó$ECGJPœqIIOII^\T•§^RV[^_hXYaf\]_l°žfug`\[j_Ó CDHSPœrKKQKMœ¸x·XYYX^j[\_`^`h­µ‰ªÉ’c__mcÓAEH[PœsMMSN]³ž©¸É¥^\\]sƒsdaco»Å¼¨«±ibboeÓ@EI]PœqIIOKu¶aXviUZb˜ÉÕÊÐɘfbd¤‚fy¿}``ncÓ@FJ]PœqJJQP—¥XRTZVW^žÔ±Žv†²Öœefddgej´ ebpfÓAGKcP{Z[ai¹“cbchegŽÑžsxlmv§Òtqqssv¦Ä{p{rÓAINrPœuOQWlÀ±…k^`\b²¼lgrefixıqjk~–µÉ¿{iulÓAKO„PœqIKRSt–¯¼ƒ[Waɤ_cn`aej®Çogs¼½¡ˆsgerhÓBLOPœrLNUQRZr¸™^[dÊ¥afqdehl¯Éskwĸ|ojiulÓBMP‰PœrMOV`™­¶ÂŽ`[b²½lgrefjyırln’²ÁŤrjwmÓEMVxPœqJLSa¼©vf\]Y\ˆÎ–iqddm¢Ðnklos{º®nivkÓHNdjPœqJLSSœª[UX^Z[b¥Ø­‹t‚¯Ú¥mnmmppx–kkwyÓJMrePœtOQXTtºsZs~__doŸÌ×ÍÔÍ¡vpryxtŒÄƒvn„¿ÓLMxePœsLOVRV¤¡—¼Åz]bbcy‘“ˆ|nlo{¸É³“ª·Ÿªt…ÊÓJNvdPœrKMTPQ‚ȵŒ¾¤dabagrfgkllo‡Ì¾´ÄÖÒÉÍ£†ÅÓ!KQq`PœsMOVRTc€kнŠ`cdcithimonqw¢Äš—ΓáÄÓ.KVqXPœtNPWSU[ZˆÃ‘__dn{ruij|Žzruu¨Ïο…utªÍÖÓ>N\ySPœrKMTPQWX„¿–c]e¦Ê§xfo¶Ñªrry§Îļ€rox¬­ÓEQ]QPœrKMTPQWVW€¶­p‹»¼´wen»³¿“„¹Ñ·«tnm|qÓCQ]}RPœtORYTV\[Z\u®¹Æ®¥wip¸Ÿ¢ËÂÃÒ¾¢ŸÍ“qozpÒAQapSPœrKMTPQWVVX^h˜ªt¹¹ž’”ãx±ŸžÃ£¸ÇÒ‘nlwwÒDQlcSPœqJLSOPVUUX]Z^igš´½º½Ç›mut¯ªrt‹pkj¾Ò&LP{\TPœuSU[XY^]]_d`bfgjp{oqtrnqÓtsrusp…ËÉÒ/QO„[TPœyZ[a]_dccdifhklkpzoorsrt–Ä€wvuwwy¼ÐÒ,RO[TPœqIKRNOUTTV\XY^^]coabfgfh˜Î®•}jjk{Õ«jé+PTvZTPœqIKRMOUTSU[WY]]ëcnaaefdgq† ¸Ä}ii‰Õ–hè5PapVTPœtOPWSTZXXZ`[]aaëfrdehihjlnwʉllŠÖškè CQnrSTPœqIJQLNSRRTZUW[[ëam^_bcbdˆ¶»À¸yfftαgÑNRuvSTPœqIIPKLRQQSYTVZZY_k]]ab`b‹ÉŒvmcdde¢ÑŠÑQRttSTPœrJKQLMSRRTYUW[[Z`l]^ab`cp¼”ecbddam½ÑÑNTrkSTPœtNNTOPUTTV\WX]\[am__bcbdg™·pnŒ€fbb€¦Ñ"MWu]TTPœqIIOIJPNNPVRSWWV\iYZ]^\^`o¸œ±É¸j]\kcû3PZTTØPœqIJPJJPNNPVQSWWV\hXY\][]_]ŸÅ ˆË‹][j`ÑBS[…PTTPœsNNTNNTRQSYUVZYY^j[[__]_b_lzk¬«o^^mbÑFT]‚RSSPœqIJPJINLLNSOPTTSYfUVYZXZ\YYd£¼l\YX}yÑAZs‰hddPœqIIOIIMKJLRMNRRQWdSTWXVXZWWaœ¼ˆ^WoÀÎÐ @UryouzPœqKKQKKOLKMSNOSSQXdTUXXVYZWWZZŒ»Ÿj¨»ÄÐHUZVTSSPœrMMSMMQNMNSNOTSRXeUUXYVY[WW[ZZx¯½¸ÀÑ9<58BNHPœqIIOIIMJIJNIJNNMSaOPSSQSVRRUTRTj—ƒ}ÌÛýˆ{!{ù_n³»¹º ºó,†_²«››››œ››÷œ››œ››œ¡››ûœ››œ››úœ››¡œó7ŒZ®’sswssvssåwssvusx‚ssuutuwtuxvuvwtt‚xÖQY®’sswssvtstwssvusx‚ttwwuwyvvyxvxxvvƒzÓ7HAi“Y®”vw{wvywvwzvvyyw|†yy||z|~{{~}{}}{{‡~Ógw|—Y®’ssxssvtstwsswvuz…wwzzyz|yy}{z{{yy†}ðZ‚†ˆ˜Y®’sswssvssüwsswwë}†ww{zy{|yy}{z{{yy†}ðW‚‰˜Y®’ttxttwttåxtxy}¦Ãƽ¼¾“{||~}|}~|{ˆÓRƒ‘™Y®”vvzvvyvvw|‰¬€¹Æ«¢©Óž„°¢„€‚€Š‚ÓN~•šY®’sswssvssu•¾Ô¼…³µŠ{„Ç›¡ØÏ±…€€~}}‰ÓL|}—šY®’sswssvtxŬĩ¯»Œ|†ÉªÃª›ÂÀ™€~Š‚ÓHzz—™Y®“uuyuuyy¥Ê¢|{ ÉΊÐнˆ…Œ²Í¤„„…‚‚…ÚEwz—›Y®“tuyutyx Ç˜z{€­Ã¨Ž…´¿—„…‚žÑ§„„‚ý…Ó@v™žY®’sswssƒ{®¼ƒz}‚„„‹€†‰‚ƒ…ÂµŠ•Š…‚‚Ž…Ó8r†›£Y®“ttxuv²Èª—dz€€…Ž‚‚…†„†ŒÀÆ¥¾Ö¬ˆ……ˆÓ3p‰œ§Y®”vvzw‚Å´½ÈÕºƒ‚‚ƒ”©ª ”‰‡ˆ‘ËÓ̽¿ÃŒ‡‡’ŠÓ1oŒ¨Y®’ssxt”Æ…–©Œ}€‡°ÖÞ×ÜհЇ‰¨º ‹™Îœ††ˆÓ/pŽž¨Y®’ttyy¯¹~z|€~~„µßé–¢Äà³ŠŠ‰‰‹ŠŽÆ·Šˆ’ŠÓ.t’Ÿ¬Y¯š€†ŒÉ¬ˆ†ˆ‹‰‹©Ü¶•˜–¼Üª•““••—»Ò›’š”Ó,w˜ ´Y®•xy~ŽÏჅ‚‡ÅÌ‹“ŠŠŒ—ÒÃ“ŽŽ°ÇÖÏ›–Ó({ž¡¿Y®’stz{”­ÁË ~†Õº…ˆ‘†‡ŠÂÕ’Œ•ÌÍ·¤•ŒŠ”ŒÓ$}¡¡ÅY®“uw|yz€’Ȳ„ˆ×»‡‹“‰ŠŒÂÖ•˜Òɪ›’ŽŽ–Ó$¡¢ÂY®“vw}…±¿ÇЩ…‚‡ÃÌ‹”Š‹™ÒÄ”‘¬ÅÐÓº”—Ó+ˆ¡¥¹Y®’tu{†Ì¼–Š‚ƒ€ƒ¤Ú¯“‰‰¸Û¨‘’•›ËÂ‘Ž—Ó/’¡­²Y®’tu{{³½}ƒ‚‡ºáÁ§• Â㻑‘“’™Ð°˜™Ó1𡵰Y®”wy{”É”“œ……‰‘µØàØÞÙ¸—“”™™–¨Ò¢—‘¢ÎÓ3¡¸°Y®“uw}y|¸¶¯ËÒ™„‡‡ˆ™¬¬¥œ‘’›ÉÖÆ®¿È¶¿–¢ÖÓ3¢·°Y®’tv|yyžÕƧ͹‰‡‡†‹•ŠŒ’¤ØÎÆÒàÝÖØ¹¤ÓÓE𣵭Y®“vw}z{†¥Ì¥…ˆ‰ˆŒ–Œ’‘“˜¸Ò²°ÚѬ­Ò¸ÒÓc›¦µ©Y®”wx~{|€¤Ñ¬……‰‘š“—Žœ©š”–—½ÛÚϤ——¿ÙàÓ¡ªº¦Y®’tv|yy~¡Î¯ˆƒ‰»Ö¼™‹‘ÇÜ¿””™¼ÚÒÌŸ•’™ÀÁÓ¥«½¥Y®’tv|xy~}~ÇÀ‘¦ËËÅ˜Š‘ÌÅέ¢ÊܵŸÉ¿–’œ“ÓŒ¥«¼¥Y®”xz|}€€ƒ•ÀÉÔ´Á»˜’ɶ¹×ÐÑÝι·Ù®”’š“Ò‡¥­¶¦Y®’uw|yz~}~„‹°¾•Éʵ¬­Ò¹™Ä¶¶Ò¹ÉÔݬ’˜—ð0¤³¯§Y®’tu{xy}}䃀ƒŒ‹±ÆÍÊÍÔ³—•ÿ•—§ª”Ž©ÍÒS›¤»«§Y®–{|~ƒ‚‚„ˆ†‡‹‹’›’“–”‘“žÑ­––•–•“£ØÖÒd¤£¿ª§Y®˜†ƒ„ˆ‡ˆ‰‹ŒŽ’š‘’”•”–¯ÒŸ˜˜——˜šÌÛ¨é]§£¾ª§Y®’stzwx|{|}‚€„„òˆ‘‡ˆ‹‹ŠŒ±ÚÁ¯ŽŽû›Þ¿Ò\¥¦¹©§Y®’stzwx|{|}~€„„ƒˆ‘†‡ŠŠ‰‹“£·ÉÒœ¦ß®Œá m£­µ¨§Y®”wx~{{€€„‚ƒ†‡†‹“‰‰ŒŒò‘—«×¥Ž¥à±ŽÑ#‰¤´¶¦§Y®’ssyvv{zz|€}~‚‚†„…ˆˆ‡‰¤ÇÌÏəЋ•ÚËÑ,Ÿ¥¸¸¦§Y®’ssxuuzyy{|}€…ƒ„†‡†‡¦Õ¨—‘‰ˆ‰Š¸Û¦Ñ%¤¦·¸¦§Y®“ttyvv{zz{€}~‚†ƒ„‡‡†ˆ’Ë®Š‰ˆ‰‰‡ÍÛÑ+ž¦¶³¦§Y®”vw{xx}||}~‚ƒ‚‡……‡ˆ‡ˆ‹±È’§žŠ‡‡ž»èE›¨¸¬§§Y®’sswstxwwy}z{~~낌€ƒ„‚„†‘É´ÃÖÈŽƒƒŽˆûl ª¾§§ØY®’ssxssxwwx}z{~~}‚‹€ƒƒ‚ƒ…ƒµÓ¶¥×§ƒ‚…ч§«Á¥§§Y®”vvzvvzyyz||€„„„ƒ„†„šŽÀ¾‘„ƒ†û©«¿¦¦ØY®’sswsswuuv{wx||{€Š}}€‚€€‰¸ËŽ‚€œ˜Ñ„«·Ã±¯¯Y®’sswssvtsuyvwzzy~ˆ{|~}€~‡³Ë¤„~‘ÏÙЂ§¶»µ¸»Y®’ttxttwutuzwx{{z‰||~§Ë¶¼ËÒí=‘ª­ª§¦¦Y®“vvzvvyvvåzwx{{z‰||}~~€—ÁÌɧÏíswjm{ƒƒY®’sswssvssæwstwwv{…xx{{y{}zz}|{|Œ¯ ›×Ûý™‘Œ!Œú§ËÒ"ÒóRâgÉÍÂÂÃÂÂÃÂÂòÃÂÂÃÃÂÃÆÂÂÃÃÂà ÃýÆÃó]îbŽ©©«©©ª©©å«©©ªª©¬²©©ªª©ª«ªª««ª««ªª²¬ó‹ñaŽ©©«©©ª©©å«©©ªª©¬³©©««ª«¬««¬¬«¬¬ªª³­ðXm`®úaž««®««­««å­««­¬«®µ­­¯¯®¯°®®°¯®¯°®®¶°ðš¾®ÅÿaŽ©©¬©©«©©ì«©©««ª®´¬¬®®­®®­­¯¯®®­ýµ¯ðˆÁ·ÌÿaŽ©©«©©ª©©ü«©©««ó¯µ¬¬®®­®¯­­¯®®­ýµ¯ð‚¾¸ÔÿaŽ©©¬©©«©©å«ª¬¬¯ÇÚÜ×Ö×½®²°¯¯°°¯¯°®®¶±ð{¼·àÿaž««­««¬««å®¶Ëº±ÔÛÌÆÊãÄ³ÎÆ³±²²±±²±°¸²Ów¹·ìÿaŽ©©«©©ª©©ª½ÖåÖ´ÐѸ®´ÝÂÅçáе²±°±±°°·²Óq·´óÿaŽ©©«©©ª©¬ÃÛ̺ÚËÎÕ¹¯µÞËÚËÁÙØÁ²±²²±±¸³Úl´²ôÿažªª­«ª¬­ÈÞÆ¯¯ÅÞáÚ¼±·ââ×·´¹ÐàÇ´´³ýºµÓd°¸öÿaŽ©©¬ª©««ÄÜ¿­®±ÌÚÊ»±µÑØÀ´µ´ÄãÉ´´µ³³ºµÓb®ÅøÿaŽ©©«©©²±®ÍÕ³®°²´´¹±²¶¸³´µ»ÚÒ¸¿¸µ´³ºµãUªÒüþaŽ©©¬ªªÏÝÊÀÜб²±±´º³´µµò¶¹ØÝÈØæÍ·µµ¼·ëK¥ØþþaŽªª­«²ÚÐÖÝåÔ³³ë¾ËËÆ¿·¶·¼ßäà×ØÚº··½¸ÓJ£ÛÿþaŽ©©«ª½Ü³°¾Ê¹°²¶ÎæëæéæÏ¸·¸ËÕŹÁáö¶¼¸àF¦ßÿþaŽ©©­¬ÍÔ¯®¯²°±´ÑëÛË¿ÇÛìÒ¸¸¹ø»ÜÓ¹·½¹ßE®çÿþaÆÂ±±´¸Þ̵¶·¹·¸ËêÓ¿Á¼¼À×êÌ¿¿÷ÀÁÖäþÿÓ@¶óþýaÅ¿¬¬°ºáÚź´µ³¶Ü໹¿¹¹»ÁãÛ¾¼¼ÄÐÝæáûÀ¼Ó9½üþýaŽ©©­®½ÍØßų±µåÕµ·½¶·¹»Ú徺ÀàáÓÈ¿º¹¿ºÓ5¾þþýaŽª«®¬­±¼ÝÏ´²·æÕ¶¸¾¸¸º¼Ú濼ÁäßÌý»»À¼Ó9ÅþþýaŽª«®´Î×ÜâÊ´³¶Û໹¾¸¹»ÁäÛ¿½¾ÍÜãåÖ¿¼Á¼ÓBÓþþýaŽ©ª­´ßÖ¾·³³²´Èèλ¾¸¹½Ôé̾½½¿ÀÄàÛ¾¼Á¼ßHåþþýaŽ©ª­®Ðײ°±´³³¶ÕíÚÊÀÆÚîÖ½¾¾¿øÃãн½ÁÂÓLîÿýýaž«¬¯®½Þ½²½Ãµµ·¼ÒçìèëèÔÁ¾ÀÂÅÂÀËäÈÁ¾ÇâÓKïÿýýaŽª«®­¯ÓÒÎßãÁ´¶¶·ÂÍÎÉľ½¿ÄßæÜÎØßÔÙÁÈçÓNîÿýýaŽª«®­­ÄåÜÉàÔ·¶¶·ºÀ¹º¼½½¿ÉèâÝäìëçèÕÉäÓlðÿýþaŽ«¬¯®®µÃºÈàɶ·¸¸»Àº»½¾¾¿ÂÕäÒÑéäÎÎäÔãÓ›ôþýþaŽ«¬¯®¯²²Èã̵µ¸½Ã¾Á»¼ÄÌÄÀÁÂØêéãÉÁÁÙèìÓÈûþýÿaŽª«®­­°±Æáη´¸Öæ×ú¾ÝêØÀÀÃ×éäáÇÀ¿ÂÙÙÓØÿþýÿaŽª«®­­°°±ÃÝÙ¼Éààݹ¾àÜâÎÈàêÓÆßÙÁ¾¾Ä¿ñÏÿþýÿaž¬­°®¯²²ä³¾ØÞäÑÙÖÁ»¾ßÓÕçããêâÖÔèο¿Ã¿ðÍÿþýÿaŽª«®¬®°°ä±´¹Ï׿ÞßÒÍÎäÕÂÜÔÓäÖßåêξ½ÂÁÒKÚÿþþÿaŽ©ª­¬­°¯°±³²´¹¹ÐÜáßàåѽÁÀÛÙÀÁËÍ¿½¼ËáÒðÿýþÿaÅ¿­®±°±³²³´¶µ¶¸¸º½Â½¾À¿¾¾ÅãÎÀÀ¿ÀÀ¾Èçæâ”ûÿýþÿaÅÀ±±´³´¶µ¶·¹¸¹»»º½Â½¾¿¿ùÀÏäÆÂÂÁÁûÂàéËé‡ûÿýþÿaŽ©ª­«¬¯®¯°³±²µµë¸½··¹º¹»ÐéÚÏﻼÃëØ»ð‰úþýþÿaŽ©ª­«¬®®û°³±²´´û·½¶·¹¹òº¾ÈÓÞäĺ»ÉëϺï§úþýþÿaž«¬¯­®°°û±´³³¶¶û¸¾·¸ºº»ô¼ÁÌæÉ»»ÉìÑ»è5ÕüýýÿÿaŽ©©¬««®­®¯²°±³³ë¶¼µµ·¸·¸ÈÝßâÞ¹¹¿èÛ¹ïBïÿýýÿÿaŽ©©¬ªª­­û®±¯°²²òµ»´µ··¶·ÉæÊÀ½¸¸û¹ÔéÉï8ðÿýýÿÿaŽ©©¬ª«­­û®±¯°²²ëµ»´µ·¶¶·½àθ¸·¸¸·¼àéïEìÿýþÿÿaž««­«¬®®û¯²°±³³ëµ»µµ··¶·¸Ðݽ¼Êĸ··ÄÕáníþýþÿÿaŽ©©«©©¬«¬­°®®±°°³¹²²´´òµ¶¼ÞÑÛæÝº´´º¶è¦õþýþÿÿaŽ©©¬©©¬««¬¯­®°°ë³¹²²´´³´µ´ÒäÓÈæÉ´³ºµèËýþüþÿÿaŽªª­«ª­¬¬­°®¯±±û´º³³´´òµ¶µ»ÁºØ×¼µ´»¶ÑÌÿþüþÿÿaŽ©©«©©ª©ª«®¬¬¯®®±¸°°²²±²³²²·Ôߺ³²±ÃÀÐÂþýüýþþaŽ©©«©©ª©©ª­««®­­°·¯¯±±°±²±±µÐßÇ´°¼áèý%ÇþþýØaŽ©©¬ª©«ª©ª­«¬®®­°·¯¯±±°±²±±²²ÉßÒ¹ÖßãûYÚÿþÿÿØaŽªª­ªª¬«ª«­«¬®®­°·¯¯±±°±²±±²±±¿ÙàÝÉáí*ª®›ŸµºÁaŽ©©«©©ª©©æ«©©¬¬«®µ¬¬®®­®¯®®¯¯®®¸ÎÅÂæ›þ"ü-:Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿSüÿøûÿÿ8÷ÿïûÿÿýüß6ýèõÿÿýýûÿ5ýâúÿÿüþüÿ5ýÎöÿÿüøìÿ4öžÇßðùúïÐ$röm˜²¦¡ª¾ªÿ$§ö—¨¯–v–zÿ$|û}||~||ï~||~||~ƒ‚±§‘z{’{%äIJLIINJIJNIIOIIO]|»¢‹x„Ž_?6#äKLNJINJIJNIIOIIPa¦Õ³‘~ŽUB9#äRSTPOSONOSNNSNNToÔúéÕȽ‚UE6#äPQRNMQMKKOJKPKJQ‡çöõêÙ»sP6#äOQRNMQLJJNIIOIIO ÷øîéסyA5#RæTPOSOMMPJKPKJU¸öùíáÏUyB6#WæYUTXSQQTNNSNMbÖ÷õïà¾{yC6#äTUVRQUPNNQKJOIIwéûñçÚ­MxD9#äUVXSRVQPORLKPJIšðøòçÒ˜^xE9#äZ[\XW[VTTWQQTOR¼ùøëâÊw_xF9#äZ[\XWZVTTWQPTNiÙöøìÛ»]_vG;#äYZ[WVZUSSUPOSM„òùïêÛ¨P_tG<#]æ^ZY]XVVYSRUU¦öúîãÕ¢P_rH=#`æa]\_ZYY[VTX`Ê÷õïâÅV_pI=#^æ_[Z]XVVYSQUoáúóêÛ¶–XaoJ?#`æa]\_ZXXZUSWíöóêÕ§˜XbmK?#næokjmigfhdcg³ùøìåÏ’XdlK?#gçdbea_^`[ZlÍõùîÝÀ|XekLA#cæd_^a\ZY\VTxèùòìݨnXfjLA#fægcad_^]_YZ•ñûñå×iXgiMA#gæhdbd`^^`Z_½õ÷ðäÎvgXhgNA#fçb`c^\\^XiÚùôéÞ¿^eXieNB#äsrqlid^\\_X„êöôëØ§ReXjcOB#俼»¹ªqcjab]£øùíçÕ‡RhXj`OB#䛃†œ½sz¦adÀôùïàÉlNgXl_OB#ä‰hi„¹w¬Ä¹’uÞøôîßµ\MfXo^OB#äjj‰¹›¸v†¸µìúòæØSOhXs^PB#ä”klŽÍÄ‘a`r·óøñçцRPhXu^PB#ä{hiv œh^]hÈù÷êàÈqNMfXw]PB#äihidcg_]]‰áööíÛ·iNMfXy]QD#kælgfhcas¸öúîèÛŸiSQhXz\QD#䈛Ÿ‹qe`^tÈõùïâÒ…bNMfX|[QC#þ×ÕÕèÃŽ`\jÕùôîáÂpaMLeX}ZRB#äš|Ž½ÑŒdæøóéÚ¾wgVUkX~ZRA#äqpqmv¶Æt¢ñ÷ñêÔÄ¥p\[nX€YR@#dç`^ƒÓƒ¹øøìâѦ•eLKeXYR>#cç_]qÊ¡×õ÷îܽi[_LJdXƒYR:#fågcbuͱðûñêÝ­m]dQPgX…ZR;"`åa]\‰Õ¾ñùñäÔ±º€`KJeX‡ZSC"ã`^`\nººÏ÷õîã̉¾~]IIdXˆZSG"ã ~{’ÀÅ”àøõéÛ»„±c_KKeX‰ZSF"ãÈÔÖÊ­}ïöòëØ£šžWaNNgX‰ZSE-"ãlx{m]]«ùùíäÔœ®|Q\IIdX‰ZSG="Zå\XVgÉôøïß˲»bQ\IJeXˆZSH@"â\]^ZYwåúòëÞ²slRU`NNgXˆ[TH=!â[WYZ|£îøòæÖ¦YKIP\IJeX‡[THB2!âUWn¼ÓöøïæÐ•]IIO[IIdX†[TMJ@!âVWj¸ÕøøêÝÃhPKKQ]KKfX…[TQN<!áwXYdÀèöôìÚ®XRMMS^MMgX„[TIG= ᣑÂ÷úíåÙ‘MOIIO[IIdX…dSC;8 Túmrpo8øcˆzqp_6÷X…®ytso6öY•®ŽuutoU5öYŒŸ€uum_U4öouplqqhC${÷u™¨…gVbW%ºö¹¤©¯–|rt%›ûœ››œ››ïœ››œ››œŸ±§‘z{’{%sûussvssívsswssx‡»¢‹x„Ž_’#uævtswtstvsswssxƒ®Ì¥‰z‰€U™…#zæ{xw{wvwzvwzwv{‰Øá»žˆgU™|#xæzwvyuttwsswssx›åÔ¼¢‰v\à{#xæzwvyuttvsswssu¯ïÍ´„l[·˜{#zæ{xx{wvvxttxttyÀçÇ­–~c*·™{#~æ|{{zy{wwzvvØÛÁ©wX·š|#|æ}zy}ywwyutwssŽçÔ¹¡‰nA·š~#}æ~{z}zxxzuuxsr©æÌ´›‚c¬·›€#€æ‚~€}{{~yx{vtÄ䯫”{V¬·œ€#æ‚~€}{{~zy{wƒØÙÂ¥wN¬¶œ‚#ç~}€}{{}xwzu™ìѸ¡‡vN¬µž…#ƒæ„€‚}}{z|z±ë˰™‚„V¬´ž†#…憃‚„}|ÏâÄ«“{“^¬³ž‡#„æ…€ƒ~}{z}‰âÚ½¤Œ}ž`­²Ÿ‰#†çƒ‚„€|{~¡æÏ· …ƒª`®± ‰#æ‘ŽŽŒ‹Š‹ˆ‡‡½éÈ®™€„¯`¯± ‰#‹æŒ‰ˆŠ†…„…‰ÏÞÄ©{…±`¯±¡‰#ˆç…„†‚€‚}|åÖ¼£Št…±`°°¢‹#䋊‹ˆ‡‰…„ƒ„€€£éϵœ„sˆ±`±°¢‹#䌋Œ‰‡‰†„ƒ…Ääȯ–~rб`±¯£‹#ä‹ŠŠ‡†ˆ„ƒ‚„…ÝÝÀ¦zp‰±`²®£‹#”擉…ƒ‚„€™çÒ»¢ˆvr‰±`²­£‹#äÎÌËɾ“ˆŽ†‡°î̲œƒqxŒ±`²¬¤‹#䳡£³Ì”™¼ž†…ÅãǬ”~qv‹±`³«¤‹#䦡ɗÀÒÊ«ÞÙ¿§wsvб`µ«¤‹#äªŽŽ¥É²É–¢È½èѸ ‡uux‹±`·«¥‹#ä®ŽŽ¨ÙÒ«‡†’ÀæË²š€uyy‹±`¸ª¥‹#ä›–·³Œ„ƒ…ÍâÄ©’}vwvб`¹ª¥‹#䌉ˆ‹…„„ß×À¥‹{wvб`ºª¦#äŽ‹Š‹ˆ†’ÀïжŸ†y†zzŒ±`»ª¦Œ#䥳µ§“‰…„’Ëèʯ—€x…wvб`¼ª¦‹#þáßßèÑ©†ƒ‰Ùà©’zx…vu‰±`¼ª¦‰#䳞›ªÍܧˆ—åÖ¼£Š†‹}|±`½©¦‡#ä“’“—ÇÔ”±è͵žƒœ¸’‚±`¾©¦„#‰ç†„¡ÝœÂçÆ¬—‚—­ˆutˆ±`¿©§#ˆç…„’Ö²×Û¨Ž{y€„utˆ±`Àª§v#Šå‹ˆ‡–Ø»ëÔº¢‰|†ƒ‡yxб`Á©¦t"†å‡„‚¤ÝÃèÍ´š‚‘Æ„tsˆ±`ª¦,"ã…„…‚ÊÆÔãŬ”}ƒÍ›‚ssˆ±`ª¦†3"ã¶œš«ÏÒ¥âÛ¿¥zǃtt‰±`©¦ƒ7"ãÔÞàÖÀ›£ëѸ †v«´~…vwб`馂O"ãŽ—šƒ€¶íÊ°š‚…¿šyssˆ±`馄i"å‚~‡ÍàÅ«’ªÊ…y‚ssˆ±`ª§†m"‚䃀ä×½¥Œx†y{„vvб`ª§…i%!â~€š¯çηž…€{tsxssˆ±`ª§…rX!âž}}Éֿɝ˜€„ssxssˆ±`Áª§ˆ}s!âž}~ŒÂÖßĨ{rxtty‚tt‰±`Á«§‹€i!á—‡ÇåÔ½£Šwsyvvz„vvб`À«§…zj, Ḫ§¥Èïδ…rqwssxssˆ±`À¯¦}ea8 TúUSM??8øGot[SP?6÷Bnœ‡[UTP6öFœtVVUSU5öIwŠcVVPCU4ölj^QTTL.$Œ÷€™¨ƒbOXN%Òöеª¯—|rt%ÂûÃÂÂÃÂÂïÃÂÂÃÂÂÃ⳨‘z{’{%©ûª©©«©©í«©©«©©¬¯‘º¢‹x„Ž_èÁ#ªû«©©«©©í«©©«©©¬­™“nvq}UÿÒ#ä­®®¬¬®¬««­««­««®¦§Z!*;UþÈ#䬭­««­ª©©«©©«©©¬£¡< .üþÃ#䬭­««­ª©©«©©«©©§£— $ýþÃ#®¬é®«ªª¬©©«©©£ž}  *ýÿÃ#°û±¯®¯­­í®««­«« ¡P #ýÿÃ#¯û°®­¯¬¬í­ª©«©©˜ +)ýÿÅ#°®é¯­¬¬­ªª«©¦œ‰ þýÿÅ#²±ê°¯¯°­¬®«ž k &þýÿÅ#²æ³±°²°¯®¯­¬®«›L 9þýÿÈ#²æ³±°²¯¯®¯¬¬­¨œš( +HþýÿË#´ç³²³±°°±®­®§›Š W\þýÿÌ#µç´³´²±±²¯®¯¤¤f  ƒhþýÿÎ#µç³²´±±°±®­®œ¨C &§lþýÿÎ#¶´úµ²±±²¯¯ñž”%JÁlþýÿÎ#½ç»º»¹¸¸¹·¶¯¢{ mËlþýÿÎ#亹¹¸·¸¶µ´µ³²¨ž\ ËlþýÿÎ#丷·µµ¶´³²³°® Ÿ6'¢ËlþýÿÎ#¹ç·¶·µ´³´²®˜“ G°ËlþþÿÎ#øº¹¹·¶·µ´´î²« t f·ËlþþÿÎ#亹¹·¶·µ´³´± §S ‚·ËlþþÿÎ#¿æ¾¼º·µ´´µ²ŸŸ4+š·ËlþþÿÎ#äâààÞ×½·ºµ¶®¡‘ M¦¸ËlþþÿÎ#äÒÇÇÑà¾ÁÖĶ«žs  sª¸ËlþþÿÎ#äÊ»ºÇßÀØãÞ̧£Fª·ËlþþÿÎ#äÌ»¼ÉßÑÞÀÇݲ$8¡¬¸ËlýþÿÎ#äϼ½Ëèä̶¶º¨ X¬¬¸ËlýþÿÎ#äÄ»»ÀÓѹµ´¦£c x¬«·ËlýþÿÎ#»æº¸¸¹¶µ´ªžC "™««·ËlýþÿÎ#¼æ»¹¸¹·¶º±˜" >ª­­¸ËlýþÿÌ#äÉÑÒʾ¸¶µ¶¨‚ a±¬«·ËlýþÿË#þìëëèã˶´¨¨\  µ«ª·ËlýþÿÈ#äÑÄÃËàéÊ·¡¥:2¦¸¯®ºËlýþÿÅ#俾¾¼ÀÝå½¥ _м²±»ËlýþÿÁ#¸ç¶µÆêº¢s ~Ì·ªª¶Ëlýþÿº#·æ¸µµ½æÀ S б´ª©¶Ëlýþÿ¯#㹸¹·¶¾å¶ .2¤²µ­¬·Ëlýþÿ°"¶´èÈæ¨ `×´ª©¶Ëlýþÿ¿B"ã¶µµ´»ÞÒ©j  wàÁ²©©¶ËlýþÿÉM"ãÓÃÁÌáã°§K ›Ù´³©©·ËlýþÿÅT"ãåêëæÙÁ£œ,1¿Ð¯³««¸ËlýþÿÃu"ã»À»´¬¡‹ aÓÁ¬²©©¶ËlýþÿÇœ"²å³±°© h žÝ´¬²©©·ËlýþÿÉ£"³ä´²±¢¥: ž¹¬­³ª«·ËlýþÿÈ›<!â²°±±Á¥— E¨©©¬²©©¶ËlýþÿȨ…!âݰºÙ²z h²©©¬²©©¶Ëlýþþȸª!âð°¸Ç¤\ |¬ª©¬²©ª·Ëlýþþȹ›!á¿°±´¿:$•¬ªª­³ªª·ËlýþÿȵžB áÓËÉİ• AŸ«©©¬²©©¶Ëlýþþ½–“^ Sù*C+7÷dÓéÛºh6ö»þÿÿþëR5ý6àÿÿýe5ýdñÿÿý÷S$ü”ýÿÿýË&$<ý[Óÿÿüý $ãýåûÿÿýø%ÿýêD%ÿýÒ %ÿüþŸ%ÿýô^&ÿýÚ,&ÿüý·&ÿüø~&ÿüïH&ÿýÔ+'ÿý°'ÿüüš'ÿüö‰'ÿüò~'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò|'Ô&@JDPœrLLRLLPNLMQLLQPOVbQQTUSUWTTXWTVWVTrÔ3FEEPœz\\a\\`]\\`\\__]cn^_bcacdaaecacdaapiÔ PœsMNSNMROMNRMMQPNUaPPTTQTURRVUSTURRbWÙR›qIIOIIMJIJNIILKIO[IJMNKMOLLPOLNOLL]QÙS…hilihkihilhhjjhmshhkkjkljjmljkljjsmüY™¡žžþŸž ž Ÿžü B:7!7@ÔCntpY®“uuyuuxvuvyuvyyw|†yy||{|~||~}|}~}{’³ÔXxvwY®™…ƒ‚‚„„ƒ‚†„„††…†ˆ……ˆ‡…†‡……ŒÔ, Y®“vvzvvywvwzvvyxv|…xx{{y{}zz}|z||zz‡~öZ®’sswssvssåwssutsx‚stwwuvxuvywvwxuu‚yÙ[°¡‹ŒŽŒ‹Œ‹ŒŽ‹‹Œ‹“‹‹ŒŽŒŒŽŒŽŒŒ“übª³±!±ü H@=!=@ñe¤¢¢aŽªª­ªª¬ªªü¬ªª¬¬ë¯µ­­¯¯®¯°¯¯°°¯¯°¯®¼Ðñ„³®¯aÅÁ²²´²²³²²å´²²³³²µ»³³µµ´µ¶µµ¶¶µµ¶µµ¼¸ñ(B1,aŽ««­««¬««í­««¬¬«¯µ¬¬®®­®¯­®¯®®ú¯­­µ°öbŽ©©«©©ª©©å«©©ª©©¬²©©««ª«¬ªª¬«ª«¬ªª²¬édÆÆ¸¸º¸¸¹¹¸¹º¸¸¹¹¸º½¸¸¹¹ûº¹¹º¹¹ý½ºük½ÊÉ!Éü QIE!E@ü?Úÿ"ÿü?Úÿ"ÿü?Úÿ"ÿü>Úÿ"ÿü=Ùÿ"ÿû9Æðñ!ñûUv}!}û  "À⢧¬¯ÑõøðáÏxMQLLS^LLgXnT;!äegiwÛùóìß¾l\`\\al\\oXmYSC#äQRS|æöôè×£QNSNMT_MNhXFHLA#äJKM|îüõëÒ‡IINIIO[IIdX#iëjxáüøðÀƒhikihmrhi|ŸY(žø”áüüæ œžžü œX(7ùZÖüö°F7 7ý=+újËüØ9úLt—•L9ú?.+FL9üUKD;üNW3;ýNU=þUºâ·»¿¿ÔæÈ®–suyuuzƒuuб`Í´¦w!䈉ŠÞÞÀ§yy„…‘±`³©¦†#yæz‘äÒ»¡ˆurvzvv{„vv‹±`‰‘™„#tævÜι¢‚srswssxssˆ±`#2B-#ŒìˆÇÒÇ¶Š‰‹ŒŽŒ‹Ž“‹Œ›³a(±ø›ÅØØÆ–­±±ü²¬a(=ùWºØÓšD= =ýD+ú\¯Ø»p9úFd‚39ú6(%A39üJC=;üNP3;ýNU=þUºâÓÕ×Ϫz e¨¬ªª­³ªª·Ëlüýÿ¶)4!ä¶·¸¨ªR †²³²²´¹²²¼ËlýþÿÍ#䬭­šŸ20›«­««®³««¸ËlÏÞëÊ#䩪ª•ƒ" S¦©«©©¬±©©¶Ël8MfI#¸ë¹–†fbQ6¸¸¹¸¸º½¸¸ÂÌm(Éø£”ššŽƒÂÉÉýÁo(EùP†š—rCE EýK+úFšˆW9ú3H]`39ú-039ü530;ü:>";ý:*=þ*ºÿüò|'ÿüò|'ÿüò|'ÿüò|'ÿüò{'ñþôÿÿþóññûðßn'}ùžòÿýÓ‰}}û|l3'ùHäÿæfû'ú(ÝûŒ  /ûؽ/û$ïÀd  ##÷! #æ I !&)+,++)&$ &ú  ù 퀀€€,(–K %XP Backgroundÿ     QJXPQn)5XPQÊi!}8‘.¥¹¤ÍÒâ:õ¼õÌõÜùÍüøÿú! = {ñþÇÍ5ÍúÕÎÍçæççþæç çþæççþæççüÕÍÜç6çýÎÜççþæççýÇÍççþæççþæççþÍç9çýÍæç8çþÍç9çþÍææþçææþçææþçææñçæççæçæçææçææçææþçææþçææüçæçææþÍååæåèæååææåæåææååæåææåææååææååüæåæååüæååææåýÍäååûäååäååùäåäååäååäåøäåääåääååõäååääååäååþÍääþãääþãääùãääãäãääþãääãäþãääþãääþÍã9ãþÍã9ãþÍââûãââãââúãâãâãââùãâãâãâããâãâüãâãââãâþÍââáâáýâáââþáââþáââáâùáâáââáââáûâáââááþâááâþÍááþàááàýáàááüàáàááûàááàááüàáàááþàááþÍà9àþÍà9àüÍààßßàßüàßàßßàßûàßààßßàúßààßàßßàößààßßàßààùÍÞßßÞÞßßüÞßßÞÞßÞßõÞßßÞßßÞßÞßÞÞßþÞßßýÞßÞÞüßÞÞûÍÞÞÝÞÞÝÞþÝÞ ÞþÝÞÞûÝÞÞÝÞÞþÝÞÞýÝÞþÍÝ-ÝþÜÝÝþÜÝÝþÍÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜþÝÜÜûÝÜÝÝÜÜþÝÜÜþÝÜÜþÝÜÜþÍÜ9ÜþÍÜÜÛùÜÛÜÜÛÛÜÜÛÜöÛÜÛÜÜÛÛÜÜÛÛÜÛÜýÛÜÛÛÜÛýÜÛþÍÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛûÚÛÚÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛÛþÍÚ(ÚþÙÚÚþÍÙÙûÚÙÙÚÙÙþÚÙÙÚÙþÚÙÙùÚÙÙÚÙÚÙÙþÚÙÙüÍØÙØØÙØÙúØÙÙØÙØØõÙØÙØØÙÙØØÙØØÙØÙøØÙÙØÙÙØÙÙûØÙÙØþÍØ9ØþÍØØùרר×רØúרØ×רØø×Ø×Ø×Ø×ØØþרØûר×רØþרØþÍ×9×þÍÖÖþ×ÖÖþ×Ö Öþ×ÖÖþ×Ö Ö×Öú×Ö×Ö×ÖÖþÍÕÕþÖÕÕøÖÕÖÖÕÕÖÕÕÖÕþÖÕÕÖÕôÖÕÖÖÕÖÖÕÖÖÕÖÖÕøÍÔÕÔÕÕÔÕÕÔÕþÔÕÕÔÕÔýÕÔÕÕøÔÕÕÔÔÕÔÕÕþÔÕÕÔÕüÔÕÔþÍÔ9ÔþÍÔ9ÔþÍÓ ÓþÔÓÓþÔÓÓûÔÓÓÔÓÓþÔÓÓþÔÓÓüÍÒÓÒÒÓýÒÓÒÒþÓÒÒøÓÒÒÓÒÓÒÓÓÒûÓÒÓÒÓÓÒûÓÒÒÓÒÒýÍÑÒÒþÑÒÒÑøÒÑÒÑÒÑÒÑÑÒüÑÒÒÑÑÒÑûÒÑÒÒÑÑöÒÑÒÒÑÒÒÑÑÒÒýÑÒþÍÑ9ÑþÍÑ9ÑþÍÐÐÑýÐÑÐÐþÑÐ ÐÑýÐÑÐÐûÑÐÐÑÐÐúÑÐÐÑÑÐÐþÑÐÐûÍÐÏÏÐÐõÏÐÏÐÏÐÐÏÏÐÏÏôÐÏÏÐÏÐÏÐÐÏÐÏÏ÷ÐÏÏÐÏÐÏÐÏ ÏÐþÍÎÎÏþÎÏÏúÎÏÎÏÏÎÎüÏÎÎÏÏøÎÏÏÎÏÎÏÎÎÏþÎÏÏÎÏýÎÏÍÎþÍÎÎþÍÎÎþÍÎÎûÍÎÎÍÎ ÎüÍÎÍÎÎ;Í;ÍÍÌüÍÌÍÌÌÍÌæÍÌÌÍÌÍÍÌÍÍÌÍÌÍÍÌÍÌÌÍÌÌÍÌÌÍÍÌùÍÌÍÍÌÌýÍÌËËýÌËÌÌöËÌÌËÌËÌÌËÌÌËÌËøÌËÌËÌËËÌÌþËÌÌýËÌËËÌËþÍËËþÊËËþÊËËþÊËËþÊËËûÊËËÊËËþÊËËþÍÊ9ÊüÍÉÊÉÉöÊÉÉÊÉÊÉÉÊÉÉþÊÉÉþÊÉÉþÊÉÉÊÉüÊÉÉþÍÉ9ÉþÍÈÈýÉÈÉÉÈýÉÈÉÉþÈÉÉüÈÉÈÉÉýÈÉÈÈùÉÈÈÉÉÈÉÉÈüÉÈÈÉÉüÈÉÉþÍÈ ÈþÇÈÈþÇÈÈûÇÈÇÇÈÈÇÈþÇÈÈþÇÈÈþÇÈÈþÍÇ9ÇþÍÆÆûÇÆÆÇÆÆþÇÆÆþÇÆÆþÇÆÆùÇÆÇÆÇÇÆÆþÇÆÆþÍÆ9ÆþÇÍ5ÍúÕÎÍçæç3çüÕÍÜç6çýÎÜç7çýÇÍç8çþÍç9çýÍæç8çþÍç9çýÍçææûçææçææþçææþçææøçæççææçææçþæçç æüÍåæååæüåææååþæååþæååæåæåæåûæååæååûæåæåþÍååäûåäåäååäåüäåäååþäååþäååäåïäåääååääåäååäååäþÍääþãääþãääã äãäøãäããääãääþãääþãääþÍã9ãþÍã9ãüÍâãââãþâããâãâãâãâãñâãââãâãââããâããââãâùãââãââûÍáâáââáâöáâáâáâááâááâúáâáâáââáâûáâáâááâáþâááþÍá áþàááàáþàááúàáàáàááúàáààáþÍà9àþÍà9àýÍàßßöàßààßààßàßßþàßßþàßßüàßßààßüàßàßßàßàß÷àßßàßàßàûÍßßÞßßÞßüÞßÞßßýÞßÞÞìßÞßßÞßÞßßÞÞßßÞßßÞßßÞÞßÞßûÞßßÞþÍÞÞþÝÞÞûÝÞÞÝÞÞÝÞúÝÞÞÝÝÞÞÝÞþÝÞÞþÍÝ9ÝþÍÝÝÜþÝÜÜüÝÜÝÜÜþÝÜÜûÝÜÝÜÝÝýÜÝÜÜþÝÜÜþÝÜÜþÍÜ9ÜþÍÛÛÜÛÜÛüÜÛÛÜÜÛÜüÛÜÛÜÜþÛÜÜþÛÜÜÛÜþÛÜÜÛþÍÛÛþÚÛÛüÚÛÚÛÛþÚÛÛûÚÛÛÚÛÛüÚÛÚÛÛþÚÛÛõÚÛÛÚÛÛÚÛÚÚþÍÚ9ÚþÍÙ ÙûÚÙÙÚÙÙÚÙúÚÙÚÙÚÙÙþÚÙÙþÚÙ ÙöÍØÙÙØÙÙØÙØØýÙØÙÙØûÙØØÙØØÙýØÙØØðÙØÙÙØÙÙØØÙÙØØÙÙØØþÍØ9ØûÍØØ×ØØ×Ø×ýØ×Ø Ø×Øø×ØØ×ØØ×ØØþר Øþ×þÍ×9×þÍÖÖ×Öö×ÖÖ×Ö××ÖÖ××úÖ×ÖÖ×ÖÖþ×ÖÖþ×ÖÖ÷ÍÕÖÕÕÖÕÕÖÖÕÖÕÖÕÖÕþÖÕÕþÖÕÕñÖÕÕÖÕÕÖÕÕÖÖÕÖÖùÍÕÕÔÕÔÕÕüÔÕÔÕÕüÔÕÔÕÕûÔÕÕÔÕÕÔÕÔÕúÔÕÕÔÕþÍÔ9ÔþÍÔ+ÔþÓÔ ÔüÍÔÔÓÓüÔÓÔÓÓÔÓþÔÓÓþÔÓÓþÔÓÓüÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓüÍÒÒÓÓÒýÓÒÓÓÒÓÒÓÒÓÒúÓÒÒÓÓÒÒÓÒüÓÒÒÓÓÒüÓÒÓþÍÒÒÑøÒÑÑÒÑÒÑÒÒÑÒÑÒüÑÒÑÒÒÑÒÑÒÑÒûÑÒÑÑÒÒþÍÑ9ÑþÍÑ9ÑþÍÐÐþÑÐÐþÑÐÐÑÐÑÐõÑÐÐÑÐÐÑÑÐÑÐÐÑ÷ÍÏÏÐÐÏÐÏÐÐûÏÐÏÐÏÏñÐÏÐÐÏÐÏÏÐÐÏÐÏÐÏÏÐÏüÐÏÏÐÐþÏÐÐÏþÐùÍÎÎÏÎÏÎÎøÏÎÏÎÏÎÎÏÏÎõÏÎÏÎÏÏÎÏÎÎÏÏùÎÏÏÎÏÏÎÎþÏÎÎùÏÎÎÏÎÏûÍÎÍÍÎÎþÍÎÎÍÎþÍÎÎüÍÎÍÎÎûÍÎÎÍÎÎþÍÎÎ;Í;ÍÍÌÍÌüÍÌÍÌÌúÍÌÍÌÌÍÍÌüÍÌÌÍÍúÌÍÌÍÍÌÌýÍÌÍÍÌÍûÌÍÌÍùÍËËÌËËÌÌúËÌÌËËÌÌËÌþËÌÌþËÌÌËüÌËËÌÌËÌþËÌÌËûÍÊËÊËËûÊËËÊËËþÊËËþÊËËþÊËËüÊËËÊÊËÊËþÊþÍÊ9ÊþÍÉÉÊÉþÊÉÉþÊÉÉ÷ÊÉÊÉÉÊÉÊÉÉùÊÉÊÉÉÊÉÉÊ ÉþÊÉÉþÍÉ9ÉóÍÉÈÉÈÉÉÈÉÉÈÈÉÉÈÉøÈÉÉÈÉÉÈÉÉÈÉÈÉÈÉÈþÉÈÈÉþÍÈÈûÇÈÈÇÈÈþÇÈÈûÇÈÇÇÈÈþÇÈÈüÇÈÇÈÈþÇÈ ÈþÇÈÈþÍÇ ÇþÆÇÇûÍÆÇÇÆÆþÇÆÆÇÆþÇÆÆþÇÆÆüÇÆÇÆÆÇùÆÇÆÆÇÆþÍÆ9ÆþÇÍ5ÍúÕÎÍçæç3çüÕÍÜç6çýÎÜç%çþæççýÇÍç8çþÍç9çýÍæç8çþÍç9çþÍææüçæçææüçæçææûçææçææçæøçæçææççææþçææþçúÍåæåæååæåõæåææåæååæåææåûæååæååæåüæååææåûæåæåüÍääååøäåäåääåääåûäååäååþäååäåøäååäåäåääåþäååþÍä äþãä äþãääþãääþãä äãäýãäþÍã9ãþÍã9ãýÍãââùãââãâãââãâãøâããâãâãââþãââãâãâþãûÍáââááøâáâááâáââþáââáüâáâááâúáâááâááâ÷áââááâáâþÍááþàááþàááþàá áàüáààááþàþÍà9àþÍà9àòÍßààßßàßßàßßàßßþàßßýàßààûßàßàßßþàßßàßàþßààßýÍÞßßôÞßÞßÞßÞßÞßÞßßÞßýÞßÞÞóßÞÞßÞßÞÞßßÞÞßßúÞßÞßÞßßþÍÞÞÝÞþÝÞÞþÝÞ ÞÝÞþÝÞÞûÝÞÞÝÞÞüÝÞÞÝÝÞþÍÝ9ÝûÍÜÜÝÜÜþÝÜÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜüÝÜÝþÍÜ9ÜþÍÜÜÛÜþÛÜÜîÛÜÜÛÜÜÛÜÛÜÛÛÜÛÜÛÛÜÜÛÜûÛÜÛÛÜÜþÛÜÜÛþÜüÍÛÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛþÚÛÛÚýÛÚÛÛþÍÚ*ÚþÙÚ ÚûÍÚÙÚÙÙþÚÙÙþÚÙÙþÚÙ ÙþÚÙÙþÚÙÙýÍØÙÙüØÙÙØØÙøØÙØÙÙØÙØØÙûØÙØÙØØÙúØÙØØÙØØþÙØØýÙØþÍØ9ØùÍרØ×רØ×ýØ×ØØø×Ø×ØØ×רØ×üØ×רØþÍ×9×þÍÖÖþ×ÖÖþ×ÖÖ×Öþ×ÖÖþ×ÖÖþ×ÖÖú×ÖÖ×Ö×× Öü×Ö×ûÍÕÖÕÖÖøÕÖÖÕÖÕÖÕÕþÖÕÕþÖÕÕÖÕþÖÕÕÖÕÖÕÖþÕÖÖÕøÍÕÕÔÕÔÔÕÕüÔÕÔÕÕÔÕþÔÕÕÔþÕÔÔùÕÔÕÔÕÕÔÔÕÔýÕÔþÍÔ9ÔþÍÔ9ÔþÍÓÓþÔÓÓÔýÓÔÓ ÓþÔÓÓÔÓþÔÓÓüÔÓÔÓÓûÍÓÒÒÓÓÒþÓÒÒôÓÒÓÒÓÓÒÒÓÒÓÒÒüÓÒÓÒÒüÓÒÓÒÒöÓÒÒÓÒÒÓÒÒÓÓþÒþÍÒÒþÑÒÒþÑÒÒÑÒÑÒêÑÒÒÑÑÒÒÑÒÒÑÑÒÒÑÒÑÒÑÒÑÒÒúÑÒÑÒÒþÍÑ9ÑþÍÑ9ÑþÍÐ ÐþÑÐÐÑþÐÑÑ ÐþÑÐÐüÑÐÑÐÐúÍÏÏÐÏÐÐÏûÐÏÐÐÏÏúÐÏÏÐÐÏÏùÐÏÐÏÐÐÏÏóÐÏÏÐÏÐÐÏÐÏÏÐÏÏÐþÏüÍÏÏÎÎÏþÎÏÏøÎÏÎÎÏÎÎÏÏþÎÏÏþÎÏÏúÎÏÏÎÏÎÎõÏÎÎÏÎÎÏÎÎÏÎÎûÍÎÎÍÎÎþÍÎÎèÍÎÎÍÍÎÍÎÍÎÎÍÎÎÍÍÎÎÍÎÎÍÍÎÎýÍÎ;Í;ÍþÍÌÌÍÌþÍÌÌþÍÌÌýÍÌÍÍüÌÍÌÍÍÌÍýÌÍÌÌþÍÌÌúÍÌÍÌÌÍÍþÍÌÌüËÌËÌÌþËÌÌËóÌËËÌÌËÌÌËÌËËÌÌûËÌÌËÌÌðËÌÌËÌÌËËÌÌËÌËËÌþÍË ËþÊËËþÊËËþÊË ËþÊËËüÊËËÊÊýËÊþÍÊ9ÊþÍÊÊÉüÊÉÊÉÉÊÉþÊÉÉùÊÉÊÉÊÉÊÊÉþÊÉÉüÊÉÉþÍÉ9ÉþÍÈÈÉÈÉÈÉùÈÉÈÉÈÈÉÉ÷ÈÉÈÉÈÈÉÉÈÈÉÈùÉÈÉÉÈÉÈÈþÉûÍÈÈÇÈÈþÇÈÈþÇÈÈþÇÈÈÇûÈÇÈÇÈÈþÇÈÈþÍÇ9ÇþÍÆÆüÇÆÇÆÆþÇÆÆÇÆþÇÆÆþÇÆÆÇ ÆþÍÆ9ÆýGùÿ4ÿþÿ7ÿþÿ8ÿ:ÿþGÿ9ÿþùÿ9ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ?ͳçþæççþæçïçþæççæþçææþçææ÷çææççæççææþçææþçææüçæçææþçææþçææýåæååûæåææååæøåæåæååæååþæååþæååæøåæåææåæååæúåæåææååüæåæååôäåääååääåäåääåüäååääøåäåääåäååþäååþäååþäååþäååøäåääåäãääþãääþãääãäþãääþãääþãääãä€ãüâããâ âãâóãâããâãââããâãââüãâãââãâãâãâùãâãááâááâþáââýáâááýâáââþáââõáâááâáâááâááâøáâáâáâáââûáàáàááþàááþàááüàáàááþàá áûàááàá áþàááþàáá€àßþàßßàßàßþàßßàßþàßßàüßààßßþàßßàùßàßßààßßþàßßàþÞßßÞßÞûßÞßÞßßÞßþÞßßþÞßßøÞßßÞßÞßÞÞþßÞÞþßÞÞþÝÞÞþÝÞÞþÝÞÞýÝÞÝÝÞ÷ÝÞÞÝÞÝÞÝÞÞþÝÞÞþÝÞÞÝýÞÝÞÞýÝÞÝ7ÝþÜÝÝÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜûÝÜÝÝÜÜûÝÜÝÝÜÜÝÜÝBÜøÛÜÛÛÜÛÜÛÛúÜÛÜÜÛÜÜÛýÜÛÜÜÛÜþÛÜÜöÛÜÜÛÜÜÛÜÛÜÜÛÜýÛÜÛÛüÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛñÚÛÛÚÛÚÛÚÛÚÛÚÛÚÛÛüÚÛÚÛ ÛÚûÛÚÛÛÚ>ÚüÙÚÚÙ ÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÚÙÙîØÙØØÙÙØÙØØÙØØÙØÙÙØØþÙØØñÙØÙØÙØÙØØÙÙØÙÙØØîÙØÙÙØÙØÙØÙÙØØÙØØÙØBØþרØòר×רØ×ØØ×Ø×Ø×רüררØþרØ?×ýÖ×ÖÖü×Ö×ÖÖþ×ÖÖ×ýÖ×ÖÖþ×Ö Ö×Öþ×ÖÖÕþÖÕÕüÖÕÖÕÕþÖÕÕÖöÕÖÕÖÕÕÖÕÖÕÕûÖÕÖÖÕÕìÖÕÖÖÕÖÖÕÖÕÕÖÖÕÖÕÖÕÔÕÕþÔÕÕÔÕþÔÕÕÔÕÔøÕÔÕÕÔÕÔÕÕùÔÕÔÕÕÔÕÕÔÕúÔÕÕÔÔÕÕ€ÔúÓÔÔÓÔÓÓþÔÓÓúÔÓÔÓÔÓÓðÔÓÔÔÓÔÓÓÔÓÓÔÓÓÔÓ ÓÔÓþÔÓÓþÒÓÓñÒÓÒÓÓÒÓÓÒÓÒÒÓÓÒÒÓÒûÓÒÓÓÒÒÓûÒÓÒÓÒÒÓýÒÓÒÒÓúÒÓÑÒÑÒÒþÑÒÒþÑÒÒþÑÒÒþÑÒÒõÑÒÑÒÑÒÒÑÒÑÒÒÑÒûÑÒÑÑÒÒýÑÒÑ~ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐùÑÐÐÑÐÐÑÑÐþÑÐÐøÏÐÐÏÐÏÐÏÏôÐÏÐÏÏÐÏÐÐÏÐÏÏÐÏþÐÏÏüÐÏÐÏÏþÐÏÏþÐÏÏûÐÏÐÐÏÏ÷ÐÏÏÐÎÏÎÏÎÎÏÎÏüÎÏÎÏÏþÎÏÏþÎÏÏÎÏýÎÏÎÎÏÎÏÎÏÎùÏÎÏÎÎÍÎÎþÍÎ ÎþÍÎÎÍÎÍÎþÍÎÎûÍÎÎÍÎÎþÍÎÎýÍÎÍ~ÍÌùÍÌÍÌÌÍÌÌþÍÌÌþÍÌÌÍýÌÍÌÌþÍÌÌÍÌþÍÌÌüËÌÌËËÌþËÌÌËúÌËÌËÌËËýÌËÌÌþËÌÌËÌþËÌÌüËÌËÌÌôËÌÌËÌËËÌÌËËÌÌýËÊËËþÊË ËþÊËËÊüËÊËÊÊËþÊËËÊËüÊËËÊ>ÊÉþÊÉÉÊÉþÊÉÉüÊÉÊÉÉþÊÉÉüÊÉÊÉÉþÊÉEÉÈÉÈÉÈÉþÈÉÉÈÉÈýÉÈÉÉüÈÉÈÉÉøÈÉÉÈÉÈÈÉÉüÈÉÈÉÉýÈÉÈÈþÇÈ ÈþÇÈÈþÇÈÈûÇÈÈÇÈÈüÇÈÇÈ ÈþÇÈÈüÇÈÈÇ ÇþÆÇ1ÇûÆÇÆÇÆÆÇÆûÇÆÆÇÆÆüÇÆÇÆÆÇÆþÇÆÆûÇÆÆÇÆÆþÇÆDÆ?ÍÀçæçæþçææüçæçææçýæçææûçææçææþçææçæþçææüçåæååùæåæåææååüæååææå÷æåæåæååæååþæååþæååþæååþæååüæåæååþäååþäååäåäþåääåûäååäååþäååüäåäååäåòäååäåäååäååäãääþãääãäúãäãäãääþãääøãäãääããää‡ãâøãâãâããâããüâããââóãâãââãâããâãâããâãâãâãâúãââáâáá âáûâáâáââþáââúáâáâáââáúâááâáââáùâááââáââáüàáàááþàááþàááàýáàááàáúàááààááùàáàáààáá‚àßþàßßýàßààßþàßß÷àßßàßßààßßàýßàßßüàßàßßùàßàßàßÞÞûßÞßßÞÞúßÞÞßßÞÞßõÞßßÞßÞßÞßßÞÞßþÞßßÞßüÞßÞßß ÞüÝÞÝÞÞÝüÞÝÝÞÞþÝÞÞúÝÞÞÝÝÞÞüÝÞÝÞÞÝÞþÝÞÞ?ÝÜþÝÜÜÝÜþÝÜÜÝÜûÝÜÜÝÜÜþÝÜÜþÝÜÜúÝÜÜÝÝÜÜûÝÜÜÝÜ@ÜÛÜøÛÜÛÛÜÜÛÜÜÛÜûÛÜÜÛÜÜùÛÜÛÜÛÛÜÜöÛÜÛÜÛÜÛÜÛÜÜÛÚýÛÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛýÚÛÚ>ÚÙÚÙþÚÙÙþÚÙÙþÚÙ ÙþÚÙÙþÚÙÙþÚÙÙØÙØÙØþÙØØÙüØÙØÙÙØîÙØÙØÙØÙØØÙØØÙÙØÙØÙÙØÙNØþרØø×ØØ×Ø×רØþר Øþר Ø?×üÖ×Ö××ýÖ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×ÖÖ××Öú×ÖÖ××ÖÖþ×ÖÖ×ûÖÕÕÖÕÕÖÕÖÕþÖÕÕÖÕÖÕÖÕýÖÕÖÖÕþÖÕÕüÔÕÕÔÔýÕÔÕÕýÔÕÔÔÕþÔÕÕÔÕÔúÕÔÔÕÕÔÔÕþÔÕÕþÔÕÕýÔÕÔ~ÔÓþÔÓÓþÔÓÓüÔÓÔÓ ÓÔÓúÔÓÔÓÔÓÓþÔÓÓóÒÓÓÒÒÓÓÒÒÓÒÓÒÒúÓÒÓÒÒÓÓÒÓÒúÓÒÓÒÓÒÒÓÒôÓÒÓÓÒÒÓÓÑÒÑÒÒÑÒÑÒýÑÒÑÑòÒÑÒÑÑÒÑÑÒÑÒÑÑÒÒÑÒùÑÒÑÒÑÒÑÑþÒÑÑüÒÑÒÑ~ÑýÐÑÐÐÑÐüÑÐÑÐÐþÑÐÐÑÐþÑÐÐÑýÐÏÐÐüÏÐÐÏÏõÐÏÐÏÐÏÏÐÏÐÏÏÐûÏÐÏÏÐÐÏÐÏùÐÏÏÐÏÐÏÏÐÏÐÏûÎÏÏÎÏÏþÎÏÏþÎÏÏÎ÷ÏÎÎÏÏÎÎÏÎÎ ÏÎÏÎÏ ÎÍÎÍÎþÍÎÎþÍÎÎþÍÎ΀ÍÌþÍÌÌþÍÌÌÍÌÍÌÍÌÍùÌÍÍÌÌÍÌÌóÍÌÍÌÌÍÌÍÌÍÌÍÌÌúÍÌÌÍÍÌÌþËÌÌËÌËÌËÌüËÌËÌ ÌËÌËýÌËÌÌýËÌËËÌËÌÊ ËþÊËËÊËüÊËÊËËþÊËËþÊËËÊ Ë?ÊÉþÊÉÉúÊÉÊÉÊÉÉÊÉøÊÉÉÊÉÉÊÉÉþÊÉÉÊÉþÊÉDÉþÈÉÉþÈÉÉþÈÉÉøÈÉÈÈÉÈÉÈÈòÉÈÈÉÈÉÉÈÉÈÈÉÈÉÉÈùÉÈÉÈÈÉÈÈýÉÈÉÉþÈÉÉÈûÇÈÈÇÈ ÈþÇÈÈþÇÈÈþÇÈÈþÇÈÈþÇÈÈùÇÈÈÇÈÈÇAÇÆþÇÆÆþÇÆÆùÇÆÆÇÆÇÆÆþÇÆÆüÇÆÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆ@Æ?ÍçþæççþæçUçþæçCç æûçææçææþçææþçææùçæççæçææüçæçææþçææçæçøæåææåææååüæååææåôæåæååæååæåæååþæå åæåþæååõæåæäååääåäååäûåääåääüåäåääåäåäþåääüåääååùäååääåääãäþãääøãääãääãääûãäããääãäøãäãääããääþãääãâòãâããââããââãâãââãúâããâãââþãââãâþãââãâþãââãâáâüáâáââùáâáââáââáâùáâáââáââáâøáââááâáââöáâáàáàáààááüàáàááþàááàáþàááþàááàáþàááàßàßàßþàßßþàßßðàßßàßßàßßàßßàßàß ßþàßßàßìÞßßÞßßÞßßÞßßÞßßÞßßÞßßüÞßÞßßüÞßÞß ß÷ÞßÞÞßÞßÞßßþÞßßýÞÝÞÞþÝÞÞûÝÞÞÝÞÞÝÞþÝÞÞÝÞþÝÞÞüÝÞÞÝ?Ý ÜûÝÜÜÝÜÜúÝÜÝÜÝÜÜþÝÜÜ÷ÝÜÜÝÜÜÝÝÜÜþÝÜÜþÝÜÜùÝÜÝÝÜÝÜ@ÜÛÜÛÜýÛÜÛÛõÜÛÛÜÜÛÜÛÜÛÜÜúÛÜÛÛÜÛÛÜþÛÜÜþÛÜÜÛÜÛøÚÛÛÚÛÛÚÛÛúÚÛÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛúÚÛÛÚÚÛÛþÚÛÛþÚÛÛ?ÚÙþÚÙÙþÚÙ ÙþÚÙ ÙþÚÙÙÚÙÚÙþÚÙÙØþÙØØþÙØØúÙØØÙÙØØüÙØÙØØÙØþÙØØÙØøÙØØÙÙØÙØØþÙØØÙCØ×úØ×Ø×רØþרØþרØþרØþרØø×ØØ×ØØ×ØØþרØýר×?×Öþ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×Ö×ÖÖø×ÖÖ×ÕÕÖÕÕüÖÕÖÕÕöÖÕÖÕÕÖÕÕÖÕÕÖ ÕÖÕäÖÕÕÖÕÕÖÕÖÕÖÕÕÖÕÖÔÔÕÕÔÕÔÔÕÕÔÕÕÔùÕÔÕÕÔÕÔÔÕ÷ÔÕÕÔÕÕÔÔÕÕüÔÕÔÕÕüÔÕÔÕÕÔÕüÔÕÕÔÔÓûÔÓÓÔÓÓþÔÓÓþÔÓÓúÔÓÔÓÔÓÓûÔÓÓÔÓÓÒÓòÒÓÓÒÒÓÒÒÓÓÒÓÓÒÒûÓÒÓÓÒÒüÓÒÓÒÒÓÒþÓÒÒÓÒÓúÒÓÓÒÑÒÒüÑÒÑÒÒþÑÒÒÑ ÒêÑÒÒÑÑÒÒÑÑÒÑÑÒÑÒÑÑÒÑÒÒÑÑþÒÑÑýÒÑÒÒ€ÑÐþÑÐÐþÑÐÐþÑÐÐûÑÐÐÑÐÐüÑÐÑÐÐþÑÐÐþÏÐÐÏÐÏÐûÏÐÏÏÐÐÏÐ ÏÐúÏÐÏÐÐÏÏþÐÏÏýÐÏÐÐöÏÐÏÏÐÎÏÏÎÏÏùÎÏÎÏÎÎÏÏýÎÏÎÎúÏÎÎÏÏÎÎþÏÎÎûÏÎÎÏÎÎøÏÎÏÎÏÎÏÎÎÏÎûÏÍÎÍÎÎÍ ÎüÍÎÍÎÎüÍÎÍÎÎþÍÎÎÍÎþÍÎÎþÍÎÎüÍÎÎÍ‚ÍûÌÍÍÌÍÍÌùÍÌÍÌÌÍÌÌþÍÌÌþÍÌÌÍþÌÍÍÌÍÌþÍÌÌÍáÌÍËÌËËÌËÌËÌËÌËÌÌËËÌËËÌÌËËÌËÌËËÌÌúËÌËÌËÌÌËòÌËËÌËÌËËÌÌËËÌËËÌýËÌËËþÊËËüÊËÊËËÊËþÊËËÊËýÊËÊÊùËÊÊËËÊËË?ÊýÉÊÉÉÊ ÉÊÉþÊÉÉþÊÉÉþÊÉBÉþÈÉÉÈùÉÈÈÉÉÈÉÉüÈÉÈÉÉ÷ÈÉÉÈÉÉÈÈÉÉøÈÉÉÈÉÈÈÉÉÈÉÈüÉÈÇÈÈþÇÈ ÈüÇÈÇÈÈûÇÈÈÇÈÈûÇÈÈÇÈÈþÇÈ ÈúÇÈÈÇÈÇ?ÇÆþÇÆÆÇÆþÇÆÆþÇÆÆüÇÆÇÆÆÇÆþÇÆÆþÇÆÆþÇÆÆþÇÆ?Æÿ?Í?çþæç}çæçæþçææøçæçæçææççüæççææþçææþçææçûæåææååæåþæååæþåææåæðåæåæååææååæååææååæûåæåæååþæååþäååýäåääåþäåå÷äååääååäååäåäþåääýåäååäþãääûãääãääùãäããäãääüãäãääüãäãääãâõãââãâãâãâãââúãââããââöãâããââãâãââãýâãââøãââãâããââãõâáââáââáâáââáâþáââáþâááâôáââáâáââáâáââáâáâüáâáââáþàááàáþàááüàáàááþàááøàááààáàááþàáá‡àßðàßàßßàßßàßààßßàßßþàßßþàßßöàßßààßßààßßàßòàßàßßàßàÞÞßÞÞßßÞßøÞßÞÞßßÞßßÞßúÞßßÞÞßßôÞßßÞßßÞÞßßÞßßûÞßÞÝÞÞþÝÞÞøÝÞÞÝÞÝÝÞÞûÝÞÞÝÞÞþÝÞÞþÝÞÞþÝÞÞöÝÞÞÝÞÝÝÞÞÝ>ÝÜþÝÜÜÝ ÜþÝÜÜþÝÜÜÝÜÝÜÝDÜúÛÜÜÛÛÜÜûÛÜÜÛÜÜùÛÜÛÛÜÛÜÜþÛÜÜþÛÜÜþÛÜ ÜøÛÜÛÜÛÛÜÛÛþÚÛÛþÚÛÛÚÛþÚÛÛÚÛÚþÙÚÚþÙÚ ÚÙôÚÙÙÚÚÙÚÙÙÚÙÚÚÙùÚÙÙÚÙÚÙÙüÚÙÚÙÙüØÙÙØØÙØýÙØÙÙØþÙØØÙýØÙØØÙØðÙØØÙØÙØÙØÙØÙØÙÙØØüÙØÙØ?Øþר ØþרØüררØþרØþרØôרØ×ØØ×ØØ×רØþרØüרØ×>×Öþ×ÖÖõ×ÖÖ×ÖÖ××Ö×ÖÖ× Ö×Ö× ÖÕûÖÕÕÖÕÕïÖÕÕÖÕÕÖÕÖÕÕÖÕÖÕÖÕÕÖ÷ÕÖÕÖÖÕÕÖÕÕûÖÕÕÖÕÕüÖÕÖÕÕÖÕþÔÕÕÔþÕÔÔþÕÔÔÕýÔÕÔÔÕüÔÕÔÕÕûÔÕÔÔÕÕþÔÕÕýÔÕÔÔþÕÔÔþÕÔ~ÔÓûÔÓÓÔÓÓüÔÓÔÓÓþÔÓÓüÔÓÔÓÓÔÓüÔÓÔÓÓþÔÓÓùÒÓÓÒÒÓÒÒþÓÒÒÓÒ÷ÓÒÒÓÓÒÒÓÒÒ÷ÓÒÓÓÒÓÓÒÓÓýÒÓÒÒþÓÒÒüÑÒÑÒÒÑÒúÑÒÒÑÒÑÑÒþÑÒÒöÑÒÒÑÒÒÑÒÑÒÒÑÒôÑÒÑÑÒÒÑÒÑÒÒÑÑþÒÑÑüÐÑÐÑÑÐÑúÐÑÐÐÑÐÐüÑÐÑÐ ÐüÑÐÑÐÐþÑÐÐþÑÐÐöÏÐÏÐÐÏÐÏÏÐÐýÏÐÏÏÐÏøÐÏÐÏÐÏÏÐÐýÏÐÏÏüÐÏÏÐÐÏÐÏÐ÷ÏÐÏÐÏÏÎÏÎÎÏÎÏ÷ÎÏÎÎÏÎÏÎÏÏþÎÏÏþÎÏÏùÎÏÎÏÎÎÏÏùÎÏÏÎÏÎÏÏÎÏÎüÍÎÍÎÎÍÎúÍÎÎÍÍÎÎöÍÎÍÍÎÍÍÎÍÎÎûÍÎÎÍÎ ÎÍ΀ÍÌþÍÌ ÌôÍÌÍÍÌÍÌÌÍÌÍÌÌþÍÌÌÍÌÍÌÍÌõÍÌÍÌÍÍÌÌËËÌÌýËÌËËÌËÌËýÌËÌÌËöÌËËÌÌËËÌËÌÌËýÌËÌÌËÌþËÌÌËÊËÊËþÊËËúÊËËÊÊËËøÊËËÊËËÊËËþÊËËþÊËËÊËAÊýÉÊÉÉþÊÉÉùÊÉÊÉÉÊÉ ÉüÊÉÊÉÉþÊÉÉþÊÉÉþÊÉIÉ÷ÈÉÈÉÈÉÈÈÉÉÈÉÈÉíÈÉÈÉÉÈÉÈÉÈÈÉÈÈÉÉÈÉÈÈúÉÈÉÈÇÈÈÇýÈÇÈÈüÇÈÇÈÈþÇÈ ÈÇÈÇýÈÇÈÈþÇÈÈ?ÇûÆÇÆÇÆÆþÇÆÆþÇÆÆþÇÆ ÆþÇÆÆþÇÆÆüÇÆÇÆCÆ?Í+çþæçƒçþæçÞçþæççþæçç æþçææûçææçææûçææçææþçææþçææþçææþçææþçææúåæååæåå÷æååæåæåæååýæåææüåæåææåæåõæåæååæåæåæååæåäå÷äåäåääåäååäýåäååþäååäåäýåäååýäåääãäþãääüãäãääãäãäþãääþãääóãääããääãäãäãääãþäã~ãüâããââüãâãââãùâãâããâããâãâñãâããâããâãââãâãââãâáòâáââááââáââááââáûâáâáââøáââáââáâ âáâáþàááà áþàááøàááàááàááàáþàááþàááàßàßýàßààþßààßàøßàßßàßàßßöàßàßßààßàßßàößààßàßàßàßßÞùßÞßßÞÞßßãÞßßÞßÞßÞÞßßÞßÞßÞÞßÞßÞßßÞßÞßÞßßúÞßÞÞßÞÞüßÞßÞÞþßÞÞþÝÞÞøÝÞÞÝÞÞÝÞÞþÝÞÞüÝÞÝÞÞþÝÞÞûÝÞÞÝÞÞþÝÞÞúÝÞÞÝÞÝ6ÝþÜÝÝÜûÝÜÜÝÜÜøÝÜÝÜÜÝÝÜÜþÝÜÜÝÜþÝÜÜþÝÜEÜÛÜÛÜþÛÜÜúÛÜÜÛÜÛÛÜöÛÜÜÛÛÜÛÜÛÜÜìÛÜÛÜÛÛÜÛÛÜÜÛÛÜÛÜÜÛÜÛÛþÚÛÛþÚÛÛûÚÛÛÚÛÛÚÛÚúÛÚÛÛÚÛÛ?ÚÙþÚÙÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÚÙÙüÚÙÚÙÙüÚÙÚÙÙÚÙýØÙØØÙØÙØøÙØÙØÙØÙØØÙØþÙØØÙØþÙØØýÙØÙÙØÙúØÙÙØÙØBØûרØ×ØØþרØþרØöרØ×Ø×ØØ×ØØ×ØþרØ×ýØ×ØØýר×?×ýÖ×ÖÖþ×ÖÖþ×ÖÖ÷×Ö××Ö×Ö×ÖÖþ×ÖÖþ×ÖÖ÷×ÖÕÖÖÕÕÖÕÕÖÕÖÕíÖÕÕÖÕÕÖÕÕÖÕÖÖÕÖÖÕÖÕÕÖýÕÖÕÕÖ÷ÕÖÕÖÖÕÕÖÕÕõÔÕÕÔÕÕÔÕÕÔÕÕþÔÕÕþÔÕÕóÔÕÔÔÕÔÕÔÕÕÔÕÔÔÕøÔÕÔÕÔÕÔÕÕýÔÕÔ~Ô ÓÔÓþÔÓ ÓþÔÓÓþÔÓÓøÔÓÓÔÔÓÔÓÓþÔÓÓþÔÓÓûÔÓÒÒÓÓúÒÓÒÓÓÒÒúÓÒÒÓÓÒÒûÓÒÓÓÒÒÓúÒÓÒÒÓÒÒõÓÒÓÓÒÒÓÒÓÓÒÒòÑÒÒÑÑÒÑÒÑÒÒÑÒÑÑýÒÑÒÒúÑÒÑÒÑÒÒûÑÒÒÑÒÒüÑÒÑÒÒòÑÒÑÑÒÑÒÑÒÑÒÑÑÒÒÑÐÑ ÐÑ ÐþÑÐ ÐüÑÐÑÐÐþÑÐÐüÑÐÐÏÏÐÏûÐÏÏÐÏÏÐÏûÐÏÏÐÏÏúÐÏÐÐÏÐÐüÏÐÐÏÏöÐÏÏÐÏÐÏÐÐÏÏÎüÏÎÎÏÏÎÏøÎÏÎÎÏÏÎÏÏûÎÏÏÎÏÏÎþÏÎÎÏöÎÏÎÏÏÎÎÏÎÏÏþÎÏÏÎÍ ÎþÍÎÎþÍÎÎÍúÎÍÎÎÍÎÎùÍÎÍÎÎÍÎÎþÍÎÎüÍÎÍÎ΃ÍÌúÍÌÍÌÍÌÌÍÌÍûÌÍÌÌÍÍÌÍÌþÍÌÌÍÌõÍÌÌÍÌÍÌÍÌÌÍÍýÌÍÌÌËÌþËÌÌËÌËÌüËÌÌËËüÌËÌËËþÌËËÌûËÌËËÌÌËÊËþÊËËþÊËËÊ÷ËÊËÊËÊËÊËËþÊËËþÊËËüÊËÊËËÊË?ÊúÉÊÉÉÊÉÉÊúÉÊÉÉÊÉÉÊÉþÊÉÉûÊÉÉÊÉÉþÊÉAÉþÈÉÉÈÉþÈÉÉþÈÉÉÈÉüÈÉÉÈÈÉôÈÉÈÉÈÉÈÉÈÉÈÉÉúÈÉÈÈÉÈÈþÇÈÈûÇÈÇÇÈÈþÇÈÈÇÈûÇÈÈÇÈÈ@ÇÆÇÆÇÆøÇÆÇÆÆÇÇÆÆþÇÆÆþÇÆÆþÇÆÆÇÆþÇÆ>Æ?ÍkçþæçRçæþçææûçæççææùçæçææçææþçææþçææþçæ æçþæååýæåææ åþæååýæåææåúæåææåææåùæåææåæååäåéäåääååääååääåäåäåäååäåääþåääñåääåäåäåäåäååäååäþãääãäûãääãääþãä äþãä äñãääããääãääãäãäã€ãâØãâããâãâãââãâãâãââãâããâããâãâããââãââãââãâããâõãââãââããâãââúáâááâááýâáââþáââáñâáâááââáââáâááââáâþáââûáâááââáþàá áôàááàááààááàá áþàááàáüàáàááûàááàáá€àøßààßààßààßàßûàßßàßßàßüàßàßßàößàßàßßàßßààüßààßßÞßÞßþÞßßÞüßÞßÞÞßÞýßÞßßùÞßÞÞßÞßßýÞßÞÞýßÞßßÞÝÞþÝÞÞüÝÞÝÞÞÝÞÝþÞÝÝÞþÝÞÞÝÞüÝÞÝÞÞ?ÝÜþÝÜÜÝÜûÝÜÜÝÜÜþÝÜÜúÝÜÜÝÝÜBÜúÛÜÛÜÜÛÛüÜÛÛÜÜÛÜÛÜûÛÜÛÜÛÛþÜÛÛýÜÛÜÜýÛÜÛÛÜÛüÜÛÚÛÛÚÛþÚÛÛÚÛÚÛúÚÛÚÛÚÛÛÚÛþÚÛÛ?ÚÙÚÙþÚÙÙþÚÙÙùÚÙÚÙÚÚÙÙþÚÙÙ÷ØÙØØÙØØÙØØúÙØÙØØÙÙõØÙÙØÙÙØÙÙØÙÙØÙýØÙØØûÙØÙÙØEØø×Ø×רØ×ØØùררØ×Ø'Ø?×ýÖ×ÖÖû×ÖÖ×ÖÖþ×Ö Öþ×Ö Öþ×ÖÖþ×ÖÖ×ÖÕþÖÕÕýÖÕÖÖýÕÖÕÕÖùÕÖÖÕÖÖÕÕôÖÕÕÖÕÖÕÕÖÕÕÖÖÕþÖÕÕþÖÕÕõÖÕÖÖÕÕÖÕÖÕÔÔÕþÔÕÕøÔÕÕÔÕÕÔÕÕøÔÕÔÔÕÔÔÕÕÔ÷ÕÔÕÔÕÔÕÕÔÔÕýÔÕÔÔûÕÔÕÕÔ~ÔøÓÔÓÔÓÓÔÓÓþÔÓÓûÔÓÓÔÓÓþÔÓÓùÔÓÔÔÓÔÓÓûÔÓÔÔÓÓüÔÓÔÓ ÓÒÓÒþÓÒÒÓôÒÓÒÓÓÒÒÓÒÒÓÒÒþÓÒÒþÓÒÒÓÒÓôÒÓÒÒÓÒÓÒÒÓÑÒÒÑÒÑÒÑ÷ÒÑÒÒÑÒÒÑÒÒÑÒÑÒÑÒöÑÒÑÒÒÑÒÑÑÒÒüÑÒÒÑÑþÒÑ~ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐÑÐùÑÐÐÑÐÑÐÐÑÐþÑÐÐÏÐÏÐýÏÐÏÏòÐÏÏÐÏÏÐÐÏÏÐÏÐÏÏÐÏÐÏþÐÏÏþÐÏÏÐÏöÐÏÏÎÏÏÎÏÎÏÏñÎÏÎÏÎÏÏÎÎÏÎÏÎÎÏÏÎöÏÎÎÏÎÏÏÎÎÏÏõÎÏÎÏÎÏÎÎÏÎÏÏÎÏÍþÎÍÍýÎÍÎÎþÍÎÎÍÎûÍÎÎÍÎÎûÍÎÎÍÎÎûÍÎÍÍÎÎùÍÎÍÎÎÍÎ΀ÍÌûÍÌÌÍÌÌÍÌÍÌÍÌÍþÌÍÍôÌÍÌÍÌÍÌÌÍÌÍÌ ÌþÍÌÌËÌËÌöËÌÌËËÌÌËËÌÌËðÌËËÌËÌÌËËÌÌËÌËËÌÌúËÌËÌËÌÌüËÌÌËËþÊËËþÊË ËÊ ËüÊËÊËËþÊËËÊËúÊËËÊËÊ?ÊÉþÊÉÉûÊÉÉÊÉÉÊÉúÊÉÊÉÊÉÉþÊÉÉþÊÉÉÊÉÊÉÊúÉÊÉÉÊÉ?ÉùÈÉÈÈÉÈÉÉýÈÉÈÈÉÈÉÈÉöÈÉÈÉÈÉÉÈÉÈÈÉûÈÉÉÈÉÉöÈÉÈÉÉÇÈÈÇÈÈþÇÈÈþÇÈÈøÇÈÈÇÈÈÇÈÈþÇÈÈûÇÈÇÈÇ>ÇýÆÇÆÆûÇÆÆÇÆÆÇÆþÇÆÆÇÆûÇÆÆÇÆÆþÇÆÆþÇÆÆþÇÆCÆÿ?ÍFçþæçwçæüçæçææþçæ æûçæççæ æõçææçææççæçææþçææåæýåæååæåæåùæååæååææåþæååæåöæååææåæåæååùæåæåæåææåýæäååäüåäåääåþäååøäåäåäååääåäåýäåääýåäååäåäþåääùåäãäããä äþãääüãäãääþãääûãäããä äþãää‚ãâãâãâûãââãââãâòãâããâãâãâããââããâóãââãââãâãâããââáâáâþáââáâáýâáââûáâáâááâúáââááââáâáûàááàááþàááþàááþàá áþàááüàáàáá€àþßààûßàßàßßàýßàßßãàßàßààßààßààßßààßàßßààßààßßàßßàßàßÞßýÞßÞÞßüÞßßÞÞßÞûßÞÞßÞÞßûÞßÞßÞÞßûÞßÞÞßßÞÝùÞÝÞÝÞÝÞ ÞüÝÞÝÞÞþÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞþÝÞÞ?ÝÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜÝÜþÝÜÜÝBÜþÛÜÜþÛÜÜûÛÜÛÜÛÛÜöÛÜÜÛÜÛÛÜÜÛÛÜÛÜüÛÜÜÛÛüÜÛÜÛÛÜùÛÜÜÛÚÚÛÛþÚÛÛÚÛþÚÛÛÚÛûÚÛÛÚÛÛþÚÛÛþÚÛÛþÚÛÛ@ÚÙÚÙÚÙÚýÙÚÙ ÙûÚÙÙÚÙÙþÚÙÙüÚÙÚØØøÙØÙÙØØÙØØÙòØÙÙØØÙÙØØÙØØÙØØÙØÙñØÙØØÙØØÙÙØÙØÙÙØDØ×ØþרØþרØþרØþרØþרØ×ýØ×ØØùר×ררØùרØ×ØØ×@×Öþ×ÖÖþ×ÖÖþ×ÖÖø×Ö×Ö×Ö×ÖÖþ×Ö Öþ×ÖÖÕþÖÕÕøÖÕÖÕÖÕÖÕÕþÖÕÕûÖÕÕÖÕÕþÖÕÕÖÕûÖÕÕÖÕÕþÖÕÕÖÕÖÕþÔÕÕÔÕüÔÕÔÕÕúÔÕÔÕÔÕÕ÷ÔÕÔÕÔÕÔÕÔÔóÕÔÔÕÕÔÔÕÔÔÕÔÕÕ€ÔúÓÔÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓùÔÓÓÔÓÔÓÓúÒÓÓÒÓÒÒýÓÒÓÓÒòÓÒÒÓÓÒÒÓÒÓÒÓÒÓÓÒÓÒôÓÒÓÒÓÒÓÒÓÒÓÒÒûÑÒÑÑÒÒÑúÒÑÑÒÒÑÑøÒÑÒÑÒÑÒÑÑþÒÑÑÒôÑÒÒÑÑÒÑÒÒÑÑÒÒÑÒÑÒÑÐþÑÐÐþÑÐÐùÑÐÐÑÐÑÐÐþÑÐÐþÑÐÐüÑÐÐÑÑÐûÑÐÐÑÐÐþÑÐÐÏûÐÏÐÐÏÏþÐÏÏÐþÏÐÐûÏÐÐÏÐÐüÏÐÏÐÐÏþÐÏÏåÐÏÏÐÏÏÐÏÐÏÏÐÏÏÐÏÐÎÏÎÏÎÏÎÏÎÏÏùÎÏÏÎÏÎÏÏ÷ÎÏÎÎÏÎÏÎÏÏõÎÏÎÎÏÏÎÏÏÎÏÏþÎÏÏÎÏûÎÏÎÍÎÎþÍÎÎûÍÎÍÍÎÎúÍÎÍÎÍÎÎøÍÎÎÍÎÎÍÎÎþÍÎÎÍ ÎþÍÎ΀ÍÌÍüÌÍÍÌÌûÍÌÍÍÌÌÍÌÍýÌÍÌÌøÍÌÍÌÍÍÌÍÍÌþËÌÌùËÌËÌËÌËËüÌËÌËËùÌËÌËËÌËËüÌËÌËËÌþËÌÌþËÌÌËÌþËÌÌËýÌÊËËÊýËÊË ËÊýËÊËËûÊËËÊËËþÊËËùÊËÊËÊËÊ>ÊÉóÊÉÊÊÉÊÊÉÊÉÉÊÉÉþÊÉÉúÊÉÉÊÊÉÉüÊÉÊÉÉþÊÉAÉÈ÷ÉÈÉÉÈÉÉÈÉÉÈÉÈÉþÈÉÉüÈÉÈÉÉþÈÉÉøÈÉÈÈÉÉÈÉÉÈõÇÈÈÇÈÇÇÈÈÇÈ ÈþÇÈÈþÇÈÈÇÈûÇÈÈÇÈ È÷ÇÈÇÈÇÇÈÈÇ<ÇüÆÇÇÆÆÇÆþÇÆÆÇÆÇýÆÇÆ ÆúÇÆÆÇÇÆEÆ?Íçþæç™çþæç&çþæçóçæþçææþçææûçææçææúçææççææûçææçææüçæçææþçææþçææúçæçææååæüåææååþæååóæååæååæååæååææåæåþæååýæåææåùæåæåæäååþäååþäååþäååöäååääååääååöäååääååääååäåùäååääåääþãää÷ãäãääãäãääüãäãääúãääããääãòäãäãäãääãääãäã~ãøâãâãâããââýãâããâãùâãâãâãââþãââã âýãâããâþáââþáââþáââüáâáââüáâáââüáâáââáðâáâáâáâááââáâáàá áþàááàýáàááþàááüàáàááàáàá€àßàßüàßßààßàßàûßàßàßßàøßààßßàßààüßàßààßàßþÞßßûÞßßÞßßÞßûÞßßÞßßÞßþÞßßÞößÞßÞÞßßÞÞßßþÞßßþÞßßÞþÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞûÝÞÝÝÞÞÝÞÝÞþÝÞÞ@ÝÜþÝÜÜþÝÜ ÜøÝÜÝÝÜÜÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜGÜÛñÜÛÛÜÛÛÜÛÛÜÜÛÛÜÛÛÜÛÜõÛÜÜÛÛÜÛÜÜÛÜÜýÛÜÛÛýÜÛÜÜ÷ÛÜÛÜÜÛÜÚÛÛüÚÛÛÚÚÛþÚÛÛþÚÛÛþÚÛÛ?ÚýÙÚÙÙþÚÙ ÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙ ÙùÚÙÚÙÙØÙÙýØÙØØùÙØÙÙØØÙÙþØÙÙØþÙØØÙüØÙØÙÙùØÙØØÙÙØØ÷ÙØØÙÙØØÙØØþÙØCØþר ØþרØþרØþרØòרØ×ØØ×ØØ×ØØ×ØØø×ØØ×Ø×Ø×>×Öó×ÖÖ×Ö×ÖÖ××Ö×ÖÖþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖþ×ÖÖ÷×Ö×Ö××Ö×ÖÖþ×ÖÖÕÖÕÖÕúÖÕÖÕÕÖÖùÕÖÕÕÖÖÕÕÖÕÖþÕÖÖýÕÖÕÕþÖÕÕúÖÕÖÕÖÕÕÔÕÔøÕÔÕÔÕÔÔÕÕüÔÕÔÕÕùÔÕÔÕÕÔÕÕïÔÕÕÔÔÕÔÔÕÔÕÕÔÕÔÔÕÕþÔÕÕ€ÔýÓÔÓÓþÔÓÓþÔÓÓþÔÓÓÒùÓÒÓÒÓÓÒÒûÓÒÒÓÒÒÓÒÓþÒÓÓÒþÓÒÒÓÒÓ ÒÑÒüÑÒÑÒÒûÑÒÒÑÒÒüÑÒÑÒÒøÑÒÑÒÑÒÑÒÒþÑÒÒþÑÒÒ‚ÑÐüÑÐÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐÑÐþÑÐÐùÏÐÏÐÐÏÐÐíÏÐÏÏÐÏÐÏÐÏÏÐÏÏÐÐÏÐÏÏÐüÏÐÐÏÏøÐÏÏÐÐÏÐÏÏÐïÏÐÏÐÏÎÏÎÏÎÎÏÎÏÎÏÎÎûÏÎÏÎÏÏþÎÏÏÎÏÎôÏÎÏÏÎÎÏÏÎÏÎÏÏùÎÏÎÎÏÎÏÏýÎÏÎÎþÍÎ ÎûÍÎÎÍÎÎþÍÎÎþÍÎÎþÍÎÎûÍÎÎÍÎÎÍÎÍüÌÍÍÌÌÍþÌÍÍÌøÍÌÍÍÌÍÍÌÌöÍÌÌÍÍÌÍÌÌÍÍöÌÍÌÍÌÌÍÌÍÌÌìÍÌÍÍÌÌÍÌÌËÌËÌÌËÌÌËÌËËüÌËËÌÌË÷ÌËÌËËÌËÌËËýÌËÌÌËÌËÌúËÌËÌËÌÌðËÌËÌÌËÊÊËËÊÊËËÊËËÊËþÊËËùÊËËÊËÊËËþÊËËüÊËËÊÊËþÊËËþÊËË?ÊÉüÊÉÊÉÉýÊÉÊÊ ÉþÊÉÉþÊÉÉÊÉþÊÉÉúÊÉÊÉÊÉEÉÈîÉÈÉÈÈÉÈÉÈÉÉÈÉÉÈÉÉÈÈüÉÈÈÉÉÈýÉÈÉÉÈÉüÈÉÈÉÉÈÉüÈÉÉÈÈüÇÈÇÈÈþÇÈÈûÇÈÇÇÈÈÇ ÈÇÈþÇÈÈþÇÈÈÇÈ@ÇÆüÇÆÇÆ ÆþÇÆÆûÇÆÆÇÆÆÇýÆÇÆÆþÇÆÆþÇÆÆÇ?Æ?ÍÀçýæçææçýæçææúçææçæççòæçæçææçæçææççæ æþçææåþæååùæååæååææúåææåæååþæååþæååøæååæåææååæþåææåäùåääååäååûäåäåääúåäååäååùäåäååäååéäååäåääåäåäåäåäåäåääååääòãääããääãäããäãääãäøãäããääãääþãääþãääãäãâøãââãââãââöãââãâãâãâããýâãââãâãâþãââþãââúãââããââ÷áâááââááââáâáøâááââááââóáâááââááâáââááâþáââáþàááþàááþàááúàáàáàááàáþàááþàááüàáàáá„àþßààüßààßßþàßßàþßààüßààßßàßúàßßààßßàýßàßßþàßßÞþßÞÞßþÞßßøÞßßÞÞßÞßßÞþßÞÞþßÞÞßþÞßßÞÝÞÝÞüÝÞÝÞÞõÝÞÞÝÞÞÝÞÞÝÞÞþÝÞÞþÝÞÞþÝÞÞAÝÜþÝÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜöÝÜÝÜÝÜÜÝÝÜÜÝýÜÝÜÜÝ?ÜÛÜûÛÜÜÛÜÜúÛÜÜÛÛÜÜúÛÜÛÛÜÛÛýÜÛÜÜþÛÜÜìÛÜÛÜÜÛÜÛÜÜÛÜÜÛÜÜÛÜÛÜÜþÚÛÛøÚÛÚÛÛÚÚÛÛþÚÛ#ÛþÚÛÛ?ÚýÙÚÙÙþÚÙ ÙúÚÙÙÚÚÙÙþÚÙÙÚÙÚÙþÚÙÙØþÙØØúÙØØÙÙØØÙòØÙØÙØÙØØÙÙØÙÙØØùÙØÙÙØÙØØùÙØÙÙØÙØØûÙØØÙØCØþרØþרØüררØ×ØþרØþרØýר×@×Öþ×ÖÖú×ÖÖ××ÖÖ×Öü×Ö×Ö Ö×Ö×Öø×ÖÖ×ÖÖ×ÖÖÕÖÕÖúÕÖÖÕÖÕÕëÖÕÕÖÖÕÕÖÖÕÕÖÕÖÕÖÖÕÕÖÕÕþÖÕÕþÖÕÕÖûÕÖÕÖÕÕþÖÕÕüÔÕÔÕÕüÔÕÔÕÕûÔÕÔÕÔÔúÕÔÔÕÕÔÔÕþÔÕÕþÔÕÕùÔÕÕÔÕÕÔÔÕýÔÕÔÔüÕÔÕÔÔÓûÔÓÓÔÓÓùÔÓÔÔÓÔÓ ÓÔÓÔÓûÔÓÔÔÓÓþÔÓÓ ÒþÓÒÒþÓÒÒúÓÒÓÒÓÒÒþÓÒÒÓÒÓ÷ÒÓÓÒÒÓÒÓÒÒÓóÒÓÒÓÒÓÒÒÑÒÑÒÑÑÒþÑÒÒÑÒýÑÒÑÑÒÑÒþÑÒÒõÑÒÑÒÑÑÒÒÑÑÒÒ€ÑÐþÑÐÐþÑÐÐÑÐüÑÐÑÐÐùÑÐÑÐÐÑÐÐþÑÐ ÐüÑÐÑÐÐúÑÐÏÏÐÏÏýÐÏÐÐøÏÐÏÐÏÏÐÏ ÏýÐÏÐÐÏÐÏþÐÏÏþÐÏÏþÎÏÏûÎÏÏÎÏÏÎÏÎÏÎþÏÎÎÏúÎÏÏÎÎÏÏÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎûÍÎÍÍÎÎþÍÎÎÍÎþÍÎ ÎÍýÌÍÌÌùÍÌÍÌÌÍÌÌþÍÌÌüÍÌÍÌÌÍÌúÍÌÌÍÌÍÍÌÍÌüÍÌÌÍÍúÌÍËÌËÌÌúËÌÌËÌËËûÌËÌÌËËÌËÌöËÌÌËËÌÌËËÌÌþËÌÌËþÌËËòÌËËÌÌËÌËËÌËËÊËËüÊËÊËËûÊËËÊËËúÊËËÊÊË ËþÊËË@ÊÉüÊÉÊÉ ÉûÊÉÉÊÉÉþÊÉÉÊõÉÊÉÉÊÉÊÉÉÊÉBÉÈýÉÈÉ ÉþÈÉÉÈûÉÈÉÈÉÉüÈÉÈÉÉÈÉþÈÉÉÈÉýÈÇÈ ÈöÇÈÇÈÇÈÈÇÇÈÈÇöÈÇÈÈÇÈÈÇÇÈÈÇÈþÇÈÈ?ÇÆüÇÆÇÆÆûÇÆÆÇÆ ÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆûÇÆÇÇÆ@Æÿ?ÍÀçæþçææþçææþçææûçæççæ æþçææçæþçææýçæççæþçææýåæååæúåæååæååæýåæååôæåææåæååæåæååæåæùåæåææåææþåääåùäåäåääååþäååôäååääåääååäååäøåäåääååääüåääååäûãääãääþãä äûãääãä äãäþãää€ãôâãâãâããâããâããúâããââããþâããâöãââããâãâãââþãââãâþãââãýâãââùãâááââááâûáââáââþáââáøâáâááâáââáýâáââáâþáââúáââáâááþâááþàááüàáàááþàááþàááàúáàááàááüàáàááàáúàáàáàááàßàüßàßààßþàßßþàßßûàßßàßßàüßààßßàýßàßßþàßßëÞßÞßßÞÞßÞßßÞßÞßÞßÞßÞßßóÞßÞßÞÞßßÞÞßÞßßÞýßÞßßþÞßßÞýßÞßßÞüßÞÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞûÝÞÞÝÞÞÝÞþÝÞ Þ+ÝþÜÝÝÜþÝÜÜþÝÜÜûÝÜÜÝÜÜúÝÜÜÝÝÜÜþÝÜÜþÝÜÜüÝÜÝÜÜÝFÜÛøÜÛÛÜÛÜÛÜÜýÛÜÛÛÜüÛÜÛÜÜ÷ÛÜÜÛÜÜÛÜÛÛÜþÛÜÜÛÜùÛÜÜÛÜÜÛÛþÚÛ ÛþÚÛÛûÚÛÛÚÛ ÛþÚÛÛþÚÛ Û@ÚûÙÚÙÚÙÙþÚÙÙûÚÙÚÚÙ ÙþÚÙÙþÚÙÙÚ ÙØþÙØØûÙØÙÙØØûÙØØÙØØ÷ÙØÙØÙØÙØÙÙïØÙØÙØÙØØÙØØÙÙØÙÙØ>Ø×ØþרØþרØ×Ø×ØþרØþרØ×ØþרØþרØûרØ×Ø Ø?×Öþ×Ö Öþ×ÖÖþ×ÖÖþ×ÖÖú×Ö×Ö×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖù×ÖÖÕÖÕÖÖìÕÖÖÕÖÕÖÕÖÖÕÕÖÖÕÖÕÕÖÕÕøÖÕÕÖÕÖÕÖÖÕÖ÷ÕÖÖÕÖÕÕÖÕÕýÔÕÔÔÕüÔÕÕÔÔÕùÔÕÔÔÕÔÕÕþÔÕÕôÔÕÕÔÔÕÔÕÔÔÕÔÔûÕÔÕÔÕÕõÔÕÕÔÔÕÔÔÕÕÔ~ÔýÓÔÓÓãÔÓÓÔÓÔÓÓÔÓÔÓÔÔÓÔÓÓÔÔÓÔÓÓÔÓÓÔÓÓ÷ÔÓÔÓÓÔÓÔÓ ÓÔÓÔüÓÒÓÒÒÓýÒÓÒÒýÓÒÓÓÒþÓÒÒÓüÒÓÓÒÒùÓÒÓÒÒÓÒÒÓýÒÓÒÒþÓÒÒÓýÒÓÒÒÑýÒÑÒÒÑÒöÑÒÑÒÑÒÑÒÑÒÒÑÒÑüÒÑÑÒÒþÑÒÒøÑÒÒÑÒÒÑÒÒüÑÒÒÑ~ÑÐ÷ÑÐÑÐÑÐÑÑÐÐûÑÐÐÑÐÐþÑÐÐþÑÐÐóÑÐÐÑÐÑÐÐÏÐÏÐÏÏÐÏþÐÏÏÐÏúÐÏÐÏÐÏÏþÐÏÏùÐÏÏÐÏÐÏÏûÐÏÏÐÏÏÐûÏÐÏÐÏÏÎÏùÎÏÎÎÏÎÏÏüÎÏÎÏÏþÎÏÏóÎÏÎÏÏÎÎÏÏÎÏÎÏÏÎÏÎþÏÎÎþÏÎÎüÍÎÍÎÎþÍÎÎûÍÎÎÍÎÎíÍÎÎÍÎÎÍÎÎÍÎÎÍÍÎÎÍÍÎÎúÍÎÍÎÍÎÎÍÌ÷ÍÌÍÌÍÍÌÍÌÌüÍÌÍÌÌøÍÌÌÍÌÌÍÌÌþÍÌÌþÍÌÌøÍÌÌÍÌÍÌÍÍÌøÍÌÍËÌÌËÌÌËþÌËËÌòËÌÌËÌÌËÌËÌÌËËÌÌüËÌËÌÌüËÌÌËËúÌËÌËËÌÌËúÊËÊËÊËËþÊËËþÊËËþÊËËúÊËËÊÊËËúÊËËÊËÊ>ÊÉöÊÉÊÉÉÊÊÉÊÉÉûÊÉÉÊÉÉÊÉþÊÉÉÊ÷ÉÊÉÊÊÉÉÊÉÉþÊÉAÉúÈÉÈÉÉÈÈþÉÈÈøÉÈÉÈÈÉÉÈÈýÉÈÉÉüÈÉÉÈÈõÉÈÉÉÈÉÉÈÉÈÉÉþÈÉÉþÈÉÉûÈÉÈÇÈÈþÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈùÇÈÇÈÈÇÈÈ@ÇÆþÇÆÆþÇÆÆôÇÆÆÇÆÇÆÇÆÆÇÆÆüÇÆÇÆÆûÇÆÆÇÆ ÆþÇÆBÆ?Í çþæç"çþæçŒçæûçææçææçæþçææûçææçææþçææþçææþçææþçææöåæåæåæåææååöæåæåæåææåææåæåæõåæåææåææåæååæåûæåææååäýåäååþäååþäååäüåääååüäåäååùäåäååäååäåøäåäåääåääþãä-äþãääúãäãäãää€ãýâãââãâã÷âãâãâããâããâñãâããââããââãâãâããâãüâããââüãâãââáâáþâááâáâáâüáâáââüáâáââáâþáââáâøáâáàáààááúàááààáá÷àáààááàáààáþàááþàááýàáà~àßüàßàßßþàßßüàßàßßöàßàßàßààßààßüàßßààþßààßàýßÞßßÞßüÞßßÞÞùßÞÞßÞßÞÞûßÞÞßÞÞßøÞßÞÞßßÞßßþÞßßþÞßßþÞßßúÞßßÞÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞÝÞþÝÞÞþÝÞÞÝÞÝÞøÝÞÞÝÞÝÝÞÞÝþÜÝ"Ý ÜþÝÜÜþÝÜÜÝÜüÝÜÝÜÜþÝÜHÜÛÜýÛÜÛÛüÜÛÜÛÛøÜÛÜÛÜÜÛÜÜúÛÜÛÜÛÜÜøÛÜÛÛÜÛÜÛÛÜÛÜÛýÜÛÜÜÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛÚÛþÚÛÛÚÛÚÛýÚÛÚÚþÙÚ+ÚýÙÚÙÙÚÙüÚÙÚÙÙûÚÙÙÚÙÙþÚÙÙÚûÙÚÙÚÙÙøÚÙÚÙÙÚÚÙÙîØÙØÙØØÙÙØÙØÙØØÙØØÙÙØÙüØÙÙØØþÙØØÙýØÙØØþÙØØùÙØÙØÙÙØBØþרØùרר×רØþר ØöררØ×ØØ×ØØûר×רØþרØ@×Öþ×ÖÖþ×ÖÖö×Ö×Ö×Ö×Ö×ÖÖû×ÖÖ×ÖÖ×÷Ö××Ö×ÖÖ×ÖÖ×ýÖ×ÖÖþÕÖÖÕöÖÕÖÖÕÕÖÕÖÕ ÕýÖÕÖÖÕÖÕùÖÕÖÕÕÖÕÕÖûÕÖÕÖÕÕþÔÕÕöÔÕÔÔÕÕÔÕÔÕÕÔÕüÔÕÕÔÔýÕÔÕÕûÔÕÕÔÕÕûÔÕÕÔÕÕÔüÕÔÔÕÕÔóÓÔÓÔÓÔÓÓÔÔÓÔÓÓÔÓþÔÓ ÓÔÞÓÔÓÓÔÓÓÔÓÓÔÓÔÓÓÔÓÔÓÓÔÓÓÔÒÒÓÒÒÓÒÒÓÒÒüÓÒÒÓÓÒÓòÒÓÓÒÓÓÒÓÒÓÒÒÓÒÒÓÒÓÒÓòÒÓÒÒÓÒÒÓÒÒÑÒÒÑÑûÒÑÑÒÑÑÒÑÒãÑÒÑÑÒÑÒÑÑÒÑÑÒÑÒÒÑÑÒÒÑÑÒÑÑÒÑÒÑÑüÒÑÑÒÒÑýÐÑÐ ÐþÑÐÐÑÐÑÐüÑÐÑÐÐüÑÐÑÐÐÑÐþÑÐÐÑÏüÐÏÐÏÏþÐÏÏûÐÏÏÐÏÏóÐÏÐÏÏÐÐÏÏÐÏÐÏÏ ÐÏþÐÏÏÐÏÐÏþÎÏÏÎÏÎÏþÎÏÏÎýÏÎÏÏÎúÏÎÏÏÎÏÏúÎÏÏÎÏÎÎÏÎÏ ÎþÍÎÎ÷ÍÎÎÍÎÎÍÍÎÎÍÎÍÎþÍÎÎþÍÎÎýÍÎÍ~ÍÌÍÌøÍÌÌÍÍÌÍÌÌÍÌúÍÌÍÌÌÍÍÌþÍÌÌþÍÌÌÍÌþÍÌÌûËÌËËÌÌùËÌÌËÌËÌÌËÌþËÌÌýËÌËËøÌËÌËÌËËÌÌþËÌÌüËÌÌËËþÊËËþÊËËÊöËÊÊËËÊÊËÊËËûÊËËÊËËÊËÊËûÊËËÊËËAÊüÉÊÊÉÉþÊÉÉÊÉþÊÉ ÉÊÉÊÉúÊÉÉÊÊÉ@ÉþÈÉÉþÈÉÉþÈÉÉöÈÉÉÈÉÈÈÉÈÉÉüÈÉÈÉÉÈðÉÈÉÉÈÈÉÈÉÉÈÉÈÉÈÉÉÈùÉÈÈÇÈÇÈÈÇÈÇúÈÇÈÈÇÈÈûÇÈÈÇÈÈÇÈÇüÈÇÇÈ È?ÇÆþÇÆÆþÇÆÆþÇÆÆÇþÆÇÇùÆÇÇÆÆÇÆÆûÇÆÆÇÆÆþÇÆÆþÇÆ@Æ?ÍþæçäçþæçØçæþçææþçææçæçæüçæçææþçææþçææåúæåæåæååûæåææååþæååæùåææååæåå÷æåæåæåææååæåæüåææååøäåäååääååþäååä åüäååääåäåäåäûãääãääûãäããääþãääãøäãääãäãää€ãþâããâòãââãââãâããâãâããâþãââüãâãââãýâãââþãââáâýáâááâüáâáââáâþáââáâðáâáâáâááââááâáâááþàáá÷àááààááàááüàáàááþàááàáþàá áþàááàßàßüàßßààßüàßàßßüàßàßßûàßààßßàþßààßþàßßýàßààßþÞßßüÞßÞßßþÞßßüÞßÞßßÞûßÞßÞßßõÞßÞßÞßÞßßÞßßÞýßÞßßüÞßßÞÞûÝÞÝÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞýÝÞÝ>ÝÜþÝÜÜùÝÜÜÝÜÝÜÜÝÜûÝÜÝÝÜÜûÝÜÜÝÜÜÝÜüÝÜÝÜÜþÝÜCÜÛýÜÛÜ ÜþÛÜÜýÛÜÛÛúÜÛÜÛÛÜÜþÛÜÜûÛÜÜÛÜÜÛÜõÛÜÛÛÜÚÛÚÛÚÛÛþÚÛÛþÚÛÛþÚÛÛÚ ÛþÚÛÛþÚÛÛþÚÛÛ+ÚþÙÚÚÙûÚÙÙÚÙÙþÚÙ ÙþÚÙÙüÚÙÚÙÙÚÙþÚÙÙþÚÙÙþÚÙÙØþÙØØþÙØØþÙØØÙûØÙØØÙÙØöÙØÙØØÙØÙØÙÙúØÙØÙØÙÙýØÙØDØþרØþרØþרØ×Ø×ýØ×ØØþרØþרØþרØüרØ×>×Öþ×ÖÖû×Ö××ÖÖþ×ÖÖû×Ö××ÖÖ×ýÖ×ÖÖþ×ÖÖ×Öþ×ÕÕÖÕùÖÕÖÕÕÖÕÕÖüÕÖÕÖÖûÕÖÕÕÖÖÕþÖÕÕÖýÕÖÕÕÖúÕÔÕÔÕÔÔÕþÔÕÕÔÕÔÕÔýÕÔÕÕÔüÕÔÕÔÔÕÔþÕÔ~ÔýÓÔÓÓÔÓÔÓþÔÓÓþÔÓ ÓþÔÒÒüÓÒÓÒÒõÓÒÒÓÒÒÓÒÓÒÓÓüÒÓÒÓÓÒþÓÒÒÓøÒÓÓÒÒÓÓÒÒÓïÒÓÓÒÓÒÒÓÒÒÑÒÒÑÒÑÒÒûÑÒÒÑÒÒþÑÒÒÑþÒÑÑþÒÑÑÒþÑÒÒÑÒüÑÒÒÑ~ÑÐþÑÐÐþÑÐÐÑÐÑøÐÑÐÑÐÐÑÐÐþÑÐÐýÏÐÏÏþÐÏÏïÐÏÐÏÐÐÏÐÏÐÏÐÏÐÏÐÏÏÐÏÐüÏÐÐÏÏÐÏõÐÏÏÐÐÏÏÐÏÏÎÎÏÎÏøÎÏÏÎÏÎÎÏÏþÎÏÏÎÏÎÏéÎÏÎÏÎÏÎÏÎÏÏÎÏÏÎÏÎÎÍÎÎÍÎÎÍÎþÍÎÎùÍÎÎÍÎÍÎÎÍýÎÍÎÎùÍÎÎÍÎÍÎÎûÍÎÎÍÎÎýÍÎÍ€ÍúÌÍÍÌÍÌÌÍûÌÍÌÍÌÌÍÌõÍÌÍÌÌÍÌÌÍÍÌÌþÍÌÌùÍÌÍÌÌÍÌÌþÍÌÌþËÌÌþËÌÌüËÌËÌÌËÌúËÌÌËËÌÌþËÌÌùËÌËÌËËÌÌËÌøËÌËÌÌËÌËËþÊËËþÊËËþÊËËûÊËËÊËËþÊËËþÊË ËüÊËÊËË@ÊùÉÊÉÊÉÊÉÉþÊÉÉüÊÉÊÉÉÊÉùÊÉÊÉÉÊÉÉüÊÉÊÉÉúÊÉÊÉÊÉBÉÈøÉÈÈÉÉÈÉÈÈÉíÈÉÈÉÈÉÉÈÉÈÈÉÈÉÈÉÉÈÉÉþÈÉÉÈúÉÈÉÉÈÉÉþÈÉÉýÈÉÈ ÈþÇÈÈþÇÈÈþÇÈÈúÇÈÈÇÈÇÇ ÈþÇÈÈþÇÈ ÈÇþÆÇ'ÇÆþÇÆÆþÇÆÆûÇÆÆÇÆÆüÇÆÇÆÆÇÆøÇÆÇÇÆÆÇÆ ÆþÇÆÆþÇÆCÆÿ?ÍýçæçîçþæçDçþæç†çæþçææïçææçææçææççæçææçææþçæ æûçææçææûçææçææçæûåææåææåæýåæååúæååææååøæåææååæååþæååþæååæþäååäåäûåääåääýåäååüäåäååþäååäåúäååääååäå äþãääþãääþãääãäþãääùãäãäããääþãääüãääã~ãâãâþãââûãâãâããâùãâãââãââûãââãââãâãâãâüãâãââþáââáâþáââáâüáââááâïáââááââáââááââááââûáâáàááüàáàá áþàááûàááàááúàáàáàááþàááüàááà~àóßàßàßßàßàßààßßüàßàßßàßûàßààßß÷àßàßààßàßßàß÷àßßààßÞÞßßûÞßßÞßßýÞßÞÞòßÞßÞßßÞßÞßßÞÞßßÞßÞïßÞÞßÞßÞÞßßÞÞßßÞÞßßÞüÝÞÝÞ ÞøÝÞÞÝÞÞÝÞÞüÝÞÝÞÞ?ÝýÜÝÜÜÝÜüÝÜÝÜÜþÝÜÜüÝÜÝÜÜùÝÜÜÝÜÝÜÜúÝÜÜÝÝÜÜûÝÜÝÜÝÝEÜ÷ÛÜÜÛÜÛÛÜÛÛÜþÛÜÜþÛÜÜûÛÜÛÜÛÛýÜÛÜÜþÛÜÜþÛÜÜÛÜþÛÜÜýÛÜÛÛÚüÛÚÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛ Û=ÚþÙÚÚõÙÚÙÚÙÚÙÚÙÚÙÙøÚÙÙÚÙÚÚÙÙþÚÙÙûÚÙÙÚÙÙþÚÙÙüÚÙÙÚÚÙÚÙþÚØØüÙØÙØØÙüØÙÙØØÙØûÙØØÙØØúÙØØÙØÙÙØþÙØØùÙØÙØÙØÙÙGØ×ØþרØþרØþרØþרØþרØûרØ×ØØþרØüרØ×>× Öþ×ÖÖü×Ö×ÖÖü×Ö×ÖÖü×Ö×ÖÖ× Öþ×Ö ÖýÕÖÕÕþÖÕÕýÖÕÖÖÕÖÕúÖÕÖÕÖÕÕýÖÕÖÖÕûÖÕÖÖÕÕÔøÕÔÕÔÕÕÔÕÕÔÕþÔÕÕÔÕÔÕÔþÕÔÔýÕÔÕÕþÔÕÕúÔÕÕÔÕÔZÔþÓÔ!ÔÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓ ÓþÔÓÓìÔÓÒÓÒÓÒÓÓÒÓÒÓÒÓÓÒÒÓÒÒÓþÒÓÓÒúÓÒÒÓÓÒÒþÓÒÒÓýÒÓÒÒëÓÒÓÒÒÓÒÒÑÒÒÑÒÑÒÑÒÒÑÑÒÒÑÒ÷ÑÒÑÑÒÒÑÒÑÑ÷ÒÑÒÒÑÒÑÑÒÒþÑÒÒùÑÒÑÒÒÑÒÒ€ÑÐÑøÐÑÐÐÑÐÑÐÐÑÐþÑÐÐÑÐþÑÐÐþÑÐÐþÑÐÐöÑÐÑÐÐÑÐÐÑÐÐÏþÐÏÏþÐÏÏÐþÏÐÐÏðÐÏÏÐÏÐÏÏÐÏÐÏÐÏÐÏÏþÐÏÏÐÏüÐÏÐÏÏþÎÏÏÎÏþÎÏÏþÎÏÏÎÏþÎÏÏÎÏûÎÏÏÎÏÏýÎÏÎÎÏòÎÏÎÏÏÎÏÎÏÎÏÎÍÎÎÍúÎÍÎÎÍÎÎúÍÎÎÍÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎÍÌûÍÌÍÍÌÌþÍÌÌïÍÌÌÍÌÍÍÌÍÌÍÌÌÍÌÍÌÌøÍÌÍÌÍÌÍÌÌþÍÌÌùÍÌÌÍÌÍÌÌýËÌËËÌËùÌËÌÌËÌËËôÌËËÌËËÌÌËËÌËËÌþËÌÌõËÌÌËÌÌËÌËÌËËüÊËÊËËûÊËÊÊËËüÊËÊËËüÊËÊËËûÊËÊÊËËýÊËÊ>ÊýÉÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉCÉÈÉüÈÉÈÉÉûÈÉÈÈÉÉÈþÉÈÈÉÈÉÈñÉÈÉÉÈÈÉÈÉÉÈÉÉÈÉÉüÈÉÉÈÈûÇÈÈÇÈÈþÇÈÈûÇÈÈÇÈÈþÇÈÈþÇÈÈÇÈýÇÈÇ@ÇÆÇÆþÇÆÆûÇÆÆÇÆÆüÇÆÇÆÆûÇÆÇÇÆÆüÇÆÇÆ>Æ?Í=çþæççþæç/çþæç8çæçæþçææþçææüçæçææþçææüçæçææüçæçææþçææûçææçææûåææåææåæåæåæûåæååææåæþåææåþæååúæååææååæåäüåääååäåþäååäåþäååäåäåþäååäåøäåääååäååþãääþãääþãääãäþãääþãääòãääãäãäãääãäãääúãääãäã€ãýâãââúãâãâãââþãââãýâãââãýâãââãâûãââãââãâãôâãââááââááâááþâááâûáââáââáâüáâáââþáââáûâááâááâáâþàááøàáàáàáàááûàááàááàáþàááþàááþàááþàááúàáàááà~àßúàßßààßßþàßßûàßààßßùàßààßàßßàóßàßààßßàßààßààûßàßàßßþàßßýÞßÞÞýßÞßßÞüßÞÞßßýÞßÞÞþßÞÞßþÞßßÞßûÞßßÞßßÞÝÞüÝÞÝÞÞûÝÞÞÝÞÞþÝÞÞüÝÞÝÞÞÝþÜÝÝþÜÝÝÜÝÜÝÜþÝÜÜÝ ÜÝÜüÝÜÝÜCÜÛÜÛûÜÛÜÛÜÜüÛÜÛÜÜþÛÜÜÛÜÛþÜÛÛîÜÛÛÜÜÛÜÛÜÜÛÛÜÛÛÚÚÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛ?ÚÙÚÙþÚÙÙþÚÙÙÚ ÙüÚÙÚÙÙþÚÙÙûÚÙØÙØØÙØÙüØÙÙØØÙØýÙØÙÙØüÙØÙØØÙþØÙÙØÙýØÙØCØ×Øþר ØþרØþרØø×Ø×ØØ×Ø×רþר ØüרØ×>×Ö×Ö×Öþ×ÖÖ×Öþ×ÖÖ×Ö×þÖÕÕÖÕøÖÕÖÕÖÕÖÕÕÖ÷ÕÖÕÕÖÕÕÖÕÕÖþÕÖÖúÕÖÕÖÖÕÕ÷ÖÕÕÖÕÖÕÕÖÖúÕÖÕÕÖÕÕÔÕþÔÕÕÔÕûÔÕÔÔÕÕúÔÕÔÔÕÔÔÕÔÕÔÕÔÕûÔÕÔÔÕÕÔÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓÔÓþÔÓÓþÔÓÓþÔÓÓÔÓÒ÷ÓÒÒÓÒÒÓÓÒÒøÓÒÒÓÓÒÓÒÒüÓÒÒÓÓùÒÓÒÒÓÓÒÒþÓÒÒÓøÒÓÒÒÓÓÑÒÒÑ÷ÒÑÑÒÑÒÒÑÒÒÑÒÑÒÑÒüÑÒÑÒÒÑõÒÑÒÑÑÒÑÒÒÑÒÒÑÐÑÐþÑÐÐÑÐþÑÐÐþÑÐÐûÑÐÐÑÏÏóÐÏÏÐÏÏÐÏÐÏÐÐÏÏÐÏúÐÏÐÐÏÐÐüÏÐÏÐÐÏÐÏýÐÏÐÐÏÐÏÎÏùÎÏÎÏÏÎÏÏÎúÏÎÏÏÎÏÏüÎÏÎÏÏÎÏÎÏúÎÏÎÏÏÎÎÏùÎÏÏÎÎÏÎÎþÍÎÎþÍÎ ÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎ ÎÍ΂ÍýÌÍÌÌûÍÌÍÌÍÍÌûÍÌÌÍÌÌüÍÌÍÌÌþÍÌÌüÍÌÍÌÌþÍÌÌÍ÷ÌÍÌÍÌÍÌÍËËÌùËÌËËÌÌËËÌËÌþËÌÌýËÌËËþÌËËÌËÊËþÊËËõÊËËÊËËÊËËÊËËþÊËËþÊËËøÊËËÊËËÊËËýÊËÊ?ÊÉþÊÉÉóÊÉÉÊÉÉÊÉÊÉÊÊÉÉÊ ÉÊ ÉüÊÉÊÉAÉÈÉÈÉþÈÉÉþÈÉÉúÈÉÈÈÉÈÈÉýÈÉÈÈøÉÈÉÉÈÉÈÉÉÈÉùÈÉÈÈÉÈÉÉ ÈÇÈþÇÈÈÇÈùÇÈÈÇÈÇÈÈþÇÈÈÇÈûÇÈÇÇÈÈüÇÈÈÇ?ÇõÆÇÇÆÆÇÆÆÇÇÆÆþÇÆÆûÇÆÇÇÆÆþÇÆÆùÇÆÇÆÇÇÆÆÇAÆ?Í çþæçÛçþæçÖçæþçææþçææþçæ æþçææçæùçæçææçææþçææåûæååæååüæååææåæåýæåææåþæååæåæåùæåææåäååäþåääåõäååääåääååääïåääåäåäåääåäåäåäååþäååùäåääåäååùäãääããääþãääúãäãäãääùãäãäããääþãääþãääãäãäãýâãââüãââããâãâúãââããââûãââãââþãââãâãûâããâããâáùâááââáââáâáâáùâááââáââ÷áâááâááâááâáúâáââáââøáâáââáàááþàááþàááàýáàááüàáàááþàááþàááþàááþàáá€àßüàßàßßþàßßüàßàßßàßøàßàßàßàßßàßàßûàßßàßßüàßÞßßÞßþÞßßÞßþÞßßþÞßßÞýßÞßßÞßÞþßÞÞüßÞÞßßûÞÝÞÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞÝÞþÝÞÞÝÞõÝÞÝÞÞÝÞÝÞÞÝ?Ý ÜÝÜþÝÜÜÝ ÜþÝÜÜþÝÜÜþÝÜÜÝCÜÛúÜÛÜÜÛÜÜÛÜþÛÜÜÛýÜÛÜÜÛýÜÛÜÜýÛÜÛÛÜôÛÜÛÜÜÛÜÜÛÛÜÛÛþÚÛÛüÚÛÚÛÛÚýÛÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛÚþÙÚ4ÚÙÚÙÚÙþÚÙÙ÷ÚÙÙÚÚÙÙÚÙÙÚöÙÚÙÚÙÙÚÙÙÚÚýÙÚÙÙûÚØØÙØØþÙØØüÙØØÙÙØÙ ØÙ÷ØÙÙØØÙÙØÙÙþØÙÙØþÙØCØüרר Øýר××Ø×Ø× ØþרØ×ØþרØ?×Öþ×ÖÖþ×ÖÖ×Öþ×Ö Öþ×Ö Ö×Öü×ÕÕÖÖÕÖÕÖÕþÖÕÕûÖÕÖÖÕÕÖýÕÖÕÕÖÕþÖÕÕÖÕüÔÕÔÕÕþÔÕÕûÔÕÕÔÕÕÔÕüÔÕÔÕÕûÔÕÔÔÕÕÔ÷ÕÔÕÕÔÔÕÔÕÕýÔÕÔÔûÓÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓüÔÓÔÓÓÔÓÒÓûÒÓÓÒÓÓÒÓýÒÓÒÒÓÒÓúÒÓÒÒÓÒÒûÓÒÓÒÓÓùÒÓÒÒÓÓÒÒÓÒûÓÒÒÑÒÒêÑÒÒÑÒÑÑÒÒÑÑÒÑÒÑÑÒÑÑÒÒÑÑÒÑ÷ÒÑÒÒÑÒÑÑÒÒÑúÒÑÒÒÑÒÒ€ÑÐÑÐþÑÐ ÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐúÑÐÏÐÐÏÏÐÏõÐÏÐÐÏÏÐÐÏÏÐÐýÏÐÏÏúÐÏÐÏÐÏÏÐÏùÐÏÐÏÏÐÏÏûÐÎÏÏÎÎòÏÎÎÏÎÎÏÏÎÏÏÎÏÎÎýÏÎÏÏüÎÏÏÎÎýÏÎÏÏüÎÏÎÏÏþÎÏÏöÎÏÏÎÏÎÏÎÏÎÎýÍÎÍÍÎþÍÎ ÎþÍÎÎþÍÎÎÍûÎÍÎÍÎÎýÍÎÍ~ÍÌöÍÌÌÍÌÍÌÌÍÌÌÍÌýÍÌÍÍÌüÍÌÍÌÌþÍÌÌôÍÌÍÍÌÍÍÌÍÌÍÌÌþÍÌÌþÍÌÌËÌËÌòËÌÌËÌÌËËÌËÌÌËÌÌËþÌËËüÌËËÌÌüËÌËÌÌòËÌÌËËÌËÌÌËËÌÌËËÊËþÊËËøÊËÊÊËÊÊËËûÊËËÊËËüÊËÊËËþÊËËÊË?ÊÉþÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉûÊÉÊÊÉÉúÊÉÊÉÊÉÉþÊÉÉþÊÉEÉüÈÉÈÉÉÈÉþÈÉÉùÈÉÈÉÈÈÉÉÈýÉÈÉÉÈÉûÈÉÉÈÉÉüÈÉÉÈ ÈûÇÈÈÇÈ ÈûÇÈÈÇÈÈþÇÈÈüÇÈÇÈÈúÇÈÈÇÇÈ È?ÇÆþÇÆÆþÇÆÆþÇÆÆûÇÆÇÇÆÆþÇÆÆþÇÆÆþÇÆDÆÿ?ÍéçþæçÖçæþçæ æüçæçææçæçæûçæççææþçææþçææøçæçæåæåææüåææååþæååúæåæååææùåæåæåæååüæåæååûæåææååüæåæååöæååääåäåäååþäååäøåäåäååäååëäåääååääååääåäåäåäåäååþäå åüäãäããäãäãäþãääãäüãäãääãäûãääãää„ãûâãââããüâããââüãâãââþãââöãâãâããââãââãâúãâãâãââþáââýáâááþâááâáúâáâááââüáââááâùáââáâáââáëâááââáàááàáàáàááàááàááþàááþàááþàááþàá áþàááþàáá€àýßàßßàßàßöàßßàßßààßààßàßþàßßòàßßàßßàßàßßààßß÷àßàßßàßßÞÞýßÞßßüÞßßÞÞýßÞßßþÞßßûÞßßÞßßüÞßÞßßûÞßÞÞßßýÞßÞÞðßÞÞßßÞßßÞßÞÞÝÞÝÞÞÝúÞÝÞÝÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞÝ Þ@ÝÜþÝÜÜþÝÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜøÝÜÜÝÜÜÝÜÜÝÜþÝÜEÜÛþÜÛÛÜÛðÜÛÜÜÛÜÛÜÛÛÜÛÛÜÜÛÛÜÛúÜÛÛÜÛÜÜÛÜòÛÜÛÛÜÛÜÛÜÛÛÜÚÛ ÛþÚÛ ÛþÚÛÛþÚÛÛüÚÛÚÛÛ?ÚÙþÚÙÙûÚÙÙÚÙÙúÚÙÙÚÚÙÙùÚÙÚÙÙÚÙÙûÚÙÙÚÙÙøÚÙÙÚÙÙÚÙÙÚÙØþÙØØÙØÙûØÙØÙØØõÙØÙØÙØÙØØÙØØüÙØÙØØÙôØÙÙØÙØØÙÙØÙØ?ØþרØîרØ×Ø×Ø×ררØ×ØØ×ØØüררØþרØûרØ×ØØ×Ø?×ýÖ×Ö Öþ×ÖÖü×Ö×ÖÖþ×ÖÖû×Ö××ÖÖ×þÖ×× Öù×ÖÖÕÕÖÕÕýÖÕÖÖÕþÖÕÕÖüÕÖÕÖÖÕûÖÕÖÖÕÕõÖÕÕÖÕÖÕÖÖÕÖÖÕþÔÕÕÔüÕÔÕÔÔÕÔÕûÔÕÕÔÕÕúÔÕÕÔÕÔÔûÕÔÕÔÕÕöÔÕÔÕÕÔÕÔÕÔCÔþÓÔ=Ô ÓþÔÓÓþÔÓÓûÔÓÓÔÓÓûÔÓÓÔÓÓøÔÓÓÔÔÓÔÓÓþÔÓÓÒøÓÒÒÓÓÒÓÒÒíÓÒÒÓÒÓÒÓÓÒÒÓÒÓÒÓÓÒÓÓÒÓóÒÓÓÒÓÓÒÓÓÒÓÓÒÒÓÒüÓÒÑÒÒÑÒ÷ÑÒÑÑÒÒÑÑÒÒñÑÒÑÑÒÑÑÒÑÒÒÑÒÑÒÒÑøÒÑÑÒÑÒÑÒÒÑÒÑÐþÑÐÐþÑÐÐûÑÐÐÑÐÐþÑÐÐþÑÐÐþÑÐÐÑÐþÑÐÐÏÐÏñÐÏÐÏÏÐÏÐÐÏÐÐÏÏÐÐýÏÐÏÏÐ÷ÏÐÏÐÏÐÏÏÐÐÏÐýÏÐÏÏþÐÏÏÐÏÎÏÎûÏÎÏÎÏÏûÎÏÏÎÏÏýÎÏÎÎûÏÎÏÎÏÏÎÏþÎÏÏþÎÏÏýÎÏÎ ÎþÍÎÎüÍÎÍÎÎûÍÎÎÍÎÎûÍÎÍÍÎÎÍÎüÍÎÍÎÎÍ΂ÍÌûÍÌÌÍÌÌûÍÌÌÍÌÌüÍÌÌÍÍÌÍÌýÍÌÍÍÌüÍÌÍÌÌþÍÌÌüÍÌÌÍÍýÌÍÌÌËþÌËËùÌËÌËËÌËËÌËÌþËÌÌËÌËÌËþÌËËÌþËÌÌËÌþËÌÌúËÌÌÊÊËËþÊËËþÊËËùÊËÊËÊÊËËþÊËËøÊËÊËÊËÊËËúÊËËÊÊËËþÊËËÊËüÊËËÊ>ÊÉþÊÉÉþÊÉÉþÊÉÉùÊÉÉÊÉÊÉÉþÊÉÉþÊÉÉþÊÉ ÉþÊÉÉúÊÉÉÊÊÉGÉÈÉúÈÉÈÉÉÈÈÉþÈÉÉúÈÉÉÈÈÉÉÈüÉÈÈÉÉÈÉÈúÉÈÉÈÉÈ ÈþÇÈÈûÇÈÈÇÈÈÇÈþÇÈÈõÇÈÇÇÈÈÇÈÈÇÈÈþÇÈÈÇÈ@ÇÆþÇÆÆþÇÆÆþÇÆÆþÇÆ ÆþÇÆÆÇÆþÇÆDÆ?Í“çþæçÅçþæçdçùæçæçæçææçæçæçæþçææçæþçææûçæççææåæåæúåæååæååèæåæååæåæåæåæåæåææååææåæååæåþæååøæååääååääåüäåäååäúåääåäååþäååäøåäååäåäååäåäþåääãäþãääþãääþãääþãääãýäãääþãääþãää€ãâþãââãýâãââüãââããâõãâããâãââããââûãââãââãýâãââþãââûãââãââþáââþáââáâüáâáââøáââááâáââüáâáââýáâááúâááâáââõáâáâáââááàá áþàá áþàááþàá áþàááþàááàá€àßàßàßûàßßàßßöàßààßßàßàßßàßþàßßþàßßÞýßÞßßÞßþÞßßÞßúÞßßÞÞßßÞßéÞßßÞÞßßÞßßÞßÞÞßÞÝÞÝÞÝÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞÝ ÞþÝÞÞÝÞ%ÝþÜÝÝÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜùÝÜÜÝÜÝÜFÜÛÜçÛÜÛÜÛÜÛÛÜÛÜÛÛÜÛÜÜÛÜÛÜÛÜÛÜÜÛÜÛÜÛÜüÛÜÜÛÛÜóÛÜÜÚÚÛÚÚÛÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛÚÛÚöÛÚÛÛÚÛÛÚÛÚ>ÚýÙÚÙÙþÚÙÙþÚÙÙþÚÙÙÚÙüÚÙÚÙÙþÚÙÙþÚÙÙØÙúØÙÙØÙØØüÙØÙØ ØÙøØÙØØÙØÙØØüÙØÙØØøÙØØÙÙØØÙÙØüÙØÙØ@Ø×ØþרØþרØ×ØþרØþרØþרØ?×Öþ×ÖÖþ×Ö Ö×Ö×Öþ×ÖÖþ×ÖÖù×Ö×ÖÖ×ÖÖÕþÖÕÕòÖÕÖÕÕÖÕÕÖÖÕÕÖÕÕøÖÕÖÕÕÖÖÕÕþÖÕÕùÖÕÕÖÕÖÕÕÖõÕÖÖÕÖÕÖÕÕÖÕÕûÔÕÔÔÕÕÔþÕÔÔûÕÔÕÔÕÕþÔÕÕúÔÕÔÕÔÕÕúÔÕÔÕÔÕÕüÔÕÔÕÕûÔÕÕÔÕÕ€ÔÓûÔÓÔÔÓ ÓùÔÓÔÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓÒðÓÒÓÓÒÓÒÓÒÒÓÓÒÒÓÒÒöÓÒÓÒÒÓÓÒÓÒÒþÓÒÒÓýÒÓÒ ÒúÓÒÒÑÑÒÒÑÒþÑÒÒ÷ÑÒÑÒÑÑÒÑÒÒþÑÒÒÑþÒÑÑÒþÑÒÒûÑÒÑÒуÑÐþÑÐÐÑýÐÑÐÐþÑÐÐÑÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÏÐÐÏþÐÏÏÐýÏÐÏÏöÐÏÐÏÏÐÏÏÐÏÏûÐÏÐÏÐÐÏþÐÏÏþÐÏÏ÷ÐÏÐÏÐÏÐÐÏÏþÎÏÏÎÏÎÏüÎÏÎÏÏúÎÏÎÏÏÎÎÏöÎÏÎÎÏÏÎÎÏÎÎþÏÎÎÏÎþÍÎÎÍÎÍÎþÍÎÎöÍÎÎÍÍÎÍÎÍÎ ÎþÍÎÎÍüÌÍÍÌÌÍÌþÍÌÌÍÌÍøÌÍÌÍÌÌÍÌÌÍÌÍÌÍúÌÍÌÌÍÌÌËþÌËËýÌËÌÌËÌËÌþËÌÌþËÌÌïËÌËÌËËÌËËÌËËÌËÌËÌÌýËÌËËõÌËÌÌËËÌÌÊÊË ËþÊËËÊËþÊËËþÊËËúÊËÊËÊËËþÊËËüÊËËÊ>Ê ÉþÊÉ ÉþÊÉÉþÊÉÉùÊÉÊÉÉÊÉÉþÊÉÉþÊÉ?ÉÈýÉÈÉÉûÈÉÈÉÈÈýÉÈÉÉüÈÉÉÈÈúÉÈÉÈÉÈÈõÉÈÉÈÈÉÈÈÉÉÈÈÉûÈÉÈÈÉÉÈþÉÈÈþÇÈÈüÇÈÇÈÈôÇÈÇÇÈÇÈÇÈÈÇÈÈûÇÈÈÇÈÈþÇÈÈÇÈþÇÈÈüÇÈÈÇ?ÇýÆÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆüÇÆÇÆÆûÇÆÆÇÆ>Æ?Í|çþæçAçýæçææþçææþçææþçææüçæçææþçæ æþçææ÷çæçææçæçææýåæååþæååæøåææååææååæåæõåæåææååææåææåæåäýåäååäýåäååäýåäååùäååääåääåþäååäåþäååäþåä äãäþãääãäúãäãäãääúãäããäã~ãýâãââùãââãâãââã÷âãââããâãââãüâããââüãâãââõãââããâãââãââþáââúáââááââþáââüáâáââüáâáââþáââþáââáâùáââáâáââûáâáàááþàááþàááþàááþàááþàáá€àýßàßßàßùàßàßààßßþàßßàßàøßàßààßàßßàýßàßßðàßààßàßàßßÞÞßÞÞßßÞüßÞÞß ßúÞßÞßÞßßÞßÞßÞþßÞÞßÝúÞÝÝÞÝÞÞþÝÞÞþÝÞÞõÝÞÞÝÞÝÞÝÞÝÞÞüÝÞÝÞÞ@ÝÜøÝÜÝÝÜÜÝÜÜþÝÜ ÜþÝÜÜ÷ÝÜÜÝÜÜÝÝÜÜüÝÜÝÜÜüÝÜÝÜCÜþÛÜÜÛÜÛþÜÛÛÜÛÜÛÜÛíÜÛÜÛÛÜÜÛÛÜÜÛÜÛÜÜÛÜÛÛÜýÛÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛùÚÛÛÚÛÚÛÛûÚÛÛÚÛÛøÚÛÚÛÚÛÚÛÛþÚÛÛ?ÚÙ÷ÚÙÚÙÙÚÙÚÙÙÚ ÙþÚÙÙþÚÙÙþÚÙÙÚýÙÚÙÙþÚÙÙûÚÙÙÚÙÙýØÙØØþÙØØýÙØÙÙþØÙÙñØÙÙØØÙØÙØÙØÙØÙØØþÙØØþÙØØÙýØÙØØþÙØAØ× Ø×ØþרØþרØþרØþר Ø×Ø@×Öþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖ×Öþ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×ÖÖÕÕþÖÕÕÖÕþÖÕÕþÖÕÕýÖÕÖÖÕþÖÕÕùÖÕÖÕÕÖÕÕüÖÕÖÕÕþÖÕÕþÔÕÕÔüÕÔÔÕÕþÔÕÕÔÕÔùÕÔÕÔÔÕÔÔøÕÔÕÕÔÕÔÕÕÔÕÔþÕÔoÔþÓÔÔüÓÔÔÓÓþÔÓÓþÔÓÓ÷ÔÓÓÔÓÓÔÔÓÓûÔÓÓÔÓÓþÔÓÓþÔÓÓýÒÓÒÒÓüÒÓÓÒÒíÓÒÓÒÒÓÒÓÓÒÓÓÒÓÓÒÒÓÒÒþÓÒÒÓÒòÓÒÓÓÒÓÒÒÓÒÓÒÓÑÑÒýÑÒÑÑÒÑöÒÑÒÑÑÒÒÑÑÒÒþÑÒÒùÑÒÒÑÒÑÒÒþÑÒÒÑÒ€ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐüÑÐÑÐÐûÑÐÐÑÐÐùÑÐÐÑÐÑÐÐþÑÐÐóÑÐÑÐÐÑÑÐÐÏÐÐÏÏÐÏþÐÏÏÐûÏÐÏÐÏÏÐÏþÐÏÏþÐÏÏÐýÏÐÏÏÐþÏÐÐÎùÏÎÏÏÎÎÏÏöÎÏÎÎÏÏÎÏÎÏÏòÎÏÏÎÏÎÏÏÎÏÏÎÎÏÏÎÏÎÏÎþÍÎÎÍÎþÍÎÎþÍÎÎÍÎüÍÎÍÎ ÎþÍÎÎÍþÎÍ€ÍüÌÍÍÌÌýÍÌÍÍÌÍþÌÍÍüÌÍÍÌÌÍÌÍÌìÍÌÍÍÌÌÍÌÍÌÌÍÌÌÍÌÍÌÍÌÌËÌûËÌËËÌÌþËÌÌËÌ÷ËÌÌËÌËÌÌËËÌüËÌËÌÌüËÌËÌÌùËÌËÌËÌËËþÊËËüÊËÊËËþÊËËûÊËËÊËËÊËþÊËËþÊËËþÊËËþÊËËÊË@ÊÉÊÉþÊÉÉþÊÉÉÊÉùÊÉÉÊÉÊÉÉþÊÉÉûÊÉÉÊÉÉþÊÉÉþÊÉEÉýÈÉÈÈÉÈÉÈøÉÈÉÈÈÉÉÈÈÉÈûÉÈÉÉÈÈÉÈÉÈþÉÈÈÉÈþÇÈÈþÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈùÇÈÇÈÇÇÈÈ@ÇýÆÇÆÆþÇÆÆüÇÆÇÆÆûÇÆÇÇÆÆÇÆþÇÆYÆÿ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕ,çýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæþçææþçææüçæçææçæùçææççÍåþæååæåþæååæýåæååæåþæååûæåæÍ÷äåääåäåäååäåäåúäåäååääýåäååúäåääÍäùãäãääãääþãääþãä äþãääãäãþÍ.ãþÍ.ãþÍâûãâããââãâãâøãâããââãââúãâãâãâ âþÍáþâááûâáââááâþáââ÷áâáââáâáââáûâáâÍáúàáàáàá áýàáààöáàááàááààá áûàááÍ.àþÍ.àþÍßûàßàßààùßààßààßßþàßßùàßàßàßààßþàßßþÍþÞßßûÞßÞÞßßüÞßÞßßþÞßßÞ÷ßÞßÞßÞßßÞÞßùÞßÞÞßÍÞþÝÞÞúÝÞÝÞÝÞÞüÝÞÝÞÞþÍþÜÝ,ÝþÍýÜÝÜÜÝÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜýÝÍ.ÜþÍÜÛÜþÛÜÜöÛÜÛÜÜÛÜÛÜÛÛþÜÛÛÜùÛÜÛÜÛÍÛþÚÛÛüÚÛÚÛÛþÚÛÛÚÛþÚÛ ÛûÚÛÚÍ.ÚþÍÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙÚûÙÚÙÙÚÚýÙÚÙÙüÚÙÍØÙØõÙØØÙØØÙÙØØÙÙúØÙØØÙØØöÙØÙÙØØÙØÙØØÙØýÙÍ.ØþÍרöרר×רØ×ØØûרØ×ØØþרØüררØþÍ.×þÍÖþ×ÖÖü×Ö×ÖÖþ×ÖÖþ×ÖÖû×Ö××ÖÖ×Öü×Ö×ÖÖû×ÖÖÍÖÕûÖÕÕÖÕÕüÖÕÖÕÕþÖÕÕþÖÕÕõÖÕÖÕÖÖÕÕÖÖÕÕûÖÕÕÍöÕÔÕÔÔÕÕÔÕÔÔÕÔùÕÔÕÕÔÕÔÔÕÔÕÔÕøÔÕÔÕÔÕÍ.ÔþÍ.ÔþÍÓþÔÓÓþÔÓÓûÔÓÓÔÓÓùÔÓÓÔÓÔÓÓÔÓûÔÓÓÍûÓÒÒÓÒÒüÓÒÓÒÒùÓÒÓÒÓÓÒÒÓýÒÓÒÒþÓÒÒþÍþÒÑÑÒýÑÒÑÑíÒÑÒÒÑÑÒÒÑÑÒÒÑÒÑÑÒÒÑÑÒþÑÒÒûÑÒÑÍ.ÑþÍ.ÑþÍýÐÑÐÐüÑÐÑÐ ÐùÑÐÑÐÐÑÐÐøÑÐÐÑÐÐÑÐÐþÍÐùÏÐÐÏÏÐÏÏÐÏÐþÏÐÐÏþÐÏÏþÐÏÏúÐÏÐÏÍþÏÎÎÏûÎÏÏÎÏÏüÎÏÎÏ ÏüÎÏÏÎÎúÏÎÏÎÎÏÏþÍüÎÍÍÎÎûÍÎÍÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎÍüÎÍÍ/Í/ÍüÌÍÌÍÍÌüÍÌÌÍÍÌþÍÌÌýÍÌÍÍýÌÍÌÌøÍÌÍÌÌÍÍÌûËÌËËÌÌþËÌÌËÌùËÌÌËÌÌËËÌûËÌËÌËËüÌËÍËúÊËÊËÊËËúÊËÊËÊËËþÊËËüÊËÍ.ÊþÍÉûÊÉÊÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉüÊÉÊÉÉþÍ.ÉþÍúÈÉÈÉÈÉÉþÈÉÉÈÉüÈÉÉÈÈÉÈÉùÈÉÈÉÈÉÈÈÉúÈÉÈÉÍÈüÇÈÇÈÈüÇÈÇÈÈÇÈÇÈÇÈþÇÈÈùÇÈÈÇÈÍ.ÇþÍÆþÇÆ ÆûÇÆÆÇÆÆþÇÆÆüÇÆÇÆÆþÍ.ÆþÍ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕçþæççýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæçæþçææþçæ æùçæçææçæ æçþÍúåæååæååæúåæåææååæåþæååþæååöæåæååæåæÍþäååûäååäååýäåääåòäåäåäåääååääåääåäåüäåÍäþãääþãääùãäããäãääþãääþãääûãääÍ.ãþÍ.ãþÍâúãâãâãââãâûãââãââþãââãâüãâÍâá÷âááââáââááûâáâáââþáââöáâáâááâááââûáââÍýáàááàáüàáàááþàááàáþàááþàááþÍ.àþÍ.àþÍßà ßþàßßàßàßôàßàßßààßßàÍÞßûÞßßÞßßÞßÞßðÞßÞßÞßÞÞßÞÞßÞßÞßßþÍ ÞþÝÞÞúÝÞÝÞÝÞÞþÝÞÞþÝÞÞþÍÝþÜÝÝþÍ ÜþÝÜÜþÝÜÜÝùÜÝÜÜÝÝÜÜþÝÜÜþÍ.ÜþÍÜÛÜþÛÜÜþÛÜÜýÛÜÛÛÜÛõÜÛÛÜÛÜÛÜÜÛÜÜüÛÜÍÛþÚÛÛþÚÛÛþÚÛÛ÷ÚÛÛÚÛÛÚÚÛ ÛþÍ.ÚþÍÙüÚÙÚÙÙþÚÙÙþÚÙÙÚÙþÚÙÙþÚÙÙþÚÙÙýÚÍøÙØØÙØØÙØØ÷ÙØÙØÙØÙÙØØÙøØÙØØÙØÙØØÙØþÍ.ØþÍüררØþרØþרØýר××ýØÍ.×þÍÖþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖþ×ÖÖþ×ÖÖü×Ö×ÖÖþÍøÖÕÕÖÕÖÕÖÖÕðÖÕÖÕÕÖÖÕÕÖÕÖÕÖÕÖÖÕÖúÕÖÕÖÕÖÖÕýÖÍÖÔÕÔÕÔÕÔÕÕÔÔÕÔÕÔÕÕÔÔÕÕÔÕÕÔÕÕÔÔÕÔÕÔÕÔÕÔÔÕÔÕÔÔüÕÔÍ.ÔþÍ-ÔýÓÍÔýÓÔÓÓþÔÓÓùÔÓÔÓÔÔÓÓûÔÓÓÔÓÓþÔÓÓýÔÍùÒÓÒÓÒÒÓÓÒ÷ÓÒÓÓÒÓÒÓÒÒþÓÒÒÓûÒÓÓÍúÑÒÒÑÑÒÒÑÒÑøÒÑÒÑÒÒÑÒÒþÑÒÒÑúÒÑÒÑÑÒÒûÑÒÒÍ.ÑþÍ.ÑþÍÐÑÐÑøÐÑÐÐÑÐÑÐÐþÑÐÐüÑÐÍþÐÏÏûÐÏÐÐÏÏþÐÏÏïÐÏÏÐÏÐÐÏÏÐÐÏÐÏÏÐÏÏûÐÏÐÍþÏÎÎÏÎÏúÎÏÏÎÏÎÎÏýÎÏÎÎþÏÎÎÏÎûÏÎÏÍÎþÍÎÎþÍÎÎþÍÎÎûÍÎÍÍÎÎþÍÎ ÎþÍ/Í/ÍþÍÌÌøÍÌÍÌÍÌÍÌÌþÍÌÌóÍÌÌÍÌÍÌÌÍÍÌÌÍÍþÌÍÍûÌÍÌÍÌÌþÍÌöËÌÌËÌËËÌËÌÌúËÌÌËËÌÌËýÌËÌÌþËÌÌüËÌÍ ËÊ ËÊüËÊÊËËþÊËËþÍ.ÊþÍÉþÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉÊÉüÊÉÍ.ÉþÍÉñÈÉÈÉÈÈÉÈÉÈÉÉÈÉÈÈÉþÈÉÉüÈÉÈÉÉÈÉüÈÉÍûÇÈÈÇÈÈÇÈþÇÈÈþÇÈÈÇÈþÇÈÈþÇÈÈþÍ.ÇþÍ ÆûÇÆÇÇÆÆþÇÆÆþÇÆÆþÍ.ÆþÍ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕ,çýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæþçæ æþçæ æüçæçææþÍåþæååþæååæåûæåææååþæååöæåææååæååææýåÍüäåäååûäåäåääåþäååäåäåûäåäÍäã äþãääþãääãäüãäãääùãäãääÍ.ãþÍ.ãþÍâ÷ãâãâãââãââüãâãââãþâããýâãââãþÍúáâáâáââþáââþáââáâ÷áâáâááâáââòáââáâáâáââáâÍáùàááàáàááüàáàááþàááþàááàýáÍ.àþÍ.àþÍþàßßþàßßýàßààßàßàøßàßßàßàßßàßýàÍßþÞßßþÞßßþÞßßùÞßßÞßÞßßÞßÞßøÞßÞßÞßÍÞþÝÞÞûÝÞÝÝÞÞþÝÞÞþÝÞ ÞþÍ.ÝþÍþÝÜÜþÝÜ ÜÝÜÝöÜÝÜÜÝÝÜÜÝÜÜüÝÜÍ.ÜþÍüÜÛÛÜÜöÛÜÛÜÜÛÜÜÛÜÜÛ÷ÜÛÜÛÜÛÛÜÛÛþÜÛÛüÜÛÛÜÜþÍÛþÚÛÛþÚÛÛÚÛüÚÛÛÚÚÛþÚÛÛüÚÛÚÛÛþÍÚþÙÚÚþÍÙþÚÙÙüÚÙÚÙÙùÚÙÙÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÍØþÙØØòÙØÙØÙÙØØÙØÙÙØÙÙØûÙØÙÙØØöÙØÙØØÙØÙØÙÙýØÍ.ØþÍ Øþר ØþרØþרØüררØþÍ.×þÍÖþ×ÖÖô×Ö×Ö×ÖÖ××Ö×ÖÖþ×ÖÖü×Ö×ÖÖü×Ö×ÖÖþÍãÕÖÕÖÖÕÕÖÕÖÕÕÖÕÖÕÕÖÕÕÖÖÕÖÖÕÕÖÕÕÖýÕÖÕÕøÖÕÕÖÖÕÍþÕÔÔþÕÔÔýÕÔÕÕþÔÕÕöÔÕÕÔÕÕÔÕÔÕÕþÔÕÕþÔÕÕýÔÍ.ÔþÍ.ÔþÍÓüÔÓÔÓÓÔ÷ÓÔÓÔÔÓÓÔÓ ÓûÔÓÓÔÓÓþÍÒþÓÒÒüÓÒÓÒÒÓÒñÓÒÒÓÓÒÒÓÒÒÓÒÒÓÒÒûÓÒÒÍòÒÑÑÒÑÒÒÑÒÒÑÒÑÒÒÑÒÑøÒÑÒÒÑÒÒÑÑÒÑÒþÍ.ÑþÍ.ÑþÍÐþÑÐÐúÑÐÑÐÑÐÐþÍÏüÐÏÐÏÏÐÏÐÏÐÏÐÏþÐÏÏþÐÏÏúÐÏÐÏÍÎøÏÎÎÏÏÎÏÎÎýÏÎÏÏüÎÏÏÎÎÏüÎÏÎÏÏÎúÏÎÏÏÎÏÏþÍ ÎþÍÎÎüÍÎÍÎÎþÍÎ ÎÍ/Í/ÍþÍÌÌþÍÌÌþÍÌÌþÍÌÌþÍÌÌèÍÌÍÍÌÍÌÍÌÌÍÌÌÍÍÌÍÌÌÍÌÌÍþËÌÌøËÌÌËÌÌËÌÌûËÌÌËÌÌ÷ËÌÌËÌÌËËÌÌóËÌËËÌËÌËËÌÌÍËþÊËËøÊËÊËËÊÊËËþÊËËÊýËÊËËùÊËÊËËÍ.ÊþÍÉþÊÉÉùÊÉÉÊÉÊÉÉÊÉûÊÉÉÊÉÉþÊÉÉüÊÉÍ.ÉþÍýÉÈÉÉÈþÉÈÈÉþÈÉÉûÈÉÉÈÉÉüÈÉÈÉÉüÈÉÈÉÉÈþÍÈûÇÈÈÇÈÈÇÈúÇÈÇÈÇÈÈÇÈûÇÈÈÇÈÈþÍ.ÇþÍÆÇÆþÇÆ ÆÇÆûÇÆÆÇÆ ÆþÍ.ÆþÍ)ÿýùG,ÿþ-ÿþ.ÿ.ÿþG.ÿþù/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿþÍÆÆþÅÆ ÆþÅÆÆÅýÆÅÆÆúÅÆÅÆÆÅÅÆÅýÆÅÆÆþÅÆÆÅþÍÅÅþÄÅÅþÄÅÅþÄÅÅüÄÅÄÅÅýÄÅþÍÄ9ÄýÍÄÃÃþÄÃÃþÄÃÃÄÃþÄÃÃÄÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄòÍÂÃÃÂÂÃÂÃÃÂÃÃÂÂÃúÂÃÂÃÃÂÂÃþÂÃÃÂÃÂýÃÂÃÃÂöÃÂÃÂÃÂÃÂÃýÍÅÂ8ÂýÍÊÂÂþÁÂÂþÁ ÂþÁÂÂþÁÂÂÁÂüÁÂÁÂÂÁüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ3ÁþÇÍ5ÍïÍÆÆÅÆÆÅÆÆÅÅÆÅÆÅÅÆÆÅ ÆþÅÆÆúÅÆÅÆÅÆÆöÅÆÅÆÆÅÆÅÆÅÅþÍÅÅøÄÅÅÄÅÅÄÅÅûÄÅÅÄÅÅþÄÅÅþÄÅÅúÄÅÅÄÄÅÅþÄÅÅûÄÅÅÄþÍÄ9ÄýÍÄÃÃÄÃþÄÃÃûÄÃÃÄÃÃÄÃûÄÃÃÄÃÃûÄÃÃÄÃÃüÍÂÂÃÃÂýÃÂÃÃÂþÃÂÂöÃÂÃÂÂÃÂÂÃÂÂÃøÂÃÃÂÂÃÃÂÂöÃÂÃÂÂÃÃÂÃÂÂýÍÄÂ8ÂüÍÉÁÂÂÁýÂÁÂÂôÁÂÂÁÂÂÁÂÁÂÁÂÂþÁÂÂúÁÂÂÁÁÂÂÁÂüÁÂÂüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ)ÁþÀÁÁþÇÍ5ÍúÍÆÆÅÅÆÆöÅÆÅÆÅÅÆÅÅÆÆúÅÆÅÆÅÆ ÆÅüÆÅÅÆÆÅÆúÅÆÆÅÅþÍÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅ ÅþÄÅÅúÄÅÄÅÄÅÅüÍÄÃÄ7ÄýÍÃÄÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃõÍÂÃÃÂÃÂÃÂÃÂÂÃÂÃÂþÃÂÂÃüÂÃÃÂÂÃÂ÷ÃÂÂÃÂÂÃÃÂÂúÃÂÂÃÃýÍÄÂ8ÂýÍÊ ÂþÁÂÂÁ ÂþÁÂÂþÁÂÂÁÂþÁÂÂüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ3ÁþÇÍ5Í;ÿ;ÿ;ÿ;ÿ;ÿ;ÿþùÿ9ÿþGÿ9ÿ:ÿþÿ8ÿþÿ7ÿýGùÿ4ÿÆýÅÆÅÅäÆÅÅÆÆÅÆÆÅÅÆÅÅÆÅÅÆÆÅÆÅÆÆÅÆÆÅÆÆþÅÆÆÅÆûÅÆÆÅÆÆÅÆÅÄøÅÄÅÄÅÄÄÅÅüÄÅÄÅÅþÄÅÅùÄÅÅÄÅÅÄ>ÄÃþÄÃÃøÄÃÃÄÄÃÄà ÃþÄÃÃþÄà ÃþÄÃÃþÄÃÃÂýÃÂÃÃÂþÃÂÂàÃÂÃÂÃÂÃÂÂÃÃÂÃÃÂÃÂÂÃÃÂÃÃÂÃÃÂÃÃÂÂÃÃÂÃýÂÃÂDÂþÁÂÂþÁ ÂþÁÂÂûÁÂÂÁÂÂêÁÂÂÁÂÁÂÁÂÁÂÂÁÂÂÁÂÁÁÂÁÂÂþÁÂÂýÁÂÁ¿ÁþÀÁ=Á?ÍøÅÆÅÆÆÅÆÅÅùÆÅÅÆÅÅÆÆüÅÆÅÆÆûÅÆÅÅÆÆÅýÆÅÆÆÅðÆÅÆÅÆÆÅÆÆÅÅÆÆÅÆÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅÄ Å÷ÄÅÅÄÅÅÄÅÄ?ÄÃþÄÃÃþÄÃÃþÄÃÃøÄÃÄÄÃÃÄÃÃÄøÃÄÃÄÃÃÄà ÃþÄÃÃÂýÃÂÃÃÂüÃÂÃÂÂÃúÂÃÃÂÃÂÂþÃÂÂúÃÂÃÂÂÃÃïÂÃÂÂÃÂÃÂÂÃÂÃÂÃÂÂÃÃýÂÃÂCÂþÁÂÂþÁÂÂÁÂþÁÂÂþÁÂÂþÁ ÂûÁÂÂÁÂÂÁÂÁþÀÁàÁ?ÍþÅÆÆÅÆÅõÆÅÆÅÆÆÅÅÆÅÆÆðÅÆÅÅÆÆÅÅÆÅÆÆÅÆÅÆÆûÅÆÅÅÆÆöÅÆÆÅÅÆÆÅÆÅ ÅþÄÅÅøÄÅÅÄÅÅÄÅÅþÄÅÅþÄÅÅÄÅþÄÅÅþÄÅÅþÄÅÅ?Ä ÃÄ ÃÄûÃÄÃÄÃÃþÄÃÃÄÃüÄÃÄÃÃýÂÃÂÂûÃÂÂÃÂÂþÃÂÂÃÂÃÂÃÂÃûÂÃÂÃÂÂþÃÂÂúÃÂÂÃÃÂÂüÃÂÃÂCÂþÁÂÂþÁÂÂþÁÂÂþÁÂÂþÁÂÂûÁÂÁÁÂÂþÁÂÂÁþÀÁsÁþÀÁÁþÀÁ]Á?ÍÿýÅÆÅÅÆöÅÆÅÆÅÆÆÅÆÅÅÆþÅÆÆþÅÆÆøÅÆÆÅÆÆÅÆÆÅÆþÅÆÆÅÆÄÅûÄÅÄÄÅÅþÄÅÅþÄÅÅÄýÅÄÅÅþÄÅÅþÄÅ Å?ÄÃþÄÃÃÄýÃÄÃÃþÄÃÃþÄà ÃÂýÃÂÃÃÂÃÂÃÂðÃÂÃÂÃÂÂÃÂÂÃÃÂÃÃÂÂþÃÂÂþÃÂÂÃýÂÃÂÂþÃÂHÂþÁÂÂþÁÂÂþÁÂÂüÁÂÂÁÁÂýÁÂÁÁ?ÍøÆÅÆÅÅÆÆÅÅÆýÅÆÅÅÆüÅÆÅÆÆÅÆÅýÆÅÆÆüÅÆÆÅÅÆþÅÆÆþÄÅÅþÄÅÅÄ÷ÅÄÅÄÅÅÄÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅÄ ÅýÄÅÄ>ÄÃþÄÃÃþÄà ÃÄÃþÄÃÃþÄÃÃþÄÃÃÂÃÂøÃÂÃÂÂÃÃÂÂþÃÂÂüÃÂÃÂÂþÃÂÂÃþÂÃÃýÂÃÂÂöÃÂÂÃÃÂÂÃÃÂBÂûÁÂÂÁÂÂÁÂÁÂôÁÂÂÁÂÁÂÂÁÂÁÂÂûÁÂÁÁÂÂÁÂÁ?ÍÅÆæÅÆÅÅÆÅÆÆÅÅÆÆÅÆÆÅÆÆÅÆÆÅÅÆÅÆÆþÅÆÆþÅÆÆÅÆüÅÆÆÅÅ÷ÆÅÆÅÅÄÅÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅÄÅþÄÅÅ?ÄÃúÄÃÄÃÄà ÃþÄÃÃþÄà ÃþÄÃÃÄÃþÄÃÃùÄÃÄÃÃÄÂÂÃÂÃÂÃÂ÷ÃÂÃÂÃÃÂÃÂÂÃýÂÃÂÂþÃÂÂõÃÂÃÂÂÃÃÂÃÃÂÂþÃÂÂÃýÂÃÂ?ÂõÁÂÂÁÂÂÁÂÁÁÂÂþÁÂÂÁÂÁÂüÁÂÁÂÂþÁÂÂþÁÂÂûÁÂÂÁÂÂ÷ÁÂÁÂÂÁÂÂÁpÁþÀÁŒÁ?ÍÿÆûÅÆÅÆÅÅÆÅÆøÅÆÆÅÆÅÅÆÆÅþÆÅÅþÆÅÅÆëÅÆÆÅÆÅÅÆÅÆÅÆÅÅÆÅÅÄÅÄÅÅúÄÅÅÄÄÅÅþÄÅÅÄÅþÄÅÅ@Ä ÃþÄÃÃÄÃþÄÃÃþÄÃÃûÄÃÃÄÃÃÄÃÄüÃÄÄÃÃùÄÃÃÂÃÃÂÂýÃÂÃÃÂÃÂÃÂþÃÂÂýÃÂÃÃÂþÃÂÂöÃÂÂÃÂÂÃÂÃÂÂþÃÂPÂþÁÂÂôÁÂÁÁÂÁÂÁÂÂÁÂÂþÁÂÂþÁÂÂþÁÂÂêÁþÀÁ ÁþÀÁÁ?ÍÆýÅÆÅÅÆþÅÆÆÅÆÅÆûÅÆÆÅÆÆÅþÆÅÅÆûÅÆÆÅÆÆÅÆÅþÄÅÅûÄÅÅÄÅÅþÄÅÅÄÅþÄÅ ÅûÄÅÄÄÅÅÄùÅÄÄÅÅÄÅÅ?ÄÃþÄÃÃôÄÃÄÃÃÄÃÃÄÃÄÃÃþÄà ÃþÄÃÃüÄÃÄÃÃüÄÃÄÃÃþÄÃÃÂÃÂÃýÂÃÂÂùÃÂÂÃÂÃÂÂÃÂÃõÂÃÂÃÃÂÂÃÃÂÃÃÂÃýÂÃÂBÂÁÂþÁÂÂþÁÂÂüÁÂÁÂÂþÁÂÂþÁÂÂÁÂþÁÂÂúÁÂÂÁÁÂÂüÁÂÂÁÿÁ?ÍÆüÅÆÅÆÆÅÆøÅÆÅÆÅÆÅÆÆþÅÆÆùÅÆÅÅÆÅÆÆùÅÆÅÆÆÅÆÆûÅÆÅÅÆÆýÅÆÅÅüÄÅÄÅÅÄÅÄÅÄÅþÄÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅüÄÅÅÄ>ÄÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃÄÃøÄÃÃÂÃÂÃÂÂþÃÂÂþÃÂÂüÃÂÂÃÃÂÃýÂÃÂÂõÃÂÂÃÃÂÃÂÂÃÂÂÃþÂÃÃÂþÃÂTÂÁÂüÁÂÁÂÂþÁÂÂþÁÂÂþÁÂÂúÁÂÂÁÁ Â–ÁþÀÁgÁ?ÍÿÆþÅÆÆüÅÆÆÅÅÆÅÆýÅÆÅÅýÆÅÆÆÅÆÅüÆÅÅÆÆþÅÆÆÅÆÅþÄÅ ÅþÄÅÅ÷ÄÅÅÄÄÅÅÄÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅùÄÅÅÄÄÅÄ>ÄýÃÄà ÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄà ÃþÄÃÃõÂÃÃÂÃÂÃÃÂÃÂÂþÃÂÂüÃÂÃÂÂþÃÂÂ÷ÃÂÂÃÃÂÃÃÂÂÃûÂÃÂÃÂJÂÁýÂÁÂÂþÁÂÂþÁÂÂüÁÂÁÂÂþÁÂÂùÁÂÂÁÂÁÂÂôÁÂÁÂÂÁÂÁÂÂÀÁæÁþÀÁÁ?ÍýÆÅÆÆüÅÆÅÆÆÅÆÅøÆÅÅÆÅÆÅÆÆøÅÆÅÆÅÅÆÅÅÆüÅÆÅÆÆÅÆ÷ÅÆÆÅÆÅÅÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅ?ÄÃóÄÃÄÃÃÄÃÃÄÃÃÄÃÃüÄÃÄÃÃÄÃÄÃûÄÃÃÄÃÃÄÃþÄÃÃøÂÃÂÂÃÂÃÂÂüÃÂÃÂÂþÃÂÂÃöÂÃÂÂÃÂÃÂÂÃÃòÂÃÂÃÂÃÂÂÃÂÂÃÂÃÃÂÃýÂÃÂÂþÃÂWÂþÁÂÂþÁÂÂþÁÂÂÁ?ÍÅÆþÅÆÆþÅÆÆíÅÆÆÅÆÅÅÆÅÆÆÅÆÅÆÅÆÅÆÆþÅÆÆÅÆýÅÆÅÅÆÅÆýÅÆÅÅþÄÅÅþÄÅ ÅÄýÅÄÅ ÅûÄÅÄÄÅÅþÄÅÅÄÅ@ÄÃþÄÃÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃÄûÃÂÃÂÃÃÂþÃÂÂÃýÂÃÂÂûÃÂÂÃÂÂÃúÂÃÂÂÃÂÂþÃÂÂÃÂüÃÂÃÂBÂÁÂüÁÂÁÂÂÁÂþÁÂÂÁÂûÁÂÂÁÂÂþÁ ÂÁ?ÍÿýÆÅÆÆùÅÆÆÅÆÅÆÆÅÆúÅÆÆÅÅÆÆýÅÆÅÅÆÅúÆÅÆÅÅÆÆþÅÆÆþÅÆÆöÅÆÅÆÆÄÄÅÄÅÅþÄÅ ÅúÄÅÄÅÄÅÅùÄÅÅÄÅÄÅÅÄÅÄùÅÄÅÄÅÄÅÅüÄÅÅÄ?Ä ÃþÄÃÃÄÃÄÃþÄÃÃÄÃþÄÃÃÂÃÂÃÂþÃÂÂþÃÂÂýÃÂÃÃÂÃøÂÃÂÃÂÃÃÂÂüÃÂÃÂÂþÃÂÂþÃÂ@ÂûÁÂÂÁÂÂþÁÂÂþÁÂÂûÁÂÂÁÂÂúÁÂÂÁÁÂÂþÁÂÂþÁÂÂþÁÂÂÁÁþÀÁ<Á?ÍÅÆÅÆþÅÆÆÅòÆÅÅÆÆÅÆÅÆÅÆÅÆÅÅÆÅúÆÅÆÅÆÅÅÆþÅÆÆÅþÄÅÅþÄÅÅþÄÅÅøÄÅÅÄÄÅÄÅÅüÄÅÅÄÄÅþÄÅÅÄÅþÄÅÅÄþÃÄÄÃÄÃûÄÃÃÄÃÃüÄÃÄÃÃöÄÃÃÄÃÄÃÃÄÃÃøÄÃÃÄÃÃÄÃÃüÄÃÄÃÃÄÂÃúÂÃÃÂÃÂÂüÃÂÃÂÂþÃÂÂþÃÂÂÃÂÃÂñÃÂÃÂÂÃÂÂÃÂÂÃÂÃÂÂÃDÂþÁÂÂþÁÂÂÁ ÂþÁÂÂÁÂûÁÂÂÁÂÂ~ÁþÀÁ€Á?ÍÆÅüÆÅÅÆÆêÅÆÆÅÅÆÅÅÆÆÅÆÆÅÅÆÅÅÆÆÅÆÆÅÆþÅÆÆöÅÆÅÅÆÆÅÆÅÆÆýÅÄÅÅþÄÅÅþÄÅ ÅöÄÅÄÅÄÅÅÄÄÅÅÄÅþÄÅÅ2ÄþÃÄ ÄÃþÄÃÃüÄÃÄÃÃúÄÃÃÄÄÃÃüÄÃÄÃÃÄÃþÄà ÃüÄÃÄÃÃþÂÃÃÂÃþÂÃÃùÂÃÃÂÃÂÃÃþÂÃÃÂüÃÂÂÃÃÂÃÂüÃÂÂÃÃAÂÁýÂÁ ÂûÁÂÁÁÂÂþÁÂÂùÁÂÂÁÂÁÂÂÁ ÂþÁÂÂþÁÂÂÁ?ÍÿøÆÅÅÆÆÅÅÆÆÅÆþÅÆÆûÅÆÆÅÆÆûÅÆÅÆÅÅþÆÅÅøÆÅÆÆÅÆÅÆÆÅñÆÅÆÆÅÆÆÅÆÅÅÄÅÄÅ ÅþÄÅÅÄÅûÄÅÅÄÅÅþÄÅÅüÄÅÄÅÅÄþÅÄ>ÄÃüÄÃÄà ÃüÄÃÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃ÷ÄÃÄÃÄÄÃÄÃÃþÄÃÃüÂÃÂÃÃÂÃýÂÃÂÂøÃÂÂÃÂÂÃÂÂÃþÂÃÃÂÃýÂÃÂÂÃÂÃFÂþÁÂÂþÁÂÂþÁÂÂ÷ÁÂÂÁÁÂÁÁÂÂüÁÂÁÂÂÁÂþÁÂÂþÁÂÂÁ?ÍûÅÆÆÅÆÆÅÆøÅÆÅÆÆÅÅÆÆÅÆÅÆùÅÆÅÆÅÅÆÆùÅÆÅÅÆÅÆÆ÷ÅÆÅÅÆÅÆÄÅÅûÄÅÄÄÅÅþÄÅÅþÄÅÅüÄÅÄÅÅûÄÅÅÄÅÅÄÅýÄÅÄ+ÄþÃÄÄÃþÄÃÃþÄÃÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃÄÃÂþÃÂÂùÃÂÂÃÂÃÂÂõÃÂÂÃÂÂÃÂÂÃÂÂÃþÂÃÃÂÃÂÃûÂÃÂÃÂ@ÂþÁÂÂþÁÂÂòÁÂÁÁÂÂÁÁÂÂÁÂÁÂÂþÁÂÂïÁÂÁÂÁÂÁÂÂÁÁÂÁÂÂÁÂÂûÁÂÂÁÂÂÁþÀÁúÁ?ÍÆùÅÆÅÅÆÅÆÆÅÆøÅÆÅÆÆÅÅÆÆÅ÷ÆÅÆÅÅÆÅÆÅÅøÆÅÆÅÆÆÅÆÆþÅÆÆÅÆøÄÅÄÅÄÅÄÅÅüÄÅÄÅÅþÄÅÅþÄÅÅþÄÅÅôÄÅÅÄÄÅÄÅÅÄÅÄ>ÄÃþÄÃÃûÄÃÃÄÃÃþÄÃÃþÄà ÃúÄÃÄÃÄÃÃþÄÃÃúÄÃÄÃÃÂÂ÷ÃÂÂÃÂÂÃÃÂÂÃÂÃÂùÃÂÃÂÂÃÂÂþÃÂÂþÃÂÂÃôÂÃÂÃÂÃÂÂÃÂÃÂEÂûÁÂÂÁÂÂþÁÂÂúÁÂÂÁÁÂÂüÁÂÁÂÂþÁÂÂüÁÂÂÁnÁþÀÁÁ?ÍÿþÅÆÆÅùÆÅÅÆÆÅÆÆüÅÆÆÅÅÆþÅÆÆþÅÆÆúÅÆÅÅÍÄÅÄÅùÄÅÅÄÅÄÅ ÅÄÅüÄÅÍ.ÄþÍÃüÄÃÄÃÃþÄÃÃûÄÃÄÄÃÃÄÃþÄÃÃûÄÃÃÍÂÃÂþÃÂÂþÃÂÂüÃÂÃÂÂýÃÂÃÃÂÃÂÃøÂÃÂÃÂÃÍ-ÂýÄÍÂüÁÂÁ ÂþÁÂÂüÁÂÁÂÂýÊÍ,ÁüÂÍÇ,ÁÎ*ÁûÂÎÍÕ(ÁúÃÉÍÎÕ*ÍþÇýÅÆÅÅûÆÅÆÅÆÆüÅÆÅÆÆÅüÆÅÆÅÅþÆÅÅÆýÅÍôÅÄÄÅÅÄÅÄÅÅÄÅÅþÄÅÅÄýÅÄÅÅöÄÅÄÅÅÄÅÅÄÅÅþÍ.ÄþÍýÃÄÃÃþÄÃÃþÄÃÃûÄÃÃÄÃÃÄÃþÍõÂÃÂÂÃÂÂÃÂÂÃÃüÂÃÃÂÂùÃÂÂÃÂÃÂÂþÃÂÂþÃÂÂÃûÂÃÃÍ-ÂýÅÍÂüÁÂÁÂÂûÁÂÂÁÂÂþÁÂÂýÊÍ,ÁüÂÍÇ,ÁÎÁþÀÁ!ÁûÂÎÍÕ(ÁúÃÉÍÎÕ*ÍþÇóÆÅÆÅÆÆÅÆÅÆÆÅÆÆÅðÆÅÆÅÆÅÅÆÅÆÅÆÅÅÆÅÅÆÅøÆÅÆÆÅÅÍÅÄüÅÄÅÄÄÅþÄÅÅüÄÅÄÅÅöÄÅÄÅÅÄÅÅÄÅÅýÄÍ.ÄþÍÃþÄÃÃþÄÃÃÄ ÃþÄÃÃûÄÃÃÄÃÃþÍÂþÃÂÂÃÂüÃÂÂÃÃÂÃÂüÃÂÃÂÂþÃÂÂúÃÂÂÃÍ-ÂýÅÍûÂÁÁÂÁÁ÷ÂÁÂÁÂÁÂÁÂÂþÁÂÂüÁÂÁÂÂûÁÂÂÁÂÂþÁÂÂýÊÍ ÁþÀÁÁüÂÍÇÁþÀÁÁþÀÁÁÎ*ÁûÂÎÍÕÁþÀÁÁúÃÉÍÎÕ*ÍþÇ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ.ÿþù.ÿþG.ÿ-ÿþ,ÿþ)ÿýùG€€€€,(–K %stem-1.7.1/docs/_static/buttons/resources/change_log.xcf0000664000175000017500000020263413157571677024122 0ustar atagaratagar00000000000000gimp xcf fileôPBœBœTBgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) gamma0.45454999804496765±”Eþ> Change Logÿ     g 'Ggimp-text-layer+(text "Change Log") (font "FreeSerif") (font-size 50.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 277.000000) (box-height 62.000000) (box-unit pixels) §>Çp|ˆ>ç <E`€€€§þ#ô"k¦¼¿œxU1ý—rû!rÉ× ü‚×ÿ ÿóÞ˜V9ˆÿ™>‰ÕÿÿþØüuîÿÿöð½ˆSEm–Áþÿÿú£hÖóÿÿþØýÎÿÿüÂ*ý7Èÿÿþ­ý ¾ÿÿþØý5æÿÿý•üaûÿÿþ·þlÿÿþØý.ôÿÿýøb þnÿÿþÂþYÿÿþØýÝÿÿþQûžÿÿÌþXÿÿþØþ¹ÿÿþÈû×ÿÖþXÿÿþØþMÿÿþFüjÿáþXÿÿþØþÌÿÿþÃü òëþXÿÿþØþJÿÿþ@ý“õþXÿÿþØþÿÿþðý!~þXÿÿþØ÷Q‘ÒïÁ‘ úeâÿÿþÎþXÿÿúØjøÿÿýêCù|êÿ'ÿÿþ­þXÿÿ÷ØšÿÿïÂìÿÿýöø¦ÿÿwUÿÿþ‹þXÿÿõ؆ÿ7lüÿÿþøÿÿüjÿÿþiþXÿÿüûüoþ•ÿÿþêþåÿÿü ÿÿþGþXÿÿý÷Kþ,ÿÿþþÿÿü$‘ÿÿþ;þXÿÿþØýüÿÿþ.øÒÿÿ͉ÿÿþLþXÿÿþØþåÿÿþJø!Žˆuÿÿþ^þXÿÿþØþØÿÿþX þaÿÿþpþXÿÿþØþØÿÿþX þDÿÿþ‘þXÿÿþØþØÿÿþX ý ùÿÿþÏþXÿÿþØþØÿÿþXú=¾ÁÿÿýýþXÿÿþØþØÿÿþXø ÿýyÿÿþPþXÿÿþØþØÿÿþXöÒÿÿ~óÿÿþ½þXÿÿþØþØÿÿþXùÎÿÿÄþˆÿÿþ6þXÿÿþØþØÿÿþXþzÿÿþzýìÿÿý½ýI þXÿÿþØþØÿÿþXþéÿÿþJýDüÿÿþû‚ÿcþXÿÿþØþØÿÿþXþÿÿþ€þsÿÿý„ û­ÿ‰þbÿÿþâþãÿÿþ`þÿÿþ×ýyýÿÿýÚG úmîÿ‘þrÿÿþôþöÿÿþnþìÿÿþMýNòÿÿü­1ù%{ÚÿícþŸÿÿþ)þ/ÿÿþ›þ¢ÿÿþüü ŸüÿÿøüØ®‰˜´Öÿÿý üZôÿÿý¿'ý%Ãÿÿøó_ìÿÿ ü&–ßÿÿüÒ~(ýq÷ÿÿúç11åÿÿùõF(Çÿÿ õ&e€•ª§ŽtZ&#û7ecÿ€€€€÷©ÉéóÏ«~ ðG›è H‰ËðÁ‰ öQ“ÂïÞ®~M öË‚C[ªÿÿàAûM¡ïÿÿû !ÃÿÿýÙ*ñ³ÿÞ‘u¤úÿÿó¼aXXþ,ú}ÿÿùü(íúÿÿø AïÿòÎõÿÿýÝú8ïÿÁý.îÿÿþ€úíÿÿŽý£ÿÿögù´7þÿÿþbú ÛÿÿSþeÿÿþÀ˜˜þLúÅÿÿôþ$ÿÿýþuþ¬ÿÿþÍú˜ÿÿûýÁÿÿþŒ þªÿÿþ þ ÿÿþgþDÿÿþòú ýÿÿÂþRÿÿþÆ þ¨ÿÿþ=ÿþ4þÿÿþþ;ÿÿþŸùýÿÿø þ¨ÿÿþYÿþ4þÿÿþ/þlÿÿþºþÏÿÿþ8þ üCÖÿÿþhÿþ4ÿþ4þ€ÿÿþÖþ¬ÿÿþ*÷2yÞëâÿÿþhÿþ4ÿþ4þbÿÿýôú–ÿÿ÷÷X8¦úÎa¨ÿÿþhÿþ4ÿþ4þ-ÿÿþ\ûÆÿÿÊû}ÿ×Bþ¨ÿÿþhÿþ4ÿþ4þ¼ÿÿþÆúýÿÿOü¢‚þ¨ÿÿþhÿþ4ÿþ4ý$æÿÿþnû`ÿÿ›þµþ¨ÿÿþhÿþ4ÿþ4ý(Öÿÿöu 6âÿ´ þ–þ¨ÿÿþhÿþ4ÿþ4ô{þÿÿúÆÛþèWþsþ¨ÿÿþhÿþ4ÿþ4õ–ósdy„^/þQþ¨ÿÿþhÿþ4ÿþ4û Ï!þ-þÂÿÿþhÿþ4ÿþ4û¦þ1þýîÿÿþrþÿÿþ4þ ÿÿþ4û‘ÿØûLÝúÿÿ÷”ÿÿþ9þÿÿþAóøÿÿÃ|Y7( ø t•×ùw{ÿÿ÷øšöAÿÿþ‚þVÿÿþfþ:ÿ ÿùùíТfÿûÑ.=ÿÿú„Æÿÿýâ.ý,ØÿÿýÜ1ýÈÿ ÿý×8ûÿ×~õ¦ýÿÿûcÜþÿÿúèeâÿÿýæ1üvõÿ ÿýêþûjJñiã2Aeˆœ¥®·ÁÍÙíÿÿþ£*ûœü= û#}úÜ)û­ÿ‡ üú(û–ÿÿ% ýuÆ(ú2þÿø ýÈ„(þ|ÿÿþG üsæ(þpÿÿýìF û§ô3)ýüÿÿðþÂp/'=qÇþåG+ýKòÿÿýþúÿÿüò| -ü*²ûÿÿüû”1ôr¢¾ÙÖ¯ˆa:‰€€€áþ  þ/ý[ùÿ ÿýý¡0û&‹ùÿÿûú•.4þÿÿþ”7þ9ÿÿþ:7þ ÿÿþ 7þ ÿÿþ 7þ ÿÿþ 7þ ÿÿþ 7þ ÿÿþ 7þ ÿÿþ öZŽÁñݱ†*þ ÿÿþ ùcöÿîÙúÿÿüøuþ ÿÿþ õ ¡ÿ©Oçÿÿþ°þ ÿÿþ ûÑÿ‰ý-ýÿÿþSþ ÿÿþ ûuÿÞ þ¥ÿÿýâ þ ÿÿþ ûðÿwþRÿÿþdþ ÿÿþ û”ÿÿ7þÿÿþ¡þ ÿÿþ ûûÿþxttþóÿÿþÝþ ÿÿþ ÿþþ ÿÿþ ÿþì( (þ þ ÿÿþ ÿþþ ÿÿþ ÿþ6þ ÿÿþ ÿþ_þ ÿÿþ ÿþ‡þ ÿÿþ ÿþ¶ þþ ÿÿþ üX‘ÿÿýû ü(å þ ÿÿþ ûÜ’ÿÿþ‘ üÑ‚þ ÿÿþ ú]ÿKÏÿÿýþIû«îþÿÿþ ùèù Iÿÿü÷uû¼ÿuþ#ÿÿþ ûÓÿ¾þÂÿÿôÈW)2‡ðÿ¡þ=ÿÿþF ù`èÿÿwý2íÿÿþüÿÿý°þœÿÿüÄ,ù(Ræÿÿþ0ýÈÿÿüú“ûA£ýÿÿþüôôþýÿÿýèüŒæÿÿüþ«%þfÿÿþ£ùJt[2 3€€€‡ôBr¡ÐôСrB öQ“ÂïÞ®~M ÷%Èÿï¶}˜àÿÿýÂ" ñ³ÿÞ‘u¤úÿÿó¼aXXþ,úgôÿ¾ù1åÿÿófú8ïÿÁý.îÿÿþ€ú–ÿÿ±ý*ìÿÿþú ÛÿÿSþeÿÿþÀ˜˜þLú=þÿû"ù3ùÿÿþ:ú˜ÿÿûýÁÿÿþŒúÔÿÿ¡þ©ÿÿýÖú ýÿÿÂþRÿÿþÆþvÿÿþMþBÿÿþ€þ;ÿÿþŸùýÿÿøþÜÿÿþ,ýÚÿÿþÖþlÿÿþºþÏÿÿþ8ýýÿÿþ þ‚ÿÿýûþ€ÿÿþÖþ¬ÿÿþ*þ0ÿÿþû þaÿÿþ/þbÿÿýôú–ÿÿ÷þZÿÿþ þFÿÿþ\þ-ÿÿþ\ûÆÿÿÊþ€ÿÿþ+ þ+ÿÿþsþ¼ÿÿþÆúýÿÿOþjÿÿþE þÿÿþKý$æÿÿþnû`ÿÿ›þ>ÿÿþ^ þ ÿÿþ!ý(Öÿÿöu 6âÿ´ þÿÿþŒ þ(ÿÿýôô{þÿÿúÆÛþèWþèÿÿýâþCÿÿþËõ–ósdy„^/þ£ÿÿþ>þ_ÿÿþoû Ï!ýñÿÿþ˜ú¯ÿÿÏû¦þ1!þmÿÿýïúüÿþ8û‘ÿØ!ýÌÿÿýÈûÿÿšóøÿÿÃ|Y7(ýÆÿÿþútÿÿ–þ:ÿ ÿùùíТfñƒýÿÿ¼e C˜ÿîRýÈÿ ÿý×8ô=¼îÿÿüûÿߦüvõÿ ÿýêú!TrG ñiã2Aeˆœ¥®·ÁÍÙíÿÿþ£*ûœü= û#}úÜ)û­ÿ‡ üú(û–ÿÿ% ýuÆ(ú2þÿø ýÈ„(þ|ÿÿþG üsæ(þpÿÿýìF û§ô3)ýüÿÿðþÂp/'=qÇþåG+ýKòÿÿýþúÿÿüò| -ü*²ûÿÿüû”1ôr¢¾ÙÖ¯ˆa:—ŠE"XPIconÿ     7=XPaEÎEÚEæEòXP½, =þ>>>.>>>N>^>n>~BENE^EnE~EŽEžE®E¾Úý»À Â¿¼ ¹¼¿üÀ¿¿ÀÀþÁÂÂûÿ¿ÁÕØØþÛÞÞþÜûÿ¾Äéïïþòööýõëû¿ÃçïïýñõööýëîûÀÃåïïýñõööüõâöúÿ¿Áãïïýðõööüîßûú¾Àáïïþõööäþþú!;¿ÀßïïþôööûõÜëÿ÷($0@¾ÀÝïïþôööûòÙðÿ÷:KG@B¿¿ÝïïþóööûðÚôÿ÷3LXKCÀ¿ÜïïþóööûïÞ÷ÿ÷2M]NC¾¿Üïïþóööúõíâùÿ÷.JSKE½ÀÜïïþóööúõîçúÿ÷-IOJE¼ÀÜïïþóööúõñíûþ÷,HKGE»¾Ûïïþòööúõóñôó÷)FGFDµ¾Ûîîþñööüõôò÷%ECF¶¾Úîîýñõööþõ÷$ECG¶¿Ûííþñõõ÷ CD¶ÀÛììþðôô÷AE·¿Üììþðôô÷@EµÀÜëëþðôôý@ü¸ÁÝëëþðôôýAü¶ÀÞëëþðóó÷A$¸Àßëëþïòòþû¶Áßêêýëïññþû¸ÂàêêþîññþûºÂáêêþîññþûºÂâééýêïððþû¸Âáèèýéîïïþû»Ãâèèýéîïïþû3»Ããççþéïïþû3ºÃãççþéïïþ!û3»Ããææþéîîþ.û3»Äâææþèîîþ>û.¼ÃãææþéîîþEû.¼ÄãææýéîííþéþCû3½ÄãææýéíììüêǘýAû3»Åâååýèíëëü§[SýDû3¼ÅáääýèìëëûÉ^kŸö&LP8½Æáääýéìëëúæ[œ²ö/QOL¼Æáããýèìëëùê¸R}¯²ö,RO\¼Æàããýéìëëúèåçèêë ëùÙyc§²²ö+PTvu½ÆàââíèëêéÓŸ†¡°ÀÊÑÕÙÞäèééêøç™Lб²²õ5Pap¾ÇßââãèëçŸ^MXWQLPUZ]afjqz…—ª¼Ë«[y°²²õ CQnrˆ½Çàââäèê­Ta„•–’Œ†‚€}xtoje`ZURWPm§²²õNRuvS™½ÆßááåçÔk\„’”–˜š›žŸ¡¡¢£¤¥¥ž”І£²²þ©õQRttSf½ÅÞááåå¨Nq…‡‰ŒŠ†‡‹Ž“šœž ¢¥§¨ª¬®°±±ý²¥õNTrkSª½ÂÝàààÙyUy}‚pVS[biu{‡•™Ÿ¡£¥§©«¬®°±õ"MWu]Tª½ÂÜàààÌ]\suwyc[blyy}|uou|†™›ž ¢¤¥§ª¬õ3PZTT½ÂÛààà¼R]kmoe.F]`]W;]€†‰„xrk`bgox|€„‡õBS[…PT¾ÁÙààà³P]efhhFXdbYD-Qiy„…‡†‡‰†|wxxyõFT]‚RSÿ¾ÁØààï³P\ddeebYMFBHWhehhógfgs}‚ŠŽ‘“•õAZs‰hd¿¿Ößßõ¹QYd_UMLIC??íADFKQTVY[`adhlz„‰ô @Uryouz»¾ÒÞÞàÈ_Sec\QKJNTY]aefgilnpqsvtonjeioóHUZVTSSÁ½ÏÝÞÞûÖ}Lce eófhiknprtvxrló9<58BNHº¼ËÜÝÝúÞ±QUcee÷fghjlnpsuÚý»À Â¿¼ ¹¼¿üÀ¿¿ÀÀþÁÂÂûÿ¿ÁÕØØþÛÞÞþÜûÿ¾Äéïïþòööýõëû¿ÃçïïýñõööýëîûÀÃåïïýñõööüõâöú,ÿ¿Áãïïýðõööüîßûú7¾ÀáïïþõööäþþúQ¿ÀßïïþôööûõÜëÿ÷7HAi“¾ÀÝïïþôööûòÙðÿ÷gw|—¿¿ÝïïþóööûðÚôÿ÷Z‚†ˆ˜À¿ÜïïþóööûïÞ÷ÿ÷W‚‰˜¾¿Üïïþóööúõíâùÿ÷Rƒ‘™½ÀÜïïþóööúõîçúÿ÷N~•š¼ÀÜïïþóööúõñíûþ÷L|}—š»¾Ûïïþòööúõóñôó÷Hzz—™µ¾Ûîîþñööüõôò÷Ewz—¶¾Úîîýñõööþõ÷@v™¶¿Ûííþñõõ÷8r†¶ÀÛììþðôô÷3p‰·¿Üììþðôô÷1oŒµÀÜëëþðôôý/pü¸ÁÝëëþðôôý.tü¶ÀÞëëþðóó÷,w$¸Àßëëþïòòþ(û¶Áßêêýëïññþ$û¸Âàêêþîññþ$ûºÂáêêþîññþ+ûºÂâééýêïððþ/û¸Âáèèýéîïïþ1û»Ãâèèýéîïïþ3û3»Ããççþéïïþ3û3ºÃãççþéïïþEû3»Ããææþéîîþcû3»Äâææþèîîþû.¼Ããææþéîîþû.¼ÄãææýéîííþèþŒû3½ÄãææýéíììüéÀˆý‡û3»Åâååýèíëëüš?0ý0û3¼ÅáääýèìëëûÁBCmöS›¤8½Æáääýéìëëúå{6k~öd¤£L¼Æáããýèìëëùê­3R{~ö]§£\¼Æàããýéìëëúèäæèêë ëùÖc:72171Et~~õ,Ÿ¥¸¸¦™½ÆßááåçÏR5V^`bdfgiklmnoqqrrld]Yq~~þvõ%¤¦·¸¦f½ÅÞááååš-EUWZ[[XY\_bgjkmoqstvyz|}}ý~sõ+ž¦¶³¦ª½ÂÝààà×b0LOQSSH76;@EMRZdgjlnpqsvwyz|}õE›¨¸¬§ª½ÂÜàààÇB5GIJL?9>ENTORQLIMRZgijmnprtvxõl ª¾§§½ÂÛààà´46ABD?+:<:7%?*6>=7*3BLRTWXWXZXUROPQQõ©«¿¦¦ÿ¾ÁØàààª26<<==;6.)(,6@?@ABAABJQTZ\]_acõ„«·Ã±¯¿¿Ößßõ±34<83.-,(%%í')+-23589<=@BFOVY\ô‚§¶»µ¸»»¾ÒÞÞàÃD/=<70-,.268:==>@ACEFHJIFEB@CHó=‘ª­ª§¦¦Á½ÏÝÞÞûÔg);= =ó>??ACDGIJKHDóswjm{ƒƒº¼ËÜÝÝúÞ¥20;==ø>?ABCEGHÚý»À Â¿¼ ¹¼¿üÀ¿¿ÀÀþÁÂÂûÿ¿ÁÕØØþÛÞÞþÜûÿ¾Äéïïþòööýõëû¿ÃçïïýñõööýëîúÀÃåïïýñõööüõâöúRÿ¿Áãïïýðõööüîßûú]¾Àáïïþõööäþþú‹ñ¿ÀßïïþôööûõÜëÿ÷Xm`®ú¾ÀÝïïþôööûòÙðÿ÷š¾®Åÿ¿¿ÝïïþóööûðÚôÿ÷ˆÁ·ÌÿÀ¿ÜïïþóööûïÞ÷ÿ÷‚¾¸Ôÿ¾¿Üïïþóööúõíâùÿ÷{¼·àÿ½ÀÜïïþóööúõîçúÿ÷w¹·ìÿ¼ÀÜïïþóööúõñíûþ÷q·´óÿ»¾Ûïïþòööúõóñôó÷l´²ôÿµ¾Ûîîþñööüõôò÷d°¸ö¶¾Úîîýñõööþõ÷b®Åø¶¿Ûííþñõõ÷UªÒ¶ÀÛììþðôô÷K¥Ø·¿Üììþðôô÷J£ÛµÀÜëëþðôôýF¦ü¸ÁÝëëþðôôýE®ü¶ÀÞëëþðóó÷@¶$¸Àßëëþïòòþ9û¶Áßêêýëïññþ5û¸Âàêêþîññþ9ûºÂáêêþîññþBûºÂâééýêïððþHû¸ÂáèèýéîïïþLû»ÃâèèýéîïïþKû3»ÃãççþéïïþNû3ºÃãççþéïïþlû3»Ããææþéîîþ›û3»ÄâææþèîîþÈû.¼ÃãææþéîîþØû.¼ÄãææýéîííþèþÏû3½Äãææýéíììüé»}ýÍû3»Åâååýèíëëü’-ýKÚû3¼Åáääýèìëëû¼1 6öðÿ8½Æáääýéìëëúäp5@ö”ûÿL¼Æáããýèìëëùê¦ (>@ö‡ûÿ\¼Æàããýéìëëúèãåèêë ëùÓV:@@ö‰úþýu½ÆàââìèëêèʇdqŠŸ±½ÆÎÔÛâçèéé÷êæ~-?@@õ§úþý¾Çßââãèëæ†1#+27>DLVcz–®Á•)&?@@õ5Õüýýˆ½Çàââäèê˜$&-.,+(''&$"!#!;@@õBïÿýýÿ™½ÆßááåçÌC$(*+-./023455689961-,8@@þ;õ8ðÿýýÿf½ÅÞááåå‘"#%&'&')+-/1235689:<=>??ý@:õEìÿýþÿª½ÂÝàààÕT !"$(-/134568:;<=>?õníþýþÿª½ÂÜàààÄ0" ""!"%).0134678:;õ¦õþýþÿ½ÂÛààà¯! "#%$! !%'(*,õËýþüþÿ¾ÁÙààü¢ë   !#$$%&&%$$%õÌÿþüþÿÿ¾ÁØàà࣠!#&'()+,ôÂþýüýþ¿¿Ößßଠ  #%'ý%Çþþýü»¾ÒÞÞñÀ2 ñûYÚÿþÿÿûÁ½ÏÝÞÞûÒZöó*ª®›ŸµºÁº¼ËÜÝÝúÞžù®ý"9; ;<= >=<ýJÄå åæüýÿ#ÿüžýÿ#ÿüüÿ#ÿü‚ûÿ#ÿütúÿ#ÿügúÿ#ÿýXùÿ#ÿýKøÿ#ÿýDøÿ#ÿýAøÿ#ÿý?øÿ#ÿý>÷ÿ#ÿý=÷ÿ#ÿý<÷ÿ#ÿý;÷ÿ#ÿü<÷ÿ#ÿüCøÿ#ÿûJøÿ#ÿûRùÿ#ÿûZùÿ#ÿúaùÿ#ÿúiúÿ#ÿúpúÿ#ÿùxûÿ#ÿùûÿ#ÿù †ûÿ#ÿù üÿ#ÿù •üÿ#ÿù ›üÿ#ÿù ¢ýÿ#ÿù §ýÿ#ÿù ªýÿ#ÿù ­ýÿ#ÿù °þÿ#ÿù ³þÿ#ÿù ¶þÿ#ÿù ºþÿ#ÿù ¼þÿ#ÿú ¿þÿ#ÿû Áÿ$ÿû Ãÿ$ÿü Äÿ$ÿüÅÿ$ÿüÇÿ$ÿý Ãÿ$ÿüºþÿ#ÿü¯þÿ#ÿü£ýÿ#ÿü—üÿ#ÿüŠüÿ#ÿü{ûÿ#ÿüdúÿ#ÿýH÷ÿ#ÿý2íÿ#ÿý%Ûÿ#ÿÀü¼º;øÁÀ¾À¿º7öÚÓÃÀÀ¹¾À¿5õöüéÕÁ¿½ÀÀ¹4ôþÿþúâËÀ¿™¿½ù*#ù²±ˆOŒßêêûèɽiûƒYR:#ú²˜W~Öêêûèɾoú…ZR;"ù¢feÂãçêêûèɾwùQ‡ZSC"ïqCVx‰‘›¥°¹Äλ°föwQˆZSG"ã‚wrmga\ZXVVX[\\A>>?=Q‰ZSF"±å°®«©¦¤¢ž˜„zpdXMFB>9?=SE-"û®¯°±²²ñº¾½¶¢yG?5B>9G="÷Š’’˜§±±²²ï¹ÈØÆ¿ÐÜÓ“L?G?5@"þy{{æ~|Ц®°±ºÐÙ§’ŠªÎÛÒ€C>“L?!â—š›Ÿœœ¥§©°ËÑž•œÂÏ·Ú±O?€C>2!â‘“•˜šœžŸ¢µÓ­š™‡”£¨¢ÄÇ]@>±O?@!â{‡Š’”–˜šºÓž«“–¦•¤¥Ëd@Ç]@<!áe`gr~ŠŒŽ”¸ÐŸ˜‡Ÿ…’‡´›·V?@Ëd@ áwxogceu†ˆŒ²Ì¤œž¼§›–¿L>@V?8 Àü¼º;øÁÀ¾À¿º7öÚÓÃÀÀ¹¾À¿5õöüéÕÁ¿½ÀÀ¹4ôþÿþúâËÀ¿™¿½ù$Fm…Ž*ÿîýîÔÀ½¶À¿™lho|†ŽŒm)ÿïþ÷ÝÄ¿½À½¶„……’’„R)ÿëüãÅ¿¼Ä¿½”—˜”‰wz…‰’#ÿ÷ýáÿªÅ¿¼••–—û–Ÿ™…#ÿíüÞÁ¿áÿª²¯¬ª¨¥©·™|# ÿîúÛÀ½Á¿¬¬­­®¯µÃ {# ÿ÷÷Ô¿½ÛÀ½§§û­·˜{# ÿ÷þîǾªÔ¿½§§û­·™{#ÿþ÷üÛ¿¸îǾª§§û¬·š|#ëüù÷õòîìëêéêìîÞÀ»ªÛ¿¸§§û¬·š~#ëïëèæäâáßÞÜÛÙ×Ó»¸ÞÀ»§§û¬·›€#ûñïîíììòëêéçåâÙÁ»Ó»§§û¬·œ€# õôñæÁ»ÙÁ»§§¬¶œ‚# õñçÀ·Á»§§¬µž…# ôñåÀ·À·§¬´ž†# ôûóãÀ³÷·§¬³ž‡# ôûóâÀ³÷³§­²Ÿ‰# ôûóàÀ®þ³û®± ‰# óüÞÀ­û¯± ‰# òûñÜ¿¨û¯±¡‰# ñüÛÀ§ü°¢‹# ñûðÙ¿ ü°¢‹# ñûð׿¡ü¯£‹# ðûïÖÀ™ý£‹# ïûîÔ¿•ý£‹# ïûíÓ¿‰ý¤‹# ïûíÒ¿‡ý¤‹# ïûíоvý¤‹# îûíϽjý¥‹# îûì;hý¥‹# îûì̽aý¥‹#úäãâçìííûë˼fý¦#ùfXXy±åììûêʼYý¦Œ#ø=DB65ˆåëëûêʼYý¦‹#ø{||uO7¤ëëûéʽ]ý¦‰#~ûk1sãëëûéʽ]ü©¦‡#~ûxL>¦ëëûéʽcü©¦„#~ú|T4‘çëëûéʽiû¿©§#ù~}Z-zÝêêûèɽiûÀª§v#ú~g2iÒêêûèɾoúÁ©¦t"ùp?Kºâçêêûèɾwù¥Âª¦,"ïH"9cmv€Š–£¯½É¸¬Qöw¥Âª¦†3"ãVMHD?:765679>AB"¥Â©¦ƒ7"}å|zxvtrpnh_WOG>4,%!¦‚O"ûz{|}~~ñ—œ–€T& !„i"÷_cefku}}~~¾°ª¹Ä¶r*& m"âRSTTVU_tz|}Œ°Á”y•¸Ä¶]"r*%!âeghjljkrtuªº‹ŒƒŠ¬¸¢Ã’.]"X!â_`acfgiklnŒº™‰ˆw‚•®«< ’.s!âPXZ]^`cdei–¼Œ˜}‚„“ƒ‘’°A «< i!á@=BIQZ\]_d—¹‡vŒuv ‰œ5 °A , áJLFA?@KWX\‘¶‘ˆ‹§”ˆ„ª~* 5a8 Àü¼º;øÁÀ¾À¿º7öÚÓÃÀÀ¹¾À¿5õöüéÕÁ¿½ÀÀ¹4ëþÿþúâËÀ¿™¿½6cÇÖÄ*ÿîýîÔÀ½¶À¿™ œ§·ÉÔÒ¢)ÿöþ÷ÝÄ¿½À½¶ÄÄûÆÅÅ{)ÿëüãÅ¿¼Ä¿½äãâÞÙÄÉÑÕÜèÁ#ÿ÷ýáÿªÅ¿¼ÿÿüþÿÒ#ÿ÷üÞÁ¿áÿªýýþýýþÈ# ÿøúÛÀ½Á¿þþûýüþÃ# ÿ÷÷Ô¿½ÛÀ½ÿÿþüýþÃ# ÿ÷þîǾªÔ¿½ÿÿûþýÿÃ#ÿþ÷üÛ¿¸îǾªÿÿûþýÿÃ#ëüù÷õòîìëêéêìîÞÀ»ªÛ¿¸ÿÿûþýÿÅ#ëïëèæäâáßÞÜÛÙ×Ó»¸ÞÀ»ÿÿûþýÿÅ#ûñïîíììòëêéçåâÙÁ»Ó»ÿÿûþýÿÅ# õôñæÁ»ÙÁ»ÿÿþýÿÈ# õñçÀ·Á»ÿÿþýÿË# ôñåÀ·À·ÿþýÿÌ# ôûóãÀ³÷·ÿþýÿÎ# ôûóâÀ³÷³ÿþýÿÎ# ôûóàÀ®þ³ûþýÿÎ# óüÞÀ­ûþýÿÎ# òûñÜ¿¨ûþýÿÎ# ñüÛÀ§üýÿÎ# ñûðÙ¿ üþÿÎ# ñûð׿¡üþÿÎ# ðûïÖÀ™ýÿÎ# ïûîÔ¿•ýÿÎ# ïûíÓ¿‰ýÿÎ# ïûíÒ¿‡ýÿÎ# ïûíоvýÿÎ# îûíϽjýÿÎ# îûì;hýÿÎ# îûì̽aýÿÎ#úãâáæìííûë˼fýÿÎ#ùWHIn«åììûêʼYýÿÌ#ø !~åëëûêʼYýÿË#>ú?;&"œëëûéʽ]ýÿÈ#@û6gâëëûéʽ]üþÿÅ#@û<%+ŸëëûéʽcüþÿÁ#@ú?)ˆçëëûéʽiûýþÿº#ù@?,oÜêêûèɽiûýþÿ¯#ú@3\Ïêêûèɾoúýþÿ°"ù8;µáçêêûèɾwùÿýþÿ¿B"ï"'U`ku€›©¹Æµ©QöwÿýþÿÉM"ì*%#!"&+/1 ùÿýþÿÅT"?æ><;:9874/*&" ÿÃu"û=>??@@ñUgtq\3 Çœ"÷.0335;??@@ïQvœ”Ž›¥‘R  £"â&'(())/:=>?S‡¢{kc|š¥’< R <!û./0122é78:Fstlršˆ¤n < …!â)*+,./0234Zšrrcmx|w’Š" n ª!â!$&()*,-.0lŸvhlnzmyz& Š" ›!á!%'().o›vpbtakb†r| & B á#$(j™yqsŒ|rnŽi^  “^ Àü6;úã¹v)9ÿûýÇs8ÿüú­J7ÿûýÙe5ÿûþí4ÿüö•3ÿüû˜2 ÿüö1 ÿýíi1 ÿüã^/ ÿüþÌ// ÿüþ . ÿýÚ/. ÿýøW. ÿýýb. ÿüú^- ÿüøZ- ÿûõV, ÿûóR, ÿûðN, ÿúíJ+ ÿúëF+ ÿúèB+ ÿùæ>* ÿùã:* ÿùá6* ÿøÞ1) ÿøÛ-) ÿøÙ)) ÿøÖ% ) ÿøÔ ) ÿøÑ ) ÿøÎ ) ÿøÉ ) ÿøÃ) ÿø½) ÿø¸) ÿø¸) ÿù·* ÿù·* ÿú·+ ÿú·+ ÿú·+ ÿû¶, ÿû¶, ÿû¹, ÿøç›zZ<)ÿùýòåÁv(ÿüýœ'ÿüøq&ÿýÐ1&ÿýñ\&ÿýú&ÿüþŽ%ÿý÷t&ÿýîN&÷&@JD¿½ÈÛÝÝÞðˆKLPQSTVY\_abddeeúfgikm÷3FEE¹¾ÅÚÜÜèÝèÙ¢xng`ZTPNLJKOSX]`bcdeeþf÷ ¾ÀÎÑÑáÝÚÓÈþºµ¯¤—ˆzmbULJJLPTX\`bcddeý¿½¾¾áÂÁÀ¿½º·´²°­«¨¤•‹~obWMFDFJOUY\üÿ¿ÁÃÃâÀ½¹·®¤š“‹ƒ~ytnlfb`\Q?0-38:=@Cý¿½¾¾üÂÁÀû!*üÿ¿ÁÃÃûÀ½¹·W÷Cntp¿½ÈÛÝÝîÞÜt+),./013689:<<==û>?@B÷Xxvw¹¾ÅÚÜÜèÝè×–bVME>82/,)),/369:;<==þ>÷, ¾ÀÎÑÑáÝÚÓÅÀ»¶±ªŒziZJ:.*)),/368;;<<=ý¿½¾¾áÂÁÀ¿½º·´²°­«¨¤š‘„s_M?1'#%(,036üÿ¿ÁÃÃâÀ½¹·®¤š“‹ƒ~ytnlfb`\L6# #ý¿½¾¾üÂÁÀü üÿ¿ÁÃÃûÀ½¹·W÷e¤¢¢¿½ÈÛÝÝûÞÚi ü÷„³®¯¹¾ÅÚÜÜñÝèÕTF=4,& ÷(B1,¾ÀÎÑÑìÝÚÓþ¸³¯§˜…p^N<)þý¿½¾¾çÂÁÀ¿½º·´²°­«¨£˜Ž€lUA1!üÿ¿ÁÃÃèÀ½¹·®¤š“‹ƒ~ytnlfb`\J/  þý¿½¾¾üÂÁÀüüÿ¿ÁÃÃûÀ½¹·WýÉÿ#ÿý ¶ÿ#ÿü–ýÿ"ÿüTÖ÷ø ø ùúüüýþÿÿü,BDDâEFFGILOQTWY\^acfhjlnps‚¹Íàîü$å  #&(+-02479>Pbw&ê "#%&&(()ò -ýþ¿âorsuvvx~€ƒªÉ¹˜ª¶­’¢›¡rB>?L>!ãhjkmprtvxz›ÃÄ™©Á±›Ž£”K?>rB>"eçghjlnor„µÂÀ°²œ‰ž”U?9B>K?#ý`cddéefghjn’º¿À¸¨£…P@>K??9#åGKNRVZ]^_`bg…œ¡‘u[D>;U?9@>$æ18;>?@BCEGHIKLKFA=<P@>>;&è '/35599;<976>;<1 ýü<8ü767 ý¯âEFGIJJLPQU‰³¤†—¡˜€‰‰O!~*!ã?@ACDFIJKMx¬®ˆ–«ˆ}u)O!"=>é@BCEF\›­ªœžŠy‹u2 !)#þ9<<=ë>?@Dq£ªª¢“Šf- ) #å&)+.146889:?c†rT9#2  $æ !#$%''(*)%!- &ê  9ü 8ü ìâ"b–ˆn}†kvrk1 ^ 4!ãO’q}ƒqhvU 1"è1{‘Ž‚ƒsdqT  #þîK‡Ž‡xkH  #ï>]gQ3   $ø  õ  )ø   ü ü  :þ :ý íÿýÅ%&ÿüôl&ÿüý¬'ÿüü¦1(ÿûþ÷’)õ­ÅÕàéòøüþÿÿúúæµj*ë*-/5CSals{„‘„iB*ñ+ü  ÷€€,(–K %XP Backgroundÿ     F¥XPFÉlx„XPG%^|r“†‰šy®ÿÃ-וëë'ë7ï(òSõUø|ûsþ˜ÖL\þÇÍ5ÍúÕÎÍçæççþæç çþæççþæççüÕÍÜç6çýÎÜççþæççýÇÍççþæççþæççþÍç9çýÍæç8çþÍç9çþÍææþçææþçææþçææñçæççæçæçææçææçææþçææþçææüçæçææþÍååæåèæååææåæåææååæåææåææååææååüæåæååüæååææåýÍäååûäååäååùäåäååäååäåøäåääåääååõäååääååäååþÍääþãääþãääùãääãäãääþãääãäþãääþãääþÍã9ãþÍã9ãþÍââûãââãââúãâãâãââùãâãâãâããâãâüãâãââãâþÍââáâáýâáââþáââþáââáâùáâáââáââáûâáââááþâááâþÍááþàááàýáàááüàáàááûàááàááüàáàááþàááþÍà9àþÍà9àüÍààßßàßüàßàßßàßûàßààßßàúßààßàßßàößààßßàßààùÍÞßßÞÞßßüÞßßÞÞßÞßõÞßßÞßßÞßÞßÞÞßþÞßßýÞßÞÞüßÞÞûÍÞÞÝÞÞÝÞþÝÞ ÞþÝÞÞûÝÞÞÝÞÞþÝÞÞýÝÞþÍÝ-ÝþÜÝÝþÜÝÝþÍÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜþÝÜÜûÝÜÝÝÜÜþÝÜÜþÝÜÜþÝÜÜþÍÜ9ÜþÍÜÜÛùÜÛÜÜÛÛÜÜÛÜöÛÜÛÜÜÛÛÜÜÛÛÜÛÜýÛÜÛÛÜÛýÜÛþÍÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛûÚÛÚÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛÛþÍÚ(ÚþÙÚÚþÍÙÙûÚÙÙÚÙÙþÚÙÙÚÙþÚÙÙùÚÙÙÚÙÚÙÙþÚÙÙüÍØÙØØÙØÙúØÙÙØÙØØõÙØÙØØÙÙØØÙØØÙØÙøØÙÙØÙÙØÙÙûØÙÙØþÍØ9ØþÍØØùרר×רØúרØ×רØø×Ø×Ø×Ø×ØØþרØûר×רØþרØþÍ×9×þÍÖÖþ×ÖÖþ×Ö Öþ×ÖÖþ×Ö Ö×Öú×Ö×Ö×ÖÖþÍÕÕþÖÕÕøÖÕÖÖÕÕÖÕÕÖÕþÖÕÕÖÕôÖÕÖÖÕÖÖÕÖÖÕÖÖÕøÍÔÕÔÕÕÔÕÕÔÕþÔÕÕÔÕÔýÕÔÕÕøÔÕÕÔÔÕÔÕÕþÔÕÕÔÕüÔÕÔþÍÔ9ÔþÍÔ9ÔþÍÓ ÓþÔÓÓþÔÓÓûÔÓÓÔÓÓþÔÓÓþÔÓÓüÍÒÓÒÒÓýÒÓÒÒþÓÒÒøÓÒÒÓÒÓÒÓÓÒûÓÒÓÒÓÓÒûÓÒÒÓÒÒýÍÑÒÒþÑÒÒÑøÒÑÒÑÒÑÒÑÑÒüÑÒÒÑÑÒÑûÒÑÒÒÑÑöÒÑÒÒÑÒÒÑÑÒÒýÑÒþÍÑ9ÑþÍÑ9ÑþÍÐÐÑýÐÑÐÐþÑÐ ÐÑýÐÑÐÐûÑÐÐÑÐÐúÑÐÐÑÑÐÐþÑÐÐûÍÐÏÏÐÐõÏÐÏÐÏÐÐÏÏÐÏÏôÐÏÏÐÏÐÏÐÐÏÐÏÏ÷ÐÏÏÐÏÐÏÐÏ ÏÐþÍÎÎÏþÎÏÏúÎÏÎÏÏÎÎüÏÎÎÏÏøÎÏÏÎÏÎÏÎÎÏþÎÏÏÎÏýÎÏÍÎþÍÎÎþÍÎÎþÍÎÎûÍÎÎÍÎ ÎüÍÎÍÎÎ;Í;ÍÍÌüÍÌÍÌÌÍÌæÍÌÌÍÌÍÍÌÍÍÌÍÌÍÍÌÍÌÌÍÌÌÍÌÌÍÍÌùÍÌÍÍÌÌýÍÌËËýÌËÌÌöËÌÌËÌËÌÌËÌÌËÌËøÌËÌËÌËËÌÌþËÌÌýËÌËËÌËþÍËËþÊËËþÊËËþÊËËþÊËËûÊËËÊËËþÊËËþÍÊ9ÊüÍÉÊÉÉöÊÉÉÊÉÊÉÉÊÉÉþÊÉÉþÊÉÉþÊÉÉÊÉüÊÉÉþÍÉ9ÉþÍÈÈýÉÈÉÉÈýÉÈÉÉþÈÉÉüÈÉÈÉÉýÈÉÈÈùÉÈÈÉÉÈÉÉÈüÉÈÈÉÉüÈÉÉþÍÈ ÈþÇÈÈþÇÈÈûÇÈÇÇÈÈÇÈþÇÈÈþÇÈÈþÇÈÈþÍÇ9ÇþÍÆÆûÇÆÆÇÆÆþÇÆÆþÇÆÆþÇÆÆùÇÆÇÆÇÇÆÆþÇÆÆþÍÆ9ÆþÇÍ5ÍúÕÎÍçæç3çüÕÍÜç6çýÎÜç7çýÇÍç8çþÍç9çýÍæç8çþÍç9çýÍçææûçææçææþçææþçææøçæççææçææçþæçç æüÍåæååæüåææååþæååþæååæåæåæåûæååæååûæåæåþÍååäûåäåäååäåüäåäååþäååþäååäåïäåääååääåäååäååäþÍääþãääþãääã äãäøãäããääãääþãääþãääþÍã9ãþÍã9ãüÍâãââãþâããâãâãâãâãñâãââãâãââããâããââãâùãââãââûÍáâáââáâöáâáâáâááâááâúáâáâáââáâûáâáâááâáþâááþÍá áþàááàáþàááúàáàáàááúàáààáþÍà9àþÍà9àýÍàßßöàßààßààßàßßþàßßþàßßüàßßààßüàßàßßàßàß÷àßßàßàßàûÍßßÞßßÞßüÞßÞßßýÞßÞÞìßÞßßÞßÞßßÞÞßßÞßßÞßßÞÞßÞßûÞßßÞþÍÞÞþÝÞÞûÝÞÞÝÞÞÝÞúÝÞÞÝÝÞÞÝÞþÝÞÞþÍÝ9ÝþÍÝÝÜþÝÜÜüÝÜÝÜÜþÝÜÜûÝÜÝÜÝÝýÜÝÜÜþÝÜÜþÝÜÜþÍÜ9ÜþÍÛÛÜÛÜÛüÜÛÛÜÜÛÜüÛÜÛÜÜþÛÜÜþÛÜÜÛÜþÛÜÜÛþÍÛÛþÚÛÛüÚÛÚÛÛþÚÛÛûÚÛÛÚÛÛüÚÛÚÛÛþÚÛÛõÚÛÛÚÛÛÚÛÚÚþÍÚ9ÚþÍÙ ÙûÚÙÙÚÙÙÚÙúÚÙÚÙÚÙÙþÚÙÙþÚÙ ÙöÍØÙÙØÙÙØÙØØýÙØÙÙØûÙØØÙØØÙýØÙØØðÙØÙÙØÙÙØØÙÙØØÙÙØØþÍØ9ØûÍØØ×ØØ×Ø×ýØ×Ø Ø×Øø×ØØ×ØØ×ØØþר Øþ×þÍ×9×þÍÖÖ×Öö×ÖÖ×Ö××ÖÖ××úÖ×ÖÖ×ÖÖþ×ÖÖþ×ÖÖ÷ÍÕÖÕÕÖÕÕÖÖÕÖÕÖÕÖÕþÖÕÕþÖÕÕñÖÕÕÖÕÕÖÕÕÖÖÕÖÖùÍÕÕÔÕÔÕÕüÔÕÔÕÕüÔÕÔÕÕûÔÕÕÔÕÕÔÕÔÕúÔÕÕÔÕþÍÔ9ÔþÍÔ+ÔþÓÔ ÔüÍÔÔÓÓüÔÓÔÓÓÔÓþÔÓÓþÔÓÓþÔÓÓüÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓüÍÒÒÓÓÒýÓÒÓÓÒÓÒÓÒÓÒúÓÒÒÓÓÒÒÓÒüÓÒÒÓÓÒüÓÒÓþÍÒÒÑøÒÑÑÒÑÒÑÒÒÑÒÑÒüÑÒÑÒÒÑÒÑÒÑÒûÑÒÑÑÒÒþÍÑ9ÑþÍÑ9ÑþÍÐÐþÑÐÐþÑÐÐÑÐÑÐõÑÐÐÑÐÐÑÑÐÑÐÐÑ÷ÍÏÏÐÐÏÐÏÐÐûÏÐÏÐÏÏñÐÏÐÐÏÐÏÏÐÐÏÐÏÐÏÏÐÏüÐÏÏÐÐþÏÐÐÏþÐùÍÎÎÏÎÏÎÎøÏÎÏÎÏÎÎÏÏÎõÏÎÏÎÏÏÎÏÎÎÏÏùÎÏÏÎÏÏÎÎþÏÎÎùÏÎÎÏÎÏûÍÎÍÍÎÎþÍÎÎÍÎþÍÎÎüÍÎÍÎÎûÍÎÎÍÎÎþÍÎÎ;Í;ÍÍÌÍÌüÍÌÍÌÌúÍÌÍÌÌÍÍÌüÍÌÌÍÍúÌÍÌÍÍÌÌýÍÌÍÍÌÍûÌÍÌÍùÍËËÌËËÌÌúËÌÌËËÌÌËÌþËÌÌþËÌÌËüÌËËÌÌËÌþËÌÌËûÍÊËÊËËûÊËËÊËËþÊËËþÊËËþÊËËüÊËËÊÊËÊËþÊþÍÊ9ÊþÍÉÉÊÉþÊÉÉþÊÉÉ÷ÊÉÊÉÉÊÉÊÉÉùÊÉÊÉÉÊÉÉÊ ÉþÊÉÉþÍÉ9ÉóÍÉÈÉÈÉÉÈÉÉÈÈÉÉÈÉøÈÉÉÈÉÉÈÉÉÈÉÈÉÈÉÈþÉÈÈÉþÍÈÈûÇÈÈÇÈÈþÇÈÈûÇÈÇÇÈÈþÇÈÈüÇÈÇÈÈþÇÈ ÈþÇÈÈþÍÇ ÇþÆÇÇûÍÆÇÇÆÆþÇÆÆÇÆþÇÆÆþÇÆÆüÇÆÇÆÆÇùÆÇÆÆÇÆþÍÆ9ÆþÇÍ5ÍúÕÎÍçæç3çüÕÍÜç6çýÎÜç%çþæççýÇÍç8çþÍç9çýÍæç8çþÍç9çþÍææüçæçææüçæçææûçææçææçæøçæçææççææþçææþçúÍåæåæååæåõæåææåæååæåææåûæååæååæåüæååææåûæåæåüÍääååøäåäåääåääåûäååäååþäååäåøäååäåäåääåþäååþÍä äþãä äþãääþãääþãä äãäýãäþÍã9ãþÍã9ãýÍãââùãââãâãââãâãøâããâãâãââþãââãâãâþãûÍáââááøâáâááâáââþáââáüâáâááâúáâááâááâ÷áââááâáâþÍááþàááþàááþàá áàüáààááþàþÍà9àþÍà9àòÍßààßßàßßàßßàßßþàßßýàßààûßàßàßßþàßßàßàþßààßýÍÞßßôÞßÞßÞßÞßÞßÞßßÞßýÞßÞÞóßÞÞßÞßÞÞßßÞÞßßúÞßÞßÞßßþÍÞÞÝÞþÝÞÞþÝÞ ÞÝÞþÝÞÞûÝÞÞÝÞÞüÝÞÞÝÝÞþÍÝ9ÝûÍÜÜÝÜÜþÝÜÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜüÝÜÝþÍÜ9ÜþÍÜÜÛÜþÛÜÜîÛÜÜÛÜÜÛÜÛÜÛÛÜÛÜÛÛÜÜÛÜûÛÜÛÛÜÜþÛÜÜÛþÜüÍÛÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛþÚÛÛÚýÛÚÛÛþÍÚ*ÚþÙÚ ÚûÍÚÙÚÙÙþÚÙÙþÚÙÙþÚÙ ÙþÚÙÙþÚÙÙýÍØÙÙüØÙÙØØÙøØÙØÙÙØÙØØÙûØÙØÙØØÙúØÙØØÙØØþÙØØýÙØþÍØ9ØùÍרØ×רØ×ýØ×ØØø×Ø×ØØ×רØ×üØ×רØþÍ×9×þÍÖÖþ×ÖÖþ×ÖÖ×Öþ×ÖÖþ×ÖÖþ×ÖÖú×ÖÖ×Ö×× Öü×Ö×ûÍÕÖÕÖÖøÕÖÖÕÖÕÖÕÕþÖÕÕþÖÕÕÖÕþÖÕÕÖÕÖÕÖþÕÖÖÕøÍÕÕÔÕÔÔÕÕüÔÕÔÕÕÔÕþÔÕÕÔþÕÔÔùÕÔÕÔÕÕÔÔÕÔýÕÔþÍÔ9ÔþÍÔ9ÔþÍÓÓþÔÓÓÔýÓÔÓ ÓþÔÓÓÔÓþÔÓÓüÔÓÔÓÓûÍÓÒÒÓÓÒþÓÒÒôÓÒÓÒÓÓÒÒÓÒÓÒÒüÓÒÓÒÒüÓÒÓÒÒöÓÒÒÓÒÒÓÒÒÓÓþÒþÍÒÒþÑÒÒþÑÒÒÑÒÑÒêÑÒÒÑÑÒÒÑÒÒÑÑÒÒÑÒÑÒÑÒÑÒÒúÑÒÑÒÒþÍÑ9ÑþÍÑ9ÑþÍÐ ÐþÑÐÐÑþÐÑÑ ÐþÑÐÐüÑÐÑÐÐúÍÏÏÐÏÐÐÏûÐÏÐÐÏÏúÐÏÏÐÐÏÏùÐÏÐÏÐÐÏÏóÐÏÏÐÏÐÐÏÐÏÏÐÏÏÐþÏüÍÏÏÎÎÏþÎÏÏøÎÏÎÎÏÎÎÏÏþÎÏÏþÎÏÏúÎÏÏÎÏÎÎõÏÎÎÏÎÎÏÎÎÏÎÎûÍÎÎÍÎÎþÍÎÎèÍÎÎÍÍÎÍÎÍÎÎÍÎÎÍÍÎÎÍÎÎÍÍÎÎýÍÎ;Í;ÍþÍÌÌÍÌþÍÌÌþÍÌÌýÍÌÍÍüÌÍÌÍÍÌÍýÌÍÌÌþÍÌÌúÍÌÍÌÌÍÍþÍÌÌüËÌËÌÌþËÌÌËóÌËËÌÌËÌÌËÌËËÌÌûËÌÌËÌÌðËÌÌËÌÌËËÌÌËÌËËÌþÍË ËþÊËËþÊËËþÊË ËþÊËËüÊËËÊÊýËÊþÍÊ9ÊþÍÊÊÉüÊÉÊÉÉÊÉþÊÉÉùÊÉÊÉÊÉÊÊÉþÊÉÉüÊÉÉþÍÉ9ÉþÍÈÈÉÈÉÈÉùÈÉÈÉÈÈÉÉ÷ÈÉÈÉÈÈÉÉÈÈÉÈùÉÈÉÉÈÉÈÈþÉûÍÈÈÇÈÈþÇÈÈþÇÈÈþÇÈÈÇûÈÇÈÇÈÈþÇÈÈþÍÇ9ÇþÍÆÆüÇÆÇÆÆþÇÆÆÇÆþÇÆÆþÇÆÆÇ ÆþÍÆ9ÆýGùÿ4ÿþÿ7ÿþÿ8ÿ:ÿþGÿ9ÿþùÿ9ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ?ͳçþæççþæçïçþæççæþçææþçææ÷çææççæççææþçææþçææüçæçææþçææþçææýåæååûæåææååæøåæåæååæååþæååþæååæøåæåææåæååæúåæåææååüæåæååôäåääååääåäåääåüäååääøåäåääåäååþäååþäååþäååþäååøäåääåäãääþãääþãääãäþãääþãääþãääãä€ãüâããâ âãâóãâããâãââããâãââüãâãââãâãâãâùãâãááâááâþáââýáâááýâáââþáââõáâááâáâááâááâøáâáâáâáââûáàáàááþàááþàááüàáàááþàá áûàááàá áþàááþàáá€àßþàßßàßàßþàßßàßþàßßàüßààßßþàßßàùßàßßààßßþàßßàþÞßßÞßÞûßÞßÞßßÞßþÞßßþÞßßøÞßßÞßÞßÞÞþßÞÞþßÞÞþÝÞÞþÝÞÞþÝÞÞýÝÞÝÝÞ÷ÝÞÞÝÞÝÞÝÞÞþÝÞÞþÝÞÞÝýÞÝÞÞýÝÞÝ7ÝþÜÝÝÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜûÝÜÝÝÜÜûÝÜÝÝÜÜÝÜÝBÜøÛÜÛÛÜÛÜÛÛúÜÛÜÜÛÜÜÛýÜÛÜÜÛÜþÛÜÜöÛÜÜÛÜÜÛÜÛÜÜÛÜýÛÜÛÛüÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛñÚÛÛÚÛÚÛÚÛÚÛÚÛÚÛÛüÚÛÚÛ ÛÚûÛÚÛÛÚ>ÚüÙÚÚÙ ÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÚÙÙîØÙØØÙÙØÙØØÙØØÙØÙÙØØþÙØØñÙØÙØÙØÙØØÙÙØÙÙØØîÙØÙÙØÙØÙØÙÙØØÙØØÙØBØþרØòר×רØ×ØØ×Ø×Ø×רüררØþרØ?×ýÖ×ÖÖü×Ö×ÖÖþ×ÖÖ×ýÖ×ÖÖþ×Ö Ö×Öþ×ÖÖÕþÖÕÕüÖÕÖÕÕþÖÕÕÖöÕÖÕÖÕÕÖÕÖÕÕûÖÕÖÖÕÕìÖÕÖÖÕÖÖÕÖÕÕÖÖÕÖÕÖÕÔÕÕþÔÕÕÔÕþÔÕÕÔÕÔøÕÔÕÕÔÕÔÕÕùÔÕÔÕÕÔÕÕÔÕúÔÕÕÔÔÕÕ€ÔúÓÔÔÓÔÓÓþÔÓÓúÔÓÔÓÔÓÓðÔÓÔÔÓÔÓÓÔÓÓÔÓÓÔÓ ÓÔÓþÔÓÓþÒÓÓñÒÓÒÓÓÒÓÓÒÓÒÒÓÓÒÒÓÒûÓÒÓÓÒÒÓûÒÓÒÓÒÒÓýÒÓÒÒÓúÒÓÑÒÑÒÒþÑÒÒþÑÒÒþÑÒÒþÑÒÒõÑÒÑÒÑÒÒÑÒÑÒÒÑÒûÑÒÑÑÒÒýÑÒÑ~ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐùÑÐÐÑÐÐÑÑÐþÑÐÐøÏÐÐÏÐÏÐÏÏôÐÏÐÏÏÐÏÐÐÏÐÏÏÐÏþÐÏÏüÐÏÐÏÏþÐÏÏþÐÏÏûÐÏÐÐÏÏ÷ÐÏÏÐÎÏÎÏÎÎÏÎÏüÎÏÎÏÏþÎÏÏþÎÏÏÎÏýÎÏÎÎÏÎÏÎÏÎùÏÎÏÎÎÍÎÎþÍÎ ÎþÍÎÎÍÎÍÎþÍÎÎûÍÎÎÍÎÎþÍÎÎýÍÎÍ~ÍÌùÍÌÍÌÌÍÌÌþÍÌÌþÍÌÌÍýÌÍÌÌþÍÌÌÍÌþÍÌÌüËÌÌËËÌþËÌÌËúÌËÌËÌËËýÌËÌÌþËÌÌËÌþËÌÌüËÌËÌÌôËÌÌËÌËËÌÌËËÌÌýËÊËËþÊË ËþÊËËÊüËÊËÊÊËþÊËËÊËüÊËËÊ>ÊÉþÊÉÉÊÉþÊÉÉüÊÉÊÉÉþÊÉÉüÊÉÊÉÉþÊÉEÉÈÉÈÉÈÉþÈÉÉÈÉÈýÉÈÉÉüÈÉÈÉÉøÈÉÉÈÉÈÈÉÉüÈÉÈÉÉýÈÉÈÈþÇÈ ÈþÇÈÈþÇÈÈûÇÈÈÇÈÈüÇÈÇÈ ÈþÇÈÈüÇÈÈÇ ÇþÆÇ1ÇûÆÇÆÇÆÆÇÆûÇÆÆÇÆÆüÇÆÇÆÆÇÆþÇÆÆûÇÆÆÇÆÆþÇÆDÆ?ÍÀçæçæþçææüçæçææçýæçææûçææçææþçææçæþçææüçåæååùæåæåææååüæååææå÷æåæåæååæååþæååþæååþæååþæååüæåæååþäååþäååäåäþåääåûäååäååþäååüäåäååäåòäååäåäååäååäãääþãääãäúãäãäãääþãääøãäãääããää‡ãâøãâãâããâããüâããââóãâãââãâããâãâããâãâãâãâúãââáâáá âáûâáâáââþáââúáâáâáââáúâááâáââáùâááââáââáüàáàááþàááþàááàýáàááàáúàááààááùàáàáààáá‚àßþàßßýàßààßþàßß÷àßßàßßààßßàýßàßßüàßàßßùàßàßàßÞÞûßÞßßÞÞúßÞÞßßÞÞßõÞßßÞßÞßÞßßÞÞßþÞßßÞßüÞßÞßß ÞüÝÞÝÞÞÝüÞÝÝÞÞþÝÞÞúÝÞÞÝÝÞÞüÝÞÝÞÞÝÞþÝÞÞ?ÝÜþÝÜÜÝÜþÝÜÜÝÜûÝÜÜÝÜÜþÝÜÜþÝÜÜúÝÜÜÝÝÜÜûÝÜÜÝÜ@ÜÛÜøÛÜÛÛÜÜÛÜÜÛÜûÛÜÜÛÜÜùÛÜÛÜÛÛÜÜöÛÜÛÜÛÜÛÜÛÜÜÛÚýÛÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛýÚÛÚ>ÚÙÚÙþÚÙÙþÚÙÙþÚÙ ÙþÚÙÙþÚÙÙþÚÙÙØÙØÙØþÙØØÙüØÙØÙÙØîÙØÙØÙØÙØØÙØØÙÙØÙØÙÙØÙNØþרØø×ØØ×Ø×רØþר Øþר Ø?×üÖ×Ö××ýÖ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×ÖÖ××Öú×ÖÖ××ÖÖþ×ÖÖ×ûÖÕÕÖÕÕÖÕÖÕþÖÕÕÖÕÖÕÖÕýÖÕÖÖÕþÖÕÕüÔÕÕÔÔýÕÔÕÕýÔÕÔÔÕþÔÕÕÔÕÔúÕÔÔÕÕÔÔÕþÔÕÕþÔÕÕýÔÕÔ~ÔÓþÔÓÓþÔÓÓüÔÓÔÓ ÓÔÓúÔÓÔÓÔÓÓþÔÓÓóÒÓÓÒÒÓÓÒÒÓÒÓÒÒúÓÒÓÒÒÓÓÒÓÒúÓÒÓÒÓÒÒÓÒôÓÒÓÓÒÒÓÓÑÒÑÒÒÑÒÑÒýÑÒÑÑòÒÑÒÑÑÒÑÑÒÑÒÑÑÒÒÑÒùÑÒÑÒÑÒÑÑþÒÑÑüÒÑÒÑ~ÑýÐÑÐÐÑÐüÑÐÑÐÐþÑÐÐÑÐþÑÐÐÑýÐÏÐÐüÏÐÐÏÏõÐÏÐÏÐÏÏÐÏÐÏÏÐûÏÐÏÏÐÐÏÐÏùÐÏÏÐÏÐÏÏÐÏÐÏûÎÏÏÎÏÏþÎÏÏþÎÏÏÎ÷ÏÎÎÏÏÎÎÏÎÎ ÏÎÏÎÏ ÎÍÎÍÎþÍÎÎþÍÎÎþÍÎ΀ÍÌþÍÌÌþÍÌÌÍÌÍÌÍÌÍùÌÍÍÌÌÍÌÌóÍÌÍÌÌÍÌÍÌÍÌÍÌÌúÍÌÌÍÍÌÌþËÌÌËÌËÌËÌüËÌËÌ ÌËÌËýÌËÌÌýËÌËËÌËÌÊ ËþÊËËÊËüÊËÊËËþÊËËþÊËËÊ Ë?ÊÉþÊÉÉúÊÉÊÉÊÉÉÊÉøÊÉÉÊÉÉÊÉÉþÊÉÉÊÉþÊÉDÉþÈÉÉþÈÉÉþÈÉÉøÈÉÈÈÉÈÉÈÈòÉÈÈÉÈÉÉÈÉÈÈÉÈÉÉÈùÉÈÉÈÈÉÈÈýÉÈÉÉþÈÉÉÈûÇÈÈÇÈ ÈþÇÈÈþÇÈÈþÇÈÈþÇÈÈþÇÈÈùÇÈÈÇÈÈÇAÇÆþÇÆÆþÇÆÆùÇÆÆÇÆÇÆÆþÇÆÆüÇÆÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆ@Æ?ÍçþæççþæçUçþæçCç æûçææçææþçææþçææùçæççæçææüçæçææþçææçæçøæåææåææååüæååææåôæåæååæååæåæååþæå åæåþæååõæåæäååääåäååäûåääåääüåäåääåäåäþåääüåääååùäååääåääãäþãääøãääãääãääûãäããääãäøãäãääããääþãääãâòãâããââããââãâãââãúâããâãââþãââãâþãââãâþãââãâáâüáâáââùáâáââáââáâùáâáââáââáâøáââááâáââöáâáàáàáààááüàáàááþàááàáþàááþàááàáþàááàßàßàßþàßßþàßßðàßßàßßàßßàßßàßàß ßþàßßàßìÞßßÞßßÞßßÞßßÞßßÞßßÞßßüÞßÞßßüÞßÞß ß÷ÞßÞÞßÞßÞßßþÞßßýÞÝÞÞþÝÞÞûÝÞÞÝÞÞÝÞþÝÞÞÝÞþÝÞÞüÝÞÞÝ?Ý ÜûÝÜÜÝÜÜúÝÜÝÜÝÜÜþÝÜÜ÷ÝÜÜÝÜÜÝÝÜÜþÝÜÜþÝÜÜùÝÜÝÝÜÝÜ@ÜÛÜÛÜýÛÜÛÛõÜÛÛÜÜÛÜÛÜÛÜÜúÛÜÛÛÜÛÛÜþÛÜÜþÛÜÜÛÜÛøÚÛÛÚÛÛÚÛÛúÚÛÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛúÚÛÛÚÚÛÛþÚÛÛþÚÛÛ?ÚÙþÚÙÙþÚÙ ÙþÚÙ ÙþÚÙÙÚÙÚÙþÚÙÙØþÙØØþÙØØúÙØØÙÙØØüÙØÙØØÙØþÙØØÙØøÙØØÙÙØÙØØþÙØØÙCØ×úØ×Ø×רØþרØþרØþרØþרØø×ØØ×ØØ×ØØþרØýר×?×Öþ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×Ö×ÖÖø×ÖÖ×ÕÕÖÕÕüÖÕÖÕÕöÖÕÖÕÕÖÕÕÖÕÕÖ ÕÖÕäÖÕÕÖÕÕÖÕÖÕÖÕÕÖÕÖÔÔÕÕÔÕÔÔÕÕÔÕÕÔùÕÔÕÕÔÕÔÔÕ÷ÔÕÕÔÕÕÔÔÕÕüÔÕÔÕÕüÔÕÔÕÕÔÕüÔÕÕÔÔÓûÔÓÓÔÓÓþÔÓÓþÔÓÓúÔÓÔÓÔÓÓûÔÓÓÔÓÓÒÓòÒÓÓÒÒÓÒÒÓÓÒÓÓÒÒûÓÒÓÓÒÒüÓÒÓÒÒÓÒþÓÒÒÓÒÓúÒÓÓÒÑÒÒüÑÒÑÒÒþÑÒÒÑ ÒêÑÒÒÑÑÒÒÑÑÒÑÑÒÑÒÑÑÒÑÒÒÑÑþÒÑÑýÒÑÒÒ€ÑÐþÑÐÐþÑÐÐþÑÐÐûÑÐÐÑÐÐüÑÐÑÐÐþÑÐÐþÏÐÐÏÐÏÐûÏÐÏÏÐÐÏÐ ÏÐúÏÐÏÐÐÏÏþÐÏÏýÐÏÐÐöÏÐÏÏÐÎÏÏÎÏÏùÎÏÎÏÎÎÏÏýÎÏÎÎúÏÎÎÏÏÎÎþÏÎÎûÏÎÎÏÎÎøÏÎÏÎÏÎÏÎÎÏÎûÏÍÎÍÎÎÍ ÎüÍÎÍÎÎüÍÎÍÎÎþÍÎÎÍÎþÍÎÎþÍÎÎüÍÎÎÍ‚ÍûÌÍÍÌÍÍÌùÍÌÍÌÌÍÌÌþÍÌÌþÍÌÌÍþÌÍÍÌÍÌþÍÌÌÍáÌÍËÌËËÌËÌËÌËÌËÌÌËËÌËËÌÌËËÌËÌËËÌÌúËÌËÌËÌÌËòÌËËÌËÌËËÌÌËËÌËËÌýËÌËËþÊËËüÊËÊËËÊËþÊËËÊËýÊËÊÊùËÊÊËËÊËË?ÊýÉÊÉÉÊ ÉÊÉþÊÉÉþÊÉÉþÊÉBÉþÈÉÉÈùÉÈÈÉÉÈÉÉüÈÉÈÉÉ÷ÈÉÉÈÉÉÈÈÉÉøÈÉÉÈÉÈÈÉÉÈÉÈüÉÈÇÈÈþÇÈ ÈüÇÈÇÈÈûÇÈÈÇÈÈûÇÈÈÇÈÈþÇÈ ÈúÇÈÈÇÈÇ?ÇÆþÇÆÆÇÆþÇÆÆþÇÆÆüÇÆÇÆÆÇÆþÇÆÆþÇÆÆþÇÆÆþÇÆ?Æÿ?Í?çþæç}çæçæþçææøçæçæçææççüæççææþçææþçææçûæåææååæåþæååæþåææåæðåæåæååææååæååææååæûåæåæååþæååþäååýäåääåþäåå÷äååääååäååäåäþåääýåäååäþãääûãääãääùãäããäãääüãäãääüãäãääãâõãââãâãâãâãââúãââããââöãâããââãâãââãýâãââøãââãâããââãõâáââáââáâáââáâþáââáþâááâôáââáâáââáâáââáâáâüáâáââáþàááàáþàááüàáàááþàááøàááààáàááþàáá‡àßðàßàßßàßßàßààßßàßßþàßßþàßßöàßßààßßààßßàßòàßàßßàßàÞÞßÞÞßßÞßøÞßÞÞßßÞßßÞßúÞßßÞÞßßôÞßßÞßßÞÞßßÞßßûÞßÞÝÞÞþÝÞÞøÝÞÞÝÞÝÝÞÞûÝÞÞÝÞÞþÝÞÞþÝÞÞþÝÞÞöÝÞÞÝÞÝÝÞÞÝ>ÝÜþÝÜÜÝ ÜþÝÜÜþÝÜÜÝÜÝÜÝDÜúÛÜÜÛÛÜÜûÛÜÜÛÜÜùÛÜÛÛÜÛÜÜþÛÜÜþÛÜÜþÛÜ ÜøÛÜÛÜÛÛÜÛÛþÚÛÛþÚÛÛÚÛþÚÛÛÚÛÚþÙÚÚþÙÚ ÚÙôÚÙÙÚÚÙÚÙÙÚÙÚÚÙùÚÙÙÚÙÚÙÙüÚÙÚÙÙüØÙÙØØÙØýÙØÙÙØþÙØØÙýØÙØØÙØðÙØØÙØÙØÙØÙØÙØÙÙØØüÙØÙØ?Øþר ØþרØüררØþרØþרØôרØ×ØØ×ØØ×רØþרØüרØ×>×Öþ×ÖÖõ×ÖÖ×ÖÖ××Ö×ÖÖ× Ö×Ö× ÖÕûÖÕÕÖÕÕïÖÕÕÖÕÕÖÕÖÕÕÖÕÖÕÖÕÕÖ÷ÕÖÕÖÖÕÕÖÕÕûÖÕÕÖÕÕüÖÕÖÕÕÖÕþÔÕÕÔþÕÔÔþÕÔÔÕýÔÕÔÔÕüÔÕÔÕÕûÔÕÔÔÕÕþÔÕÕýÔÕÔÔþÕÔÔþÕÔ~ÔÓûÔÓÓÔÓÓüÔÓÔÓÓþÔÓÓüÔÓÔÓÓÔÓüÔÓÔÓÓþÔÓÓùÒÓÓÒÒÓÒÒþÓÒÒÓÒ÷ÓÒÒÓÓÒÒÓÒÒ÷ÓÒÓÓÒÓÓÒÓÓýÒÓÒÒþÓÒÒüÑÒÑÒÒÑÒúÑÒÒÑÒÑÑÒþÑÒÒöÑÒÒÑÒÒÑÒÑÒÒÑÒôÑÒÑÑÒÒÑÒÑÒÒÑÑþÒÑÑüÐÑÐÑÑÐÑúÐÑÐÐÑÐÐüÑÐÑÐ ÐüÑÐÑÐÐþÑÐÐþÑÐÐöÏÐÏÐÐÏÐÏÏÐÐýÏÐÏÏÐÏøÐÏÐÏÐÏÏÐÐýÏÐÏÏüÐÏÏÐÐÏÐÏÐ÷ÏÐÏÐÏÏÎÏÎÎÏÎÏ÷ÎÏÎÎÏÎÏÎÏÏþÎÏÏþÎÏÏùÎÏÎÏÎÎÏÏùÎÏÏÎÏÎÏÏÎÏÎüÍÎÍÎÎÍÎúÍÎÎÍÍÎÎöÍÎÍÍÎÍÍÎÍÎÎûÍÎÎÍÎ ÎÍ΀ÍÌþÍÌ ÌôÍÌÍÍÌÍÌÌÍÌÍÌÌþÍÌÌÍÌÍÌÍÌõÍÌÍÌÍÍÌÌËËÌÌýËÌËËÌËÌËýÌËÌÌËöÌËËÌÌËËÌËÌÌËýÌËÌÌËÌþËÌÌËÊËÊËþÊËËúÊËËÊÊËËøÊËËÊËËÊËËþÊËËþÊËËÊËAÊýÉÊÉÉþÊÉÉùÊÉÊÉÉÊÉ ÉüÊÉÊÉÉþÊÉÉþÊÉÉþÊÉIÉ÷ÈÉÈÉÈÉÈÈÉÉÈÉÈÉíÈÉÈÉÉÈÉÈÉÈÈÉÈÈÉÉÈÉÈÈúÉÈÉÈÇÈÈÇýÈÇÈÈüÇÈÇÈÈþÇÈ ÈÇÈÇýÈÇÈÈþÇÈÈ?ÇûÆÇÆÇÆÆþÇÆÆþÇÆÆþÇÆ ÆþÇÆÆþÇÆÆüÇÆÇÆCÆ?Í+çþæçƒçþæçÞçþæççþæçç æþçææûçææçææûçææçææþçææþçææþçææþçææþçææúåæååæåå÷æååæåæåæååýæåææüåæåææåæåõæåæååæåæåæååæåäå÷äåäåääåäååäýåäååþäååäåäýåäååýäåääãäþãääüãäãääãäãäþãääþãääóãääããääãäãäãääãþäã~ãüâããââüãâãââãùâãâããâããâãâñãâããâããâãââãâãââãâáòâáââááââáââááââáûâáâáââøáââáââáâ âáâáþàááà áþàááøàááàááàááàáþàááþàááàßàßýàßààþßààßàøßàßßàßàßßöàßàßßààßàßßàößààßàßàßàßßÞùßÞßßÞÞßßãÞßßÞßÞßÞÞßßÞßÞßÞÞßÞßÞßßÞßÞßÞßßúÞßÞÞßÞÞüßÞßÞÞþßÞÞþÝÞÞøÝÞÞÝÞÞÝÞÞþÝÞÞüÝÞÝÞÞþÝÞÞûÝÞÞÝÞÞþÝÞÞúÝÞÞÝÞÝ6ÝþÜÝÝÜûÝÜÜÝÜÜøÝÜÝÜÜÝÝÜÜþÝÜÜÝÜþÝÜÜþÝÜEÜÛÜÛÜþÛÜÜúÛÜÜÛÜÛÛÜöÛÜÜÛÛÜÛÜÛÜÜìÛÜÛÜÛÛÜÛÛÜÜÛÛÜÛÜÜÛÜÛÛþÚÛÛþÚÛÛûÚÛÛÚÛÛÚÛÚúÛÚÛÛÚÛÛ?ÚÙþÚÙÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÚÙÙüÚÙÚÙÙüÚÙÚÙÙÚÙýØÙØØÙØÙØøÙØÙØÙØÙØØÙØþÙØØÙØþÙØØýÙØÙÙØÙúØÙÙØÙØBØûרØ×ØØþרØþרØöרØ×Ø×ØØ×ØØ×ØþרØ×ýØ×ØØýר×?×ýÖ×ÖÖþ×ÖÖþ×ÖÖ÷×Ö××Ö×Ö×ÖÖþ×ÖÖþ×ÖÖ÷×ÖÕÖÖÕÕÖÕÕÖÕÖÕíÖÕÕÖÕÕÖÕÕÖÕÖÖÕÖÖÕÖÕÕÖýÕÖÕÕÖ÷ÕÖÕÖÖÕÕÖÕÕõÔÕÕÔÕÕÔÕÕÔÕÕþÔÕÕþÔÕÕóÔÕÔÔÕÔÕÔÕÕÔÕÔÔÕøÔÕÔÕÔÕÔÕÕýÔÕÔ~Ô ÓÔÓþÔÓ ÓþÔÓÓþÔÓÓøÔÓÓÔÔÓÔÓÓþÔÓÓþÔÓÓûÔÓÒÒÓÓúÒÓÒÓÓÒÒúÓÒÒÓÓÒÒûÓÒÓÓÒÒÓúÒÓÒÒÓÒÒõÓÒÓÓÒÒÓÒÓÓÒÒòÑÒÒÑÑÒÑÒÑÒÒÑÒÑÑýÒÑÒÒúÑÒÑÒÑÒÒûÑÒÒÑÒÒüÑÒÑÒÒòÑÒÑÑÒÑÒÑÒÑÒÑÑÒÒÑÐÑ ÐÑ ÐþÑÐ ÐüÑÐÑÐÐþÑÐÐüÑÐÐÏÏÐÏûÐÏÏÐÏÏÐÏûÐÏÏÐÏÏúÐÏÐÐÏÐÐüÏÐÐÏÏöÐÏÏÐÏÐÏÐÐÏÏÎüÏÎÎÏÏÎÏøÎÏÎÎÏÏÎÏÏûÎÏÏÎÏÏÎþÏÎÎÏöÎÏÎÏÏÎÎÏÎÏÏþÎÏÏÎÍ ÎþÍÎÎþÍÎÎÍúÎÍÎÎÍÎÎùÍÎÍÎÎÍÎÎþÍÎÎüÍÎÍÎ΃ÍÌúÍÌÍÌÍÌÌÍÌÍûÌÍÌÌÍÍÌÍÌþÍÌÌÍÌõÍÌÌÍÌÍÌÍÌÌÍÍýÌÍÌÌËÌþËÌÌËÌËÌüËÌÌËËüÌËÌËËþÌËËÌûËÌËËÌÌËÊËþÊËËþÊËËÊ÷ËÊËÊËÊËÊËËþÊËËþÊËËüÊËÊËËÊË?ÊúÉÊÉÉÊÉÉÊúÉÊÉÉÊÉÉÊÉþÊÉÉûÊÉÉÊÉÉþÊÉAÉþÈÉÉÈÉþÈÉÉþÈÉÉÈÉüÈÉÉÈÈÉôÈÉÈÉÈÉÈÉÈÉÈÉÉúÈÉÈÈÉÈÈþÇÈÈûÇÈÇÇÈÈþÇÈÈÇÈûÇÈÈÇÈÈ@ÇÆÇÆÇÆøÇÆÇÆÆÇÇÆÆþÇÆÆþÇÆÆþÇÆÆÇÆþÇÆ>Æ?ÍkçþæçRçæþçææûçæççææùçæçææçææþçææþçææþçæ æçþæååýæåææ åþæååýæåææåúæåææåææåùæåææåæååäåéäåääååääååääåäåäåäååäåääþåääñåääåäåäåäåäååäååäþãääãäûãääãääþãä äþãä äñãääããääãääãäãäã€ãâØãâããâãâãââãâãâãââãâããâããâãâããââãââãââãâããâõãââãââããâãââúáâááâááýâáââþáââáñâáâááââáââáâááââáâþáââûáâááââáþàá áôàááàááààááàá áþàááàáüàáàááûàááàáá€àøßààßààßààßàßûàßßàßßàßüàßàßßàößàßàßßàßßààüßààßßÞßÞßþÞßßÞüßÞßÞÞßÞýßÞßßùÞßÞÞßÞßßýÞßÞÞýßÞßßÞÝÞþÝÞÞüÝÞÝÞÞÝÞÝþÞÝÝÞþÝÞÞÝÞüÝÞÝÞÞ?ÝÜþÝÜÜÝÜûÝÜÜÝÜÜþÝÜÜúÝÜÜÝÝÜBÜúÛÜÛÜÜÛÛüÜÛÛÜÜÛÜÛÜûÛÜÛÜÛÛþÜÛÛýÜÛÜÜýÛÜÛÛÜÛüÜÛÚÛÛÚÛþÚÛÛÚÛÚÛúÚÛÚÛÚÛÛÚÛþÚÛÛ?ÚÙÚÙþÚÙÙþÚÙÙùÚÙÚÙÚÚÙÙþÚÙÙ÷ØÙØØÙØØÙØØúÙØÙØØÙÙõØÙÙØÙÙØÙÙØÙÙØÙýØÙØØûÙØÙÙØEØø×Ø×רØ×ØØùררØ×Ø'Ø?×ýÖ×ÖÖû×ÖÖ×ÖÖþ×Ö Öþ×Ö Öþ×ÖÖþ×ÖÖ×ÖÕþÖÕÕýÖÕÖÖýÕÖÕÕÖùÕÖÖÕÖÖÕÕôÖÕÕÖÕÖÕÕÖÕÕÖÖÕþÖÕÕþÖÕÕõÖÕÖÖÕÕÖÕÖÕÔÔÕþÔÕÕøÔÕÕÔÕÕÔÕÕøÔÕÔÔÕÔÔÕÕÔ÷ÕÔÕÔÕÔÕÕÔÔÕýÔÕÔÔûÕÔÕÕÔ~ÔøÓÔÓÔÓÓÔÓÓþÔÓÓûÔÓÓÔÓÓþÔÓÓùÔÓÔÔÓÔÓÓûÔÓÔÔÓÓüÔÓÔÓ ÓÒÓÒþÓÒÒÓôÒÓÒÓÓÒÒÓÒÒÓÒÒþÓÒÒþÓÒÒÓÒÓôÒÓÒÒÓÒÓÒÒÓÑÒÒÑÒÑÒÑ÷ÒÑÒÒÑÒÒÑÒÒÑÒÑÒÑÒöÑÒÑÒÒÑÒÑÑÒÒüÑÒÒÑÑþÒÑ~ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐÑÐùÑÐÐÑÐÑÐÐÑÐþÑÐÐÏÐÏÐýÏÐÏÏòÐÏÏÐÏÏÐÐÏÏÐÏÐÏÏÐÏÐÏþÐÏÏþÐÏÏÐÏöÐÏÏÎÏÏÎÏÎÏÏñÎÏÎÏÎÏÏÎÎÏÎÏÎÎÏÏÎöÏÎÎÏÎÏÏÎÎÏÏõÎÏÎÏÎÏÎÎÏÎÏÏÎÏÍþÎÍÍýÎÍÎÎþÍÎÎÍÎûÍÎÎÍÎÎûÍÎÎÍÎÎûÍÎÍÍÎÎùÍÎÍÎÎÍÎ΀ÍÌûÍÌÌÍÌÌÍÌÍÌÍÌÍþÌÍÍôÌÍÌÍÌÍÌÌÍÌÍÌ ÌþÍÌÌËÌËÌöËÌÌËËÌÌËËÌÌËðÌËËÌËÌÌËËÌÌËÌËËÌÌúËÌËÌËÌÌüËÌÌËËþÊËËþÊË ËÊ ËüÊËÊËËþÊËËÊËúÊËËÊËÊ?ÊÉþÊÉÉûÊÉÉÊÉÉÊÉúÊÉÊÉÊÉÉþÊÉÉþÊÉÉÊÉÊÉÊúÉÊÉÉÊÉ?ÉùÈÉÈÈÉÈÉÉýÈÉÈÈÉÈÉÈÉöÈÉÈÉÈÉÉÈÉÈÈÉûÈÉÉÈÉÉöÈÉÈÉÉÇÈÈÇÈÈþÇÈÈþÇÈÈøÇÈÈÇÈÈÇÈÈþÇÈÈûÇÈÇÈÇ>ÇýÆÇÆÆûÇÆÆÇÆÆÇÆþÇÆÆÇÆûÇÆÆÇÆÆþÇÆÆþÇÆÆþÇÆCÆÿ?ÍFçþæçwçæüçæçææþçæ æûçæççæ æõçææçææççæçææþçææåæýåæååæåæåùæååæååææåþæååæåöæååææåæåæååùæåæåæåææåýæäååäüåäåääåþäååøäåäåäååääåäåýäåääýåäååäåäþåääùåäãäããä äþãääüãäãääþãääûãäããä äþãää‚ãâãâãâûãââãââãâòãâããâãâãâããââããâóãââãââãâãâããââáâáâþáââáâáýâáââûáâáâááâúáââááââáâáûàááàááþàááþàááþàá áþàááüàáàáá€àþßààûßàßàßßàýßàßßãàßàßààßààßààßßààßàßßààßààßßàßßàßàßÞßýÞßÞÞßüÞßßÞÞßÞûßÞÞßÞÞßûÞßÞßÞÞßûÞßÞÞßßÞÝùÞÝÞÝÞÝÞ ÞüÝÞÝÞÞþÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞþÝÞÞ?ÝÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜÝÜþÝÜÜÝBÜþÛÜÜþÛÜÜûÛÜÛÜÛÛÜöÛÜÜÛÜÛÛÜÜÛÛÜÛÜüÛÜÜÛÛüÜÛÜÛÛÜùÛÜÜÛÚÚÛÛþÚÛÛÚÛþÚÛÛÚÛûÚÛÛÚÛÛþÚÛÛþÚÛÛþÚÛÛ@ÚÙÚÙÚÙÚýÙÚÙ ÙûÚÙÙÚÙÙþÚÙÙüÚÙÚØØøÙØÙÙØØÙØØÙòØÙÙØØÙÙØØÙØØÙØØÙØÙñØÙØØÙØØÙÙØÙØÙÙØDØ×ØþרØþרØþרØþרØþרØ×ýØ×ØØùר×ררØùרØ×ØØ×@×Öþ×ÖÖþ×ÖÖþ×ÖÖø×Ö×Ö×Ö×ÖÖþ×Ö Öþ×ÖÖÕþÖÕÕøÖÕÖÕÖÕÖÕÕþÖÕÕûÖÕÕÖÕÕþÖÕÕÖÕûÖÕÕÖÕÕþÖÕÕÖÕÖÕþÔÕÕÔÕüÔÕÔÕÕúÔÕÔÕÔÕÕ÷ÔÕÔÕÔÕÔÕÔÔóÕÔÔÕÕÔÔÕÔÔÕÔÕÕ€ÔúÓÔÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓùÔÓÓÔÓÔÓÓúÒÓÓÒÓÒÒýÓÒÓÓÒòÓÒÒÓÓÒÒÓÒÓÒÓÒÓÓÒÓÒôÓÒÓÒÓÒÓÒÓÒÓÒÒûÑÒÑÑÒÒÑúÒÑÑÒÒÑÑøÒÑÒÑÒÑÒÑÑþÒÑÑÒôÑÒÒÑÑÒÑÒÒÑÑÒÒÑÒÑÒÑÐþÑÐÐþÑÐÐùÑÐÐÑÐÑÐÐþÑÐÐþÑÐÐüÑÐÐÑÑÐûÑÐÐÑÐÐþÑÐÐÏûÐÏÐÐÏÏþÐÏÏÐþÏÐÐûÏÐÐÏÐÐüÏÐÏÐÐÏþÐÏÏåÐÏÏÐÏÏÐÏÐÏÏÐÏÏÐÏÐÎÏÎÏÎÏÎÏÎÏÏùÎÏÏÎÏÎÏÏ÷ÎÏÎÎÏÎÏÎÏÏõÎÏÎÎÏÏÎÏÏÎÏÏþÎÏÏÎÏûÎÏÎÍÎÎþÍÎÎûÍÎÍÍÎÎúÍÎÍÎÍÎÎøÍÎÎÍÎÎÍÎÎþÍÎÎÍ ÎþÍÎ΀ÍÌÍüÌÍÍÌÌûÍÌÍÍÌÌÍÌÍýÌÍÌÌøÍÌÍÌÍÍÌÍÍÌþËÌÌùËÌËÌËÌËËüÌËÌËËùÌËÌËËÌËËüÌËÌËËÌþËÌÌþËÌÌËÌþËÌÌËýÌÊËËÊýËÊË ËÊýËÊËËûÊËËÊËËþÊËËùÊËÊËÊËÊ>ÊÉóÊÉÊÊÉÊÊÉÊÉÉÊÉÉþÊÉÉúÊÉÉÊÊÉÉüÊÉÊÉÉþÊÉAÉÈ÷ÉÈÉÉÈÉÉÈÉÉÈÉÈÉþÈÉÉüÈÉÈÉÉþÈÉÉøÈÉÈÈÉÉÈÉÉÈõÇÈÈÇÈÇÇÈÈÇÈ ÈþÇÈÈþÇÈÈÇÈûÇÈÈÇÈ È÷ÇÈÇÈÇÇÈÈÇ<ÇüÆÇÇÆÆÇÆþÇÆÆÇÆÇýÆÇÆ ÆúÇÆÆÇÇÆEÆ?Íçþæç™çþæç&çþæçóçæþçææþçææûçææçææúçææççææûçææçææüçæçææþçææþçææúçæçææååæüåææååþæååóæååæååæååæååææåæåþæååýæåææåùæåæåæäååþäååþäååþäååöäååääååääååöäååääååääååäåùäååääåääþãää÷ãäãääãäãääüãäãääúãääããääãòäãäãäãääãääãäã~ãøâãâãâããââýãâããâãùâãâãâãââþãââã âýãâããâþáââþáââþáââüáâáââüáâáââüáâáââáðâáâáâáâááââáâáàá áþàááàýáàááþàááüàáàááàáàá€àßàßüàßßààßàßàûßàßàßßàøßààßßàßààüßàßààßàßþÞßßûÞßßÞßßÞßûÞßßÞßßÞßþÞßßÞößÞßÞÞßßÞÞßßþÞßßþÞßßÞþÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞûÝÞÝÝÞÞÝÞÝÞþÝÞÞ@ÝÜþÝÜÜþÝÜ ÜøÝÜÝÝÜÜÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜGÜÛñÜÛÛÜÛÛÜÛÛÜÜÛÛÜÛÛÜÛÜõÛÜÜÛÛÜÛÜÜÛÜÜýÛÜÛÛýÜÛÜÜ÷ÛÜÛÜÜÛÜÚÛÛüÚÛÛÚÚÛþÚÛÛþÚÛÛþÚÛÛ?ÚýÙÚÙÙþÚÙ ÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙ ÙùÚÙÚÙÙØÙÙýØÙØØùÙØÙÙØØÙÙþØÙÙØþÙØØÙüØÙØÙÙùØÙØØÙÙØØ÷ÙØØÙÙØØÙØØþÙØCØþר ØþרØþרØþרØòרØ×ØØ×ØØ×ØØ×ØØø×ØØ×Ø×Ø×>×Öó×ÖÖ×Ö×ÖÖ××Ö×ÖÖþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖþ×ÖÖ÷×Ö×Ö××Ö×ÖÖþ×ÖÖÕÖÕÖÕúÖÕÖÕÕÖÖùÕÖÕÕÖÖÕÕÖÕÖþÕÖÖýÕÖÕÕþÖÕÕúÖÕÖÕÖÕÕÔÕÔøÕÔÕÔÕÔÔÕÕüÔÕÔÕÕùÔÕÔÕÕÔÕÕïÔÕÕÔÔÕÔÔÕÔÕÕÔÕÔÔÕÕþÔÕÕ€ÔýÓÔÓÓþÔÓÓþÔÓÓþÔÓÓÒùÓÒÓÒÓÓÒÒûÓÒÒÓÒÒÓÒÓþÒÓÓÒþÓÒÒÓÒÓ ÒÑÒüÑÒÑÒÒûÑÒÒÑÒÒüÑÒÑÒÒøÑÒÑÒÑÒÑÒÒþÑÒÒþÑÒÒ‚ÑÐüÑÐÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐÑÐþÑÐÐùÏÐÏÐÐÏÐÐíÏÐÏÏÐÏÐÏÐÏÏÐÏÏÐÐÏÐÏÏÐüÏÐÐÏÏøÐÏÏÐÐÏÐÏÏÐïÏÐÏÐÏÎÏÎÏÎÎÏÎÏÎÏÎÎûÏÎÏÎÏÏþÎÏÏÎÏÎôÏÎÏÏÎÎÏÏÎÏÎÏÏùÎÏÎÎÏÎÏÏýÎÏÎÎþÍÎ ÎûÍÎÎÍÎÎþÍÎÎþÍÎÎþÍÎÎûÍÎÎÍÎÎÍÎÍüÌÍÍÌÌÍþÌÍÍÌøÍÌÍÍÌÍÍÌÌöÍÌÌÍÍÌÍÌÌÍÍöÌÍÌÍÌÌÍÌÍÌÌìÍÌÍÍÌÌÍÌÌËÌËÌÌËÌÌËÌËËüÌËËÌÌË÷ÌËÌËËÌËÌËËýÌËÌÌËÌËÌúËÌËÌËÌÌðËÌËÌÌËÊÊËËÊÊËËÊËËÊËþÊËËùÊËËÊËÊËËþÊËËüÊËËÊÊËþÊËËþÊËË?ÊÉüÊÉÊÉÉýÊÉÊÊ ÉþÊÉÉþÊÉÉÊÉþÊÉÉúÊÉÊÉÊÉEÉÈîÉÈÉÈÈÉÈÉÈÉÉÈÉÉÈÉÉÈÈüÉÈÈÉÉÈýÉÈÉÉÈÉüÈÉÈÉÉÈÉüÈÉÉÈÈüÇÈÇÈÈþÇÈÈûÇÈÇÇÈÈÇ ÈÇÈþÇÈÈþÇÈÈÇÈ@ÇÆüÇÆÇÆ ÆþÇÆÆûÇÆÆÇÆÆÇýÆÇÆÆþÇÆÆþÇÆÆÇ?Æ?ÍÀçýæçææçýæçææúçææçæççòæçæçææçæçææççæ æþçææåþæååùæååæååææúåææåæååþæååþæååøæååæåææååæþåææåäùåääååäååûäåäåääúåäååäååùäåäååäååéäååäåääåäåäåäåäåäåääååääòãääããääãäããäãääãäøãäããääãääþãääþãääãäãâøãââãââãââöãââãâãâãâããýâãââãâãâþãââþãââúãââããââ÷áâááââááââáâáøâááââááââóáâááââááâáââááâþáââáþàááþàááþàááúàáàáàááàáþàááþàááüàáàáá„àþßààüßààßßþàßßàþßààüßààßßàßúàßßààßßàýßàßßþàßßÞþßÞÞßþÞßßøÞßßÞÞßÞßßÞþßÞÞþßÞÞßþÞßßÞÝÞÝÞüÝÞÝÞÞõÝÞÞÝÞÞÝÞÞÝÞÞþÝÞÞþÝÞÞþÝÞÞAÝÜþÝÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜöÝÜÝÜÝÜÜÝÝÜÜÝýÜÝÜÜÝ?ÜÛÜûÛÜÜÛÜÜúÛÜÜÛÛÜÜúÛÜÛÛÜÛÛýÜÛÜÜþÛÜÜìÛÜÛÜÜÛÜÛÜÜÛÜÜÛÜÜÛÜÛÜÜþÚÛÛøÚÛÚÛÛÚÚÛÛþÚÛ#ÛþÚÛÛ?ÚýÙÚÙÙþÚÙ ÙúÚÙÙÚÚÙÙþÚÙÙÚÙÚÙþÚÙÙØþÙØØúÙØØÙÙØØÙòØÙØÙØÙØØÙÙØÙÙØØùÙØÙÙØÙØØùÙØÙÙØÙØØûÙØØÙØCØþרØþרØüררØ×ØþרØþרØýר×@×Öþ×ÖÖú×ÖÖ××ÖÖ×Öü×Ö×Ö Ö×Ö×Öø×ÖÖ×ÖÖ×ÖÖÕÖÕÖúÕÖÖÕÖÕÕëÖÕÕÖÖÕÕÖÖÕÕÖÕÖÕÖÖÕÕÖÕÕþÖÕÕþÖÕÕÖûÕÖÕÖÕÕþÖÕÕüÔÕÔÕÕüÔÕÔÕÕûÔÕÔÕÔÔúÕÔÔÕÕÔÔÕþÔÕÕþÔÕÕùÔÕÕÔÕÕÔÔÕýÔÕÔÔüÕÔÕÔÔÓûÔÓÓÔÓÓùÔÓÔÔÓÔÓ ÓÔÓÔÓûÔÓÔÔÓÓþÔÓÓ ÒþÓÒÒþÓÒÒúÓÒÓÒÓÒÒþÓÒÒÓÒÓ÷ÒÓÓÒÒÓÒÓÒÒÓóÒÓÒÓÒÓÒÒÑÒÑÒÑÑÒþÑÒÒÑÒýÑÒÑÑÒÑÒþÑÒÒõÑÒÑÒÑÑÒÒÑÑÒÒ€ÑÐþÑÐÐþÑÐÐÑÐüÑÐÑÐÐùÑÐÑÐÐÑÐÐþÑÐ ÐüÑÐÑÐÐúÑÐÏÏÐÏÏýÐÏÐÐøÏÐÏÐÏÏÐÏ ÏýÐÏÐÐÏÐÏþÐÏÏþÐÏÏþÎÏÏûÎÏÏÎÏÏÎÏÎÏÎþÏÎÎÏúÎÏÏÎÎÏÏÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎûÍÎÍÍÎÎþÍÎÎÍÎþÍÎ ÎÍýÌÍÌÌùÍÌÍÌÌÍÌÌþÍÌÌüÍÌÍÌÌÍÌúÍÌÌÍÌÍÍÌÍÌüÍÌÌÍÍúÌÍËÌËÌÌúËÌÌËÌËËûÌËÌÌËËÌËÌöËÌÌËËÌÌËËÌÌþËÌÌËþÌËËòÌËËÌÌËÌËËÌËËÊËËüÊËÊËËûÊËËÊËËúÊËËÊÊË ËþÊËË@ÊÉüÊÉÊÉ ÉûÊÉÉÊÉÉþÊÉÉÊõÉÊÉÉÊÉÊÉÉÊÉBÉÈýÉÈÉ ÉþÈÉÉÈûÉÈÉÈÉÉüÈÉÈÉÉÈÉþÈÉÉÈÉýÈÇÈ ÈöÇÈÇÈÇÈÈÇÇÈÈÇöÈÇÈÈÇÈÈÇÇÈÈÇÈþÇÈÈ?ÇÆüÇÆÇÆÆûÇÆÆÇÆ ÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆûÇÆÇÇÆ@Æÿ?ÍÀçæþçææþçææþçææûçæççæ æþçææçæþçææýçæççæþçææýåæååæúåæååæååæýåæååôæåææåæååæåæååæåæùåæåææåææþåääåùäåäåääååþäååôäååääåääååäååäøåäåääååääüåääååäûãääãääþãä äûãääãä äãäþãää€ãôâãâãâããâããâããúâããââããþâããâöãââããâãâãââþãââãâþãââãýâãââùãâááââááâûáââáââþáââáøâáâááâáââáýâáââáâþáââúáââáâááþâááþàááüàáàááþàááþàááàúáàááàááüàáàááàáúàáàáàááàßàüßàßààßþàßßþàßßûàßßàßßàüßààßßàýßàßßþàßßëÞßÞßßÞÞßÞßßÞßÞßÞßÞßÞßßóÞßÞßÞÞßßÞÞßÞßßÞýßÞßßþÞßßÞýßÞßßÞüßÞÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞûÝÞÞÝÞÞÝÞþÝÞ Þ+ÝþÜÝÝÜþÝÜÜþÝÜÜûÝÜÜÝÜÜúÝÜÜÝÝÜÜþÝÜÜþÝÜÜüÝÜÝÜÜÝFÜÛøÜÛÛÜÛÜÛÜÜýÛÜÛÛÜüÛÜÛÜÜ÷ÛÜÜÛÜÜÛÜÛÛÜþÛÜÜÛÜùÛÜÜÛÜÜÛÛþÚÛ ÛþÚÛÛûÚÛÛÚÛ ÛþÚÛÛþÚÛ Û@ÚûÙÚÙÚÙÙþÚÙÙûÚÙÚÚÙ ÙþÚÙÙþÚÙÙÚ ÙØþÙØØûÙØÙÙØØûÙØØÙØØ÷ÙØÙØÙØÙØÙÙïØÙØÙØÙØØÙØØÙÙØÙÙØ>Ø×ØþרØþרØ×Ø×ØþרØþרØ×ØþרØþרØûרØ×Ø Ø?×Öþ×Ö Öþ×ÖÖþ×ÖÖþ×ÖÖú×Ö×Ö×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖù×ÖÖÕÖÕÖÖìÕÖÖÕÖÕÖÕÖÖÕÕÖÖÕÖÕÕÖÕÕøÖÕÕÖÕÖÕÖÖÕÖ÷ÕÖÖÕÖÕÕÖÕÕýÔÕÔÔÕüÔÕÕÔÔÕùÔÕÔÔÕÔÕÕþÔÕÕôÔÕÕÔÔÕÔÕÔÔÕÔÔûÕÔÕÔÕÕõÔÕÕÔÔÕÔÔÕÕÔ~ÔýÓÔÓÓãÔÓÓÔÓÔÓÓÔÓÔÓÔÔÓÔÓÓÔÔÓÔÓÓÔÓÓÔÓÓ÷ÔÓÔÓÓÔÓÔÓ ÓÔÓÔüÓÒÓÒÒÓýÒÓÒÒýÓÒÓÓÒþÓÒÒÓüÒÓÓÒÒùÓÒÓÒÒÓÒÒÓýÒÓÒÒþÓÒÒÓýÒÓÒÒÑýÒÑÒÒÑÒöÑÒÑÒÑÒÑÒÑÒÒÑÒÑüÒÑÑÒÒþÑÒÒøÑÒÒÑÒÒÑÒÒüÑÒÒÑ~ÑÐ÷ÑÐÑÐÑÐÑÑÐÐûÑÐÐÑÐÐþÑÐÐþÑÐÐóÑÐÐÑÐÑÐÐÏÐÏÐÏÏÐÏþÐÏÏÐÏúÐÏÐÏÐÏÏþÐÏÏùÐÏÏÐÏÐÏÏûÐÏÏÐÏÏÐûÏÐÏÐÏÏÎÏùÎÏÎÎÏÎÏÏüÎÏÎÏÏþÎÏÏóÎÏÎÏÏÎÎÏÏÎÏÎÏÏÎÏÎþÏÎÎþÏÎÎüÍÎÍÎÎþÍÎÎûÍÎÎÍÎÎíÍÎÎÍÎÎÍÎÎÍÎÎÍÍÎÎÍÍÎÎúÍÎÍÎÍÎÎÍÌ÷ÍÌÍÌÍÍÌÍÌÌüÍÌÍÌÌøÍÌÌÍÌÌÍÌÌþÍÌÌþÍÌÌøÍÌÌÍÌÍÌÍÍÌøÍÌÍËÌÌËÌÌËþÌËËÌòËÌÌËÌÌËÌËÌÌËËÌÌüËÌËÌÌüËÌÌËËúÌËÌËËÌÌËúÊËÊËÊËËþÊËËþÊËËþÊËËúÊËËÊÊËËúÊËËÊËÊ>ÊÉöÊÉÊÉÉÊÊÉÊÉÉûÊÉÉÊÉÉÊÉþÊÉÉÊ÷ÉÊÉÊÊÉÉÊÉÉþÊÉAÉúÈÉÈÉÉÈÈþÉÈÈøÉÈÉÈÈÉÉÈÈýÉÈÉÉüÈÉÉÈÈõÉÈÉÉÈÉÉÈÉÈÉÉþÈÉÉþÈÉÉûÈÉÈÇÈÈþÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈùÇÈÇÈÈÇÈÈ@ÇÆþÇÆÆþÇÆÆôÇÆÆÇÆÇÆÇÆÆÇÆÆüÇÆÇÆÆûÇÆÆÇÆ ÆþÇÆBÆ?Í çþæç"çþæçŒçæûçææçææçæþçææûçææçææþçææþçææþçææþçææöåæåæåæåææååöæåæåæåææåææåæåæõåæåææåææåæååæåûæåææååäýåäååþäååþäååäüåääååüäåäååùäåäååäååäåøäåäåääåääþãä-äþãääúãäãäãää€ãýâãââãâã÷âãâãâããâããâñãâããââããââãâãâããâãüâããââüãâãââáâáþâááâáâáâüáâáââüáâáââáâþáââáâøáâáàáààááúàááààáá÷àáààááàáààáþàááþàááýàáà~àßüàßàßßþàßßüàßàßßöàßàßàßààßààßüàßßààþßààßàýßÞßßÞßüÞßßÞÞùßÞÞßÞßÞÞûßÞÞßÞÞßøÞßÞÞßßÞßßþÞßßþÞßßþÞßßúÞßßÞÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞÝÞþÝÞÞþÝÞÞÝÞÝÞøÝÞÞÝÞÝÝÞÞÝþÜÝ"Ý ÜþÝÜÜþÝÜÜÝÜüÝÜÝÜÜþÝÜHÜÛÜýÛÜÛÛüÜÛÜÛÛøÜÛÜÛÜÜÛÜÜúÛÜÛÜÛÜÜøÛÜÛÛÜÛÜÛÛÜÛÜÛýÜÛÜÜÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛÚÛþÚÛÛÚÛÚÛýÚÛÚÚþÙÚ+ÚýÙÚÙÙÚÙüÚÙÚÙÙûÚÙÙÚÙÙþÚÙÙÚûÙÚÙÚÙÙøÚÙÚÙÙÚÚÙÙîØÙØÙØØÙÙØÙØÙØØÙØØÙÙØÙüØÙÙØØþÙØØÙýØÙØØþÙØØùÙØÙØÙÙØBØþרØùרר×רØþר ØöררØ×ØØ×ØØûר×רØþרØ@×Öþ×ÖÖþ×ÖÖö×Ö×Ö×Ö×Ö×ÖÖû×ÖÖ×ÖÖ×÷Ö××Ö×ÖÖ×ÖÖ×ýÖ×ÖÖþÕÖÖÕöÖÕÖÖÕÕÖÕÖÕ ÕýÖÕÖÖÕÖÕùÖÕÖÕÕÖÕÕÖûÕÖÕÖÕÕþÔÕÕöÔÕÔÔÕÕÔÕÔÕÕÔÕüÔÕÕÔÔýÕÔÕÕûÔÕÕÔÕÕûÔÕÕÔÕÕÔüÕÔÔÕÕÔóÓÔÓÔÓÔÓÓÔÔÓÔÓÓÔÓþÔÓ ÓÔÞÓÔÓÓÔÓÓÔÓÓÔÓÔÓÓÔÓÔÓÓÔÓÓÔÒÒÓÒÒÓÒÒÓÒÒüÓÒÒÓÓÒÓòÒÓÓÒÓÓÒÓÒÓÒÒÓÒÒÓÒÓÒÓòÒÓÒÒÓÒÒÓÒÒÑÒÒÑÑûÒÑÑÒÑÑÒÑÒãÑÒÑÑÒÑÒÑÑÒÑÑÒÑÒÒÑÑÒÒÑÑÒÑÑÒÑÒÑÑüÒÑÑÒÒÑýÐÑÐ ÐþÑÐÐÑÐÑÐüÑÐÑÐÐüÑÐÑÐÐÑÐþÑÐÐÑÏüÐÏÐÏÏþÐÏÏûÐÏÏÐÏÏóÐÏÐÏÏÐÐÏÏÐÏÐÏÏ ÐÏþÐÏÏÐÏÐÏþÎÏÏÎÏÎÏþÎÏÏÎýÏÎÏÏÎúÏÎÏÏÎÏÏúÎÏÏÎÏÎÎÏÎÏ ÎþÍÎÎ÷ÍÎÎÍÎÎÍÍÎÎÍÎÍÎþÍÎÎþÍÎÎýÍÎÍ~ÍÌÍÌøÍÌÌÍÍÌÍÌÌÍÌúÍÌÍÌÌÍÍÌþÍÌÌþÍÌÌÍÌþÍÌÌûËÌËËÌÌùËÌÌËÌËÌÌËÌþËÌÌýËÌËËøÌËÌËÌËËÌÌþËÌÌüËÌÌËËþÊËËþÊËËÊöËÊÊËËÊÊËÊËËûÊËËÊËËÊËÊËûÊËËÊËËAÊüÉÊÊÉÉþÊÉÉÊÉþÊÉ ÉÊÉÊÉúÊÉÉÊÊÉ@ÉþÈÉÉþÈÉÉþÈÉÉöÈÉÉÈÉÈÈÉÈÉÉüÈÉÈÉÉÈðÉÈÉÉÈÈÉÈÉÉÈÉÈÉÈÉÉÈùÉÈÈÇÈÇÈÈÇÈÇúÈÇÈÈÇÈÈûÇÈÈÇÈÈÇÈÇüÈÇÇÈ È?ÇÆþÇÆÆþÇÆÆþÇÆÆÇþÆÇÇùÆÇÇÆÆÇÆÆûÇÆÆÇÆÆþÇÆÆþÇÆ@Æ?ÍþæçäçþæçØçæþçææþçææçæçæüçæçææþçææþçææåúæåæåæååûæåææååþæååæùåææååæåå÷æåæåæåææååæåæüåææååøäåäååääååþäååä åüäååääåäåäåäûãääãääûãäããääþãääãøäãääãäãää€ãþâããâòãââãââãâããâãâããâþãââüãâãââãýâãââþãââáâýáâááâüáâáââáâþáââáâðáâáâáâááââááâáâááþàáá÷àááààááàááüàáàááþàááàáþàá áþàááàßàßüàßßààßüàßàßßüàßàßßûàßààßßàþßààßþàßßýàßààßþÞßßüÞßÞßßþÞßßüÞßÞßßÞûßÞßÞßßõÞßÞßÞßÞßßÞßßÞýßÞßßüÞßßÞÞûÝÞÝÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞýÝÞÝ>ÝÜþÝÜÜùÝÜÜÝÜÝÜÜÝÜûÝÜÝÝÜÜûÝÜÜÝÜÜÝÜüÝÜÝÜÜþÝÜCÜÛýÜÛÜ ÜþÛÜÜýÛÜÛÛúÜÛÜÛÛÜÜþÛÜÜûÛÜÜÛÜÜÛÜõÛÜÛÛÜÚÛÚÛÚÛÛþÚÛÛþÚÛÛþÚÛÛÚ ÛþÚÛÛþÚÛÛþÚÛÛ+ÚþÙÚÚÙûÚÙÙÚÙÙþÚÙ ÙþÚÙÙüÚÙÚÙÙÚÙþÚÙÙþÚÙÙþÚÙÙØþÙØØþÙØØþÙØØÙûØÙØØÙÙØöÙØÙØØÙØÙØÙÙúØÙØÙØÙÙýØÙØDØþרØþרØþרØ×Ø×ýØ×ØØþרØþרØþרØüרØ×>×Öþ×ÖÖû×Ö××ÖÖþ×ÖÖû×Ö××ÖÖ×ýÖ×ÖÖþ×ÖÖ×Öþ×ÕÕÖÕùÖÕÖÕÕÖÕÕÖüÕÖÕÖÖûÕÖÕÕÖÖÕþÖÕÕÖýÕÖÕÕÖúÕÔÕÔÕÔÔÕþÔÕÕÔÕÔÕÔýÕÔÕÕÔüÕÔÕÔÔÕÔþÕÔ~ÔýÓÔÓÓÔÓÔÓþÔÓÓþÔÓ ÓþÔÒÒüÓÒÓÒÒõÓÒÒÓÒÒÓÒÓÒÓÓüÒÓÒÓÓÒþÓÒÒÓøÒÓÓÒÒÓÓÒÒÓïÒÓÓÒÓÒÒÓÒÒÑÒÒÑÒÑÒÒûÑÒÒÑÒÒþÑÒÒÑþÒÑÑþÒÑÑÒþÑÒÒÑÒüÑÒÒÑ~ÑÐþÑÐÐþÑÐÐÑÐÑøÐÑÐÑÐÐÑÐÐþÑÐÐýÏÐÏÏþÐÏÏïÐÏÐÏÐÐÏÐÏÐÏÐÏÐÏÐÏÏÐÏÐüÏÐÐÏÏÐÏõÐÏÏÐÐÏÏÐÏÏÎÎÏÎÏøÎÏÏÎÏÎÎÏÏþÎÏÏÎÏÎÏéÎÏÎÏÎÏÎÏÎÏÏÎÏÏÎÏÎÎÍÎÎÍÎÎÍÎþÍÎÎùÍÎÎÍÎÍÎÎÍýÎÍÎÎùÍÎÎÍÎÍÎÎûÍÎÎÍÎÎýÍÎÍ€ÍúÌÍÍÌÍÌÌÍûÌÍÌÍÌÌÍÌõÍÌÍÌÌÍÌÌÍÍÌÌþÍÌÌùÍÌÍÌÌÍÌÌþÍÌÌþËÌÌþËÌÌüËÌËÌÌËÌúËÌÌËËÌÌþËÌÌùËÌËÌËËÌÌËÌøËÌËÌÌËÌËËþÊËËþÊËËþÊËËûÊËËÊËËþÊËËþÊË ËüÊËÊËË@ÊùÉÊÉÊÉÊÉÉþÊÉÉüÊÉÊÉÉÊÉùÊÉÊÉÉÊÉÉüÊÉÊÉÉúÊÉÊÉÊÉBÉÈøÉÈÈÉÉÈÉÈÈÉíÈÉÈÉÈÉÉÈÉÈÈÉÈÉÈÉÉÈÉÉþÈÉÉÈúÉÈÉÉÈÉÉþÈÉÉýÈÉÈ ÈþÇÈÈþÇÈÈþÇÈÈúÇÈÈÇÈÇÇ ÈþÇÈÈþÇÈ ÈÇþÆÇ'ÇÆþÇÆÆþÇÆÆûÇÆÆÇÆÆüÇÆÇÆÆÇÆøÇÆÇÇÆÆÇÆ ÆþÇÆÆþÇÆCÆÿ?ÍýçæçîçþæçDçþæç†çæþçææïçææçææçææççæçææçææþçæ æûçææçææûçææçææçæûåææåææåæýåæååúæååææååøæåææååæååþæååþæååæþäååäåäûåääåääýåäååüäåäååþäååäåúäååääååäå äþãääþãääþãääãäþãääùãäãäããääþãääüãääã~ãâãâþãââûãâãâããâùãâãââãââûãââãââãâãâãâüãâãââþáââáâþáââáâüáââááâïáââááââáââááââááââûáâáàááüàáàá áþàááûàááàááúàáàáàááþàááüàááà~àóßàßàßßàßàßààßßüàßàßßàßûàßààßß÷àßàßààßàßßàß÷àßßààßÞÞßßûÞßßÞßßýÞßÞÞòßÞßÞßßÞßÞßßÞÞßßÞßÞïßÞÞßÞßÞÞßßÞÞßßÞÞßßÞüÝÞÝÞ ÞøÝÞÞÝÞÞÝÞÞüÝÞÝÞÞ?ÝýÜÝÜÜÝÜüÝÜÝÜÜþÝÜÜüÝÜÝÜÜùÝÜÜÝÜÝÜÜúÝÜÜÝÝÜÜûÝÜÝÜÝÝEÜ÷ÛÜÜÛÜÛÛÜÛÛÜþÛÜÜþÛÜÜûÛÜÛÜÛÛýÜÛÜÜþÛÜÜþÛÜÜÛÜþÛÜÜýÛÜÛÛÚüÛÚÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛÛþÚÛ Û=ÚþÙÚÚõÙÚÙÚÙÚÙÚÙÚÙÙøÚÙÙÚÙÚÚÙÙþÚÙÙûÚÙÙÚÙÙþÚÙÙüÚÙÙÚÚÙÚÙþÚØØüÙØÙØØÙüØÙÙØØÙØûÙØØÙØØúÙØØÙØÙÙØþÙØØùÙØÙØÙØÙÙGØ×ØþרØþרØþרØþרØþרØûרØ×ØØþרØüרØ×>× Öþ×ÖÖü×Ö×ÖÖü×Ö×ÖÖü×Ö×ÖÖ× Öþ×Ö ÖýÕÖÕÕþÖÕÕýÖÕÖÖÕÖÕúÖÕÖÕÖÕÕýÖÕÖÖÕûÖÕÖÖÕÕÔøÕÔÕÔÕÕÔÕÕÔÕþÔÕÕÔÕÔÕÔþÕÔÔýÕÔÕÕþÔÕÕúÔÕÕÔÕÔZÔþÓÔ!ÔÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓ ÓþÔÓÓìÔÓÒÓÒÓÒÓÓÒÓÒÓÒÓÓÒÒÓÒÒÓþÒÓÓÒúÓÒÒÓÓÒÒþÓÒÒÓýÒÓÒÒëÓÒÓÒÒÓÒÒÑÒÒÑÒÑÒÑÒÒÑÑÒÒÑÒ÷ÑÒÑÑÒÒÑÒÑÑ÷ÒÑÒÒÑÒÑÑÒÒþÑÒÒùÑÒÑÒÒÑÒÒ€ÑÐÑøÐÑÐÐÑÐÑÐÐÑÐþÑÐÐÑÐþÑÐÐþÑÐÐþÑÐÐöÑÐÑÐÐÑÐÐÑÐÐÏþÐÏÏþÐÏÏÐþÏÐÐÏðÐÏÏÐÏÐÏÏÐÏÐÏÐÏÐÏÏþÐÏÏÐÏüÐÏÐÏÏþÎÏÏÎÏþÎÏÏþÎÏÏÎÏþÎÏÏÎÏûÎÏÏÎÏÏýÎÏÎÎÏòÎÏÎÏÏÎÏÎÏÎÏÎÍÎÎÍúÎÍÎÎÍÎÎúÍÎÎÍÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎÍÌûÍÌÍÍÌÌþÍÌÌïÍÌÌÍÌÍÍÌÍÌÍÌÌÍÌÍÌÌøÍÌÍÌÍÌÍÌÌþÍÌÌùÍÌÌÍÌÍÌÌýËÌËËÌËùÌËÌÌËÌËËôÌËËÌËËÌÌËËÌËËÌþËÌÌõËÌÌËÌÌËÌËÌËËüÊËÊËËûÊËÊÊËËüÊËÊËËüÊËÊËËûÊËÊÊËËýÊËÊ>ÊýÉÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉCÉÈÉüÈÉÈÉÉûÈÉÈÈÉÉÈþÉÈÈÉÈÉÈñÉÈÉÉÈÈÉÈÉÉÈÉÉÈÉÉüÈÉÉÈÈûÇÈÈÇÈÈþÇÈÈûÇÈÈÇÈÈþÇÈÈþÇÈÈÇÈýÇÈÇ@ÇÆÇÆþÇÆÆûÇÆÆÇÆÆüÇÆÇÆÆûÇÆÇÇÆÆüÇÆÇÆ>Æ?Í=çþæççþæç/çþæç8çæçæþçææþçææüçæçææþçææüçæçææüçæçææþçææûçææçææûåææåææåæåæåæûåæååææåæþåææåþæååúæååææååæåäüåääååäåþäååäåþäååäåäåþäååäåøäåääååäååþãääþãääþãääãäþãääþãääòãääãäãäãääãäãääúãääãäã€ãýâãââúãâãâãââþãââãýâãââãýâãââãâûãââãââãâãôâãââááââááâááþâááâûáââáââáâüáâáââþáââáûâááâááâáâþàááøàáàáàáàááûàááàááàáþàááþàááþàááþàááúàáàááà~àßúàßßààßßþàßßûàßààßßùàßààßàßßàóßàßààßßàßààßààûßàßàßßþàßßýÞßÞÞýßÞßßÞüßÞÞßßýÞßÞÞþßÞÞßþÞßßÞßûÞßßÞßßÞÝÞüÝÞÝÞÞûÝÞÞÝÞÞþÝÞÞüÝÞÝÞÞÝþÜÝÝþÜÝÝÜÝÜÝÜþÝÜÜÝ ÜÝÜüÝÜÝÜCÜÛÜÛûÜÛÜÛÜÜüÛÜÛÜÜþÛÜÜÛÜÛþÜÛÛîÜÛÛÜÜÛÜÛÜÜÛÛÜÛÛÚÚÛÛûÚÛÛÚÛÛþÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛ?ÚÙÚÙþÚÙÙþÚÙÙÚ ÙüÚÙÚÙÙþÚÙÙûÚÙØÙØØÙØÙüØÙÙØØÙØýÙØÙÙØüÙØÙØØÙþØÙÙØÙýØÙØCØ×Øþר ØþרØþרØø×Ø×ØØ×Ø×רþר ØüרØ×>×Ö×Ö×Öþ×ÖÖ×Öþ×ÖÖ×Ö×þÖÕÕÖÕøÖÕÖÕÖÕÖÕÕÖ÷ÕÖÕÕÖÕÕÖÕÕÖþÕÖÖúÕÖÕÖÖÕÕ÷ÖÕÕÖÕÖÕÕÖÖúÕÖÕÕÖÕÕÔÕþÔÕÕÔÕûÔÕÔÔÕÕúÔÕÔÔÕÔÔÕÔÕÔÕÔÕûÔÕÔÔÕÕÔÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓÔÓþÔÓÓþÔÓÓþÔÓÓÔÓÒ÷ÓÒÒÓÒÒÓÓÒÒøÓÒÒÓÓÒÓÒÒüÓÒÒÓÓùÒÓÒÒÓÓÒÒþÓÒÒÓøÒÓÒÒÓÓÑÒÒÑ÷ÒÑÑÒÑÒÒÑÒÒÑÒÑÒÑÒüÑÒÑÒÒÑõÒÑÒÑÑÒÑÒÒÑÒÒÑÐÑÐþÑÐÐÑÐþÑÐÐþÑÐÐûÑÐÐÑÏÏóÐÏÏÐÏÏÐÏÐÏÐÐÏÏÐÏúÐÏÐÐÏÐÐüÏÐÏÐÐÏÐÏýÐÏÐÐÏÐÏÎÏùÎÏÎÏÏÎÏÏÎúÏÎÏÏÎÏÏüÎÏÎÏÏÎÏÎÏúÎÏÎÏÏÎÎÏùÎÏÏÎÎÏÎÎþÍÎÎþÍÎ ÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎ ÎÍ΂ÍýÌÍÌÌûÍÌÍÌÍÍÌûÍÌÌÍÌÌüÍÌÍÌÌþÍÌÌüÍÌÍÌÌþÍÌÌÍ÷ÌÍÌÍÌÍÌÍËËÌùËÌËËÌÌËËÌËÌþËÌÌýËÌËËþÌËËÌËÊËþÊËËõÊËËÊËËÊËËÊËËþÊËËþÊËËøÊËËÊËËÊËËýÊËÊ?ÊÉþÊÉÉóÊÉÉÊÉÉÊÉÊÉÊÊÉÉÊ ÉÊ ÉüÊÉÊÉAÉÈÉÈÉþÈÉÉþÈÉÉúÈÉÈÈÉÈÈÉýÈÉÈÈøÉÈÉÉÈÉÈÉÉÈÉùÈÉÈÈÉÈÉÉ ÈÇÈþÇÈÈÇÈùÇÈÈÇÈÇÈÈþÇÈÈÇÈûÇÈÇÇÈÈüÇÈÈÇ?ÇõÆÇÇÆÆÇÆÆÇÇÆÆþÇÆÆûÇÆÇÇÆÆþÇÆÆùÇÆÇÆÇÇÆÆÇAÆ?Í çþæçÛçþæçÖçæþçææþçææþçæ æþçææçæùçæçææçææþçææåûæååæååüæååææåæåýæåææåþæååæåæåùæåææåäååäþåääåõäååääåääååääïåääåäåäåääåäåäåäååþäååùäåääåäååùäãääããääþãääúãäãäãääùãäãäããääþãääþãääãäãäãýâãââüãââããâãâúãââããââûãââãââþãââãâãûâããâããâáùâááââáââáâáâáùâááââáââ÷áâááâááâááâáúâáââáââøáâáââáàááþàááþàááàýáàááüàáàááþàááþàááþàááþàáá€àßüàßàßßþàßßüàßàßßàßøàßàßàßàßßàßàßûàßßàßßüàßÞßßÞßþÞßßÞßþÞßßþÞßßÞýßÞßßÞßÞþßÞÞüßÞÞßßûÞÝÞÝÞÞüÝÞÝÞÞþÝÞÞþÝÞÞþÝÞÞþÝÞÞÝÞþÝÞÞÝÞõÝÞÝÞÞÝÞÝÞÞÝ?Ý ÜÝÜþÝÜÜÝ ÜþÝÜÜþÝÜÜþÝÜÜÝCÜÛúÜÛÜÜÛÜÜÛÜþÛÜÜÛýÜÛÜÜÛýÜÛÜÜýÛÜÛÛÜôÛÜÛÜÜÛÜÜÛÛÜÛÛþÚÛÛüÚÛÚÛÛÚýÛÚÛÛþÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛþÚÛÛÚþÙÚ4ÚÙÚÙÚÙþÚÙÙ÷ÚÙÙÚÚÙÙÚÙÙÚöÙÚÙÚÙÙÚÙÙÚÚýÙÚÙÙûÚØØÙØØþÙØØüÙØØÙÙØÙ ØÙ÷ØÙÙØØÙÙØÙÙþØÙÙØþÙØCØüרר Øýר××Ø×Ø× ØþרØ×ØþרØ?×Öþ×ÖÖþ×ÖÖ×Öþ×Ö Öþ×Ö Ö×Öü×ÕÕÖÖÕÖÕÖÕþÖÕÕûÖÕÖÖÕÕÖýÕÖÕÕÖÕþÖÕÕÖÕüÔÕÔÕÕþÔÕÕûÔÕÕÔÕÕÔÕüÔÕÔÕÕûÔÕÔÔÕÕÔ÷ÕÔÕÕÔÔÕÔÕÕýÔÕÔÔûÓÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓþÔÓÓüÔÓÔÓÓÔÓÒÓûÒÓÓÒÓÓÒÓýÒÓÒÒÓÒÓúÒÓÒÒÓÒÒûÓÒÓÒÓÓùÒÓÒÒÓÓÒÒÓÒûÓÒÒÑÒÒêÑÒÒÑÒÑÑÒÒÑÑÒÑÒÑÑÒÑÑÒÒÑÑÒÑ÷ÒÑÒÒÑÒÑÑÒÒÑúÒÑÒÒÑÒÒ€ÑÐÑÐþÑÐ ÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐúÑÐÏÐÐÏÏÐÏõÐÏÐÐÏÏÐÐÏÏÐÐýÏÐÏÏúÐÏÐÏÐÏÏÐÏùÐÏÐÏÏÐÏÏûÐÎÏÏÎÎòÏÎÎÏÎÎÏÏÎÏÏÎÏÎÎýÏÎÏÏüÎÏÏÎÎýÏÎÏÏüÎÏÎÏÏþÎÏÏöÎÏÏÎÏÎÏÎÏÎÎýÍÎÍÍÎþÍÎ ÎþÍÎÎþÍÎÎÍûÎÍÎÍÎÎýÍÎÍ~ÍÌöÍÌÌÍÌÍÌÌÍÌÌÍÌýÍÌÍÍÌüÍÌÍÌÌþÍÌÌôÍÌÍÍÌÍÍÌÍÌÍÌÌþÍÌÌþÍÌÌËÌËÌòËÌÌËÌÌËËÌËÌÌËÌÌËþÌËËüÌËËÌÌüËÌËÌÌòËÌÌËËÌËÌÌËËÌÌËËÊËþÊËËøÊËÊÊËÊÊËËûÊËËÊËËüÊËÊËËþÊËËÊË?ÊÉþÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉûÊÉÊÊÉÉúÊÉÊÉÊÉÉþÊÉÉþÊÉEÉüÈÉÈÉÉÈÉþÈÉÉùÈÉÈÉÈÈÉÉÈýÉÈÉÉÈÉûÈÉÉÈÉÉüÈÉÉÈ ÈûÇÈÈÇÈ ÈûÇÈÈÇÈÈþÇÈÈüÇÈÇÈÈúÇÈÈÇÇÈ È?ÇÆþÇÆÆþÇÆÆþÇÆÆûÇÆÇÇÆÆþÇÆÆþÇÆÆþÇÆDÆÿ?ÍéçþæçÖçæþçæ æüçæçææçæçæûçæççææþçææþçææøçæçæåæåææüåææååþæååúæåæååææùåæåæåæååüæåæååûæåææååüæåæååöæååääåäåäååþäååäøåäåäååäååëäåääååääååääåäåäåäåäååþäå åüäãäããäãäãäþãääãäüãäãääãäûãääãää„ãûâãââããüâããââüãâãââþãââöãâãâããââãââãâúãâãâãââþáââýáâááþâááâáúâáâááââüáââááâùáââáâáââáëâááââáàááàáàáàááàááàááþàááþàááþàááþàá áþàááþàáá€àýßàßßàßàßöàßßàßßààßààßàßþàßßòàßßàßßàßàßßààßß÷àßàßßàßßÞÞýßÞßßüÞßßÞÞýßÞßßþÞßßûÞßßÞßßüÞßÞßßûÞßÞÞßßýÞßÞÞðßÞÞßßÞßßÞßÞÞÝÞÝÞÞÝúÞÝÞÝÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞÝ Þ@ÝÜþÝÜÜþÝÜÜûÝÜÜÝÜÜþÝÜÜþÝÜÜøÝÜÜÝÜÜÝÜÜÝÜþÝÜEÜÛþÜÛÛÜÛðÜÛÜÜÛÜÛÜÛÛÜÛÛÜÜÛÛÜÛúÜÛÛÜÛÜÜÛÜòÛÜÛÛÜÛÜÛÜÛÛÜÚÛ ÛþÚÛ ÛþÚÛÛþÚÛÛüÚÛÚÛÛ?ÚÙþÚÙÙûÚÙÙÚÙÙúÚÙÙÚÚÙÙùÚÙÚÙÙÚÙÙûÚÙÙÚÙÙøÚÙÙÚÙÙÚÙÙÚÙØþÙØØÙØÙûØÙØÙØØõÙØÙØÙØÙØØÙØØüÙØÙØØÙôØÙÙØÙØØÙÙØÙØ?ØþרØîרØ×Ø×Ø×ררØ×ØØ×ØØüררØþרØûרØ×ØØ×Ø?×ýÖ×Ö Öþ×ÖÖü×Ö×ÖÖþ×ÖÖû×Ö××ÖÖ×þÖ×× Öù×ÖÖÕÕÖÕÕýÖÕÖÖÕþÖÕÕÖüÕÖÕÖÖÕûÖÕÖÖÕÕõÖÕÕÖÕÖÕÖÖÕÖÖÕþÔÕÕÔüÕÔÕÔÔÕÔÕûÔÕÕÔÕÕúÔÕÕÔÕÔÔûÕÔÕÔÕÕöÔÕÔÕÕÔÕÔÕÔCÔþÓÔ=Ô ÓþÔÓÓþÔÓÓûÔÓÓÔÓÓûÔÓÓÔÓÓøÔÓÓÔÔÓÔÓÓþÔÓÓÒøÓÒÒÓÓÒÓÒÒíÓÒÒÓÒÓÒÓÓÒÒÓÒÓÒÓÓÒÓÓÒÓóÒÓÓÒÓÓÒÓÓÒÓÓÒÒÓÒüÓÒÑÒÒÑÒ÷ÑÒÑÑÒÒÑÑÒÒñÑÒÑÑÒÑÑÒÑÒÒÑÒÑÒÒÑøÒÑÑÒÑÒÑÒÒÑÒÑÐþÑÐÐþÑÐÐûÑÐÐÑÐÐþÑÐÐþÑÐÐþÑÐÐÑÐþÑÐÐÏÐÏñÐÏÐÏÏÐÏÐÐÏÐÐÏÏÐÐýÏÐÏÏÐ÷ÏÐÏÐÏÐÏÏÐÐÏÐýÏÐÏÏþÐÏÏÐÏÎÏÎûÏÎÏÎÏÏûÎÏÏÎÏÏýÎÏÎÎûÏÎÏÎÏÏÎÏþÎÏÏþÎÏÏýÎÏÎ ÎþÍÎÎüÍÎÍÎÎûÍÎÎÍÎÎûÍÎÍÍÎÎÍÎüÍÎÍÎÎÍ΂ÍÌûÍÌÌÍÌÌûÍÌÌÍÌÌüÍÌÌÍÍÌÍÌýÍÌÍÍÌüÍÌÍÌÌþÍÌÌüÍÌÌÍÍýÌÍÌÌËþÌËËùÌËÌËËÌËËÌËÌþËÌÌËÌËÌËþÌËËÌþËÌÌËÌþËÌÌúËÌÌÊÊËËþÊËËþÊËËùÊËÊËÊÊËËþÊËËøÊËÊËÊËÊËËúÊËËÊÊËËþÊËËÊËüÊËËÊ>ÊÉþÊÉÉþÊÉÉþÊÉÉùÊÉÉÊÉÊÉÉþÊÉÉþÊÉÉþÊÉ ÉþÊÉÉúÊÉÉÊÊÉGÉÈÉúÈÉÈÉÉÈÈÉþÈÉÉúÈÉÉÈÈÉÉÈüÉÈÈÉÉÈÉÈúÉÈÉÈÉÈ ÈþÇÈÈûÇÈÈÇÈÈÇÈþÇÈÈõÇÈÇÇÈÈÇÈÈÇÈÈþÇÈÈÇÈ@ÇÆþÇÆÆþÇÆÆþÇÆÆþÇÆ ÆþÇÆÆÇÆþÇÆDÆ?Í“çþæçÅçþæçdçùæçæçæçææçæçæçæþçææçæþçææûçæççææåæåæúåæååæååèæåæååæåæåæåæåæåææååææåæååæåþæååøæååääååääåüäåäååäúåääåäååþäååäøåäååäåäååäåäþåääãäþãääþãääþãääþãääãýäãääþãääþãää€ãâþãââãýâãââüãââããâõãâããâãââããââûãââãââãýâãââþãââûãââãââþáââþáââáâüáâáââøáââááâáââüáâáââýáâááúâááâáââõáâáâáââááàá áþàá áþàááþàá áþàááþàááàá€àßàßàßûàßßàßßöàßààßßàßàßßàßþàßßþàßßÞýßÞßßÞßþÞßßÞßúÞßßÞÞßßÞßéÞßßÞÞßßÞßßÞßÞÞßÞÝÞÝÞÝÝÞÞþÝÞÞþÝÞÞüÝÞÝÞÞÝ ÞþÝÞÞÝÞ%ÝþÜÝÝÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜþÝÜÜùÝÜÜÝÜÝÜFÜÛÜçÛÜÛÜÛÜÛÛÜÛÜÛÛÜÛÜÜÛÜÛÜÛÜÛÜÜÛÜÛÜÛÜüÛÜÜÛÛÜóÛÜÜÚÚÛÚÚÛÚÛÚÛÛûÚÛÛÚÛÛþÚÛÛÚÛÚöÛÚÛÛÚÛÛÚÛÚ>ÚýÙÚÙÙþÚÙÙþÚÙÙþÚÙÙÚÙüÚÙÚÙÙþÚÙÙþÚÙÙØÙúØÙÙØÙØØüÙØÙØ ØÙøØÙØØÙØÙØØüÙØÙØØøÙØØÙÙØØÙÙØüÙØÙØ@Ø×ØþרØþרØ×ØþרØþרØþרØ?×Öþ×ÖÖþ×Ö Ö×Ö×Öþ×ÖÖþ×ÖÖù×Ö×ÖÖ×ÖÖÕþÖÕÕòÖÕÖÕÕÖÕÕÖÖÕÕÖÕÕøÖÕÖÕÕÖÖÕÕþÖÕÕùÖÕÕÖÕÖÕÕÖõÕÖÖÕÖÕÖÕÕÖÕÕûÔÕÔÔÕÕÔþÕÔÔûÕÔÕÔÕÕþÔÕÕúÔÕÔÕÔÕÕúÔÕÔÕÔÕÕüÔÕÔÕÕûÔÕÕÔÕÕ€ÔÓûÔÓÔÔÓ ÓùÔÓÔÔÓÔÓÓþÔÓÓþÔÓÓþÔÓÓÒðÓÒÓÓÒÓÒÓÒÒÓÓÒÒÓÒÒöÓÒÓÒÒÓÓÒÓÒÒþÓÒÒÓýÒÓÒ ÒúÓÒÒÑÑÒÒÑÒþÑÒÒ÷ÑÒÑÒÑÑÒÑÒÒþÑÒÒÑþÒÑÑÒþÑÒÒûÑÒÑÒуÑÐþÑÐÐÑýÐÑÐÐþÑÐÐÑÐþÑÐÐþÑÐÐþÑÐÐþÑÐÐþÏÐÐÏþÐÏÏÐýÏÐÏÏöÐÏÐÏÏÐÏÏÐÏÏûÐÏÐÏÐÐÏþÐÏÏþÐÏÏ÷ÐÏÐÏÐÏÐÐÏÏþÎÏÏÎÏÎÏüÎÏÎÏÏúÎÏÎÏÏÎÎÏöÎÏÎÎÏÏÎÎÏÎÎþÏÎÎÏÎþÍÎÎÍÎÍÎþÍÎÎöÍÎÎÍÍÎÍÎÍÎ ÎþÍÎÎÍüÌÍÍÌÌÍÌþÍÌÌÍÌÍøÌÍÌÍÌÌÍÌÌÍÌÍÌÍúÌÍÌÌÍÌÌËþÌËËýÌËÌÌËÌËÌþËÌÌþËÌÌïËÌËÌËËÌËËÌËËÌËÌËÌÌýËÌËËõÌËÌÌËËÌÌÊÊË ËþÊËËÊËþÊËËþÊËËúÊËÊËÊËËþÊËËüÊËËÊ>Ê ÉþÊÉ ÉþÊÉÉþÊÉÉùÊÉÊÉÉÊÉÉþÊÉÉþÊÉ?ÉÈýÉÈÉÉûÈÉÈÉÈÈýÉÈÉÉüÈÉÉÈÈúÉÈÉÈÉÈÈõÉÈÉÈÈÉÈÈÉÉÈÈÉûÈÉÈÈÉÉÈþÉÈÈþÇÈÈüÇÈÇÈÈôÇÈÇÇÈÇÈÇÈÈÇÈÈûÇÈÈÇÈÈþÇÈÈÇÈþÇÈÈüÇÈÈÇ?ÇýÆÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆþÇÆÆüÇÆÇÆÆûÇÆÆÇÆ>Æ?Í|çþæçAçýæçææþçææþçææþçææüçæçææþçæ æþçææ÷çæçææçæçææýåæååþæååæøåææååææååæåæõåæåææååææåææåæåäýåäååäýåäååäýåäååùäååääåääåþäååäåþäååäþåä äãäþãääãäúãäãäãääúãäããäã~ãýâãââùãââãâãââã÷âãââããâãââãüâããââüãâãââõãââããâãââãââþáââúáââááââþáââüáâáââüáâáââþáââþáââáâùáââáâáââûáâáàááþàááþàááþàááþàááþàáá€àýßàßßàßùàßàßààßßþàßßàßàøßàßààßàßßàýßàßßðàßààßàßàßßÞÞßÞÞßßÞüßÞÞß ßúÞßÞßÞßßÞßÞßÞþßÞÞßÝúÞÝÝÞÝÞÞþÝÞÞþÝÞÞõÝÞÞÝÞÝÞÝÞÝÞÞüÝÞÝÞÞ@ÝÜøÝÜÝÝÜÜÝÜÜþÝÜ ÜþÝÜÜ÷ÝÜÜÝÜÜÝÝÜÜüÝÜÝÜÜüÝÜÝÜCÜþÛÜÜÛÜÛþÜÛÛÜÛÜÛÜÛíÜÛÜÛÛÜÜÛÛÜÜÛÜÛÜÜÛÜÛÛÜýÛÚÛÛþÚÛÛüÚÛÚÛÛþÚÛÛùÚÛÛÚÛÚÛÛûÚÛÛÚÛÛøÚÛÚÛÚÛÚÛÛþÚÛÛ?ÚÙ÷ÚÙÚÙÙÚÙÚÙÙÚ ÙþÚÙÙþÚÙÙþÚÙÙÚýÙÚÙÙþÚÙÙûÚÙÙÚÙÙýØÙØØþÙØØýÙØÙÙþØÙÙñØÙÙØØÙØÙØÙØÙØÙØØþÙØØþÙØØÙýØÙØØþÙØAØ× Ø×ØþרØþרØþרØþר Ø×Ø@×Öþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖ×Öþ×ÖÖþ×ÖÖþ×ÖÖþ×ÖÖü×ÖÖÕÕþÖÕÕÖÕþÖÕÕþÖÕÕýÖÕÖÖÕþÖÕÕùÖÕÖÕÕÖÕÕüÖÕÖÕÕþÖÕÕþÔÕÕÔüÕÔÔÕÕþÔÕÕÔÕÔùÕÔÕÔÔÕÔÔøÕÔÕÕÔÕÔÕÕÔÕÔþÕÔoÔþÓÔÔüÓÔÔÓÓþÔÓÓþÔÓÓ÷ÔÓÓÔÓÓÔÔÓÓûÔÓÓÔÓÓþÔÓÓþÔÓÓýÒÓÒÒÓüÒÓÓÒÒíÓÒÓÒÒÓÒÓÓÒÓÓÒÓÓÒÒÓÒÒþÓÒÒÓÒòÓÒÓÓÒÓÒÒÓÒÓÒÓÑÑÒýÑÒÑÑÒÑöÒÑÒÑÑÒÒÑÑÒÒþÑÒÒùÑÒÒÑÒÑÒÒþÑÒÒÑÒ€ÑÐþÑÐÐüÑÐÑÐÐþÑÐÐüÑÐÑÐÐûÑÐÐÑÐÐùÑÐÐÑÐÑÐÐþÑÐÐóÑÐÑÐÐÑÑÐÐÏÐÐÏÏÐÏþÐÏÏÐûÏÐÏÐÏÏÐÏþÐÏÏþÐÏÏÐýÏÐÏÏÐþÏÐÐÎùÏÎÏÏÎÎÏÏöÎÏÎÎÏÏÎÏÎÏÏòÎÏÏÎÏÎÏÏÎÏÏÎÎÏÏÎÏÎÏÎþÍÎÎÍÎþÍÎÎþÍÎÎÍÎüÍÎÍÎ ÎþÍÎÎÍþÎÍ€ÍüÌÍÍÌÌýÍÌÍÍÌÍþÌÍÍüÌÍÍÌÌÍÌÍÌìÍÌÍÍÌÌÍÌÍÌÌÍÌÌÍÌÍÌÍÌÌËÌûËÌËËÌÌþËÌÌËÌ÷ËÌÌËÌËÌÌËËÌüËÌËÌÌüËÌËÌÌùËÌËÌËÌËËþÊËËüÊËÊËËþÊËËûÊËËÊËËÊËþÊËËþÊËËþÊËËþÊËËÊË@ÊÉÊÉþÊÉÉþÊÉÉÊÉùÊÉÉÊÉÊÉÉþÊÉÉûÊÉÉÊÉÉþÊÉÉþÊÉEÉýÈÉÈÈÉÈÉÈøÉÈÉÈÈÉÉÈÈÉÈûÉÈÉÉÈÈÉÈÉÈþÉÈÈÉÈþÇÈÈþÇÈÈþÇÈÈüÇÈÇÈÈþÇÈÈùÇÈÇÈÇÇÈÈ@ÇýÆÇÆÆþÇÆÆüÇÆÇÆÆûÇÆÇÇÆÆÇÆþÇÆYÆÿ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕ,çýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæþçææþçææüçæçææçæùçææççÍåþæååæåþæååæýåæååæåþæååûæåæÍ÷äåääåäåäååäåäåúäåäååääýåäååúäåääÍäùãäãääãääþãääþãä äþãääãäãþÍ.ãþÍ.ãþÍâûãâããââãâãâøãâããââãââúãâãâãâ âþÍáþâááûâáââááâþáââ÷áâáââáâáââáûâáâÍáúàáàáàá áýàáààöáàááàááààá áûàááÍ.àþÍ.àþÍßûàßàßààùßààßààßßþàßßùàßàßàßààßþàßßþÍþÞßßûÞßÞÞßßüÞßÞßßþÞßßÞ÷ßÞßÞßÞßßÞÞßùÞßÞÞßÍÞþÝÞÞúÝÞÝÞÝÞÞüÝÞÝÞÞþÍþÜÝ,ÝþÍýÜÝÜÜÝÜþÝÜÜüÝÜÝÜÜþÝÜÜþÝÜÜýÝÍ.ÜþÍÜÛÜþÛÜÜöÛÜÛÜÜÛÜÛÜÛÛþÜÛÛÜùÛÜÛÜÛÍÛþÚÛÛüÚÛÚÛÛþÚÛÛÚÛþÚÛ ÛûÚÛÚÍ.ÚþÍÙüÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙÚûÙÚÙÙÚÚýÙÚÙÙüÚÙÍØÙØõÙØØÙØØÙÙØØÙÙúØÙØØÙØØöÙØÙÙØØÙØÙØØÙØýÙÍ.ØþÍרöרר×רØ×ØØûרØ×ØØþרØüררØþÍ.×þÍÖþ×ÖÖü×Ö×ÖÖþ×ÖÖþ×ÖÖû×Ö××ÖÖ×Öü×Ö×ÖÖû×ÖÖÍÖÕûÖÕÕÖÕÕüÖÕÖÕÕþÖÕÕþÖÕÕõÖÕÖÕÖÖÕÕÖÖÕÕûÖÕÕÍöÕÔÕÔÔÕÕÔÕÔÔÕÔùÕÔÕÕÔÕÔÔÕÔÕÔÕøÔÕÔÕÔÕÍ.ÔþÍ.ÔþÍÓþÔÓÓþÔÓÓûÔÓÓÔÓÓùÔÓÓÔÓÔÓÓÔÓûÔÓÓÍûÓÒÒÓÒÒüÓÒÓÒÒùÓÒÓÒÓÓÒÒÓýÒÓÒÒþÓÒÒþÍþÒÑÑÒýÑÒÑÑíÒÑÒÒÑÑÒÒÑÑÒÒÑÒÑÑÒÒÑÑÒþÑÒÒûÑÒÑÍ.ÑþÍ.ÑþÍýÐÑÐÐüÑÐÑÐ ÐùÑÐÑÐÐÑÐÐøÑÐÐÑÐÐÑÐÐþÍÐùÏÐÐÏÏÐÏÏÐÏÐþÏÐÐÏþÐÏÏþÐÏÏúÐÏÐÏÍþÏÎÎÏûÎÏÏÎÏÏüÎÏÎÏ ÏüÎÏÏÎÎúÏÎÏÎÎÏÏþÍüÎÍÍÎÎûÍÎÍÍÎÎþÍÎÎþÍÎÎþÍÎÎþÍÎÎÍüÎÍÍ/Í/ÍüÌÍÌÍÍÌüÍÌÌÍÍÌþÍÌÌýÍÌÍÍýÌÍÌÌøÍÌÍÌÌÍÍÌûËÌËËÌÌþËÌÌËÌùËÌÌËÌÌËËÌûËÌËÌËËüÌËÍËúÊËÊËÊËËúÊËÊËÊËËþÊËËüÊËÍ.ÊþÍÉûÊÉÊÊÉÉþÊÉÉþÊÉÉþÊÉÉþÊÉÉüÊÉÊÉÉþÍ.ÉþÍúÈÉÈÉÈÉÉþÈÉÉÈÉüÈÉÉÈÈÉÈÉùÈÉÈÉÈÉÈÈÉúÈÉÈÉÍÈüÇÈÇÈÈüÇÈÇÈÈÇÈÇÈÇÈþÇÈÈùÇÈÈÇÈÍ.ÇþÍÆþÇÆ ÆûÇÆÆÇÆÆþÇÆÆüÇÆÇÆÆþÍ.ÆþÍ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕçþæççýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæçæþçææþçæ æùçæçææçæ æçþÍúåæååæååæúåæåææååæåþæååþæååöæåæååæåæÍþäååûäååäååýäåääåòäåäåäåääååääåääåäåüäåÍäþãääþãääùãäããäãääþãääþãääûãääÍ.ãþÍ.ãþÍâúãâãâãââãâûãââãââþãââãâüãâÍâá÷âááââáââááûâáâáââþáââöáâáâááâááââûáââÍýáàááàáüàáàááþàááàáþàááþàááþÍ.àþÍ.àþÍßà ßþàßßàßàßôàßàßßààßßàÍÞßûÞßßÞßßÞßÞßðÞßÞßÞßÞÞßÞÞßÞßÞßßþÍ ÞþÝÞÞúÝÞÝÞÝÞÞþÝÞÞþÝÞÞþÍÝþÜÝÝþÍ ÜþÝÜÜþÝÜÜÝùÜÝÜÜÝÝÜÜþÝÜÜþÍ.ÜþÍÜÛÜþÛÜÜþÛÜÜýÛÜÛÛÜÛõÜÛÛÜÛÜÛÜÜÛÜÜüÛÜÍÛþÚÛÛþÚÛÛþÚÛÛ÷ÚÛÛÚÛÛÚÚÛ ÛþÍ.ÚþÍÙüÚÙÚÙÙþÚÙÙþÚÙÙÚÙþÚÙÙþÚÙÙþÚÙÙýÚÍøÙØØÙØØÙØØ÷ÙØÙØÙØÙÙØØÙøØÙØØÙØÙØØÙØþÍ.ØþÍüררØþרØþרØýר××ýØÍ.×þÍÖþ×ÖÖþ×ÖÖû×ÖÖ×ÖÖþ×ÖÖþ×ÖÖü×Ö×ÖÖþÍøÖÕÕÖÕÖÕÖÖÕðÖÕÖÕÕÖÖÕÕÖÕÖÕÖÕÖÖÕÖúÕÖÕÖÕÖÖÕýÖÍÖÔÕÔÕÔÕÔÕÕÔÔÕÔÕÔÕÕÔÔÕÕÔÕÕÔÕÕÔÔÕÔÕÔÕÔÕÔÔÕÔÕÔÔüÕÔÍ.ÔþÍ-ÔýÓÍÔýÓÔÓÓþÔÓÓùÔÓÔÓÔÔÓÓûÔÓÓÔÓÓþÔÓÓýÔÍùÒÓÒÓÒÒÓÓÒ÷ÓÒÓÓÒÓÒÓÒÒþÓÒÒÓûÒÓÓÍúÑÒÒÑÑÒÒÑÒÑøÒÑÒÑÒÒÑÒÒþÑÒÒÑúÒÑÒÑÑÒÒûÑÒÒÍ.ÑþÍ.ÑþÍÐÑÐÑøÐÑÐÐÑÐÑÐÐþÑÐÐüÑÐÍþÐÏÏûÐÏÐÐÏÏþÐÏÏïÐÏÏÐÏÐÐÏÏÐÐÏÐÏÏÐÏÏûÐÏÐÍþÏÎÎÏÎÏúÎÏÏÎÏÎÎÏýÎÏÎÎþÏÎÎÏÎûÏÎÏÍÎþÍÎÎþÍÎÎþÍÎÎûÍÎÍÍÎÎþÍÎ ÎþÍ/Í/ÍþÍÌÌøÍÌÍÌÍÌÍÌÌþÍÌÌóÍÌÌÍÌÍÌÌÍÍÌÌÍÍþÌÍÍûÌÍÌÍÌÌþÍÌöËÌÌËÌËËÌËÌÌúËÌÌËËÌÌËýÌËÌÌþËÌÌüËÌÍ ËÊ ËÊüËÊÊËËþÊËËþÍ.ÊþÍÉþÊÉÉþÊÉÉþÊÉÉûÊÉÉÊÉÉÊÉüÊÉÍ.ÉþÍÉñÈÉÈÉÈÈÉÈÉÈÉÉÈÉÈÈÉþÈÉÉüÈÉÈÉÉÈÉüÈÉÍûÇÈÈÇÈÈÇÈþÇÈÈþÇÈÈÇÈþÇÈÈþÇÈÈþÍ.ÇþÍ ÆûÇÆÇÇÆÆþÇÆÆþÇÆÆþÍ.ÆþÍ*ÍþÇ(çúæçÍÎÕ+çüÜÍÕ,çýÜÎ-çýÍÇ.çþÍ-çýæÍ.çþÍæþçæ æþçæ æüçæçææþÍåþæååþæååæåûæåææååþæååöæåææååæååææýåÍüäåäååûäåäåääåþäååäåäåûäåäÍäã äþãääþãääãäüãäãääùãäãääÍ.ãþÍ.ãþÍâ÷ãâãâãââãââüãâãââãþâããýâãââãþÍúáâáâáââþáââþáââáâ÷áâáâááâáââòáââáâáâáââáâÍáùàááàáàááüàáàááþàááþàááàýáÍ.àþÍ.àþÍþàßßþàßßýàßààßàßàøßàßßàßàßßàßýàÍßþÞßßþÞßßþÞßßùÞßßÞßÞßßÞßÞßøÞßÞßÞßÍÞþÝÞÞûÝÞÝÝÞÞþÝÞÞþÝÞ ÞþÍ.ÝþÍþÝÜÜþÝÜ ÜÝÜÝöÜÝÜÜÝÝÜÜÝÜÜüÝÜÍ.ÜþÍüÜÛÛÜÜöÛÜÛÜÜÛÜÜÛÜÜÛ÷ÜÛÜÛÜÛÛÜÛÛþÜÛÛüÜÛÛÜÜþÍÛþÚÛÛþÚÛÛÚÛüÚÛÛÚÚÛþÚÛÛüÚÛÚÛÛþÍÚþÙÚÚþÍÙþÚÙÙüÚÙÚÙÙùÚÙÙÚÙÚÙÙþÚÙÙþÚÙÙþÚÙÙþÍØþÙØØòÙØÙØÙÙØØÙØÙÙØÙÙØûÙØÙÙØØöÙØÙØØÙØÙØÙÙýØÍ.ØþÍ Øþר ØþרØþרØüררØþÍ.×þÍÖþ×ÖÖô×Ö×Ö×ÖÖ××Ö×ÖÖþ×ÖÖü×Ö×ÖÖü×Ö×ÖÖþÍãÕÖÕÖÖÕÕÖÕÖÕÕÖÕÖÕÕÖÕÕÖÖÕÖÖÕÕÖÕÕÖýÕÖÕÕøÖÕÕÖÖÕÍþÕÔÔþÕÔÔýÕÔÕÕþÔÕÕöÔÕÕÔÕÕÔÕÔÕÕþÔÕÕþÔÕÕýÔÍ.ÔþÍ.ÔþÍÓüÔÓÔÓÓÔ÷ÓÔÓÔÔÓÓÔÓ ÓûÔÓÓÔÓÓþÍÒþÓÒÒüÓÒÓÒÒÓÒñÓÒÒÓÓÒÒÓÒÒÓÒÒÓÒÒûÓÒÒÍòÒÑÑÒÑÒÒÑÒÒÑÒÑÒÒÑÒÑøÒÑÒÒÑÒÒÑÑÒÑÒþÍ.ÑþÍ.ÑþÍÐþÑÐÐúÑÐÑÐÑÐÐþÍÏüÐÏÐÏÏÐÏÐÏÐÏÐÏþÐÏÏþÐÏÏúÐÏÐÏÍÎøÏÎÎÏÏÎÏÎÎýÏÎÏÏüÎÏÏÎÎÏüÎÏÎÏÏÎúÏÎÏÏÎÏÏþÍ ÎþÍÎÎüÍÎÍÎÎþÍÎ ÎÍ/Í/ÍþÍÌÌþÍÌÌþÍÌÌþÍÌÌþÍÌÌèÍÌÍÍÌÍÌÍÌÌÍÌÌÍÍÌÍÌÌÍÌÌÍþËÌÌøËÌÌËÌÌËÌÌûËÌÌËÌÌ÷ËÌÌËÌÌËËÌÌóËÌËËÌËÌËËÌÌÍËþÊËËøÊËÊËËÊÊËËþÊËËÊýËÊËËùÊËÊËËÍ.ÊþÍÉþÊÉÉùÊÉÉÊÉÊÉÉÊÉûÊÉÉÊÉÉþÊÉÉüÊÉÍ.ÉþÍýÉÈÉÉÈþÉÈÈÉþÈÉÉûÈÉÉÈÉÉüÈÉÈÉÉüÈÉÈÉÉÈþÍÈûÇÈÈÇÈÈÇÈúÇÈÇÈÇÈÈÇÈûÇÈÈÇÈÈþÍ.ÇþÍÆÇÆþÇÆ ÆÇÆûÇÆÆÇÆ ÆþÍ.ÆþÍ)ÿýùG,ÿþ-ÿþ.ÿ.ÿþG.ÿþù/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿþÍÆÆþÅÆ ÆþÅÆÆÅýÆÅÆÆúÅÆÅÆÆÅÅÆÅýÆÅÆÆþÅÆÆÅþÍÅÅþÄÅÅþÄÅÅþÄÅÅüÄÅÄÅÅýÄÅþÍÄ9ÄýÍÄÃÃþÄÃÃþÄÃÃÄÃþÄÃÃÄÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄòÍÂÃÃÂÂÃÂÃÃÂÃÃÂÂÃúÂÃÂÃÃÂÂÃþÂÃÃÂÃÂýÃÂÃÃÂöÃÂÃÂÃÂÃÂÃýÍÅÂ8ÂýÍÊÂÂþÁÂÂþÁ ÂþÁÂÂþÁÂÂÁÂüÁÂÁÂÂÁüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ3ÁþÇÍ5ÍïÍÆÆÅÆÆÅÆÆÅÅÆÅÆÅÅÆÆÅ ÆþÅÆÆúÅÆÅÆÅÆÆöÅÆÅÆÆÅÆÅÆÅÅþÍÅÅøÄÅÅÄÅÅÄÅÅûÄÅÅÄÅÅþÄÅÅþÄÅÅúÄÅÅÄÄÅÅþÄÅÅûÄÅÅÄþÍÄ9ÄýÍÄÃÃÄÃþÄÃÃûÄÃÃÄÃÃÄÃûÄÃÃÄÃÃûÄÃÃÄÃÃüÍÂÂÃÃÂýÃÂÃÃÂþÃÂÂöÃÂÃÂÂÃÂÂÃÂÂÃøÂÃÃÂÂÃÃÂÂöÃÂÃÂÂÃÃÂÃÂÂýÍÄÂ8ÂüÍÉÁÂÂÁýÂÁÂÂôÁÂÂÁÂÂÁÂÁÂÁÂÂþÁÂÂúÁÂÂÁÁÂÂÁÂüÁÂÂüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ)ÁþÀÁÁþÇÍ5ÍúÍÆÆÅÅÆÆöÅÆÅÆÅÅÆÅÅÆÆúÅÆÅÆÅÆ ÆÅüÆÅÅÆÆÅÆúÅÆÆÅÅþÍÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅ ÅþÄÅÅúÄÅÄÅÄÅÅüÍÄÃÄ7ÄýÍÃÄÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃõÍÂÃÃÂÃÂÃÂÃÂÂÃÂÃÂþÃÂÂÃüÂÃÃÂÂÃÂ÷ÃÂÂÃÂÂÃÃÂÂúÃÂÂÃÃýÍÄÂ8ÂýÍÊ ÂþÁÂÂÁ ÂþÁÂÂþÁÂÂÁÂþÁÂÂüÇÍÂÁ7ÁÎ8ÁûÕÍÎÂÁ5ÁúÕÎÍÉÃÁ3ÁþÇÍ5Í;ÿ;ÿ;ÿ;ÿ;ÿ;ÿþùÿ9ÿþGÿ9ÿ:ÿþÿ8ÿþÿ7ÿýGùÿ4ÿÆýÅÆÅÅäÆÅÅÆÆÅÆÆÅÅÆÅÅÆÅÅÆÆÅÆÅÆÆÅÆÆÅÆÆþÅÆÆÅÆûÅÆÆÅÆÆÅÆÅÄøÅÄÅÄÅÄÄÅÅüÄÅÄÅÅþÄÅÅùÄÅÅÄÅÅÄ>ÄÃþÄÃÃøÄÃÃÄÄÃÄà ÃþÄÃÃþÄà ÃþÄÃÃþÄÃÃÂýÃÂÃÃÂþÃÂÂàÃÂÃÂÃÂÃÂÂÃÃÂÃÃÂÃÂÂÃÃÂÃÃÂÃÃÂÃÃÂÂÃÃÂÃýÂÃÂDÂþÁÂÂþÁ ÂþÁÂÂûÁÂÂÁÂÂêÁÂÂÁÂÁÂÁÂÁÂÂÁÂÂÁÂÁÁÂÁÂÂþÁÂÂýÁÂÁ¿ÁþÀÁ=Á?ÍøÅÆÅÆÆÅÆÅÅùÆÅÅÆÅÅÆÆüÅÆÅÆÆûÅÆÅÅÆÆÅýÆÅÆÆÅðÆÅÆÅÆÆÅÆÆÅÅÆÆÅÆÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅÄ Å÷ÄÅÅÄÅÅÄÅÄ?ÄÃþÄÃÃþÄÃÃþÄÃÃøÄÃÄÄÃÃÄÃÃÄøÃÄÃÄÃÃÄà ÃþÄÃÃÂýÃÂÃÃÂüÃÂÃÂÂÃúÂÃÃÂÃÂÂþÃÂÂúÃÂÃÂÂÃÃïÂÃÂÂÃÂÃÂÂÃÂÃÂÃÂÂÃÃýÂÃÂCÂþÁÂÂþÁÂÂÁÂþÁÂÂþÁÂÂþÁ ÂûÁÂÂÁÂÂÁÂÁþÀÁàÁ?ÍþÅÆÆÅÆÅõÆÅÆÅÆÆÅÅÆÅÆÆðÅÆÅÅÆÆÅÅÆÅÆÆÅÆÅÆÆûÅÆÅÅÆÆöÅÆÆÅÅÆÆÅÆÅ ÅþÄÅÅøÄÅÅÄÅÅÄÅÅþÄÅÅþÄÅÅÄÅþÄÅÅþÄÅÅþÄÅÅ?Ä ÃÄ ÃÄûÃÄÃÄÃÃþÄÃÃÄÃüÄÃÄÃÃýÂÃÂÂûÃÂÂÃÂÂþÃÂÂÃÂÃÂÃÂÃûÂÃÂÃÂÂþÃÂÂúÃÂÂÃÃÂÂüÃÂÃÂCÂþÁÂÂþÁÂÂþÁÂÂþÁÂÂþÁÂÂûÁÂÁÁÂÂþÁÂÂÁþÀÁsÁþÀÁÁþÀÁ]Á?ÍÿýÅÆÅÅÆöÅÆÅÆÅÆÆÅÆÅÅÆþÅÆÆþÅÆÆøÅÆÆÅÆÆÅÆÆÅÆþÅÆÆÅÆÄÅûÄÅÄÄÅÅþÄÅÅþÄÅÅÄýÅÄÅÅþÄÅÅþÄÅ Å?ÄÃþÄÃÃÄýÃÄÃÃþÄÃÃþÄà ÃÂýÃÂÃÃÂÃÂÃÂðÃÂÃÂÃÂÂÃÂÂÃÃÂÃÃÂÂþÃÂÂþÃÂÂÃýÂÃÂÂþÃÂHÂþÁÂÂþÁÂÂþÁÂÂüÁÂÂÁÁÂýÁÂÁÁ?ÍøÆÅÆÅÅÆÆÅÅÆýÅÆÅÅÆüÅÆÅÆÆÅÆÅýÆÅÆÆüÅÆÆÅÅÆþÅÆÆþÄÅÅþÄÅÅÄ÷ÅÄÅÄÅÅÄÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅÄ ÅýÄÅÄ>ÄÃþÄÃÃþÄà ÃÄÃþÄÃÃþÄÃÃþÄÃÃÂÃÂøÃÂÃÂÂÃÃÂÂþÃÂÂüÃÂÃÂÂþÃÂÂÃþÂÃÃýÂÃÂÂöÃÂÂÃÃÂÂÃÃÂBÂûÁÂÂÁÂÂÁÂÁÂôÁÂÂÁÂÁÂÂÁÂÁÂÂûÁÂÁÁÂÂÁÂÁ?ÍÅÆæÅÆÅÅÆÅÆÆÅÅÆÆÅÆÆÅÆÆÅÆÆÅÅÆÅÆÆþÅÆÆþÅÆÆÅÆüÅÆÆÅÅ÷ÆÅÆÅÅÄÅÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅÄÅþÄÅÅ?ÄÃúÄÃÄÃÄà ÃþÄÃÃþÄà ÃþÄÃÃÄÃþÄÃÃùÄÃÄÃÃÄÂÂÃÂÃÂÃÂ÷ÃÂÃÂÃÃÂÃÂÂÃýÂÃÂÂþÃÂÂõÃÂÃÂÂÃÃÂÃÃÂÂþÃÂÂÃýÂÃÂ?ÂõÁÂÂÁÂÂÁÂÁÁÂÂþÁÂÂÁÂÁÂüÁÂÁÂÂþÁÂÂþÁÂÂûÁÂÂÁÂÂ÷ÁÂÁÂÂÁÂÂÁpÁþÀÁŒÁ?ÍÿÆûÅÆÅÆÅÅÆÅÆøÅÆÆÅÆÅÅÆÆÅþÆÅÅþÆÅÅÆëÅÆÆÅÆÅÅÆÅÆÅÆÅÅÆÅÅÄÅÄÅÅúÄÅÅÄÄÅÅþÄÅÅÄÅþÄÅÅ@Ä ÃþÄÃÃÄÃþÄÃÃþÄÃÃûÄÃÃÄÃÃÄÃÄüÃÄÄÃÃùÄÃÃÂÃÃÂÂýÃÂÃÃÂÃÂÃÂþÃÂÂýÃÂÃÃÂþÃÂÂöÃÂÂÃÂÂÃÂÃÂÂþÃÂPÂþÁÂÂôÁÂÁÁÂÁÂÁÂÂÁÂÂþÁÂÂþÁÂÂþÁÂÂêÁþÀÁ ÁþÀÁÁ?ÍÆýÅÆÅÅÆþÅÆÆÅÆÅÆûÅÆÆÅÆÆÅþÆÅÅÆûÅÆÆÅÆÆÅÆÅþÄÅÅûÄÅÅÄÅÅþÄÅÅÄÅþÄÅ ÅûÄÅÄÄÅÅÄùÅÄÄÅÅÄÅÅ?ÄÃþÄÃÃôÄÃÄÃÃÄÃÃÄÃÄÃÃþÄà ÃþÄÃÃüÄÃÄÃÃüÄÃÄÃÃþÄÃÃÂÃÂÃýÂÃÂÂùÃÂÂÃÂÃÂÂÃÂÃõÂÃÂÃÃÂÂÃÃÂÃÃÂÃýÂÃÂBÂÁÂþÁÂÂþÁÂÂüÁÂÁÂÂþÁÂÂþÁÂÂÁÂþÁÂÂúÁÂÂÁÁÂÂüÁÂÂÁÿÁ?ÍÆüÅÆÅÆÆÅÆøÅÆÅÆÅÆÅÆÆþÅÆÆùÅÆÅÅÆÅÆÆùÅÆÅÆÆÅÆÆûÅÆÅÅÆÆýÅÆÅÅüÄÅÄÅÅÄÅÄÅÄÅþÄÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅüÄÅÅÄ>ÄÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃÄÃøÄÃÃÂÃÂÃÂÂþÃÂÂþÃÂÂüÃÂÂÃÃÂÃýÂÃÂÂõÃÂÂÃÃÂÃÂÂÃÂÂÃþÂÃÃÂþÃÂTÂÁÂüÁÂÁÂÂþÁÂÂþÁÂÂþÁÂÂúÁÂÂÁÁ Â–ÁþÀÁgÁ?ÍÿÆþÅÆÆüÅÆÆÅÅÆÅÆýÅÆÅÅýÆÅÆÆÅÆÅüÆÅÅÆÆþÅÆÆÅÆÅþÄÅ ÅþÄÅÅ÷ÄÅÅÄÄÅÅÄÅÅþÄÅÅþÄÅÅûÄÅÅÄÅÅùÄÅÅÄÄÅÄ>ÄýÃÄà ÃþÄÃÃþÄÃÃþÄÃÃüÄÃÄà ÃþÄÃÃõÂÃÃÂÃÂÃÃÂÃÂÂþÃÂÂüÃÂÃÂÂþÃÂÂ÷ÃÂÂÃÃÂÃÃÂÂÃûÂÃÂÃÂJÂÁýÂÁÂÂþÁÂÂþÁÂÂüÁÂÁÂÂþÁÂÂùÁÂÂÁÂÁÂÂôÁÂÁÂÂÁÂÁÂÂÀÁæÁþÀÁÁ?ÍýÆÅÆÆüÅÆÅÆÆÅÆÅøÆÅÅÆÅÆÅÆÆøÅÆÅÆÅÅÆÅÅÆüÅÆÅÆÆÅÆ÷ÅÆÆÅÆÅÅÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅþÄÅÅ?ÄÃóÄÃÄÃÃÄÃÃÄÃÃÄÃÃüÄÃÄÃÃÄÃÄÃûÄÃÃÄÃÃÄÃþÄÃÃøÂÃÂÂÃÂÃÂÂüÃÂÃÂÂþÃÂÂÃöÂÃÂÂÃÂÃÂÂÃÃòÂÃÂÃÂÃÂÂÃÂÂÃÂÃÃÂÃýÂÃÂÂþÃÂWÂþÁÂÂþÁÂÂþÁÂÂÁ?ÍÅÆþÅÆÆþÅÆÆíÅÆÆÅÆÅÅÆÅÆÆÅÆÅÆÅÆÅÆÆþÅÆÆÅÆýÅÆÅÅÆÅÆýÅÆÅÅþÄÅÅþÄÅ ÅÄýÅÄÅ ÅûÄÅÄÄÅÅþÄÅÅÄÅ@ÄÃþÄÃÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃÄûÃÂÃÂÃÃÂþÃÂÂÃýÂÃÂÂûÃÂÂÃÂÂÃúÂÃÂÂÃÂÂþÃÂÂÃÂüÃÂÃÂBÂÁÂüÁÂÁÂÂÁÂþÁÂÂÁÂûÁÂÂÁÂÂþÁ ÂÁ?ÍÿýÆÅÆÆùÅÆÆÅÆÅÆÆÅÆúÅÆÆÅÅÆÆýÅÆÅÅÆÅúÆÅÆÅÅÆÆþÅÆÆþÅÆÆöÅÆÅÆÆÄÄÅÄÅÅþÄÅ ÅúÄÅÄÅÄÅÅùÄÅÅÄÅÄÅÅÄÅÄùÅÄÅÄÅÄÅÅüÄÅÅÄ?Ä ÃþÄÃÃÄÃÄÃþÄÃÃÄÃþÄÃÃÂÃÂÃÂþÃÂÂþÃÂÂýÃÂÃÃÂÃøÂÃÂÃÂÃÃÂÂüÃÂÃÂÂþÃÂÂþÃÂ@ÂûÁÂÂÁÂÂþÁÂÂþÁÂÂûÁÂÂÁÂÂúÁÂÂÁÁÂÂþÁÂÂþÁÂÂþÁÂÂÁÁþÀÁ<Á?ÍÅÆÅÆþÅÆÆÅòÆÅÅÆÆÅÆÅÆÅÆÅÆÅÅÆÅúÆÅÆÅÆÅÅÆþÅÆÆÅþÄÅÅþÄÅÅþÄÅÅøÄÅÅÄÄÅÄÅÅüÄÅÅÄÄÅþÄÅÅÄÅþÄÅÅÄþÃÄÄÃÄÃûÄÃÃÄÃÃüÄÃÄÃÃöÄÃÃÄÃÄÃÃÄÃÃøÄÃÃÄÃÃÄÃÃüÄÃÄÃÃÄÂÃúÂÃÃÂÃÂÂüÃÂÃÂÂþÃÂÂþÃÂÂÃÂÃÂñÃÂÃÂÂÃÂÂÃÂÂÃÂÃÂÂÃDÂþÁÂÂþÁÂÂÁ ÂþÁÂÂÁÂûÁÂÂÁÂÂ~ÁþÀÁ€Á?ÍÆÅüÆÅÅÆÆêÅÆÆÅÅÆÅÅÆÆÅÆÆÅÅÆÅÅÆÆÅÆÆÅÆþÅÆÆöÅÆÅÅÆÆÅÆÅÆÆýÅÄÅÅþÄÅÅþÄÅ ÅöÄÅÄÅÄÅÅÄÄÅÅÄÅþÄÅÅ2ÄþÃÄ ÄÃþÄÃÃüÄÃÄÃÃúÄÃÃÄÄÃÃüÄÃÄÃÃÄÃþÄà ÃüÄÃÄÃÃþÂÃÃÂÃþÂÃÃùÂÃÃÂÃÂÃÃþÂÃÃÂüÃÂÂÃÃÂÃÂüÃÂÂÃÃAÂÁýÂÁ ÂûÁÂÁÁÂÂþÁÂÂùÁÂÂÁÂÁÂÂÁ ÂþÁÂÂþÁÂÂÁ?ÍÿøÆÅÅÆÆÅÅÆÆÅÆþÅÆÆûÅÆÆÅÆÆûÅÆÅÆÅÅþÆÅÅøÆÅÆÆÅÆÅÆÆÅñÆÅÆÆÅÆÆÅÆÅÅÄÅÄÅ ÅþÄÅÅÄÅûÄÅÅÄÅÅþÄÅÅüÄÅÄÅÅÄþÅÄ>ÄÃüÄÃÄà ÃüÄÃÄÃÃþÄÃÃþÄÃÃüÄÃÄÃÃ÷ÄÃÄÃÄÄÃÄÃÃþÄÃÃüÂÃÂÃÃÂÃýÂÃÂÂøÃÂÂÃÂÂÃÂÂÃþÂÃÃÂÃýÂÃÂÂÃÂÃFÂþÁÂÂþÁÂÂþÁÂÂ÷ÁÂÂÁÁÂÁÁÂÂüÁÂÁÂÂÁÂþÁÂÂþÁÂÂÁ?ÍûÅÆÆÅÆÆÅÆøÅÆÅÆÆÅÅÆÆÅÆÅÆùÅÆÅÆÅÅÆÆùÅÆÅÅÆÅÆÆ÷ÅÆÅÅÆÅÆÄÅÅûÄÅÄÄÅÅþÄÅÅþÄÅÅüÄÅÄÅÅûÄÅÅÄÅÅÄÅýÄÅÄ+ÄþÃÄÄÃþÄÃÃþÄÃÃÄÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃþÄÃÃÄÃÂþÃÂÂùÃÂÂÃÂÃÂÂõÃÂÂÃÂÂÃÂÂÃÂÂÃþÂÃÃÂÃÂÃûÂÃÂÃÂ@ÂþÁÂÂþÁÂÂòÁÂÁÁÂÂÁÁÂÂÁÂÁÂÂþÁÂÂïÁÂÁÂÁÂÁÂÂÁÁÂÁÂÂÁÂÂûÁÂÂÁÂÂÁþÀÁúÁ?ÍÆùÅÆÅÅÆÅÆÆÅÆøÅÆÅÆÆÅÅÆÆÅ÷ÆÅÆÅÅÆÅÆÅÅøÆÅÆÅÆÆÅÆÆþÅÆÆÅÆøÄÅÄÅÄÅÄÅÅüÄÅÄÅÅþÄÅÅþÄÅÅþÄÅÅôÄÅÅÄÄÅÄÅÅÄÅÄ>ÄÃþÄÃÃûÄÃÃÄÃÃþÄÃÃþÄà ÃúÄÃÄÃÄÃÃþÄÃÃúÄÃÄÃÃÂÂ÷ÃÂÂÃÂÂÃÃÂÂÃÂÃÂùÃÂÃÂÂÃÂÂþÃÂÂþÃÂÂÃôÂÃÂÃÂÃÂÂÃÂÃÂEÂûÁÂÂÁÂÂþÁÂÂúÁÂÂÁÁÂÂüÁÂÁÂÂþÁÂÂüÁÂÂÁnÁþÀÁÁ?ÍÿþÅÆÆÅùÆÅÅÆÆÅÆÆüÅÆÆÅÅÆþÅÆÆþÅÆÆúÅÆÅÅÍÄÅÄÅùÄÅÅÄÅÄÅ ÅÄÅüÄÅÍ.ÄþÍÃüÄÃÄÃÃþÄÃÃûÄÃÄÄÃÃÄÃþÄÃÃûÄÃÃÍÂÃÂþÃÂÂþÃÂÂüÃÂÃÂÂýÃÂÃÃÂÃÂÃøÂÃÂÃÂÃÍ-ÂýÄÍÂüÁÂÁ ÂþÁÂÂüÁÂÁÂÂýÊÍ,ÁüÂÍÇ,ÁÎ*ÁûÂÎÍÕ(ÁúÃÉÍÎÕ*ÍþÇýÅÆÅÅûÆÅÆÅÆÆüÅÆÅÆÆÅüÆÅÆÅÅþÆÅÅÆýÅÍôÅÄÄÅÅÄÅÄÅÅÄÅÅþÄÅÅÄýÅÄÅÅöÄÅÄÅÅÄÅÅÄÅÅþÍ.ÄþÍýÃÄÃÃþÄÃÃþÄÃÃûÄÃÃÄÃÃÄÃþÍõÂÃÂÂÃÂÂÃÂÂÃÃüÂÃÃÂÂùÃÂÂÃÂÃÂÂþÃÂÂþÃÂÂÃûÂÃÃÍ-ÂýÅÍÂüÁÂÁÂÂûÁÂÂÁÂÂþÁÂÂýÊÍ,ÁüÂÍÇ,ÁÎÁþÀÁ!ÁûÂÎÍÕ(ÁúÃÉÍÎÕ*ÍþÇóÆÅÆÅÆÆÅÆÅÆÆÅÆÆÅðÆÅÆÅÆÅÅÆÅÆÅÆÅÅÆÅÅÆÅøÆÅÆÆÅÅÍÅÄüÅÄÅÄÄÅþÄÅÅüÄÅÄÅÅöÄÅÄÅÅÄÅÅÄÅÅýÄÍ.ÄþÍÃþÄÃÃþÄÃÃÄ ÃþÄÃÃûÄÃÃÄÃÃþÍÂþÃÂÂÃÂüÃÂÂÃÃÂÃÂüÃÂÃÂÂþÃÂÂúÃÂÂÃÍ-ÂýÅÍûÂÁÁÂÁÁ÷ÂÁÂÁÂÁÂÁÂÂþÁÂÂüÁÂÁÂÂûÁÂÂÁÂÂþÁÂÂýÊÍ ÁþÀÁÁüÂÍÇÁþÀÁÁþÀÁÁÎ*ÁûÂÎÍÕÁþÀÁÁúÃÉÍÎÕ*ÍþÇ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ.ÿþù.ÿþG.ÿ-ÿþ,ÿþ)ÿýùG€€€€,(–K %stem-1.7.1/docs/_static/buttons/tutorials.png0000664000175000017500000007150013157571677022050 0ustar atagaratagar00000000000000‰PNG  IHDRôPï,‡ÆsRGB®ÎébKGDàààØNx pHYs  šœtIMEÝ)÷jÇ¢ IDATxÚì½y˜eE•/ú‹½Ï99gVefUVVÖ\EQ”8€ Ð ´oÓØj«´ OÞµ»Û _ŸŠÚíU»õ ï*Ý8öÅ–Qhb,ª(j¦2++§ÊùŒ;ÖûcïˆX;öÉ,o‹Š¹¿/¿Ì1¡|Ú^õìÙõ<ªû÷ ihÝmÍúVàèe}/í%ñ·5YS÷/Z³tςݸ°•\ØfÿÞvgÆóË3y}5A‚ €u®é“s%aìð$Æ%*2@$Ãø<}O~ÿôß¾ÿ³>«'O”q_ÔyîœÏ!‰ÉÑ"šÂ¢Bã‹»q¨XF±eÖ­Ye}+âk•gB$½warcáh„€ ²¿†Ó¯ä¼—0-Ö×&ÏŒO§äîɉ‚æÙ¬ôƒL{ErÞDs…Óó$@ DVl¹Äå0–1Ko¶¾Òé'ÿÀ †!§?]Y·^Hd^°ñô=œ“ú8öz"¹aªëDw!´Xx­úRóÔ›YÌgw ­wOÎp'  ÞŽÌId +ûPÀ–[>#RrGé!N^Ð’Nv9/[Ö\ôö{2®ümêöuö™ŽD wÃïéÎK0ÔÝ…­vˆì~S™¹gºXdà~˜p˜1úœëD©k¨Ž^ñˆ”õžÖ㔊„yû/i>|ƒ ôh ·M)µ˜Rfs, r錟g¨¬¶!ݲ”leþ]RZ"YGªeÈ"b§JÔ¢ÓÓS˜.00 ŒŒÏÂ@ ’ñõˆ¯U„€$þ’E@ !¢T©é.àª,-Äž  ¡¢Rô3Dò|÷Ù¾¶ð¿ó!@‡püÚŘAµZAUJ䛚€B–õõÅ÷åJCHB/ˆD¶r$A\}’ÁH„„þ^¿œLú™,œñ8QJÑA ™½ káJ. %élò'ב½X’µÃQªN²·FʤÙ$ „ŒåJI(é¶&ÆÆ€ ­„Œ†Hºï—6çÈh&̤W#ÁþÕcEŽva:Ä,`|ÈD)žKÖß€ä †eÁywÖJ4™HÚB‰,Iep0ÃO E¢¬(Q[ÄT*{e[1°{ËØh!Õ·¤vÜ®XŽÙ¬çUr SŒ–Þ ÁÖ©x°TûEÒéÒzç¸Cõ{@&㔼y"ƒzªjE?D‚/qç(Ù@Ò/ª¡ÄdÓZGjñ`‹˜’æÕƲ¾‡4F¬Y˜i-Íú v>ì€RòZþ”±)u];ë3')1¨ S²ÁÉxªÉD>ÛM(™"½‚Ç{6‘Ì夷 €‰LAo(ìEÍLnR†>“)0ï Œa™Ìu¢¤?Djð“=$¤³Þ’îâ›QµÄ©y¯Œ”d’SŒÆèŽÂ3½¤ w‚»‘Ødak€½ü“Yô¸ £æ¥’á#Ø¡ 6™µÍ@$dÒ©iAS‹9YÖZ¬È"¡Z«aßÁilß7(äTjqãs¡@™É”˨&ß…a<°R ù­ÍŒMµQ DD„@Ô¢¸ÂP€d,dˆN=£«½S³”«12=`ÆE> P‹¤iK ÉT› ùíM!V£¹y&&£R‰C ­­­ÈçóhmmeŠ”e™/[­µÒ!¦`’ëbÅÄŠš×lK®aošÒjgIlLµbcJ@(¥£¾P7–d7›îÚ.•|¡4;qucbö6‘²”¥1Ø`&q(ÔB®®—ÚK$¹ÆR‹Öæ‚M(²<+ÚxÉClGÜ`"k#eÛú·&¬0ã Ö/=>’ôî‚´å E[Ùk‘ZcË佤µ %¥œ¥RXªwX¿$÷º³p©~1ZJ8âGšþÊP2¦^’dÙJ$¤0f8é¹ Þ“œ kb” Äa:‘<7Ñ?dA0ýÉ䆴‘ky½3&¶¨’Ðã¥Å̸ciü™w ¾…Ôj¤w÷q?HÖÜHNÆNªñd‹©à†h¢w•‡äȱÌËD>„å¶1¥öÊRŸClŽZžfü·œÁú,¹ÚxÈÄ0Û(™ó™q­6€R@ZF¿Ò3ñ&NJJö,¤7F‚mtŸZFš°\rh¦wõÈÉdÄxÝ–‹ÇÞˆùì‰xz%ºIØíQ†—T‹¾ä~ÂddŒnyHØf„×ß‘¹ ó]x½]¹cí+ÏÈšAJšÓ©k9êxëD¢„ÕB¬t\ˆø‡ÌΚ‚¸‰ú¼ D! ’ó…Úy«/xF›sÄæ£±|ñs( =ò… Šæ|š hh(pS?¶û´ÕFÚý¬…=Þ€¤<Õe1 æ‰É•¾ÃUŠœïÂI/lÂzOb?È1ÑI&“ÚŒ½Gp´ñÁï¥ >Ø»RÉvVÜu©úÜ{K³cd[w¶‘‰…žìîR[EaYýÖŽî*ÄdY*¯D2Hj' ŒÑ£¦¦`‹Uo”aEÊ› =xà%ïj®ÛîvkjëÍW:Ì=÷Ý;qd#5c=“×l†¤žÈA @ù\¨ï• ƒÄí¿. ôÂ0Ð;ý|.@! !ŸKvöq:X$ AïЃ@êï$ÅÆD¼p D2Vnù\ˆB.´ „ Š…&— Øb`žäoÞæöB ÇmnÇQM·¢ûðíXWîÄÕ0[ë†Xô·hllrú“àS ¼óì²Ï'[$2¬26¯³´fF,ÑÛE™ ,¥ä%ˬ³uaÎÛ“¯‰ö‡Ú šº9ÊÛ7:ä—qr¿cáÏÐP½~„c8§F’<—ÖéHš‡ QÆ\­?å³ÇíˆÎ®û†s ÔæøÆ}are•æ¸}zð(K÷eµ‚2ÆÖiÍ9Ós™È#æ„´{õFÆ»Ñ]Pg*P¦>;r"Íc­!ç¦ÜÝ©9MÙ³+uWg ~6_Y Le•1ÆYršÚ`Ó‘ÅЛ‡”„Z$!Ô„@T3®íHJ¾‰@-qs a\52q¡«¤bn»ç¸7@ê|$î6óJ¡“‰Nñ}•k_JiíbT›@·9 –uFèj“¨ÞVQ„È#'J(¡KW-À1Ž…cáX8ŽåÈeî~<h81Ý'Á †õØï”,ªR;Öb7Ù^,+Ž#„@ kŽû˜D`ÀQ‡.ÀƒêxÕÉ1‰}¦ÛUÑÛ ,jž…Ü‹ÙRT%Èj„©¦XѱĸÄP‹¡BaŽmH§Á;" ˜S` «ÁÂ8ÀÈG;p-dž 8ª  Ê óÃÚ­QÃV±ñ@@§ƒ&m- Öôvà¤cz±ri–.jÁOÞb¥†òá[÷Œ`xbmMlZÕ…Z$qÔÊNœ¸©ÓÅ º;šñà3ýqž¹Š›«”›$D!¢L§v¿‘Lv•2Naã„vú;˜6/i+¡«£¹Ñç1[J¥•²ÄLn9:[–Z|6žÁ‹îòö¯½NÍ~Bð Í2š›lÆœÔód#kêŸâùü@"Cs€U(äç…2ÍöC” uËByޣÑ:Tw~flh®{S¶Œ’¿/iyuQ\õnMuõL½ñ%ÿTršzeÉqÆX‘{/šÏ™÷Û![^2Þ‘2ÏGjs©‡Èß÷sKH7×÷Ë€OVçÔnTGææõ¬ûQÆû§•p682ÀyÀnN óïZçe~o*†(wvC>Ä«7õâ´Vaplß»{+šs8~Cª5‰ÆB.NMB§©uu4á¸uKðŸOÀÝîEÏâ&œsòz¬ííˆÏæ|‘\+œŸØ%Ÿ¤³±p€vˆ@ý а¾/‡:„¨4Q €J ¥2¡Ü¸ù†…:ò ‡ÿ˜œœü½jÏôôôK²ÆÂ±pü±¹lsE8–€Í©ã3ŒïQpÆ4çEY! bI.q_„\  ¼îØ>œpÔR<º}[vðÔÎaœxL/ò!O—Qȅȇò¹M 9¼rcGgðÌîT£c%¼bcÞøêÕøõ¶ƒxv降ÝGq;ra€|$$1Ê]¹PrAÜp™¼—"¶QœB'PÎ`]_Mr?¨2‰r±Õ²D©b²yÂ04î†âŒ~Õ>Ò´¨`866†Z½hBÑÞގƆ­u°;d¨a˜ûÁNrúIæ7ÒtÌEHÓªø!‹5 8y¨ô¥Z CÀÛN6½«¶•Yl‘AëP’ oañ`N5›Éó©§žÆg>s5¶lÙ‚7œv®þÔ§±víDcd½¯Z.Oa‘å¥dÊ3Åwû÷ïÃÝ÷܃{î¹?ü0|ðA,Y²$ÅD«#~§‘Š8JøÀ\ŒNUp!l†3pY°w!Z¶ÚÛ+!\—½y™4K'“Kð& +njZZ¶3ñ¸œ¥a”CÛ«ßËêt‹>Í¢2µ­°ˆH¸»]°²Kr¢el©Õך:Õô±ö›W°`Î b4³Ðº üzÎN¨žÉæ· )@—œ¥@nÎyä#η”bÙ`a!‘¢ÕJ'9•2`³6:2fÑä¸sÅ‘W£ƒæ¹ + —æePo!cª?˜ø¬)p° *¦¬@‰;žˆP®ÖP‹$&fˈd òÙºwm X¹´»Æ5£[¥*ñüÃhoiÀ–‡P®E„ÀÔl#ÓØ´ºËä'.‹¿× ,% :ÇñÂÆŠÐÓae7!šÙ‡ ATÊ哲åüRæ:–VPZꄲ˜Ò%˜!Ü0 Š?;÷\8pàE[Ðÿñÿçw,ÚX¶Â'O`¾7C²âÆ©’ø¹Üp*AÉ&a²ðò®—‚43¡d(yä iá'éÄR‰ðˆ¡I‹Ó‡ó g¢J†&î»2ZZ‡1ï‹_ú"{ì1À/ñ üsW¾ô¥/¥q&cïKæ“fLƒ©¡ â¤@†ˆØ"ËÖðÈ0|ðAýãʹ†<ËåšPØÄD®C£¥9)ÀH ×e@KÄŒCJàZ‚‡}8í°AÙ¢ipššk')4LX˜2åÆ5#4"3QtÖ)Ð*ã°qÒnœ_p±´iP‰å8X¼„l„4cgKFŸªcËfnHa@THh‚ù¦ C0¦²K@å´Ôx—Ü긄“}ÚÅ n»‘ÍZÈpR‡?HÏ"˜¡ ÖÌtBÇ¿%‹CR2¬† ÝoÑѲ嚥/iÀ.[!HÂ"aMËʘ^W À‘\ÊH#Ãv§˜ä1œË3:2”;_Xx_0Ë,ÞfΑëC$ò?UÇÇùÞñwmÍ ’ðÄóCXÜÞ„ã7,ÅÀð4¦‹UÔ"ÂC[ðëmƒšò åj„žêG> 0[®ÆÖœ:Úpü†¥xþÀaìxá0z·`r¦Œr5ÒŠ‰„Ã…NœÆÐž¨’†$J‘ú– ôvGûwbv6Y@¥Š1±2ß§äiŽjfð^6!ù€óI7°T*½¨n›R©d¡ŽjF%µÈ0e¥R.m!1‹œÂb¡ã“ܦŒ»Ï `ŒÌ9*Ce`ÜÔ26¥P’+eÒ³NŠeÄÖ„ –ƒ¡T«<ü«_YýüÀ˜ñǶ~_Ã[n¿Èa—¼ËH3ÊAÅRï~÷»ÑÜÜŒmÛ¶¡\.Ãø&ᣑÐñøcÂÓÈ<;†+Ýš+Ä”´3ÏÙ|å‚)oØÆ„õ¾‰tvv¢³³ÍÍÍ€{ï½]t‘uý±Ç‹›o¾9O)qøðaý³eËüð‡?ľ}ûôù³³³)JTeþíXTèÊLh Ñ<0äËX»3Ö äÍñÛ^!?È&Yˆr¹<Î<óLÜ~ûíú”·½ímöÄö. H•æé¹c444àŽ;îÐñûø‡ÀüǤæèÎ/74Ãæüt«ê—¿l`Ê}ÍQ6¬^0e‘,èÉŠ! t´4 §«#SèíjŦU]XÜÖˆ±© ¹$},És^ÒÑŒKÚ 05[Åøt3%D".ÀÒÑÞÒ€æÆ<^uô2ŒL±ÿÐ$V÷´aÛÞQݨ aÅÃ(ÉQÈÄHÔy’âxzc>†UMÅGP-—!ª9P¥ŠñrªÝ›„–M¡Eº¦§&=°Ê›šS z¡PÀ7Þˆ—mÞœ:\6¿¥†@èìêBgg'W¿úո袋põÕWã»ßýnl@”KVÕ<_9?;ˆ4ñ…Gÿe•¦…HsFžB„ዯY/ÏHü…³†Æ)Û™}Èê#¶q¸êª«ÐÙÙ‰ûï¿gÿéÙøë ÿš-ÖœXÄ)A ƒíjÈÙ$:üë¶¶6¼çÝïÎXгß%MpÂãÓ)CALÇÉEÊaÍžè«Û¼þ9¥1r¯;¥QS2˜U*›Åâ“sÁŠ‘ÅKÏxKǦºÑ-Ï)üý'RéÑɆ[Xžï<±¸(»Ì«5íü²VOqRß›Ùø+‚·ø¡­HXº¯Ô¬GÎæUÚUdŒ³C#,#–ý/œQsëÍúj×)u|D.÷º#ù\;xÇ‘q54A E„e-E€ûŸ|ÅJ„U=íèíjÅŽ£X‰46äpÒ1ËðŠËÐÚ˜ÇL¹ŠB>D¹áñçaËŽC¨E„™R OíAOg3vŒãÀð4ºÚqÖ‰kн¨ / M%áF ›ô›T©i‰G@²ÞH’&èh.¡§«aijåªå”ËL}(·¬C kuÒ€2vrÉ!Q­†Z-.{ÅW`óæÍsìš3’¶Èg©ðÚUW]…xûöíC©Xò싲„LãyîÍ›ww666†ÿ÷Ç¥—^š¹KÏlæÚùÏÅéíkÛ|˜ÌçHa" ··Ÿþô§ç¾—gwD.ü˜ç®Ò÷4/1²Š/eõ3Õsdöùû¼wõçˆÕoTgÜ}ÓŽæÕoYÞºL Ê~Wò{Scïõ2ÎGb©¾CY…”]­Ãó>u^¨®QzªáhGD.XÝl6nu§.yìrÏÖõ-ÂᩊåiɾH IDAT*5Âî šFMJÍwÊq}8iórì:0Ž]ãÆ¢ÖF»®o8a%raˆ‡· @ضoÛö" bÏÄL3¥*Ö÷-ÂàØ,")õ®; Æ0ˆLŠ›Š}«T7 ¬Y 57‚ÚÌ~ "€¡R–˜(l@ÐÒ L½`Ñòò?pÊó¹¨P(ã2±‹-Âûß÷~VÞKŸf®šG‘ nA*f±¦ÆF|àÀ'?ùI‹%Îgš²d5ÚvŒS8rЉ¶)EšfWPœùáª]©ø Nü¯ /vn§ô¯p˜½ˆFÖHp`˜®¢¦7–Õ+° °ÚÁè\…=®º¶9¤6¯OîÀÖ‰œR©8"yh\ò‘‚õY.ŸÏŽ¡ëZêÂkƒ³âB¤ ò©úè(k§Œ¥ÑïàtÎ\.ìÍšî_=Z(‰ë+2ÔÇvtp[Xõ©5ézõ|n1C˜5­yHšnż²]NØW¼ýnÌ»޺н†–Ë51¯'¯èEÂÎc€EÅ+¬aÓý¯@ˆÄwÏ LÆþL6„ÃDª1$ÂâF³·Ú€—ÀJðþvèˆ¹ÇÆLO'»ÅõÍpZfF= a£i„3öäÉ¢±j«Z^oF;ͽŒîdÓ OXÔ#t¹[ÁG ˜ 5õ'›Ì2]^Ža uJRsc‹Zc:×|ˆÆBë–/ÆŽÆÐÒ\@³ŒÐ|è…÷èU]xÕѽøõ¶AlÝ3’€à"+3Ÿ.c¦TÃIÇ,Ãt±‚ÃSPkA¤Ÿ…ÀäLúãùã˜)VÑÒ˜G¨ÕL˜¸:!µHêb-Aò?!‡26¬È¡5<*`¶˜GµL¨T†sëÑžoB•8™›„*[‹8´I²:Õ±ÿ_¹ÛO?ýtˆ Hí Œ5*™›6­¬¥vm%O±áñÄ?í´ÓårÉãJtè(}v,£"éÎ25¢¹UF‹ µ×^‡{ï¹§Ÿ~z‚hæ÷ŒñΩœŠYq`™ŽâñBépC³ ‘î-fý;™nH#5Hu²™Z…™Üf2 yH•ôvO䀓,4?§ê•v‰H}=Õ‰sÊJ_÷¹<¶xk ˜Ù‘jZh2rG³$Yâeç|€2"‡.–ÕeލêÙƒ RÀ?„•K[±¶·ûM¢\“4º:±¬««{ÚÐÝÑ„Ùr5^°ªò¹•j„jMj…EñµšZÐãØ|µ/öe,ﬡ6³¹Z Aµ¥b„‰j †òkÐ@§à‘'4Ad»ë²X™ˆÔào|c]7ß|]ãY.I€°lÙ2lÚ´ Åb±ÑHš±JdøÚiŽx¾{üú‘GðOÿôOž EÞº‘.Îj>ÎϹû¦¾{™gÖÕÁÏu«›Îk¨ë·ÎÓzòƒoÈÃlFs>ŸlCÆ „t]ºuOsVa­˜—Ërîò±©:ÞîÖœææ%¬‹«ãz¶õæ|åqžáJS¶zÛ@>¿}ÆÔ%š[ 3%ižºl>@EÊœ‡DõÞs²Eó ¡d†w8ˆË/¿QB c6’äƒf{m­9'êˆnÀ©. .»Í™Ø%ç|·jÇ¿ðÝ¡¨>ô"q‚Fùàlið*ùå#c©Aà%Ø•ú|úÙ' ¼-i_}ªFú]Ó#ߘ«ªxiÝ(²FŠS“°{ŠVîvêZö\¾ƒ&ñ)Ò5Ñœ’1fR  §¸ G{ÄÓ&˜xk-‰¼(ݺ4AM@çÌ /L˜"Qä…oÂ®ÒÆûéö éŒÿ^Ù_¿<‰TA¼tí¼ðN°ñM#ólÝáTíS×qÀkº†â‘ºÜUÕ&7 •§=U*wQ˜|9¦tФo°È>$/wë@h$¸4%…MìÓ.ÙÊ]þ–Òeň4‚]—¬%Ëm¯©îû2Æ8=‡É-£›NÛ$V%‡³/DÃ=ªŒV„쨾µå¹аG’‘bºÌ KÇnÅ᥃¹)ü7ÎXÙ6O‰fƒ?1Ä.€’£Žt%s!ù_ŠT~>é*#„á(4Ç;˜ªŽàL£Ž§AБ Ü‘Î}õ»iÙ.Š|èK¿ÿÕp£­xݱËÑÝÞ„¦Æ<šó˜)Æ.ùHÄÊgpdË· ¥1jM~õ„£½­9%‹š186£'}±aËŽCXÓÛWnìA. °çà¶ì8„R5JøÜ ]¤¾'¹ø¡¿Ë#¦µÈUw¢VžUP¥†b%Ä­† œOÚ“Bõˆ'|1¨Lp&Ù:îT¯;ˆ2þN~=ðÀýxüñǽ÷èëëÃyçgÅ5+• ¾ùÍof>wñâÅx÷»ßjçöíÛñ7ó7Ø¿¿uþÞ½{ñÕ¯}Õû\Þ?®¤Õ¢<ò¶mÛ†íÛ·cûöíØ¿?V­Z…M›6aÓ¦M8æ˜cpÒI'!¯ ™<^ÕÖ[n¹·ß~;~ñ‹_èg?·ý9|å+_ÁO<®®.¼ímoÃ…^ˆ|>ÏÜÁæ>O?ó4n½õVÜÿýøÉO~’áq³…§T.ãæ›oƃ>ˆþþ~ô÷÷£T*aÕªUX½z56n܈÷¾÷½hmmµ”ý|r]ýžPJág¢Z„o¼?ü0víÚ…‘‘¬Zµ ëÖ­ÃÆqê©§bff8å”SRþFòý‰q‹ÌPf8RqEr‹Áx¼WÊì?Š2b«ð»d3Â.”r!¯žð‡ÈëJ÷ªŒ9ŠAQV6ŽÇ-L¾ªƒ4wHŠÜªŽDþqÊÁÔ»¸råÌçmö•¢úkù¡î¥:(p³²x(ŠM‡¶çW¼&›ËÝBõ!m CÔq­‘A‹2zCÞÁQHˆd¼®ï[ŒÑñ"~ñø~ŒO—1[ª%5i •šÄ³ûFqÖIk°yMžÞ=ªÝ±D@˜pÌê.´6åñ𳃨Eq§Hv Lbß¡)4r8í„hnÌëï)ÁñiFG‚Ncìo…t—’Ð\˜ÁÊÞäÊ{P-•Q.¶ R®`¢ÖŠA¹ žŠN)d®H;Æ„O« ‘vËŸŠÔ5söÓ­g$ÿ¬^½ÃCCøÑü}ôQëêO<1¡†5ÖbèîîBÿî¾ûnìݻ׺fíÚµx÷»Þm‰Õ¶íÛpþùç£Z­¦Z¸oß>üË¿ü‹ÿ¹iP}|Íž½øè•ÅSO=…¶¶6œp 8û¬³qhèî¿ÿ~Ü|óÍš`çU¯z>ÿùÏcÅÊ•.¾•!ïááaÜvÛ­¸é¦›ñÜsÏ¥Úyûí·áïþî£Ii¾±±1|ùË_ƺõëqæ›Þ¤'óþ^Àm·Ý†[o½{öì455ù4F.k¾yí7qà 7àðáÃ8öØcqê©§â¤OÂðÈ0î½÷^üô§?ÅwÞ‰ýèGøìg?‹×¾öµi…/8Ÿ Í!6 –á©'žÂ'?õIìØ±k×®Å[ÞòœrÊ)8xð |ðA|îsŸÃç>÷9À»Þõ.œ|Ê)Ž3X¤”¼ð8½ydH#—½k*QmlÑ‹Ú5`Çsýæü.}Ž[Øí ‹KÂw ïRÛÁÊKV¨foø(Õî¨Ù}îâ\,º\ØD=©lÔÏÞ6Vrtï!_’=¡æDÉ€|ãd׬÷Í-Þ–‹žávþ‘p¾÷5Íe¹Vx__xô29$…@vwÌCÏØ¹dá(4¢Rbiïîl6lØ€{î¹ð­o} ×_½>ÿu¯{®¹æë™ù|>°Oþýáˆk®¹Åb't¾öµ¯¡½½ÝºþÙgŸÅ¥—^Šááa<öØc8÷Üsqå•WâüóÏOõñ<€ë¯¿>ø ^¬Ý÷¿ûî»­Åœ?½ã¼éoÄw¾óÜvÛmV_ÌPSÝE®¼òJÍ.wÅW¤XÏ9çuÔQøÚ×¾†\tÑEøÙÏ~†žžžllùÛAäÏnî?Ð\ôLMMáÊ+¯ÄûÞ÷>ýÝ 'œ€7¿ùÍ8묳pÙe—¡Z­ÆÔ²õXÿ<{ÞìÝ£g·L¹ÞTh6gÙbgq·¨@¤úçS‡Ð\%QÝ{ÖgŽ£:€;:.›·,¨ïÉób¸ƒ¿$í|Ûë0GúÔe}@s•Þ;aæ0Í Kz™æ‰ï ²”Œžàªp ̢̿'6BVª–þŒø@óV•Òò¹Àö}£XÔÚ€e]-Èçôu·bMoò¹˜ž5~½í z¦«{Úð¶×­Ã;߸ ç½á(¬êiÇC[ðäÎa„Iü¼µ)‡ÎÖ4BärÝÑÉZs¶æÎ:q ÞöúõxËk×â-¯]‡s^¿g¼b%Úš ȇÚ[ Èçâ¸}^Ô°º'@{Ã$ÂÊ~”‹yÔ*@T°·º(´" ¨™þ«×W\‘²ºñVßeý€_?Güœ Llÿ†ÛÎd§zòÉ'{äà ×Lê›y—7½éM~¹b.¤0 ÑÝÝîînM]Ëoõ]ü³`ÉÚú™Ï|W_}5ŠÅ"Î8ã \wÝÿ‡¶¶¶T?sÌfü¯ÿõ-tt,g|úÓŸÆg?ûYë‰åro}ë[qñŧڦBûØÇðž¿z®»î:¼ò•¯´¾ßpÔårù—ïÂ%—\âß‘Ã߇D„/~ñKz1‚ïyÏ{Ø9fŽ]xá…èèèT«U|ëÛßrÆ©¾ðä—¹|ä#˜ššB__ÞûÞ÷Ú÷IÎ9åÔSôB_©T¹2…tR²è¼»6„õ0;s‚ìÂ<Ä Y‚-»pô¿_º_09~–õ.î<‡åý˸Wª?‚Õ¿¾syÝŒÔØjntöÞH_ÏçŒå²uåYz×nÈß'ïØcÁêØç‘¥ë|:‹Ë®OF@¶Þ•7:’:9•Ž,SDØA~8€¥¤‚$X@ U-MgÙ?8‰¡Ã38nÝlè[Œ£V,FSC·?´/ OAJÂÔl<ÝƱ¬«fÊUL«˜œ©$`¶M9œz\·5`h|{'ѳ¸S³U¬ènEËÊÅI‘–Æ<žÜ5ŒÁ±„°tQ³®¡Þ³¸Ç®_‚çöaÿà$rV.‰P›Ù|u A%rIbºÚ€~lDMæÒ`8ð¼M¼“ºöwcYeFYYD¼O6”kN º¨³¨ô½hiKÖ1»dQ’vuueX’ÌÖ¤ñ=—,Yêm„Êÿå9ë" ²IŒ\‚£–1Æc=Šüà±±†¸êª+‘Ë…†–‚8éŽÄúõëpÝu×á]ïúKíê¿á†ð§gŸÔ¢L„3N?]»=ƒ0À×ÿåëVÓ.¿ür|ä#Áùq> ¼þõ¯Ç/~ù \ÿíë±båJœ÷öÿ‚Äûß¡&()WʸþÛ×§ÆÅ”jeÎL~òÃû.¥D­Z…l(0Tq|U¡PÀÚµkñÄOþ÷¿ÿo\ñá+/l`¡ªæÍC—<¦çkÿÀ€ö.¬[»Ö:“Ê^R¨ñ#\z饸ñÆãº4à™€¼ÁÅÔŒ|‹¡ÐYðRÕsrËÉñ rUäÀÇÚ0òØd åšÄôLB£ÝÍ‚ÐÚ”GwG&g+xņ¥èloD-"t¶7"”+5¼0<×NŸ*¡d:VNX¹´¹0À+îÁ²Îtµ7¢«­/ô?U½yäfŸFµD jª–0RîÂx°‚•À4 4¹t”¼šñz€5û˜*ÍhÕÍu ýÅhO a•dõ’£a•¥'L%&—®U^ÃHf¬ê¸-Ú[ÁÛÀ&î"›¸Ãi³A¢sj<1ªµ*>ó™ÏèóßúÖ·bÅŠ•VÙNbeLÕ°ùeÇàOþäOpçwêk?ù©OáG?ú …¼Â÷ë²€ÖoHµmÆ£pþŸŸo´N?ítœžópa§dò¯_·Þó’Ò°.² wêÁª–Û¸NˆOzzŒU,1thËW,O°/’‘¤ˆLƒH:ìyÀ³ÏnÕçl}öYÈÈ€RUOU®¶¡±gžy&†††X™I³x¤èåˆUXSå„…ðTƒ©cϬ®pª´A*:¡KÎêi¥²,tu>5›¤ÎÂàÆ¶Éö`µ¬]2e`±²¹ª·)-ìf²$ó† ò]—üU‹ÙÁdAŠö‡»ã…Ūg‘ņ'™Þ „Œ‹ðªÿY!­¸L¶ÔÆ>Œè™,a“ 骒I P»Ì˜ ’³ò~X)åØè‡Å6T"ÀKƒTW† ^ä6«²%Ù¹†IFÁ¼•ŠEP•<õLßK²Í­”f!WZI†…äIÙeNÜ£«ZZ»|èu|óf°Jš¿Ë®Žë¶ËL»@7˜[ IP©ªŸ0Ø78Ÿþj7~òÐî„S™A­F kÀ®³ï²ÏǧËxvï( ¹#3xz÷(J•ãÓe<ôìA<¸ukz;Ð×Ý"B!$9ñq6ô-FkS·<° m?„+ãô—· ½¹‚ ´² ”ÊÊ% \‰bзO8Ìz–»‹»^ì®›ÌÝP<¯?ó¸`‘Ùd˜i®‹‘)TÛuäŽ/elùm×;W”×Rt\€™È]ë1¶,ª^ø×ýWìÚµKŸ{æ™gZn2ž¯c¢ñg矾õœÝ»wãÚk¯µÇ)yNoooª]ïÿû¬ñ!ò7,Coùòå]B)÷qoo/Ž:ê(}Þ1ǃU«VYTmÆåË/?´úN[²ƒ~ÌHÀáÃãúë±±1üâ?wbî¶ëóÌ3ÏL\îÜ9áÒwåÙqA‚¹ù&‰Ëƒ…¶f}nË’#8}ïã­2s;¢à†œÜйx&K‡:.tØî~.«Vº2yd(÷ßÞaRÎ`¥Ÿ•*v8ŒãÖ/ÅëŽíÖçaëÞ‘äšÍy´5PLêž«ŸŽÖt¶5bd¢„R¥) OïE!âÄc–ˆ01SÁƒ[0>UèélÁ±k»ÑÔC>&°·8¶ß½¨ -My<öÜ †'f14>‹‘ñ)œyÜ,äÈÊ(¨’ƒ¨ÔP.a (×…ãÅ>n¼ñFëÿ+VÌûÚ“N: «V­²Òåî¼óN\vÙe™MîÑGýÈþ‘IÉ×¾ö5|÷»ßE>ŸÇ\pD×:t迤׮]kýÿá_øÂpÖYgeö«s°p̉×^hÏéüƯ=—{V7ã&àgîd‡y‹ï襌‘çÄik‘Œ]A/Њ½-Æ€¸JBñúÚͽØÐ·»&ðä®D’ÐTñú—õ¢oIž{a ¿Ú:ˆHò¶XgKUD‘Dµ*ãçE„-;%»rààè ¢$–686ƒ§w£V“ضo4n'f§F°¸-B¡¶²!öÈÙ¼t SO˜H%¹›€¾dÕ”LMRa»Óæ0°¤$<½kµZ„“6/GÏâÜÿä è[Ò†%‹š19SA[SÁr/åó!öšÄ’Žf¬ímÇÄL'nZ†eÍxô¹CØ?4…×nîÅËÖtâámƒ¨Ab¦XÃ;‡1S¬¢T©iÍ16UÂýOö#ÆÕqk—åÐÛYB4³¨a ¨–#–KQjZ ”²Ê2& b¹±:&Â蜈œÂFè7‚œÄ鲸e¥C8EFxµ!cvr†ÿ‡Lˆ¤©R@:Sz¸X]°%£œÔ¼ÒéEÓ®ÏMŒ!-þÙ³guM†hnjÒ,cR8U¾$%Åíèë볞EvïÙ¶&gÖBlŒS\†8#œb"rù¾œ‚0n:ÎFF![©B`td?þññ£ý333hhh¨3½’þ“";’ªÑJ$ ~666àCú>õ©OYgßrë­¸çÞ{ñÁþ_øËwþ%r¹¼'·™» ±ŠP²¼x)C‚X,•Ð2aƒUI\gi3À1#¬†¹M0ÏÓk‘´ë踬aÂÔû'~næˆMϪsÉÉ G S[ÒrA©1¶À±ÈˆYk‘Á=eQ¾¯$N%› ,¡2¿­jdÚŽ–¬X Ù6„Âå(œ“ÆÈVE¡ãìJ ‘ sÚj;× iðþg€ b¸²Éwu¬_º†7››Ä+)*9âôLKÆÍhij…*fF3 ƒëâ1Ü 2X3ál¤vä£JÙµé3cè<î¥Vˆ©ôÛHŒ©€nV|X]Ëv®A—CÍç‚xžúï| vŒãç[öA€ðæ×®ÃÉÇõaÿ¡ LΖ11[@q:[’g>2QÄ ÃñÂý†ãúÐÜç°¯ííÀúå‹086ƒuË;°zY›¦~•Iå/Ek~âÎË…¹@`i{ǯoÀ’EäÊ{PšÍ£ZP­bP®'ïÇøÕ8I™Œ…Uñ(ù‚ ÐKZ15i¥+H-ÒIéH +ü× IDATT;uä¥õL˜v@RšØŒTÏ•Z|¤dñc‰¤mÒR–àq3”q}yõ7Š"ŒOŒ'“—L¦…„“’#µ±di‰ÿÜŽq{Ö!’” wð¤æ1¸¤4ãò%ï%Ùã±Äø:I‚Ä“O>‰+?úQœy晸뮻pñ%—àg?ûN8á„Tû$ÉØXSã©%Šü Iõ\)5•)IàÜ·¿ï{ïûR×ÌÌÌà‹_üÞñßÿ;úÕ¯X_³ ¦$Jã2)ÙbŠCš8¬”FÞ%‚ÖM=rä ’9O˜¡ I7^mÇŽù²+yÊ­T B,ã$Jfês5Ò¤Þ‘’ù-“³ÔuÒÁ%ß'F2IÆ”dŒmâ,XIkM_k*J¾SŸë>’–lî&º½H)Ý u†Lã’÷%Ö^5¦D|L¥YTµ<+¹“ZMòpµî+ui•:7æo¾þ¸0®G%R)h’Ïu+ήދë7îí’fÎH3wÕcð"F~¥•V˜Ô ±xÃIë*¸˜:Âjk^RB6=_²r@2)Š")^Xk‘„A\V41v8txw=²'£Ô·íÙ¯^–¦Ž^¹ÓÅ*!ÐÒ”G. °uï(:Z06—þ|ұ¸s1¾úÕ¯ê:PxñÅáœsÎÁUW]¥ég½eäRz„ü{ì¼bIi¥ŒÐaúzòÊY&ÛrŠþšê2lY¾®Ôý©.)Mê½3Á£ä™/ékÉÛ~Ï](‹°*-Gä ¿¥)¥ÝqöWÛ£úä5YïÚÙ“¿Pe½gùái%Õ§¤%/E÷\ã/%­/TZ×ú¢ƒâ´Å­y‹„¸Ç&gÊxðé~´4å! Ø78‰åKZ±zY¢HÆD2@©RÃL±ŠžîIÂÉÇõáàè ß9„ èYÔŒ\`ßÐ¤Ž‹/]Ü„WlXŠÞî¶ÇiqlÄS»†!%a¶8…¶v WÚj© ª@Õ Æ+ÍÆ*r ªÌ0_8þ«ÎÎÎÔgÃÃÃØ°aüï‘bSó€À~×Çìì,®¹æÜtÓMBàâ‹/ÆE]„‚Žó¿xÇûÞ÷>¼æ5¯ÁÕW_íÛ·§¾¿õÖ[ñè£â+_ùÊo\8Ž…ãÿ옣ºjñU™&ÆQÎJKÈå45äB>DÅ9”ù\ ãPAÿ_ 㔵(‰G<±sÏîEKS^ïÐÃ0€Lr”kµí- ènoÄ;‡$†ÁÁ±i„B È ,YÔ‚7¿RîªýÃSˆ"BgG#Ž_¿o|Õ*HIؾo=íe,nÍ&vƒ*ª•å’D­u=ŽFA†hjÈ%)p!sP”TUcý›FKøÂ&)8š¨¿a³F‰+nts~vëªK,·}Ž7% /I™2g&œ8\|åúõë½ º+»TÀxòë×­[—òPefíÁéSøŠO F¶‘¶´-’ŒdìÕ•‡Âe—]¦Ã —^z).¹ä»¿Ôí3jœ ·Œ¨¨Š#J Ý’ ›6mÂw¾ó|÷»ßŵ×^‹™™ë>Ä%—\‚믿«W¯±Ð€&§\0ÁsêàfI‘]7]6Ãb—7uJaº›0¡ò½b¤‚áøgN¿ZŻܢ—™àU—RhîËYç9Rç…‘Ù¥®ÃäxP£Yem=÷Íš©ÁcŠÌT~t®rË1 ·­Q$é2­Y­.{Òàºt|²Äycüõ¢3®£¹ ÇÂÚe—×Å‘ÅÐS4¡db¬Üm`Q(ò ÏÓŒƒ8ºa¹@ !—C!¢‘O~ëŸBüÿ<Ÿ‹_ltx.~äÂxqïYÜ !bš×0ô*­ÚÔÃkŽY†|à§ú±mï&¦+˜)U±g`wþz/ú‡§ñú—÷aQkk—çЊ/@–ˆªD¥,QXúr÷²Íhj0ïÂÉT$àÐ72×7Ùñ+‡S&±u™”ºØŒ›7*uL(‰CIÊ®b…4µ#ˆÇÒ÷D:T´¾#ŽƒÉÄÓbb=’²s× qLÎJHEÖ¹nβ‰Óƒë×­K]³cÇk¡$†-бsÝÇÀàà u}cc#z—÷Æ}mU„ò·OÅ7%ùp*˜&ëÔ2P‘WÉpñ=Ëå2>ô¡éÅü„ãÇE]l_ã•™õÍ¥ætÐ=*3Þ'3 SÜHÇñ&îI„0—Ã_ýÕ{qË-·à¼óÞ‘2Œ>ŒoûÛ&î˜Ä¥dØ…§ #Ã6}©*²84ÏÉÖñ{Ø”©ÒâÈ€™KÊKÈ<…ª=’Xœ“ ‚ã$¤Ã= ‰ àäg+9’æ}$™˜¯ŽCÃèQ+D¥æ#Ë%O¤Îá/€î~-1l@ŠÆUÚxƒÍ!3&<–-áPÚ²2Î6¥-`ë;iãKa|8媹Ÿ´ú3¾dc¤§™ÆÃhì„´s»á®c2Yä¤'®áOI_Hiôˆ^ÿ”I›®WÏ-içèK‡*[é 6çØKž7/³ƒ‚9¿²fË’¢Ú” =j±ù$;§åe¡'ERcX2v¹R%Âáé!ÐP“z\ŒEQΪݻú.¯v¾ ¹xÀ&g+ÉBh R‘Ï47æqܺn›ÁàØ F'JÚâYÔÖ€ÞÎ<»o»úÇQ©™x`-’˜˜.㱇ðöS6 £1BÏâ t(BµØˆR™Qû««1>SÃÌl5Îo' ¹!϶^’ÙZĪºÎ­P†’0hGe… =ƒ\t¥á…”0èUÈŒí±”Œ…‹‘°g‚Ѧ¯t<\‰`Ò&©¨0ZÞŸä¢Y–ࣉô²0õ¼…A†’Ú;:ÐÙÙ‰±±1}É]wÝ…_~9D `êÌ ¾wI+† ¥wçê|†eð5Òpv)T¯diŠnl.+A)S©0¾Á¿ýÛ¿Y©h'ŸrЦ¯U†­LPºõ Qé…SSŽjü“ß„â,{<¾åqÌÌÎàÔSN…f|K2:;;ñ‰O|o~óŸâŠ+®ÀÔÔ”¾Û}÷Ý)%‚„ðF¡}%qœ3Œ÷‰À(z69áÄö¹çOH+ý‘ÜúÕ <ž_’!àIïÆ5[ÛBÅêL»?Ì®)aÛ#2 rª_H*–=›êS;SØûŰÁ2ƒ(×sÜÔ¤Ws^!ì5à 1JïmX Ý«°j‡³:àÉ»JÝ.Å*=)XºFº™&AÚTÏ69Œ°)æ6Ç'yB§å)0€8‘ÂVðje6)ŒBþvMý*Üx¶Ð&‘`yZ¦”GÇÉæ3.´÷Ç%»ÒŒ€Òd I>vBSäšúê¢.9T&ÊÚªàÀ;é°ÁÙÖ‡L½ƒ&ô¦9+Òp1tõÎnK[x`ÖXüû¹ýcøéÃ{09[Æúå8ûÄ5èjoÔVN{KÀðá"C˜“Åš66QD±\ꥬZ"MïÕ$‚Z€J±†‘r îßߊŸî×9Õs•Õ¦ 6µ»,p’Þ­ƒÎQð2Å:g±>©ï3wèÌÐàmJ,]½‚&»þ\¯‡£DZ,–¼»@…$•|—#ÓøƒHJƒðU;W§0[&ôСCxl˶ë"íI0&¶1˜ Ùä+oyË›Óň2òÐ% BØB²²]§´˜Ãüc#™{Üxu$¾÷½ïYç}ôÑz¬UßÅFe»Ðy¿ºl^^—»-[°s×N|ï{ßKÍy½³ðªW¾ ×_=–0áØØžzê)ƒvúS •U­<*’íì¤þßì’¤¶¼ØîV£¾­ý½S(C¥æÈt±"bÙ›—4»ì¤í|w+-æ2›­Íì䔌H»/%/8£v‚vûÀP÷f÷›öÙefø®Òßep3‚ht‰j·t 9j¬¬§8‹î_Ѷ0h/LßJÖví9Ht“L1æ™l+î •Ä¼Ž÷ Ü3 æI!»PTY6`6ˆ{KÈx숷GݧÇIòuC:žÎègZ¨î-ýVy—;ìjHnu$UŸŒª?¬¡qiTSm­ RÖrqêWœ¾&ãô¶8},&™É…ÂéßÉO.ŒWkǦ±mï¶ïC! µ)ÇЃØÊ"怯 ôõ¹äÙ¹œ@5Í¢·(”ŸG¥”C­" ªŒ‹>äÚ–#Hڙυ(äB„+6ÀiýRÔ NÅœzUÔR‹xýdò}±Xôl&eÊp±…9M[ÊS$T%/u ø«ÿ°ûº(ô'lŠO7zjrÒ¡LS‡~èCBKK‹uÝwÜ‘¢à´ )Ö?ÿùÏõu7nÄùçÿEº"ؤ2¾ùo«,:\J=slì0>löÌ3ÏØä/N3—÷ݳÌýNYU²à±ÇÃlqÖ¡-µ© ×¬Yƒ·¿ýíÖ=GGGS}n¡éêkܸ@F…- )ì©ôE5,ù+ŠeVsd“|´È¨#ûõ«"¦*+z(eáyòV”C}ÝR·zc½ªj>úid¾êVâtֺχµ€ÁC3îVy¬WñŽàÈ ¥+¦Æ~jß” úª¯qúÙMº‡:ó¬b瑱#‹¡ÿH*5‰J5B¥¡\•ÖïJUÆß×øÿ‘>¿Z•¨FÒ|^‹Ì¹µ+–´áOOZ‹7¸ 'lXбÉƧËúžCã³(UjèélF-’æzu¯ªDw{3óm“Ñ(dy¨„¨”€bÈ-9çœþ*¬_¾µˆtÛ¤üÝÃÜÇÇÇçõÙ‘kÖ¬±þô¢œ98í¦›n:¢6tww§vÛsK–,Á?øAë³»îº CCCs^{ðàAÜwß}úÿ}ìcÃpþrì¤nͱÎJ¥â]\}÷¾ë®»2ï;22’ÊË/•Ju’G&§Õj¿üå/ç<ï4^˜À±Ç»;^8Žñ2á”&õ‡ÇÒ&ÏŽ+mÁ!åèãÅAd–ÕæüHËUKÚ5¥¿“„0èjo“;‡ñ“_íÆí¿Úƒ¡ñY]ªub¦‚gv`Ͳv¬ï[¤ K©Cg{^±q)ú`ñbBuj¥D¥T©¢T ±}²¹†¦$Ÿ¹-¨<–±kùò‚ n ²±cð[}n±ßNmttQYy“ÖN¥žõš5k‘ËÙp‹OúÓñ³È.Æðãÿï|ç;SõÁ'''±mÛ¶hMõÃR§Üêðð0ž}v›Ã~î¹íøòÿüŸV_þùùŽM›ŽÑ×MOOãïþîïP.—ÓµÆY_ÿûßOÜ»ÀÛßþßðòã^ ÂäädªOãŠbþAj‡‘Üwbb"å9™žžœšÝÝ]])¯ÈÞ½{ñË_þÒ)nA¸ï¾ûpá…¦<3ýè99>~•jE_7Êpz|¦¦¤ët+™¼îºëP«ÕÒ•Ù®¾\®Xx„îîn«¢Zjç ·˜ˆ·ì­Çí­GÀ`W±Ódy/½«·ŠÀÕxwÉ t.ßq:EBÜÚéâ"”]#Û)˜…T¨„šÝb&žâEÀmªà-4eyV@…W`é9‹LŠàÔ‡̈R!XÞþÂ8ö;ÂWdÇñÁññ¹éº03wæ€ó‹£¦da˜º<Þ¦:³P‡ú•ãb|‡4´}dB³añ” ²(KÝúÂ"‰ÿ›¿…E±©²ø¹šsWüùÜTrë™ÆÔl…O•tüFƨElDß’Vœ}â,]ÔŒÝ㈤DÏâ·a òa€ÇŸÞ§JˆÒ> RAµÜŠR¹†ÃÑ"TÛ6`j¶Œþ‘)]å `Å7T|Ešò¢ä–ad€^³9‰Õ E ë”°ŒbU•j”²†;î¸#5žµZ ?»ûnœu&+¨!|$|Ü x­µ­qÁøîw¾£Ïܹs'.¸àœ}öYXÚ³ »víÂÓO=…^xïxÇ;pÑEY.m¸ä’Kpúé§¡¯o.¾ø¢„]4~ÒËŽ=--­˜™™f»æ«pÕ•W¢«{ ~øW¸á†pÍç¯Ñ”’ @€/|á øøÇÿO?ý´vOþóŸÇ'?ù)SªPcp7ܧ]À;Þñ\qŦT¡>Šç‚»û€'Ÿ| Ëzzb wIM/ F¥Ÿ³uëÖÔ}ž}v;N<ñDM)’6œ|òÉøÉO~bû·û·xË[Þ‚uë×c ¿>ò(ôÀ¥—^Š(Šðo|CŸûã›nB˜Ë¡X,âŽ;îÀÍ7ÝŒî%] lÝúLªûöîÅš5k@ià1ƒâßø.ûàez`JcÆ€³»ïù P(àþáÿau®U|4¡%^2R2y³C$Æã.… N3)G 롪R©¡›<ˆ•|…°@¤Ø1©A•qÉJa ìZ¤ÙƒriýHªFºš<˜ìÚª+±T+]Þ”¦K ~#+wB3Ž»¥KùÂ)L惀0LÒ¬ö¹Ð Ž`•P½ÆJ³Z)Â,l&í/R—ZF($Uœ¦Ö© (3ç™Ï¥I1TUWIC“¸º/š’¬Zlð0È&5£žRÌÂÁ;ipcRèò»ŠúUxª¸ ]ÏžáHj‰5¥ˆ]v¶X–YÚ³ŒÇÄ!âxz\o7Î=W/$9ã2©¨aRW…)ÁªÄ\ –b¹Š]ãX¿¼;†”„U=í˜.V002 `¦XÅýOÀÆ•‹±iU'^½©A 0=[Å CSxâùAt5N¡£© yx¢rˆ JˆÊ5 Öz±´oF'Š˜.VÑÜC˜¼*Ÿj13‘ÙjãðWƒA•«U„4«ŸÇ—¿üeüñº•Réí]†k¯½×]w]’.E¸å–[pðàA¼éÌ3qÆg ¡¡€gž~wß}7~ü㣭­ ŸøÄ'pÆb/<urj÷Þûs|ûÛßN½ËW¾ú´´4ãõ¯}bŒr>vËøF­ZÅÝ÷ÜÛo¿=uŸþç¯âïÿþïqôÑ› 8H—_~9þó?ÿÓÚÕK)qÛm·éÿ7lØ€ý·ÃÆ£ŽÂã[O¹É¿Ÿôåûßÿ~tvu¡Z­á¾ûïÇ7ÿßo¦Úño|===Ø´i“SÙ×_=öîÝ‹O|âƃ@Àž½{q×]wáûßû>òù<>vÕǰñ¨£ÍÒ( ÊÜ$òrõÂŒÀªÊ ù8Iµx0ˆHíz3ÈBÉk”:O`›(Å¿/4|Zxv|‚\`|ƒrWX¹rÁøú…Ê@€Îþÿí]MŒÇqþjæ½·ÿ»wI‹”E›ú¡$!S¦`'²%>Èɇ Á99Äù`„\tˆO¹ù[Nç¢@€Û‰e eËȈ”%j¹ü'—Üß÷7]9ÌLwUO÷¼]…²ee ´ûvÞLOwuWWÕW_yèl•ôYìÁL9³¦@}»q3¢¯òx¢GÈòå Â6*A¿/#µS9°‡’’c]·0¢$¦¤Ï‘÷2³‚ܘ”A["ÉmIq㔹ÄÕÛtpÀ6ÐÉ&ðÊ)ŸóCœZýò½D<ªÙ-Rr­ÜR žª‡V4âpkèù­òÉo¼Á%>X׆Ã!–®^ÇfkÞü ‹sóÊMV‚þ0OÃé´R[ >Iò4¶¾ùæ›øÑ~„sçÎÙ4ª$I@DȲ xüñÇñíoóóóÑûœ>}:؈7aaa?øÁ*ìh/^Äw¾ó,--Œ¹OMMá…^På[?øà|ÿûßÇÛo¿]ëgŸ}/¾ø"Úí¶ýü{ßû^}õUÛç4MñÝï~ßøÆ7ðâ‹/âüùó‡µý˜žžÆ‰'ðòË/~üãã‡?ü!¾üå/ãÖ­[x÷Ýw±¾¾ŽƒâÈ‘#xï½÷ðþûïNœ8—^z ‡j‚™MkÚÇÜÒ4ÅñãÇi¤B3™Fæ•Ëj5!²I¥“ÿ8Ȇ¸|å:6Û{­B'vŠþ ßè:íÔd”yèƒÌ„0‰=YuÚ)¦'„BO“¢ªMný—…Wž9vGîÄùÅe\]^ÇWÄ¿ÿjo]¸ÃŒ¹©1lt6í,)J·fÜ7ÑÃ_þÉ&Žîú%ZKÿ€ÍËܹbps¹…+ü&ø þñÕ³X^ëbj¢ƒ[w7Aì™Å—Ý…ÕÅ·ðð‘C˜››¢{d Sé]¸Î»¼Zrµ®¬#©PËÚ’!6@8–¯+W/ãü»ç±¸¸ˆýûpäÈCøÌ®¬ 1º½^ý—8yò‹›@˜F©ÂåÃŒsçÎáìÙ³˜žžÆÉ“'1;;«è½Ü™ZŽ¥0SŠ.--áܹs¸ví|ðA<òÈ#˜Û±CÑ}Š1ÇÔD²– ƒŒ«;« Sõ¥g±…KÊ{gY†³gÏâÂ… "œ|ê)ÌïÛëŒÒÖãõë7ð³ŸýûðøO`vzZU˜Ì@Ú|–ÁåefìÚ¹ËÆoܸŽK‹—°xéÖVWqèpøða,,,L°)6Iç sv9Ö²PÞ­d³œZ,óÐC’å•uöK´†&G–mõË„Â+ƒZ¥ØóýÒ¬$ªÓAÏI…)LŽ<Ëm”ˆ‰ïr¸j«ë_%(œZ-ã*ý[e6£Àìr™ð‚•ýò«|g'Ú5›¦ÿMUî:T¶µZ™ƒª”õ¾ê3AÆžïïÑâÆ­Vk« }xÏ-ôËW¯c³µ¿^ìâü‡· =E˜'ù•: …>ÌòÈ|«•Xj ýîZ/ìl† W}BÈ cfªƒÙ©üº?>vlÿñ›%,¯öfÌMa}3Wè¥Û~˜åé]ﻋ¿z!ÅžÕ¿G÷òô®N`õÊÞ¾¹€ŸÎþ zcpùæ*Ò„05ÑÁí•M„…ÝÓ8ùð.¬.þÿŽ,ô¦5­iMkÚÿ¿Rèá:¼úÄU¿¢Þ°Ã ¸XSyUÛmú¼Y~IÈäJ¨LûÊcæ °pÇ[2Ä¢OeºYnÑ•.÷¼4kfr…~ëî&ºý!¾òÄýØ15†þùyÜYë!+’ûwÌŒcz¢¯­XOpøÀ<´g é Ìæ"Ð' z„n±6þy\^ŸÄÊí;0 ŒµS 3.ÞÇU[Ó±è)’T+ˆbA‹8.k•—zãd=+Ž¥M ë¯w@s±«øµ7oÎ|¦Š7Ç=ÃÊ´ØSˆàEÉy*åþ-CÚ’éŽÄâ²ÎRˆ*mûË}VAÂóÁÁðy\¡« }°ü£_zELÓ…'˜ê#X?ÊAò“²vrA.j\š@™~Vr¸Sñ›^þL9ÛXo{>³w+} †æwMã«Çbvr ÿòŸðöû7fìÛ9‰?zbûfîbœßw‘u[@ˆþ€°Ü:ŒMÂt7Õ;ø?ÛeÃ,\@‰ì´4ŽRm N] Ø)v ZÆ–Å:p©¤Êï !4xTp žBáÛÙ¬W+ÙS4JØ|×c~” DÔ0 ÚKY?¾œO R‘ýj°"ÍÃkŒØäË…j,e­– C}„ÄœIDATšÛž1³·ŒpáÊC‘ßPà ¬à7ö3i NoWN€ÊÖò¼õGDv-•™¶Uø˜¼â˜\¾ëR›%ÉÒº:%äÜ䂵|êÑ|ÚåsäÁFo;. Šý¦±²çÀQåûÆJÆ*fFp”ÉÏ^k Š‚8 —Ã?«’2îï0O,B;,ƒŒS Š:•`«D©“”•æK «¼’Ê DèHXHjö(Wí x(«nÊ]ݲÄÄê@j¡@˜KJY—ýPR{¨;«Èĸ¨¹ò©öCÕ÷òäˆyQ Ùe”šEVƒ™j@BRî–Ï4Ê+ö †¢ÕÅvê¡WêÁÆKðV$Ÿ#÷“‹¥LóJ {‰~/V¥´ q1¨^ꛌ‰Üàôú^;ó!ŽÙ‡ãÍcßÎ)ü×Ù+xêè~ †½Šµ 3ƒaï6’™$½Á:½lv‡XLâ7+»±Úé‹>Ãþ³ž»ñx>¸¢«µž#uo9xÚŠÄuçj]ÞXô¦7â¡j˲sðm º4êV€Y•OH“ÊÈ”³•^(Ä„•OÁ{Ëüsò2ET‚,˜qæÝ«¸yg_|t?žÿÊCdÞºpÇžÇFoˆ<ëŒÐ 1Þîb×\fù·0½ÉÈúÜÎã-ä `GúVÉ/+¼çãs|Лß –q‡%N ¼Hh"ð¼CƒÙTJ]*Ö‹ø  ô ýAò˜Cà„1€¢_ÄÒ5¦z£~"`£ Ð1úÿLé m¨& XÒ¥%½UD¬Á6!ÀbcëA°É½J+Q•b-óv¥ø—«¶aªnÓÈö3bR½™‹È‰y ¦&E\`£rïÞ,u)M ~Cl' ÏKåRã[w©5‰ËÔÖ#ëjJŸ*…"î‡ê¾G\&±ŒBû,×®Iö)T/¤ð9µþ–¡9¥ø½×Ë—{åðçŸ0¶a¯y¾hf`˜•hvc ²Ld²0(bè¬Ü:ylÝÅÐËØ<#+xÝË{š"Ùß0ãÂÒ2VÖ{xüð^ܼ»‰þ Ãôx}v7öïšÆ03€ ¡›˜›ì"½v«›môú ±8¸ë<‰Ä°ëÂÈ2÷{f¸Þ’ZA±SG¬¥ºâ+žáÂ}ðÈ&¢§õ@´bŨ±VÖHøˆ?ÊÊuÜ÷-·Ñ§â°•Ä5oÁà‘¦Y°ÓQï Çú‘ç‘ãÄQã. 9qSªâå©Z蛎{:*–6Çä{›nº¹Šög”'„£®!áQ‹Ø€£=N¨®o±r`ÃcÌ#×0G=Q5âÂ\ãqãZ¯Oí#¶ê•Œ85ê\_\¯ ë—ð–\iÛóDòèaÙ‚Bñ‚`È‘i-tHpTpÓde“¼0 ÛŸ ÆÆãÒ„`*hÊŠ59á *cP `[iõ)¹˜FBÀ­•.þíÌEK6óë ×Ñn¥Ø{ß$Ú­)º˜›¾ ³¹ê¯ í'ö2lôS\¡Ïé’âÐ@‡Éß”H¨x IR rŒA ¼"·2ŽSZnõ!¬{ˆØ¥]hÐS1%øGÄ’ˆý´/×?™òcŸX¸)ã:ò¿,Ìö4¼ãžç‹‹JMbù|ñþ â-òP{ÊëT9jà –“:“·™’†’gOÛršRÈ^ú ÊTÊ.ÂK•eOe_ɱ6Z슰²—:FðþVâ&ì+W<  :•yÓLl°Qª´ )YÖ’È:ÝÇ2eQÉ+¯Šdª,­ÿ@wm¬””¼@⺠A™$ðA¤1ŠžZz„\Z¨ˆ<¦³*PNâœá]Ƽ©Ò¥Œ¼~ªX4i «C€¬íz/§€I¾ƒ –+Ìi<Û P¨J¯Ž–sû¦“7 –ur¬ 4[Ê„T_ÄU–ÒoÒ³äIÝÃÙÛßDih õ½b¥Š´\½Éë4ƒçG‹¡K‹Ìˆ@=‹W3¬Q (ibËï;DÜx§…Óã€v+Á`h¬rÌÈ«•$¹Õ MÉ–ì´RLMt0495^~py蔲Âbn¥yý^còx7Y+Úà¿ÿç*†Cccù³;xì¹­î9ô» {ã0ý–û3Xë|sã“h¥ÎÐn%˜o[@ÞøX[IŒˆ±9mØQZLå꣔4BkØIà”]|9jÆ” ¶ßGèŠÃ̶ÐîN¥™t=vy> òî®Æ»Ü¯åÆ1}AÅyXÔN–žc7M¸¹÷˜¹B–ªâ÷'ï W‰!J¾ê’6´€í«;^¾· Õ’„§P 1Cj÷geÑv J·áÐ5ãb¯¤ ãÈâD'1m–´“JPßÑ8#÷ö©Ø§¬Âóß*ࢦÊQ¿1y6-{Œc²æ¶å…% ˆc¶;eÞvyõ,X:!ÖÍ$(ןœ9ö<~²–^aàô‚ Ð&$k¨UšÀkU,«¨lŽV€Ð<Ï v7R{‰¬yÞ(Ö§!wd™þLq@¶œrÌ ^‚ãTÜ…$C§!KïP'õWëÙ“ªøËä§Ë€¥ö.3DX/š º¼M…Hûñ|\ã.ôÁå={ý!î®÷@B¡3€vš+Ûr [©Pö)Y„ûX§ÃÀŠÍCO¬»;MJ…ž \þ½œÆ”Š8yVä $§€í†–K~×¾LuÚÈnÃ~‚n—±4¼KÙdYOõy¬ Ã)ßgz²ãéá°3†Ã~·zßÈ Y<ʯWU>‚{$%äÁå,è6çí¸.#>V®‰ùð6œaàpx¤n~8ä”ä-8î86÷ÛA·mÙïDÕº×9*oa¬¹FüðÅŽ1ÈYݪªssÍý92Ÿ÷Ë«˜Ê~`X^ð)®_*>h5xDÚÒÜùcw“ƒGj7‚¸Ç¾{ØQx_«Ì.ÇÕ}ŽëB‚ñL†|qm( º`Ô៷ŠX¥ÜpUÁø„ˆóË–’×½´¼‰€AæŽ~.†ž·ò:f²ÕÕh˜¡Ÿeè 2YaQfÆ1Åe™)Òi°ad¥õN¥²ƒ ýÁ0¿ 7½`¼{ áôÌn¤Äô7qÉFS@qß²ÏI’“Ñ”ýtýõP© ä,-™×í{}}f$ª˜¨vá(põâ1¥ 3•Ϙ¶Õˆnœž.Çv›(ä`Î:‚vã!¶©ƒ°ø•›ž¯s/ûy³rübØ©˜!yïÇF²0\ ³ «Œdé Å<6¾ Ë!âPŽ¡§ Ç[>&Ø%¢0%oà^Ñ© pÕ~ßòÂçË#jRüþöéÝPËS˜ñM2ÙUÞB{’I®âæ(t˜ó¥¯Ž—¯ü¼Ýº1¬’Ù™E,ŽDÆVÄc·ßS'KË%PÔlò]¼–Bœ(}‚ï4šÀRzO}2 YO­Gq`I!òNËB"¯š½¬­²Uq­ÉâB¾Û©]×\*rW n\ÕTÎey0s¹ÂÖ­I¬ ÷8w¹tí9W­ÍZ°•5\U7W‹D±V…‹…JY ëne[ÍŒ w$l.­3#¨%D^¸­2¦<”B—îwûwRE€\γ*ÞÛ”{’a%jwd£°®\ƒ* ¨¬d&úKªÀ úWIœ#äI†t(Ï7®ÓXÆ›¡Ê{êÒ,då@Q6 ëêØUƒc°®@&Ö˜2Òd´—5„Åp…ÔÛí?,žC6¦dw –‡öâ `ÊÊ{ÆÓäw"1D.LÏ­oX˱³“ÈV©”qyf‰qnt‰_(Ö —îýr]±ó/+¯{€¨¨h#ê°¸÷cäÖG¹ïv«ÔÅäÅ H\ÛVz©h•{]¹Ù9Œ¾æ@fm±²’$²îß9…ý;vlÝÈÛª‡íµÐ½7nÌæ¿s­°Ák¸8»‰{ã3igä=SÌ`ív[pŸÇÇ%)0ÊÕŽx{]ÕÍDšò:pÇN^e±?R¡÷ûýç:Î+š¾q –.×dSÓSxààìŸß£XÔ>I­·¾Œõ¼žø×6°Š}øÂæô¨0oš¶066†V«eûªb#Þ D —PÇ6ÌAÉþÅÁSð|Ì#|5sËu`æÈ;¼‰Y‘ Pá©uãŒøƒÖ¹ö0°gõÇ,ÈZ`S€m0lÕ`$æ.¼ùpÜS›Õ¸¿‚k1~…Cq èaë%fÈÖ|´µF÷bÌo5Ï8wYø ˜GHh Éb8¼Vhý²éOÐh9c š8Í[À†ÇïbÜSX?_̉ÊnߺŽ_ýüŸ°°³ƒû<ŽÝ¿€–¨7=Z¡šöûjü/MkZ³\š—ø] Ƚ»ÿÌÌ àØ±c4ÒB€±±±±n·Û›™™ÁÚÚÚ=WÀŸTÅ×juð‹7‹™Ùøó‡þíNçžL†ôHP¶oѽnô)ÞlšÖ´Oùrù½¿}ÌKøÿ~#"Âôô4˜ãããcAúðèÑ£ýwÞyg¬×ëõ¦¦¦0Ñï÷aŒùÔÞäe­VŠÏ~=†={ì5yu·Ì*æòß`0Àp8Ä`0@–ej|’$QÿÒ4E§ÓA»ÝF«ÕJ½Ùô›óã=ü!-~}oŽ^M /áO†d$I‚N§ƒV+W×ãããcGí¤]çõ×_¶Óéü@çÓ>½^K‹ïc~ÿA%ȲÌ*ì~¿ápc Œ1 \!w«ÕB»Ý¶ÿJå$‰ýÓšÖ´¦5­iÛhý~¿ÿÜSO=õ¯ÍPl£}ó›v¤ÅfÀ€Iño¢ø| @»¸¶ÑÒMkZÓšÖ´¦5­iMkZÓšÖ´¦5­iMkZÓšÖ´¦5­iMkZÓšö‡ßþƒÚõú½ïÂEIEND®B`‚stem-1.7.1/docs/_static/buttons/back.png0000664000175000017500000000532613157571677020725 0ustar atagaratagar00000000000000‰PNG  IHDRdÚ[»ósRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÞ #HøD¡ VIDAThÞí™yÅÇ?¿î7ofÞ[X`A¹YpЪ**Šhª’xÁ¨Ä#FQKM4ñˆGbâÅ«Äx„Ä+à4¢$…Ä‹¨ˆZ¢¨­"â º,»ûØÝ÷¦óÇöZ›—]XcLöW5Õ3=¿_÷¼þþî]ÔE]ÔEß’®#ØqÇñ@`5PeŒé¿-k¤¶Ehæ©'Ⱥ9Ï‚ ¶\kmÁZÛüȼGm+ï1ÇLÓ‰Ø Ø6š Ò<÷¡y…ÿ1LÆ»ñ…m]`›©ÝØ00IìDÊ­M ‚¤,ž6¼ô§£äÆÇ “™d¬µ‰ˆ@­ˆVºýæcÿ‹yþ?È¡ß;D+-åuõ¹™¢õI"ÒÃÚ–óÔZ¿¥µ~C)%“œÜíêû7MÐZŸ'J°X”RuJ©"’Z¿~Ö\æ>Ì—º+Έãx‚1¦æÿÆBNœ1CWVWŽE©Ó”RÓ´µÖ‹¨JÔ-O?½p)ÀÄ GuuµS”¨sDd7‹ÅZ¬(1JÔï°Ü½pá_7vbÛV@n®êf &?F×§|ñ£ Ø ¨V|¥€Œ;&0+?Ø[ku…ˆL°-ñ F„‡k_x~ÉÇc÷Û»±iÓ)ˆœ#"}ZxmADÞ®ÌårO.{õõκ—V@i-°XÇñ2ç"Žøš­ã—$½hŒ±_ £ÇŒêQh.’P¸‘A‰X-"w•–†·.~fIÝÀÁƒT¯²ÚšÏk‚ã@².Ú7Ïi­¯êÓ§ûK/<¿¤ÐI`Œ{\ºÖWÝ|ÓÝÕ>¼|ç\}î8%êd5kI¬-(¥ÞÔZÍ‘?/~æõº¸ÿmýÔ¸M ¹Ó”Ò‡Yk- õJÉ<¥ÕݵµuK_]ºlk²ª@w`¥1æ‹Íð}Ëïnà1ÀçæúeÀgi³1 :Û88ØÉY  xÂsÁ–zÇ ¸8×M]nŒ¹j«0p€.òýÏTÍz†;'‰EDDÉ«J©[Ö~¾öÉêš PÒPh:Pm*œ­”L²UJ©‡­µ³W}ô±ÙeiuW¯læ{·¹Ç›;à ̾ßÎëî (’K·§¶S¯ÅÀ 6¼Y`O x£Í|/àAà;@8Ë3{«-$×Û±§”ž ”Xk±°I+õ¸VúΪêêçúöéÛ½®®aºRêT%2Æ¶Ä Þ×Zß+ÈœêO?]³Ö»O±»r‡Ô“€¾À]ÀCí€1֥ŽMÀ`¾³ŠÏ©Nîå"9 < æù`.Pìä‰GÚˆŒugù’1&ïÖØËñ vþhcÌß·Êei­»k­÷Ïårg(¥·-E_ADªDÉÓ·nØP»PZëÁë7¬?*•JŽ0´%ã’œˆ¼©”º+_ÈÏ«ßX_·î´YqÏê€g5pŠ1æž,ã)àbà‡Æ˜ª"žýÜíKEâ:0ª€ Ƙ÷Û¼«ÎØ\ýÇñ[xͱj[bÈ`kío›ššvo­°äçòùÂOÁæ\•ˆÈ‘…BáêB¡na³8M¸)ŸÏÏÛÎ2íRÙNÕ©ÌÏq`< L6Æ´¿Æºñå¢ôõR—¸L)cK}YÇ¿NtÏ·çcš:ûÛUÑs#ð‰ˆl”(”R¢”ê–͆DÐ.µÀ: JDQ‚R ¥TJkÝ·´´[÷íÌXFiç¤õrß[âùÅ@Ìãøè"@rné¸öÀˆã8pû49-n¥€xØóJ'”ÇkìÍŒ5ÀƘ³¶Œ³kmpY:>I)5C„nŽgœRêº îðÓéÅÕŸ~–K’dïûž—š)"­>´—ˆœ®D•Fee÷QS³j;ÝÕ²¶“.¿¯ÞÞŽãø=à1àÀÃmXiuwƘŽ,hOúÒ¢¶Ë$7>ØÉoÝȸû]]v¼1fÑv§½I’4$I²¬gÏžëÀVj­Îéc­í ®”*‘Þ¾N?ÔXhZE½ilÌ}®”:SDÒI’ŒPJ¥Dí²Ë.;Ϫ®þÔì(@Ú¡§Ý8¬hþ 7þe3²Å‘EõMgÝÕS®B?˜Çñ!Ƙ­îi©ö&×®]»²´´ûíétúª ÞÉd3„™Pù?ÎüK pV¿þ»ô¨¨ø¤qø®¥=ïÊ æd2™†l6K½ýÐ?>“Éü¦|ØÐñ_! ‘‹ë”ÖÖ÷ÊNòr'×Ü ‹\]rkí<Çñ¨À¬¬Í–”Ì ‚àWa¼XRRB6›•0 Gø¾nYYÙÙ£÷5dÉ‹¯'ŸTT¾d‚ëü }G&›ù,›Í†a‰øG†axɨÑ#'^îw2 —:Ó¯ÞÛû:.t£·Ù‰n\^4ŸwcÏNvp‹[½¸è,ˆã¸ÿàï6të^2? Ã+‚ X˜Édê³Ù,™L¦¿ïûgú¾áãÇíðîŠ÷L6“¹1ðƒYa®t|„a8Ñ÷ýË¢(:vï}Çt&Øïí ±7Œ1›kÍO~éo/z]íÆï¶wˆqßôpSŸ±´6§tâ[wz9kj ìOœ’ôsI‡î, [d¬ª¬Î^^!J-O§ÓYÏóÊ=Ï <ÏËj­G(¥:tÍ!ƒ*—,y¹vÐÀA+Ò~z­çyýÒétÏóR©Tªo*•éû~R^>´bÕG«j;ôAQtŒÓÞEQý-Š¢BE~E½£(EÑaQÝà|u ¸ÁsgÑ#\ìà(Š>Œ¢huE™(ŠÆ÷ǶI.)’õ€C£(ú,Š¢ ÷ C£(::Š¢ókjjq¼S\½²ÀóeRQSS“DQô"ð#`ˆ›{¶3€lÕ_¸'M¦µ>A)uŽ3I¬¥ID–j­®ïß¿ï‚;gß[8püþ¾f¾­”ºTDƵÙgˆºÏó¼ëžxü‰ª4~mŽbª.3ÆÜÑÎý]*»S{ÞØed;@¤ÞÓ|àðöÝhŒéîxpàÎ,V ÷þZSòÀHcÌ»Û岊é™E‹? ƒ`Vø?ËdÂÊl6C6¦³Ùð€0 ïY·®öòiÓ§ö~þ…4&yýŒï{3Ã0˜›Édh¹Âž™Lx¶ï{O›>uÒégœ¦;pYÅ´ÉÕ¯fƒÚÃr%°/pŸ« š€U®²ð‡Ž~£s“G§»>Z½“_íRáÉíôÅ,w °ÞYò;ÜBZéøãí•Ï7ODä­%e­õ€·<Ï{öûªÿ² ˜>m+ÉXk%|km“ˆ,ÜcQï_tᥠ]´uPS·n¥ëj7®›/bµµP($¶àûéæÙÀó–'¶ù¥D’\×iº¨‹º¨‹ºhÇÑ?“‡  if?ðIEND®B`‚stem-1.7.1/docs/_static/buttons/faq.png0000664000175000017500000006547213157571677020604 0ustar atagaratagar00000000000000‰PNG  IHDRôPï,‡ÆsRGB®ÎébKGDàààØNx pHYs  šœtIMEÝ!«Ž1Ç IDATxÚì½{”eUu/ü›{ïsªª«úÝM74 ø"±5ÆĈ(oxÜèõ^Ǹ&#Ï‘ïšx“‘34ñËÉ—Ä«1’€(!$(Q>"øB@PyÓ@WÓô³ª»眽çüþØë1×ÚkŸªVâUs6£GÓUçì½öZsÍ9ל¿ù›Àè]£kt®Ñ5ºF×è]£kt®Ñ5ºF×è]£kt®Ñ5ºF×è]£kt®Ñ5º€–úÀ]wÝõ Ýn÷FÝÑt®Ñ5ºF×è]?ô«ßï÷Ïõ«_}ë÷eÐ|ðÁn¯×뉎:ê(ˆˆhYO–åx ÏÃw~˜÷ûáŒêGsÔ?VSˆŸx!½äÿµø š«Ñ²ÿø,•±½ÓÓÓ "ŒrÊ)ýeô|°»¸¸Ø[½z5&''G3ú¬ºFûzt®Ñ5rá~<®¹¹9ÌÌÌ`||*c¨31VdÀT!XS6ŒŽc9.ØÐ¬ë&sA†¥1#¡úO~à‡¨aéGpL?šB÷“ŽÊm»æuÔQGazzúFcC :€îáàþ£/AO»z9ž˜#×íkä'2Zÿèžñ@B?²èeµìÏ)ÒIÁý .Lýq„"lõ å=-i] e;Ô㬊A’óg†Ô"xËCñ˜j±¡ÌÚe:ñ>Ò0ÂFß%L‰š#kÈVÛ•6è,M‰TiÍ‚ˆ:+0"¢>Ê Xm2Q²^o™çz„¯Ïd¸}oïʰn,Ç/¾ ÀYGv°mmŽ#ƽ7a‡úþögÑĆ5°·ÇØ1/(XÝ%L Ðã:?×~à‘C„—¯&œsD…—­d¬é2°“T²óÁ¡‘$0X¼‘áÀ*¥ æÝÎ Š„£'á`üµá3Ï"±?ï Áˆª€á¬×IІH Üný{Ö_+é µùÍ÷$4–œpÄ͆_ ³nl†-"®åVI ÄÌ‹²‰µ3@â”×p€pü~hXñÚ@ ³8kDêŸn­$Ò.J‡x¦÷×óGRï¥àÿÖ#ð`Ä¿»MFf,bd‰­Ã¡?€É(+1jK”JU¯*uo®±s+Va×ãªåX`åЊŠ6Ÿ);U/–?™Içàë uï6ëdÞÜÈ SŽN‘×a R‘ž zQ Å*Ò‹@Ä:ªC÷.«c°_ ÖiÑù<Û0ìŸzíÜêgDi)¯¼¢tèt§u¥ç¬c)Fµn#¢Ïõ:¼Vçzc¦ä>r”Iô;I“ ÃX'WévB`|õ;“ŠÞÖrÍDÑ4 æZ©dbÒ.…’A†4éH¢‡kpU”Oĉ‚?¨†º8tÊü!ˆÝá~/~”×¹!P¼ž`eéY9FÚÇPw# ÃíÁÖv‡¯fš{éz*w" ÛØúKÁЯç¥}Âç÷ä¸qWyêâ-ÇåxË ºxÉê ‡¨Ëмf·Ñ:wbÌ2r§tÑ9õFK°P{+@SP$üb%(HÐÍ‹$è¡àúów(p`@8T¯Z=ÀÊb &›–7N}AâßI|bBûç%žÍ´YÊãYjÑâA„!J q âµMW¨{KÞ^RC è Ҳ e#­sˆ$ UÇŸ—(¢ßöö©Hêÿ—\Ãð¡­2$-{U–/Áh›¯¥7Ű7\¥¶Äoâ–XVe‰Û7OÚt_Û(¤em£±É’û·¹—Eb.hÊqRo´¼›,1C¶‚´ê³ÃG Ê2l¤'·înìiiß]»FË(Hë°åÊ‚´*«–5n“ÓÆ[/‡þúöô3|湟ÞÕŪ‰ï<®ƒ378b"CO¥9ä¤B3Ö¢s˜K—8Lcsl>‹<fÀL_Ð%`2ô¨ˆÐeB9Õ§u{"­„ðð\ŽvuÑcÂkÖ °*çÔrt®Ñ5ºF×ÌU´ž~h8ñ‰—£QIL|ñžáÆç Ü´§‹-+;¸ü„~f}ŽNF8T‰IÓ02¢:”£BÇÖ°SæÃ7R± Yˆ ÉÚ<¡ÊQdfKFOÝÜÏpQQƒ È«:äž›|! ¡ÇµQr!ÇM{jàÆkúX³ËsIº´¡D—G·@-… E÷!ïˆ&`:Ôµvzýx( šï+€ TnÞ‡ÿÉV(%IˆÎmæÜç-àɆÁt¸Û"ÅÃ0®¯šñä€86:äˆ u¡Ç "åùÂÌ¿¹‰ QS„ˆÐë¤ÐJv>À^€WscA›v.Dã]|˜-Æp“ù¬(°Mó$ÑÄû#&² «ü,Qa±Ã÷a\ryE».ǫ֗ÄëÖ Â£> âÒǰ`9q`?I ¨ñF‰R©“ýü&pÛ¡Úõú„¿ôyP¢¨b lêJ‰Â³¾bBI(Å¡sµjê}’hx ² REîïÀ•nBÈát:Hœ$*vÜššù€F‡¸ß„ÎÒzªŒÊ5ÌþvÒãd2Ì{SC@Ñü‰2T«BH¨óÚ@, NGS„¿iÓ»ÔØ¡,æ1Ð>ëm<øCª 7äîòª@Ëõ)ȹ|…C@û\0„‚8ÆL)øüÞnÞÝűkº¸ü¸§®ÍÁBX(Yæ xf)ZíäeõÏP h0€T}PYBʤ¬ê߉@Ä€Œˆ ’Š<1†™½ó¨f*¬ÈV ìä(YPrÍ—;Ä6!«YáŸÕ/ •0vô2ܶ·‹1N[ÓÇŠ\T:Ý£“}d Bíš<–Í7Õ¹n„"eª8Bª,ÈAGÂMb³é¢ŸÏ&ýsøÍ.Â.¯ÄNYr2—v±€-œ1ß$æÿîÎA´hvgqèf!ëŒùü´ÀÞÑ﯑ºAjÁ‚b„Ã2ÉØO%<ô©ø&F¤ÎÛz0”?’BÆ{P3`6­frޤ+|Dɧȡ+j`•ùо!PbNæãªø{;yRÁQ¢”©íä7°ìQï:Ñ)`ïÃä÷EaõÁÀ`B,¬Ã@È%W­ ‡%‘ ä:ŸnÝY‡Wí¡Ã` Xå+•ãÆ£rë¢ ä"Ê(«üqP»%¤Öbu@Ñ2oAqÎL‹€62(IVUheæ÷в»Y hÍæˆI¹wê|‡³qT ½$eTý¾AƒÒ°ëÙ S†+p¨ëýBo‡™ÅçØ ¸LLåƒ:йá›|<¼óé*üÄTt°R¤«7¨Ñ¡ÁA„ÀÖ_ƒ‘­ °­"Ñ÷u› °´Fxù_Þ =ˆûû‡p;9 ÜA‰¼­×À"¾r ƒOïê`ãdËŽëà%«2,–õ@3¹E¤3“ÙP1¸ßõ ‹ó ~(KgÄ« V߇E@yêvqð߆<ñÆ6‡Î±' \µ=£ 3yAèU‚Ì(‚*ó@–…ŠPVŒgz9nßßÅdÎxùÊ>º™²ÅP†ŒCÐ+$dpªÝÚà÷ÚKhÉ‚¨&FP/-"­ò <ËÄÈXU½¥K)¿Æ¹Ájf ó~jÎÜG `mïäë)DÈB!¹iHNÕï"X€ëó E ÍDã •|ã™j#›w+žD㼌c' ¼‡iÔ¾Ÿ§àÎQ`WZæÖm9Y w&UB…†LˆˆsV)¸§?¤K8ÁÖˆp$WQ¼uÙ–çr¥@¨«KE-¯¨S©/¥Õø ¡Õ Q~œûÍã9DÔ[S'CäÁvVŽŒGg“Q¬F‚†Þ׎bð%rîYyìÁ_¡®óÓªÜNB`g>ðárF°ÄFFûÄá @JTEU&ÆxO¨=kÓ­úó,¡RÁÁft+ÏI s¾ø…ýDé/Á»Ô‡#V‘*íÔ8t:iýþ‡UZc §Y&(N†DÚÒüáß,Àwå¸áÙ.vösœ¼>êèU^èr3WÕ‹Ÿ‹@2£ ú}Ðü!ÐÁY`qRŒ×§Ø!}L^Pô…C‡0{ß7QÝs?ò©µ ½xéÏ`üÄ“1±j“9ÐÉ•f‚ Œ§ç{{ ÉêI_¬€> žîøâ1¬)'N Lž¿ ·h`™d)@´Îoh§–?‘øE–-M6N†ƒyÚ‘5Ã?ùÒ@¢#K€U¤ä—„2-ö#Ò ukB%Þcè²4Ñ:2t¶ld©{K»ŒJz.e yQ\Ãn-Cõ̰õ•ôVІÐxŽ´ÉqËZI|/YÎYöÛˆ ]^ZÞQZ?Æá UIzî—Z—&n© ž–”¬.©ÝdˆÌ-!êm÷“–÷o*ávpš´€ó€Ý’@ç%ÞuÈËüPAqÓ½ Ÿ~®‹Gy&xøÀ·î`œvDGOª­¡ö‚˜Þ"hf/hv°¸ W älþ\¿vÞíâО½˜ß·2?:8ƒlß.t÷Nã˜#¦pì1§`Õdq"Dˆ`OñÀþ_Ý]áñƒ¥i“aP2zYŽ's|í`ë:Œj„È]£kt®Ñõí*ÚÝŠ<Òågß#iÆŸ‚Cá˺¸o®S·5p`ÀøÖF¯b¼jCÇMe˜ìÔ™AžÕá Y˜öîíß]‡ØuN2ìòeA4¢ ‡v?‡Å@U‰,ËQ.ÌcõÜ^wh'6.nF1µy‘£ ÁÊŒ°i¢ƒcWæØ¼¢Ä§· ž©À™ d`~P¡K¾3?†-Ý ?·ºÂDÓzÆô„šV,¤I‹ ",..ààìÁŠ ¬_·y‘¹Y 3»#žZѤTþø½ïŶmÛðæ7¿Yž(8 ‘b<ò@rN™4¸lC–POâ³â>ö¾ð…/àé§ŸÆž={°gÏn0 6lØ€ 6`ËQ[pÆÏŸSN:%»„ô®ÎWV¹E­‹@I1¼Eåƒ5ÕšLžäBîq3 ðø!%Cž1ò¥d %sŠÂ5¦`ö˜L´.ãpø6ÀQ”s):UÒ:ƒB†3hYO!v6…tþ3<^i€*i’ 8ƒ vÐÖ: bP€i€æQyú| bÎÒ€0JÓäHÃñhÞ€VD$:ÜN*‡“œ8Y“D̵£Nõsì×@=á1@›¦ß«I3kî'~M¡¸ˆ›æÔ a%É!–LÜÐF:¢ƒßJƒeCíjÐj5€“šJY# hrâ½É«×AË4è–ª5Dó*ê,ª)N½¢ðÀ&b2à /q€Gæ |aóe†‚œ±¢¨7ÊÓ+HÕÃü Ç‹VçX3–ÝÞëAžÛ ìÚôʽ&éIå*DmÅÌR¹ÔëÜÎ](gg®Ás¢ƒ¬·€…§žDQ Š#6!Ë2 HÐÉ“«6è—‚ù²‡ísŒ±Œ0W z•àÀ ǽ;ØÒàÄ%Hƒ3ài@ë›+€)ÍR‚y Á-7ß‚w¿ûÝ ÿáýßný7œøÂˆï€6VYÑä ~èa\uÕU¸ýöÛqÞyoDæR“Üh*AV›Ð€÷tœŠI3¡tÍØ|äïðÙÏ~O=õÔÒ/÷`óæÍ8÷Üsñ«ïúUlÞ¼Ù£I-‹˜Ò‡óKCmTVhŠsrŠ–6b̳€/M×êu]ŸÆ–Õ ]Þ°&LS9xVƒP)3odÑ üšº½®m®väU-?9BaŸµ¸‡–Ö¤H€"5(\—-‰rÅÀµH§}4í°GÙ‹¢ˆ8pÌ^ó8Ir 0 0 dªkEhKfb鬠UÅa¤ã)Ï=¤[Õ¹q‚æ@™ãî™.vörj—1"Œ“`"tˆ0Ó«ðÝŒ~%xñj`ýDŽŒ+`ßnðô3ÀÂ\½˜Æ [*Gó¼"G>±ùŠIP· dFÖïAz= ææqhçNôgg‘IpŸ_Ø·³»ŸuÑaA§(P¬]És”£BŽñ\pêÚO¬°¿?‹ ¬ó%c²ÈðlÕÅC %6u+¬*<Ôm?íðˆ^µ!õ‚z÷ o~ó›qÞÏÃö§¶ãÿññ±}¬Õ¸oݺ“““Éß13fgg133ƒƒÓ'þAÙó„ˆÈJH1ýð±«?xê©§ð¹ÏçžsnCD”G. Xèô&éëé«Ôëõpå•WáÃþPð¯|å+qá…â¥?õRl>r3&&&°sçN<öøãø×ù|îsŸÃ³Ï>‹«¯¾ŸúÔ§ðßÿÇÿÀ¯þÏwajå4еRötýQ‰´äÖ(ËÁSŽjÖ6ið§{°SÀ±íPÜž·<~IÄ:ÎzÊÄ1ÊùÇäíM‰’ô ]¯µ(&<‡Ì s¸÷\¥¤Õ­̓•òFèLïkäÁ•Êi0žömX»žHÄ P[sIq_]Á>jìwe… àtþYB§"¨ JýtQÐíÄÍ?)”t2Ç­õ±CäJØ8KϽu¶Y›Gäª~}½“æ¹÷›-ꂟpM‚¢ö%&¾_@üý@TÆ jÀB*Îa¥`k†JqtËÍév ÏP–Œ‡ÇsýYä;ŸB5³¯Þ‡yt= „+e(&§Ð=b3Æ6nD>9 ä… _IUƒævL£ÌrHÙ%¨ä”caÿìyäQt'§j}§ ŸOL 7t‹%pÒÚß©07¨0^ƒ ‡JÆ$çx¸×Å ý>Väò6¸’¤Ám@0Èò [·nÅ{Þó”e‰«®ºª±^W\q^÷º× Å2î÷Ýw>ó™ÏàÚk¯E¯W§0úýA ÙÆ¥Æ}pö n¸á÷«+ÿáJœsö9IÐH@Ù‚®lƒÆìÙ½ï|ç;ñíoÛýlõêÕøà?ˆÓN;-éàlݺgŸõzì˜Þßþí߯=÷܃^¯‡èC¸ù³ŸÅ?üÃ?àØcm{½á ™¡@D*iß?±ÁJ€^D†11¦Ñ@’Bˆ%Y¨¤ÍN$…áSFiyÀ#‰G”xß5"Í]” i ¡ k}ÒЗ’$–¤ÁOiïQc ´òæµêY$@·Ce2>ÈéøõR,éÅ‘„Žº+†ß.d÷£¥öœ´0í ™¢;—pâ3‰}7t—–Y‚a3¾²ôKˆ%YJU{Š2‰…ðKô3?ŸdøÖl{Ë:–“ ›]"t¨6îÝLê¿Íé{f±Âö]3xêþ0ûÐ÷ ý>¤,Áó‹õŸÅT sÁÙÔÆ·ž€‰ãODgãd+&uu dÝò‰q«W¡{ Xûº³1yâ‹e9PV—^ûy 3Û·cqfƒg§ÑÛ³ýŠÑc 7¨°XÖw ›'€±Ljg$Ì*ôØ;èà‘…æKÏÕî¨yRÍd|Ç Å‘¾¡Áé—’‹ø²—½Ì <òÈ#¸ð c¾uëV\ýõxõ«_­æ)1FŽÚ²×~ò“¸øâ‹Ý÷Ÿ|òI\tÑEøæ7¿Ùxï`¼H¬Yb-[çjõ1ä^Á3Ã(ŽcE4æÎOþž´¬+”œÆï–µ Ç ÒÔÆš4>—”ûäÞèrNÒcZ»ø›ãAJ&õú#=®"çÐï‚ô\!¥c‡ÉH´ÆÁüÁÏ”Ž ¢¯-òŒHç4×=±Cd­í¢=«÷» –/ÛhèÍø{Ѿ@tïľŒ{[òÔ´‡Z7÷ª{D2ŒhühщuZ¶A×L펭¤= åU<ÓËðØb=Î "(²Úˆw2ƒ.õßtsÂXNèdÀü®iñ‰O4~~å?\‰%Ú„¢–pnívîœÆe—]†;v¸ÏlÛ¶ ×_=Ž;î¸á§Oõ»¼(ð¾÷½§Ÿ~ºûñþýûñ¶·½ =ôPûawh™ß28ÉõA†•§Ä¡ÙDa’Ä.wJ¶†œƒu•ÖS‹ ãœOÔß5Ù±egžPÚÛŠ“´¢$SR:)ÍUž.MKŸ*E/}KÙ7Xâœ<¬\)}zKO£$OŽ»HƒÒÂÏ%ÖF"#CN·±¬ÊR›½%Z—z³æÉ6ZAIGï‹d”Q–ö戆r¹7­Hãx¬ ÓÑx!Y†Ò²ŠKôè9щÏ+$û¸ž[èà@•×¹4©9Ô»PPÝ“¼ Úˆ$èd„Ž0òÝÏbñ‘ïa÷÷¾‡íwÝÝß{‹ êõP..B(CwãfŒoÚ*j´P €c326}“¥æcïWÈ2ÆÚW¼S/9Ôé@ª ÄP 0³ý)ì¼ÿ~xj;zÏî@9?WwacA¿,–5ÃÙD‡0‘×ewÝ脃ý ¥0f¸‹gúuj!Že‰2¶MC) E×,Ê^³zMûFl4lˆ@m 5,"8÷ÜsëºÉÍHÃHhÃò…/~Û·ooŒæ3Ÿù vïÙœˆZ#´ñÎS^õ`0ÀoüÆo`ß¾}ÁwÞûÞ÷bÕÊ•i×=«SDQøËÿï/1>>î¸ˆ_ûµ_ìËÉ«Mm²à=ô‰³1ŽðT†À3×јÀw™4ñ, D‚šÍhü½µ±niŸÔŸ2!Ú0“îš#áû7:פÂç’0NÊ0AЬô•ŽXņ'±¿$T¼áI+z~`¤µO:­NãÐ3Q<~ &!ïøÝýþGR®E¢÷Ò§ó(׬OÌA¤[GdŸžãíE'L}G†Q‡J# ÔtHB›¥ôJB'rl×$N_I#•Ô”ÛfE€DÔ[°$±©ôÞlMs,;äÎj¢Cg J5¬?[¿ÄLIØ>èàP”"(ˆPduØ=' § gÿ.²:äž—}`÷³À¾ç ƒ<ñ$v|íëxö¾oãЮ],.‚V¬@gÓFdã]pÉ®iSYÕüîUÉè÷ú¨ª¤WaÅšq¬zÑ QLLU©J ª~{ŸxÓ÷Þ‡ý<Š…ý0`A)@Ÿk°ÞÀ ” t@(Ë€>zƒ dØÑ+0Wúîo¬…Íìq¸ØæŸ5=¨Á/‰a¾ƒ‘%:•q¢DÈÊÆæ„ë¿ ö쬳Îr'tŽCöÐÑGn„c?~õÕàóÐæê÷û¸æ×4»j1Cì¥ÔØŒÉÉœyæŸÿ¿Ž{ï½7¸÷Þð¼ä¤“Ôœ„am¢âȪŸ¹vÍZ\xá…Á=·oߎßÿýß7™iWËnLvKr¨øÜ³Ì9olÙv*RF˜v`öʆ*G¢G!F¥‚Y90°k¦#4ð!+Å׋;Y"R†níXE|Ìúªua#óö3,ÎAhÕƒ\a>†¸vÉZ7 ›¹s€=#ßêˆCÝìõ˜¶‘¬Œ+À–3œlÆ0$Í(µ_üÿÇŽ-‹Ûìê°dtB G~®92>V¾Y¯E$âÖUݬ‹;Õ±“¥w”zdžQG蔃¥›j¿l <ÀDžs+“´†Òëµ\*à Ž<òHÜ{ï½ka=Kßá©íOá‹_ü"ò<ÇG>ò\tÑE˜››sŸºöÚOâ]ïúŸèv»Ã¼Ö ×SO?«?~uè}f~ë·~+ 2¡%Âfúßo{ÛÛðÉO~2øÍ¿Ýz+î¹çlÛ¶­m¶†ÆÁdph~fnM–^†eÀ󖿦)f³¥»KöJ!ãÔÀÓ’]X‡$–Ò[º}l#"qÃø¥y —¶ÃÖ®ÒÊ*Ù$^:Î-‰’'I ž´·pN ¬,1ϲì9Yž $C’É}¦†§½$=iËJ¡,¤“FÄ -}iËÜúË5è5q¥::é_TLØ5(0Ï9*ãñä™ Ïê6¦…9¡ç ú„ŽúON„¢S ?ùTLLŒ!;¸tp2;>4ƒrnó ”ãã N©\ïÉq®*Tl}ïÞ½øô§?‹.¼0à”wwovI&åøÈGþU²ïuÖë±uëVϽ¬ø™%q›Æ«’Ô½öµ¯Å¾ð…à×ó7ƒ¿ÿû¿oÙ*”î@Ø:Ûš "ìšj铼 Ýxº)O@ûѰàgM®—ˆh'úfØ2M­À—¥ô³¾YJžƒ‡Q² Fó]¹p’\sÛ¯©©m¥45‰ª±·ÄCÔn7¾«ž«+…Ôâ œ°ÿšžr y²š¨Ÿžê¯˜¨†(! ±Br5G×$¨ ;›…K„üéPoAAGH44eØ¥MÏ/šã£éLú^hÝciy¢FC¼fï¼ðùŠh ªd®MwD]ûì÷ Hrš=ãò×% :G- }ë½ ;•~U“J¦æzž {9«;çÐ1 W2˜¥0!vÔF>'ªÞé`ìøbìE/D· [ö‘ zÈAÎ"— ´i#ûŒ¢\«Ê„Ï*™íš¦~.ô€¹ÇÏÎÖ¯Â\H²šžùXÙŠX¨ýÅ&, pp,”‚‚2däS ˜¯¥0Ê,ÃÞAŽ<2„$ŠtÆoÏØäU49D]~ÚO»¢ºöøV†šáª‹Å^Ó;§qüÖãqIØ<ÀÞ,a•íÂü®¿þzÀe—]æþŽrW]u.¸àB¸Np®pÙ×V‹jqhj÷s»qà ÿÜxÍ3N?­ŽF˜&ìˆ"(èü§‰L‚Ž£ ÇœöŽw¼£aпüå/ãÁï|§œ|’bu#èö âÉœÂ×¼-¢ˆ-,ñ‰ï‚æÛÔº°›g–ñMBH)ÇýµYU2£zs™®kP-jÙ‡í¾¦ZÂÖÆÒ°ß›*êøæ‚ElW”ŠÖQ@öÁºÝ­D9|KæÂ¾¥°k©‹°e«wq)Tºj/Àµc%Gæäö‰ªž–ø}cœ Çmtш6ˆê’EúBºf¶Vä1 RzßMyv¿Ÿ¬½b¹ ´ã¥“2ÔÔì[:Ç:ßÊ¥3¼š¥O5$ atœF½£ã „X¼ìÔ¬‰:zu‘{Ø!1heËg"üQ¹mï8¨tbƒDÇÈ2‘"vˆ ¬ùèl+g3'îßLú|“D‹ø ÏœÝOìÛ]’%fâk–9Óa¡ÜU®-+‰4C„1lŸ!8Xå8ÄÆåcë‡Ú{N„Ìú¦)™0raEŽbÅ8ÆÖ®ÄÄÑ›±úäbõ)/FgÝZô%z‹=ôûýú4'UÝàÅR Ú‚,cd"˜½ÿ^øÖ=:F ’ ¸[n¹^pA˜ÿCÒù›ö~ã7âàÁƒ8á„ðªW½ "‚ã?Þ!æíõÐCáî»ï Ëòtù"2"3I_úÒ“:?gïŸ(÷‹±$Þ)¬qàç~îçê4CtÝqûíJ€—&),ã4Ó á:ÇÀ'‰qA b°>Ò5”€qN‚ÒèBpNSÎ$š¥OâÒȶÀÄ%º5>Ø Fï`éÑyö°A†¯IŒ–;©h•¤g:Æ"@R¿O™S cíÔ@ÂÒáå[¹ Þ//‰Ñ—)°`0‘ñP óà1NE¢ö *å‹* †4/’&aGXþ…°” -Ô@ž#Y––´ŠD5‘˜ª0 h©ˆp˜/bD³üyxÝQ«AQ}’D¼&K,DPŠ`¶ÊÐCŽŠÊx‚Îp“ùwf™ßì@jÏ%3yi2(tb•*2¨d"®4­î›nOQÆHKýÿ¸~€™‡Å37þ+>ú0˜K‹XªÁqÌA…¬è`üÄ— ³fµq*j'¤Èj\ŽúíÕž‘˜öªµAŸ—«”*CÉKÚ’TË%€,«Þðõ¯½-ÛÓ’Ð %ÿškê“øå—_ä¥þë½¼ñ¬]}u»X%Reà®»îjÜgóæÍ8Ö–©EFºµ¬DÐNf!õ=ãë+_ùÊÐnƒmÿÒÿLdé<[àŽÖ¤³4@õCóÈ E•*ñiÉÿÅÆ<å$JkÚQ†`ev­Ê®5¥âyR5ºKv8Œ¢e”¢¥Ê¦Â"2þyi{ˆ´8i“ýN;9XÒ!i'ëi1Õ2´àË$Ãi¾GR –™Pn8?-{KÏ…$×ì¬'X‚Ȩ°<Ý,-%§2L/‡Žd Fk- cE$ª2 LȢРB0Þ“ÈL8ÁõLQë‘üˆÔPEQ½Z&dK§j ¼:¥;a ö=ø ž¼þ<÷ï_F¹°€¬ÛTìCx\Aßr ¦~úg×N„Ë¢Á9d¶9¨Ž(§d±™ W嘯2T,A[Õ˜]ëpz[È]¤¥]fâÎóóó.Ô¼¬ÒH›~ík_ÃÃ?‚+VàüóÏNAgžù:uÔQ˜žžv߸óŽ;°}ûvsÌ1Ë6êwß}wcܧžzjšA†o°a„W›7on”ÝÝwß}˜ŸŸÇŠ+žG£ŽÃ2êø>Œ:~£ŽÃ5êñ© Cð=Cd±µ>¸AÌv˜Fß¿QÚK‡cÔÛ­Í’ì`‚öS+0D†3Ç-˨Ç`À!z*Ùôù4êøA:’F½½~½M®†Ïñݨ/1Ù°®$Ø’ÒŒX!“ °È„ûZƒm»E¡>e›<:,—¹êâ@Æh{Îsóo±¹z…ƒdÊHê26©* ðì¿\õ1ì¼ãv fúEpeT¸?@±r%VžñZŒo=Þг3ÞäcØMƒÍeT³ÉåaB©…­… ‹¤õsÉô¬a‹S¯×ßÿùŸc÷îÝQºiæ¥ÄØ®¹æÀ›ßüL®XÔÂ.¹ä’ÆØ>þñ‡ŒiA-løgvvÖO_k×®m27µ1{%ØøB&µú}<òÈÆsʲÄ3Ï<“(óBsž «‚r«3¤É ‰êåÛ˜ßâÏDLSˆÙ¦¤%–bðB4Æ%ÿ Í–•OPš#aÍ{ü^¤ç–ëHäÈ6×9bfZ™ÖÂ0þ°÷†þTšá-bÖA´0Ž¥XëÚæ"µ®M†»¶¹L0¼µîI2JŠ-TâtXzn‚}3Û¡¥._‡7kÊ1Úô.š,¨‰9‰YÑØÏaåR“I†03’Hk?ekuQÄ „ç¨V\×lK–©¦a <²}Ë]ÛCV§a©ËÑ,Ä4ðM|3“ztlZ§Šãæôfg°ëË_ÆÓŸþ ö?ø¸,AE™É‹SF5ðaP"[1‰Õ§‰5§¿2>)K×ÈÀòL5Ü´©k3*©SŒ }¦bݦ“,à%BOF§RmS9¨øºþúë[ËÃû÷ïÞ={pçwbÏž=ªE€²E"“¨yÛFáÙÏâ¶Ûn\ré%Qž¿Â\|ñÅøà?ˆ~¿ïóÏÿüÏøßüM¬œœt9\›/ض¨õlìHdìµjÕª 9Œhj_IAÓ r`?Û¡ÏáHE’!w fƒj ˜Cl .䛺¾A·”eq(åØåQÌeï[µBpõ¨ª ?û³?‹N8ÁtŒÓ­5«W¯Æ/½á—ð/ÿú/A˜ÿŸ®»oÿoow›ÆÍq(¬Øà@«A÷^nÐt¹f!´Ž@AÛNž×¸pj5èûöísDzƒ<ÊÝ!±ƒx…¨d‡^¯7¿îÂj‘ÈV«ô>S΃5 ºG½v®Y~èV»Â"ˆ‰¨ÍkƒÌâçÅ¡Áµ=uÖG¡Ñ¡»t9pwmŒÚY¢þçˆ@›®0Q¢›|{%›VáRԥ͒wX4:³7Îl«,ŒseÇ%®ãZèl×÷aåx5ÂìÚj›k{p»®sJ+«ù.ì=zj”¢’Àé9?¶{!EÈÄ aºkj¥[á[kÆjÿmÇjt³hçÑè4Rµí®“ž¸ a›1DpFU÷£Z)‹r˜}?SvN'{¤ºuQŒŠÛ‚ΖÖšvߤ¢•kä9@ö»}Oðc5›ÃrK>d*,Xs0C׊¹L}ç`Û!QD´|픆A¨æ Ñ–±×ùA–Õ€±ð4¥YÈF¼÷ÄQÞXHA†ê& ¶yó}fÁâsÏaû 7àéOsÓÓ ,u:F@¦ Ò ˜œÂú×¾G\| ÆŽ=ýÊNd¶„9¤ðH„º\a,= ’ƒ\RÍ9Œ”¡ysÎ9Èó<ù»²,±wï^ìÝ»·Ñ;¼+‘È¡÷û}üÓ?ýàÒK/º¦…ïuée—>ùÉOâW~åWeYO¬Zmí]ÇÆÆš„G" ü^4.iÏ×®Y“¦Ò››K‹$ 4ì0À¢D=R¨Ý&Íc¢L)¹79PIdåd)*£¥ó«±Œ¦x³[óðm°xýR¹}IcdyõVœ€´e„[ò§CS¹’¦}MT4rö¼¸´æµSÝñ¤­\rÚe$õÙáŒëiêÛ¡¥=«.­¤6!­k’XÒ$ Œ4ç^jEšàΉžè>()ŒI£•tKî>…i‘a2¹\ƒþ_µGRPؾ¡ ‰tW܈6‚®õ*…"t¯ùwf~ÐÛ³O^=¶ßpž}È2Pž×\ï$Ȳº‰ /.¢³r%6û‹8â¢_Fwë‰(- ",$ÊDµHÖëtõ–~\¹á¨Ïˆ†¶ä{¾¯÷¿ÿý WózôÑGñþ÷¿_¡Ü—ÝrË-Ø·o6mÚäèbÛ®SN9§žz*î¿ÿ~÷³;và¶ÛnÃ9çœ3ô»7nLþ¼ÍÐÿ WÛ=ÛÆ0ºF×zµ³ŽÆóŸõ ¾ï×^~È=áIÛ0EÌxcæ’T8YWîÕ1¡úÊ€åŽÒÖœÄëÐZÝMÀ™dµ¹gØv6a† ³„&ÌÕŸ=„§?{ ž¾ñFÌOOׯ܄:ÄÔ»KY—¨q6½á˜Çúõë›}vA $(± 3Ø;]–äðr«›ºÌÎÌ&çsÓ¦M¾¡‚#¬àF—+vUÛˆƒC´±jxÁv Aèð:»F, 2 ›vs£±ÒŸ­#Ù˼vdm£qÍx\c×#Á¿§mðJM%ÔÞ¶soß…•ç7¢qã°óÆ6½Æ¶oˆªj°ËÏQU†Ò¬¢¦) ‹ß›PÍSt8Ôîy×OÄ û=€hR–èþVÄwýµƒf7 ¢vÃ&JÎr˜»~©J+K,χ C.p §Øº óD zl3¢xï¶Vþ°’iÉ]œ¼p£Ù•(ʱܫ½Y‡ƒ½ì´`„Øg÷Û¨Å77æ é‘M7ðê¤èš8é1r°õžæ áÐ÷sB7ár <[‡Ú0|Ú—£B—y†ŒÈ)§À€›yņyU•*2Æ_•¡ƒe*X@Z]Û®™ÚXsÓ;°ëË_ÂÁ'¯O«EáŒ:Aª   «^üb}Ñ[±ñÜ_D¾n-Pq}â®Ø>W !ÂQ©¼½’TÆsš,ê(@.‚BØ€ øzÅ¡™,bZ;Æì¢D ØcÀJí <ö`GµÈÑS[¶mÛ†/}éKª´‡,èØ¢<òSpíµ¾‘É{Ç;< FóA«S¶å[]X˜oŒôãWögåTÉÑ{²Ž>úhìÝ»7øÞÞ½{ëÍ¡@böÄΊº@o>üqSÇn¾Såq«V­ÂÄÄ ‡* xFŦÛâÑì]maVf>Y#Ôµï€DA2<=°jøåNh¤ÀGà2ì€^bÖÛ( gd¿gé‚Í©œ„Í)Š"œ‚œ¤ß'Àá×ݘԱÄ^€Øc…‚Ï Yåèƒ8Ш "F€ª‡v650F(ixÂ^W˜ñ³Ç¾ÀS_Cï_ç¬éJMª ¢iåÖÝÒìZ°ø½©‰œÕAƒPÙÓær€Ü&ñð2C í4Q4¨˜9‰âC)X¢ïE× ²;ø5«ˆ”ý¬èùÖ•Â`òlö¬«¨H0¥Ç²¢° ¤Ùd¡†ŠÆÖ¦k —)Új«Zv)ò9 ©„¤¸¸¯çYG”l¥VL‰ÃFK‚â’À‡!z›Ï£c¢S  qF“Ùœ‚¥6˜%×¥/•1˜êßWbÿßœœ‰kÖ9ÔŒs A– J&Ì>ò(f¾÷=TóóÈ @Ì¢?…kŶêä“pÌ¥—cÙg!_³ ei#¤ÒµS!F+²cÈŒñ¶i2ÅrÆ °f¬þw&%&¨ 4@=ÒÁ¥ˆ4–nÍ÷ŽéJ›‹vÖYgEµŒ  –ùɾ½ûpë­·:€Ýö'ŸüR?·Þz+~çw~Çå©%1G}4î»ï¾à{>ø`$› Pa f‘41‹¨ˆA|Õ8ÒÖè+ J€hâùL™Z¾Û€”Ř¼è¦i¢ŒFJ>R¢¨ª‰)’4¬NÚ:Ì¥|ͱ5•Z@[éÞë-d‰15÷H|”Xci{Ñå½Zä½¹Óã票;Hj¬’¸_K:VZî`rkÌsCŽ¥Æ5TJ^ÓöÞ"éûH €PZ4éP€abËö,ñ IDAT”2œ’V’LK­?’N©.šr¸Lq?è•X™Uè0c¢Æó ³\ÕÆõéw@u72¡sJΨ>gd <9ãžAPQ](–Ù²Ô]Ъùyܾ‹{öDȲܔeÁSÇŸ€£ßúËØðº×#_µeeòúȨI 8Ç‚ÒD ¬ñ¶Ñ‚ uyZ‰ºûÚº1€W˜ÌøGª±yóf\~ùåËúìõ×_Á`€­[·âýïÿa?ëþèð裺—e‰O}êSøõ_ÿõÖïüñŸíÞ½»ví¦M›ž—9سgOƒ%À’ ½Ñ5ºF×èúQ½–è‡Þvib2B°Â**‘s‰90ÕÍp Ï° Ì±¶!nJª‰h:„Ú R}r/2c`È2KFC(›Rdu¬h Ï=‡ja” ÌŸN¶´µmÙí+˜èGª¿çr#YÔ†Çï¬C 2ÛFE1{P\×CJ–4o †áŠãïÉP v› i¯‹Ã£~EL‡h9Ú9 À œ°9ñ¬B—û˜ÈkÇê\÷€QKÑÆÑžˆkÊÔÊœØK6Ÿ „ú¼ Õ‹ùdè/ôÐ?8Wøçu™šý#Ìßr4V¾lòµëPV*&0gµQVQ€ÒäÌÝ¿õX>s  üÀ¤ÖvkPÜ Âj KÑ7¢Ñ©È‚'4Õ+Ø*,^ŒÀZPŒ TS€*õÜ¥« )ЋÝvÛç±k×.t:¼É: ª$5öÃ3øçÖã~ã +W® †{àÀÜô™›·H³ ríºµ¸ìòË’ázŽºMy@ ‡yoÞA pcÁW¾ò•ÆýÏ8ã ¬[¿Î´t–Íó+è{³D!¦4€?p@ñ x´ % F´ ' ³óì©]*#ܱA@9ðG”¥¬;“±vÙ±i0¡xYdhrKÀ!H‡Y"à »Ï9€«Ì¥3%…ñ”hº` šËp“^Á˜5POü|j  ‹;‰û³Oƒ±Ú#ÈŠÃi@ÔýŒýûØÔž>FT¹ì3ÔˆR¢©‹(DáæEW €¡1«^?߈C­«yŒ«L˯îóàAœØ #!À3¸7ÀˆÉ½Í̼¨5r¸#oЄd‘ccä4€PÉ[™g¯G…Cº^w@f jÕ9ÕýÏ‚ížSkì¸Ð{h™ÝÉ \Á5V Ø"Å F-$Ý T‡*¬B…TX7ža,¯OÃÊDLH}°FÛþÝŒ·5¬b }Ï~o.5$Ë,‡PæÈaÆŽ8ùšõ(%«Cèç4”Â(…œóÐgÂ@Ä; ”0¨ØukðkcŸ¡È G­ÈA9AÊ먕‚\p„H€­ÛÓÊš…•1aPL¬—>0úÒ*ŒZH9ÜÜ ¸§t…oûYg…UkÖxĶV¦ y\o2Vy5Áøø8Þò–77Æ|Í'¯ñ†À‚NR™ñö_y{øãŽ;°wÏeD½¢u÷aW/áRñôô4nºé¦Æ˜.¾øâ@9ÄUš/Ì!’Vü˜$´k^a;ª65{t¹]#qì˜Ã\”ó¤ÃpJl8ÞÌ®:‘òqUÁs80Z,a e+CËŠÖ+;}2/ÌîŸÜ80¸3Ôºy˜|ÀmÍÊAf¥£œ,ááº"†8NSzÎh:g¼ÝK.*Æj^ÌsTÕ†Gô>ðõ»njY‚Ê‚°5+«Œ{G`€úsÌ„©‚pÔdŽÅ ãEQôÃÏ[)i»8)«”á wU> UÜßyÝvL¶ ^ã ß~àL{Ë[ÞâË&¬ Iµ¤@;‚õïßú_~Ù5å±×c=†»î¾[žߓ+§ðö·½-øNY–¸îºë ctiYPbé6++[ðÑ+®@Y–Á½Ï?ÿ|œ~úiÍfDðQ}rsNˆn2:a™Š?™²òÂ}ŠÃ—-zƒ jMttÄ:Úð³:ªò#}JB¢}²‰‚E³á 7› i9´å§®d2lÂâÖDœÊ0vs΢#N앺9%1bë ¬+òç¥ Ù@¦,vÜÆXÙb/ß®„ q9QØ2Y;!^F8œK{Ê{ç+tÚpª²Op³¸.!d¯k9Tk®K0œ®aµA´×ôá¸)„U¸¥ùHcoœíܲ;”,±Ý[ˆ|líL»29]¢§NÌ¡C¥îqÃ"V¥°¬£®Ä-,Ktr«ÇÃÊI NÚbeQK]‘h½T4[wK£Ü[)“A÷ÿ`CÞG§ßC7[£'sìZ¨j£.@·ªbŸêâ}®Û‘öIL U 3†339ˉ 2¹m"\óÆK§‹l|¨*¡•ªUuã•*/PR ºc!B7¤7É00!ôÊ9@¿²ND˜0|_€>3Š,Ñ+2¬ËðÌ|…Õ²ˆÕ:.CÚD¦æ; 2,..&—«ªªv{ûÄÆÏ¢u½êÊ«[¶lÁ+_ùÊDkPA“g,;[Ž: §žzj¹~Í'®Á«~öU­hÎK.½wÜy§G¸¸òª+qÖëω'žˆ6ló0äê3O?ƒo¼1xÎqLJw¿ûÝ Û–9Ò¦3¦ƒmmšÚÒºVï1´óçR}—j i‘‹á2ÙøD ½i£Ê å ’ÄðÈö¤ÒBGݤ§•¶õlkܺ†Ò¤ŸÅRóÛ¶å‡#—Óó–º— Õ-²¬ï.ñ;Òê7¿´¶ÅæX®%µD Úâ¥Z¼ê·ŽJ–°eõi“Ii»m+ýpjÎeÀ79\PÜóuMæŒMXÀt9…£§ ô¡ÆØ?üáã¯ÿ꯴T䉉ø«¿ú+üÁün¿ývÀã?ŽK/½ï{ßûpêOŸª`̆ÐCµ´ÃžžÞßüÍß“ªŽþÈ#Ä_ÿÍ_cëqÇ'éŽI3=ˆ„mSn2y IÍÅÞ×£ºIÉ‚(è´ÿ¹–§g¥¨µ§§š iV%€×†èrÓÕrF®KXؽLHµ÷ô­¢‡7VT±1*™\%†Þa›¿¢»QYCŽv¶IñkçTÝE(:Ñ…ãš×©ÎVPímuhpß-­ ÒD¶# ]A³Ùœþœ„HhJ“HØgµ&¤ºÚùjƒíËS›zÔ>9^öb½rºz…¦Qè¾ ©ñúúR%VH:£q ÷rjõ‰][R$G15\kRÕáL· ¶ŸÑÝú($+òí…)lËT“Ä z¿Ð¤ˆÂ"aCLŽÔnˆ¦’Õ×ÔnK´Z©_xÇá@<²4c0¢|’Fxë‹ÖóÊ'¬ÊqÄDÐcûG00aø=ήŒádBO‹ÐãÌý]Ÿš3ô˜ÐG†²;‰j| ªñUà±Õà‰5¨ÌŸ’ÆÐ+}6ßeÿ¼¾ØçcÎTÿÖx›?Uý½>‹U]v·ªKغ²@·È±o®‡-8„Uyéó®*Ϭ ANU‡£ÜŸ¸É¯sI–à%¾nºé³n±Øc`UŽÍç 3ÊÚ1~þsŸÃwÞéîýÈ£ø À¿CåÕCêHèÜ"×”¢sµ§ôÛn¿Íå§¡PÚ6/^|àÏþ _|±ûÞôô4ÞùÎwâïþöïê|xŒfV ¦{¿u/Þö¶·ÆüÔSOÅUW]‰ãŽ=:‘«CæbØž½-{úS"Žsv`Om N‡ÎͱËÏ1{êÈU«hGJQñUÒ0%+¹b¨Ò({€Ê[MúT°†ë±fõƈ>Uç Y%ŠcZT«óö]”œô¡ž—5È¡Zeiœ}uˆ€u.Z´7-‚1»C {ÐsÜ RÃ×U¥}/VÕ^R…h©’ÈZ|ƒÅrpXV~@UY ¤Õ ¨^áé©ÍÞeýZ¬i^9ʽ‹oÑ­”:)ïé“у¼³«ÖPXÖ8G}4¶mÛ†“N> §œt2V®Z…]ÏîÂãO<Ž›o¾<ð€ûìæÍ›ñk¿ú«ø…7¼ÁE•H‡K‚påÝÛS„õ¨UÔ·ñ¯½snNÂKGr …C‰’}Bªïö̈>ÜÓw ‹ñgSï†(׿ªß‰m¢‘zU}ïx„[¥9/êD™|C­«½•ž"’U)±¨wÐYªä°;x›,ˆêYmDõ‚1)0Eï 5Ñ"DñEi(S·cmxŠbF‘øXêæ0ÂÒx‚y-qÑË€"5_4yáê)šÝè}ã·Ký&ØÄ-'d´Ì^,ÇÒ¢Ge1ÅkÑœÿ,ËðŠW¼‚–4è:Çø|\ U†¯Ì¯ÆìÔ&¬›ìâËÏöñÝý‚ɘʉL0‘1Ær`"Æ2ÁxVrkÐ;TçÍ  þ;'äE~âQ,Þp ú÷Ü â²f¡a©ãeí%Nœÿ˘xãÅÀª5ަBæÀq.7nÐõýŠÐÂb,0ÐcÂ<æKY†c§rl[ßÅúÞ3ôwáec³Ëäy›·n¸¡æ=?Ì뢋.ÂïýÞï-ûó÷ÜsÞõ®w-ù¹sÏ=·A3ìºöÚkñ—ù—‡5ö¿ø‹¿Àgœ±äçyä|ô£¡av½üå/Ç›Þô&œsÎ9èv»£dÛè]£ëÇúÊó|y½,«ˆ™Æß«F™Aþ,Ìñ脬õBžYìàÎÁ&lÙ¸ pçtÓsŠ˜Ì€‰Œë?Æ wóÚ w¨6î]s"ï@P˜Óz‘gÈó òøÃè_w%Êo|TUuÿs[mbšcþ ºç_Y½lêÏ-0n€ ‡hï³ çƒ¾X …0Wf¨l^‘㔵N\ÓÁô™z5f‚l{~ C˨¹qQ ƒžµ… tvA-6‰CË’l°°¹3ÀKpÓ3óØ0–áå:X7Qצ/Tuî|‘^EX¨½*Ã"×uë‹aQçÏ…°È™ ƒ/J†åࢠÆ& cãî„ù3éN Ì;õý*ªŸÃ„óg±,Tõýl~}QÄ|XD=¦R€µãŽ[YàS,p†³s8‘f±6¨ IØk Ä„Ç1úhEÚýJÐV½•|ˆ´6™P?$›R„r Z†ê„SkQI[Y‘´OXPQ ¼ñoÄ;ÞñŽÖyþÿÛ»¶»Šìü­ÚûÜúîK_ 1&$ñx¢ Gâ)ŠD$$ø¼Æÿ`"ñBø¼ÀOþR^yB¼8Œ€˜(N NÂ<ØãnwŸî>çì³w­<ìÛZu9Ý31`ð^¢}.ûÔ®½ªVÕªo}ßûï¿?üOXÁë(ÕË<ÏõD)dÙ׽Ļ?š"½ÁNŒÓZÑ]1 ¿0û7êù;¿s+Öçäªß¡²ªhYg„îX¹¢Â2ðbÏbút´”/TŠåu%‡!»å{‘²OQ{ì·>ÔGô/DU8>ã‡{³­vãp¹¦W:ƺ‚Ï,6¹ÁG‰ä2ôWd>T¼5‡Æy%ɬ<šÃŠB‘ç)ƒ ùèu–(±ŒR8W‡’rÖƒ•]g._K ã†8>»[ã Ooôð̉½s  ¨&L™0á2ˆ×¶Ü)WÁ¾:ß®ƒúŒ XJªÿ” 7–R°)_Ÿ±©®K˜Up/Pù*ÅÎTïJÀÝ„I^Ö¥\XKqa-Å0%ܾ?Åéù6Î÷'Hœ‰‚hÀ‚]Hý"»̉,,íúwÚTº›MhÑÞ²4Ì6¾Ç œ©¾ßhPW èIûY+Êö?¦ˆ¦øËB¤XY'¤­5Ö¢.abí/ YRÚïRä¦a~®³»Ò$ß{ý¬Ð–°ÉƳÐ7×1”€¯Ñz—:Ý$¶Å¤LX•¹¶º$ƒ"±*Ÿ­¿Èl›~—ñ¤ùWí/Ö-Y¬C µ)kÑ/êÙÿTó‚%ÿþ I‹HŒwV§ÔÜÌñ€Yÿ@¢ïeØŽÖ»e)ó¢LKâ¾påÊ•¿Р8i«I¡ãóIŠÞ`ˆŸ®&0ØÉ€½¼äs·õÄØR7Úãµ~yQՓ甀w¶A7®#¹óuÙ%IRÑ¿&Íd1êfþYo„¬åq(Icfb‡>-¸ÜÉWD4'G).¬§¸°šbs˜âö¤Àýímü™¹‡Ó½ÙC+“ú(á¹çžC¿ß*©åyŽwß}+++J5îQ5þüBg=Ê–$ Þzë­×Ý¡3kòÊ<‚1pHT €SOö§˜ÎîàÚo ´¹ËÇS,Â'[Ào Lr 7@a€aRJ¬öQ‰¥P¹‹NÁ0\–¯  WXØ¢Ù̦]ÆZd¹ÅAA(,µ-¶V[3È*žö2_ãz†pzÉàVS<±’àä0Áí‰ÅÝ{÷qÉÞŹÑ$¬p–æt¡XK€,jR‹=ݼJºŸ5èÍmƒËÂù!€ Mä,'ïÐÄDJ‡RKÅb‘ˆj‘'5 ¼üòËxüñÇñæ›oâöíÛª]óù¯¿þ:>úè#¼òÊ+X[_óQ¢]IJTÄ}²í¿D¥M} cô÷7=xÛQ—5 °¤¥%R®º\ˆý¾ ‚úJþRÉÅ‘¬«~TíĺPïaÚk‡ðg±>;áˆçšN œÏ×'xè ç¢41@åt£(hÔÕ…%7[¦A}ò=Ž å€3A¶ÕuÝ]!G¾Þ£CÀć £Ð<Ë Ç$óüºõž|”K†ž)ůtxq·x¿ÖØÇ̳Ùì[_]äøÏÙþùx|9ÁïÌqm;Ç×ûû™…!”2¬Ð7@Ï D¸ !B’ ïÞÄÊÕÆà‹Ùœ”ek€Š²ÿ/þ—ÿ ùò* [j¡Ï+%óÛÌ2fÖ€AXíœ[Npzdpf9Á‰aŠÛû¾ÙÚÆE{O &è™nò°Zžçxï½÷ðöÛoãæÍ›Þûëëëxá…ðâ‹/âüùó]‡uÖYg?( G+[kº¤»t.ä®ÒY>{´LŠ6²Þ×ä–p#áSÞÄÆ±ãxjÍàîÄâúNŽ/ÇîO-¦……-KÙ •3T–³¥¦ÀÕ«Wñ駟⫯¾òÆ¥K—pùòeœ={gÏžÁÙ3çpêôc-¹ôù(Uõ0ì1€TgÈ á‹x HV ‡.˜ä˜a¿ ’Ö²Á®09çÏ’ÖÒyORÏÖ~(Ç« @»ƒöŸëR¡&ãCí9¿(¡#Q"'ä±ß´[M¥*ý‹UV¥ñFI¥ì7·9+%8¤5¬ý‡Åø4%š;ÇÉ|pKÜøg³-ÖcBÒ¼RåçÐn¼¹¡§uÛ/=ßm§šƒÉ%M‘S 7„&MkÔ}µ@=’÷ x–5•ÂÓ4Gï¢4”E›“ÕÑÙ;‹¯• –IDATófëo$á+Ÿ°"ëRdBÜR¦Jb"ö3X*¾É̒㌠O7ïIªg/»!Fª(Ë•þ§?')vápx´€Sõ‚`‘Ü!;ðè™T Ž9¾Ì†¸Æ›¬ÃS}¾¸1.ðÍAݬÀ4/UØúÆ–ŒÔPÉëN€©¨ßMÕé$ˆ»˜[0Aa@n¹‘g-`0L§F N-¥Xï6‡›ÃLÀ×ã Ó-ü±½‡'úS¤Æz]'šfÒ·Þ05ñQX‰¬BÎõ½Iß¡¤nƒOËrV4ã-§t ¤PÅ'Ö 1ãy}á½­—‹P2 Ê õÿöö6®]»†Ï>û ;;;ÇØÝÝÅx<Æxß™ÛBŸÍ+p•æg)Ø>wNÁö¹ýöMÀç©cw!á /Lµ .‡æ^sσÅBaV?åÙévx Œ0ûŸ“3ï¹Ìì¡ñöŠuhð{çÓhIˆñ(G°œçY‡*°‰wõ¦Í™à.|ZÔdÙ!&8ÁA`TŒ‚å] ‡££ôÉd‚C¹$ øM1ÀëOàÌú2Î.lÏ üϸÀ×ûÛ3‹Ìb?gl‘ LÁ§¦dK@MP×+{4A¬$”á2Õ‚1ÀJ¯ Ü'†„•Ô`­o°9J°10¸7cÜÜc}º…§Í6Ó’î»{ÄuÖÙ·>þ‘ÝÍ[J5J7 GÕÖdÉ )µ&Œ€O8bJ!ì”ÌðÎ$,SŽÓ)neDZ½z ¸–âòIƒû«_Ž Ü™2öç{sÆ8·8È“œÅ*«]A±ÃûU*¸õƒÕ>ac`pbd°’¤DXî N ìÀû3Lvïã‰ùžL÷°–ØR—½aHCSÂÇèœÚ¦)µ-†³]Ž0#‘§™bR÷Ú¥ˆòšé¨‹±ÓŸƒì§§kÚs€‡ç0.`Îuº*=Ñí €ÂÌu¡ö“S†8 ƒêò¿ZÃâS $çþØc$ Ã¥à0Û5¹G…0»¡«ÝÒY€ïSí^µ’"X©Fy.äw@5Å^Oéþ_ô}oœüÉC/ù@0¹;o3ò؈}À§ÇNÍQ#®¬íl¤=æÊÃw*o5Ô†¨:ÆŠHNŠ^5±Ôs”sAíOaÆ7Édç1¼…æå“ìãæœìJ`VÎÚ.›^tjX0 [+hóêôzSÓ*ÎcDM0‹ ‚汩Öƒ¶­(FyDX7sü¼·ƒÍbŠÿÝÙÇgûëX^YÅ“k)þò”Áý™Å¯¿˜æ ³‚1Í-¦#³åî»A €4I04ŒQJXî,'„^RJ¯& a£O8»”`½o°;>ß™coo'ó-<16ûúd[­4&Y´ú%-R³M±Ué[‹[G$AÍVÃlµX°ÜÊîÉšÏæØÛ>ˆùzDqsîcK=y!3Èpåýtj˜Aƒ•gùbtÈLH}Ýæü¸9ï´šÀ’²•&Å„Ægês]æÀ@äûUÝ)Wµ ¢®šLMùy™_c…HV5ÉMDlî…®k®yCíYû¼[kÜ{TrS×Kmm1o@YìÝV-TôÆ-ª™Ì‹ÒOn+ÞÛ&ðí9aKÇIuM®•aß¶}f…ⓜ©Ôþš™§¾qtDl[ÿ©R„ Íyn}fk+e¸JFYú…šYã(š£0‹€ä% Êãöû$xZ”=)’$"áO*=]Ö{Ë4–çÍ’x¤)­˜Ò‰Ê´¤#Þ¢®^¼UêhX@i^uÚËš¢Á°GêÝÎ?,~§š·ä¡ËE{µP°¨ˆ¬É܉ÄÕ—Ô‚’|EÅåÐŒz’h˜v~iûiñ:­=CŸLPXû½¥,6Áíb€[XÃNýÑ _IqjP"Ý·3Æ c;cL ‹Â2 —itSO€†@dJ¨:j”Ö§†ÀzÏ án|³7ÇdŒcÙÎÑN' ¨DÚwÖYguÖÙÃb&I0 €âB;ô¬×ë÷‹éôÐs Eö$ …> aÔƒÃ$T¿mX19.˜gx†»ù.îì,áæÞ*>O—±2âÜ’Á…5ƒ•^¹ò™æŒýœ+JW ËÆ”)ö¡a¬¤%‚ÝÂ8cÜ™Z|±g±0Áh¾‡Mã'¼Sé#¨XC¸­àAŽÇîEAН@©ÑÉ!áÐÅCÊÃÁBA€EÁ6h,@9 »dùÀŽ6;úb?'EäÉg¶¸ ëxf§MyUó|¬‘´ä¢»bŠÍÌA·;Pè‚ÕÀ& ?bÍãÊ„GÆÜ¹NìKRDä3|? (“þçî6ôvÛ‡!ø)Œžbb¯2 $^ƒýÇnMKÀ‡\Д¡rá´Mæ*ÔÓî”êÜdà­…†bXd]jè߬ÆFkÎfï‹ ,Ðûb>ÓÃ>P ¸Of_Ö5 “D[™#…‹"3ò‚^ö²H*XïXè÷zšrϲì¥~¿ÿOš¾qqPW¸Dü1á °» c™rŒLŽÓ4Á®ÝÅÖ´‡­é·v–ð_ɶ7D0(%X ȔݰŸ3¶l)³?/Ï3Pv€åbŠ Lq¬Ó k4Gßp³#÷è¯yáÝëÑ_LÅÓð`Ânr)ÚMÞgÂBqÄî+& ÀÁkÅû Å8ôŽˆg:Ÿvê‚çâöSD á°Ç»èßÞµ]¯+€PÇ"!Ÿ¨;<.cA1ìß…¤Zâ_|"ÿ¡â(ÚiÓ"êýE2AaÑEÏžãÂBŒ`ŸñîàP!–˜.\íH]Ïá1ñ3Övá|ìX\`Ž}ŽŠ¶ÄŸ3âIP +=iÿ.ž´hà- 0 ¿%&€$ ²,{éД;|òÉ' ãñø¡J3ÔÇ-ØNP˜D©)™ÝÊÚôöþ-J›y¥[ á#²X2zdA|D­úÎbë ¯uöh —yßv‡<¸ë¯®®žyæ:t‡ƒÁ`0Ng«««ØÛÛ;ÒNý»0ª²8C²‹c˜ë¬EQý·¨KM +LßçÃîÑòŽnÆì¬³êpùÞo‚¾å!üÿ¿aeeÌŒáp8ø~åúõëýÙl6cfäyŽ,Ë`¿G Ü·5ŸvÓng?ö½ÈÙÇ¿‹¶ws@g³gcÐï÷‘¦)ˆƒÁ`pñâÅì÷Z6\½zõoúýþ?¢ÔG鬳Î:묳ξ[˲,{éÙgŸ}¯ëŠÎ:묳Î:묳Î:묳Î:묳Î:묳Î:묳Î:묳Î:;ÜþËï´?ë(×IEND®B`‚stem-1.7.1/docs/_static/buttons/change_log.png0000664000175000017500000006406413157571677022117 0ustar atagaratagar00000000000000‰PNG  IHDRôPï,‡ÆsRGB®ÎébKGDàààØNx pHYs  šœtIMEÝû0s IDATxÚì½yœ^E±>þô»Ì¾d™2Ùw"@ƒˆ וE@¹HPd15êUAd ܯ‚¸ð“k\‚ r ¢HKQn „5Hˆ}™É¾Íòμo×ïsº»ªOŸ÷ FðNû‰Ì¼sÞsútWWUW=ýÐßú[ëoý­¿õ·þÖßú[ëoý­¿õ·þÖßú[ëoý­¿õ·þÖßú[ëoý­¿õ7P•.øßÿýßWUUý@Uÿpõ·þÖßú[ëo{½õôôô|ìÈ#œÿ† úË/¿\U( D„ÖÖV”R}z2õÅSx¾³7ï·wzõÖìõÛjñ//Dý/ùO¡±êŸö·ÏTŶwýúõPJ¡ºººzÿý÷ïé³Aùå—«º»» ÍÍͨ¯¯˾dèçÄ 2'¤¯Éÿ%ÕÕ¿®û[ëoý.ÜÛ£utt`ÇŽ¨©© õ\èK…BáM7æ===(•JohhCÆ»œ¯dÜ}ÞÏç‘ËåÞö¿òXª¾ytýë³ÿú[û—•aõ¶}_c“wîÜY==ñAœ3 µµõM{ßÝ»wcË–-èííM5´ÿLcšÏçQWW‡††TUU¥ö¥_çö+¬~èì·Ú8ü«T¿$$ÛúõëÑÓÓó?§žØ¡WUUýþÍ0æÜ[èèè@¡P@KK ²Ùlâºl6üüÝ´ÖÐZ£P(`Û¶mؽ{7ÑÔÔ„\.÷¯¹›íoÿtǾ_Ãþû_V뫿늅aé_vÉÖÚÚŠõë×ÿ@uYƒ jOp}i¥R Ùl---¨ªª ôý‡ê$"tvv¢¾¾UUUزe 6oތ͛7£³³ÍÍÍhllì—œÿ£¾zÿ®àm¦aÕÿ)ñ|ûMUÿ‚zÓí'Ï‚VôÍ4æD„l6 "‚Ö:õš7Û‰¨Ô:;;‘ÍfQSS¥† ‚¢±±íííØ´iJ¥šššÉdúMâ?c±&î«öZ·ûuO¿ßØ¿•ìßf¿e‡3ÅVæÂòL‘Pæ„ E)(HA\«@öC!Ä4ƒþÏðnºººÐÒÒ"€rù|ÇGCCÖ¯_M›6¡§§D.Ÿ,/~?óeþ‰¯HÎD4ŠÑÆTÉo(E$ÿ̯SÄ»ýW¹™²ßŸ]nú_¨Âóœ6óîGÙ_߇’Cã½Å]äÂŒ—+E\ãñäÝT¼Ûö›Þ8%»Ô)Êɺ¼©¸³x]#ÑnÂ~8Ÿ'óqä°*¾ab|D&oÈš|´7J¬SmÆ Nvs(Þ=¾" ØæZÞ4’ÂÊ>TrËWDBî(9Åñ éd÷âAqQɵ%ÖbpÜãyåoSv¬ÓçÈ ¤7ÿÞ=ý5 ÃÜËŠÐËl-˜Ï•§“Äý)'&ºR„2ß¡2z%¬+ÝýÄ㌊„Ç/î>B“ ìl)¿O µ˜Pfé2xJáXß%§Jô Éž%d+­… º¦¤D²4fÈ "b—êÈ`*eóÕeÂ{­ ”J%äóùÄß2™  €ÚÚZÔÖÖ¢­­ %­1hÐ@äsy7è €–FRAC“32ZB¦(v„4¬A$’ÊM‘qõEp΂"( ûw;q:6œÑú~ ×)nMRìP;A§xƒ¡ãù4‹‰B¾›22EÖ‚+2kÐñ÷£!Ö±LÁn(¤Qs‹›Œ£Ïd ¤Ü;gXÇk(•˜ü¨?€‚öì-ÙÁ!¾5&ά{«Ã `²-7bÊSxn”ŒãNð7R[,ÌHóOÎ0Øy%RNÍk#Ã{°CWl1[ŸHéxP“‚fŒ91oM“FFe*†Ü÷fëììD>ŸOâ)¥PSSƒÑ£G£ªª «W¯Æ"´ Œl.k˜Ùm[[ÅFó¡Øø€be /³ÖVéS0ñ÷"ÅÄŠY×lK¾cïšÑfgIlN­bcJ@¥cþ`n¬IÎ7[îÖ/ÕÜPº¸¹11›ˆ¬#DäL?‘çÑ›{)rF&Vîʈ¿W§Í[PÜxjç<)ïÌí³ˆ;L$6RΰHï_,XåæÁØ/;?šìç cE©ì­HèÈATqß)~s¶ %£œµQXftظĺg¸Ì¸8­#Ñ#Ýx+ã#&õÄäøÎ]C›[<¤˜"õÆÙ<*Žî©ø¹±þ!áÁ'“²NN¤å­»M̨’²óeÅ̹ciô¹w ¾…´jÐdw÷Ñ8h6ÜIŽçN›ùdÆTqG4Ö»&BòäHæu,J„mœ‡@‰½²U^±u<øÄ×¼‘°1‹ïc6:v aC°ë™sm6€ZA §ßè™(²¥5Å{²#Ŷ vL…“¦¤Á%Ï@3½kgNÇ&DΉ!¹ ùÑòŠu“’ý1Ž—6F_ó8a<3 Î v‘mIã©ïÂËíʹˆãy±±ï’­rß[9t"Bww7š››+>/›Í¢µµZk¬Y³Û³Y 8••"Iî‰«ÍØÓ·^Ùð³öh’ˆTŒÇ¬Ø#tìGråã&‚ïp"ç»pÑ?ßá$/ÔÄ>A ë|ð{Y‡rWªÙΊ‡.Í8øãKÚíÙÖíDtì¡Ç»»ÄVQ ¯_ì¸á[!&ËÚ8mñ$™€rNYšŠ«hžb¥É–'Å»gÉí¼˜‡ï‡ÑØñE<`f—KlÌÌóµÛ–k¢Ôœ±uøÈK±HˆØDi Iˆ…2Ž*<û$šfÛ`7š§ˆç´ðleØÕßõš±åÏðÒR.däE ¥Ó-vë`³vÆÅͯó„¸#Ëv l£CÖÉÖÖá!/t'0Hn.Ü„éxš”ðE­nWÉÍOï@8a:‘ÈÒ"šFb¬ýyÕDáĤ™ &ƒ.ÒÄ#‰$6 Æà²(‘·Q•ºX:en¤íæn-?Êé\¹1UNOhfé5sŒ¸Áî¦H†ÛÅÒ¶›¯dš»ò=´cöd#±b‹×†±y äÐK¥Rj¸=Ô2™ †ŽR©„uëÖ!›Í¢¹¹9øê©–ú³ï-Ëhèþ”2IÄ®(§5Sré”ò’$C”é¯O y¡TG+¨*ÓoO¡.Ê QÊ” ¥Ž‰·#"ªö¯'/¢Ÿöö¡PèçŠs(š*C”²V©ïŒ´ñª¼(ʽaÙoTü‹ÿÂäË*U¸}rò(M÷¥õ‚RæÖëU\¿ÉµLsBRŽƒz#åݨ”Y ”ªÏöx‹TGI‘¦ð5^¸;±¦)}u%îêM#!¬Ãú* ”ª¬Ræ8MNlÚ³ú?‘W)¬¾·ÂîZG¡Í=9&—Íf1bÄ”J%´µµšššú©dû[ëoý­¿½eZ.u÷@@;À‰KüÇñ?‘DàÈDb,p{;Wžæ8är¹=&²Éçó1b …vî܉êêjTWWÛ<y¡KJ´ytÔb¨Pˆ¼·„t:¼#’€9ðP?ؘ”ªë à  XŽ,Ø‚‡X½Äb©È~¸mQí|~ä]T)ïÄ€lrçž¼ð¬;1Á$Tù¡s6kì}‚hx²ÉBÜß‚+í€(‹Wàyh‘8 œØ±s8 \â~:‹#èYZÃ?®¯o+=V&eÞ[0Ê?b†Ê`U”ò¼6à ƒÕÑÊÃߤé]•XR–…yÚÇb­€£Ì)ƒ= ¹Û¼ªh™ ¾9"›¯°h— 6y›·‚!7 Mk\.÷†Î–WWW£µµ»víÂÎ;1xð`{#|ÄžÌCä±L¾)ÊuC"ˆ”)àbÇ‚,tD.“M'î<›H„§à.ºVÛ¼’¶ÊRsIˆÁ.°å3ñ7•äÚ·ïnDƒf£%FYnOÚ¡¢í{8ðŽÔ©Š!-€/ ?U9à¡KÅ'1"QÞÖ¡øQ1d¼õXfÒjqÎQ‰t…þXð”²èŠXeAc.´ï@@JŒH[E(r¨äîmå‰ „ö¥:ZàN~ ¡ê': Ä”k4­Q~Ÿvo bLˆuÄezeÒÕÆÁ›—ct §øþš‡Wͦ#Æh–¯dŒíË­ƒ1£ ¶žùfˆ›O¥¶…˼ÅY3M$m*FIjvª‚­ŒSâÐüÚ Ìj¦´XYQBõK¬„aªXG/‰U·®%h0†ôÚ€õÌ€1Ã%êh½(‹7òÃÌärì1¸Œâ“@jAoÊv?ÎÇÃ9Ÿöä‚ëÅ':4SŠŸÞ` >x› ˆˆf[÷}F62 Í)~_»„¥õ‡“ÿ¾íÐEÜß=DÀ]Ìà0p‡ äm)žÔ· 9‹9o —÷ÅñhjjBKK ÚÚÚPßЀښ¾ùÀ ™– ÍbW/ÝZñwn„IZò„  Õ¤!ÎKQê y÷Á2>2–ˆÞâ‚Å”_bß`43ɼ3{ ȬÍ=E¾^I„,’[•É©:à‡¸>ZTÒLˆdÏ‘ åbÙBŽßAžx"ŽóŠ;ÿ¼+Cµ Ô¾'që(h{´Ì!¬Ór²$w­Ø*$d‚ˆ\¬³ªÄ=Ý&ä#¢=¹2ˆboçÍm‘Ø—Cr@]~ØôÛ•ÆGiY”À4?꡹²vëÍáµDÔSGeäÁêC͇ÎV±ÒÐÜiTàÐûȱƒ>S∜}–†ÎrÇÚn>D~š·#©ÌÈ ’3B“odضœ¤ˆ¨’`ré0úk‚­Y"J\¯IÚ)¡Ÿýyà92ç¿h¹–”Cú“x—hs¤Y¤Š;5®¸~—€?¹ãp J#cåéCúŠ£²@¢´4ÿÞÍ÷5n °˜{©T²çäK¥ŠÅ"´Öv—iBÏ™L™LÙl¥R ½==¨©® “v•Å3Ñ]Áñ•vªcJðK…撚 ¥*ƒy¤W]îfð±LH–Û%ÁFi`Jù%)c ŽqXò}ó¶>•¦>,#”Þ'òœr]OÞ›Òe”ÂcIäÕGq•»5•Õ3åæ—ÂKÉëBâ9”&Ç)sEþ½¨/ ¤ÏoC„tyIyGJ½‰ÍAª¢ðØWšJÑyØÃõ’ÕŠÚÊÈ\QO»¥¼R §ƒÓ(œ'vÎÞµÌËì5uc Ë…Ã÷FËd2Èår( "‹E‹EaÔM_CÿÕZ£X,"“ɼe˜ïþm×®]ý\÷ý­¿õ·þöj¹twEyž€äƒ´ùÆ÷¨8ãC„p×f¸÷†AWJ!›Í"“ÉØ·1ð†oÞ¯½nþñ|WW—ˉhX6Ay¤(’žSÃ2%iQ9ÀІ”ÇòØô®^³=ú8V®ZÍ›6cË–-Ð¥F1cÆ`Ô¨Ñ3f4FƦŽ&ð’K.Ř1cpÞ¹çòl-ÀÚ5kðÀüpß}÷a÷î]xø‘ñ×øyOzRb7¤ã‘ºNŽ"$éGÍØ²\“ î_†-PÄ0qÜѧœUÜWf¹E­ó@I>¼…僕ȿ$˜<• ¹+Ç gÂ{ À'ðCL†,À>/ ƒb2Ç(\Iªá‚‰¶»»€»vîñZ«®®FSS3¼x·“ÞyAø¢ »+[Šç?åöŠT' òÓ1±cA[k)ˆ¡þ%šƒGåéò)ð9Ka%†ç¤9îýd‰:ñ‰–Ñ$0 awÄÄÕ ð¿/„âd ¼,ŠE.µC˜C%ÆG›¨@0O.ï!Ã9-‰ä»3 #1@c÷ÌÁzb“ÆtÎyòµ'\îT†ˆÊPâ&T]é,ºî~+7‘B@ôŽüøš/Ôɱ Ñÿ¡,hË ´µµá¼óÎÃ_ÿúWqéa‡†ÿú¯ÿ„ Xx6¦÷¼ç=öºçŸW]u^xá…Äûuuu@øôgàÓgœ®®.œ{î¹X¸paÒ¨‡¬R€‚ 2]™ ! Š\hŒâ©üþÒÈã¤2ÿ78GeæŒÒPòƒ šoÍP%ž?)kÕs 9Èf2;v,.¾øb‹EÜtÓM‰Ûœ~úé˜5kVŠñG*ð¾)j„’3,Ž –i•¡ K}RYT¥ ±( ~ +x…Ê›—ªgÝ–•Io‘ ä´ÿz!HJ_'„²¼„òCþ»<’*A¦½2c@e¢ÑHM>÷¡Ãkë®<è.,7TaÓo™ðK %±<²+ìá8ÝÉûŒà®‹Œ9ýSêÿ£/2CDФãwçc⸺³»†¼qû.ükÀ ÄŸ½øÂ 8ù䓯üÓŸþ4þç–ÿÁĉÜŽ‡H¢2c¹>è ƒp×]wãšk®IìXŒ@ü¯¶¦úЇÂN m‰wïìÉ÷¿ì…Æ"p_×Ðç ñMÄnŸr­ß_PúõÄǸÂ=!Ïç'߃;µüwÅqr†ÄØÉwCrÌÁÇ80oeÞÅŒÝqÇ\'žx"ûnÚx¹yâ×å>¸vü8'±H¡ÔI`sç¿s²?É$Ÿ„ÇBèÊ2rþ.ð?—ó$tl9ñæXŒ[`:FD_SäA“þ.«(³–‚òÆŒ= ^¸Í?Î2Àå"©KäºEŵM yJÚC®Ç“k•ë/!Ãðúò:‰ÏÓ…ÜËzŒ =†w D}Û¡¿ÝŒºM!èxÐ3,oé{Ô‡\Úá/Z²téRœñéO£««Ë~^UU…Y³fᓟüd™XÒSU øÄ'>ŽŽ\}õÕöZ^çO8p`Ú`¤;Ïå÷°wgåÆ"µ¨´ó¯Äéê[_˜Ì+a¢JÇSüDà`RÙcM•ö¶2Ì…Ok¥sÎï3dŸàk:´ü8$îDá‹•¢NJá*õ!*Tr^¡ª>È9õḕ ¤Ž…Ç‚'îʯ1nç”­©@}·´h]ª ¥¿+…£Ç‰¹òÎSiO饚É2Áp ¤ABëo”f™U–I}öáÉòŽ o!èõk‹@ýWá>7J”Ûå—ôÞýó·ÄJNR"LÄÅÁ+ºßpû¶íøÿøaÌàúëˆO|â“aG”Xt)޳Îú N=õT¶Cï;@ƒ6-+ò¢+S$|7‚>8‰-Jž%oúçžÙ.B¾7'W¡djD²ê¸¾’\ â‘>i%çUì"¸,ø!:Ï B‘ d1wïÀÙØDµ äC$æÐýwÀ€Á5ÑÜ<À#¤òSM|BÈx9F6,D¼.x2ÔÉ#9Õ­/EIî´¼ç ƒD©u|Â!h¶/œ oýK9QÍ“JšüÔ…åšÈ{/¾;÷rÍ|Ç,ö*<" ÷ì/G/â(œ0ö±ÁñÇGd4ÇwH¤Íbz% Á"ÒäÛ5òÓWÉTRRn“QQo†9óõЋvÐúœC‡WÚŽ$0A[êOvcé* ·— 5¡¤K} ¹¿ýrè*þY! •ɰ‡|ÄÀØ 4H+±›wiEÍêT“TáË_ù Ö¬Y#úrÐAáƒü8ø‡(™“bd’ÑS2œ0kÖ,<÷ÜsX¾|9º»»9X"]yçËh È«¬j€YîD /»¨mߢÛ*Æ•Éï«ÄbTiø ¯4£7qЉUlÚã†Wv´„ò1Hp <‹çH‰k4ÎÔªH(^ ÍÒHoÚ}z {…Ìs‚öy‰È Q÷ŽI9²ßtxL )½€d'd´Ðä䎳$ƒHÃÏ…eD],«Ë® îÝÕ÷ì0*²¨lÇþɨiKq̉ïì‘#N?V[äƈÏ'Jë*çéþ—Ó€Qg0{áfjYoB0ã©äºòK¤ dx—a¡)Hð1 qì¹<%Ä&îü®¶,l>ÐÒœ¼‰€»¬®„¦$@HpÝIÛG‚¼óñS"òàÊgóc}‚鑼ïp*B?¢B”Ø3ôÝ Se€…@©`ì¢WeùÛÁ ' g$HNŠ¥-<Ï9•ÉÓ<²`þò—?'úóå/¹Â|• x²Ë«ªª0}útÌš5 ©u‘C9t•k/;D} `‡ê@&ªÁÏr}¡>„‡Óe€Ceð3@Ùê¦}J”ïõY*BèKê£ÓMšÒ¿;¨p?+SÅ„@ŸB–•ËÇ&¢!䌯ÌKˆ²aÞôгxOê«<öq¦)IÙì…âö)K—¨²¦2JRß¼O@EJ]‡DåÞ³²E}K¡¤¦wt³AÐjfÁ¾f3råó"ée]B¬§« Ä×J¥RÙúÛ-¿.¢ >¸CŽ7‚Éñ ް+»c÷"7ÜpC¢‡z(Ž:ê=ž ª2ӮʊÃI'} ßûÞ÷ÐÝÝ-£*ÝúE“<"QÑJô#Y%’”#ôŒ™_Æo¥Êˆnà–áþ¥H|¨aêhs‚Y5 *¥˜OòRváñ¢<‚ö#!aâ3•àzñˆv¼o*¯¥" ‹Z@žåÃT°Fò]á¹pœsS/©UÚLqj[;ÁVè‚g·ßeÏå;hRlÜ€aެ¿½R¶ÀŽ|9˜ñ¤ ¦Bžµ +P²wI‚YÙLN9€Ä.ß’9‰Šþ·™L?¾HöO…HgÂ÷Bê Ë“JÄKÖΓÏgDk`GæÒt‡WµÏ|Œ$'YCÑ?þZ!‡n«¹.Btñ¾¨³Ú á¡M$Rårèo§#kåN|·Î)ccò‹xü4GZÚ“Î^ÞÆGSÚØŠ†&%IK IDATÂc?†—_~9¹;Ÿ93Æ(—¿Ñ‰”Ã3ÈSñœp}]N>ùdtuuA›pihv¶(>g,Ãl¿wÔ-M “µËÁq·ÉoiãáÆ'ŽŒÄQ7-ÂþÑ Íò‹æÞš˜O€Ÿì€ÌMr,G£š±Ô‰ð'±¼tÌÅÀÑÍ:¿‹# -°$rÙZš´OÍÇ2…#bVGÏ%íÒ0– ÑCŒkÒ¬Ïdå9=ÊᡳMÿµM^¾ÔŒ¯6§G¢ŸÁä ú®vi­hH41Q|ºµ A„åÖ…ï«ã ‰y}®%:0/°u­Ùstƒ†††ÔS¨<×ÔÛÛ‹… bþüùxôÑGñðã¶¶ÖÛ¿üå/X¸p!žzê)¬\¹ûí·:è ̘1CðÕQ™šk=ø.\ˆ¥K—bÙ²ehjj”)Sì¿#<µµµÁ{ð 0›Ÿ ë7à™gžÁ’%KðòË/ã•W^ÁÀ1iÒ$L˜0ûØÇ0aÂJ‰§üÅÅ+íI?I“¥R‹-Â+¯¼‚¥K—béÒ¥X½z5F…ýöÛûí·¦L™‚#Ž8"ÈA Ôq1Ï~°¯ó ɦ¤](5åB)Ü¡´Céiò2© J; ù¨rJŠüªŽDœyº &ÞÅGÇ“/g¡hs ¨•·yJ„úk”P>Å ‘’Š =,D_Âî »xñbª¯¯/«h*Š’‘0^àÝ J±G«u %MèêêB±·cÆŒ‰¤’!÷´’¦oÅú† °eËÔÖÖ"ŸÏJ!WbƒRÈXªJƱlÔT20¦BZ‘Âóþ÷ÇT³®M™2÷Üó[H†"K¦)Y÷tq¥¤ê²ìXüãñµ¯}ÝÞaìØ±˜7oÀí·ÞŠï\sM*=èÀñƒüGN;RŠ•7¥b ?ûùÏpË-·`Û¶m8à€pôÑGãˆ#ŽÀ¦M›ðÈ‚˜ÿÀ€ÖÖV|ûÛ߯´iÓ8˜½WOOþüç?cþüùX°`víÚeûóÌâÅh¨«ÇÚukqá…âÙgŸ ö{̘1øïÿþoL˜0ÞG $~#"lܸW\q{ì1 >Ç{,†ŠW—.ż@±XÔÕÕaêÔ©Øo¿ý0qâDÔ˜¼&L˜ˆI“' QóbwÝy®þ¯«Q(ÐÔÔ„AƒaíÚµö¾Ïçñå/ŸûÜç\Ébb쯌•ÎÕŒç`Â'Êp[…XŽ(œ&¹üòËqçwˆèf'Mš„×_Û·o·×nÛ¶ 3fÌÀ£>jϳû›ÐR©„‹.ºüãÿùŸÿ‰óÎ;O<óÄOÄì‰qà 7`ýúõ8ï¼óðÐC±3ÐÑÿ-_¾gœq:::„±ãï´ð©…øÒ—¾„]»v¡®®£GÆŠ+"ü@ÜV®\‰3f`Þ¼yÈåre÷ Ï?ÿ<Î?ÿ|ìÚµ ‡vfÏž-v÷çœ{.Î:ë,ìܹX¸pa‚y¾ð…/`Ò¤‰bvº:»0kÖ,Ü{ï½øÈG>‚¯ýë>|8 X,âñÇÇ•W^‰Í›7£··ßûÞ÷ðì³ÏâÇ?þqÛCIÏŸ¨<¨‡|0O`L÷ˆÑeÎ'ˆÙÜÎåŽ;îÀµ×^‹®®.qĸá†ÐÔÔ$îû׿þ3fÌÀ¦M›°xñbœtòI¸è¢‹pÚi§¥îTû<çœÓçyœ8qRy|Uúv=¼k ®Ï´3éáöÇ39é僩‚ös–ô…áá’´}=Ø^†92¤)íªTz·ì„©ÓÔ7ÝL)z¹¯ª=S.§M¶¤0#–Ï&so´Ê[Õ ÅÅóæZG¹6Ÿé •ÆŠŸIõY¢@Xºti°#FŒyYXÃB,N<ÓI2ü%™ËÂí‡?øî¼óN|üãÇܹ·ãÉ'ŸÄ-·Ü‚'Ÿ|—\r‰Û!( ¸å–[¼ã4îßu×]gy&“ÁôéÓƒÌMŸûÜçÐÜÜ ¥ÿò—¿L0{9 O<ñyäœx≉~ÿá÷á¼óÎÃ!‡‚¹·ÏÅÓO=…»ï¾‹=ƒ/|á âÚµk×âÞßýNÈ´ÏæÕÑÑ‹.ºÈFÎ<óL446fªI“&ák_ûZ¢/‡~N;í4ûoÿý÷ï\(ôàôÓOǽ÷Þ‹sÎ9?üáÐÚÚj_9›ËâØcÅ¿¸Q¬¯ `þƒó̃iÌ]èÃUÅ%òçüLr‚aËgÇ“ùV¿ß³fÍ•W^‰®®.sÌ1˜3g›šŒ]S¦¼¿øÅ/0`@$'¸âŠ+ðío;È´fúÒјdž1“'‡çñðÃBóˆtA–ÃG™¹ ³G–gK2Ü!åû†·“eZ¿Ã¬ˆGª¬A0Û‘Ïl‡t–:Žðn–”c¤é]$YPcâ³6úŒ|’±0Äê³ù%Y Ë13²ï¨°Ó ºÙš¾h*Í ËN„& ìàg`Mn9¤ ÞNÆÞô9£Ì™N´0»wpð©"uê‘SÈZ@E»Û4ƒîÎu“+€aB  O€pp芅¼ç¯Y³7þâøæ7¿‰«¯¾S<™LÖŽÏg|ÚÛsçÎÁX1ÐŽJÜÿý£ÐÛ[dcä|תªjŒ;Ö^{çw¢§·ÚV["d³dsY´ ‚ þã?c7kÖ•˜9s&~ú“ŸâÀ©S¡2€™l|á øà?(®¿õ¶Ûœ|k`" ”úîw¿‹Õ«W²Ù,¦yd<7ZZœú‰Sq衇‰{°ÿ¸âŠ+qåWàÊ+¯Àûßÿ~çì@ã–[~eË–aøðáøÂX‘ÜLœ0Ç'iY¯ùÎ5èè耠GÕ)ÔªÐ^Ô„ä%e0ø¦/Ýe€VT&ÀS1‘ƒG9˜6rŽqÓ3‹žÁܹsí_tÑEQÔ„´8#nÆzÂøñ˜óó9QJ,n·Ür ž{îY dëP¾{­7Ó¦“ì Ö'Ný=LÎãþ€+¯¼W^ÍåûÞÿ¾øz§@Ï€º TÖ' !BÔàÀ4HÐ(1Ëô€4ÞZž—Ž‘˜- (Hƒ+N†yÔ°‚ÒX»~ê0§=f"Þ';°ŽqÓ€ÏìïšÑŒ¬h ¦d6I#9.vÐu¬#w|­ð§& œ3ráøÈNsà,<ŠY;´¼ÚÁáãx“ë6=R–I ð…¬5+WÇV¤]:FÞIÆ*°AÿWjå^Š Œ1¤Ó•oÔñ æú蟰w¦Q3Ï-ê-[¶¤ôá–¸ BDB25y˜z£À™Á9kòx³yœ‡rß´l6‹nøoLŸ~¦y;¡tÓO?]|gÛ¶mؾc49ºïºõë°iÓ&qíæÍ›˜Â#‹i Ýg¨½®«« mmíöo‚õJZö’»Ë/¿gŸý9=ê<×O}êSâúU«VÅŽ[p±­éèè°) "úil¨g PÚ.HàÌégŠ{?÷Üsn™kçT€m[¶âg?ûà´ÓNCuuurgÃäüÀĽÛÚÚpßý÷;d¯ö)õœh0WRÌ}×Oé`6gWµDZ{¨iN få þ\mÄ2ŠRôôŠÂ/Ç|äÐ…k §yÏH¾ãûãØcý¼ì²ËÑÓSpèñ¸×»óØ–§O0ýÌä<ŠMg5Ges¤:;A` Ácn-O#hNä"ŒO¤É}×Ì†æ£ W–é~mOÛDÆY[cçN"hN¡g¯1zÌÀY£®ÊìôwJb™³‰EÿÇã`ô7ÈZîtu¬Kcué@/zDöt‰‘#§2Ú™ëÍ©w’)vL5„k'ëÖù€©Î)'Ýšç5PŒ %¶ùòœ(½~Hxr~¡Âˆ çÃÍoñ`©D%cÏ0À3ÜÂh hLHDH¢ÿíØ±#8EµµuQ2¼¯ˆRо‹]xÅü¤Mkk+Þ÷¾÷Š¢2ðBQãÆawhÛ°!AU:lØ0Lœ8QþFÅ| )‹*£†KЂ2O·¶¦61vïxÇ;Ä{BD›`ŸmZgg'¶mßîÉvœye©9ÒŠµpÄᇋhÔ_ÿúW …D¡á¿ücìÞ½; é~¸ÇLo^ƒ9$ñ®Ï.^,ôP8„Èé5É£{¥JôT¾Þ ÈÔŽØR"ô‹²Çó¿¾ùf¼þúëö1&‚"©xå˜WÚ-_¾?ÿùÏ)©WBó¯ ëûá¡yì)$ù~¾Ú/°A’Ž!¬‚•KÎO×yó ¿`’gP}õØùüb@”¤ †—&Db-’·<ºÙmq‚ÎÙ;‹PJäEA’T¬ŽÇô&˜få±kø©Bø4èÞ¸ð°¸\D2„î‡GOËu8š›²s{kW[®úÛ©`‹Å¥¥ÞìÔAèT€Dýó·bËd2{àžÈ½¯ø³žîÖ®]+5¼µ5!ûAº»øáýèGmê¤Pz TUWÛ¹òç±­­ÍÍIʸ…æ1|^_® ²/&BîN=7ÁÈ)« ë"XH~/8örâg¶|eèò9ž¾ M¸`yôõRÒBùÌi”¢—¢ù1\ñ8åÇçÒTŸ±_‚™OŠUò-øQ69~Ñw ûa˜…11|bê«ÃÓkiJ9lÐcÂ~âç$µ ;ð¡¶ü,§à<üÐë[a§^ìíE©Øks[¹|¹|UŸ8çÉ'» WÖ‚ON”J2‹ŽâVÚ³,È [Ä#ŸfзïØçRÜä˳*.2+ø\¼ )v22Îý+%g¨¸@CÃ…ÌN-Œ4¥9‹,å ’3ºö”â–Í›qÏ=÷àî»ïFGGG8jarv½—¶&ʱç YØM•!HñH*À¾ûî+®Úж…BUUձ޿AÃ)»AƒÙ뫪ª0f̦‹)1W®Z)vƒ¿þõ¯ß°œ7Ä9}¥•§ò¢õ«ÒLÓ†_x£ü±ÓxÞLá S(ˆqD2»fçâ5#¸Päœ "àõåËÅ3³Ù,jjëØ:‰ù18”H˜#~¦•J%¼¾|9&OÞ/¾^'æ±­­ Ý…TWç£bJ`g¥)<£G±kÛž%·Er˜²6T©ÊŒ1á6S*–gGJ‚óSÅŠ™ˆ{%0Jš8•l\ ‰lfËp«X§x]³NÖ@¾#¢c½ã8ÈKe ô0ü†b”ºIƒ§dÅB>þJyEwœsB-²+NåSØ*WˆÇý1rÄé=È‘½êø-ák]E¢@™‘m7uÒ)qçôM1*N³Ë*y=' ÓÈö}‡n6ç¶ãUã|ÚÆP Ð% …ê“1ß[]—Jxý•ñÂÂ?aÝòeؽs…c'bê´£±ÿaïFUJ¨Û7*­e”eE6™ÒÑE¢ºT¬Ð4«%D‘b9®c0¦­[»Îæ SˆÚrkFð€¸Ê’¶ž$áctQµ/²Û-j2R0_ªÌ}ÉȈf,É…¥UÊKÙÅjŒ ¼ð‹¸í¶ÛðÐCa„ 8ÿüóñÑãŽÃe—^ŠùóçKcBN)FcëUÓò%œ¤/lFA{JS¤Z˜:2ßÝÿýÅu]]]˜ÿàƒ8ñ„ìxš |:Þ8q"”Ê@“f$M «V­ј––!hl¬wŒ‚”ޤ=Á÷­­œrìbF¡‘©ìgª¦ÅU¬ØÚO[£ÚP^*f$Û(W¶‹e„ØN•]KÊ• rçÆoß¾š›œóÀŒ¡bTÕ¦Â×}’5Üÿö·¿aò¤ÉÖ(…çq>N<þ„Èø˜ªñõ •˜ÇLÖTŒšqòã_7ÆNA€ò¬q1®°5Äñ\hb5œ3jŒä_[#á*+Ç^1ntsmjC*#ñ6\`”8“M¼Fª"h2“ÈíÙoT¸Ž¤¹Ší‹ˆ¨ÅkEÙ 6Y‡S+Å̱©!YÎÔÌQbÑd° ‘¦T4 38d{¬ëÌsÌ)#ûJT[ÔZnñ­ËAžsBä#­l¨Ø Êjƒ{X>z±ÁÊDâ¬^‰ã]X*!›Ï§m"Ú«;ôGî½÷Ý:Ý;Ú1 ±µÕYhMxvùóxòá?àƒ§NÇǦùªª2) ¯&<( ”EŽ'%È[œ!œ:u*r¹\‚ eñâÅIÒ—Ý+Ká%ÿFi×'®õ§>DY¾RQ’f“ÇâÅÏböìÙX´hÆŒƒÙ³gã]1Ím¹„‘ß´ìHP1z£úŸwâĉ8âˆ#ðôÓOÛÏï˜;'¼ÜüÄÿ·uëV¼ôÒKöÚˆ<ǧ%¬^µJ^xa€¥-z™aÆIƒ¾|y¸ßHOÇÒ8*æ¿3Òå7Ät•6§±“Á;žïoÞñ#.Æ6èDå™ÓØ{d²I57nܸÄ÷FŽ…97Þ˜˜Ç›nŠç1¾ß‹/æþšC* \Ù,Ä—Â6‰T‚ þá}ò¥¢Œ,$ŽÅ!­_(óL{÷ð%¤£ !y¤Ög„ ŽR™ó¤NDYY"q¬,°®Pæ{eæ4ÄD‡PÇ +ïÐ}šPSjRË0©œ¦:Ô²âÚžÐI¾™ˆðâÂ?á/üãF4að€äùäBO¯®Ú†ªÆìè4TÎ0‡Åf‚ÏA,`^ÚÏgb"­½RZãã§žêªs±vÛí·Ù²™1ƒÞ4(ðy…ÉûeKSâ<Ú°8YF/V.•3xù‡`QèîÆÌ™3ñÚk¯:ø`œwþyÞ‚‰ þ¤ÞS[²AÀê„&ï ¾,‡¨Cae["“ß[[Š1cÇà7wüF‡ºþúëñÞ÷³¦Ÿ…O<ÓÏœŽÞÞ^\sÍ5¸áG?BmMMœÅÔ.ÍßsäÈ‘âñ¯.[Òž"båPm±OíHŒÅìܹ ¼„¬Ã¸2f^l)QAbH9P†X†l¹GgØX9aówF„CŒQҞ̛7×^{ïqãÇ£SÚ;“ äùà¸Ïí^-„šš kCFgå_ÆŒ;î¸CÌãÏãYgá„OÄôéñ<^{-~ô£¡¦¦Ö‘²À;ŸM.?kÙÌâñÕ¢\©Ó£àz—Û$㥔eq|jKÄKÇjáLIݬy9`»6H¬aSvØ,sÉQ`¨´‘‹$’› Ò²¤³-¿­ÁțȻŸãI–ìÅÉ«-¡ Ç"§‰±áyÐNØ19 o‚•‚ÖŽðŒýÐÊ‘öJº¢ü°Õ#ð"Ô1+ž[slŽ5?7¯Ó™âra€‹ýÉ"¬…«†D”£i‡žŒ«•”f¸C;ôR©„R±™L*“þûwìä·mnÇã÷ÿk‹xǸAÈz^»Ö„—_Û‚m=8nú98â˜Tðd†EÈðDâEŒ¸æGȈ̔»£< ¹ ŸúÔ§pÓM7‰.,Z´K–,ÁþìoÑ«ÐÌfìþd‡ÕV`Ï„­ GJ3@A§Že SÁ”•¥2©h•¥~}Ë-âøÏ{Ž:*F;G@AÕ§(}ǯT\ÚÖT@ V5ò!,¦´EM—uD` o<žñs2Ù,6n܈ÚÚZ̘1 ضmºººlÙ×±cÇ!_•w@<ÍŽ¡°“­­™½páB´µmÀСC-hPÇ@*p„ºŠdÙ”ö]±b9>ÿù¸çw¿C]mC S ¬4ŠK±]´u¦(½8‹e”3ÀJ†Ò„CûFà?^õ]ÅÏ*5~üãã=ïyí߀¦4h¶nÝjŸôàƒâ«_ýj4ÇÊ?YÁV] Òjkۘػ¹gQ± ärY´ol/?ãÆ¡*Ÿc§F(BÃ+UJàa”]s±¾Tf5ÂQ”± P怚BÆz†Í•²:=F¼›ïYÀ•G;ªDMÛù3ºDq ·§×™náõß´³P>9Œ²k FghÅÀlÊ:™‘hûG"Údcæðe’Æ ÿ#ËOhYÉÎöQ³Â£ñ{«d'ŽúCà³M Úq9 oꔑ;ÀkÀªöŒ@™ p*Ê]‘ß¹ØX‰ßávŸŠyfò™1)gÔÉó¼6®[gžxV½ŽºÆF 2 ̓†`À A¨kh@uu-rÕ5È嫯ªFUU5rUùø<¸w¬C)”ŠE<öû;ñÒÿ.À{†ºÚ|âùK—oÁs¯nÆÑ'ž÷Ÿð d²Ùò}5Â{^™¬²ÊÊÀuI”LÔÌÈ0¡!ÆJžá${núô3qÏ=÷$˜ã~ô£á'?ùIÌž&O—‚œâT f•e!ƒ~âÏù3yç;QW[ç0ðáí¶yØ©6ÛU.M+s(ÜvÛmâšÉ“'Ç‹”bƒcUXZi:y„N;íI©¦‡Àü‹XMÒ>“uEÎé)‹˜5k–-[†;~sF sžÞ9ü”ƒU Œ9"áàÞ|ó͸ð2D¯\Ÿ|!’ŽêÊ_tÑ7qÒI'¡®¶6Ÿ#ïè7ü¬2„#Ÿž~rh`ó™²–L%ŠM(±2€yóîÇÚµkqä‘GZ%§L›6Mpý···cñâÅxç¡ïtçãS7Ƹۣx6n”ÄCÇ÷Ñø¡Î)3ÃW*•ì<þæ7¿AëðV¦«•3‚Ö¸¥0œ º¿. IDAT ‰ª ¤åm¢¤¾Wäú'UB¶ùÑK•;ræ=;ÇJ²Tz¢iwú|²µwŽ›‘«È!”ç¸]$×Èu\I|LÈ:š9{ÎÙsÔøi ö ðXÃ? Â=ÇÒyé9XgÈŠ³+=&Ö=má«v àûeå¶„æÈ­o+%[ÖGé“A—¥ûå vaD+¿«¶V)´^*ñÀon£¿¿ÛÚW£¾&‘Kôhô–4rùäkj‘Ï× [U\>|U5rù*T×Ô ¶®õÔ2ƒ‡À !û¢yÐ`¬\ººïN8q&”ØéoظÏ-Ý„ƒÞóawúgQߨÔg ’^'°©e"Cãψ`f ¾óïà‹_ü¢%ë1»ôïÿûøú׿žD/—)Ÿ˜\˜‘¡ýéOŠo¼—]vN>ùd!PiÁÔÊ~•˜ غmk‚ÔcÉ’%8ꨣR¾!PT:è;aŸPÜžÃŦ֗ÆGén½õV ož:6éÈgùôñãÇcÒ¤IX¶l™ýÛܹsñîw¿Ûb*(8ÆÑï½½½¸ô²KÑÖÖ†3Ï<³b’r–INvÄ pŠÒžã>Û¼e ®¿þzär9zè¡âXÑÌ™3ñøãÇ…f¢6oÞ<¼óïô(R=™ûñè£ÚÏ&Mš„ÓNûT²|,˜ÇÖÖÖ„lørÖç‚ÅT~c“vŠ)é¤ê” EkË•$¥tDÖ¥!ÈSCžO¾îLÂÉÓMNʃ)TÞ–ôKÅ‚°Tf(©ü|ô%ù\îš(õ+G·W¿ž|è÷øãí¿Dc¶ïÚ06UC)…bQ£§—ÐS,¡X"h]D©Ô‹Þ’F±¨Ñ[ ¶kì.j¬/zJ„Þ^B‰€|U- ==Ù’ÃÔ‰­Èx}ؾ³Ï.Ý„¦aðSþ¡T*!›Í¾åŒïz×»0sæÌkØí·ßŽÚÚZœwÞy¨*sÔ®\Û±c®¾új<úè£8묳¬17× ýžÖ8 )•Qõwž~{ðÁñùÏ>x¿Í›7Û\{_úŸ¾¶¾¾›ißÿþ÷1þ|Œ=:âz£kç‹_ü"fΜ)>ÿú׿Ž3fàÌ3ÏL•Ñ]»váßø-Z„™3gŠzÞoK«þ÷÷´ööv|éK_ÂÖ­[qØa‡%ð"C† Á\€ë®»NÈÈyç‡}gÌ…³¾aþô§?Ùß/¾øâÔqûGÌcëo{³åPÆsqÔŽ‹Ò(éb’ßÇ0 qåpD„ëVcÁ½w¢FïÄøÑM¨¯É T,!“QÈe3¨ÊgQ9¨ŒB6ΧgTbW**Ø¡àòì…ž:»{ÑY(¢X¬ÅÈ}P_'Cí]ݽxnéF¼¾f­Åýw܄ںzÔÔÖ£¦®uuõ¨khD}cjšPß4u عmŠÅêë›P][ÃÂi,4¥Tr›ÍÇ ŒD€»]6ÄÌØX®çÌ3ÏDoo/fÏž-Æò—¿ü%zè!\xá…x÷‘Gº •Å¡}bqýb©wÝu~öÓŸa×®]8ýôÓ1sæL–çŽæuç® À¦f ñ 뙼Ÿ"èèè4­ƒ[£¹¹Y\·råJ<þøŸðÞ÷¾W ÎO<ï}ï{ 'aíÚuñsvlÛ†ú†zäry@Û¨ØÛ냊ý7~TÈhuttÈ@t|ùÎ;q÷ÝwˆÎLϘ1ÓŽœ†‘#F`øðhhh@m]-jkjQWW÷+z¦b²`s®äˆEŽ:ê(rÈÁxî¹çm?zzzð£ý ,À§?ýiL˜0£GBGGÖ­[‹‡~wÝuvïÞã?gM?Ë­ZbQ%AÛ«Å«™hƒ½0)‰´#c/¼ð¦M;RPÅ‚=!b#A{Z,1ïþy¸á†lŽüÈiÓ„\^ŽO~ò“øÃþ`É\vïÞo|ã˜óóŸ#_Ueit”SFÖÙ5NÝÉ'ŸŒœêÂÀñX€;Âó8bøHŒ1<žÇ:ÔÖÖ ®¶.¦f‹—qr*%ä\èØ¥€•dŠÇpnƒ¿#ŸÅR%öùl_ŽÚÔ1—)å‘C!p½/9]Bs¯¬VÈõן[_d)—YT“é •Ø…;9UJR™±à˽ƒc&4kÎ`xnÛú8#ºÛ\Ç'ƒ(…Þ™Ñ+FÆYŒºç Š[âT²ŠÊ0¨À9•ú•ã¢÷aççÜ2£FFuU•Ì몳«£[6oÆò×—ãÙçžÅÃ?ŒÍ›7‹ûL3Ψã@Ȩ ¾{ÝwqÉ·.±„.K–,Áw®¹—]v¹¥Ö,)ÿ?·ÜbÏ‘Ÿú‰Oà«_ý “;†·°bùß7|0>ö±‘Íåc±¼ÜбØ)Ñek¢gÑ̲,“ÖÌ) /†.¤%ÖŽq\ú@ªGsCÖUÐJ$à-ØŽX.Ú¥C”¥nµ˜L†´9_küx8ÚÒÆ}ˆŽfijáè«T„­û\;'‰ "~iâÖ^«Ð—b“ ?¦¼ô›·y»¦´¥~U*nJ¹|ºµ1s$Y:ZÅè²£y QK˜øÅ‹“.éDu í(•}òk¥FÓÞÕÕ¥† wº:pÓuWàµg`ˆèlxd ¶v±~[%jòYTç3¨ÎgÑP“CU>ƒ†ššêòÈe3ñwÝ÷#cî ¿²ŸÉ³ñ¦®pIëø¿q hM(jBOO ]]½èèîEgwÝEìîŠþõRPy 2“ž†ÃŽù0š Jä<G+ˆJ<ä ÔIÁ²~ý:Ì™s#î¿ÿþ`h9“É`äÈ;vFŽ‰Ý»wcãÆX·nV®\i¯;þøãñå/4³4IÔb±ˆG~ÿïÿ};Š~ç;߉‹/¾cÆŒI€RV­Y«¯º /¼ð‚øNmm-.üÆ…øÐ‡?„ªª*€í[·á“§}2µT,L˜0W]u&N˜ˆgŸŸ?ÿüàugŸ}6.¸à€€ ím¸ä[ߌ^0tŸ}ðƒë¯Çĉb/ßûk¯½†o^ôM¬Z-ʆŽk®¹“'ïÇx½#eqöÙgãå—_~Ãa²Ñ£GãŠ+®ˆ˜à’Kímmøæ7¿Ù§gd³Y|üãÇW¾ò‘~áÀ«r…kWHÉ\³ióf¬Z¹¿¿÷^<0~E,L&“I¤~L‰ØrmРAxàbp«T>f ‹EÌ™3¿úÕ¯ìý?üp|àƒıǃêê*¼ôÒ<üðøçž{ÐØØˆK/½Ç{¬X^ýfÏãlÍÊõKÞfW«ñÀ\V§.Š¢ ˜½ ,RÂ(€}yàÅAR¤Â¿#q£1%Ïà;ýÊ62 ^ø¹zC’»SVÊ·M ƒ$ëI‡Ç7òŸs௞ÔïÓ©«°óúTÊË¡+Ra;àN&“Á¡‡ª*ô4àËiD„îîn(¥ÐÚÚ¬dµyÃZü—|´k †ªB&dTd”7îêEw¡:ŸA]uµ9ÔTeÑÝ«‘Ëf@z =%ª\Õù,êjrܘG&íðÝ.=ô8lŸ‰wóŽå­ï$75ÍC«Ê7¢ÐSÂæ›ðÊ’WðÜK+pÀQÀ‡O;̓ɪU«0wî\<ù䓨°aCŸ¾3~üxüÛ¿ý>ðXƒì·Ûn» ³gÏFOOOÙ{ <×_=&OžŒW_}_ýêW;/¿UWWãºë®Ã´iÓl˜ýª«®Â’%KJòÃþ0>ó™Ï Ÿw)“K/½=ôUêÙlßüf„èÞ±c>ûÙÏbݺu Èç?ÿyœrÊ)hkkùçž[±l&WÂ/qÛm·aΜ9‰ˆD_Û€pë­·K·šgüøÇ?Æ<€-[¶¯9öØcqÁ$ê¹ÿ=íž{îÁw¾ó½"ÇùÈGpÕUWõéÚçž{7Þx#–.]jÍZ.•J6l<ð@|ñ‹_L­‡ãô<ö·þöfµl6Û7ƒ^,–¼Êw.D¢ZM¨Ð›G @„ &”² Ã.y³¯üOÔgv ©ÞßÎ^§–ïÆ¾MUÚ\…lF¡¤žaíÖŒZ‹ñûÔ¡*èÞaw¡„ž"¡P$tJÈ(…|.ƒš|µÕ¹hçå³¹ˆ%.ŸË ›É ¨ÊgÐ\W…ºšœ Í CÔ0Í­1 u¶îìF¡§›ÑP_‡®›ñØÃãá‡ÿ‚÷œ|Ž>þTïÀ„—SlLËÖ“ä¹ÈÐßœÿ¶jõj<ûì³Ø´i¶mÛ†íÛ·#“É ¥¥---2d¦L™‚Q£F» •õÔS*ù(~ôS$‹<9pù2Qú„BåY…ÄXÎÿ¿¾ò ^{í5(¥0mÚ4GÛ©\Øø©7nÄŸþô'´†: ^>“ž;ÛÏS~ E…²’ì5Òƒ^|Swè½½½Ð:*Q*}ùÒSÂ/®½¹¨©ÎDᄘ6vù¦5T¡¡&M ]=›vѾ³†Öbßæj ¨‹víÙŒ‚Šwã¦*U&vzKÿ3l´Ê ¸²™è|iS]F ©GMUÖ†çk›[°Ï„ÃP;p8ž}éUlÚ-ò1#†aÂøQhl¨G×Î-øíí¿ÁßÖì©3¾ác'ö»’ÿ­X,âÚk¯Å}÷݇ٳgãCÙ£ï¯]»óçÏÇ/~ñ ì»ï¾øíoÛ?¨ýóØßú[Å2èéåS:¢~+/禔—­ –RÊË™¤x•Êe+ålä…Œ˜GWo íÛ{QèŠD¨ÊeðŽÖZ ¬Ë¡XÒØ¶»'º‡­;ó†š,êªsÈg3¨­Ê¢¡: Éàœ ¹gcƒmòî%ë K(ôhdTÕu 8j*TÝ>øóÓ/Øû ØŒ}‡¶@xmùŒ;‡þN¼üêïѾf%†™Žr,3 |CDà’’^®Lv5–ÉíÀ¬ç ‘È&æy+–[øf‘¯‘ 6%Ø–8òž9>å=[úŠ–XB)™Ä3}ðP¬üL…òé!ëçÓxî7˜$†¶—M‡çbŽJö7±_pÉ%—à±ÇÃYg…C>ÄÍÛu€íh”bïJ„ÃGàœsÎÁÎ;qç]wBkŸØ€X˜ N¶\¬J”Á%’yCâ‘&~KJ¢Z¬D§òöéþC’£˜”ÄNZ$çÖÊ¿žå]}Ô³˜¸òšJñÉ»Ÿ” !lýôK¸ôR6̘'r’½Äæ<‡ÏsvîÜ;ï¼+.­œ±ëÞ¢±ÙŽÝÇ#‰šØÊ¬M×¾ËfÄdn7Èêl'õ%–£f×€•.¶uæ-B_ɈûÜc¥±àRåñðSæäŽH*s‰õ×; "ƒ’ûÛ7·}˜N4 Ûá¼5nA‰o«+˜þæ0'Ît§Øâ"vbÉχõ,'ÅQ,òAééûb'-~ùG?dÆÉ,Õ(3à:^LZkè˜×oUÕµP*R½EBgo ݽÑóKDè)Š¥è»]%B¡·„-»zÉ(ä3 Uù8_žÉ ›vÝ…ž"¶ªd³ ¹L¹\Mµ9ÔUg‘7:“_ z–¡â …^k¸†¶ fÀ0,[±¥˜ïxçî.4’ªµmÈçsèééEcCö6u5yli_/h ÁÑÄ$ þ8±ì »“^NÜÂë%ô c‡‚@r»:÷Ú"¶%}ft )å‰cdc¢ „ÍÝ9æGY(žLuÆ×ÄØ³ŒnÓB&½¿{¥Ry½`W›/TƒjÕyË€F² ERW9®_Â÷¿ÿ}<öØc€N8 ÐN©$eß¶,eDhÒ‚)S¦DzCó‘<׈õ)ÁNfÙ´Ü܃§í¸S$Ê7³uìÇ$£Ô<Â)ÆîÑi:#äÖ9£BŽß’q)ɧmžã”¯f…5øÑ0˧FŽtÔ¼/Rê¸óÒ¢?ø7¡k5OÙ8òËa¶´ ‰çQ±ºîÄj3e­K¤†`DS$å%¢ V¢ö;£,´²jPêŠËç{ç¬gAÿ*e^~ÇR3«%(W­ƒéÖ8‘̺¹)gtÀL–lsù#Ì9¥¬ýÍÈ‹–GÁ6‡Š•vŒ³` tæô× Z%ß’TK±õN"KÍÙä4”N&$8å®y¦°XO­nZÆ%—&â\¾¼uê¥Î{l±X ôæA-h8»7mCCm¹PMK%ô”¢{ÔWeP•SÈçT”Ï(ä²ÊtËdTlÐÐ-¿)hRè-iilßUÀ¦°gÛjrh¨ÉF×bcžÍ(ièsäë™Ð‡¥K—Ú°j>ŸÇ°aò¬?M)Ï_°`?üpɸEådzÓ`‰#aÈCÃ$´¢ôIMö;D²€@]î0m¥¹&z,Ä!ÖyéÛ<¦ Cò9n©ÌØILjB©À¤Ræ£ÌP¹¬‚¡03!‚÷M#°£rkšB¯’Â>è})ÉNI)½ ŠcÙ(ô~Aýœ6ç3"QEÛI…ÙÙN7èŒü„|F_0 Éd@D(•J‰ð4 „Qã÷Ãsë^‡Ö„LF¡¶J¡¶*Ó'åM衇]2JǰþØ8«xמjò‘‘î)zŠElÜÞ‹u%Bu>‹úêè(\Cm. ÉÇNAŽòÐ*‹R©¥€-Ûv §ÐƒAÍ Xß¾ÅR ]=r6´oÆæÍ›ÑÑ]Dcó`Œ ¶Â’²$ÀZ,¶êñ(W¨ ¿˜k`¶ÀóФÛ Ã;$1‘‚nƒD[‰ïI‰tÿÀû*‹ŒøUĦ0" ŸN)ºÏ“O>i¿ÒÛÛ‹EÏ,´wMK_²ÓâšÛn» ííí8éä“…‘c¹&K<&‰n¦(9–IHœßmz$€Mì¥,aKÿ˜s»€W¸‚U%æ)ê§Â¤B¦ Ø ó¸hQt>1ˆe\Ün»ÝÌãIÌA +K®LRùÅ(8/‰ ”߸K¬ ˆ”H¸LŒ`yd]`ÊpzRVÔ{*Ý£+³ŒäÈyz–Ê®Iô’ª°ŸZþ–¡9Ué÷F t¸ü°Ø–)o)SØ+o¥÷O˜Ù¡ûÿjêpØ{?€|m3vv˜o¬¥øìxoQ£Ð[BwoÝ=Etâ=E("ÔæÕe±os59 £»ë¶váoëw£}[º{zÑ]èEwwzzzQ,iäsYä”ÂÐ!1rø¾7z8j««ÑÜÔ€úºìîìÂúÕ«ÑÛ[B˰Ò˜vAé^%½Ï2¾Y’+™Â»™Àʼn3Q:±1!µfxxÊ}N ¦uà‡qû´Ë­äîC8*{Å¡]’__ÌüVWW'¾våWâ©§ž*I~ØÞÞŽË/»7ι×]wö:„ðn³¯± ?šÜ DŧÀXRêV&eÇ@…æuzÀ'Ö»*J¹w˜ ¼aÂÄ®Ø}š˜Ç+¯ÄS 1}Áµ··ãòËù<óMÛ•y!}'Iyrĺ#_OPZ0­˜UŒ…wÌ!Y¡>Î_ê2 \Z´©b´Ù•©M„PúÒ 4CZI1”Wc}ŠZ)(w{“QÒ‰û>/žç>û´¤BOuuu¿”ðªp¦Êüôoin+Ýú¿ü•c/}„÷vvðúÆ&ÖOœ@­`0 Óé¢ÓíâáÇøJÇŸ~Xx„Ê84PiLg&PŽãʃwó&Ñ~¥AdЩ”cª“¦pUSd‹Öˆ“uiЉ¿– ÌI< Û1P(r¯Ž–+õ&ƒõi¬Ívƒƒ5¡fQüˆëKe9~3”\éY".u¸ÒôcK¥’5Tz7ØJei¹RÁ ËîÝl6WK[s§,†æ%@y‡ :E'¨ÕjØÚÚ²ôãÇ£ß=ÀŸÿø%þòõ]Œ‡‡'„Ó ¢pŠ(ŠGÒdVüRT µ*¡`ˆ›ƒÞ—Åpã^Æá+…¡ç†ÿ­s?Á;ï_U<øëcœX_Ã÷·6Ñ;bïiƒÑ[›ëèó¸u¯\Ň_.i`ïU…ŠïpnXlìr¤¯g©ôùƘIHqKv%C} 4­™ÒÍNd s¹bµÐaÁAEh°HñçIn(ÝÝE »ÌÜl‘ƒ±Dß¹s×ûÆ“ñÂdFšcÇŽáêÕϱ»ûk4›Í%ã ¸¿uåÂØìqÎv¥MÆ–Í#×°XºËPx–/.d«ƒÉw¦·Ðdór…µC†žËqçÎm\ÿ⺠Q>Ú8^Åîî.šÍ¦Áħô„n( 3U‚¸Â’{¾¤6%Ã%OúX8v²îZY<ľAÇüÑ ²d*—:´?Êò=}ž–¥QK&:­„’4Ëd¨ %H( eh ® ¦EMæ`c‚S<Ó@Ï’¿çoÑl¾¶šAÏŠ_¨%Zã(npU,„õõu+ýëÚÚ’$A†ö0›Í0›Eˆg3Ìf1¢pŠÑ A÷ýÎSv;ô{õ:ô0"#@%¨ ) }µJÙ¿•,†NÌ6êÆ¾2?!sÚXšƒí6O¾÷>ú­Í“H“½ÃaÆd·ßÃA·­ÍÆ{ÿÀŸ¾º­·Ïã“σ­Sx©åÙ ñ++?Æ7pïÞ=¬Â°®\¹‚k×®accÃwà«<ŽÏ|ý½" Úë-öŠ},Rnˆxµ&eFë­Ì@27MSÄqì<1W«UWOÓI’?yÚ[þ{’$ˆãxÄJªIDATÂñátŒñàƒîþAç£Aã~ád€4Ž@‚@¡(Ô«@5ÈÜ÷Õù©ž´“;¡¤‚­PÖ¾³ï¾wv.¢Öh€@˜N§èõû˜MxòèïøúÞ}œþñ¸øégxó­³…ðq‹¼nëÖÎRÈ=tv NµPd0SuœVŒèº+¬=¤Ž¶æôIGn<ØÀ6‹ ,:@Eʯð ƒn¿¿y {ô{{{ØßßG¥RA»ÝF»ÝÆöö6Úí6Μ9ƒõV .þ0BÒÞOéÀe‡KAc¶Ë= Eõ&èŒd–Ùc‹7ˆ°ŒƒåІî1=Ú5ýMd Õò&Ù‘è–{9‡ÖÂ:nݼ…G®qlo£½ck½ee’†4„^Uï¹Ö¸§U´„F,l’/-¯¬­¤ æÊe‹ÛHå[K\ j+"i.zºÑº[è(í†r>Ùß8“ÁðfÓ5bN*7§yW,ZÙªµu6=§j{‡V2è£ÑHÆsÀÉ8x<†7ºT¨,Â%â§yœŠ*$ÈŠÒ¬*…B–»®”BšH£Ç1Ò4A’¤H“Éܰ«4E<¿&󤘅LGLÆ#Œ{tŸbÔ9ÀxØG8`ŽGS•õ ÊS}@*Y ŸÇÝkµ*Úg„S§€Zãzû{øç“'øæ_{ØïŽqþçãâ'ŸacëTI|a ZsÛÎbçbý–ñ6^v¯(U*ÈNˆ•+5´^÷Qì™ñ‰²£mÉ,d ¦^A QÎVe!ˆá.M¹PØÿq2 ÅË_ò…@eìJq2/S07Í'iŒ¯’è§Ì­WÆæ!G÷ÊpIÂm¹•4¸(bDÚžB±÷ãyº20ȉ*òþR°Ð˜*V5¾b®\aíQ’‘qBUÎ"N ÍnP¹–yáIX3Dœ”¹…Ë•ÆJ’m³ÈÊ’š#¤Wʶ r•e\ ì‰_ŽÐŽŒyå-öñ[²l¿$ç3_Ф›û‡7D¹ë6šT‚vHcÑ^¥L±Ø4É’%1¾¹dQa½{†Ç¤p% †H.‘ະm I *%0«¬ÀNb¤éO¥)k¹7#Q":WT²° L…/0GïQò•÷9cŽ8)NÙO+ôéd‚ÄR½ë…zUØI]?±óÓ:ÿÛõ“?MS$qŒéhˆp<ÀdxˆQÿÃîFý.¢É³0D2‹Ä!Ò4Ò„œ½kî–¯Tæ„7„Zs '·ßÆÏ€wv Ç×ZÞäÅ‹/^ž›T‚¯Y@q¶<ô¨V«×“étiœB=±#†@1“V°ÝáZÖ±7ójiJ)•Õj0Ï9ÏŒt’ÎÝï¹áN“¬äiÂNúi‚TŠmPÒ’E)ÍNöñ,B4™ œŒ0›fÆ=Žgˆg3¤q„YA¥ ˆµF­¯cëÓøÞ›Û8¾¶^T’S ámT84hû$:ÙJ‚b å¡a¡ÀÀ"p`›¬4Å@9»ndYe€À'È:ØCc¡§DE±u ³Ö¦ü eí;ZåvK.ú[/Ö(ØÌ4tqI¹«cu°šØÄáGJCóÈatlÙÅ 5¯´¹d-néþ>öÅ H–¥ p¬WÉÒp¨×g°ù”8åªkŽü6éèLHoM™* Ž£a%g7K #äÚ±¶vPá‰j<Á&Õö·+K×JÎâìë² Š¡÷÷”@³LË{Jå5o¯…óyÁL²A†hºÎV—\v£yÇzVäÌ(ƒiô(Š.×ëõ/%}ãb£.~Ñ™Ç,,Fæõpäçñ˼£3ÄxP 2# hc~ÏOãü3N9›_³8\+k¥•n©lŸ‘Õ\¯Öj‚`žòV)\k¢,¹³‚R”½¼*ÆÙMÆ5:Û”5y)û—2ÇÏÈM¶%[©ÉV˜/º*-‰ÚÆ&¦vª«MÊì§U²¼ÕÑþ6î-èzuŽ8e%ú²æ‚;’å­lkʱ.]F® ضy§Ì¹·àæ‹ßç׺ÆN9Óž•åi®áQK>3g¹ZÎPèb~sN µ€»ÌþJ-™¡ Híyä '­ ¶>_-ŸgJìB}cí—]Pʺö•“Ó=^J©%3 bc%•öQfÒ¢…·”®NëF%ìQˆ¢è²a»l¼ÿ¾PÔ~…èe׸®_åe­t²~¶jýt/Ï}FÀC_½xy•–˳|‰çÝ!Ïîþ­VÖÝÙÙ¡¥'th4ét¶Z- ‡Ã•Nê/ZrCúb êóloˆžÑŒðÓ‹—oërù¿¿=ç%ü¿ßˆˆ°¶¶–±«6›#=åÁƒõ0 ü¨JE›ÒwaóæÕ®—ïúYäÛ<Ç_DÛ½ðò2ÏŒJ¥‚z½Žjµ "B£Ñhœ;w.ú¯¶ wïÞýE½^ÿ€º`/^¼xñâå…KEÑå .Üô]áÅ‹/^¼xñâÅ‹/^¼xñâÅ‹/^¼xñâÅ‹/^¼,—ÿu c†àÒñIEND®B`‚stem-1.7.1/docs/_static/buttons/download.png0000664000175000017500000006612013157571677021633 0ustar atagaratagar00000000000000‰PNG  IHDRôPï,‡ÆsRGB®ÎébKGDàààØNx pHYs  šœtIMEÝ;v-öÔ IDATxÚì½y˜]U•6þîskNUežG’  ó ƒ2E†0­¨ (‚bÛÝ~­ð‰jÿl„§éÆÏ¡AAAeH‚Â,C fˆ‰@È@RIe®¤Æ{ïÙë÷Ç9{ïµöÙçVEÅv¨ã©ºuîö^{­µ×z×»€þ£ÿè?úþ£ÿè?úþ£ÿè?úþ£ÿè?úþ£ÿè?úþ£ÿè?úþ£ÿè?úþ£ÿè?@õvÂóÏ?fMMÍ"5ýÃÕôýGÿÑôö£X,Ï;î¸ã–üA}ÕªU5====D„1cÆ€ˆ ”êÓ©/žÂŸà;Îëýyžê/ó©ÿª†óBÔÿ’ÿk#ð74VýÓþ×3U©ímiiR µµµµ‡zh±Ï}ÕªU5ÝÝÝ=Ä€úGôoXuõ¯ëþ£ÿè?ú]¸¿Ž£££mmm¨«« õªÐ—zzzþlÆüÚô›DÐå2(.CQú9ˆP JE ¨¨UUEÇbªúæÑõ¯Ïþwè?ú¿YVµïklòÞ½{{BwÏ|æÌ3fÌ_îû¡¸­¥­›QlÙ„ÒÖ”Z·"Þ»q{¨Ô  ª«Qh€hà@Ô …êÑcQ3f,ªGŽEõˆ‘PÕÕý:·ÿè€þÁþ«‡¿õ‘ê—„ìÑÒÒ‚b±x–ŸSÏŒÓÊ•+{ÆŒó€Ó=Ý(nÚˆî5«Ð¹êUt­]ƒò–-ˆ;ö¡P]ƒ¨®…º:¨êj¨ªj(¥@q ]*A{ »»wuBÕ7 zÄ(ÔNžŠúCg¢~Úa¨0…þÔBÿÑüõjØ~­ß?,F½8{öìZþY(ä^³?¸wW å];Ðñú+èXþ:^{ñŽíˆªªP3x›‰úqQ;j jAUó êÕÖQ*¡»»PnoGiÏnôloEwË&t½³=ÿ³íÏ?ƒBÓ@Ô:G†³Q3f  ú—Àß»zêW„ÕÿL-B£þþ–î߇&$•gÁú_‚1/moEÇÊeØûÔ£è\ý:T¹„ú£ÑxòûÑxð!h˜xªB¡®QU!|‘†ƒŒoäÛ‹E”;Úѳµoý{W¿ŽŽ—_DûŠP7å 4x*šŽ/ªGŽþ›Ì·¿+ëêÝZ¬™ëª?Ûc÷ëž~¿ñoÂÑé÷,þ6‡3ÇF‡Bî4zÌèD¨'  )ˆs•È~˜œ«Èü–|n~¦äjöëJqwí+žCÛc¿AÇK+Pˆc4|(Î>MÓEmšûVéÕ’ïQŸ)¥ß ôÿ @¹­ ëע핕h{izÚö ~æáxÚYh:á4“gL^LŒ„ýýSòV¾N 9É(&C˜þQe¿¡‘ü3串GHŸÑÍ”ýnzÏät’Ón&¦O«‘ØòyUzÊ÷n”>z:÷é¸q¹âSIPòÚ¯Î%Ò§ìcg…Ý›)o,Ì•Åë¦ß²¼9Ÿ'óqõ"¹ušS÷½Ì!ïÖfÜ(³Nýµ'€­HoÅ»§gۜ˟#O„¤°²¤Üò‘‘;ÊNqú‚B:Ù ä½xP\Òõ)dXÉõ”÷°.Ëëü9réÍ¿wM  Ÿ„¬½ÌÖ‚ù\y:I\/0‘rb’Ó!EØè!€Ë{X(ºÌv°Û  Ž_úøM‚³<ʦŒZÌ(³|™¼eŒpªï¦„?²O–‘-hiقٳg«^wè¤)+‘ŠÆÔ ’:#0DÄNÕPPÐl‘[Éä8µZjiÁ®_߇¶‡‚:;0ðЙrÌ xÄQ¨j༭¡Ø$ÿ1Î_uS6 MÓÃcOÂîÏc×óO£uõ*t­ùy>ê¦MH[IUf<´ÓD@449#£…!dJÒw×Î!!’ÊM‘NÇË­mk‚AiØ¿Û HŸG SÙÌeRÒùÙ½gò2’®Á?™¢1$v8dGíX2Ó˜<6)(¥ùlµ¥ãÂlbâ (²JÈi¸dŠäû!c`Éi&Ìd­‘b¿Ú¹"O»0â _:?EÉZ?š;cƒ!÷îìy(Õd*}JeI‡ƒ9~Š­ReE©Ú"¦RÙ+K'Ÿ]['N ‘«$Idò\‰3ÌZb <•H1;•L–y~•ºïœ ¨}ètžÒ7OeÐ*G«ÈÓh 7FžÒ#6‰ÄdS˜€TÇ‘1̈9a!P±iPV—šµ«óìÙÚÙO@±óÝ{0W’ÉŸq6µ}Fßä:Å­IJj'è”n0t:Ÿf1QÈwSF¦ÈZpEf :ý~2Ä:•)Ø …4jnq“qô™L”{ã ët­¥ã¡2“Ÿ<  ={KvpˆoF‰3ëÞêp˜l˘òž%ã¸äFʬcû V-JóOÎ0Øy%RNÍëüMlØ ƒØÄ’óH”N5+hƘ“ðÖÈ.<¦Ê퀊c´¯XŠ= ïEÇÊe0a"Ÿ}†{"ª ‚R cj`‚&”e|~7.Â0r'89;R “&£~ìx4M;;Ÿ{ {}Ýk^à¹Bã{߇ªºúT©˜’N„±UL`´1Š(U–©ð²‡²J‡˜‚I¿—(&®P̺Nnz[éØ;…f´ƒÙY›S«Ø˜PFé˜?˜ k’óÍ–»õK57”n'n.LÌß&"ë9ÓOäyôæZŠœ‘IeHñòªà´¹b ŠOíœ'ed’íâˆ;L$6RΰHï_,Xåæ˜È%¯À“ô„D@*{+:qUú씾9Û†’QÎÚ(,3:l\RJFÝ3\f\œÖ0¹ªô–n¼•qŒŒ“zbrH|管ÍÎ-RL‘zãlî h­Sƒ•:¢Ê9ÇÎÎ’U|~ZâDir;cbF•”/+F`ÎsH“ŸX¼‘øÒªq@“ÝÝ'ã Ù8p'9;mæ“SÅÑTïš‘PvdמNåC‰°ó(³W¶ÊË–úšy>ñ5odlÌÒ똇NCXÇì|æ\›  VÐÂé7z&‰liMéž…ìÆH±í‚Sá¤)ipÉ3Ð$£Å•®¹tÆÉºMöû|#ò'’å•ê&%ŸÇ8^Ú}m5a:'éz0kHDHØfT0Þ‘kÐù.¼Ò®‹8û ľ«„÷›¾”twö>ñ0vÝ7âm[1ô˜ã1ìÔÓ1`ˆªª¡@ •ê2gn†[ˆ‰ URÝTF¥1Û@Ù@0@D h>dêÆŒCÃ¤ÉØùìSØ~ûQÚ¹ƒÎ:Uƒ;¥aD’Ü ’w¡t¬Ì*npÈn@2H0³b·Ð©É•›¾Ã5ŠœïÂÅóù'y¡&¦ð J(ð€à8ŽøB¢lðší¬xèÒŒƒ?¾¤ÝŽ‘mÝÙND§zº»Ël•ðúÅŽ¾b²¬Ó–N’Ù (çô˜¥©˜±Jæ)UšlyRº‹p™Ü΋yøNq_¤fv¹bñ¥÷×n[®‰rsÆÖá#/}Ä"=r›(Í"!±2@ÆQ 8ãB¿Êè!ÍÓÜKžyaW×kÆ–ßCî´™òò"ÐÒé»u¦çŒcI©,r'ÜD ˆïëI:¼Fç:cÆäÞs”ñw¢Ì{ båJyº]A_þΊEo¹Ö™ø¨Ñ4cíÏ«& '&ÍT0Ôp‘&I$±I0—Eùˆ¬(¸ªÔÅÒ)s› m7pkAøQNçJ šrzB3K¯™cÄ} v5E2Ü.–¶Ý|eÓܽïÐC¹O62+6°xsΰwv`ÏÂ_aÏÂ_¢`Ä9ó0ôØ“PÕÔŒHÊ„ÖsŒ¹ùEP"@ hDõÐaPuõÉ:ÛQÚ¹º« Õ ˆñIÊ} BMS3†Ÿ|:j‡Â¶'–`Ï}w#nkË.FÕaáëåC_ ÿoäï˜>ùˆ€°%Ê aôyÒü‡!Êü×§Œ¼ä —Ô=„^/O¡G”Ú0(åÌA@ÙPî˜x;"’¡jÿ|ò"úyoz ýÜëÊ›æÊå¬Uê»#o¼z_•Þ°”Z/ñ_˜|Y¥^.Ÿ<ÊÓ}yOA9së=õº~³k™( 愬õFλQ/CPa)P®>Û"õÁÖPxp3áîÌš¦üÕ•¹ª7„°ë«,P®²Ê™ã<9Íl°óG¹ê ¥§;;°ëîŸ`÷‚_¢nøpŒ8}Ï>Q¡¥cgÈÉtå :÷ºˆP65ã'¡¦©ÙÅáizššQܰñ¾½(( чfÞü‡†êæØþÔ#Øý›û¡HcÈÅ—¡ÐÔܵì?úþ£ÿè?þbŽªÜÝOí'.ños4,‰À‘‰Ä€/6ÍÚÝ= ~…] ~‰cÇbäé@ó¡3¡ˆ âXä¾AOÿ1‹¬L˜=ªBíðQ¨æÆ<½@ÍaÐ(¶í¡Ê‡ûSØ-åCÝè1yÖy@aç¢_”¸…æ6ÏE^èÒ„mݵ*"ï-!ïˆ,`<Ô6ÆáqÏ£1ý>¨€åæ]ø_YЊ $’èÜl^ÀžoO& ÆÃÝ).ø®jBâ”â@l @x_Y­<üMžÞU™õ(eY˜G¡}(ÖÙ 8ð1*TìoÈÝæU@Ëõ•ÈÙ|…E@»\0,Ä•cì}üa´-ú%ê‡ Ãˆ÷…¦ƒ§Ciˆ…×£tÙFìŒAaw"š¢fÈ`mžR 5C†¢\SÕÕi¿Ož¡4X÷¬¼…€šæñ¾³Aå2v?´…†8÷C–aÎ1…'óÆ2eòMI®Aä L ‡+ ²Ð¹HL6¸ó›oUüs¸ÅN¤m^I[e©ƒ¹$¤`ØrÈ™ô›Š‡¹É½»u šÝ¦Ë,º™”_¹ü4 `‰ïð÷çH]‘Z0 Ò²LÒ÷S•ºT|#’ämÊCÆ;P5`&­–æ•HW8àO)‹®H€U4æBû¡Äˆ´U„"‡JîÚVžØ@h/Qª©îäg°Ú¡Þy¢“@bí+4¿O ;È7)&ÄÀ:RÈ€²ÉU£‚ÈbIH„\¥óiç]óðªÙt¤XÍò•̱ÏÃrëÄ äDÌ(³ü±¨Ý"ÅæÂ@i†má2o@qÖL @›JQ’šUUp •qJšßA”YÍ”‚ÖLúQ1÷NKoq6€JÒKbFÕ­k L!}iuØrÃ%êd½(‹7òÃÌärì)¸ŒÒÊ µ 7e?ÍÇÃ9Ÿ¶rÁ=¥š)Å«7¨Þ¦b#¢ÀÖ}Ÿƒ‘ hSE¯k°´©þ V´Ý—ºˆû»›Cg‡;T oËÁ5бòy´-¸†Ÿü~44J•­ÑŽ”3æ~¸]yùsƒÞV…ü쪩I¾Lj”†chæ(5 Qz]Ív® 4¯~ꈻº°wɃ( ¦÷ÏIhˆ•¤…§%hG3$¤ØÕK·Vüa’–<#èB5iY;OD¹òîƒe|d,«Þâ‚Å”_fß`43ɼ3{ ȬÍ5E¾^I„,’[UÈ©:à‡¸>ZTÒLˆ´ Ï‘ åbÙBNßAV<Çy¥Ž_ïÊP­µïÆI\Á: Ú––9„u^N–¤ã®+¡BF&ˆÈ=uV•¸¦Û¤“`cD´'WQìí¼yÙ‰}9lî êkágœW¯Ä÷ [jE8f'Åó~ð“œ~’Å,]' G²ô£&õÁrM‚¸l|¶@Ãðg'Iïj}e–[dÐ:”äÃ[X>˜SÍ!Ëä©lÈ]yÜ ÀÆwÞÁc?ŽÇ{ Ë–-ÃÒ¥K1|øp!C'bCžJåedPLæ…«OÁ,ÂYŒ^Ôfü§;1ŽR!0£*V\g(Ép. r²wï^<ùÄ“øÍâ‡ðôo‹_ýòW˜1k¦Ø^q€ªâ$A~:"v,hk-1”À¿d@sð¨<]>>g© Œ¢Ì0‹©,÷Æ-h… "áávÅrÈ>ɉ‹’‘Šˆ¦¥NukÃ>+›;+óŒT̉Ähf]„üûœÐÜ“­o‰ T  KÏ2 7䑎Kô¢ø+eX6ØÚQZ­ p’S)’µÑ“1A“ã¯O^ê£A7T­ÍËâÓ*¡8uŠÂ›”V)8ÈI\iÇvì{r Ðщæ£O@݈Q@\NjÊ…Ó£4Ä¥Æ3fÎÄÌ3pØŒ0`€eEÏã0Ä· eUâä ,öæHVü‚K[K`ð#Ø,òß•ÑÒzŒyðeòjÛ¶oÇóÏ/ÅҥɿM›6eãˆlgÓàz(Øl“ÊD£œ‘aD+psjÇ…Û\îȳZ~e …]NÔà:,Zš“"ŒÔˆÀp]´DÌ9¤®ÅˆYtãõU«ðÛßþO?ý4^~ùeÄq쥆´§!]k'©,L Ì™rçššÀ™:ë h•qØxi?ϯ8ˆXKTb5‚—ƒuÐŒ­}ªÍ-»µ¡•Q!¥ æ›.p AÊ8˜©. Êimñ.)¸Õ ²°LˆÜw#ÉZÈpÚ0ùqž ˜£ ¶ÌtÊÊ®fyhG CŽÕ¡û-3×Ä(}Év™F‚ü…4A>+cÖ®:€#w¸Œ“FŽíÎ0É)b8 Vg´(wnXœb¼+Ç7ÍÑCX%)6;_Z†®WV¢qÒd œ>#1Ôq,óæŠàR£žü¬˜ Íþ1´$õ²C'³CcXT'åÖéÒÒ‰¢‰XBÅ(u• £h vÈ04|(¶ýö1t<ó ~…Ú‹µË;¡Î}ÂA„×_{›·´àùç–â¿nþ¯¬ÒOaÆaìØ±hooÇ;#b±ˆîîntwwcûöíxóÍ7ñë_ÿPSSƒÓÞ÷>\0o.N>ùTUW¤|ªÒ Y‰rLÖðŸÄ€c|ÚBb9”`¡ã‹\Ò?&ÃçP0Næ<•a*0T8oH)êÎ8›Š²(Í•2ñÊ  çÖ”ËÁQŽrÖ6£º»»ñ±} X½z5zzz‚rkоð_䱎k>ddåÜï”åI&ŸG&é :™_bLx™'s¸Úï¹BLI³K3 š72å `ñÃãæï}o¯]‹R©TŽš9 DXV“e×#RÞ Î0ʹ©MåÑš^ß­2b~þ™¤S!*ˆD©¯"ÝNìø+†’渹>¶ˆ\’³øØg[3bs\ÕͯsÒ÷~¶EøDËh…°+1qýüï ¡¨Œ×€…é°ôÉg 46æÉ4å" BŒB8;ž²*BeqϬGl£Ãuˆ,§0j¢wƒNTˆ*²©ûx×Nt>ó¢b M"Cí`¥h©17lnæ3¨Hr¶;Oü…¾…Ü)Íg+6Üž–°¤¿+r!v•zDS8*åÚm:x:ö½¹+–¢á„SM8 Ï@0&Ìm=^t!ÆOøÃ™w{ï{ß‹ÿøÇˆÒv¯ZklÙ²ëׯÇúõë±aì^½K—.‹E<¼x1^¼C‡Å¾ðÌŸ?ß~? ÑHQîÏaЈ ‚ÌAWæBcˆú€¡0XFìÎØæ ߨ—ÿV@eÇŽ²†’ÔÖÖbñâÅ6œü­o} ÷ßpUbb …bA*Êg³# aø¼±ìxD>âHÉq ±”}öÙ8ûì³ÑÕÕ…;î¸7Þxc zAAZèÂK½£’(‰EaðS8õ¯1ryórõ, ÛŠ2é-Rœö_/ÄIùë„P‘÷PyˆÃ—U á³)‡i¯ÂP…ht¥Í`¯8'°î*ƒîÂrC½0löÍ ‹®_á¶– D¤Ôd»TèúÝ«èyãw0n<'OIª ±Í¶òìud î,±yTqI ’z5èŠÙ],t÷BìŸÖ鮜íÈÓ´b»KE@¡¶SÄö¥O£ë¥å¨7¤"Ûò-²==-éÈ ÜA°ù}ÔQhhhÈ„àçÌ™¹Ü(R3v ÆŒƒã?Þæ³7nØ€{îùî¼ëN{;wâÚk¯ÅÏþsüÇü¦Nši°jç'‰È_ô_°¥ ÇùÁãL#BAøzŽ<±g$áFySãµíÌÿ‚Ê#A’¢Á’9½©© ýèÇ‚<‚ ‡Å`»![Òjzݽü&ÂR¹í3¬>™³CùïÌ€PVÚ3rŸþ\__‡ùóçg : ù„NʶvVyrìµFÍÈ`^«XÈ:ô ÁO%©‚+^èØÌ0úí9UxüT #ÇɯdaÄ-y‡œZ)%º“ee ùR Êj3G¾Fdðá7?”ŠÔË¥‡ZÍä¬O­]UÎ<{Ä1J8±ìwåÍšßo6Ô{¸B«ãÐåº%„°Œ@HÓs׬©,ö {å2¨ž4Lš‚¨PU.A•K@¹Œ(ýY•ËPq Q¹Œ¨\¶hwÄ1 ÍcÀ|Ç@9ý½\Nvß½ÅÜÍ÷b~rrÞG—“ܾNîoŸ'ýg~F)y^'ÏÚ8q2j F×Êå(ïÚ™õ©;9(èÊO‡ ’y½!C†ˆQà6D?a¾ø¥/bñâÅ8餓ÄßW­Z…K.¹ï¼óŽpè ½ðmw@½´¢pn)o—Þ2øœ](Ýç^6»ËüúÀIÎ7”_ž2lØÐ^ö<ã)o (wCA\Ú¨’CØ©êï²ìØÔ‡=OhF4hP¾£N!æ*—¦…w•™™ ¾Q…¿vÓÁr¥ðî-<ŒÜ9f®BJ ‹7¡^æ†:JY‰*ËZE)F‚)ggK4Z8$FÞ~*Fa¨2'»/ =¬1«w}’˜ éͰ,åÕßå o/Ý»‘%—ÊØË˜Û•ZÞAϪÿAuó@ÔKS"&~f%kÆèjñôg³Ã6Æ]Ç@¬“wŸBîd ¹¶%höqz4×®4/]+‹ç‹â*u(T\FUCÆM@iãZô¼ýf ŠmŽ'ˆl²½«ø"eÐÜ<°¢bË(¸€S6vìXÜvûm˜;w®¸Ê¶mÛÔp+J IDATp饗bÛ¶í|r=åʬL‘1œ@¥ô#y‰ek@}æ×=³ŽUÎááŸQ6 I WxÞ‹äZ*~Æ:åÏ+ñŽ…ìòUiEB%grA0Œ$oÊå¿…C,X¤5zÖ¬‚R„Ú#“ô@\f¼ìI?SWwnê£#”µE #¨H¥]Ò"–`g^»Ù¥÷vÄ©¡†Î¢¹ÒŠÍ"Ô‘&DH‰g Ž .g›ª›¡ºi Jo®Ayßš…C’žçœÇÊD9€ŠŠ‘ï>@'ø¥¦¦ßûÞ÷pá…bÛ¶möœ7ÞxW]uî¼óÎ !™­ ÅÁ*ò¢õ-€êC™¨¾ÄÐ{éÅJG«òu¨p¨~þ.:“Cï==Pùé¨ÏRb6ë½;0I°Wéï *žúØ…UŽM% eåËm‘J>¡ÊDMúWê¿0ÿÁóX%óƒÄ½Ç¹)Pòê¤N -]¢Þ¥0—Q’ú0n•íÿÐ:”éª(´>¥PzÒQ&b…œŽŸÔ'‰Úƒät Ã8Gwú‡xÇv”×½‰ªúzÔ4Ê%(fÀ ’²€-èPT EUêk`COµ‘Bm!BM¹,àaÂ罂âÒ9EBñz´FO¬Q$@ÕÖ‚¨ UêF jA¨2À þ_-ù‚£ªjEû¦wPÞÞŠ¨i`ÓÏ̃ ¢¡Z'× T}î6bÄÜtÓM¸øâ‹ÅçË–-Ê+pä‘G à‘’M­2M“(‹à `ÉCQÄ¡@Jà³`œ\^ø¦zñ>òž¹Òhs‚Ù5ã_N¬=€š ‚†ò nY®hÇû¦l™ÆˆVàJ‡•ÁÀ7Ó/£ï8@VÜÃÞ)6¿YdžÔ^×>£ƒG€% }j¿ ºöZºÖ{¢;•~V“ªÒšëRk Ê­­h2QMMšû¶o‘(­,qL:•‚;5SBaØ€€òŽV×­EqG+"ÔY£®Üλ¯Lqq,¹¿‰ÐktA‡ÚISP:T.#nÝ‚ž7× ¼£ Tñ‚~2Æ=­OO¯4jã:”[6¡fòA.¤Ä:f)Ñ030òДv¬u2R½9³Î9qmO³‘‡¦MùÒzÎ#fÏÆŒÃÃk¯¿..{ûí·áÈÙ³¡É«²%ÙJ¶5´”ðJ­ªKCf¶*Gpû ~ž±3cFi“m‰"”èüljLDÇQ ËœfI´‘ å@Ö–‘·!ưg>çm!FlaHf\4×ìdž݌±Ïá…vòãµY%Ù%ÐŽk;iÉU80]sò ׋2¶CÁõ¦ò:¾Ù†`Û• Eë” ûмÝ-y9|ƒ×®¥°…•ã.J——úÙv¬Ê’9ÙuÂÐÍä¿/cŒsaa¿n(Ч™qùTÅÑ0_•3 i(¦÷Ñ”cGpAþÎZèÓü…;^<)£²úB³jOç'ë™±ÿÙ.e I$ŒN‰Ý(¯=0„=šœì$¬‰Ú+ž +«ŠAS<¢Nþ°Ü¶s® C¢“ʲRŒØPZAs>:[ÅEéZH×*SŸO0€à9!.JB–KÙ:t¥\WGÇÄ—-sVûrBˆ\ #ýü6‹iÞ ¼µº³ÕH^#.ÛAKÂí.ÌèÔ@|À4ô>ÔŸt0@“§¢{ô8´/{-ï…ê ‘›H–ëmnBîé¢Óºâ1¡0õ`4yjFŽrÔš“DçˆÑØ÷Ô#PÛ·b@A)fÀ Kb¡ª¡P ¥w6„k‡)RÏ#… p<¾×ð#‘?ù‘üù‚ /ÌôÇ6nÄ„ *†ÞˆqcÅŠX½z5Ö¬Yƒ5kÖ`cúÝiÓ¦aÚ´i˜>}:Ž>úhDQäq8ùùá$áÇW\šš€€[üã>1éÍ›7ãÆÎÍÊ•/á¹çžËœ;iÒ$œ{î¹"Q*•ð /`É’%xòÉ'ñØc¡¾¾>Y¶±ÆsÏ=‡^xË–-Ãúõë1mÚ4Ìš5 W^y%ššš²ïÛ—¼…ç*ŒŒãò~¿³`$Ô-èžž,\¸K—.ÅæÍ›±yóftwwc„ ˜8q":è \zé¥hll¬˜¢¡ÀÏÅb¯¾ú*V®\‰•+Wâ•W^ÁàÁƒqØa‡áÄOÄùçŸ L‘hÉðIÃM›ÞÁ—¾t5^zé%qï_|/¾ø"üq|ïæ›1õÀ3Pyv93k¦ìd:§uëÖãê«¿$ÆÿÌ3ÏDkkkÎøÿ;&Œ›ÀzÆËH†y®8Žñ£ýwÞy'vïÞÃ; 'tŽ:ê(ìØ±O<ñ~øa,Y²÷Ýw¾ýíoãØcÏ– Â:µ·uË|ö³WaõêÕ¨®®Æ¬Y³pñÅ#Žc¼öÚk¸æškð‹_܃ë®ûfo 5ÆóËñŸ¿ãɘ¿ïu]á‚Q—Õ¿g2ó3ÔvuÉ&zLedÀ—&9æ>ÎEÐåš¿‘ãz „ ÂÕÛœÓ £<ÄG(<–$Ã<ªºŒBó${Ö ã®²c!¹"Ó¡$+½òþžW„¡¼÷îM7“l,ØåTž ì_AÏ#·Ün¸¼½ªP…¨¦(—IŒ¥lUv²cMPƒ†¢fì¸ÜE[?a”Rèбî-¨¸€ºBTîkÈ=É¡Eè*kthêÃf¡ñø“Q=hpNÚT¡fÒt4 @¼kª#å•pPPŠ)ÔÖ¡¼ktg'¢ú†¬‡K}„†P€I|‡tÇû:IþÛØØˆ“O><òˆ8ëå—_Îa°K~þÅ/~ï|ç;èêêÂÑG›o¾ÍÍÍâ¿ûÝïpå•WbûöíX¹r%æž>®¾újÌŸ??sÙO}ò“8ôCpÙe—‰k 6 ?øþ÷Q]]-äñ’K.Á\€o}ë[X´hQfWþ­o}+耉'âÚ/S§LÁu×] AþŸqÆX»v-.¾øbttt;{^xáüã?þ#öíÛ‡††Lœ8ëÖ­Cww·=oýúõ¸ò3ŸÁâÅ‹QUU• ž¡\7B.’Œ€{þ ñŸËÆ?´{MvüW_}5~ó›ß¾ð…/àòË/×=÷Üsqàâæ›oFKK .¿ür<úè£9rd¯Œv¯¼ò >÷¹ÏaÇŽ8ì°ÃpË-·dêÍ—.]Šk¯½\0¯×(bv×Ü[?ÍPòK@¯]eA½²øõÊFÈßµæ,C C±n¤ Ÿùíƒó?«Ðr¸O w·¤íka{æÈJ¤¼¨·Ö»9ïÙZ ê#@—rx$úªÚ£J!\QââCø‰2¥>öwMˆÛö$½P•¿¤$0æŸ2?Çe踌B]-¢êê|H’R¨7N8jÂhï)¡«Xtµå}ÅQ9Fg±„}å2 ŠÆãÞ‹êAƒÐ.pÏBm-¢êšt‡_†*3Ò›ô3ó7¡P[ êîuuy¥]9cå…ËEùUà¼ü–š~Y/õ ¯nZ–ܘÿN4¡uvlÞ¼Y†õÙõ¿ñoàºë®CWWN=õTÜrË-6¼ÌË+¦2?¾íÇ80 vvvâë_ÿ:¾ýíoßïØcMvz쨫«CUU•(-1ç7€k®¹ â;S§NÏA¢fÚÉs1JLœ8 ïÿûžñãñ̳ÏâñÇǹ瞛—|—_~9ÞsÄ{p÷ÝwcÙòå¸ï¾ûñâŠqÕUW‰s7mÚ„ °{ʵ…œyÍÖÛò9ÿ­hjnÊ”SMŸ~~üãÊãÏËĈ7Þx£5æQácû˜œ§ô¼O^v™½n©TÂm·ß&Ê&EMrú݇/Æ%—\‚;vàˆ#ŽÀí·ßŽAƒŠçÇw&ðjËy)]xìÀ®— –ÛÍ»¸.²r¶²FZÔ³–? ¶µ³3馔et3ÿU¬Ü0°•víDÜÑQgE¨;'œŒ›€öb=¥RÛ§Æè,±¯TBÕÓÑtü{Q=xh®17µ¼· å¶Ýi½|òÌÄã¨P91òªP{ {ŠI~ULN”)M¬ÞY{¤œ|!Ïaa5—öÚ¡ZË”ÏÞÖÂkW[=løðÌ•÷ìكήN¯&ðâ‹+pÏ=÷ØÐö5W_cÉQxý*¥ø‚)S¦âÖ[na;làÎ;ïÄK/¿(I#|êSŸÊÅmÛ·[áÖÞÂ8h .ºè"ñeË—³úSK¯íØ ­;~þ…þð‡l[ɪB…BÇÇg>û™Ì¸|ãßÀç?ÿyüà?À¬™³©T¥ >{ÕU8ýôÓÅù?ÿùÏ=…iêБv‰ â4\Ÿ-²uÀ¡ñ¿úê«Q]U…ô+®¾<Ï)S¦à–[³ãÿòË/Ù[> =ôH/”Ë%?Hʉ Õµ58à׿àW¿üJÅRú ÉÜkrÜ ;vìĵ_ù ŠÅ"¢( 7Ü€† é:ûoB=eÊd\uÕg³c£Í:Ò¼Y:I:­o·uá®ÞÚðˆµ¢‘QüuÁŽÃAðpã’ÊpR{­íº–\p|Šç°Z~[ÎjèáÕLC;ã¥3Æ[Kô|- BŽ‰ÇÆç;G,Âdt‰{vH$Hò"§s`¸ Øó“ø]3.³öl“¶o縼q±ƒÆ8ÜøÃò8ùÑäx|n ~4>>Òžó o!ø µû,Ä`êÞ-_‰ Iß :€±ãÇ ¥cß—)¨é‡‚ÓN;M\ûk_ýzŠ=)Å?ÙÖÇ{,Æ/wÅ‹% \C±èÔXœwÞyâügŸymûö¦Ï¥ÁGÆ›hcåÊ•¨©©I¾Ï@“”vò1|DfL¾öµ¯á²O\&ÉOÌÓÆ?üÃ|qþ† $“%šÐÈ]žÌØ[‡š€b1;þãdz T[¯?Ué»:=;þ_ýê×P,Ö„Í›7cûöíâ¼íÛwØ1Ñš‘Çj$!öôèêêÂÖm[ù “5ð½ïÝlAŒ§žz*FmçÓ*ÇT.ÍfâøãOÈ ·EšNm Œ43Diû}Ñf‡ÂBÀÜ¡öì#d‘D*dIr4yÄJž4äI‚´Ž\Æ(iN~#•¸sx´¸!¡q–V3¦ØŽ’ö»–4‡6\;X¦ûÍûk#[ÖØ‘•KÍ)ô´kmk°E‚v–81¶ÎŠ5Æ)' ÒŒÜ*hHãï‘z™ž\Ú~&ɰ´_ê[îTRê<2"žôYíkméMˆ,™y·Ã£µ$É2ëÉßܪMlóå9Qz¿¸Ü)Ã0å{r’y ‚}J†³în”víL ¸áMg;uóߣº}/ö>ñ0Ú^ZÞ‡š` þ€©h>õ TO>°÷:ˆ5êgÍFó©g¢vä¨>ìè5Ú–>½O?†ÚrÕš={\’¡öÔÐ뎔Úö¤Ð€@˜—È£ôB<"Bâ…lP‰/œ÷óÃ3^hGxÙÉÏC‡ ^~ßÞ½àt†?½ã¬]»ÖþýôÓO„»‰D€àòæéñöÛoã¿ÿû¿½ðhòž^x¡8÷G‡ÒçŸ6mdà³R©„%/‘Ì´¼|…Ë—/ÇÞ½{qÆg ¹¹YÎSzŸºººÌ˜rÈ!b~|Gm îìììÄîÝ{¼µ•O*“]‹.D÷ÓŸfÇ_R¯z sÌßÈ6.£Gã8}úô¤ÒSÙ²çòã­[¶Êvºßzë-Ü{ï½ö¼‹/¾X®/iæhêÔ©ù9tA–È#*æÔÁ",+SRÄéT=ªaòž'›#q?ÎõóÕ^ÄÌg³Ë ô\l$q&ÌœÑ7’â4Ä@FžüÀƒE} W “"òXk3!lßòéœyz%C{쥯 Óbî!õ…ÚóÏ% b¬¼¶á~HäΡC†ûáÑÓòÔ‘IìGý>”‚ª®ÅeôlÞˆâöVP±*Aq ”Ò¿ت¸„FŠQ³u3ö-Y„}¯¾ÔëNê&NFÓ©g vêÁ•í¹êfÍFã)g zÈÐÞwóZcïòçÐþØCбtœ6”)±¼¹3êT.¡¼o/º7m@i×N P Uøk;8[?FŒ;T®”$å`}<Ž>úhW—K–, ž;wî\ a|^y啊×÷sïÝwüâ¿|ðƒü“Žåð@úbëÖ­’kÿ9Æÿæ›oÆÇ>ö1\vÙeøÏÿüÏýz¾ÖÖÖàçßýîwmu€R GqDŸ®Ê¡ÿµÔÿ<ýoð.¾våö©æ§ã©ð ÅüT…¨¾eå½{ѽî-öC4xªê@ÕU (¥ù¤j#…&¶lÂÞ‡Q‡Î´õè¹@¹ Q•³³´^Km¼çHT hì5ÌNqŒ½+–bß’E¨Û³M ¨Ö ½l4Lj{zPÜ·ÝÛ·£§­-ñĪªêjFô.A_~Σ\ ìV2­G3í+´´aíÚ·³cE>l˜¡mA±»›6mçŒ3Æ’uP€žÍÿôì³ÏÆ~ô#Žî)Q[]-Z_:§œr üq±KŸ5sf€}O¡T*Qú6lÀ„‰à“bíØ™”^Mž|fq„ÃJÌ~rw`ÒJW@¨ÙJ©T„0•ú]»Ý¹\Á===™ñ3fl/°ì‡ÿžÔÔÖX7v¾ô¥«-Q"ËŠ±„%aÑåË–á÷¿ÿ½ŒèìÛ›!K*•ËxöÙgí9C† ± ÇÌX(É/B*çÃéÁtwæµ9› gMSŒÉ YùõÛcö6´ùçÊ+ç¶äõÛ{ n‚‘S VÖÅ@ÛVÑÒÓQ2Éž«™ó+·åc&å,Ù¶¨•4ý½™ÆÊ*-[to’i«ªò;Æ:û%˜ù¤XeßBÐ<‰ñ³-eÉ6¶•†OL}HˆrÖçºM°ŽÉOè@ØH›LŒƒ' ±ÙN“îîFqk zÞ~Åuo!nÝݾ/ݵ;€YÖh¡°qö-~û^{¹×’4¥"T76U4ÔJ©^Ï1Ƽíù§±÷¡¨ÙÞŠfÒ¨IÃéÉN<•‹ÐÝ]ˆwíDiãô¬}Å o£Ü¶Ç>kT_U[gs.¦éƒKgÉFAi:³ù6M,ǘo\ˆ¦ìÜhÖ$ƒ±`e Egeݺ·ƒ;M,iíÛo‹ç( ¨«opY{Î"$âùŸ±cÇŠ{ÄqŒ·×®µï¬É@.¸@†Ý~øatvu¹(9ÐËâ‡BkkkfG·`Á+·¼©Ëý÷?€r¹Œ‹.º(N"¢ÊÑæüÕRŒ6nÜ(ÊÿFŽåpðPÁÚUËZn:ÂÈ×ðG ¨YiSMnm‚5Oá!_Mb&–o„Œ‹YëÛ<*ß!Aï5»ñ0_S‚J]»<¸æHiÍš¼ðê$íÀ„¢y¢– C¼gµ9eÛ€‡M61Ñ,®‰Ö*Uþp¼ƒÎ†Õ5 ¨öSœÚÑríÒÄ|-;|„DìkràZí57"­€Äð&~w83N¶‰F-Ö!_ÓZ„ëû Šc¨µ5 ðóÐ)¨ ­ P¡0l˜LWA{PÞ³ åw6 üö›ˆ7¼ Ú¶´o/¨Ø—P¯c4C#ZÿÚ~}ö¼¼¢Oá÷?öÐå2v<õ(öˆ8Ž¡BÂlwß½÷¢¦¦çž{ž j’ÝšR:ñà$Ž9Éëf?³”,zM:w^˜G‡Ç¿mU¼<·hâÎ%ÿß¿ñëçмf}ƒ’Úñ/}éK8ýôÓñÈ#àŠ+®À#<‚Ã?<×a›¾l>\Vp¤¶íƺžåE/´‡5ÑĤ]%ƒíé)CÏ(ɵJ“¡ùuÚ%‘)‹«ÖlÉQæÐ®zÅ¡™µ×’T;EmœwÍif=i¾þÝæÉ-vcÂA;`2Xí€tðm8ŽJ·Ì_ÙóŠÎr x2h~#ÏÆiÕà+žƒAÉï*¨Ýg BÜɆýY´êõ0`¼ÂH#ë0i’m{Ö€ó ÛC'‹K³oº5 'È1²®yŒ—mMVz˜Ê‡™UUô|!¹ô|>@T€6Êo«.=ÝÐÅè¶Ý ê ¾hl4¡¾®¨ªÂÞocÏÂ_±Æ £Žíu‡ý§#â{ž{ û/DSû4+ ¦\º»®о} ®.èžè8¶;H„‡4k¢"¨a#/²¶'e¨))@ÝJ•"³÷"¹Yöþ7M” ±½ãì³Î`•Ð9Û·oOj‘)DêA™†L¡üòÎ;²=ÝÓèÊܹsñÃþ…Ý`ΜˆçzöÙgñæ›oaæÌ™8ïÜsñë§õ°› IDATIJeËlîzùòeŽÅ ÀÒç–¢¥¥sæÌIˆX‚TèX ŠVä¢Ö3”–ûae"ÇÛ¶mŒL†´™Ô‡ñß)wõlÒ^Zù¾ÿýïcÅŠ˜4i¾ÿýïã˜cŽ©˜þñI”|ƒÞÑÙ&°ªDëé%eSƒ”“:ô—AväP§zž³,c eÖl¨—}0Ñéõ ‡G]›ß…Œ(ô¬¸^N:–r®MY9¢@Ô)DSì½PGU&¯É{ïLt‹Ââ(î“ìm OI•)iýntÙ•Há% ¤ QýVÚß¾+hE(ŒUWÝ݆¸Tâ¬+ÖX¥žU¹ˆ¨½êî„jÛU]õêèÛÑÖ±Š4u\Åœúº3ßóÛǰ÷{0`Û4£Œšbª» èéÊE T¶!VÂvYì÷B…±ãÿê0[¶l gÐÐЀsÎ9G|6dÈ AÏC"‡^æd^ËìóæÍÃ~ô#»Ð–/_ŽÍ›7‹ÐñwÜ–anÞ¼yÖ  8Žæ~ùË_@¦vý/ýøsŽgg'¾óï`Á‚PJáÓŸþ4.¿üò„G?7ŠßÿTÁþ£ÿè?z1èÜC`®P—IåºN 0Á°‘ˆ†½³ÑÖiê´ÛŽ5€i—!»qÑÚ5qÑ1ê h(ìzyv¶·ƒJ% :þ½2£Nq;^„=wÿ ­›Ñ\j@På´æ<Ž0œv¹@ÍHì»°ül4`¢Qc¼(GP5â×,Z"ÔÁ=A‰}òüKÇNRä ?Î=÷\444y˜2eJРdÁ^*xw¥€(*d®1yòd¯¬ûy䨑8ᄨjÑ¢E¸òÊ+kV¯ÁòåËqÀàä“Oá´ÓNCss3öîÝ –‹½±±­ÛŽóI“&ሠ—ÿäa gˆ ·U¹!wÿNŠuÜˬCöl¤ú0þ¶Ókw ù€Q`ý˜ñ7ßÜÖÚŠÏ^uÞzë-À•W^‰+¯¸BîŒÍÚÏa¹³Â ±I6nimmMw#^Ü^×K BR¡c°loêµÂôIT^”€)ïbæ«hÞZo’&¿Iiï-–óA®ŠCÜ‚02Ùê:íFÇÏêK[ÛÀuóÖ¿*¸"s½où형߂–àBeæ=¿·©UnÄÌâÂ!–eæCmR)Óâ5ÜÈ—íòÛëbÿ¨_34¡Œ ‡ pƒçhˆ †hüÄtÎ ¸ÿÏË'¤9{h‚Ò„ Õo¬ÂΟþ»ž}²oÜí½íÌK%´.¼;úßhØú†D@=ʰPh`ô"ûÌ1!Nß'=jèHp¹H@œ#øÁù™ZÊÉS&góßo¼G`Á‹ç©’œ\«·;«««Ã˜1cD÷&°sÁˆï,Z´ÈbnÿÉí€üã‰]]]9sæØó»»»ñÈ#K0Ü}÷Ck /¼å¸y+‚róá&¿©=šG¨ {ðh@Kl‘ ÁiÆë@˜ˆwÞùSQŠv‰'¤ýë‰92&_¨Ã‘j¶ Ñ<ùÔS1­ý¼C懜ÒLG‘ÎЧ:ö;8F0H ”saRC¡™¢%¶–b…c=Ó̙՚=‡÷>pù:bŒa¼²@TÁÜ cÓ>Û¿¾†¬”!Ǧ¨=âp–´hfq5àô¦ÎhÃçe×l'×èŠÓÌ=6ÀP«jµ!'ÂnVë[´æhvÁœCŸKß\ýàªH?‡ b5ïoæ›!i' "gn¿ÇÈ í^`äÀçN2á9+-xŸ º»){8°öÙÀX‰×X…©#j’BB¬‰íhÝ„Æé?6‹µFw£½£½¬Ñ^ŽAD¨U@Õ†µØs×­ØýÌÐNâ»–<ˆ¶{~‚ú½»Q«€’Öé½’ÝqŒØ*ŠÄxÇä¨cr†}iåJ‡VµŽ l˜ÝeˆGÎ>{ŽPÄ™l¾T¢ µëÂ… qçwAk|ä#¨®*ˆEqÐAbúôéöüW^y?»ë.lß¾ï{ßûÐ<°9-¹ô™¦¤ -VÚÅçÕ–Ðä!ã™ãÃ*²(Ç«ÖÒ…ÿ•/­t(^£ˆ5 ÀŽùŸïPÍ™3G°yýüç??øàƒ3k^¼#…ÓZ;$÷„ Y\ÉÏö3‡hNwbÚPá2äož³cè?Áw·õM¸yYŸ¶L³"r)46/¦tMIÛÝjÁ\&ÙÚÜN޼ò&ˆ]«Ü Êçƒ0xŒº™¸Q–Œbö| QdÜœ 2ŠUãÀkVâEÐDU€×œÅ9V¦3 ®mËÞàÆV³g‡–üæ:Øç6…²÷/Ñã©,-*ÖÛoX”Ф‹ªX†;Í¢{n<µ xfN—ö·h®¯µ9àVV7dË×ô~†Ü=zMNE—ßÕGþ‡hêÁ6$3ãí~§ä_zNg¬±­§„Í1°­q0¶5Á¶æ!ØÞ<탇CG ÐÑŽ}KDç«ûD˨íåرäA„òÐØ5p(¶6Á–æ¡ØÒ<­¡%&ìè)¡+ÖÉs‘y~JŸÜ{hcÔhÌx&N ×–f(Bå3ÁÎI²¦Vœ¿ 2¡õl7%á©§~‹Ûn»M\kÚ´i¸þúëÓžãÙN@ Â?}þŸ0`Àñ½Å‹ËÎPÈÞß,'Ÿ|Ò~ï ƒÂ?üÃüì¸øÔ‡œþùâž?þ8,X€¦¦&\pÁ^¤ðwn¾ù{žï7¤È³?*¸@¨ÈàŒ^åîI¡f„üñï­#—¹–?þóç»ñß½kvïÞ-®ýúë¯:U¹{mß±=ç=’1b9äqÎÛo¿çŸÞ£E¸–w”Ëå525ÌÈ[¹ÝÆ$M²¬ÖÍ®¡lW´¼.d9”²¼;Ê¡²n©Ø½±RWµý4rß ;qzœïaÀ ½T¹ã¤?öß™ôLnÇ;d»¼»¯…Ü ;Nycž+?Û/¦¸?Õ54 fÖlt½úâ®NÄ ” (@Y^Ð q‘B‰meâ„Ð|þ|4}|Ò«\ñÎó®É|4x°¥lJ) 8p&~é:v%Â)îØŽ}K‹=‹îEwk U%>Oœz1œóQÖÎØë(B݌áú@-ûÇ{öìù£¯±zõjÜtÓMxñÅÅç£FÂM7Ý„úúúŠß>|8>ûÙÏâÆoaßË/¿q%Ì85ã'¢fÜÔŒ5ÿÆ£fìxTBÀý~áêƒP7v<êÆŽGíØñ¨;!ù7njÇODÓ{ŽÄè+ÿƒ®ügìnˆÝåå4Šàž9y~»sP5ѬÙIûT¿¿2ò<_Þd£Øé&sÇqf÷$=ˉüŽKÙÀ›6oÆ—¿üe|ô£ÍóãOzO6,À˜–ÕÍŸÿAL›>Í~¿½½_üâÑÓÓ“ilÀÇáî»ï¶rî¼¹˜1sFNà ¯©Mz¥yóæ‰ç®­­Å‡>ôaÙ_˜={Scc¦Ãؼ¹sƒýàƒ}—AAãah\ƒýAÁyêèèDlþwîÜ™9ß¾},ì+é|ðƒóE:ÁŒ±§(¯Íq9þsçaæŒ,çO:t˜íonŽõë×ãéß>-óÓšðôÓOã²Ë.C—aî³ò¸ÉŽÉžÝ{P,AŽxÏ{pÊ)§d®ýÉO~›6m î²¶nÝ‚k¯½636 -DKK‹·;ƒWŒMÞzí)áõL•žl Ø3Á¨ ;¤ñµìul.Bù=²½†Yðvë"HŸifÂô¹l£‰7@°Ñ”ˆ¬€r¯@è9¿ìŽðœeõ iãÈwD¨ÉŽâƒâãR|š¾Ü9|F½ìÆQ䪳#×¹D› Ÿµ/;t›ûW°Ô†JièHo0ø@i à%F€ ÃF¢ê¨cнv5âRœ†© q!Ù¥—¡¥Ÿu"°¹ó1âýgÿÉëÍ÷çP…†žq:þçE´?pj£dLÊfwnÞ!M€ª‡£0v‚DQ’)R¬8O1n_^®£ìâ4%1D:©èP ¤ O<ñŠÅbæyzè!œtâI;n 4€ÎŽNlnÙŒ–Í-ؼy3ZZ6ãM›±|Ù2A¿ ãÇÇ•Ÿù Î<ã ¶à׳] ¦K§ån¼á|ùË×âµ×^³¡Ù믿_ûÚ×\ÊF»Â‘»î¼?ûÙÏ]t!þùŸÿEÒ0š’!E)2Ò²eu§œ| „¶”í¼óÎàAƒ„ᥒ¨9=ÿüó“”ôûÎ9G0*•æ •büá.§¶ví[™1î¹¥‰1T®F¥ù3E ¯¦c 7`öì#Ó²ƒ©H¾¿êw«2ç¯[¿“&N’hûtJ"¥pÃwnÀ—¯ý²ÿ¿þßñÕ¯}•ÉU2–Š€;ïºÃŽÿ…]ˆ/üóÒÙL˜‘tºvO8áÑþÏ¿þÌ™s6¦LžŠÍ-›±âűyÓ&\y啈ã?øÁì¹<°…Bººº°xñb,\¸Ã† ƒ†Â?ýÓ?áõ×^ÇŽ;„Cz饗â”SNÁ‘G‰C9;vìÄŠWà®;ïÄYg…x@<ÏSO>…§ž| £Fƒþ: ·¥¬‡Œž¼R T”ÒuÉieØ‘ƒÐE Pšqv 0”’WÐH t]‘†J¯çžÅ<‡²=Ñ•pà”ѳ¬ÔŠ”t6Í”@i˜;Âé ²2/i˜Þ´˜RIe Žr%[é{(åªlìú¬} ÎmÎí«Tû ¤´í Bi—²ïìí7 ?»’,2¤´+1LÕkRŽÉAv‰^FªWˆk6­S®y®{Òõj³òðN)—¼$ñ"¶¦’g2²èwqSÆÎ*#*Ñýé¬$ºBYÉT”ÌSÈBfâÕ+W®$kYWÇÜï2Bâ"ò7ókyÛôÜþèU¯ @j"…êH%?C!&`GM-¦þ¿;0ø¨ãÞ5V¸ý n]ð+lºî‹%“[¡D@QEM(¡ÆN@Ýÿ‚ª‰““WáZpÙp‚\A«µÌ ííû°aÃF<ÿüóøÙÏ~†öööÜgnnn†R mmmß­¦¦'Ÿ|2æÍ›‡#<’5Ýp­0‰=†Ê‚›ér¹Œ[n¹·ß~»UGuÞúé8õ”SQWW‹×^}=þ8xà455á+_ùŠÝ5óWöU£ò…0ýÂÞü_¸ëÎ;Q(pß}÷Y‚J±YxV‡ᢠ/Ä;#9sæà×]—bæ¨ð‡`²uK«0šæ1r$núîwÓ6£||o­]‹k®¹&Ãê6vìX\ýõ˜6íàÄÈ* \.á™gžÁw¾sCf—>eÊ|ýºë0}Ú4û>J€Ð¥8Æ­ñ?ýôÓqê©§¢¶¶¯½ö{ì11þ§žvZ^ìÚµ óçϯ(GS§NÅ7¿ùMxàxùå—ðéO‡CòŸøÄ'ðÙÏ|Ö#E ;wíÄW¿úU¬X±¢×uxùå—ãÓ—G}”ø¼¡¡§œr Î:ó,{ÜqÌÎòbà€Ì Y#9àj†•¨‘ö£˜þB÷:Ád~v§7€æoÌõW¹ê4uЋƾ ,‰&–¨”Jœî¢Òx°+gY°ÃÀV¬§KÄFFùÃÅëæUèék¥7+)—Óë‡ûÔO¯šµÇß×»Ð_œ~ƒÖ›%Êù\x];w#—µ"rt¢(ÂìÙ³U¯=”Gû£Œ£Ö(=ûz~~+ ]Ý©QW¨.$½Zš¶×Ôá[ïÁà™ïÙ¯Üø»dÑÑòÐB¬ÿò?ad:ù%2’âê*ÔÌý0jÎ:êOÜæqÍš5¸ä’Kþ ïVWW£¹¹MMMhjj¨Q£0cÆ Ì˜1|ðŸ¼%åË/¿Œ[o½kÖ¬ICʼnÀ)¥Ç1F3fàsŸûœàfÿCŽmÛ¶aîܹøÀ> Ç†Ž»ï¾ßýîwq÷ÝwÉYü£­­ ÿøÇ±yóæŠç 2W\qæÍ›‡­[·âSŸúTnZs :7Ýt¾ýíoãÍ7ßÌDMü£±±Gy$n¸á†?Ûø¯_¿ßüæ7ñú믋Ï'Nœˆ3Ï<—^z)ª«]G¹¯|å+xôÑG­SQ(pÍ5×d@‰—pÛm·aÁ‚Áñšò‘àÜsÏ´}­ªªÂqLJ³Î: 'tR°O}ÿÑü½…B¡o½\Ž=f"Î@ìVÈ©tœ¢;:Ðsï]ˆŸ\‚*"ÔÉ=ªÓPç»cνà5ä$”°nû¶ü× ZH^¤”îÌK©1/+@Í:u—\‰hèÐ4D¤ëP>ѱæ#T¤r I3!ÔrµR[Gƨd=õP+Fˆv–’òÈ—ƒäÆ--›°zÍ´nmÅäÉ“1}úô4/[™óªW§÷Rüõƒ8î¸ã0tèPÖ’Ñi÷åžîn<´ø!Ì»àNc–‰¡(á£{-ŸíIñH†×£³7¦³^N ²2¦Pœ>ìí[Ò4XãAISã+´o†ÔÔó3.¦Vz{·®JšÙýüü\uD"\lù-GÄüʈ¤Ó‡ØþÅŸ`ûõ?‚¼û.ް§Ú Öñ dÀñG?Žë¿ñIßø ˆŒD…ÊòJMЇ£.4VÚ%œ¾ýŸøé·ÿÛ¼‰K’pilLd¾¬?ó 6¯~¸zM2Øäþ9²=QC2»³ôßÑ iI•Ý ˆyˆñ7¨™Ü•]âû  ;éÒd¢ï„&¢àjkužé%öû@ËS;`Ž+”ʆŒ÷”•(C åV¤¶ykÃ*’€1:’oTÇiÈIz¬5 (§0$ άÆG3¶b)M¥tL4ü=®ÚgçEXmUÛzÐ)mó†Jõ9úç÷¤0ŠƒÞ+9ŠØË…Zc j-MLK;vj½éõ¥ÙÓÒP‚±Õk„%a 4I|@1Ù)9À‰”õký›ñ*c!Ô¦«ázj ŸˆºýSȺz?É?/6¬;!jô$>Hgnæw^Ê×øçúÒ¦&‘À$ „bmȾDmÛážálûè訉Ðg«­Åo'žŽäø«»Ÿᅢíßü)ÎÏ÷ð¾¤=5ÿò0`Câü{ßÁÿ|÷;XA°’ý5ýß㥩‘¶?Œ“%è1}=v«É^¤\Ç»æ {¤àò XaÀù™çÍ|+‚õo¿ŒÕï} ¸ò¦Þ-ºŠ_€Ç3Lâ`pceMN pç°}¨¿£õ5˜ù”ÙZà µ÷ƒéZ×Þ8S^Ï;&ßëCó Œf>xcÍ®Íð°áï›GP7:! y°¿ŽÙ3,z[µWªâId·Ö9{µ¢£È9¨ÏT´ì¬¥þ´0°ù&šB¤Î…!íÚñ–SóÕ}…y'Âv=5žƒΠӯ)W`kÊw½d€"k»ónì lÑï’˜ñÏì<Æ¢žèÕ&8dϘ±íþ†®NTM9·C8pµ<qJ®^Çú•/#q‡ôW_Ãy.d0j¯Áñ ¬E°ÔƾßÜԿˆ.î4¦¡W‘§¢/\å\²pÌÞÙåœù–fߊ`}çe¬¿ð Oܬ›@Ã%StOÊpÕüàÊ6à‰°yv\xÏós<éÍ÷A“eÆ@)-"x‰"аûôsf¶u(m©XOñ$Kô‹~ ûª"¿Àh…® T¢ 5Fš²QHt H?ðŸ s•çð­É–liI‡JäëBlÇ2$'õMùKªÃKúê’²Ì÷vµù(¤Ã’ªê³#þYo âZÃjæ:vRMÞ’çB*Á¤‹¶Ø#H6¥45ù =OÚ'úº°j|r—YzŒûä23‚Ó̺‰Ò§fCQÏCë÷d†L<³Œ"?ËÉ5‰ÀO˜ŸÄçÔéGFs*ýg£Cž–é ½=üùÆâµNt"×ÇæË_Åù0`÷ÚŸc{º—æÌ©Ò°ßØsoŽæŠ@b5jB jÈD9XßóËÕuŠzÝ(³FIWì7ò´ÿÞ9öÒ®«;w±úâïcxòé8@ëžêž\§#{vŸ™( ‰Ç8q,UùCNEÊ./8!w¢UDI#ôO®Ý(wî¸ßËKÏ JM”ĉ· 8š…î¢'œÇé‘çì8±Ü–Ó¥”§ÐÙ›ö‘Ž&ÒfϾ/NÍU·?sH»ÐgµN x@ºpús}Äçõ¢tsk˜]$jÂ\ȉý€“¨fÐÞƒPɨ1}Íîe<`™ã‚ŽaÚ„ZMoè%Ç3žYtò‚îˆ;>7²TQ¨¾¸ÿØ}á+“KØýí_âü¿~Rë ç²èƒ`…ý¦»b5*Ë­(À‚×z{(²›yÒwùïQñ-˹– }ÜàùØe¬^º‹õ羄áæSUMMX¯ ]ÜÒæSª •¦ ¬IDAT‚TÅ ó‰Pc­“Nsj‘*ƒBLrÎ%FrPùµÒÏzP*‡f—X¡‹(a 1ŸÝ¡ w²ÝdU§<ÿT9\ŸSÒסJ~4ÈWf»ËWé /¡Q§0Ûo~úD,Ιf$ˆHÍ“QDåmd!  æNËW¯¶}¨s$EØ£~­rå¬Ysó³ñúL}e1ýÒÚ3ˆçÍ*±¡ >U°(£Ö–©®²©­Ê'çõLue‘ƾhP­T™£ÿ »E°ÉÒÚÕús¥šO‘Â`µO±‰×ªt&êŠoæMTÁ£xgIiúo6#×OãƒÅ‹¦hWêL—{cÕ¥Ê,ú –O¡x"uÉQåÍÕÕPªklÕ±èVÜTÙû€›Cå'Å¥ÅÉ|•M F„-‚eö7,9+(>œÎ¿UµÔÜQiÐ µRÕµ\ë¿ôÿó žÜ£ˆ¬$ÞÒhLùût*VY&6÷nüÅÄb<²}ì VŸû"pã lÿúkØýÛ¿îËe²FÒ+VãÆ¾7ñÄ0nîeCW_ÛÜ®j›£–oÝŽå]óƾŨzóI ¿óy¬^º ¹rÍ0 uä«5”Åf)•Äë¨0:Ž_!Áx9A¹ggßâÙ²½Õ!¢.¾½jÊlæ Y^p4úä]×øÙÉÈÖ©3,s[TÇb¡’¨Ô²‰ÍUÔH&X.é㢓¨443ƒËY¸² „Žä’Ÿž€$JiF]Lm%–ÎX`q|-5)©8MÔ¹//×T¾¿¸ƒ^“CÔzÕY6t”͈z¤<…¾™²_E:„¶/[Š²Ô¥d‰ÍìHG(²9Z}XÔ«IM[í¤þîà“já£}ýT :ìáÛ$\ÌT¥2Ó2+f×ñ.i¢ ›Ç!K|féÑTRœ¢Ü£2kéK'ÉëOÏœ§këþyQÄò¦'utë ©M3•AÒ[µ ,AlwèöX[ NJê°Qm‘öT¢ìn´=1•p¹"Jª—6ï",rÐû’ÓF·¾§ÞïØÞ‹G’;…  Óy]”ƒ°Ñ†¨>Ö¯›7ôO”1¼9Ø…xÝ>¹„᥻X?qéÞkØ}ëÒé¬ H$VVäž7ì7ñAö›{ŽÌ51ÎÇ]zC'¡Hq¬%PU¤¾‘ŽŽ Ͻ€áÓŸÅðü§ ëuHTèPW&ÁƸÛ4Æ7[‹s¸^»Ð¥Ëg (‚Ë,„Íy貃±r"çà €a`L´ššF $îØ›û‹°ÛÆC†Ñ$¼Î~ª<`¬9a qtÑŽa_ήª)xœÏgg>ÙÇågͪG¦*ß(‡ Æ>„ÓKÅ“VÃ#ÒAsçÇ “ƒs‰€IGÐG째×ÁNb¿ÖÌ.ûiÆÏq*%È~*…Q2n*ÐI]A@}!R\¦ë(LAG-# O¸«Ñ^$N">þðìG Ïþ:Ò7^ÃöÍï"{r÷Qùj‡JˆàHqtZ×Yœ¿ÞLÀÎí¦ŽZh·>ŒÕKw1üÖ§!ßP'W¥ˆd¢ŒR”a'ÕH«BÔlP_¯Œ$ÍI&Ž!Ð(¨GÐÏ)5ÊT^1íÐŒn_ž®ôGxArD˜óFW It¨%È«y`ÐÃíiTÚ¼—¿w*Ò3$$÷~lÉbºœ²]†:3 Ô*’Öåœ_¨rˆ>4|O§)µ.t¦9ÝÓ!e}Ö›‘²ã?õûÍ:ì©a/µD0 ãVÈV§Ø>uºÎÒ( j2ËsñQO£\9·¸#B*´Ù´Ï鑪{ªˆâ zj2ZèÞ}ºZ{Šß´’]£ðùc“lysæ¼õMéòMŸ/šCOIÉæ•jM4÷?K^´@Õ¡BÉ<ê‚Ô9±T‹bPóp|‚t÷³>qé›ßÿáulð}¤ÝÂr0p_C½ÜM—:ˆâjMƒ=Òµ1üžô&7Ÿn¿€õ—Á[ÏTmöœƒÏ/ µDvejÖ4ÙßåTDrEŒH–†¤Tÿªyú áUŒuLc>¯(–¼O*ñ¨ó–ê÷ÌɲÜÿk6yˆ7çt žŸ[`­’ïLVÀRœØJv@e¯®y]28¨‹£2ÂT5Çœ2ª¨|cö&Ï£½ÿI¶G•ÛLp‡ÅÑñÕÊX¨ãjPžË|0C­h•ŸZàjšy$5´W¡Úrka¬ØVYÍ¢ªc‰Òz¢q5ªmA ÜJá˜JàGfËMuÌ’*TV`e©UÆ B©×þ¿—Ÿ‹)”At¥1ß;ßAcÆ;Òò( ”›ÐÊ€êJfª¿%®RBº^b¶ÙbO¦0H‚¤à˜Fo†)ï)%Y£Ä‡©Yê0åM›Ck58‚¶™Zc&HÓÙ^¶)Dã¯)Õ «C_²÷Ó©íãA!íK˜)ø^ªcn8D5Më'Z;®q’”*•:/OjŽ‹‚Ñ5a\3Ìð~^WÍí¥\ymô¬k¯d&Ì3Px%‡_ƨ®ì÷ë*­9y5š×6sN°–9}ð»”ðËnq³¯tx6 ¹Ÿ½ºÙlþ¬\Àü¦Þ²¢;Ÿ=ýâøÇ00(€ëC®?ŽÕíO‚÷ßòcàí·Àýòö[HÿýSàá)pvìvûy`}99\»|ðC' òäSÀA>pÍVuc|×¾õ2"™LXÌ+!ÝÃX7¬÷÷”ÚTxuVý‹íü5ä©*˜·y{ È îËÒ¿õÔ NÌ‹§Cnyóbÿnžmî{8~¼sÉ6T[cg]ö6ô*`Gv7y«?î_÷`õÂÃAåé°ý´ÞôBVjrsĽžòÛÁ³¯]¿9c¡"‹ñ=òI£5Ùƒðó9og´;éoÂñèí b%»*˜ýù"9cI0+ë´/bIS oV®Î £æV«ÎÎÎ^…Üàõ×_'€RWùýÐÒéÈÃSÐlèkÈÑp|œœ¨“ÙÒ~õÚ#Wï^ÚÒ–åòÿæ%~ÞòèžõêUÀ‹/¾(³:Ÿžž>¼zõ*îß¿P¤þËnÃÉ%àä’2y_Xÿ²=šö^Ãe^—¶,—÷ÏKÈÏy ÿß$"¸rå HâäääøBŸòÆol>|ø$¶Û-ÎÎÎÞD¹GíO·»´_õXäýl㿈¾/>`iïeˆ›Íëõ"‚ããããÛ·oŸý¯Ž ÷îÝûüf³ùc›e‚—¶´¥-miKû…·³³³³Wïܹóõe(–¶´¥-miK[ÚÒ–¶´¥-miK[ÚÒ–¶´¥-miK[ÚÒ–¶´¥-miK›o?BÊ¥|6UéIEND®B`‚stem-1.7.1/docs/_static/buttons/api.png0000664000175000017500000006105613157571677020600 0ustar atagaratagar00000000000000‰PNG  IHDRôPï,‡ÆsRGB®ÎébKGDàààØNx pHYs  šœtIMEݦ+Œ¨ IDATxÚì½k°vWU&úŒµÖ{Ù{·|¹$ÂE’j4¬ÖJq‰4T¼¢ÇSeø¡?üáµÊ:Þ«Ä­¢µPûÀšƒh‹Ø%ÇŽØtcÅÈ%áb Cn$ß}ïý^ÖãüXó2Æœs½ïû%CØ«êK¾oï÷]k®9ÇœcÌ1žù<ÀÁup\×Áup\×Áup\×Áup\×Áup\×Áup\×Áup\×Áup\@ë>pË-·¼|<Àø »®ƒëà:¸®ƒë›~-‹Å /|á ?ô°úm·Ý6žÏçsÁå—_môdÙ$Rx¾óͼß7§UÍVKu!÷Ftð’ÿj=ð8꫃aÿÖ*ç{ï¹ç&“Éäšk®YlìÐo»í¶ñl6›=z;;;=ú8^ºæõÁup\!ܷƵ»»‹Ó§Oc:zSúÒ|>ÿ¦9ó‡ßµ®èü{„6‹èæçÁ;\×ãÖ†é[ö}½O>sæÌ¼ôô*ýÁ-·ÜòryTœ¹|C»–Ñs¿Qïó80Óo½ë›™‚?¼ÇAg?¾úAçóð1k ÿJsvgg"‚[n¹ååkúx<þÀå—_þ-½FÑãkü®ƒˆéÛÐ×Òc°MM££Çy·L»üºüòËáÀêæ*¥ÜÇç€Ûh®Éz³z4Ÿwp=ž= =Ξt°Â>nÚô4úö›ºß+aïSÇ›8ôG͹23º®3ƒ™ADÅ{ûŸ­úÝù|ç8ˆ˜mÛ¡í:°B5¨j 3O u]{¹ÄoÔdÍîKß´f¬=qãÁVò`›ý˜íÎ?Ö”íYй €A óY"@„Ðu-f³>ß íþY€[ÔÔ• ®€š£Q…QTU…º®Ð45ªªAUW¨+@¨ª T*@˜@„Šú‹ž‰Òß/m9õo…ŠH}¾¿‡o¸@0ŸÍ°»?Ãîþ³XÒ¨§àz‚vÙbwogΞÃé³û8;öe‚¶:i¦Øj€®žz騪@®ãÅýŸˆú‚ø.t§déßDì¯õç¨WýM!õ¾þ»îÝú‹»»û Ɇ995ÈáA±½ä¿aZèšÞ÷5¹ñÓvE¢í°7cޤ›¾™ôSÞì|M¡hëö¦æÎæugóä å‡ëqò?g r7Ìú‡T'â3t¿<Ú÷›dó4›…~JæˆCóîîÊLMó’v ™5VõC‚µ[=#2»“|ˆÝ ëTäÅ‹æBùÜ2s±Øïn\õÛ¬ìëá1Š™ŒrÏtÃðw×¶âÖeý-ÿ‘8÷bSö|kˆf`úÚ°_‡üwdźR0)óžæq~‰AŠýçšÒ P-JÛ”-‹Ùb6lÓ…÷‘Ì »õ.*Ó6ä-Ëlkè*;t–Ü"ÉøÌ~€¢‡ #"€óîðþüŸ/Ág¢¦•ëÆ¦4a4&45¡ªu]õÿ¯jTu¿Ëí£ê_S°ÝÄ ,Ps B‡Z–h°D# 4Ô¡®5 F ÐÔ@ A]÷÷›-ØÝ_âÜ\0—1Új j¦!Ìç3ìïÏpn†YK˜ÉAõ¤_E©@ØBåæÝñÃ3TË}<°G¸ëØ ;tÓéDý;5Mƒf4¨®Q5 .b‡•à¹`ç¶E„Ä¿Àp¦*`ç8ûq’l¡!;ä`\î â-¡&¿ûžXg)f‡ã—:V3V\Ç5[DÜÛü")×/Ê'öÁIX„â §ï‡ÌÁJ\ ”1KðF¤þ)îeD’ÕE­!ÑéyÀ}ÿ‘ôsÉü`í0L#ñÝU{Ä­däÚ"ÎÁ°8TàG0¹ÅJ$ÌRºŠ‰mïïÍ}Ð"¾oÅ/Ø}»zç¦pX ÜwÔÂhÖ !å§úÁòí'×élÞÙÚþ=ÀnœÜ›; ‹cXÈû‡0´Cè;ÇÛüšâ*Ê6 pkœx硜˜·• Ár¸Ç 6:$ZsôŸ©ÏÇ÷P¡¤²?lrhcê5%ÎIqu4tq vãé'“”b7ò6%Áƒ“ø9 °û~ßÅìl aCaZœÜâ}eS28€ØÍu×” ~߀À‰¿•Ð9¢7£ÞÅùyïƒ7IE-Œ1è¡dÁ‹½äwAº‘ÔdQ>Àº‰Ž!Œ«Åež½ ŸÇÔd1ƒ„Øujnhâ¢ã޳Åw?p Ì®D·}ßq\°è€{NSŸª€[€—(Fäéß%Fý`²Gä­œÜÂ’ˆö# ®ÜÍý®¾´,èh T ªbÇÖìpï! êÿÀ*0Æ n£Z°O‚¶m±[-ñ‘¯Å?ïO1™ŒÐ45ê¦Át2ÂUGöðÔ£slO·P5uo¼Ê[‡EGÔãúµ_˜ô‚Þ8î`% ìã‚æW¿³5¦aaS‹ùEÇÿÂߘŎ·šî!.eí(ãNÜßXT¼-â#e7ñý.G’ˆÞß‹$:·¸“7c¯„¸š“šPÚyr žÈ9Q»8Ñ“˜Tt,6ú7–â8xÿƇ%ì.$D²9f±&Áà°b³{/6ÛPñ‹3ûË÷ŽêgP}¯'ŽË÷K\5à£dìoò€·1ÿ’:€+`°ß¹¹~R iÒÏþ¹ ¾|׿¾ DƒŽYП:a‚œ~•;cQNU(ŒW0#¨àN¤ýß$¾ƒè-dXÆ–°»ïûU?è ÙûñTΔt êÖ]Ÿ!‚$roóììƒLÚ&F’í•9|FÔ5™üŠŽœ¡úÌÝÇo<؆!ÔçUpí|˜À&è÷ëLŸÙb·g‘-!µ]}j‚4²W­ÖÝ0rì6Lèƒ2)»+ÅýôrkÙöøÀ‹½Óg't#CˆA¸ÉˆÚ`P1ß1èÐõ.|Õ®<DŒv;ôÎm1ŸãÝ ûmƒC[ÀñCUÀñºÆ50ª¦ê-©þg::–0[‹h;²«°è€E ´Üû$ˆ¬.ßxûïÔwü÷;î#Mÿ3ÿª’ô Ð؃Þetø€/v=#ÀÑ-Á¹ᥗþ3.kv1jF×u@ÒGÂ$ËT |ÄL*·Ê.ŽÔ‹k-“Ùáú…\ïÂ%862$*â‡$•°›Ôqì †‚}/ éP»+eµ³Ò©Kß’Þ›ãŽQmÝÕN„]„îvwÙV‘LÔovÜH½š ì³nüN€bÐã§&)gÕ“[4Õô·‹ˆYâÎKEøqáð+v¡á:ÌïrEõ™>Çm9‹ ÖŒCÀ'b­2=&{QÅ*’™…±ñ*ÿd‘8jGƒuÙAt}€MdkÓ®é®×÷­~FR–Š)£dm±A·Ù­CÌKß é@6Dæ*àõkntfÊî“@™D¿“dïé=H°+JÖvÊ̺¼„q¶º²É¦‰éët\Y$/3êáV6Ȉ™&I³IðWeùD‚)Ä*A¯46(‹› › Ĺ`⨸æZ Åu‚•§géCÝĦÛÍÔ›¯¼Ì½~‡^òŠ’;Åô—"‚§ÏáîûOâk÷}Ÿð(¸ÙÂþ8·¾¾OXòŠD^6 JÿA¿ëžnõÿïkò}`ÐT‚ª rEŠKó²ø@ Ï@ýž ¨¨wõ÷­]°Aª$**èØý}[&´0m—þþ.`>›c†C‡:ˆf»Æ$%Zš 20yÄ&f× ¬Z5jé‚FØå °Èì\‡ì|Ü¥ð½¡ÏKÉ(%Iƒf7’dñ.™¹m’þN•K C#«úIàœ¤¾º¢#eJÙpÓúeè3›|zå®A©­ùMúÂ’Úª¬¹}>x2´ö µBÆ6i›¬¿ù\)˜¹ ·ãâº1ðn²¦ VLhëù““âr”›´”?“¤»³9-ó+»k2Œ‚ò¶©-Èàb50ÆCvšm°åüjè÷êºÿôåSø_fœ>I8KcÈe#Ôph"øêr`·óœúÐú m#Æ’z§L*rë·„,¹4lú¹¡ñ1÷©¦&ìŒ  v&„Ž;t]·Ñ¾ƒëà:¸®ƒëà:ß«ÜýÐp ÿ±º/h»§ÏœÁéýmŒ§cŒ« fÔ×&Í7†ä€JyõÒHpxÚá쬶é7ŸâZ‘ج!)Kúœ Ó 8=dÔƒ¥| ‰4P //2Yµ¥SÑPcà31 \ƒ€‡ªmÇÚ|LÿS­%‰Eçæut€'ŸÓén·iÜxjÂâ(q`6:åSºÐm‘Š| ¶òïNÂëˆÄºfŠ^'…Vòýi{®úÆó:ø¾w‰i¶ÃMî³¢À6ùN"Çû›SLÙÚS±ˆÈTX|óc—B]Ñ@¨ñªñ%‰…ÄÖ5éÑXñë àÁrÀ~R<$ Ú›nH•N úù9p; ÚõøØ_Æ:(QrbÀ6õ1"IÒ³ñÄ„²PJSçjÔÔûÑðdgJE0÷àÊÐ!ð ºm 'ªÆ '1@k(v‘]³4‚^•5Òãn~ë 6iëÞTÀPÒ¢•Ǫêºvê,ÂxS(£Éšu—²ùhmY¹Çdõ‰ X_vŠxd½ 8šóI¹‡ºªhù\3™Q¨W@:¤C…£šP7S}êzÑQNK÷M¾‡¾"#àÒÈ×e½œljÄ JÐì|½©¯uÃ"ˆ"”©à©cA:b'‰¯¦; €6Ü`4ê݈J8Ô•8¼kIp`ØŠÈ÷MÒin‰õÒ z4{(—t³_Åú´`Iïè÷×H]SZð a|ÉâTŠÀÃXŠÏ1"ý˜E0”‡»Z¬ÿ»D´r‘âàôâ#"ð'€§( +z`UÅÔ~Á,b"BSC•xï`Oª#8)”r¡´ ƒü Áõ® Q‹k?¬}}_vPo &ÄÃ:d€|«|¹šâ,“rµÁgwÖéUVvXVõJÀ„ö¨Úº(¹ˆrʈõcsvKH'Œƒb…mÑ6ïAqÁM‹@9”$«Sh僒ˆæÐò³YhÍ—I…wl×ü€³ T±Q’rªq^[РƒôìÁz¾Ã”ã2u?_|Ý kOS¯'‹…BrÓŠšjÞ%vbp}¼d{ˆ’Ú¬®I q©'²{{âI4ÎËvéyW…j5¨ýØOæ!Pàp´,"¬‡j²bw&u„ ™Mø#©Þy‹èñ—€+!s†:.®=ò9±+(NvÞúØ–˜}9ÌQ ÔÕGE ¯¨])àûi|…P‚ê`6ocq¾Eü#[D½wu²Â‚cgÈDt69„:ë ‘ ¡÷}`‡|Fæˆ\x#gu`®?æäIÒ¿¦ibxXΖÔɨmŸD'lH‰:QeÁä6`L焚³"’}žÅú)•̳[<'Ææâá¶s‰"Ò_Ì»ô›#V™*Ôt:éõÝþìŽ#‚*½1VÓ‡lŠ“•@€H^@h\/´ Hs ô.;t‘¾~ÝÔýŸŽ I¬ù`Î/´>2ÖmÕ=nÑÒJçÎÁ&¿ª+ÆtÄ踿÷¨î U½3¨H€ èZU‚EWm@xè*…d–ºspª^‘¢” ì²æ»C¤BC¸…u`ž²c£¤@¾2#+lé~¨ X”+}W¡nÃ@¨Â{¬–­#+ççÀFÖÝ»„æ.=Pƒ´VÛkŠâZukY¹Î¬_)O¥¤ ÙsdÈŽÆJÒ{É&dã·Á°½ ¼£ ~Ùæv(’1M¬CC;d ›Ì—’­Ê& ëÍ­1õAÿ0ðþù"< N“pžØ­:¯y×/ó¨‚âzçØ‡†mÛ¡«&€£S࡜1°3é°ìÇ#F êªwzu%èœ3î¬é´·àÈV×;`çü;˜ýYw2×rrÀµ¥ãþ(\çζƒœG¼º®¿`Ü0m…šPѹf:à«?¸®ƒëà:¸¾qW3®P X>ÈPŸ1|.µÀڎîzÒôéŽQÍh»˜BÝ™´¨I°»ìëÚ]§Àš¾)o»˜ÑvŒQ ¢T•?î&82í‚o;3õä2.ˆÑ¡ µRgÜÝu¶›͘! ì-©˜}Ðè÷po•¶Œ€œUSĆ>%,_2D±A4¿ò+¿‚ç>÷¹¸á†ÔØÁœ¯Eœ‰Q½†Ì]ÛâÄÉçmd;‡v°½µ­è'UÞ(Ðuªt”ô5´‡|èaõx4ÂÑ .PÕ ,TõL,½k°+U[Tк””Â[T=XSÍ!gò¤r§È çmEø ~HQ\ê㎔ÔK2P7‰¢p,©†µ$´¦¦?˜£¨æRtª¤× ² gж`w!¾7…týÓn¯ˆÒ”}|™œ¥SÕÍ”!S7µÅ„–Vƒíb=)g©!Œ’¬›¡k¤ö€xÒo †ˆD§ÛIÕS’“`kbA¤¦¯ujìã8 ì 5¯``É R4³Pk›ž—”e/5øÚâ)ãA°:÷)rË,>§Ž`d1¥q›m¥¬Ø()*P5$ð6&6fhrÒ¹’Ø«q*›8tK¦uÈósOõ§ÎŸ÷`%ékIÜ¡Å5*T•Û ÐTŒiÝâì¹%„Ø›µX´=¿zUQ8&æ‘à+ThU£ª+€ê¾ Ý'²qjÞáðx†s3‚ BEÔó¨Wä¡®€ý™`wNn0¨wö¹³ìÒܸ?¡¾&ävöÐðþˆÛdÔõçÞç5vçu–ХѪ¢žGž(¤ð5Sš§‹„9¢R×Y4›)&0 Tü¾ˆw¼ãø›¿ù¼ò•¯U•I—GðT\DQv*ÚX"Üñ¥;ðªW½ óùüüúÎ.¹ä\rÉÅxò“Ÿ‚—½ìåxñ÷¼ãÑX9%  ŸS'Oá¥/})NŸ>}~¢ºÆË^ö2ü§ÿôû¶–* €' MêYÄÔzè, OC™LTVhJkrŠ–6aÌó€/M×u]ŸÆ–õ ‡ºaO˜¦jðŒ,;$"ÊÉ(¢Ä1 ý¢}®äÕY~ „±&€£"¶¶°‹ªV+†5·-IÄ[;ˆtÙGÓG”} ¥V}ƒVL¾@`d0 dª´ HšÀ“™x:ë ´ª8l’„tZç' "fKƒ*ꌃá%T@h¦>ÍŠ>5Ô–ãšÌATp4ÁPã!pŒƒÙ鈡œæ€wqàÖ$éJöyŠ:vËZ¨pì™ü4HÏÌ Òf: ¶Ëj}Œ¤0Y ºßÐÑ*w-ŠÒW`WaÂ0ä/   IYs¿Ž:àòAšD¶;Ï$G’¬ív£·ÙÝ8–ƒøè*òMKÂÞÒ‹®T``tTU¨k`ævÞ-O84Ç‹žHØQWTÎÁr2·þT*ðgÌ—öæ-Ní.qjw‰3ûH:<ûŠC¸àð–-c¾l±?_âܬÅþ¢Ãþ‚±7g´ÌÀàE BX*,EÀR¡ã~w.T¹÷%TäbjB]UýŽß)ÃH,ÛþšJÌñ7ïHPõ©‚GQ*d£Ð>!#-£rñŠ•QŠ¢|ç;ÿÀ]wÝ…ÿþ×ÿ/}ÙK‘qš‡£ xãfgôýŸñŒg೟ù,îüÊøËÿößðÇôGØÝÝ-šÐUW]…º®qß}÷áÌ™3ØÝÝÅwÞ‰;ï¼ÿø'ðÞ÷¾‡ÆK^òüèþ^pí Åæí·ÞгgÏâ Ÿÿ<Þ}ãøÀ>P|ÖñãÇñ†7üŸxÅ÷ÿ{\ö„ËœÚ$¥Lv' €NrëEYÁlrÄGjkdÁrˆ”£šµM2þôv2ÛÅyË ðKÖqÅ(9gþ’·ç4’é=º_¨E1ádž­árª¹"j‘V·V@´nT‹7l0aÞWœã&µÔz'ž(`¥Ýݤ8ÎåâÐ:»Ñi±pÿ8_¨äÄÒú³Ø Âœ 2Gýô)"£vúŸJºXã=2På"é± :úb2¢Ž?.zQöØ !Ûl…p0µù.¾cg‰ç\±ÆŸúê §v»@¿êUU@SšŠc[åXᚘŽ*Þ®pd«BSWøç{Ø›3ȳ»U„¦F5a{Ra:"l ã¦'·éÑÔŒ–³e‡ù¢Ã¢,;F8Ë)ì™Z,»ž~ÞV èªÍ`2c2ìÎk÷„‘à©àö*¼øÈgñï.>‹.º“Éä^O?{ö,^øÂbð‚¼7ÝtÓ£úŒ?þã?ÆoýÖoe?ó›ßŒW½êUáßóù÷ÝwþéŸþ oûÛñ™Ï|&ûÎÏÿüÏão|ãÊç½öµ¯Å'>ñ‰µÏ^U®õëŽÇ·üp>^à±Þ‰ßÄö}ÃõMx‡S§NáyÏ{­Ý¡›Ãô² D…ý±¬Â¨TaÚôÇÖfg+ÌÛ1„+Üzïœ8wÏyÒO8¶…/Ý·À½§Z”äXR$%9g];‡ï÷©½ÎÔëŠ"}« ˆút¹¿9 ÖQ Lš “a{Ò`{L˜Ž [ã ãºéÝ*|ʽ°À?ܳŒ)dfË -“I¹“3°5Ë@z`äMÓºŒDV3öŠ@~ò¾÷½/8søøÇ?ŽÏÝ~;žõ¬«M䣖Ã%’j¹®»îº¢Cþw=ߤöÇã1®¸â \yŸá†ð‰O|¿ök¿†Ï}îsá;ozÓ›pÇwà7ã70äB„ßÿŠWúõ×_¿†ÞS‘<”…·p„aòdK:#«î™ª¬”^4R—Š–D1ê*KÆ’hIt¥q%SvHzk@¾1cõÉ>]ªg"¹µgö\E¡¶‰_ôš”K;Ó'Ò¨é.G†¤baÏ¡—`i’¥(Îx³Ækä9©Ü”vn2™Žâ<1Ü2,ójpö†a+0Çj3áQƒ¯1|¤â‡v!Mjé%©Ù‚m$íJãœÇheCƒX¡dÔR½Ù’öð ©ãóJ¹£°±Oå§}Ô!|'Z‘`\«:~Uc²s_›íãÛ ¯b\ÿ¿mῲÄíw/Ðr ƒÉ#€;`ÑQw4L¥ºè,:«ÊV40â,-¦Å^‘K~TF á;/ãêË‹£ª+,¹Â|Y…LC¥@3D(;)%Q G$P:N‘wôJtï~÷»³wü¿ßþvüöoÿvñœ””¨Îaçà7t-µ[³& p•_VV¶>Í&ƒ&7ÀÒ½ò¸’רUöVz«œGÜj ¬›An‹•š ²Q¿åøÆD†ßµtt³ÄS_äßÄbeÀïaðçåd¸Ê ¥ù'Y[7˪ÁwQZZLà q…=T¨j‚kY#¾ UU£o£›^Š}•ðù{ÎâÚ«Fxùs¶qüPµ1ß¹ßeû?«¢Á ®¢>_ú®ÿ\EäÒöýŸQíRõÔƒäfË^~õÌãì¼é‘ò LG½´j¨•'Jb"ºkSí*¨zváP¶ ŸI×G#?ò‘à«_ýjÖüàñõTK®Ø%ЍCýERlב£Ggkä’…ˆ×å—_Ž·¼å-ÙW?ö±á濹99ëÙÿ)•‚Ž;†¼Õ¹g¥Xeß[“«H&Ê"–U'Ö½ÄÎóÈ”4Gòq­X¨m!E?&€”±g*Fï]8› ˆ!3†‰í%C£ÅŠª9bß?S®)‰äl>ÌÑºà’­[¢Ç¹¤ ^š_"VµKÝ?{¾qH2¨ãS–Le—Z8Éü·v`æ¤>-#v‘XB‘²]‹$ï%P$> y’Ç&{#Q¬mцùaýLýZ{@´ ´é™ô ÖÞõ{ !†3–J¢TJN×¾»£R& c×–p‹ëDÒOªÿ²õÎ0ÖH9@ÛÔ¡÷fÕÑÖàÙíÃ`ÃÉêAzÄz37ùØM IDAT5Sã8·È)ਪP&è&ඇ¶ð¿¾¸‹ízŽýîÃøî§o¡ù׿‰]LØšæ íúôÛ¼­qnÞ`¶ìùâ+J&»Þc;ØQÆ5JröÞk¿3üç”Aª1ñàoLï|ç;W^y¥iób±ÀM7¾»¿kd÷|I&™Z¬][´“¦q¾·cüÌÿGßó=߃§>õ©Ù÷ßùÎwõÏt÷޼òyPGjÁQ‹pqqÕßj’ù>ñó  ‰Ù.|áY¢Þ[9ZvÈl?G )CÈ=€ÌO~†]#¥go bœM\‚Y+~Ì c7õÂsØ.úf)ÕO¡•qbŽ}â¨r…ã¢ÅîýÅ!’͸±/±v¦ž ÇDi,Tܲr ìì[ÒNÝ›ã:¦}$+§Ä °'»6¨¹§txŸ0_âßÓÀ–Åê>ë÷fcG±¯9q>Þ–YEbÆãºã­™%ÐQ÷ñ£œ¥zûáÜ©« ÀËQ2Xù'?0œlt Åʯ±O})†0¬¬ßÃËì:L<+çÏb½Y|k[ä`Ìbß]ø&pfÕW¾?T¤ª‚Ô°Þ韥5w7N¹‹¬âÜÊS€’D'¨&¨Æ‡P“àèTðà¬L”JÔGoÁ}‹9¼ã,žqÑi|ç¦x±Üú•9î>Ñ¢íä1GÊBŽLk´md’ËÔ×`Þ`&Y9 $Yj)AÍÊêDÖ]wÝ…|ä#¨ëo{ÛÛðêW¿Ú Ñoºé=xÃÞèÒÔù¶z}nDÖg®“]ñŠ\žùÌgâË_þ²ùÕ¿ð…<* 1²IþjP³y¥4íª$˜`uºn«•¬•ê\ñŒâ¿eó1-0›ÉÚçbþ2ãW¶ƒ*·s]?­-l”²\/›eC$Œ_ÏKˆ•iÞáÔ³yOÙÔ7iÉ)[‹mRÞå9Yo…ƒŒ’²™¯ÊE‹ ÷MÎþºf‚ Ø–lVB,ïèf’ª°€®úm5´¾‰NþÀ¤;|ÔÂé€fŒj¼"àø0oWçÍ©ªQ·ÀÓãøìC[øŸw̱?ßÃõÏÙÂõÏÙÁ“.lÔ®à±ãÑw¦ý7FÕçR iær¢Ô¿È#GQQ¯ÙMšh®¯‹^ò’—à)Oy ~ðд顇Â_üÅ_”Ç4Ùýg):.´hû9Ý>½ <ó™Ï̾ÿàƒbVè¯5ò´ï0Я(ô?†í¼ÔæôûXóy$å“f3)º ÚdìMj…¶ Ø$)IäïÓýÉî>`)õ7ÖØ3¤ÁÀ"ù“Ì¥äó&˔͗áµÌØ;Ô™`wœpð»ÉøéŒ¦þ’T±-IÙ]ž-§Ha¬ÅÔû¦`o&-^‹Ìn­õvî {d™ ›†¶;`)Îum«yÿ¥)~)ökžÚÆðü.Ø ÙÐì,n칸vØRDÚ~ ¥îÓòÐf-0ÌDÖR/!Äq§$Ì=©KÝßzg<¬ežïÖŒ¦‡q’áïîªñ??ÓfÿÜ)®Î®¼x„qƒÇ„c[ã*0ËU…“þQ²Ò‡“X2ðbêwð)e l&=ÇT€½½=¼ÿýïüø¿Áë^÷º¬]ïxÇ;’h1–bºÑ§è̱>Ì+Œ*¤TUù&…Ïa!:~üø`‰r[T§Ú·¨ ÈÊñètx’!a /Øih–¨ô¢$éÞX½På>Quiô®^Ùe…]9Å÷ûT"$™y]^ÔØ³ê]ÿ•ŽŒ©m?O£òT:¶þ¹¬SŬÒè.UË¡O’4erŸvWßÏœ÷èrëÚ'‡u é\a]zŒ)QS6\õªŒÞÛ¿o_Ž¥Gö?“¤.oË調l9&>‡c bÒäl ìêû’X oCljÎú™PN‘“õ†}ªaJJ>½ëѪ|À:M¬Ÿ¥K…Ѿc¹ÉqH´ƒP^@,EÛá`«!=îlÀ ÜpaÍÔ)v¬jß¶ôK£¾tãK0Pe Q}‚ð9³n°«Z0çì=¸P>cá¾ÿ8ÁŸ¨5uÈ©V+Ó¦¦—l~?]À˜Üuý†z€h‹nµÊZæÔ‰P5cLv.À):ŒOÞÃøø—ÏbRÏð²3Áø·‡ðü«¦8~¨rGÑ6o~ƒ<útD`Tй.wJ†Ï#‰²Ó4²rè”›”s³’,ÈøÀpöìY\uÕU¸öÚ<õ©OÅ _øBÓ®/|á øØ-·$Qp’ÒõóóÔ[1Ïj›qVîï¸ãŽìë^x!Æ“qV+¬Ú¡'*¤€Ÿä³°O†± (ÉJ 9Éf9ìhl«|²èd½ @:>2”5Ã8§Ae:$Y6…c,ø©D–̹%ȱ¼dbƒÖ¨¤„6c’ŒÖÙ­@†¯IŒV;© OÊ=ïÎK¿ÏÓú2:†Éœ$™X@XšÝ¤Ù“Üþ%E_–À‚’T_D2â!có à±€NMʈ6 Ò`ÍMÄ‹¤Pw”‚l1N0 {NlYÊ*’ÔDg©$‡9fªnb" ”b³ >™/ç‡rÏP}RD¼JŠ.•^g´šŒkàäþ°GÌSiýŽvÒŽblM'˜Uà«{âÃ_®ñ¡ÏžÅƒgÎá9WVøáìà'þݼè[¸øHý¯âÔÇ?£I‘ï9Ù¡sÙÆWW‘dµêT¹N%¸ñÆÝîüÇÍï^ÿú×€gïÄÚã&2Ðø kuC÷Ö‹DÉ¡?íiOÛôII TèFª‘–ß,u¾+ª½Iýv…þ™Èú:2`s~ln…2ÝJŒ…ò‰ÞUõ¿Ô™§(a*öð° îb-YŽ…ð:é­rý2EЯ»E« º gZ»pp2d¥ãk2Œ©(b<N 4# LËÇ›‡{¨Ü72lP”³àg`nTü]®¬W\78º(by¤¨ÍVX†WtG3ìO´hQ>:ÇÂèº- ê­c4Öë §ÙŠzÍñºwD¬QñD“c¾¬‚èÉx<Âht {]‹Ï>4Çíìá’CÀe‡:<ëÒ&Í{ûÞF©ýGµŒN½~ú¸éÞDvèIä®E-§þ‰O|_üâ±½½n¸ÁŒá÷}ß÷áòË/Ç=÷ܾõá_ýê]¸âŠ+6tê!–̻ΩïžÛÅí·ßž}ÿõ¯ýf;s“IpêXïÔñ wê8/§Ž‡áÔñœ:Îש§»*¬À÷ldÅRt´Û©ãá;u`°t>N}ØÛÖxÁð®u`Ê 5§S×e®5¶¢,è£éÔñH:ŠN}øüú]­îãoºS_ÓkõÐSæ2#Vÿ³®ëÙÚh<…€pdÊ8»Ì5ÌYó¶² 2G°l§Ãé½ó¶ *i͈ÑT@]U¨i `Œ%w¸ãä)l5s?´ƒGÛ—ë#eÚ{¢›º¢PkÙš ÷p— 05%,b›x3øÝù«^õ*loo~à^i‰ðš×¼o~ó›Í¿ë]ïÂ/þÒ/*©Œy)0—ie&Ë6d?åÌ23rÏûÕ_ýUC,O~ò“qÝu×* c'´ó/1»eô[Pª`‰jXJKT¤"³IÍËý>²BÁªo)%9óSÊ„çR$iSüLªZ§n$cš3 æ¦dÕîÖG³ö]2.Òm #¿£˜ÂH)Ë¡ ¸fäHqÀ+¦·¤1†™-¡i˸Í4O» ¿4‘u´%î1=;h0AJZc-iɨإµ ]³³/$Ôgö±Cs'owÙ&,ZÙ[ 5(éORBI–:£VhŸ&½OÊph×}BI³6¥6ÕÑdxò•O«8'ÉŽ0(03†ûÃóÞ¡[¥#Ь€„è˜]1ŸQÕý‡Æ5€eùÁ½þ¹MQo;Ìvç=Ë\‡„T?IÙvm…¯œ<‰ï¹¸`»Â‰]~ÔúåÔxΓ§Ø<¡uìt³%c¾ŒÂlI`©0 ¦-c¶ì^<íl~<­,cZ­~UQØ«7î¿ï^Ü|óÍ€×¾ö5J$ÆÃ?üêÆ[ßúV,‹p«?ýÓ?ÅÏþìÏâÐáC½Ð‚¨EˈŽxeEÒŠ(SDiÄ|@C‚ÿú§ž‰­9r¿ó¦7©Å]©É‘¬àk“ _IF4È-ö.  ÀĉäO¹ÚEÐŽ#:qb§\EQÔ…„ú{“¢¨dqT­žNÓçö¢à…ÿ½~×à´j”RXb5H©C¥C"Z ƒ¢‚8Y2”Ò]É3DQ®Ó=Õ){±ÐTÍ™@æˆ; R c}[Xñ ª®¡ÿŽ[±5Óè˜%Jrú3ãÚÖ#‚”*¨‘‘[…ö$*Ðð\ªì>K&ƒ‘Éì;”I´Ø^ì£øõP6¢^Ž™R±D7HÄ*µ;ãJ¹‹ ûHJñD ¥tª‰{×’Ë®EùƒÀª:Ò¢¤Š°¾‹œÉ½è0%ʤ58kûq­TJ•Pv£©®Cð'JÎØ¯^™ÏÿŽˆO•H¨ŸëDý†.þL29Ùð<Š jFüIÄ I^RR·BöÜ|\!¹µj0U A>ÌJ®ÎÃû éŽÜ2æ‹D–4Y“²Ž´¨‚¦fì/4ÀŒÂBduór«u3Â×ÎÚ¶Å“/ÅÎD;ó>…þÂgLqh¼‡ÎíâÜþ ³Å ]7CM3Ïqñ¡%î9±‹…¶'½ÒÚ¡i‡qÃa‘¨«ÔÆ-IÎ4*b8B’€$ÖdÅ,Œÿò_Þ‹®ëpíµ×⪫®ŠˆbõÜ#Gâû_ñýæ]÷ööð'ò'nAR ]Éþž±ÖÈ+ã'¶&‡&þ‡O~?õ¿ÿ~é—~1sæÿùÿ3žuõÕ̉tØ.‡€È9Øßb‰t] ‡\NÑ£ñ~èÑξÿÙêùIеMòÁ‘8ÅeòDës,Uë&1‡wAv\-î "ßÙ ˆþÙ·‡ób\ ÞðŸçˆ6=æPñžÄ%¶ÙƒbUù l‘Ö jÚj°B³‡çrXà b:AÑ÷Ÿqï-­“9ô#Ü2OâÄÓúøh!…šgEd";š„œœ±uO\NO(·KÖä7öØ^@‰D8 M,³bʇàÇïÒÝÛˆr°jíçpÚÆÙ–š—Þ.YãÜ­> C6ü8ÿY1kE$ bEnåúlJA¦ÿõ‰ ?þ®¯9!ê †8´‹ý¼ D_∰üzè§<¤»(‚%?î¡{˜ã‰‚ð3}JEº*ÑX 1UèG>/.wIÈb0ÌE­vèm×bwY›õX2Ðv´Vu† ˜Žûˆ¦ßÝJ¶{×A@ø{UCê--%†Š1»*W[ d-µ9›{ÿFqnj R¨ÊÉ:*£õõÕt,DjÿCä"²Áø•jûRÆ,ÈuõAœ€ U„ê§+K¹ëùöE¤\³Ïêâ2X×NÉzŠsCÊ…ál½‘UmÍVòßdˆE6¨ÿJ¡¥HnoæC RÒ" Œä}/¥5Gò÷Déô 4°"8)¾cŠ•ÉçVÚúj‡þ0w¶]×a¿>†%Lêþ‘³vµ?ïu\ã†1®íˆH®®$d±šª—&íÓñêûU{ÚÃÅǧ5À¢}dïQUÀ5ß1Á×ÏœÁ²ž`gk T*=#*Ò'T‚ ¡Þu„i’jÓzä#¸þê¯þ 'NœÀ¥—^Šë®»någ¯¹æ<ûÙÏÆ§?ýéð³¯}ík¸ùæ›ñÒ—¾ôQk“¯ç¯º|{_ñŠWà¹Ï}.®ƒëÛáz¬)—~ë« ›ê#Ÿ(C2n=_q©¸nûRSŒ`:–­<‡N´]…Ù²÷•3†£ÔÒÔjÓ™&R@¡GæA‰€£Û„¯Rn"AãüG~äGPû£° #]‡}ík_k:Ða{ÉK^2ØšX_.òë§ú§QUf³–Ë%.<~—\z).½ôR\vÙe¸ì²Ë°½³ëÉ,W’¾ÔE¸á`r%ð ÈA\êÅHÕ;‡Bù g’¶’ B*M¸W¬²¯’{Õöl„žÄù ”–z•Xë&ÄšbÄmJ/‰ðüÖZ[WÍ Meúw)¸*[/ݘ’ú-©ïhÛI!\«Àjƒ]»BîRÌT.!àÈn¿c%*±%–¤MéÝÌD¬ ”ît:˜…ö­¸dŽ=U-›ºÊ¾í0fðµd|$bJs8üæþË×çÓqIª¹”«ÑGîß+à.ÄÊØ®ê>3ô%#.ØÙÆã„ ßäRŠÊd-·èº2ÞBÅ#“Meê‡W$Žx…Ðv„QÝߺ“0·ì¤àÌè¸òÒmÜw†±hùGk•l,ZBË5ö—ö—•IƒTî¸Zí²~@zíõh¢^ÍÕcb9KPé9í­l±0Þ¤ÅÝ>ó™Ï೟ý,š¦Á«_ýjÃi. À£7.ÂË_örüΛބ‡Nœï|ë­·â¶ÛnÃ5×\mü#„%8g&~rýøë^‡‹.º8I`*­f¡P£#•ÆÒ 4 •Â)Ð4ÇçSUýbÅpæ'kPR‚B `Šk|\ )ÑhÜ++'§N¸L 96¬x¯dyT¨m!’ ²$êvK‚ …&µd ˆS\µk½O ˜Ž‹½V9SoADŸ¹ù«†@Ôƒé\G²BêÛ 0;ß)Ú¹u×"¦ÅÁÅÜOÒI0w¨ cÒ£wÜËNlûÝyzÄ%´Û!˜¥I!Rj«î7PŽ"‘*0¹eýœÙ± Ó¸€ª+Ék†Þ[¤|ÊÀì^ 0,´RVSÒJ‘€iÝø£Hà$²bœ7vèkgËXHƒ=Ù¤e9;·w‘¾¦^WÀ¨l,„Š88Á cgÌ8=«]š´ˆ€š´ÜÅS,0m€­fõhŠ}zóå£#±Ú±àö»çxñ3&øì=»ØŸPƨªfåýE€i‡EG!µnÎ2+mêGãzÿûßår‰§<å)øßøóþþ/ÿò/ÚÕ¶mñÞ÷¾?ó3?s€\:¸®ƒëàú¼6bŠ‹µ¥Bt@ý‘µ®c´õ6ÚI_;=:œ:•ê SHU³ô©õÓ{µq”'÷[#Ƥœ^D"€¤Ã¸mqÙÑ1î>Yá_Nv¸çÄ 'ÎuÚî\@¸çd‹e7Æ5—2NÎÎàd»Sí6ªzØ©7µ "Áþ¢‰µK•ᎩÒ2"ü3GKè}×uxßûÞø¡ú!\}õ5HV&š³ H¯yíkðë¿öëæÞ÷¾÷á?þÇŸÆd2Y 2$c¥zùéDå¨3¿»fБ¼î\Ú”fŒR·5•Mào^H9¥LÁ1æ%`,ÒK @l¦Ô–1[‘¤°— ¨Têš7V6jæÙé³Tz:}´ä©kûr”iŠÎX gŒôtJIì²IR©9©Ž”Ä™©.*ZÛ(½ùÉ{Ý@o }®È>—جÖi–½!Ô¨/3]„AÞ½¹g5|+­å¦ÓT3 †¹u0KæP«eŠÇhF:¦Yìd¨“‡L7§EsµLt”ÙÆÊ/gQroš$Ù&}]˜YÐq ¦2Ù°Õ¬9³)4þ€0[VG¶:LFÜ£ÈC͆QW„ÛþeŽ[ïœãþÓÝ£áçf‚OÝÕⲋ.ÄõϹWïSý«R¾£š±ì*óÎ:åΣcÎ4~EØf€©NGjÀJHãæ›oÆý÷ßÑh„W¾ò•}= 1ƒ$°º¿¯xÅ+pøðaó.§NÂ?øÁ@Ðc‚± KäBO¡5Á‘ ÆhO¦)Û‚v¹®Í¥Ù!ñz… y´Þ¸’˜dÝ&(iFDBI$‚D¦¾7c®/íÙI8ÓgCb£ä/fEg9Sxâ XýzŽ’”‘ø‚Ã0'úÓ¬•ÉX©¸¶y²CâÛ«Íz¼d©’‹ D žT‡Y"ñH³e%ýšj±§çˆ£-0¬$/‰&z”%µZÖˆ2±_&’'yYN#ÌÑŽÙ—ÏRpF&ÁkÔÏñ»6°‘+õÀP+]­í%Ò"ű³úéÈ€4ùk a-ç©Ç/ì<ÄÈÇ~"S‚!:ñì5,bIÉô¿Ÿ©}LßfMÞ$ÉýØô§²—h¯ (ÐøïGa«HˆÄõí`C°£mŒ%žæ ä.¢$‚%H¥ ž<(¬#%õ?GÞæœã@=‡6tè±MNX-ÄZ«ØƒW:a´‹û³ýॻò T›-é¨ù?.½~v¿îëÑouýŸi‡­1c2ªÐvJJ.ªäNýö»çxß-gðÅ{çX.—Aï\3uÓQ‡ ¶[ÔÞÁ“"¼[.—èÚÖj8+cœŒ_ă3aPäpÎûºë®Ã±cÇ”Ò¾Š…‰9°ùÉ=Nñ¯úìÝo¼ñ&79"ƒ™×íölv¼FÂ/ÖÕÔ¤EDQ[½l lf`ŽÚÄžÝËÙ ¯ Ã}Ø­P›g¬ ~DI’ú D;NÎõê=ý”$dA¬]b+~AaCªåÏæ1AÏ;eF‹I`ñRã˜m½®§eVë¢Z|[™y§Åb%”^7Ä6)v¯¸˜ÄÍk}ïÄN¢$µ Æ8‘fÍ2§Ö(¥Í®gÏ~‡ÈfLx&Âê¬Xø‚“÷s Ñ^b¿¸çxG¨ð2œ¾Bd XÄ´v:'Ò¬^;Ñ×lcúþ å|ÿë`R;5Å’Ælðþ¬Ú%Êi¹`Åö3…vÏFhy½}†=ØM C1SÆ€†E;c˜ ™ cphå|ÝúÀjޱHÖhrÿþ~¼Õ©¬rž–Wõv`Ö…ÄD1ÈAe“À\§¥•7M¹ûãD"ÉñV¹&E±Ù1–í'Î-ÐŒjÁî2w¬u%Ø™t7}zú¢Ã-&µ8”<¡e²ëÙâ:î [–Lhgµ[´‡„ÐÔ5žpAƒ¦¡H=é^ºs­c ë[L:±gA*Y ³céµÜYUÕâ‚CŒ%÷ï_U‚íIÿïsó‹¶²èlŸp?ÛÝÛÇbg¡¨B£±õÇy‹ËëpHwö?¼íZE4ý IDAT¶Ûð©O} ð?ð*‹ðñˆ&u¼ Šv²ÿùþØàÝ7¾Û”¾ô¥/ác¿×¾àêg ŸÙÑ# 'DÖ°¹{íö©Þ¸Cðüâž³<ÖB*^,Û“eŽŠÇpHtÆØ#_ÕØqDŸ‹Í8+4mäš×§âñ¸ø<“ÅSÈiŸÖó3BÇÕ‚H)8§fRïW#,bSŒ¢»)k›ŸSH»“ÍØ(»ŠÀ`ÇXEÔ'º™ü.ÒÝ×ðÈS$4g}äÐðµKì'bˆNÞëu-œ!ŽGŸ4§{»†3^­áÇŸŒsÐ)ü`7ÄÆVêž”"|€øSvÔ6Ɖ,å±­-ľÖéàäw‰Ž(i¬®ß$¹|Þjkç $AÂlëIªpxÒ;å”Ù-œ©sŽõ̬FS÷Ž_|´$Ô;g.t€¤;Œÿuç‹,K€;·íP¡ëô0ªé¨ÆtD¸ð0ÐTc45õ2¬DÉEPWšŠÐ4„ɨASWhj¸>ý5ƒÉLmÓé>ûîwè`Ûhåô#Bºßyçøð‡? øÞïýÞGøâ¿8sèýèGñ¹Ï}ÏzÖ³V~÷Ì™3ÅŸŸU¾Ï‚SÐ-'d‰Ó{„¶ww`î9×+bŒj¨®ÐT‚ɨBE‚‚£‡*œn' ª¶rŽ›ÔâõûÖ[˜/ÙEW©›¡KZN“¥¢à­o}k®¾úê(è-™]G&³;$¼èE/Âïÿþïgmÿƒ?øüÞïý^¢™­:ñPñ½øúxÆÓŸ¡ÐÀïJFz1¦°È’H$öHDøú׿ž=ëܹsØÛÛÇÖÖ4ê +¶7£5Ë‘aÖ”Ÿi&Íô beËבËfÀ3ä°GjkFª¨©.q+¢éY)‘öŒT“–fUÌØYtyÌ¡k;óR¤dê‘ñ̲ԑ!º 3^QÅ•LFÇ ¹gˆî‚F|z¢#%oµÔzi ض[q³„>Äž$VW>ÓLO…¼õýÕùmF¹Öµf÷ÆÈt=‰ÔÈqL¬v¼?m`eX5«_°Cm/]÷-§«š“ˆ(ôà “]L>“š_(—a¤S±Q¶ W\ˆd ©H‘…þï™ ýœ-ì?#ÊÞÉ’Eya²²¬æ4 =%Œz®¯­±!%G2g7DSÉ’"”Q³­°¡¤~šÅ~AäHÛ§ éz Ál>‡Ô•ÓwÈ:…5÷“Cˆ“bTBvÀ˱.Ú^o|ÑQR?‰hÔ0ÆÜEpôpz\öZv hf2”©LŒ9"Œ³¦;‡'8;ëÜÏžXëS·m‹“gÎõàB¥­ø_­f³«G’3¦¿þÿþû·î}Ç?ß\/A?ØW#Ù˜´(?EVrÏß…]TlûG?úQÜü77;Áï€bÅSøª=úúËþ%^ü¢ÀŽ=.V<“’vžQδçw‡0>ôWU|Þ>ðçø±ý1SW”@5Ç…”ayD¬'~âÈ”¥Ïúß³¢gÔÔ/&±ÞÇ^ŠJSÓòóÔƒ«ÔïØM^]‹KÚt5蘇’ böÅ'j²ºÖêÉÏÈQ´²W‘XfiE¶}cX¸tРÇVµºk[<ðÀý¸í¶Ûð»¿÷{øû¿ÿûb;o½õVœ={‡B]Õ˜N§Šÿ[S»B¡’U@¥û]ÖÔY%Ùy›èeŽû$8ÀR7­.kØÄÀkì±'–ЊuÉAþ~ÕÙ+%´C¯šj›R^“¤ý"«ª©2dkÃõ^0Q°ºQ‰&ågš3ýÑ{R¦°…EÑ;>Êû-¯6jöZD‡ÖôG HY7XY`‘<ý(I…€4ÙÍÛõKEIQógv”xq„sFNÈ1 Ù ÿSç ”ùPï…¾J35T¨¡ ‚Tº…oFøÃ?üÃ_Ê >ùÉOJ×m~¶»m[œ={Ÿ¾óþar°u1®8&¸ïaI¿ô¤‰ÇAÈ­uU… bæ¡^DÂïæu°Ê.2[v•û{ÿ½ã‡–8³ß€™6rÄ&…Q÷HvY•r ¼3;¾û Ƨî!Ì;¹/ OkîÆ«þíQ9rDé_ÿøÿˆ7¾ñk?÷²—½ ¿þ뿾ñ˜½ç=ïÁ[Þò–óªÍ¼ùÍoÆE]„ŸüÉŸ<ïºÎÕW_w¼ãçõ'Nàúë¯Xu¤ç?ÿùÅ2ÂÁup\×ãåªëÏ{Þóh­CoÛ.a¦‰) 1j5@×¶8uú4>yo…O5/ÆxkO¿HpÛýt^g)Àýî¾¢UIF¾ß¹÷»ú–ÉñÈÜ÷èv‹sóz#‡^öׂéH0ªó¶wÐãZÐT½¤+£O,™z5óøî' >}_ÿùÝ;?'ÉÝøÿf„‹/¾uU¹HS³„™b •Ãõ$ZÃ¥½‰E]§Pò¡„åKÕÓKuÔ(J£t”ö†—Ó W›g-–J’1}iS 7 SÈrI­NW%Õkä¬l(0Lm ã»æ#eÔP4;+±5T-SIRV˜ËرÄÖÇK°©àOq·¯jƒ”ˆN”øæÊœ]J™O§ŒÓïª+‹Ý'-+Ñu5­¥ÁѲ­©L(ã¾gÝö\šU«Ó%5éŒ)L÷GR»]kbZå°¬ÚÛ—ïisáÔ\ÆuXú×ÎÝ|tȤ̋ x¥¥£ ]zg*Õº矒šÔÁ†$L‰%ÿ%’ YËüDu7nš&s胠¸²>F.¸Á^tdë"mȉ®p(ߨi¨«ù]¶_«»‚„pg€J ±" Ún³”¤§oõŽß/Öµ•© ¨Ç‚QGhê^>µíMÝ;t–ž£~oYa¹¯Žâ¹›:·‡Sg'¸è"ÉŽ7­Ð\°}¿âKéØÅðQ )S©¤ôXWQDf(¥5Í“eÃÇYL¾tà."+úOÖ P$µbY‘I-ý|íwÿ†nüEÞ†£g"“’ð‹”^(ÌŽ—.…r¬é†<½)«¾#é8YmYR>Z4ø„ÒQ¬¬+eÐÔeP(4èu)ödžö…AÙhÅ_ñs)±+·ØtVñýdh5X±tˆ`MR½Õ #aô[é…sæm×õàšªF…þ wEkÛç0£ÕŸª×Ï–õJ¦1jÆ¡±8r§tJÀöH0w¢+µ«óÏÛ~—¾ëøæ›J0n»û}ºŸ Üã»<ÁÙníH“òå¦ÈdQHvI¸˜Io9ÌÎJ—dÄrt›‚”¨œ„(=m$È{U&5BæÙI`å'!éZ³¯( ÊiMrÊo2»ãˆ V ²¬ÀŸéÁ.DiíÊ"ˆì{²‰M åêï¢d-ˆUâŽZ½«{½ã”TPi)׃ÔäŒß2œ2žÐ‚²öŠäècƒ‡’è¤dŸ®X2H g òñhaê§ôÝüZ¢>o@†õlÆJª–ôà@ÝÏÚ…13"gyiQNº9!‰k¤Ÿ9¦fªN4HÂIžÙæU÷¤9愚 I@çK'['t³Ô»ªÏ@Iù€Ð'»ž«Ÿ'¬4 \šôSȬP8¹cEB”Ŧó°'m(êÈÔçÉ‚PM6'>#Ø´ZSH(…õ…,A–…ÖÚzƒAŠ’+èÉ#â 3ݬ³š‡Tæc…Lx³r÷ ²Rþ±§zd,æ ìî/0>,¸ä`Ò—ìH8K®SžÆ°sÿo»žôE1:–÷éçè;lẩ€ýEÙ2º"Ž|Ù·sTK0”š®ã8WÐv=í¨ÐÒ’PŒj Á¢ªÑ1£®"Ó%h QØ€¹2ùR«W,RÀi#THî¨sϱÁ[¼sCJÆ2ÆVˆd9ì(`•DýndœÝqÜ9 %ß5K¤ÇäF”ÄAõZá""ÐHR²›d­Šäü*…«ƒ¢(¢á.D3K™b²“äÝ% T›2v²ät‰(‡Ç¡_Ô‰1òÍá%A¿F"¿$ÓáÚá»Â#ü½uÑÛÕȸÈòik&>*í»E³ Æ£aO- ™ÕÉ•‚do–Á(‘Ô¤Ÿe]²‰U–ÃTc¨«Ø„4+–H†aD#±ö"“Ñ~×"7ùÙ; m šï]³ž‰ÃöO5Ö)KI{’À昘qŽkvA‹=•8…”-ó„ùP#̃û4§<_zd1àÂc, úÅŒ²O³.0åï %5ßÅT©5›ƒ8/H„ù®6l6`°b 'žÔ¯Ùrª‚¹?W=o;œÕXnõ/ujF˜4Àáºwd:šì¼3g Gjâ@SWý.ØÛxÇÀ¼íÏ–/:¼íIgÒ€,›g"¦AՙЏÓxÎÎj‡`Ùõ kjàФE'„CŽþu\÷ô³cæ-EÇèÞ¥©ª gÏía¹¨0jšÁTÔÊtË飕ìP’ëòµA )ÞUíUÙäAõAíáòÁ†Ù쌭NVæñÖ§ÖS_CùÌ<½6\dJÉ÷禩|)ÐnjG^ê®xÇÎ0…I)u´cù½×µ hÜËŠôå£r‰ Ì¥áa‘‚ÍK©„"å²ÊPŠºÈŠ(«ÆkðÖ/"2ÄŒX.Å UÛdÕœ –iDV08JIÓ]Ö–‡«eå¯%‘5eÍt¬ecÛvèæèlIæ1¦Ü¥c>: Ô„ûöí¹^"ÕG:éÃ+b§¾]¹(µ"Šu¶59G:Œ`Rã¦Ou{Ð\Çý.yÑõìs]GÎ);=u÷Y½Ìt Ì;BË=]í¼ëîBР2>õ±ì§gM,-¨¥‹ a/ 2[¼hñÀ™æË[!º¥XKå&åaὟ“‚ÞRL –Q„ ú%€)Èz0Ž× Y RIº0‘X ß YTÒi¬‚üj hHzìQ‘$¤RÓÒ¦9бúAúÌ Þ¶q6J–¬´d’Â'±`›`nPr6`S{Q ÌPåÓnA>9¨*O›àB× j2rvÉå:¥Y©0è‡a âLJ3£ò)šÑ h4Õ…¥4[fA}úw2€–+ÎÙΠ¾hjî6žÛ òu†#ºM¦Q62 =: £L™Û,Qžeñ[ .ÞÐáÕݲ&åži„ëu]ãðÖW/ïÆ¹³ÿ‚3gÏá_NÎq¢=ŠCÓ˜ «¦¨š ªñêÑT@u òG·€ãl#ªª@UªšþïT)ãÔ)V›R%r;ýªwü#÷§NúÓÛQSõ¶šÞé7UŸY×} ჌N€¥sú>[°èú @Bú’búý=gKAÓí¢Y܇F¶{Á¦à2Dò+ìЋøNIx$«vÊÀJ ÒðŽ jYöá¨^Ölᥠꊊ˻$Yñ²’ÿ¹Ü²2{"kûquÏËÚ~’ÁÍÝJY=’ÒÎB Cc ÙŽl§-Cö½ÂúÃv´ÆNV§dÖ¤,d3°Tq7¶nnc=z©,·Šg\Vd—m5²®`{²"ã&+³>+±iVr¯úZ;Ê„ÈÓç¹0¬^Æ6ÊZ­vèªÞ@(òfö½ª°=áªöv±‹ÓÍ)œÞÝà F;g´-°hËUì¢>3DˆP=ƨšêfõ´«UÝôä$šþçÕÔL]€Ð ªGhGcp3F[WX¸­u/•GY Ôk®£ªP¨ªº?çJÒø:žòeQ l€QÕãFuÌ>t\vXpÿ9àÔ>áŠcŒ'ÞÇ¥—ÂöÖ(ö‡¯¨øP×q¥iÆÊ`h#pK©ƒQ¤ UŠn0Ídi )Ý¡{ ‹¡" CAVcX@‰~›¡A´ÐMý|‹VŠ`6;(A홬Sj#)–“‰ˆS¢ RÀP‹T?ŠBIŽj ŒQCS3RaW*†ÖRÉßôQRÿNSÏz;L<”‘° ›eb‹›šæ7¡#…<ÒÒȺÝg©Tµ}‰ÉªD¥Á¸û/47ÔJÉØ ,'Œe’!™1Ådê3Bšr—ä h:Ù(§q†aQ À~’©sY»Kv‡’˜rbߟš&Xƒ6žC·AÔZÕöÈP§l]ƒí(TƒuV'Ëy:[C=“°6ì†k"Íz›PIQ"É3X0P™¥Ä E›¿3 Ð4»¡fª:–k×/ý9M±ûpkèzGƪP®1LQ7#lïlc{{O˜ïáäéc ´Ø" (Ô*ªÂ¸í í Ò΀n éöžƒööQÉàà%0šJ¤¨+ê~Ýô;úºàvõÔ{Uª€•#V\´ŒNjH=×ÛàÑdt²}!ªÉáþϸ |z]ËéÞr A T#H5êQÏí^7‘®V¬Z"3prñà^oÇÁ•ÓKpì‚ 05Š6SÓujÙ^¸x0Y2ÐK? œ “¯GÍx9Äå %*7õÒ%Èâ;¬ùÓ°”h‰G#+˜0"dC 2`ªD ÈÄ\0d@M^ÎRÑ rô`?ýÝ{MUIÆFÖ÷O‚*ójñšÕ€Â¢ ÅÇHPlÅklCèe5D­uíiClÇ;õÞJ‰SžZ“Yý%A™G§ ª·#¨2.xè‡EÙ:01^KŒØK–†åH¬C-It²·MÊvûë Î,þ 7—*EßLÉžVäÑø¯‰ ®§øŒÄÍû[ÜŽ™U©g¸2¢Ÿzä$ÉøéözQ”7ü¥@›ê…”ÓŒòªÚb)‘à53^Q; •qÜ4ËõÔ°° L3êFQTÆ„©ˆ€E :݃ãLÝ…D_Y•,“ NÂÈ©r™%²Sj‰ß„TÔ¼°á†ˆkl:o6tè…c?IÎÃRÝ4¨ê£¦AÓ4¸ê¢}lã« i1ªýÎhª£Ñ(8M¡"BU 2‚H¤«®b  ²´«é1/¡,ÔÏÒ³D`™CäX¾Z²¬ Òƒü:î°\¶Nf•°”\ÑÕ[@³Œ¶€ñ¨ªÀÄàŽÑuŒeÛŸ¿_òpâä¤9ŒÉ䦓“ɤÃt󹤕éèMP,IŠ[Ú€RÊàʬ˜6—óI]äXe0PÎ#)­d ÿJiÏác®²º„µn¼×œÅ_ŸËF+Óë²â”¿lÐײÂÒòņ@Ç!ÈÙJ¹ÙéñU,20ž2œ—_kVC`*Eâ¡‚×|JVO•´Z ‘6»´†Óäu…€Õ‚²²bQ¬¬ð$Âçåu-].k”e~‡oø$CɾÖɹ–X êòßÏ §EäÅüUÄT[UUǸòIOÀ/»Øœß…û½wÄ1³FEÀ…£æq"l‡ˆ‚aŸÊ׋´ô"2,½› ÁÙ« À«¢qgÇ|"çú½Xסc £C‡Ž]ÕSÅò¢F%LG;¸¨™`4ÚVΜ̹î4ë›2#Q†|¥•ÇôJõ†kJ3U¦ã´aEw˜žñŒíy¢K€¹¨E°i<”À6« ,)@¥À¦—A¨xnÖð« `˜Jüa„”¼ŸdŒde¸f;ðÃVÀîê _‘å°„îÉ=Ég€LÉO00|€ Üÿÿö®=n‚ú¡ÒìIܹó Òù°¯z9;w>‰+ë³9)V$A ´þIbÓy¬%Š$¨Á` ëäA¯FªÿÞÿotpÂ|;’l/ÈÒZE­u!Ü«ëd=šci“X¹ÛY»Ê6åKßû¿ÊÅT·*]ƒæv©¹"ºŠ¢ç©&”ÍË=ªúÂr>ÉŽoÜÉ®qx“öšbN¢ÕÍ9é0WϾž/_Gü|i=ÅìçnMñfY>œúp)?è§™æÉW­Ù"¬ÌÀ&3oÒ1±Ayˆ ñصªšh‘âgNWÒZt¦bímÊç“£rýç§òÛžâ|d8çäsÝrg¿º——°¾Ï¼;Ñbù€Üv×|:FG¦–šy<âŠBÊû„3-ÌÚ r*­a¼SKÚ­gSMñ&Sv¢¬ bR¾3”–œ=­Í,ÀÛ_–énÁêN;†±rÞ*›ºl5ÔZ¦÷š£ Ëm*ëšã˱(k±ÅgI©½màÏžõ€U>ð.[É7`£jSÕÂ6÷³ªÙ±îX™ŸËǨ`‡R›M乕Ì.dª3‡ýÇ,°Fe¬.ñ”Ž;×7Ç4ð|sö –†âssvkœæ‡:änp ”ÈØ+^Òx¶åËOÒUheûØßq)§”v ðC»‹{ïf4ªHžt'\C”ÓTTÑúå<ÎZ —ºTò¼<À5.ŒFçú…mÍ Òûq]¡ÖùÇÎk”:‹òöâXŠ  ñÖ¼qŒ¨hùJ›˜:­zW6cAÓÆù`@‡^B¨º:qš²úBe-4kβU«Qî×þ•ˆâätVÏ5·=4MçFY; h Ñ"ÂïPœ Ã@ã82‘”òÇÒéÝÚÒ³¡ (ŠêSª}Ä>/]ÕœÊT]óis/­º — É>±øÛ$æbˆÀ3‹º…#ã‚ô°¤b‡¾nº”¼´ñjé©â½¶-Ö!Ú{ÕÒÐ+)äB tÆJ95dSéÙij厒_)zžYEÙBÛ+$»ZöÕ³iÖzœ¾ÎíΙúšÄÎzbz âPê)êX\·ÕSªÍî ˆ9F¨÷ÐÝ?Å1E'm…¾†°O5ñP÷°z>¸QöU—>]çÙ·£†2Áê°c: yB£—?¬žgÑ&$ø<·J(A$çÜVz¶åñ£Á 4 C Êã8Ò44mšišh'𧙿y¦ižÈ{O~öä½§ižiš&¦ú=p¢ž:*×6¦Ÿ“îQÔƒVþD4!ØwrýüšÛÊZã „¼¨ïÏ-S‰ ‹TÃ즕´¿ìx×nš8V6ô=Ÿê¶ ½ =¯¬$ñhÐÂØÉ=×ù_¨š‡#6ÜÚGGE!TöüÅèCjz†­üTâ:&}˜µ²çq~DbÒ!² âÏÂ3Gx˵ˆ~\¨ý˜ÎL8ôŸT÷›r¯C­rÞÙ‘{*ê½0t{1èß·‘ÏŠIDATè癈hÝ}C_×õÖ{ÿi߸'\Ù êôþA½;?Û“—V§¨VKã€C¹L‡¸’r+æžÐTøuA·)q#~sPW5ýWu¾\ÔI¹§îk•°pxñ½6¨SÔé-Aö‚:éAöƒº,}ÕºA êGïÚE5¨Ó;õÞ¤¸,¨‹AUy1y× ^yý«Ô…2ÏŽuu<ŽuL{SP×X­Ú÷’™ô1A=ú¿¬ëz+åØÜß߃ˆèññ‘ †ÏÐkÝþ [.ßý&>z@ÞïûO§]__7_(ñ˲,èt:åaß{öÆïþNpßhÎ _l¹üõ›p¼„ß~­Î9:N€–eY.ú+þééé =??Óº®Bør‡7{¯3|õw‘Ï<ÇÿĵÛ`ø—gF,:¬eY–«««õUdž»»»ŸÞûÿˆÈÛ6 ƒác]×õöæææ— …Á`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ûø ź1¢ƒIEND®B`‚stem-1.7.1/docs/_static/buttons/bug_tracker.png0000664000175000017500000006775213157571677022330 0ustar atagaratagar00000000000000‰PNG  IHDRôPï,‡ÆsRGB®ÎébKGDàààØNx pHYs  šœtIMEÝ;+Í< IDATxÚì}yœUűÿ·Ï]fV†]dpßPÜ¢â¾û4nOÄ-q1Íb|&æiÔgÌS£1—ÁhEpIeQdd†e€†™»uýþ8çtW÷ésgô—˜è›“ÏDfî½çöé®®ª®úÖ·€Ž«ãê¸:®Ž«ãê¸:®Ž«ãê¸:®Ž«ãê¸:®Ž«ãê¸:®Ž«ãê¸:®Ž«ãê¸:®Ž«ãê¸@´õ†÷Þ{ï˜t:ý"€tÇtu\WÇÕqu\××~e³Ùì‰tÐô¯dÐ-Z”Îd2"BMM ˆBˆv}3µÇSø|æë¼ß×3ªÏQ£¦ßz!êxÈÙ |‹æªcÙ¿9KØÞºº:!PRRR2bĈl» ú¢E‹Ò­­­™N:¡¢¢¢cF¿Åª«c_w\WÇÕáÂ}3®ææflß¾¥¥¥N£žt}(“É|mÆü«Om‡)úò3"ÚçÑuìÏŽgè¸:®o­ ‹oìó†6¹±±1ãúvÏþÃ{ï½w ýCŒ9ýS§Vü}ï?ëy¾búÍ»¾Î|Çâ} &ûÛ5ô-߇ÿ¶’ð/Ú³ "¼÷Þ{Ç´iÐÓéô‹555ßh%¾]ë×quxLÿm­ø7Ó¿§Ð‰où´tl»èUSSƒ¬^Ü HuxÇ×ÿíS[Çø†iXñJ<¿yKÕ±¡þ±ÓéÛèt{ z»ÑìW‡Iü§nVúçª'ê8t\ÿHy¹ùº¦3ÆF'ÝòLN¡€„¹„Hýѯ ð7ÞÁ§Á?®>+à¿Jú‹…Rð !ô{ÔÃQÌf ¿ 0‡ëÿ]íaÁ^'ë¹ýÁ3Á†¼dÞO¸ôƒfÑŸBýÅö'„€ 2_†9¯lÁÙs…Ÿ ¾Ó{8¶à‚Ú©¼Ø¬©/ÒãÁ}(:5Ö³Q0ô`íƒyãr%ˆËa0Ÿ|˜YˆLcØQ"´¬›75îl<.¹ä²àür¾NZ „ž›ô>p­©þ\d@ˆûêpÞ(²Oí½é˜'kkh<{ð‡`‡ïåãˆ!SXù&‡)·|GD䎢K< !ì ÙýqѽeìEç¼Ç鲸¹Ž_#=‘Öú[÷téC[?²bèe¶”εt’q?ÇBš 㿦‡zàòî ·®³ìëB rÎ_0|¸A[a)¢#Ê,^¦ÏC#è;‡)1íQddÙŠ»Ü]RT"#630¦ÁÈB!"öV É67«þâÞyõEì;öH”•U$Aäo,e%ŸœPPà ¥¹XÁ¦ÐšÔIcVe »B= A¨û¶7øŒT’*Âù¦‘¤Œ4 !S ŒQBD"S¹‰`l¤Aχ  õºZ€`<N(¢h„ Œ7Èú9E0/¤K°Í|ŽLcIú“Ôl謅 †MBH_~*IóÂ,A"ø{¸Ûµá$i?"–´6`ÂLÊ ö«Z+²´ Ó!Ú€ñ} ýùäï%ã߀äÃð`H?;šLc¡@–dèp0ÇOò*‚ulÉxdS1°{Kßi ÷(TØþ¸D°O”f-1a–J$˜’Sìµ`Ò¥ñÌþ„ªç€ Ö)xò@•rTŠÜÿ ˜‡‰Pž‚[Db²i˜¦ÔZ…V´ Ó”¤ÅàR;±Ú 1­!µý{¿~æJ2ù M©Æhû\§è=IC­‚† Ö3ÜLäòÝD(S¤,¸ p2ø¼?Å¡.‡:P˜FMon }&S ¡Ÿ!t†e°×CN"²øþxiÙ[R“Cü0š¸pß+N“mó &,…§g)tÜ öA `›…ÙÓü“6 j]‰„Vó2”á/qBl3+ŸHÈ`R£‚s2¼5R©r5! as=6®ýýQJWHò?÷ªÍ6…áòpA 3ß(HRB’È|nÉ¥Œì³”TFL[|(CÞL†O"Øü€e/q‡JI)|ÎWL\¡„ûš`ÉvìµB µCx²$¶¦J±1% B¥¾ÞX’¹Þl»«’ÜPê“xxcbþ6…‚žrÈòèÃ{ ÒF&!Š¿!¯Z› ¶¡¸ñdN e’âˆ;Ld¤´a1½cà ½ÄD>TòÌ1 Þà+˜Ê^‰„ôåR„nðäìJ¡r–¡Â g‡ÍK Pþ¬;"R¡W$¥¹¯¤v²%tM9`Ĥž˜?¹KÈðäÌ ¦H­y¿RêÈ] Èp‚ ç“É )'Ç×òÊÝ&fTI¨õRbæÜ1‡Ôÿ‹7?B*5î넉?¯ÄNôÚIÖN†ëÉŒ©àŽh wÃÈr}™—|#l£=Šœ••òRz2\¹ß󡌀ÍYpŸðà!ÇÂÖÅÖa,<Ji8ý¡žñ#[RRpf!u0츠æÔpÒ„ipÉ2ÐdF‹ "ØsÁŠ“r›ÔçùAÌåOøÛ+ÐMÂOèxÉÐèK'ÔöK9áF„„I8㱟‹Êsë¢Bì³Âð~ƒ‡ &fØžûáo¯NC¿+oÐFLè× CÆNeÊŒçÓ߯N¶ò0½&mà”‡*\ÁßV2$L‰¼‰ ,W›§¯¾ŸTøY {øÜ–÷H=fÁ¾B~$W>z!ø 7TäünŒÏv8É 51…O†wŽvàˆo$Š߈ ÙÉŠ‡.Ãy°ç×X}tg'xèÁé.rT†×oœ¸a[!&Ë2”¿`‘“€ÐNO¸53Vþ:J“mO NÚ “>y1_+ŽPc;æÁ„…§\cóß/õ±\™9canæ>3‚0£Gj/®¬K,  ÐQ…eŸŒK²c°^ ÉÓÄóÒðlͰ«}ê ç–‡•–ÒÊËŠ@›N·qZgz.t,)E‡ âçz2ÞPçjcÆäÞr”Á¡'ù‚É`™„á‹*Ý.ÍÓ;0œ0IdI#šFÆ\Ûë*‰Ü‰Ép)˜ JèH$’qH .‹ò)QÐ6S›N™>Iu¸€Þ †¥u®qp + £™P‹þÓd…{Ý´kÆÖV‡¯hš»íº+wbÉFdÇ¢x›"ÿÖÊ¡íPLk+-ÄÇsçâ¯Ï<‰s®˜Œ}Až­Sþ‹ÐŠ_¨¼¬ÀºÏ—á7·]‹ÚýÇ£ßÀAf¨Œ…uC'kŒ–…Ú òXa¾ÉÏuÃDi(“À!ÁÊ‚tÄÜ$a6¸óÚDR <Áwþ{¥Ê+I¥,¥3—„ì¶4rFÕἨgg,äk.Sèf!øJç§É–hð~ŽÔ5R !(†¤Y&iû©Bu*>Šñó¶ ¥Á‚!ã5¨G°0­ä…‘®ÐÀž ]ÁœÍÍA@0”‘TŠÐÈ¡’¾·’'6ÒJ”JGj;ù,„Ô¨wžè$±÷…Dß'†äƒÂ:È€PÉÕP‘Â’r5Oµî’‡WÃCG€5,_É5–['!'ÎF²Â €l=a(ɰ-\æCPœ2ÓD M(Iɪ*8Ð*tJ4š_CD¸›)­JV„¡úM¬DÂŽ0¼$fTõ¾6Aƒ¤!X/œ0f¸ ‡Úß/Báì03é{.£ ò!*|”PÃòñÐΧª\ÐcñT’)Á«7¨Ö¡ÆAD2€­þ<#‡2 ɬÜ2l°0,m ?´ü·ï„nÄýõ—p—pr¸C8ò¶\Í×H  `ð¨±hþßqì¹áy; ‘YL"9¯ÿï;[êV ~K#²ùª*$r©$€BA"›Ë#›ÍCJBýú/ðÈ/¦`ŸCÇëÍ-$óÂD¶ ‘ hؼÿø4íhƱ§­J’“‰€qøÀ ™4A;’!!S½éÖ¯s#L¦%º¡š¤Y;OD±ò ÜËØÈX"V½Å‹)¿È¹!ÔÌdæýØœ©·€À:¼§‘¯&B É-ŠäT5ðÎB€¸> Z¦™0’Y<7FÂ%Øl#Ï`V<Çy©ê û4¸ˆ£öõ<wPŽ‚T¥e`å˜îœ,™Ž»0h,™ "=å¬ ãžúNæ‡FDZr"Š­“7/Û"ã\£Huy ±å%v*Õ¥´Ü'a¡ºAÌ#c¿iü£4õ¡©£"ò  »4™1ˆØ¼Iæ$òrV¦|&Œ9°rß8Ëkuø0òӬ܎L ÀFE{z² ;ö‘6ÂF±Š*Ln:Œöž`{–ˆ"ï—dÚ)C?“ß ÀsdÈœ.~‘æ^éOöA•ü2m­fNB§ ®ßMÀŸyâРÊPÆ$ŠÓ‡´GEDqiþ"Ÿq 9¯=‹Þ{£:Œ…õ;W/_ŠWÿôÌœù6zU‡vJKK±rù ¬]· MÍjPù|Ù\H– [6oÇó¿£÷9ƒ÷ØË J!˨¾ñÜÿbGÓ8á<ôèUc†¿‰Š`OÈÚqEQÜ}×üšvªðr€_Úø,¡m²pR̬)þrT,؆š,P µV¡X_ô—b0Fç•|ÀŠâž­8ÐÆ=•Q§Î °¡¶îMñ2J6äÅö‹½æEõL±õ%÷V²†ùŠ“ã˜µ"û^Ôž Òî§!B¼¼Ä<#ž‘ÃA¬"÷Ü·µ.£óð%÷‹KVÛÔnTDæÚõ¸ûQ1»Eä0xEÖÕç»6Îm‡ŽÃú­;0|ÈÌõ ~qýD >µ{‚l. H&Fx<ôнºÔä»m) “É`áâeH$(/+EIi)dÂC>Ó¯,÷ç.ÀÎà;§üZw6¡±a êV-ÃÌ?=YÈC¤Ò|ЉØwÏѨîÔÕ^ v 3`:-Îç"dr ¤fJã¬t!î`ÝÚu˜0aššš¾’±¨ªªB÷]vA÷nݰ뮻¢¦woL˜0#GŽôAjð”V Ä(;m,³0ÄÉXìM“¬ØyªÀ‘ 7œJP²M^§’‚3¡d(yä†ÔÚ4 ‚ʫڨœ´†Ktâ‰X»ví×fÐùË_â”SOÕ¬|0±e¾Â“*o覱¼dƒ¥Ì´‘aD+Ðkªæ…Û\{¿òü3:סÐÒœ `¤F†ëBk&ƒóçã­·ßÆ[o½…Å‹Ǥ}8í°FÙ¢)p‚½¦q’BÀ„Y` Sî\3B„d&!u´Ê8l¬€´çD,MTb5/![aÍØ»%£OU¹e½7¤Ð *(öKüBYdôp¢h£Fá]p«æda‘n^ÕÁY Î@†L~¤gÌ@Ó+f:¡dW²<´&…!ÍjÈÐý-3×Ä(}Iv™Fù h‚lVƨ]ÕGîp…Ni¶»INÃI°:£/‡r7Ñß:/˜çNo3çÈu$ÑÌÔƒ“Äÿ%•H#ð°qóv|çÜ˰ÿøãñÐ]?ÂÅS.G¦i3¦>ó4v´d!@H$R ÂóàYœBA"_ $¼ JJÓÈçóðr9x‰„—€çµ ™JãÃùâ¥çþ²èѵzÔôÆn#÷Cu—]PÚ©ZP‚š>ý iÁX.ȨPÒÀ+iÀÏ4/+ M©+ù†ä ªÝ'ôíÛ-øÛ·cñ¢Oñècâ7Þp.Y=п@ss3êêêÐÐЀ¦¦&¬üüsõ¾G~û[ :guN>ù$têÔÄ‘y„Ui„¬D0¦?¡72q ”M[HÌ#g<ùZ«¸8߃ñFÁh™³TFX!ÜyC Pw¡³)( €’Z[[¿ÖYkkk€f·8¶ÕójÞrøEˆEõ”‘b”Ó¿ÛäíQ²’ô!Ú__bLx ™gæp¥Ýs…˜’öÿ|ï¯~…¹sçbÅŠؾ}»#ÿNF¥„€õ¼<¨ ãqßF’b×#Ö醬“ Œ0Êi}È Dkp½_„ˈÙùg2 £‚È(õãUDF·5ÿ‚¡¤9n®"—ÌÆY:¤mɈÍ-rU½¾ÚIÓÜûu,ù_¤M£Ö%&º_€ýy@hTÆÀjÀÂqW’Ñ€‹ÈüÈ0*àÌ“;hÊ(1 áè|šU"Š{æ`=B$rÍil¹ãO$Æ#Yìš7ouîÜù_šXôчxç½÷Qà´Š øbî<Ÿ+ÅOÏÇú¥ïáãÙ3±våRl\_‡7¡¡~3v45ÃcO³¡)‹æPQšBii¥%i¤KK‘.ñÊJË,«Äºeã˜>}ÜùØíˆPYí?ûº/Vcñ¢E¨ªªÂc5Æ×ÜÔˆ¦í èÙ§ÿ×:/RJ{ì±X¾|¹ñ÷Î;cöìÙH¥RcQWW‡©Ó¦áÉ'ž@ccc$ÜûôÓOc÷Ýwÿö&•_ªuãèÑ£±cÇ€çy8üðÃqê©§¢wïÞèÚµ+ºvíŠòòrÀÌ™3q饗Ÿßc=0mÚ4µ^ êgþüùxæ™g°zõjõþ[o½_|ñÿ$_°ÙlO<ñ~þóŸ/?òÈ#?~ü?j9¿ñòø­Ã¿Éøþi_õ5<ömÛ°Ï>ûˆ6OèFN2¦m "1Rjf»Ôh¶ˆŒÜ¬ Nè9 555ÀÃWaxýÇÞƒÐyq÷]6·=ù7ì¹ÿA€-›6áÕg‡W¦þ ÙÌd³YxÁ©¢ %29‰Tƒ—ÈÃó<ˆDžç!‘ð•%øâÓ…¸õ”C0¦¼€º¥ 0ö8lذ æÌÁâ+PRR‚3N9™yxþÉrÁûï¡ië&sÆyV ‹°^„öóÚ}'éÑÞÔÎËžII ˆï_{-.›8=ôzè!õ¹ÆÆF\pÁxöÙgѯ__gwX+äp E´ÜÂÝýÑÝR…ãl3҈Р|qƒb1ÂæèŽéižÐÓé4žÿÓŸ0lÄpØäÉ&¥,œ§ÌCе›ï@ûí·.½ôRL™2O=õ”rºˆ\ûÃÜ7Q,;Õퟛ$:¶è rHŶoŒ°úDÞm5$vŸ!ˆN¥qþùßt}BwíhnW0έ“¢­Eœ[­Q#2×*"Òï!NÎkRÄ#"®oèØÈ4Úí9m¢$†ÅQ¸…épîƒ;€âÛ¼Û.^ÖâQ>fYm¤ñ¨¯12ø°›šŠÔÊ¥»ZÍ:Z·«µ«ˆYg‹8†w64+ÂZ5»ß¬«÷p‘VǮˋõ.TÛ@Gðœ‡~«´C XòÑ<¬X¼ù|ñ<é«4žðÐkéKاj²]*­(Ç{—bܪ÷pâµ¥Ðm×]qÀáßÁˆQ#QÑ© ^R ¡%'‘ÉËÏå‘Ëåýÿ«W®Ä-'ŽÁáC‡`ýÌ÷Zü>½óû˜5ëM4µf0zØ0Œ=ø tÝ¥‡ñô­­­Xðþß°ç!ã̹2ž…Š”‘#½ÁÒö{Èük÷îÝ›JaS¢è×”——còäÉ8õÔS¿×××ã‚ .@ccSdˆWw¦ˆõ‚ƒ0m´0E¢çúQûÈ௙³è~o!_@>Ä]wÝu6|x%‚í)äsâ‡øn¾ùf•Ñ!þ¸¾G€xuÉ–«PƵ®ëQ1ÎyGý]”›Úœ!N¡ºººøû(N`tã’¨Nrs•»KÓÜeT˜<®' *òzt>ÝåJ®ò¦81uqN zŠPZ(¼ µ±6äÐ9(RÊJT\ÖŠJQì“™iÇ ºJ7-þŽèûœÍ Šs²Û²kaQ•™{•ë/"—ÞtËR\ý]Üô¶aÐ­ï ½g²ºÁXù€Pݬ_³züÜsã•xåéßcÙ‚°~õrò9CpÈ"Š(Y¿½>û= Ý:ÃëT QY\i9Ž<¸û¬œƒ\rZ£ÞoÈHìØèÓ¯/’%%šõŠ€yB&W@6—G&_@!ŸGŽ€¦¬Ä-'‚±ƒwÃÿû¿ð™ô0zËRŒ*#œvÚéwô16r´²Ü¾u3î»éRìØ¾»öê1yŠxÃQôIÌØF %!jÖEÙtîÜ¥¨=‹(8KaÝqç4hñÙ5kÖ`öìÙQ‡€(b$¸a¡ˆ'{oéW\º½óTŽŒ,‡Æõw‡ ³ëžÉTüûoz%B™êܹ3.¼ð¢È&3žƒÈÝÄÈØ¸Ñu%JKËðŸ—\himf¢H4¹1™¢h3½ŒŽÚØH· 2ȇÈXCËI³–F}¿½.Ö8Mùñÿk§‰"ra-9±uˆÔúŠ܈áqì/2/±ûG¾ß0HÛÇÇÝ2‰ Ù!Ë"X½Œ#Û€Øy‹cóÙõþ·Öë2ßp| ò$®GÈttˆ±¶i²Ú[ºˆÈú;“ "‡a$óK¹¼“¥oÉvà‰Ø³‘S'²m×ÈŽÂX *öY†ˆ9{¤Ç s‡ã&¾ìMÅ÷fôÜ켊„½üT IDATÜy¢Ÿÿ=ÀŽ­-aºò¼Ÿp2=î$,Zð!þ>}Þ~ñ tîT‰ÝöØ Ýv©AKó¬[ó9ªºôDϵ¨êº+J’IŒÝðD·Î€HA$(›2-ÈçR¸ðXO¾ñ&5—ßñ+8þdì;vV-ý›Öo@ýúƳdr$=‘È£™w­ÄÄ`|™‡º'þ‘’éòPHPûÞóh9ìh”uê‚¶×o‘D¦µ/üönlX»Gœ5ÉD¯³—F ™­' >:T VáÀ¡M’õ©&PÁÙ¤Üv &‰0$hÊÃ’t ‡vV¬Xa|úÃùâˆ#äEy–r²è(]~,£"«³jÌ"«S¢#yX£à5òF3ÄñÅ2X­Cp(Å&57txZ>üðÑH…F)mP]†Èl5ÌBã*N{øáú„ÒÈJVL`µÃ4NOd“ 4?§ê•f‹H§Q·Ê¤4Ù/\ÓK‘ˆ#ðV@1F‡¬ÂŠÁL’‰€wΟ­Ha‚‰LºXÖ—]X¢ °4¢}¹)T6 ªiÒ}èUe†¾·*9âôcODbƈ¯GZë ûäi•þ—S‡Qg0{ÃÍ”f¿ ƒOD÷•Ý"Õ@†ÛQ‚®T¡$¸‹˜†8öܬb‹Mä. gÔ윤€Š*[Z,XŸyxa­lÁË)JJCfûl^Ög0=’õƒƒ2‚‹x«=ÚæxsžÔó„ÀȽöÆÈ½öƧ àÓóPZÕ éN•È‹MضeV,Z„n«VbCCŽèÖŒÎç´–Â˶@æs‰fP"ʧP($qþñYì³pþÏS1õà±8÷šÛqð1§¢níj¼õúȶfÔv€Ö,¡Wi 玄³Ù½Ö®Ã–·A$%’e)$ÊÒ%I$ˆhÝŠY7_€—³¥Ø¥È6oC2•H"Uµ+Fy†îµ¯¥p-Qc¼t²<ç8V&r†Ü­mµ—Úv˜ :4ò÷|ÃzŠ"öƒ\³v‡ÈãÛ†’³o$µ‰?iWüJÝoç΀#Ž8Âq¢k<ÑéðX)‰ž={bèСhmi‰šv} µ÷)¿Äš:˜ÍÚîló»¿"'¨â÷&¢/n,‚ih£7gl‹T¢ˆ‚6?GíL»´Å_?ð8VÉø qÛqnr”<‘Sð(¾…³³/µ1ÏÔî9qn˜X=Dñsãæß`1²EíK¡ .Ùå ›%Ä´Tm‡/öj²x^$Ùàêè„@À¼†þ» »ï¼ek6`èàA8ù² ¼¢½úD¡CÍ¢' ºTM) µÈ4ûGYð±ARÃGdñß½·æ¾…ÇÏ8 ¹Q#Ñ©ï`tíÞëÖÔaGÞĨšî8~X Ž®­ÁîÕ¥hýp!¶®ø¢,²Ê4é4%)äÓIˆT(IaŒ·é}ÇagUWò9lª[a—A£°~Ë6$ ƒï—â'Çz=úîâŸwÛ4"E@_Áí;€ym‘OX¤"_‡+DžÅ$£q ›¢]R`’r¸žƒJLÜaŒ‹Às[‚ñUWWcÊ”)8äCŽStÌq!w²&Ëîš¾ôÃ[o römTRMd>Œ4dh(в¹}Ü`.³exDU:D(æqÉsŒjá!Ûè³Âráȹæ*sK“wp°ª0j·#ŸeßËOÐd!>E´'šÕ2Fo*¡ìØàÈèŠG]07ðÖ0‰œ(:º(AM@gm5'Lè&Qä„oÂìÒÆçÑñ éŒû^ñ_·<‰HC¼hï¼ðN°õ"óLuduí ?ǯÑа¢ mtiµ$Ô­÷ŒîT¡ð³šTÔ\K ·¢IËÊ+0îÈ£°~íZ4ï܉-[6cÙÒ­xÞì.ë1¬×Àë J–¹, $owwk׉µÔ…Ù²•Ï´¡tY »B°«–µd„íU Õ~^Ƨ1%v]D¢ 夑¾Þˆ†GTyŒ„`z_M…«Kl!"á]C¯„Ü€Ý ˜`:JOHVQ`éüP.•áå,}¬!‰ £Æi”ׄ„=’´ìø­F¥U¦Â:ˆ*,Í *„îꨙø(iô%¹ÜÉ‚¡Øð 9{4¢9ðIôî?@½´yÓF¼?w.ú|ô" » TZ )P®¢E!“ÅÊu­¨ fô*ËBf}¥Ò  PŒîŒê ¸ª€ûê€ (Áîe- ?AÓ¶mÉ$D"€úYÜøé6¬.¨oÀÒ ŒÖ¹d”J ÷Ö3˜V·›¶¡5à˜>xÿ}1tøÑи«¹‡‹¤€¢!õ8RrÇãÛ<¡Û%Uähã±dI”kÔ¨QFèo{~ø¡ó»z÷îSO=ÕÈkf³Y<üðñãëÒ¥ Î;8°´û|ýõ×1{öl,Y²Ë–-Cuu5† ¦~:è ”••E*œSFÑð¹BšŽ‰Æ°CÁÔFh3N(./ÁädéÒ%xñÅñòË/ãÍ7ßTc^ºd)þû¿ÿ ,@·nÝ0aÂ\|ñÅH¥RÎPqk&ƒiÓ¦áÝwßźuë°nÝ:´¶¶¢_¿~èß¿?† ‚ .¸•••ÎÆ1Ñœ¬é\Ο?ü±úÙ´iz÷î¾}ûâ€ÀgœŠŠŠH˜16lLÑêÆ ðì³Ï¢=×ÕW_måbýÿ®_¿sçÎÅ'Ÿ|‚E‹añâÅèÒ¥ † ‚ÁƒãÄOÄàÁƒÍïŽm/±Ö&|iéÒøµ)Q5C±qóCN™D¬^‰ó9ÉŽv„aaru¤¶SRÓ‹\M{Š4/"rá¢òJÎh³£©·yäJ„Z€¾è½\ÉŠT†ERQ.£……hOØ=žË×ÉQOX;¢Vh¿°Íî šÐ}—·ß^±l ¨¥TÚ’ ˆ|"ÛŒW´à©yͨ۶“wÏá”á@Aêe#`¿*àªÎ@¯Ìvl[¶¢Äƒ—ö$P(ø¬$ ø¬1‡Õò~·d+èS”(C>•@ÿÄ,C½÷Ú ;¶5 Ýc¤1™ªE¥Í5NãìAU/`+0&\ZMˆ˜üp‘<°Ž6¯ÖÖV¼öÚk‘¿€´Âõïßõ›6áù?ÿsçÎ5Þ»ß~û©ò·Ð[ô<Ý»wúuu˜1cV­Ze|fàÀ8ï?Î3ÅÊš€7âöÛoÇ›o¾‰Þ½{cüøñ7n–.]ŠW^y3fÌà—à5 C‡Emm-J‚f‚€Ú!µ2d.&ò=ÆÄ‘ÍËËâæ²=œ7•Ý“f_ä𪯯Ç_þò¦M›Š¥K—FÞýòK/ã†o€ô›5cëÖ­¸÷Þ{±ÛnƒpäQG`B¡€‡~O>ù$0b=pØ¡‡bÿýöGýæzÌ|c&^þ*¦OŸŽçŸ?ûÙÏpàFÇŸðÁh*7Õ×ã–›oƻヒ’’Œ1Gq¶oߎٳgcÖ¬Y˜5kxà\tÑ…¸üò+Œ9u“cš€æVYY…‘#GbÅŠ¸÷Þ{Ui!à—qžxÒ‰Ø jz×°žãúîzîO¸ó'w"“É ºº]»vE&“ÁÚµk±víZÌœ9=ö®¹æ\tÑEHx‰ˆPlª¯ÇË/½„©Síµñ¯—_~ 7Üpcdm „#<’ñ®óýŠHn^Qƒ†­™]é#¦le¯±j¦TÛÒkÐåBƒvÃpDŸ!¾zÛHÍÁqÏÈš‹èþ±ž#º)‹ì8rL!Ìžõ†qѹ0Bìp,‡0Yém]ïšÍr'жn&³I°a#Eœ |¹zÌÉ%/@EN(mÀEvY·‰\ d64ï²9ÐÒ”Á;ËwbGkK¶ç1epô®@IIÚ(øQS" Ð^çxž€HïÉ Y‰|!¨-˜#úp‡Ä–Æô*KB BIIú$ÑiŸ} %}pâI'ᤓNŠÙØóH$pöÙçðk¸Ï9ç|ôÑGîÜ("íʱ`ÁLœ8MMMØwß}ñàƒ¢ªªJ}þ’K.Áw¿û]466bçΘ={¶*µãוW^‰ÚÚZ7(‹âÀZHµuêh+‡^¤ý¢µ3þþ÷¿ãñÇǻᆱ ‚ýÑ3^7Œ9¿^}õyäêûòùnºé&¼üòËj=lF»N8µÖâþûïG]].½ôR¼þúëèÑ£‡ÔÃ×nÖ¬YøÁ~€mÛ¶áÌ3ÏÄ­·ÞŠt:­ÞžÏç1a¬^½MMM¸ï¾û±n]î¸ãxž×†kJJÞwàÊ0vìXŒ;Ï=÷V­Z…d2‰K.¹—_~¹jBdï---øñŒiÓ¦á;ßù®¿þzôîÝ[ñ­·Þ”)S°yófär9ÜsÏ=˜?>xà5”¶×†0cÆ Ã˜óë•W^ÁGQD_Æ7S[-QmL(vŽ£"€;—œ¶as¶u¼âNëqسص%FÅ€…±õëNü›³].µ±„îej°6ÎnR;q¹^œB"Vs®þÇêkÍ]÷iÖ’ñ÷pÀúïá¤JVÌ…”y µhnš¶MÛ š¶!Ñ܈­M;±|[[²4äÖf€šÙ ÈV€òvŽá™'V)!sAÏJd²»¥Nû†ö­ðÐ)éAæ ªüÆûl6ò¹œ9vVÿiÈ– ²™ Ž?þx\vÙDE+˯U«Vá–[nÁùçŸGy{ï½·ñúàÁƒÇá¿îù/eÌ=ÏÃùç×1„‹/¾:uär9<úè£N™ã?=ô®¸â lß¾·Ür ~}ûà”SNQ@2ð×—ÿª>+¥D>ŸC:2tH§Ó8p ,Xxî¹ç0yòd?çkE`„–,^¢Ævì±ÇâüóÎ æ†Õ­ ¨£Ž8 åååªfÍœ‰³Î:›ôÜÑt+YGF‰Ÿÿü.<õÔS8úè£ñ“Ÿüåº\6•ôôä“ObÙ²eèÝ»7®¼ò íYKʵ>¤¶Çwœr€à®»î˜1cP^^ŽqãW÷÷<>ø 1Þk®½×OžŒ3Ï<À˜1cðæ¬YxìñÇѧOœ|Êɪë­ª€ 1šº>ßà@¤™‰˜Y] Ãg×@5á8G «#od£Å­ºÞr™éUM3+´¡åÝÄ í,;é °9a ÕD£¼‰QŠ‹ŒÆy`¥x-À˜QNÉ‚Õú“¿iÀ›À”6á‹` WÉÿF‘v²TH ¡¨ÂèDA$Ò—X«[2øÌÆ]qíÖ’±i bH_I¬ï.·D2ȹø…ýFk>aˆ„Ùº0œü…¼gî» ö¨%ÈК¼à}’@yÂE»C@ÃN`ì.@>ãÛ}™(ÅNèAש¼¼À1’ߨKé#:EÈ¡i7L#Y–J“È!%áõ€ÊDï¼úgvÑ5IHÁr(DAkO6ÑB‚ ØM‰wÓ"¾0B-°jU¶f4úæ g¨eùòå¸âŠ+Û9r$®ºê*2fŒ£3•£ÆTÂób¢8!ŠT0¯Úc"áhÈ6MøÞææf<÷Üsê=£GFeE• äOcBàüóþÃ0è~øaЂºÕ&kÛÉÑó"J£@£ÐЇ›HobE¾¢Sc˜’kÈsIF»ä‰ †Ã€$ìæ()¬­­Å§Ÿ©Úí‚€±cÇâðÃg¨{¿Ö­_úúzãóõõõè׿_@’b´¹Ã®=z¨÷µ´´`ÆèÓ§&’éËç%nŸ2…BžçáòË/WmˆNJ _ $ HyA鈀(/M`áëFçAÃ1òÐ#£ù%›'8íÎîÄ¢0ãЖ7suu5Fމ\.‡\.‡;v`Û¶mhhh0DðñÇãÊ+¯Äøñãqæ™gâÀŒb%"4¤›ã'*ö\î„÷’%KŒçíÛ·¯™k')¾ßþûX†O?ýÙlVçpíqQ\6Ñ‘Gtd˜t¦q¨ßXøƒsLÅP»5½zEîwá…ýktoúW¯^½P[[‹Ï>û 0lØ0ôë×Ï ¬åáY`½ Ö£wïšÈl=óÌ3øøãGumRcá/½ôR¼óÎ;Xµjzõê…+¯¼²HcG lß¾W_}5,X€)S¦àôÓO·z$#Ï üæTǼýöÛωâæziÏ=÷Œ cþüy8ýôÓŒüiMMüÚ¸ª5œ¤5äÂ@;z!ÄršGÒN]ã&3ê*6Öè~uþ‹âøQ¨ù_«-h,©Iëjâ:r@EôEçž\ÈÿýNNLN [žãË]Ïh£õmÝðÿEýúϼ6׭ƺ勰àéøbí¸üÆ;QÓ­3ðÑï ÊK€L”'P.0ääsYr9  Y ÷£¶äÒóÃé2 ß熃]Úà—&/ðˆ„ðO£žýôSÌš5 Ó§OB°y¼öÚkxíµ×pðÁã¶ÛnCß¾}ÿ%c_²d‰ñû¦M›Š¾¿S§N2dˆBçr9,^¼£GÆ·ánß/ÛÞöþûïÇSO=…T*…³Ï>ûK}vãÆÎhÌý÷߯~5ª}û k×®x饗°råJ 0Àùlq×úõëqÙe—aݺu¸ï¾ûtF—ñùàƒ0oÞ¼6?WVV¦¸ü}ƒ>ÿŸ²6ÿnK¿ñíh¿Oð•»ý!÷¸6nÆ›°Á™$2¡g±iݬYö16®^†\¦ëV, érœxÑddRxóù°{ÿ5¡°ºh)ø¹î|*„À¶à'@µXz¡{Y€"×x20öÁé áçØ… ¹€„'¬^2^ƒGcW¬ÅÓ÷ÝŽïÞpj1§šQK8Ë8 WþQäßq”K¥kF$’Iôïßú÷DZLJK/½?ùÉO eõî»ïâä“OÆÏþsuÔÑ1£‰‘‹ý«-¦3ãÈSCCƒuBܨJͶ‚š¤_ß¾FéPEE…‘ÓãäWî‡æ„ DÈÉŠ®N{¢Lf®mãúbÚZ:™ë”€™›µwïÞ¸ñÆ£§2‹ èý÷ß”`566ªüf8ouuëÐØØÈî߇•§:äÛb8`€yºjc6—.[ŠË']ަ¦&<ü?ÿƒ}öÛWçMù>3–ÇÿÒU«W¡P(¨{ýú׿þJúríÚµØ\_nÝ»³Ü®»å®-Òî’Œ­ìx£ÝØVƒ‘“ 뢣m«•qÖ¹{×b:Æï”b—8:è83£Ýü5æÎ‘½‘ÆÊ‚a\{8ÒÒ;Æ~Ì|†X!úÍ“1ª¥¬ ³m±é3–Þ¡wlýõ¥ÊÖ$t?aÿw…•uB_ ýh«–|ŠUKaÕÒO°tþ»@"¾ƒ†BxIÒQÕ½Õ=`ñʵ¨ØÔ€ÚnÕ R&!óB£Öó.'ïà¤NRt’€Ìú!õB6ÇF^J_ºdèÀ4}* 9üœ}p2 ÿ”î%< ³{Ž;+Þy~èL¸h2 ÝKÙÂð/ïÊd°3I½ôª¶œÈHã„y£±…… EÚþæ¨I“mŽ2µµµxä·àò+.Ç| >ŸÉdpÛm·aĈᨩ©ÑìnažÇÍ#©»*à”.VËÐqÊIzöì ù¶f2F”PÙ6ÿ»»tíª^K§Ó0 8Ñ»˜/aŽÔ‡{pP’•Gã]Ô8‰3îYFº=ek"d ó—ê^–z sè×zÔj!ø¸ Vpí{¬„>£Õæ-›ñ /àùçŸGss³UòÅñ?:ãº|¹YæØ§Oo•3&‚"Î.f0wi,ò¡Òæ°®9ÌÁó~;vì@2™Ôx’P*…ÅE`w‚õçü:uÂO<ñ•Aå•þŒK"=‘‚=bÒ³ªZrÒèÍÔŒ)Í#¾r9ÈrNˆ"ÁÈP6DHMf$öËåÐýb‰z°×ÁÑ|W¡P@ËN߀¤RiÅî"]õ;PR*! @Ö7ÎFkðp^‚œxˆ^Wùñàß…‚ŸS/ ^ˆl:œÏ/m ÿ‰ðßÚ˜‡oÉû^Ezîq8¶®˜‡Ïź•˰KŸÝ0ü€ñ´ÇÞðBv)aýNîùŒ€‹¬þÝ€ötøq€µÈ±h•••8õÔS 2Ì;›7o ÊÔŠó›Fi‹÷ 7ûJ“a÷ß#bðôÓÏàøã'8'së–- œ…xåÔP ØÄº¸É(®ÑW›%„¼nÝ8ü¸€LÖŠ ¹Ût¾ÖMÝDþ_çÍŸ|sæÌÁ€ðàƒâ€(êŽØà¹Ï-"¢/Ö®E¿þýÝ)®ÃœcþÏzÍ5×àÀºuë[¶lÁäë®Ã£>”ÓñGÊèê ü1¼>_ù9FŽÝ‹‘=CêÚ`‘Ç¢ö½à yuJ¢-sá¢}%—˜D>½_L:–bîm“¾ƒ4%$£xWPµ(yMÜsGNöänGñkïRÔ3×í‘ÜûÔ´¥m­?œ”´.ªßb],½¯+‡ŸH$PYUʪjØ@V”"Ó˜Gf[ 2Í@K³bÏå|!øÉû@¸|€XÏ炇`¸àï é.…þ/ tó</4àžo¼½„/ò¤‘òÏç h• !ô<”uî†]GŽEÏ=Æ¢ßÈCÐÒšÇÔG~…‡o¿ë׬üFa*â”zX“üu^·Ývºwï®~_¸p!žzê)ç{ßyçµáN9åŒ7WôÚ¹s'n¿ýv\tÑE˜;w.&Nœˆçž{® cî¾6oÞlô/¾ø§»²²÷Üsæ?äáî»ïn×ç·mÛfü¾råÊaè¸þÏ\íbŠs±™l8–ÒEVc–µõ?[(«F+*‘iØ‰Ö É0žcÿ~/„<ïŸÌóÒÿ Oë ~/¡ð„@")P–H'R OŸÊ“Â7âÁ—LÀK$H&ÐÜ’E¥}g¤º» ˆ¾}z#WÚ [ )ô~FŒ? ëë·áÁŸÜ‚?Üw>ÿtaÛìKm23™yñ6ÙÉÆte«ãßþ­—£>úh[ç"ÝÝÈìëKëâš‘gîÛ·/yä 8P½÷î»ïÆc=†ææÊk]øñBElr衇âÆo4™§àb[rÌ3НÚõZ±¥0C–6k"k‚#r‚ˆ7lö(† qþùçcêÔ©€I“&áŠ+®0ÝŠ¬¯ÉfE—Ê zô»uÖ`'cÿLv­¸ôѰaÃqÝu×{öÙg1uêTÖýŒœÌi½¬²¿•ŸËÐa\ã'ÿ¶°xüнçËçd6£x=бv±Ï‘c,¦2›!—]õœ±û E¾ÓbL„ã9l ‰0èÁb™3YaƒtÍb™ó`Û«¶DÎb™gû‹ìӢ숰²ÂÁÞ÷åCîÂ$'’{X¾O. iŒ]¯n÷¾•$“ÈíÒ©ík!ÃÜC/ç·’T$—ÎŒy¡@È“@!8§;%á•y,ÈHœµk FV¦ •!OÀKé‘J ‘ôPߘC³W‚né4*Ê+е{w <}ûõCýÆMH$óæÍS yà§?ý)ׯðáÃÍá¤ó™}úö1î·tÙ2vª©fí3óñ¼?uãŽ&TUVY 3RøÍبõ(±Ü*ï™ÍòÔ¬unØÔU¡ bÂ_9bN8‚@9DÑuÁô”äЭÈÈî]naO‚Ï«Ô&O9 ÃSÕ¦4ÄDÈÐnH&›ü~ÒÄ'q¾ÿd«ñod‚òB5má©À e44ØSáx:1ÌwKD° ˜,˜qVkl†Öu«rRvC@@ i¤'ÔÞ‘¬õk{ º$á„fÈaÝÃ8…g>¤ž SD¬/·¢Œ™Àn#ÿôï P…·òȨ€ Ï3 ‘iØ ÈP ™ð#íÛˆpçæ fd¤:g‘a˜=å!‘òÃì‰t^: /•@R«ùÒr”•”¢¢²ét©ÒìÚ«=zöÖÃ`w×"˜%ÄBÅ­€ &è!š™é¸_ŒöùŸ ˜-^°û‡e()-Aii™_J¥Œ#[€´4±2-%"õÄaHEè2³†“Ôé ÅNè¤Q˜¼ºTHŒ9÷E…ËLƒ>„9a1aQ"MùÉ\gÉ,wKKkÌé‹?u$  óøñïÀ²eËðì³Ï¢¦woMI‰Ìë’u" 5ÎA‚õm5p¢RÓÊs¶'“9ŠÓó2=ä8Më¿ Þ}ØTÔR·ÎäU±¥pœy‹8¢×ÜŸáü£µž»[àÄ@-™dµÊˆ¼í·¿}ÇwœÆ7ØëXü!äF„+>Ç”)Sðøã³¨Šƒ8Ï**+ñ‹_ü^x¡b<\¿~=n¾éfüæ‘Hz&¼èÛÇ$H* xâ‰ßã†od<å:²d©ÿimÍছnÂI'„²²2ðÒÆ¡G&â_û‚fÁ6QTß‹°ŠÈ*•4e›…ú¬RH3}`:J‘> 0Ý*&¼AZuÜ.V8? kÖqs§X8lƤ¿¹B‡#, 3Pß<ƒâžWs`Rwƒ°S?ª˜47-±õáHz(`QlæD:¿òC*?/«ï’ªäÖ§éà)”{ŒQ÷Šæcáî>ßÕ'¦ë3hæ<äàáhíÔR H 'iÉ2<ã¥ñ"%qSk ³>aLA¡Ü…ú)P¾7ÎqN]Ê<ôïT‚>ËPÓ¹ ÉtZx:ü¤ð¶lÞU² •%%(-+CII ‰„ûy#è`tŠä‘ìŽ9T¬s’Ù™ÈÕ¢ÑPÄŽ›ÏÊf³øðÃ#·Øo¿ý0xp­¦Ü ¾?ìÈ^uuuîî?ì»W¯^í8ùéü/‘²€þð6¼ôÒK¸ýöÛQSSÃ:œY—߆ã=yêÀ'8òÀÅr€°r¥-­­nƒäìbeæaãòŽmaZx©½·nmˆõ|òÉ'E±6ï;wÔÃ÷õìÙ‡v˜ñž ë7àŽ;î@6›vTä¹ç §Ýu×á¸ãŽÓ”±T¼Ž?ðaÃðýïßxýƒ9sð›ßÜov© ÖvРA2dˆñþ§Ÿ~š¹:ògÍf³¸í¶bã†8ï¼óŒýWlm›uäžm= wÎ5—ÉÇ薢݋uU3» E:ßÙòX´'Eð=ŰC0œ.n?Ü]©XgKØÝø{íœ.]Ý×¹rnÿ*:ç âaa[þ¥(÷¶.QZŠ-£ò"(? ‰>O¦ÐUÝ<  Àï²Í…À€K„Ü… [ø-Týµ‚'p`UCªÒ¨®,EçÎؽ"…Ò”§Nä‰t ‰’$%þïIYÀ§óh,ëŒòÊJ¤KKQZZê]ü‹/[aÙ+“Éàºë®SaÌðJ§Ó¸õÖ[Ÿ0À<¡mذ!BÙʯúúzÈŠCóë—¿ü%¦OŸŽþýûc£9É¿ëåz¦bÏùU/Î|öeß÷Úk¯E¯Û}î[N à—“% ão/¿ü2&Nœˆ-[¶Ä~ÇgŸ}†‹.ºð½ï}ï+=ÿÙgŸñãÇ{â‰'œÏ&„ÀUW]ùûõ×_ßÿþ÷E粩© W_}5Þxã \tÑE¨ªªú‡­MÇÕqýËPîÆÉ’‡g ¯ÊêñŒÍÎÑ£}èqŒ=MÍ„\N /œHæî…²B¨çõ$ÐZðx ~Ø: ´:LxI|B`pE“º¤1¼<‰½ÓÀ^¢$áŸÌK’H”¤à•¦á¥S¾Ð’Áœ¦r”TwFEUÊÊÊPZZŠ„çY‘ +š ™ W_bîùòB{2ëYUG§Ú%DaN3ŸÏ¾\½„·76âÚk¯Å»ï¾¹Ç¤I—¡OŸ>NÏrÀ€gæöÛo÷OwDÆiñ…^À9çœé ÝØØˆÅ‹›(w¶7nW=ÚW¯^I“&á‘G~‡W^yü1V®\‰ 6 ±±¹\ΘûÈ©›§,o ‡çó¿®¾Ë,¿dÔ©9O·[¶lAAÌï‰éS»=€íÛ#÷ ùí‰÷e·X²ˆ€îݺG¢)«V­ÂÛo¿e Ë%Þ~ûm\|ñÅ9¬]»NÍÙ¶†ä²Y€ýøÍQ¬káÂ…8çœspçwâ…¦â³åËñÙgŸaÖ¬Y¸ùæ›qî¹ç¢©© ?¿ë.”•–ZëEF{ÕÐ@ºNG?úÑ"ùñýèG˜3gN¤ÿö˜1c°×^fÕl6‹ûî»_|1^{m:>ÿüsòy45ùryÿý÷c„ ˜3gŽ?þx|÷üï²`ÿDצ>â}² Æ^wöº¶‘Ð(rÒ%35í¯ƒ´ÆéŸH# Bˆ5j‹ê}[î¢~ PI–#zެ'fïp[‡™'aìæsaGåˆÈª‡çQ!7ÒŸ§H̹¢HõC¤ÿ9¨|˜kÍ+VÌ|EpÙ)8;òŠ/Õu¤F*Ú>†{ëJƒÓ›”¥ЂL‚Rbÿßy÷X½Ûè½ôH!àHáˆæ 6•¤±À ÎHeÈ'rÅÀ ‚ô)a~9š—ò SH{8 ]@‚Z!RIˆ’¥I$Kýÿz%Ix)iYÀ¢ºX.z GçjTVU¡ªª ¥%¥ú9ºíŸînæh„à˜u–‹¬œ“nM«;!,NËV®7P¿ü¤õÒ_^‰'äãýYommÁ¶†Ì›7¯½>ïÏ~…‚Ù}Íó<\uõÕøîùç3€ «V  ²ªg}6žúÃÔç–/_޳Ï>Çs4víÑ+V¬ÀÇ â‹/¾Ài§†K/½³fÍ2¾ë²Ë.Ãá‡EïÞ}0q⥠|þùJär9õž ­…O&“(//G=P[[‹=Gï‰N<©dÒÈ+XÏu†g`½|ý¼•´Z࣯#=£ª)¯¼òгJ`Æk3pÔ1G3*Ma ÞË¿¯IŠË£Fó£…E.9VÕÊ•lÆŒƒ¿þõ¯Æç'O¾Ç{ Þ ëÖÕaÎÜ9X·v&Mš„B¡€‡zH½wêÔL&ÐÒÒ‚W^yÓ¦NC÷]ºƒLœx).\¨3îÄL:5• ×ëž{þ CwÂÒ¿~>tëæ-‘ˆÀœ9sX[X ª¬¨ÄOúS\rÉ%êTœËåpÝu×ág?û™þ zŒC×M¾W^q…ÁA¦ n¹åJöíÖØ±‡á¶Û~ÈÚVHª\±Üµ6 гÇ1¦>“!lM¡žçaÞ•C`·Sx *†ÚbíMØÆÄÙ€¨`âv8N„1¼…}½EÀ`ÉA$!ØŽX.Z; BQ·ª:†T9_Áäœ4”-d ‘î¶D§©µ™9 Œa™Ôß5Ê]Ìi~Gòí4&GÏž K¢L*Œ’¾‰Xâ^°H¼;^WpA2 ¿„Ðùte-H³<£a)¹¥pŸÆ#¨”yóæ‘,HºÍ€V¥‡q«óýãe1¦} ]ù¤ƒ.£¾S4è @6ädà<ÖLî,`Xu +’()säžV/ ~ÊÓH–§‘ª(A²¢^Y !áµdpÿüÎJPuï9ûì³ö^{¯ý­ï»áç?¿O§ÓX²d ®½öÚ ì¬L„_¯Z…ÁÁÁ¯œfš9s&î¿ÿ~\tñEÁ’ö:˜°À«,‚Ò ‰¸ ù'&'ñéáOqàÀ~lÞ¼{öì±¶§­­ ·Ýv®¾újô÷÷£³£“Sx‡<ÒŒÌ|tt ;vìÀc=f¤í{{{q÷Ú»±d镹SŽž••6Ÿ8q+V¬ÀÈȈ³¿æÌ™ƒõ6`îùçãwÞÁêÕ«­Ÿ[µjÖ¬Y#@•ùB<ò^xᅺ亮·÷Üs7®\²4FŠ ÅñôÓOc÷îÝâ;ÝÝÝx`Ø¿à2$I x¬^½ÚÀ(¥ð‹_þ?[¶ —_þ·H¥Ò¨Õã¯]»¶!ßò}7ß|3î¼óN$S©°òAFGG±cÇkîws÷ݸòÊ+«~¤dƒ!ǹÀi"ó%/V$*çd“Ɩˉpœ„ѱÝP»o¸ Q–iœ)µ¹Dld´6(A´Ü!ÉÃ*+¥Ç&G°‘ŠòŒfW{^ýél¿ƒ:ÂÍe²¡\¼ˆ—"ò¡"eÄXúßó<,\¸PÕ èçò\hâäÞ]û¸äÃ÷PàUïƒà©šDUÓ\…|잯@žÂ©ñ"þ|ª„yIt´&‘iN¯¦×ýt‰l~& ¯)…DS‰æJ`W>žÌãûNâßOÍ´Ÿœ9çaêŒä¦ô ±oË>ùä¬X±âë©xúûû100€̘1˜3gŽ`gkÄÆÆÆðÐCaÛ¶mÖ ºnݺ€›}hh7Üp2™ –.]Še˖᪫®ª¢†Í]íóÏ?'Ÿ|2rexî¹çÐÓÓó½+®¸â+}ï–[nÁ]wÝåüýºuë°uëÖhâ ê‚¨¿¿<ð@¤lçÇŒ 6 Ž™3gâºë®ÃÊ•+Û}÷݇W^y%¸¿ïûX»v-–/_î¼ÇÖ­[ñì³ÏâàÁƒF»ÛÛÛqë­·båÊ•Èh¬>ú(6oÞ,²26knnÆyç‡7"“Éà©§žÂÎ;±oß¾Èïe³Y<ñÄ¸à‚ ßÚ¸q#¶mÛæ<ë_¶lÖ¬YSÑÿ†ßMl±-ó}¿±€^,–4å;^WÎÕjlBoJnHU1HILSe¤€·ÿû÷è~ü·è/N ¬¿º ©ñÐÁ\URížR»Ž*àÑ".É¥ÑÑžB¦9U èéJ@÷³Iø™$Í)øMi$2Ix)Þø¾86Šù¤…és1kÎO0kÖ,ôôOEskk%ÀwÜÊ\¼B…+£¦Â’!®|‡ÆÈÈ&&&0™ŸÄäD?Ó§OcddD¤T¯¿þz¬_¿Þú¬Á‚ÐCTFEIZ¹ÑÒºGqe6p•¹¤Vë|D)Ç1Y•›@*û)©üB¹TÂ{{÷âÀþýPž‡Å‹¡·¯7ŒÒWŽ;†?¼þ:úûûpÉÅ—¢µµEó­°,Šo<ÇOŸÆÞ>À|€®®.Ì»è"L›6µò MtÂ&•©QåèƒÉZwˉš‚q)P!Öüï‹áaì}ÿ}¹YæÞv]€T u:ÈwÂö«dôS`C#.ƾKnféñ–y‡ÿDKóv‡{H‹L±ñv”H™kžé˜ÜÂÁaû<ÿYmXZûË1J¹k›l«KY;s1¯2§ ”LÉù¶ä<mZ®^8‘H4Ћçtå164„×þí_qÍ®íHy•ôH%^×äO+«êï¸ÈÊØHïŒpYoí)¤[ÓU»/“„ŸM"™MÁϦ*gç¾&&PÃS3x¿cfÏÆÀ왘10í¹žïºý‡jÅb>ø ^zé%lÚ´ óçÏ?£ï>|Û·oÇÓO?¾¾>lÙ²%îÔØb‹ío¶€nçr7БìÐ¼Ž–¯®yq,¯1%Q[h€Ä=+ßkÎå0ëï–açÜù•€ë)ï Hz•uʃJyPi¯zF^ý“ðªç |/@"›„ŸM!Qýãe’•@!ÒðJGN`ËG {š›2]]èêîFS[ü„Ï d(dñzÝ*I”¿U¡‡ý[*Xq–H †…‹¼m C‹õtxCŽÈÂVyÏù¼âÞB,q.‡èÍB±ˆ{ï½/¾ø"î¸ã\vÙ|qo€#M„,0mútüæ×¿ÁŠ+pôèQ”Ëeh˜vqOƒþ’ÝGGk.oa€³ý[C¢küÙüíÊw‹Ö›&c(T˜ô’©ðÆÑÂ:™‘ÎúX£±ŸEÇárîsȹ@ò+hJ{6_èbNï©=`¨­R†š…éÐ?n^yK7 ¯2Ȉ •2 m«#æã›·G{W.î"=kŸ'¤·K¿’œRµLVß~²hÓ‘Ær§Õ‰ƒ!æ:Œdì0Æ;ÿ¼CH¶ £ÎœôçbÕIÐæÙ/Z¡£ôÉ`ºsˆºzš9ÒÍÚvh*qIÉíàr‡¶ } sW6° @’€+¡}~ çÏ»ýõ0v&ð³cû@P(WÑìT•: ”Ó¼ ¢PöUå^M¯zi^5ÍÔb4Y@qltr¿ÿ¢ h™Îž)hëîB®§í]H¥3I;SŽ0@C–%ê£æTJPé2GžÞeœºÁ‹W<å–×+&‚ÉNÆYª’;Ô¹/ÚÉ vSýr9@î‹…1.$æl¡®»9±•Uˆp®}õ·ÿüvîÜ UýsYÎSË!•õ5L>ê\.‡ /¼0HGÕ¨\u0Rˆj- ntÎ×-Ø¿H˦ÄN,}ÏA,ç^gžÃàÛKq}nùì‚uŠÇ•-Cbü)ê'p û(DÓFIDATùf6Ž5qÌ  C ÎzõªšƒhHÍZCuhw%Ë¥¾eQÉË £ß ¹ðCÒÑÚó:ƒºX@“!k|¶ÌlB‡²Ëa²•ÁR¬$Òejd”$˜ ­jY íw6a¾ZC©óùT–¹1Ö3‚ •>OZ %à ´Þ¹N·ëæê$íAÿ„‰Û(i µ •aÎã AÈŠÂk DFçÌúE¼æŸb^(+óùÀYÜj|UMqJÍÙäÊPeó@‚SîÖîŽÐ»+]ʨ‚'.ö²5×6uŽnGÆVMa›$-ë¤TK –,\ˆÿ:yÛS)\{ä}¤< „j‰š¯€@!­¢_Îw ž¨„‚_e„TÈ£vƒËDF#ë,cTi5°º¯Àœ÷T0qad›g)rLÂ2OÁü ²¯S£/i{§Ê}m8 ÃÑÝR'ån,þôÆìל»ûJL_mϾô2LNŒãM¥°­µsþú>.>qmTB©¬P,–áŠð> €É¡XÝ¡S±ˆâÈiGH'2i£ÂÿœjÁë^?Æ»sèìè@¦³½¹nL6=½H×J«(j§ çŽÎ\Õ‘uå½³'çµQg@Öcr~X LÔÙsD¤&#ß³ö­¦l“øíºuë°~ýz,Z´¨Á].pìè1lܸo¼ñ6mÚ„¾Þ>çª×)DuÜÇÒºÓª³[nd'DdùÊ™ì3ÉžM ×VÉþrne;²2Î|ÉåÓä:S´ï8ëz¹AuvŸuS2uRÖù ÁÝX½±ˆkêøGÆÂ™Í WЕ5¢ºÙ!玙Üóiôûk|Ef›êf›©~,£†9Îpb ÈäHCY+Àrj)”Íû¤kIËå³A @ljî›W’s¥bûÿïñæ{{‘ÏçÑ:tÇ>ÆÜSÇу<Ò~¥]ù††'ñ§‘"~q^M-Idš’(p¼ 0˜oÆÛèÂñæ´tt ÓÒ‚lk+ú¦ä0}ú äú§"ÛÜĪÿùŠ©¶ÛUÁ²RL®P‘¶oÑÎS'RP!cPU˘KJV 4… V–1 Ï.Ce2¡y-Ú©ÄY’"0Õ..ÛÊWŠ[T%R \(1ÔO®é¾C V§@N CŸŽ›nºÉ`êºôÒKñÓŸ^ƒ…  «« míHú>FÇÆðÅð0¾jrÑ*ÔaW ‚U&d:S¬ÄW…jh¤´wíÌ[íÁHk§˜ƒ•eîe ŠŠ1€=Ø™‹Ad°:ÁNሀ¦`;C"¨Údî¾®Få„:/FŽR¥ÿW›¬E ég•2§Þœ°ìšÂ‰YÒÍÖ»ÊX¤À›|÷¯û'œ>=¹êô}ßÁhjjÂí·ßŽ_ýï*ä%J熂µÿ]]f.¶”ƒQãÞ2.ÍH2ùª[A4mîfNx¶1ñ6¾3½…&›—c·§m2øÕô¸²¶Oï+M¦¾,sô…PªÓÃTâ ç>öÊÙK±…˜~_á‘ïN¶ƒ‡ ñaAQ[þ£Ad•„dí·²|Ïò~ª˜‰N‰V‚Ïs|NcmBØQ†6Á’Ì*ªÉ¼lLp2cØ DÎ(XyŠL&ÛX@¯6PYãÜØ—G>Þ¿ü9†r©*•PÌçBT( Q.Â0 …’烔‡dÂG*™D2“…ªÊ¡vµ·¡¯¯SúúÑÖÙ…cÎúÑØwà¡äªÇ†RÊqÃwàC±PÀ‘àÃ?‘á˜,•* kô Ê ¼æyP¾l*…öÖärÝÈM™‚öÎndššà1YHÛs˜ÿ Sh;>Fæ|Ä6-LÁ)jr,ïÃÎRòUEžÕ KõDŠ f*1­Ñ]7=]Ðà1<<Œ—_~ÀñãÇ144ÏóBÊÚ ÌÀ¬™³BYKýeB¶{ÛÀ?væ:[û•V†p–6‰KãW‹ò#?L€´ç#ƒ‘Ì—‚Æläª>k2’Y¼ÇvÞ Že,‡p@­Ïi¡_´Î ¼I–ê×µœ¯ÖÂù}cœ[üÉ@/™@0¾;ƒ;õ ]óŒbÇ&µÈz8}#m0WÖÜzc´GµµÁªv±"*-E/Žn´îs”vAéOvÆ7Îdg0¼Y÷I2qsZvÅ2+[gmMÏ9µV³” ôS§NÉóœà¼ƒ³ô‘œPÙ —8?%Ò;P? "¡–ÖÈòªãóœ8úŽù CÃ'0rê4&KE”ʕҶ¤ç!›J¢)“Fsk+ºÚ;ÐÖÙŽ–Ö$³MB8¡‚p!^´[Pò3c„çËkA%¢µöhìì’J2\,„" A=;§&¬õ)CÌóTQpîCìžµ'#²£m•)d \¯v¦ËÎ8kg¿Áù±˜,mˆ„êt¬¾3H|Šñ¨Â³+–ïW`çesá¡!•„5ŒD4'æHVw7»ªLí%gN§uk.¹ýÌ ÅvNßúX¤è¸ 1úIUÙ¾zì7r®3)_£gäˆ^¶¤ê2ÛhÝh^1UÁ|åõŸuèù|þÆT*µMÒ7¢^ëuœý éŸd8·«Nñ¬u–'ªÔ ˜ðW ê0ئ¬ñ×ê®N³R“5à/gÔáx&û=É9¨áÁ÷Uƒ:Œ Ž¯ÔQ/¨ÃÔQ?¨»°m~×HPoô ùÂÏyPÇYêQNqfAÝT“³Ô t=ÙǘÃÏ êÎþh$¨;bã× ê6/‡Áã~fžôÍu¥|ßG>Ÿ¿Q¿º+øöÛoŒŽŽÆ¹Ø¾'C_c‹íÇ5\ÎæC|Órö®_/X°À¸ Um-N§‰­UðØè{zí“©‘ÏÄÛl¸œó‡PßðþúmUJ¡µµD„t:>£» ¦&'''‰Åbù|Þ`õú!,Þâ}]l?ô½È÷ÙÇ¿¶Çs@lßeÏð<©T ‰DJ)¤Óéô¼yóò_iÙ°k×®ëR©Ô‹Rñ Ž-¶Øb‹-¶oÝòù|þÆ%K–l»"¶Øb‹-¶Øb‹-¶Øb‹-¶Øb‹-¶Øb‹-¶Øb‹-¶Øb‹-¶ØêÛÿÎ"™»‰ë\pIEND®B`‚stem-1.7.1/docs/_static/bandwidth_graph_output.png0000664000175000017500000002077613157571677023102 0ustar atagaratagar00000000000000‰PNG  IHDR–°ûtfŸsRGB®Îé pHYs  šœtIMEÝ ;Šà« IDATxÚíÝyt•Õ½ÿñ÷É<00Ä ¬¢äG­­Z,J[­P{E¯ÚÁ YNuU¨Òª¬ÖvÝ^¥zE¯–«ÅkµÚ奢”¡Ä0^†0&™I™ÈðüþxN3’!2¼_‹?È9y†³Ÿ“o>ÙgïýD‚ @’$I:qÄØ’$I2ÂJ’$IÇP\í/ö³? RH‰%¶5ÏcJ( ÿ;·÷¦÷±8Ê<ÌÃÀS<W÷µÓm )IL ¡öãÛÙÞ†6mi{¯% ØÏþIlæ&T”PKl )á#•TS^ñJ«ߜ7@9奔Æ—Lr“Ç­}”V~_IÇ•ÂB€6mˆDj©¬¤MâšQT&L $Z&¹ývz“2É<ü0ÀSO5ë¬ZjÛ°qIH¨ÿTq1Û·“–Æi§Õ4]“ÊËÙ¶ôt’“ã4**()!6–””U°JŠ‹RR()¡zð]J ±±Mœ@i)qqÍ:ÚG‰µLJ‡aïâ®0jÄÛnýéÿ}¾ßœŒÒ2Žì J)=F‡¨¢j›Âü×j۾ɛ¯ñZzL`Ba«¨z‡wÞæíýì%v®äÊ lþ>‹(z†g³ø ®ø!?læV Yø[~Û—¾?ççá yš§sÈ9‡sá‘ê«Dˆ´§ý†ŒbT{Ú¼«Wxå}Þÿ.ßý>ßoò¸"¯ðÊ\æ`ÀC<cß¿NI••üð‡/¼@ZZôÁÇcËzˆóÎknÎÛ»—  ôX•IªªØ´ à&Jñ¶o¾Ék¯Ñ£&Ô‰°+Vðâ‹ìØÝáSO5+¸oßÎÔ©,]Je%qqœ{.#F0hPóêäB~û[úöåç?¾§Ÿ&'‡sÎá‘G¸ë®hÐ"Ú·gÈF¢}e’W^áý÷ùîwù~Óe’H„W^aî\ ࡇˆ±LJMi৤;ÝSIÝÊÖ÷xï'üd;Û[á<&2ñyžïF·“¬}?â£×y=“ÌŸñ³v´ œÎôiL+£lNçô%,ù¿«¤²™ûÌ#ï§üt1‹òÜþÌŸsÈI'ý>î«îíN÷38#•Ô|òg0ãižn0@ÏaN,±ÃÞ¼7YÌ]Üu1/gù˼ìOt„ur"Ï?O·“­LòÑG¼þ:™™üìg´kWóøìÙ<ñÛ·ÏСœ}6ññÍÚáäÉääЮƒÓ­K—òÜsTTQü399¤§sß}5£Ý»sƤ¦’ŸÏŒ<ýtC EÌ™Cl,ÛU&‰‰á®»¸øb–/çeË¤Ô |Òs?÷g’ù)Ÿ>Ã3ŸðÉ‹¼ø(ÖôP˜G^eYdu¢PIå:Ö%’˜E°žõTd‘•Hâ.v}Îçdìeo1Å}黕­Ÿòi_úv ÃaèÁÇ­­œò\r÷³¿+]{Ò³Þ³»Ù½ íh×î﹄’lÌ'?“ÌÓ9ý°¶mÜF6>Ã3ñÄß˽µG \ÍÕùä_ÍÕ]è<Â#kY»˜ÅraÓ½ l„GÊ)ïHÇ=ì9â ¿€oòfI?å§µÏ-¼úÀbObR.¹{Ù[ïb}ȇe” eèiœVo·[زm½èÕ™Îu:ˆÜÆmyäÍ`F&™ fßu¬Ë'ÿ|Îw°NM›7SRÂYg±y3۶ѽ;=zÆçæ@a!yy”•‘•E§úe’òrrsÙ¿Ÿ®]éY¿L²{76ЮÝ*u%%lÜH~>™™œ~úámÛDÜÈ3ÏϽ÷Ò¶Ö ªÊJþô'ªªøÞ÷1‚ÔÔÃØçØ±,^Ì7¿ ?̺udgsñŇY'ðæ›$%ñÓŸÖ9·ûï'3`ñb&M"7—½{éP÷wÚ‡RVÆÐ¡œV¿L²e Û¶Ñ«ë”I"n»¼ÌÃÁ}Üwý?,dá<1i«XÕ‡>ëXnÛ~wrg˜ášÔàqà³…-à«Y]FYøÍƒ4žñÕÛ¾ÍÛ¯òjøé½\|ÌÇ¿ãwûÙ~9„!wrgõ؉ƷmÒs÷f0¸’+k?>—¹S™Z@Aøei7pÃWùjõ7$0–±ãÿ2/aH½ñ EM`B%•ð@s¢¼tò™2…Ü\úôaݺè#ƒ3n‰Íî>cS§R^ CW^É 7DƒÎ–-üá¬^MY´L2hãkÊ$o¿Í«¯F?¬ï|P©ûøc~÷;öGË$C†pç5ã;ß¶é:ùeeŒS?ÏŸÏçŸÓ¾=×^{x9èÖ«®:è·ÝaŽÍݼ™É“Æ‹Öêd¿è'þõ>÷f̸²N™dî\¦N¥ Z&IKã†øjM™$!±c?ž—_fÈú㊊˜0ÊJx€ -“2Â6ò\ºœÅY«Y½‰Mgsöb¿ÄKÀ@v Ã<æý¿¥’:ŠQYd­fõv|Ægaà[Ǻ‹¸h#c‰­î]Ǻ 2.à‚…,\ÍêÙÌþßkò9.ЉN¹ä¦‘6€1ÄÌaΖä‘v ïaÏ4¦…¹6‰¤ø¨öž·±í×ü:†˜¡ íLç,XÈÂö´ÿ?jrÛ&Q´‘‰$^Îå|[@ðüþ‘Ð?æÇÀ;¼sd—¼„’_ñ«2ʮ㺃ÃbyEå“¿€UT bP½¬™CÎ.ve‘Õ—¾5½;”OcÚ~ö_É•É$¯bÕzÖ÷¢W½÷¦w?ú­aM.¹ƒ\û©Xbcˆ©¤2žx,u*[¿žþýéÒ…üƒ>bÁ.¹¤é­/楗¤CæÍão#5•Q£:u"7—´4 &†9sX²„¼<²²öìaÚ´h®MJ⣺¥nÛ6~ýkbb:”ÎY°€… ißžý¨ém›®“ElÜHb"—T&óòÒÓyá>ý”ôtFŒ8ŒlðÙg|þ9}ĺu$'sÁ‡S'KøÕ¯(+ãºë‹yy‘ŸÏ‚TU1hPý¬™“î]deÑ·¦LR^δiìßÏ•W’œÌªU¬_O¯úe’Þ½é×5kÈÍep2Il,11TV6w@…têFX ôÕ¬‡Ã¾ÁÀhFf4p —<ÎãoñÖU\Õ›ÞaÒÝ–ê´ZLñ.vÁÕ¡¤/}'21Bdƒçñ…,lN„mä¸É$'“<™Émh~sIoóö\æ†v)KK¹ôvnæ0çYž­Þó_øK%•#9†1ÀP†ŽgüLfÞÄMñÄ7¾m“Ö²6 8óRiì°¿ò×=ìÉ$ó-ÂÐ@×›ÃÈx üb¬ýÛÒöî¨÷ ïñ0‚µ GŒ¤‘ö-¾Õ‘Ž@ ®Û0ŒakX³†5õ"lIOótµ“±t 2„ûî8ç~û[–,iV„}㠀ѣ=à’KxüqÞz‹«®"9™äd&O¦M›ý¸%ñöṴ̂K—\z)·ß0gÏÖ*uù ••Œɘ1C‡2~<3grÓMÄÇ7±mÓur-AÀyç50N`Ï€uë¢}ÒkÖðÏ2igœÑ¬=ò &Ô|9qb 4V'7G#cƒ_û5¶mËõË$ï½0¢N™d×.>ÿœ´4¾õ-:v¨¨h¸oxØ0Ö¬aÍšú6)‰§Ÿ¦  N2–Œ°‡øC–@"‰A}0 :Æ€ÛØƯMlZÏúb2Èø„O6°! ¨ÌúÓ?Bûe·°¥ŠªÆç§7ç¸%”¼Ç{[Ùº‡={Ù |Ægá7‡1´:ÕëéÌ#˜ÏüÚS£ª¨ÚÁŽL2ß¶IkXt¥k#ß“CΟøS<ñcÛš@ÛÑnû¦0¥öˆ‹Ð\BJ>ùkY[Há<1‰IÕç¶•­+XÑŽvÃV{« 2²ÈÊ#ï.î:Ÿó¿É7ûÓ¿ÁC‡3örÉmð©“o>Ÿt¸úõ«óŸåË©ªjb~zD#×€h™¤o_âã9p€mÛ¢=—%%¼÷[·²g{÷|-“ÑZŠÎ®[êÂÞÐùóY\kiU;v™ÙĶM×É5]*“áIvéÂÌgðç?óþûÌÛÜÛ¶-^Ⱦ}äåqà?ÎCq晇S'Û±oS¦Ôq­“’B~>k×RXÈO0iRÍàÔ­[Y±‚víV§L’‘AVyyÜuçŸÏ7¿Iÿ†ËdtÆ^nnÃOu³LJ͉°;Øf‹RJÃ8[ÉâˆëLçmlË'¿:®c]&™ýè·…-ó˜œIMÍ8xØe“ T5~\`+žäÉp:iaD®ùKšÍ@:éá—Õ롆Â=ÔžæépU¯Æ·mR¸óF¶ZÏúÿà?‚qŒ;ø3÷c'‹¬yð>î[Â’9Ì©=\¸žëÃËTDÑܱ‰M«XUGÃ.ØË¸ìàû'0áu^ŸÅ¬E,ZÄ¢ó8ï~î?xÍÚpœqØ8Ò)%&†H„ ˆW …ÿ¯P«gÿtè@l,û÷³wo´Óîu²”êdÁ¸8:wfÛ6òóV¬àÉ'©¬HK«?´4Œ¿éÑRW³j´”åÿúD«_HxÐ&·mºNær«p¬í·¾Íå×\ÃûïóÏ2fL³†ÆfdðÀ••üæ7,ZĬY‡a³²xðAî»%K˜3§ÎpUàú룣c‹Š¸ã6mbÕªš<vÁ^vY÷O˜Àë¯3k‹±hçÇý÷70Ö9|íù–I©ñ¢ÚÈs«YG^„Hoz'“Î[_ÏúðÙbŠÃé¤w¥k*©‹Y\Lq?úÅYÀæµ{aëåËæhü¸Àk¼VIåÅ\ü<Ï¿À õžö£_u¶²µö³áÆ2ö5^«ý¯}šÜ¶Ia#ìbWƒÏ~ʧOñTeÿο_ÄE­yÉHè@‡¹x…Wª'`Õ“JꜬemøHõZZWpEƒßÿ~ð<ÏßÂ-íh·”¥ Xpð·…äµÿ°‘Ná2¢P3[« €;: uß¾U‰O©¬$=½‰ü&žp¾üúh™ŒÞ  :\¾ö••\|1Ï?Ï /Ôxv÷nŽ–:¶Ö-uáÆŽ­[%_£OŸ¦·mºNž°«¡2®¨öņ­W»qš/6–¯|`ժé“ tèÀ7¼òJͬúu/5Ú+¼6Z&kÖҺ⊆¿ÿ?àùç¹åÚµcéR4P&£ägZ&¥#ˆ°¥”f“ý~|•¯ö pçs™[Ji@ð!i¤…þö¢WU@_ú†é­’Ê5á½ù?nØc.ðTJiØõ[í<ÎrÈ ·ý˜k?Ž ˜ÉÌ0Æ…«ƒUOÛj|Û&…#üÄ|{~Á/ )¼–k¯âª7/¡d<ãÇ2¶Á=½K¹ô\ÎÝÏþÿæ¿~¶’Ê%, Ãkჳ˜UFÙ`¼–VyKXRFY*©#ñ5¾Æ¿†RÔ¾œðσzæ2÷-Þª^YB:ùddÌžMAååüïÿ$'Ó¥ÖÒ,óçS\L0>ÐÜ[œsÀܹ”–|ø!A@ZZôCç°Ç4\à©´”yuÊdô99Ñm?®[ê±3gFc\e%ëÖÕLÛj|Û¦ëd_8Ä'æçŸm0υ眑Q§ ¶¤„ñã;¶þ^Õ«©ª8p€Y³àÚ¨“—rî¹ìßÏ7P&©¬dÉ’hx͈–IfÍ¢¬ŒÁƒXK+/%K(+#5•#øÚ×à_C)ê×ÉÜš?ê×ɹ¼õVÍÊÒ©¬˜PDQøÿ>ô¹Âÿ_Ïõ9äÌgþ2–µ¡ÍNvcÎÚéMﬣ[g:·§}=éÙœ!ž XMv1Ż٠LejG:&“<ŽqM÷b.~•WŸã¹žôÌ%7uP­?ýc‰]ÎòqŒK ¡zŒlèZ®Ç¼Õ¬¾•[{Ðc;Ê(û_ g5¾mÓ¿«ÈïQ½$Yµÿâ¿ÂÑ ïò[ýøïù}õÈàÕ¬ÞÀ†°qŽÑ §Û¸í'ü$›ìa «ž\5‘‰±ÄSþmЛÞáªÕkiÕ›ÈZÏú)L‰#îLÎ,§|#©5|¹Ze³™M­ÆÕ (x–g‚Ît®7ÐV:i\}5+W²d wÜArrô–ªW_]gNϪUÜv:ñé§@Í=¥, ;›âbvï˜:•ŽINfÜ8€ë¯''‡ùóY¶Œ6m¢»cÆD÷|ñżú*Ï=GÏžäæFGÔÔÉþÄÆ²|9ãÆ‘P3F6Z'¯eÞKйsý¶Ò)¨^ØbŠ;Ñi À~Á/ª×TêJ×'y²7½‹)ÞÉÎŽt¼›»«gµ‡Nã´pýÔ°#¶™³ì7°!›ìe, hyóñ\æ6縗qÙe\¬`E*©·rkíá mhóu¢S{Ùû¾Rݧ¤2‰ICOü&6ÅÓŸþÕù©ñm›!ò ¾ü‘?Ö»óV %Õ‘®ö¿Ú#ƒ{Ò3žø‘pTñЅ.áŠ/òbõ-|ÎçÁ†ÜÃ=ñXøGÈbïdgY v ö¢×P†v ÃÖleëÜÁCZïÛÞàbŠûÐçàÛO¤’šJj„Ȭ¿+(äî»éØ‘Š iÛ–o¬­úö%áÓOIIáÆk–‚Ú°ìl–-‹м<>þ˜¹Ñ2I×®<ù$½{S\ÌÎtìÈÝw×̦¿ì2.»Œ `Å RS¹õÖ:}™mÚðÐCtêDA{÷ò•¯Ôô)))LšÄ!Ädzi11ôï_“Ÿß¶é:áßøã£Cuk{ä† ‰¶FÛ¶ÜvC†Ôù†ž=‰'‰Žj¨öÝï2`UU¬]K·n\s O>y„³ø»tá{ßxñEŠŠj¢äçŸ Â=÷ðØcѹ\‹³s'YY w öêÅСtèÀš5lÝÊ€ÜqCë—IÞxƒâbúôiàö©©¤¦‰Éú»ÒÉ'þm°K)-§¼ö-ZG#Ç­¤²˜âFN©€‚Rµæh@ÞƒªÁѺoÛˆ€à—ü2‡œk¹ö:®;ÜÍK()¦8\£êDQHa2É .§µ’•™Ø‘ŽOñT½µf«¯o %‡{Û6éDTTDEEýÅD}”Ü\x€/9z·§ÈaO ´”òò:·’ª©“•7üTu2KI9䚣AÐØY5¾mcu2à—¿$'‡k¯åº†Êd÷;¢0””P\Üðpá  °°Îk—:YHrrÃËi­\ÉĉtìÈSOÕ{T_ß’’C¶†tJ‰}ì±Çw›8âžiÞ 9n 1ŸRI iˆI&ùP³Íß¶±¿ˆ|™/ç³€)¤„=ÓÍOüá.ƒð…K$±ÁUÒrÉ çz”GuK¶8âªï‹&ÜHJªÿà¬YìÙðaddœ|$ùˆ‹;äݼbbš¸ÑWRRc·-D;«Æ·m¬NFøò—ÉÉaÁRR¢¼êvò¡ C|ü!—AˆDš{c³Ö®“‰ ¯’–›]œëÑGë ®w}“-“R46èXJ"éAœÁŒ >ã³SóSò *V²r8Ã20\å@’jÇßdÆ øì³SôSòŠ V®døplîÚ·Ò)îHH’ZÜþ'Ÿ|ÂxÈï%IFXï¿é}VŒöÍ)I:ÁÓE¦7ö›.m™›@’$IFXI’$éjÕé\•Aå?>ûÇ’½K¶—nÙmä×ӿ±•Á?þñÙ’%{·o/9²Û׿žn›H:Yµ^/ìî²ÝÃç 5Ô»>Øs`Ïúýëm}Ij±»»løð9£FÍÿàƒ]{öX¿~¿m"é$Öz½°ÿ¶ðß Ê V^±²{rwÛ]’Z¸ÆþÛ‚‚ò•+¯èÞÝ…C%a[Ȳüe3wÎ̾4Ûü*I-_c—åÏœ¹3;ûRó«¤SD+ $xcë=Rz\Ôñ¢²ª²ÂŠBÛ]’Z²Æ¾±µG”‹.êXVVUXXaƒH2¶Œ-%[z¥öºgé=íÿÒ¾ë_»Þ²è–+l}Ij™»¥¤W¯Ô{îYÚ¾ý_ºvýë-·,Z±¢Àf‘d„=Z[‹·fïÉ.­,]6|ÙüKço/Ý~kέ¶¾$µLÝZœ½§´´rÙ²áóç_º}{é­·æØ,’Nb­4¶2¨ÌHΘ|þäØH,0áK†}8lcÑÆž©=½’t´5¶2ÈÈHž<ùüØØ0a—† ûpãÆ¢ž=SmI'¥Vê…ÍLÉìžÜ=̯À¹íΖ,óHR ÔØÌ”îÝ“Ãü œ{n;`Ù2ÇH2¡‡fïÉÞ]¶;üòÃ]¦Ä¦\ž~¹@’Z Æ혽g÷î²hýpWJJìå—{kIFØ£ssÏ›ÓÓGÎ9sçÌw¶½óتÇFv™ç'\’Ô5öæžéé‰#GΛ9sç;ïl{ì±U#GvOM³e$aJrlòì¯Ï®*†Ïþí~»m\ÛIý'Ùú’Ô2569vöì¯WTÇÏùö·ÿÙ¶mܤIýmI'±H­y¼½öÆDbÚÇ··éD¦Gy6ØDÒáÕØ½bb"íÛÇÛÒñò›.2½±ßtÁh›èÈ´öÇL:Øè’t¬jl‡AÒ© Æ&$I’V’$I:†NìùªŽ¤ÔñöÞhü¸û¢ÎêäûI±2F[€£ôYh;ûŠl ì…•$IÒ Ç+I’$#¬$I’d„•$I’Œ°’$I2ÂJ’$IFXI’$É+I’$#¬$I’d„•$I’Œ°’$I2ÂJ’$IFXI’$É+I’$#¬$I’d„•$I’Œ°’$I2ÂJ’$IǸSö•G¦Gy6øæÐ¼sNÄwìѼ¢c÷“r|þ„Z7£­"Ók«`´ç,‚ïÉÆ_Q¿qê¾^{a%I’t‚1ÂJ’$É+I’$a%I’$#¬$I’Œ°’$I’V’$I2ÂJ’$É+I’$a%I’$#¬$I’Œ°’$I’V’$I2ÂJ’$É+I’$a%I’$#¬$I’Œ°’$IÒq#Î&8‘é‘Fž FÇhÛñõJ:k]dzc?ûÁè/丧Z[}Q{>ùÞWþ„¶Îž[í}e/¬$I’N0FXI’$a%I’$#¬$I’d„•$I’V’$I2ÂJ’$IFXI’$a%I’$#¬$I’d„•$I’V’$I2ÂJ’$IFXI’$a%I’$#¬$I’d„•$I’V’$I:nÄÙ:¦"Ó#'ÜžÕRW!ø¾:™¯~dº¯÷ ßsãÛÁhßþ„ž¬××^XI’$`Œ°’$I2ÂJ’$IFXI’$É+I’$#¬$I’d„•$I’Œ°’$I2ÂJ’$IFXI’$É+I’$#¬$I’d„•$I’Œ°’$I2ÂJ’$IFXI’$É+I’$#¬$I’t܈;‰_[dzÄ Ü me;ûŽ•tÊÕ«Èô/dÏA0ú 9«/ª5Ô{a%I’d„•$I’Œ°’$I’V’$IFXI’$É+I’$a%I’d„•$I’Œ°’$I’V’$IFXI’$É+I’$a%I’d„•$I’Œ°’$I’V’$IFXI’$É+I’$™HÇõùMx‘ª£ƒSª­¾¨×{ªµ³ïçÖyEÇiL÷­Øï`´WAjÙŸ#{a%I’t‚1ÂJ’$É+I’$a%I’$#¬$I’Œ°’$I’V’$I2ÂJ’$É+I’$a%I’$#¬$I’Œ°’$I’V’$I2ÂJ’$É+I’$a%I’$#¬$I’Œ°’$IÒq#Áq}~Ó#^$I'„`tpÂs$2Ý 'éĨ±ÁèÚ_Ú +I’¤ŒV’$I'˜¸Ö<Ø»Ûß·{^·¤nßéþž©=m}IjÉûîöyóvwë–ôïtïÙ3Õ‘tk½^Ø{—Þ;:{ôÊ‚•/å½tá./XnëKR‹ÕØ{—޽reÁK/å]xáË—Ø&’Nb­4kEÁŠðæÿ{óšŒkª‚ªsGT\òAÓççt.I'ˆ/p:׊üýÍ7ÿß5×dTU#FÌ­¨>øà’¦k¬Ó¹$(5ö ™Î5mó´îÉݯɸˆ‰ÄÜyæ³vÍÚ\¼Ùë!I-Pc§mîÞ=ùšk2€˜˜Èwž9k֮͛‹mI'«Vаkö­”6¨úËÁ§ Vî[館±kö ”VScŸ¬\¹Ï–‘d„=*;Ëv¦Å×”×ðÿ;Jwx$©jìβ´´øš›ìØQjËH2•âŠâ¤Ø¤ê/c¢Š"/€$µ@-®HJŠ­©±‰1@QQ…-#É{TÒZ½pô„IDAT“Ò Êk¦Ç†ÿïœØÙ I-PcÓ“ ÊkjlA9йs¢-#É{Tº%uÛV²­úËí¥Û®I]½’Ô5¶[Ò¶m%55v{)еk’-#É{TFt±hï¢}åѹßù÷öñíŸ6Ø I-PcGt]´hï¾}ÑŽØ¿ÿ}gûöñƒŸfËH2•«3®î”ÐéæE7çæÎØ1c⪉7õ¼)96Ù I-Pc¯ÎèÔ)áæ›åæΘ±câÄU7ÝÔ399Ö–‘t²j¥[k ׌š?j徕I±I×e^7å‚)ñ1ñMŸŸ·6t‚øom¬YS8jÔü•+÷%%Å^w]æ”)ÄÇ7ÝIá­ $05¶î­ Z/†v—ínß.!&¡¹Û+ÉÛü»»¬]»ø„„æ~Âf„•t‚FظV>|§ÄN^I:V5¶“«H:%ÄØ’$I2ÂJ’$IÇPk…•$I’Ž’½°’$I2ÂJ’$IFXI’$©Úÿ¶|8ØÛ@EiIEND®B`‚stem-1.7.1/docs/_static/logo_orig.svg0000664000175000017500000001050113157571677020311 0ustar atagaratagar00000000000000 Seeding Green plant seedling. plant seeding seed floral green Open Clip Art Library Jakub Jankiewicz Jakub Jankiewicz image/svg+xml pl stem-1.7.1/docs/_static/hidden_service.png0000664000175000017500000006140413157571677021301 0ustar atagaratagar00000000000000‰PNG  IHDRa§pÎ(sBITÛáOàtEXtSoftwaregnome-screenshotï¿> IDATxœìu\ÛÀÏÌ6µäÒ J(v+&v·Ï®g‹ùžÝÝÝ…É3Qlé–îZ¶&~,"±»¤ñ~ï~?|øÌÞ¹÷Üsî¹gnÍ PŽÝNHÉúÕš ñ»‘weÿ_LHHÉŠŒOýÕú ñ»Ÿ™ø¯V@ ˆßä#P ³®­Ø³¨Gá™Ä5sÏ?ÖH(CgèÊI¿H ²‚Þ½9|=(F\#ø×òðð"ÕºNÞ\ir…q”ú}ú‘›¥BiVvA¶ØšzM;öØ4ÄŒWm ?ßD @( ¢£Uáz묹aîöM¦ÖqþÔVi/§¬ H$cë¶é9èh++Ku ¤¡Þ»ü.°€¶ñ¬õ£=µ ñþ½ÇFîÃ\u üÎŒ»˜"Q(=þŸY3£WŽcÚvÌÄ\±)G¯£gÇås¤ ;Œ9;²ßL[ñ$ ·X²yX'žèþ–ƒ[#i»!“öwÑ„Ø{#6…iµé<«§cC]ˆr3Ã><ßä™EÆÒiÛ§ã¨ÖÖVš8ˆs>úûï¿þ%NÕ3@ µ@EO±*½Lyœ‡‡•È)I¥Prõx‚Ê©Œ h )AHIµŽGzuµ¶TÇò² ÅlÍú-:l]ܾ÷{B3îc]5ÅB‰”ª$ ¦š¦>€ÎÏ’J$àZSÇ,Q#—ºšKß‘¼vZL\­¾½&$‡¤MÜWŽrn¨ËH‰Ž{–’ÉÒoì$ÐÄpÍΓǮènk¥Qž”ÄÐiܩמ©Î\‰øý(çU;HPØüc@»aÝ[(Ëàâ½×Ç®=«¢6ls·1 YÄÇSG—¾ÌçØu>²°© é8ç€Åß" ÃÖ¬¾ý,‡b21B™ Kó=Š‹böž Ë¢K-%7ï¨4Ç ¸±»!WÏ͘óJËÒ€0kh¨ùTÒÌÄ!¡yÀ7Ѐì[öøÑ ¾OLÛÜm¼+ ïÒ†ãGãdL£‡V·³hغŸYèáTj(5@ ¿”ҽɒe‘ô#_öàU°ÂØ^¿^U €i˜š¤?Ê'„ñ¡€[ÚòÙß"e¿yCÀ·¨B¤YÙù€šõ+ÝRŠ—’ªr”d¾þJ°ì lêƒ8öj¨ 3µ²3·²cPi¯S¤’Ôèp@·éö }·OÚ=½cG}š¤1 33èÒ¹/ò]ÝÎ@««ž!øÅ”vŠª—ù(èGÒ4l;å«©Æméj[:üU`Ô¶S¾tÚ‰ s$¤ò³ÅÈç#)†Y—Ñ'† [µëv/úb¶* r¤EAÙ`§gØÐ¡=ÉáÏ>p×7ëЌЀ”˜È" >¯Ü б~“zú–&:õéÔod ËÎ{.< KþÞI$Ó¾ÿ¨’!øÕ”ž¹,=7YÅó‘E¯;r+0<¡$$0#@ü‹¨8ÄZ“u­©ì¯ý×w,aej›”ñ×þ멬ºªH¾¾;ýÅu~CV“±S.õ*dëkò ýýÉ "øÕdÙqÏú–KÍ@“ Pÿ:]ñ”ŸÊA’!kÜ‚…H#Âó„ñwCÈ¿dK8FnÛ–4ÆSRâ²Ä¸Ž©+ròIiúû“A® պ͞왜N©™[²R¶,G;5âßB9©p¥kiTíýŠ$‹wx/ßsˉ»BQö2Pù÷ž–zvÙÊÊB_daÞõ~"`Wžºl=]6Qzéòó@‘ *rqú«$hQ2ߦÈ@šù6ÚZ@æë¯R 󟇘µ²2nlŒ@ajÜý[¯§’ù÷n?²•µµ•¹©‰O?} Ñ€)R@ ¨åKê*÷ró‘*Ü$ÓÖžBï4G ĦN^”SËäU|ÏN~fқ뻑D ¢@ Å ‰@ „bD B1ÈG"¡˜júH"ñx'³6{¢e厅OÆZÛO÷þð܉uÊø­”ùAH#w´2íxôëý<õÏÉ¥üò*þå ¿%Ê}$s³  õç¿•¨Ùy îQ_³î»Ÿ³Tݱx)MˆøCíÍÚˆ«ÞíM¦\ècj>äf&U:TôÞËYà¾9Œøa–*„ιÙÇÐ|Ì?߃„/¦Øz\H£Ê«š•@í)Wk& :MÞóßúŒ&uµWù+WN£•¿â£0ª¯%QT}÷cº¯»º¶™šüGß–§«¶xGÛ¥L™ìp5Ss¥úáºmk© ðëÄÖ0ý„_zï!FŒâÀ§o¤;ÎhÃÕuü–V“Ú«J*6»öÏ³ÕæÛ›Z¨ÓÒÜßÍsVôjøþ`þïø9J*«{/ñ»ìñ{X@€èÓÚ! “¦œß×ÛÀ¹†vœ:Ï@üL*i":6N®Å¸8šªQÊdı7WlVO ìÛý±÷uMz¥³suu¶ÓgcTΫ#›™ ‡n ®Æ£ëûÐPÁ£Ñ­V„JÃþjn*ìg½.ªbn¸^»?:±ŽÝO)yË{ònžëxOKV¹¡'ÖÑ9¾Ã¬]—|•æÝÛP`=ñi@î½Ö ç¿U¿”PZº(ìÜ'@ 0±o3îX”TA PyOëä`(,ܯòM”4¶]upi߯–#+'sAã¿Jº:t΃q¶6cïçT÷«Ñ - ;GgwÏY‹ûêæ‡|É"@‰ÊÿCf=YÙ΢áøó1¹Îí·^Ù1º¹…@`Údäž÷¹yG&·µ <×=Ï–_h’°£Ó{6³ã]gœ*¤+˜lÜaW¤La. JµÊö3ùÖÅW­³. S7oàâêêêêl!ô™Û¹&æ×F™ªPé­*ÜÑÊ´Í_ûöiâ`ejÖ°§×ͯu«ño¡Ž†©œ'^ýþ|n;ÿâ‹÷oýv÷ÎÚ1|ò•äºs#S¯M±1ªÝöoß]žÊ8þ·_a¹š]Îø¯©Ïv\õ&)===bO 5…‚€é´ú£»æ§“·å 'óòÄâfº›”í¾*¶ŽÒtîf•ýòUŠ @z?ãJ>ý+E=¢»Ørkm¼ˆ„s3=²^âøù½ßÉEfœŠ%ÀI½1cÐò‡¥7_øê_xlìÐíÁžP~Ø›3çNdjrØõÍ2¯ –?SPÙÏ?Å»Mh©SÓ U”ðäʳAó¦†,R‰Ê¿[˜þ`iŸ1> ¶ûa-ï‡ÉBîˆè°Í÷™ÏºFï׌=fÑÛÆ«o<»»»Sü®[>‰(î8jóµ×>¼¸¶ÌéÃòQ«ß ¡œÉI¦Ù0墨TkGÍW\ÅuGUoUYÄ‘+ÚK…ÄÆl±»7}ÄÎ}Aø—£ÚGÒ’{Cm¾Í®´Ü¡ìY’L»·å:wÚ5ÃZØ›[:uŸ»u¶iÀ‰'ÕØ*“@`7Ý_H$ß=ø„7rçªÁ,-\üµe°ªÛÏQ¦Û8Oý/g®ÇJ€Êzzâ Ùæ.†Œ2‘”Y‡4k'ˆô)–ÄüÄ4³•ðÅ›4B–üêUŽu7gÍêúšræ[ ¸^PÑT2÷k£^ÛŽ­ŒÌ[y÷0¯ð­i"ùîþGÌA;7iagåÔcÑ~¯úQ'÷¯µúü=¯£ gjÚôœÔ²àÖé…@eøðWë=ÖM«šZWÛ¨žÛØóz[Ù\]¹ªuYÒí½&>jºçΞAß Óê¼nÓm:¶±`ŒeÖg­9›¦vtvt8ŠcÖ‹WÉ2à9O˜=¢£«µ™™}Ë‘«Öv.zèñÍ÷”˜¬¦ÎÄåR•R­54 Ž”Qz-UýVUï¾bf+]°M=¼»Æœ>\w#Ä¿†ªÏGâj&õX ø­u’„×Q¢Ø·í̶• ´JÌ%À¨:wwÙùHŒ­gÓ}üŠÛÿé¨!S³ïäÀ¾Y ‘•¡æ:z éésW¢f,uÈztü%³Ó‰vzå”ZÇ±êØ„sþAX~ÓЗ… yv>î”ç)~” h×Ì@uÑ* Üt¬èÓÚ!‹òËGâØÝàø7·³];vî5¨;+õòÎXšô1³Ú ØK³ŒÜ›ëçFæ‘€eâjQÜÃÅõÛOì@Ì<õ6¿u»üûÇßêö_ÙH½ºZŸ$…)ïί\:z¦Ý?'ë(ÑAD«ÐM²cðdÌãð?;ú–éʳL›XÉ‹…¡e¬Å2id#·™©e¬… ³Š( 3ŸïY´òðý/™Å£©¼žù»¬É 8—ª”jµPVJÍoú=m](£ôZR~«j”•À2kZ¯89CÇÞY'ûsL!Õ”‡6‹!þcTÒË'5K~+[2OS4£ÉžOw‡Öê*Ÿ@ €1X%Rq&«nïRnýáÃê¼p!dö”O'Þ©{\R0Ö¨Ô:ÊÑÃA´éÉç·Ÿ­ú»X6î ·õÁÇ’PnÓùV5+k¾°@—|$ðνÜãùÝûÿ¹¿ið–m£½ý¶tЬ ´ªò ‹ñí¦ÓònŒñ'ü3ê%œül}üd¸ÕÈÁ¶µ`¹¿‚¢œ"J™\Uºá:mÿºz¬wø’¾3¯T\Ê¢ Yâ›/Rש“;Ûéñ‘õ%4WéH%¹((ÕšS#óKQ§Ê”¦Ê·*÷"8OI–òæmŽŽ“•êD"þ{ÔÍUÏ0î½x¨Öã9Ö]ø5êã£Sk—¯öR82':8°„ÏaIE¸IÏ©m²N¬¹!¢iqÔåõGc+&cjš›0“ž¿ OÉÌÎVw{8ËÒsœsÖ…ù›CŒvQàÛTXÇ6kÝB3òêsY“vlà9tµMñ½ŸjÞ¹‘öjNÄÁ‡Vï¹æö555öý]ß0ÂÈQÀ*W`Ücz™÷œ%gßDÇñÝ2cc¨í¸‰® Ý6Ïiô Ý›E9ŒîgU3Iæ'D†‡‡‡…~|rzÕ’ëy‚N]­8L%:( ÿ&ŒiØ}Óͽ­_Ïî»Ø7­êUÉ4°À#ï¾H‘]qiå¶/Šzkߣ—ËEq©Ö‚ššð”)MÕoUÙ«5^'^Ç&Føíš»%ÌzôXg^])@ü{¨ö¤™bpŽ›ïž,Y·¨Çž<ž±kÇ‹«í'h"`iß®ß뎼ýaGóNÇϘãa¿Š­kÞfÔ´6ÏTHÈo³hûø%\çƒöPŸOÕXÚ À4í9¡Ù²?,‡¯¯p¬Q…u\Û.®ì3Ïœ»Ùó0-×.6ð<£Ek³ZwÈ”sØ©w×Y›OÇÔ}Ø®ÓíÙ¬r%ÐoßåÌÅ V÷n™ ó¶œ<<ω  è¡…c?t¤ížüñ½•oFU Mø/ì^¼ySͼ՘]Gþj¡FŠuPþ]7–Ù€Ý7…{L¨qÁgU‹*)Á0î¿cËˉ šÙÌ×Ò5k3öÏ^¯¶ªî)•Ée™±ÂR­Œjš_êq@I×U½UY޳æXÞ™ÜjI*©ÛxÜÁ óœÐ^OÄôýÈÿ_…U@Ó4MžÛ½¾@SSSÓ°~÷¿ß ë®@j/§fZ­d2ùÎH%åóÀ0|íšu“&N–{ÊJã#‰@üÿQüh\úV—³~ý¦ªLO®_¿©Ì˜M—V:]êDÅŸU†L{r%Þa¬»Ð4Qê¸B0ÝöK÷´/Ñá‡Ry^4®ë6òïñNõôYá¾Û.ðÌ7û|º‡n·¢SRi)Pöœ4æèÐ.KÒ=—ðiiÎÎÏÓš®«©µ²fZªw¥` hÅqü'\,⇲víÚÝ»wW Ÿ={öòåË+†ËÁ€¦éŠîP>Y) £ÑùömnÊçó-Û;/…‚ÃÜ–|‘„,k¤ÏçóëúÛ³ôÏiþ¹[Ý š/Û5·»“•‰À®ë‚ë ÒŠrÊ~u9Âj`;üû±Æ‡ùö‚>wó‹£ú4³™ñªH–pÒÓÄÄód‚ @¶³ƒ Þè©$_´4ß%Ñ;…iÄ¡‡&wu5ãóù|]ÛöSŽ~.¤@©LÅ\_êéjÌçóù–-ÇìôÏ&Êä@‹b®/ïßÄ”Ïçó :͹™L€šËÄ…Ó†toÛÜ­Eç‘K7O±,ü,º(ôôÌNöz|>Ÿ¯W¯ù¨Ã‘å¹K#¶º¸¯Ü·¨g#¾n«mR*óÉú~ ôù|Ûo…Iç>Yµú}³Ý7öÿÙ¿}s·–]ŽèÀ+¯d™âÎ{`b+m>ŸoèÒoåíD)ȳk±æäªAM,ôù:ÅU\^NõÒ–¯Ü…¼;X2(¢yGS>+O…a˜ê$rКpâwfÙ²eƒ *8hРeË–©HUì# ‚¨;M¤_v¯ l±Á7àÉ™Ñäùsn¥«w»ønCCNƒuŸ2óòòâÎþíSúçVj ?è­½üiTrÒÇíöw&Þ,ÅîmÉ7û´è¼·ÞÁÆ};3Ë+‚e1jÿ&÷÷^ÓÎÄIÅ!û&­‹ï¹{[#FÕL exý1Ûo~sk¥Ë»%CVUȤrüöœþÔnÑÕ7A/xfm4áRrÙ“Ê~4ÏcÜYzèéÇà÷OtU‡Ò}² æñ¹;)ƺXrˆøÓ“ç=°^îû14,èùÙ¥ÝÍ9˜j‹¤a.pç?ŠÏÉ|6ˆÒ]›£{ ¸<™}~ü ­Áb_}Räе3—…+»œ˜r/\4°eå¨÷\5§À´ç²e\W 𻣠ÇÄŽ¹…–Ü~ºü^§Ç V™ã e¦™ ß»ÕÇ}ÎøÅï„g’ÍÛÛÀ`àêÙm,›~Ó:._®Š«V ^¦r%Séò7µ*Œ³aýLþZWš¦Y,Ö”ÉSå§0 Û»o„ò¾æT@Ô6›}âĉ!C†|øð¡I“&'Nœ¨ôµ9Jû‘¯_¿ªJ–Š¢±Ì›Ù¨Ë3[×DC’]T•m—, 7+5ù!CÇÑE'+(º€b˜ 8ôàÆ²Æ<€¢àk¯8{ÛpÊ+…i:d׿V!ÇÏeôß·©GuÆðÈŒgÛF·¶Õçóù|¾ù ;yÙ‰y¤R™’øW‘¢˜Í-|9ún«ÂÅÙ_sJ÷Ò$ñobhÇžµ+>±¨·ÚñôåóÇ7,v ZÚÁƒ,Šë0b¼ÓÇ™ÎÎ]GÍÛxêŸá·§R‹Xf-¹¥,¯×¶¡¶ü,ÓÈ­™^VPt>IÑ\­»¦wiäÜjøšýSMÃOŸ Q¶_Ašø!³ëÒPS®0˸…»AnpD. ÀÔ7.¾²úÕ½ëéª.ýοÞóém߇ï­ë·aÓØk/vtÒÁ•[„áLüûJ((]xÅÿ1ž@ÀAK5y މ‹)‰É’Ñú¥”,U“@ƒ¼ö¾-“-UÅ€aßJ–7õ=»bc«•¶¨T媼àj‡¼I~Caœ¥Ë–”/^äÛ¶o-ý©,!ò‘Ä¿==½‹/V1²Ò5;u Žã@Ï¥ÜO âžåÊdÉoÞdë:[k–ö8’Ø»ŠZ tV/wŒ«ëªƒ0[(OJäD%•í·|Úí9öu\5õp¸¤¢RŠÓJ_ÉMŸÚÕ^ŸÇÀˆÌ /9ßZH…29-làË5ÿL…ȱp·ÆÂ|?æªr¤TFÓE0µëw5oã‰{/ŽµÍ¼v注J•æ‹/Å…I¤½›¥ël­©áÐ¥žöµH®$%8t­t•Mÿ±ÍšZБ~!ò©`¥¼ÎÐnhǯJo¼ÚiKWè¤dÍŽ²^‹––ü—Ëår¹E/œ¿¸t¸BD þÿ(ö‘ ç#«’¾ŠÑ€©eaÊH|ú",%#+GH”û Rÿ¿}“þhû¬ ¡6cÇ»ð€L¹6Å£ÿú"}}x;«Ñ &šeŽcѾ5?ø˜wHME^^µ#HÞ9¤²-›î­3“üö IDATÿÈâöíê³fÊÁ0q9­”¤e:Yb‘·Ÿ§È€. ¿°lK0È •Èd{.®õpæ˜ÕWßF}MˆüðàøªÅGÃÊx0†qŸEƒ87¦NÜê›ûÙɲ¢÷Û¼6¾ó,àýÛ—¾'–™å‡wÛJGtà¯W^†&¤¤Ä¼½s'Lf\ßU%‹¾!y±bÑñW1‰áwÌ\l=v¼ aâ¹ /Ûwþ¢þa‘o¬u0ÑaÌè¼2éÄA[{L¼ð•¦I¯Y]¥g-<ý:*.øîÆ©kCì&Li¤V¥Ú®fÚ2ú#‘—Tý‰P>ÄZÅÈèUŽÄÿÅOö}dmö~(‚ßnÉâ–á‹ÚÖ·³i²àmQ¹ŸÀ®ÿç‚z·Æ7srtX2üèåÎ\Jœò9àMD>I¤>¹‘\psm  ô1¨»¯<4Cí@'3#‹&“_ºýÙQ 2,qEþ‘9.<`öÞ²§wºÉûCËù…ia<`ÏÈ9Ì-íÜþðk4¯.TÉÄu:o{xnßw^W7g—f½þ<É·Ð.Û¶âº]wø*=3¾}c§Æ]§ a®¦žõhÛTOÎ]{øû>sð®{Ç3p+õΚá­\ê×oâ¹%¹Ï¾3³˜U³H»þìù7Ç7srxP4¬¸0qýî»oni¾¶g‹f§ßÑŸyáú‚†Ü² ©‚¨·I" €a<àð ̓ÿêîÖ¨ÍøË¼Ig¯.tæ)Ê­"ÕK[®B òë¼*9äc¾AÈGY«õ#ˆÿ?0øðáƒÏܹsKÏmÙ¼±ÿvöö*GFD\¿~uá"¯Új!ØÚºÍ‰ïžL±P<ôG¥\èé~dˆÿà fŒÒÇµÍøCÄîo×âìè€gÓêý¦oæûøYŠaØŽ;<==Oœ81a„J]ÚÖíßÇHæÌž§ú]t ãøñã+V¬¨]Äo@ñ·±Ž>õ0ðê•˅µk7,_¾F gΜy †ºÆÀAƒ†¦„L½ç’å=åŽchY~Êç÷â¹vzÈAªâ'V¨|>²äÅrª#ÏŸ»°ôOÕñʤ>øÙ|_×Zî„ýÒe+€$Éõë7Á·éùqéÀ»QÛÂsö4Ç¿1¢wKÚõ¸Âï¿i{«>Íöïæ'VhɺÖ$üGˆE ¿&(\_z~¥ôY…µ…m¿àmú‚:÷[ Ör_Tî¾_­¢ òKýuøP?øÿ€üü|Õ›£ˆÿ0 ËÏϯô{5þ#Ä"ˆ_±±±¦¦¦¿Zâ‡cffkllü#„ÿ ±â€wïÞÍ›7ïWk‚@üp:uê´}ûv333???©TѧejŠüè—.]ªC™â—ƒ@nnî¯V@ ˆß mmm4 ‰@ „bD B1ÈG"¡ä#P ò‘@(¦ø}­¿Z @ ~;P?@ Å ‰@ „bD B1ÿ•/’Rêðò ÎbRœ­7±gqþ+¶#¢füWüƒg"ÚªHCÊ?tÙ…›]šØýB}üüüœœœ´µµëä‹+………/_¾¬½âgÒ«W/…áwîÜùÉšügQV•BÓðùÎM }äÙ»£zºÖ­*rRRÓŒ ë\,)£„2IBt¢6GÀ×â™×}ÕÂÅÅÅÄÄ„Á`Ô‰´Â‘#GÖ‰(âçpîÜ9gÑõüP]*¸õ4ì´ïç³krXuÓ‚ÕùçZ/?}Û«E# çÇeTí½4 [Ïù_¸4²‡ËP(99E(Z[Õ«Û¯ñ]»ìoꨕ–šž_$viosòÈõy+ÆÔ¡üêbhhˆãx]íºA»wÿFÐuûË©A¼ NÜxÚ_WWs榻»vo5áXÉ©g‡Çk¨±ëTA¥ä‰×\¸ø5­wËF?ôBª^?’ (¯}ÿþÀï„Ð4]T$ŠˆŒ²µ±®“nMÑçOÞ¹páÁ¦³“ï>âfíÞcxó“q¸Œ FBM1MÓ ƒ¢(‹¥¦¦–ŸŸŸ——GƒÁàr¹ò/%©HÎd2ë°^Q[ƒ¨©T –––\.·Îå'gäï8û< økzv¡¶&ÏÖ\dO×.îv,fñ]¼ßûÕ¨žµ4ª‘õ¾·2’ü¶²*Ybˆ}kèo¿1 i& &7fÕ1%D}Íž·ëÑÀ¾mlÌ×ïLÛx–ÏŒãø–½×~šï#ã&ï:›™ÛË͉ÿØ1ßjL†‰Ä²‰ënŦ6mdÿãMMM’¤BÃ"d2Y-E…Åôë=òò ïÕGÇsÔYYÙéVÍL“C²qòÆžî]û~ ŒªX¹#äóù:::ÑÉÂ矾Æä›occƒãxfff~~>I’*$ÐˆŽŽÚ»g——×BðòZèåµ0,,4,,T~,Ü»gWttTÅ´ÈG"*%33ÓÄĤ^½z™™™u.üÁ«ˆNSŽÜ÷•b«7t²³µµQÌ­g^6±çÖÓ8ïûiË©§Õ}$• %i)EKe´”¤¥2R@P´„¢ˆülæû§D~.AXFË( TÝpÿ!¦Ì˜åÚÌݵ™ûĩӕ…ÔŒ´lá´Mw»vjjb¨—.ìÓµSMXLÆvTå0Òá³8`04xlüÏ‹Vµ™•_4qµ›Ës¬oEã?| ZMMM$…†…;ØÛq85k>søæ²¿Oš?yøôÞ8ÏNÉÄ8¸$¿HŸ¯›#Êœ{zö½c»zt^<ÅŸ 'V],ƒÁ`³Ù\.w÷…€½r Ä%§´5¹3‡¹ÿá餮®"‘H,+—T† çÏ 1ÊÖÖ–¦éM›¶Â·ÞaÉñ¦M[£¢¢.œ?»lùʪk[%ˆø}Íö û¸Øþ‡?‡ÿ̼J†­sq½<#üݬzUºâëJÉ_b¬"H’ÌÏÏ711€¢¢"‚ ˜Ì:[¯•ùçÖ[\-‡£ÆciðØú|ž>_ Á³Î-(ZsôŸs¾Ÿ"2 ¬º(2È(n~åÏàLZïÞi“Sk…¹>hvâÈ8Hô ¯ß¼éß»[XxøÛ÷ï•…Ô€Â"éÔw\œíÚ™E¥$A÷ìÔD¯FRôO^¾ƒa’›¿zPWŒÉªÛY¹ŠTé>IHÍûc¾®©¹qbF‘™@ƒÉÀÝÇ©“Çf?94¶*2ƒ‚C~ž¦iZ*•q¹ ÃBÃÂíìlÕÕÔª"³4‹çìxàwùð­ÝöÎÖ@JˆØðXœÍÈÍÌwéÞhÿßA § ZŽkaÙ²Þ¾¥›ƒ¿|ÜhWUvƒÐ4Íd2¹\îüí÷ÏÜmM®‹!<ûŸ[ ÎÍ©ûûC·nÀ[´Hìå¥LN¹Ba¡µµµ|"ºôÙ’c𦭭­ ……ÓÖ¶‰«;öÕÏYëgì–­­nc&–‚Œìû(+ 0d`|rmµK¡m#£§WvCnnÌämT-&ˆœÇ7ï„§Ñ€ótMmštïßÙ†—ób÷ö·MçÎn«Wn•]“Tu‹Éºq硼M8uö‡ÍÆqüúíÀ`ÖP#’¢îydh¤×¦™}Tj!AÒP(&¢Ó ­m­bÓ…Võ:4’d*ŸkÛ|åAWg»™ý»Öm¦ ©Ü+„DgLÛxÇÜÒHÏ@?-WDQS iß¾)”k–1 IêÅóU̘$I>Ÿ3Ê·IR4MK¥2›DDDÙX×ÓÒÒª¢dXºhç« ß“hòÕ ûk®ÿ­7Æ=õ€¢Ó3Ó¥E+KÓÔèž9[ÝZ}è‘—çyÿ9cÑþ£Û+•Ì`0ÔÔÔâSråÒÒXûáÁ1Úš\È-û< Wã±àOqì¦M•É©èÕ6nÜ"wªÙ¸qKÅQÜZûHýΫv®•ˆºÌ‹¡ç>~ãWkV~¨ÏúY3»æ[Ä\î£Wã§EJ*UZ°Ò¨}[ÍM°öä£6–œ¼ØÐ\-¼î äglYH’ÌÍÍ•ÉdAQTTdo_cóɧ׾¦õîèb ­1°³ M^Í9)IËhªx2Z3ú³A€Ï9J¨k'·ÝdYWÁ£Óiîž…ÛÕÐ"åñ±ÓOÍûŽlÉgJr’¢ÃÓ e4ðj ‹&iöóç`#CÏÞÝÓÓÒÃ#£ví݇cX÷n웜œ²gÿ‘OŸ?7r©örËõ'žç‘ý{5ŠNÉ/%á2Q ”à8F’<‘D–œY`o¡Wý³ „§¾ôý± oûnnÎ%á¹ùù‡}Ÿ‡¦f«ih¶°·¼÷9êîòɵɨêTò€ûâS¤ ·-ê™jéèfHämxžPš’-JÉ)ó—š#ªnŸÀ2©¬ôŸT*#ˆâ: d“ÁTSS‹Ž‰ËÊή¢ØÛÞÏ}n_Úyj£ÜA¾ºøìE€Ù@C¦:KDJ4šk=½ú¶Q۸יBR$$E¤&í±¡×ݧ7/¹[1ˆKÉ“ÿÌ+?}/?ÖÖäŽéã:¨Kˆ‰ÐÑ®ÕxÌ‘O:ÖM´¢€ÆÜÎ>ÅJBÁƒþ|Á„BYÜ‘.šš]ŽÄÉ$!››qõ]N!ˆßטÛ`S„LyZñ—=£[Ùð1 ؆ncö, @©LEyÏëb£a¦ëç‘â"R,$%„64žÖbËÖ’"©jùòÇmW;Ã’¾ã¤Õ76ZpiÍá§ñ)¹òAÿÎÃÒÒªV4MWµè”E«Je³ê?¾«Õ›9ãÅHÅÁÛG­ˆí{dßã*v ()Þpâ~¿ˆ¸¸¿õæöYì_¨B&•ý`f‡ ~+|Cb£?ž˜±®çð³‰e{ÀTÖ½im†ž€Q§ßEÆE¾>1½±FKÈü¨û'o$™vënÅ!bžv×ví³ÈĤØ×Võ±ä`ª-’†ì:Í]êŸMJßÏ·g4xóšHϳ_â¾Ü™É>5¬çºÏb(ú|ñ‘°~Ëä•mÌ4Ø<“çÊ»IªÖ‰‘É—Fw™ó¢áº§¡‘Ï+ØÛßcÍ'‘üœôËîSœÅÏÓ%EaÛL.Ošz-ª³´Õ‡Á`0 ÇãñX,V¹ÙGƒÁb±x<ž| véNäúõë+îM9räúõë•å…ãØ’?ºtmjzñïÞ&úò@‚¤.=øÜ¹¥£…‘Ž@G‰ã4M—{ŠVq‘ËË@"¥%R’ Å öfòÑ\KW–0׿Ü bä ûdˆ¿¥«® —¯É%F& Ë”:ÇaìüÞFLÃ^ ×mܸqå`+6Mb†ÍûM^°xñ¼I& ·OúÆ{š!Ó_~`vœþ׆õ«ÿ*—J~ö£Z·™ËW¯^Ð_ré„_  D•÷ñâI¿\ÇÁ³-žØžóî~„ÜwÒE‘7]‰Öï<~ÞâE³; ýN\ø˜÷]ã]ûö-ž?{×ÖušêùùÅϸ\ØÙXÊ…B!ŽC§v-Ûµj¾sß>ÕUPÂçáçîõñhž–#JËÊd„¿°¯9޶&nÇ­¾›œS•¦L!¦ºü¾n öN¹úÜíG¼¿¦gî{0çq¤yë.>³=ÑûñäÎÜ›D² z¬ZÚòåË\®º¼|ùò*ê*ÆZß~IZuôi}GŒÅÎÊÿvùÑ€aòv¾4H¹Õ›v¡(Š$IZaûŽað-œ¤(Ž«©©%&'³Ùl]]2݃qÄíû¶€]«Ô÷p4°Ö–ŸJx-å9A™Ö--ýï}fQBBB`A“$Mi´ÕË9ýáñýw=úµT!_MM ´5¹Ë'¶_{ôiÉ‚gâŸ}ˆ?s'0âähøð iÓ˜˜@ PNE«×¯ßT•±Öõë7Õb¬•i1æèÞ«NS‡ýPxìëÀË÷úVyˆM­ñ ¯ÆòCË?¶í¼uuÊåÐm­›ñË$Sn®ºÈ›°}œê-;äåÝøÀƒ´Ñ¥v¥’I×V¾qaE/] ,m;•·§ —¯t=v>ÛÙ^ GÆe1m:{4·5e€©I=§Ê-âܲÜÃŒÀÑ`aœ[öNo'ÀÁnɱ5W6ø´èï„ÈÙ»µ{,·{z@ýËÑôêŠ~XÕ@q_¯o½Ëußä¶| WYsÛ~ãž÷^Çš†m^ÐÞ`7èÏ®ó†Ý-Ö¦i 5ªZ3ŠIIIIIIÆÆÆ*Þå”””D’¤™™YI†aÇOIIñóó“‡têÔéøñã*F‰/ÍÑP+¿°Îk×Ýw!‰zÚjÁ‰`€DFVw¨IL€Œu6=®9ËÍ/’Ââ»ü§³½ÛíbùìŒ~è³Ä¦žVÏÎäXºF·…}䬮 ˜º£gçã×­y¦!°°¬gS¿q³FõøÌ ±Y&-;˜Èušõêt-(½W=3€ëÔ³³=Ÿ ·»AvÖê8€výn]M7ÝÜ¡¿…Bi&…_^FóZLëájÊÐíÖ/áóÞ·@„< dµÙ»©!t:öïðy÷ëÈÂ&nZr=‹ŠD\.'3+#''[Yƒ‘™‘š’jnf^ŵ„o¿$­?ã?¬_—ÿ5GEL)AñYM ’ücÍ­ÃËzÛ˜ªj¨•Áe³¶L¤­ÎëÚ¸~|ZÖ†+¼Óp̶ñ¬öõëéhx<Ïßश¶…eÛ4iš0wö©{·—ŽW! ðݻw§¦¦>þ\Ò¶mÛÝ»wWë:Tê#›54ÕÓõÖóSssRFIe1KÐâUoJƒ$I‚$¡²öÇqÇ$b‰®ŽŽj ÷ïßìîÙžÜyfÐPÏÐZ$…ÒO>_(' ˜XBfª1Ã"9-–­Á)LR† ‚¦Hš¢€6hcüèÑ}Õ>²°°PSSÆôqmïfyóIø³÷qŸ#ÓäÎÒÒ˜_<Ð ]»~ñókÑ¢EKãõëWÍ›»W%Z³fÍ«(SLó‘‡vŸ³wRm¤Ï®>‚j<Õé~›¦ÏÛå˜^ÜÓRëŸK(•)Ž}^åïÌ]SJ„m|¶ 4K~Šãü£è3Ýt*^°m¼Ì.L¹»}þ<vŸŽö¬?v²Ëþ?¬¬ŽzööèÑä°.¶˜J‹XænV¥f”˜Ö\täg™Æî-ô3?Eæ“ ÀëµïМîz4Ýr"ÐÇíØñ ¯­ŠŸl$_߯aó\Š[%–IëÖ‚œwa¹ds`54)v Mž8¦l¯¤6ikŽãæææ©©©qqq–––§)ŠŠçr¹&&&åš 6›}íÚ5€€ww÷k×®±ÙªÖÃ4¾KFP€a _ºÚÊÕrãŸ=ëP:AQvõÓJ e0¿K ‰Ý&ã²(6†™YèÌñn¾cˆî×@«gg>õ]žàÖ‡di³$ß[’jšÀ2p¹°QvbtL\B\ćk‡ü^u™1¥³q¹hTaôÓ·_†¦?¥²ŠŠ×1øf:ÊmcèXègó MÔ„É™ÚL£@‘›”‹Øè¯ƒféY ˜ï€ÈŽËeÅïXþ¸”\½ Z%ù’$É‚2) Ëi##ª´§.êköÔwàÒµçc†w!Jõ³8IPb ñÜ?XFC¼.{¯hc^“¹I]Íâå?VÆ4O‹ÒV×12jb .%éú|–Œ ¦ƒ±^DžYHträ×;óòõT6›}úôéAƒ½ÿ¾iÓ¦§OŸV}1WDÕ%;wx uû¬o±© p˜•ºI‚¬Þ]•ÞŽã8Ž‹EbmK óJãGD~ë9þyübÀ’Þ–ðñI¸©§!“ËN+Í‘y¥ÁÓÍÌüÊ3Ð"išš¤iž“N¼o¬jùB¡PSSó›GÔž=Ü}öpwxú!~Òª›íšÔƒ‡š4)°·ÏôV:è_Ñö›7¯WÅùݼyÝÍ­Y%‘°²¯R¤iê{nT^Èó €,:*[öÕ(IKeܘÐwMÆœ«Ÿv°ÓW=mÙ§V!“¦h†ûɯþcËúa"¾R×´lèb иyÍf·ømî1ÄuÙ‹”~¯ûøÞ¿µ²Ûß«'Ýÿt°›.®Ü"ŒÁb¨~\ÄÕŒŒxæl%÷¶À5obû¢³d ØG’ /[påWµÕ2mM022ŠÍÍÍÕÓ+ßZåååQel¬¸}áóù·nÝ3fÌéÓ§ù|¾ê\HŠÞ²pPýô]t`hü^¯~¥ß_$ËΗtžtà³÷\u^5Z(BF÷lÀ´Òý|¤t_gÆÌö,ˆÍ4X%òîzpˆÞ×@í¸À°æ£1)Ðe‡Wªeà]‹º ÜÚunyoÇž§cÛŒ*³ô—†\9õXØfôœ‰Özj,"öÒÆSß'ŽqU;iªÔBžâµë«ʥ)’An>xÉô¦šŠóá°9"‘ØÈH ¯o—W@Ó´DF} Ǻtj¯Í×6Ð7ÈÏ+$b ›Uù^$3C­Ž€ŽSOI¤2‚ HJÕeÉÀ1‘”¤<“Y«¹ƒ’³ºúÎz¼fºlŽk‚‚îfêa š®VDj¦j ZZZçÏŸŸ>}úþýû«µöSN%fLî×dÚ·¤¯‰P\vñ ‡ÍÐÖàèh–ùÓÕäÊŸ%«MÓLƒY’¡!Ç1 ‹ÅúUqP˜-ÔÒ|újÒP¹©ùw½ï› 1Á¸ H ‰‰z|øÏ1bR&¡H MJ(RJ“¸:7;­’íÕ‰#ÓºN=}úV`I¸«!_ƒkfÈ// ixÿ>  dµ½BÛ+|Wq|\Yøwpu=u(Ì*îŒÙ …ÅUCe=X0ö”öbŸã}—ŒÙ*© ™’´Ò„—Ò¦sÿìáh ÆÀˆŒÀ ìoL erëµ¶ƒ KÏ2T\Üz­l±Ÿw9*ŸN¥RЦä7'S§¡Ç„%;/½øt¡cú¥c‹ªdQ1DÌ“Ï9ÅV¥¼ÎÔkd«©Y¿»ž/”k I L}=eíÇ¢y=:üAPü§,ùåËtÇ*íK©MÚÚÀd2å»uË¡¦¦¦z‹¤¯¯o·ˆ`Ä$ç¥dæß}úyÊ@÷)’ ®>ú˜rðÆGŠ¢ÙÕ|½§Œ€zº4·Äw b{º0 %tZm¥[ÛèÜêiæbÿꌻ÷MK+¼C Z&|‡©e 2‘„¤1ƒï“>¹q)¤i›Ööê,£ SR‹_ÜeR•,’yññEjÆúŒ<ÅÒ˜|Sm:#:³¸«'ËŽI'h`êXêAêçX¡²›eÒÄñ·îš<}ÞºM;.^¹ùôåÛø¯É“ÿ˜0súÔÇÿ<›<}ÞºM;/^ñyúòíë÷Ÿ'MP5D)‡Ëfj©s´Ô9 ’2¢ò?‘Dê<¶–:GSÛ-Á4M3éOØ? IDATh H‚ÑÅÀ`4 LÃØPãSx•F&ôõõ½½½õõõk Fåwèp†‹F·LMJ¦HBþ[‰ŠŠŽˆ.ý]õWÁc&‹„EÂrEEE%h‰DbddhjRÉ“B êÚ<‘(/==]Û˜¾§}ÿQ<€)ŒÈK‹ÌÈ Ë‘j‹óssSó2 š’Ф”¦ä"©DK¯’§ Š¢ >%wÁŽûòÕ:ƒ\j>ê°¶&g¼)o‚Å‹)Š255­¢Ú°~ý¦:‹Æ©×¹½öçgƒ„4- ?¿dã'ù_*óÞüqgõ–ž[ÙgÌþÃ}¢–ÞR~^BIZ–‘‹výŸ$ÐÂÐSó×÷€”Èd˜\5–ïûÇ ¥_GÄÇ…¿½{pÉŸûCÊx0†é€•#8—ÇŒXçó!:!úãƒS‡|eÂ7ëç¬>zÃÏÿÍë§>‡æšø€ÑuR[]ñ§‹7]x—œõúÆ/2'cv•,ú†äÉÂY_D%„ÞßøÇŠ@ÛIS«1Ì.Äö™1ëгðw——OÜ•Ð`âç²kþÅŸÖõl=ât<L³~ zJOOœuôeDLàͿǬr˜:«i•v†Õ&mm(***\"I²äÝU,K$ÕIò›¾ž±–±Ö¤¡íöy¿î7÷Ô§ðd¸íÃÀÇ}>^»ÿ–Åd°ª¹?ÁóH ¸258ØýròYÉIH)Yü›ã½3L]( dMÔ´ïMå~8wÔûÑÛØä´´ä˜O½ï|Å-œÍ¸ ®ÏŠIË/IAÓXËø“O-MÇ/E±8¼L*¹%c}o¾ŠÍÊMxrõQš~sw®i¸vƒÖÖ¢×W|?'çä¤?¼ñ60ÀùN]›p˜™““‘pïÖ«ôïc{ÖVV ìgLתy#ks uÞöͧNš8~̘m›76tt(}ÊÖÖ¦ZE$K¥2BõŸH"“J ›)×öýhr0 3â1H‘¢ø5ô·ïÐ4`8K§«Íš¦¼Î),?ª\'Téæ}Ú:p9ì¿<ÑÒ3`2Ù2’¢Hð?¦èIê¸~Ä©a}…ៃh Ãhš–H¤ææ¦úúU^“e\h|ûî-}öø:6s( ‹˜<P"òÙ­7E Øé)ÙF.&±£8\‹Ç•Ò4M´8.ß@ÏAu^\.7##ƒ‹s=Û;È_ðìCñàá€Î :º8žŽŽã–––ʤU _ºtñêÕë*5péÒÅ«V­­LšFëõgæ×\k%×ÈyТE]ﬠ2îÎ^°ìÍâÆjjý÷íßpب=ý—8Vš¦ÃŽx2dŠ 2_ϲãÔ%ž­¢TÉtÒõØïÝhÖÒi-7娙6õ˜°Z§l‰ëõ8øüü’©K‡5]!Žqóñ{º` u ßõcÿŠÍÀ´í:Ž8ü|ÃS†¬€|cYß%±y4pÍÛŒ;~m~}fÆ%¹+x["ÛiáÒzW†:ÎH&õ›O;wy#.ô9òhËÛ7Ìuù>G—¹p¡Ì¬™ñÚÿCkÀ6zæaúô)‹Û8d·^ç™×.¬hĨÊ^ F-ÒÖ±X\20“––@OOÇq6›-‰x¼šl, P ”>ÿÓ±™­‰@w·7Á SÖ^ÏÊ-œFSŽ3z´v(—°ÒûZJÀ?adnm'ÀŸG€¾:6¦3*zKÑHYüëc¼%6çÒUïÝþÏ´Y·®6iÿ0q 05û~ÓGkÞ¼}ÿS1KËÔ¾Y7Þ÷NÎÍ›·;wnojj”‘•)“b©ìºO§TŸªbÓ*’Ȥ2‚R9Ö E©â‘­š²¨Wë‡ÇÿæÙåHLIv±L‚¢³ „t~NA¡pÂéãÜlû¸ÚM;îãéb³}ò:É·4Tåý4M¿ LX¼×§¥ËáqÓ¾&¼<2¾í”ŠÖxrÉ"| bsØ4EËd2K s==¥Ã• 9yøÒݧ76Ÿ\·jÖÚ~+=¬?Ü|jkˆ~f Ìl(SoÖÃíý‘W®ÇY¦!0h h }ã§e½–Ž›R~­p9UóóóSRRttt4h‘–[(m ®«ý÷ïmùûûçææ:::*›©¸°jÛÖÍýú °µSõU˨ÈÈ7®Í_°¨\xjjjƒJÖbþnÑ;š4<1!äÃëÿÊÇKB¡0==ÝÄÄ$!!AMMM à8ž––& ëÕ«—””¤§§'_ƒVlúlªgªÇÀ±|¡´½{}¾&/3O”™'JϦg…㸸 ÛgÇX;‹ïƒ]çÎëÞ½»B÷îÝ“oÞèºý{Owh3æÄ¶,ˆL§]“ÑÀ(3†apovmý}ÝCføíÜÔrÁ¬V:5W'ÓíØÜrþìÖº•¤nÝ¡ã©cGò r#£¢ÂBÃr²³Þ¾zþTÅ)UP·1Gþ×Þ}‡GQçÿN6Ù´Ý%… Å@¨‚"¨XÅ ‚Š¢(ú³÷ÓSÁ‚ g9ïìžçqv±P@‘SPAŠ@ÀPcBHÙM6ÉîÎüþXH¶|’MB €ï×_0;Ù™ä™÷N?å´~;‹í!Ù5-þ‡ï×-zy|«<ýcWq錯VDÆÙþ±±"³GÏHKœÒLÊãr;»wÔí|ôÌœ‡g­GÇÙ:¤–Õ¸â]“gÞ;fÄÁOºNbbbˆÕ”aÇ{‘Fÿn Oß2ôÁ«6¥”ÃáPJišæ=­Æ{=VÝ?š2yñH›RJ÷èn·»s§Œvíâ¼×9Ô]ò=/¼hä#S&ç­Û1r̈eó—™ûUûòKLƒÕª¬ª¢|OIÅVgEÍÆ´¤“ eÞù‡³jeùù¯‡¸ê_Ó4‹Å’˜˜˜——÷ûï¿'&&—™™œœ\PP°dÉ’õë×çææ¦¤¤ôë×/;;ÛbiÆéû£/3gö¬ÊªÊÇŸ6eÊÃJ©ñã¯VJ͘ñžRÊ;06&vÌØÆ~„3\åù«.Øê/­!&&Æ»ç#--­î¨dZZZUUUQQ‘ÙlnÖŸhCtÝ8µçÇo¾ðûM“^ù<6::Öj 7WÖ¸ CÓÝ®šêʧï8×7Mäª5ê2¨ëjÕý—íž¿ºíÕ†®4åVÞS4ïÍ6¿ã_ë0ªw¯ZW™Ö-=N•o[1÷›Òôóz¶kÊgÓvíÚ©iƾ’}%%%>G¾y)ヌšZÇ­ë¡¶«k܆aY²štúˆ¨¤Â±jËŽ„8Ë—¿üö×KÏÕ”Úiÿvƺ5¦˜ö.w­ª©ŠtV¤«ÊwŽMN° ïš|ýìב*1Ùa~íÇ£÷íšžÒâ©klMe†Ûíöx<ÞÛYy<žìŒ¸§nòÐô”R‡Ã»íèËûȧläT¥”7K¬÷0o†½?2“ )q·Þ|Ï3?ÿï¹ÏÏýx^·~Çíø*¯óY]Ì–H}W¥RJUée;+ìµN#M÷Ø1¬Õÿøåú 7$¥Æ‡\d&“Éf³eggçççoݺuéÒ¥¥¥¥ÕÕÕQQQ6›mðàÁ™™™ééé‹¥‘å¼/¢K—®<8YÓ4·Û=uê“J)ï÷� ÃÐuá ìÖÚ³q¨UýxÏ€¡Æ_öâk§5ûì2´€¦i♫1111Í¿rCFŸÕë±›†)¥Î;µÇðÁÝÿ¸å½k¶ì,,³;m±û¦ß7áôÌ´–\-©¹œ:ó'÷¬Ÿ¼;Á S˜2)e(¥y©”RÊy˜o¬}¨5+gÏ›cw+eNÌzõ˜“Ú7a£ÃQYyߤGÄóøy©qåååüñ‡RÊ­ëɶú?˜†´ËíÑÂTQQabû¸¦œK¬Öí~lÆ‚™Ë×üçæË¼|¤w`‚ª“¨ŸÜ«}îÎü(-¢OF¯sŽïá}ÖEVJR÷pçÚ%ª]¢Çi/+-øü»ó§Üf³¶Ú‘þÆöµêºÐHï¿·ýQ6å­Ÿ§ß7Ô»é=µ®‘Þ[~7>Õº_UÝ¿nHî–ß;vL‹‰©Ûp¬ÛˆôîÑ ù‘j®‹/º¦C–åÒkG½óö{¥¥î>±z¯óËe«t§;©&Ö(¨ÞôýúÔ+rbÇu1”Òªõ}Ϯɬ͚÷ÉÌË!|žµ/ÇÓÈ•ÝÍUXXØ»wïÖz7à0hʾVR!÷µ–••åååÝøBóžòÌÿõØ·G||èí`µ.÷ÚíùæˆðŒ„xoçæ-_ýÐ{Ÿ,|üöÎÉ º®¬6·ä>úþ‚xkl‡¤ÄÔv[TDR;Ë ì¬Ø¨ÖY“‡Ø×êíŸ:P©º"fg&ÿóö¡±±±¾Ã}rÂu© «û^ãØ%«sÝð|w±61J)stÄGOŸ8Ꭷî¡÷ÀyEËŸüîäÉC£¶:ÃÎH«š¿»`]¾ÉdŠ–®+eÊu!3¦Û¬9ï¶@*¥JKKƒ/Y€#G|||JJÊÇSΪ»‡vHáááÑÑÑ- ¤RÊ~B÷ξCJÎkl»˜(¥TðvE÷ô”hÆ“ [ ©çìÔÝ7N×õº?ßFzµàQ^;Zëç¬ÉÇ å·Õ÷ßüßs/¼PXœ¥ÂcÂÓ¤nûv«Ëår¹Ýge‡÷¶U-Í×w»o¾éÎÛo¿ÎdnùsZ`éÒ¥9996›­U¶& ×®]{ðïNlGæ9ùÓjÊ9;Í=”Óºt,.¯P†–°g–µLbb¢¦”*..n“É5U®¯ÿúÕ’oׯ]³mGnem…¡<‘æè¾ÙÙ™™§ zþÃbãBìü %%%ã e’’’ޑӥhu4@F#ÑHdMzîBlG £‘Èh$²p¥Ô¢E‹Úz68âhŠsv¢iûZÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHdmÜH½ì§—Æ÷OÐ4ÍÜñ´»fæU·íì“*žgÖqã¾r´õ¼À­ñFVÿ:)KZ½úÉšô«7mΕw¤…»Çß6Õx{OáìkϾëƒ_÷)¥\ùß½tùð‡WVì'2œ»VÌ~顯œ9 [j»ÈÓ5EYÚwì1èìÑ×Ü9å•™K7í­ý³<43,&µk‡ääDk[ÏHk©^ó@¦ÿUÊ-+ªÚz®‹Â}U‹ˆKI´–Ô(ÃewmãEY¬šŠL‰‹Ð¼c›ãS¬ŽZeÔÚ5cG[­áJEw°†kû‡eË^_`÷'ïÿMtbtË>‹§ô—÷§MzìÅEÛ=þ/˜¢­±&—½4óOù›újÞ»/?¡”Šïuþøk¯½vü…S#5ñ –3ÞØX¨”ã«qigl=þ/2­oG¥vø Iï×1²ÍfÀ1¬ñíÈÈœI+Š+***Š—Ý›ðZæƒ?x_Z1)Ç»‚Šê?uÕÞŠŠŠŠ¢¯oL;{Ú/Þ—–ÞÙ-bÿ0MÓÂâ8 ©\ŸO>#sàµÏù2ãÜûþ³h}Qµî®ª(·;u³hÃâ7&]Üͤ”RªlÃg¯þõÒ¯ü¼¢e“DÑ,™=“|X»g3µÕÜ8–µéñÈøSoï; gâ5½Z°Y»í½«ŽùÔ÷>±³]ðêº Ÿ½ax¯äºÄ°¨äœ³¯{rÞºÍïŽK=ˆÙF3§÷K÷ýÇþélF8Ú´‘aÉ¿ùí›7Ÿ–“Ôë¢G.z¤³i”?éœ 3‹|‡uºcþŒ[zÇ6°MÕõêÿ~úpÏ–Í3Ú^xBv—ØúÿFtîÕ!¢á± ÅÚø¼VÍÒgâkKóJ•{ÖÏ|dzóWu•+Ÿ¸ú¹-~ƒ"G<=ù”¸FwÚÆøË?ÇÅ76Ž`‘éýÒêÿ—Ö·cTÛÍ €cY5²ò»k¤³^ÃG,(oÎûxòçL~e»ÿ°¨a·žÓ!ÔçÒl§Ý6&ɘgçkÄsq½s¥—­~òeCºØÂë^ÈøË*§RJéŽíËg¿üÈ­—Ô³SBŒ©n„èö9'_0qò¿n,÷³Ñør¨Ùµè¹›Föïh Ó4MÓ"º½rʬßìz# ¤lÝì'o9 s|„÷l]†\öÐŒ_Ëù™³aToûìé‰göHŠÜÿŽY'¹ÿ­ŸöÕ}½lÍû“/?¹k{LêqÆ„is7WÊ'·xYù0§ôΨ?Ù±»Z:FhÎUÂ9;kœ Œ]¹\8ggcï?ÞÛ/Éf‹ Í4üÓ²&ÌÎîí¯ôqNœ¾ËÝ”®É_öéܹŸ./tx·Ýï×Ñ&ÎÕ'…¹o\’4©Ž÷ü\eà3ЖÙëøŽïÝ%Ñÿœáˆž¦¯³ëKªÁå0wó»û›ƒ¦¨”RÝoù¬Hú„î¢E“Oià NÞ|çÿ׬—/±‡žM îè#žüÜaÌÛy5†^þó /¥”êy×—Åž ylù²òUµòκ#’I7,«lÊïšgÿJ¦ c¶v#Œ¸âæ+åæ4R/ž5,hý}ð«Ì ¹ ;ùÑ[ŽSJ©ö}‡?îÂAÎø9ÐÈ×(¥”ŠòÐÿv8ëVíµEË_å· ,çNÏ«mÊUúОJ%ö?÷ÒñãΘðãÆÌݽì»û±F÷}Ç#Óžxàº3Ó•R–€-ŸF6<§f‡+•râùãÆ=³[@²MƒŸýâ_çÅ)eî2tÔ•W\|Rà‰P •„îà—•a†áÉ£îËÑñ¯noÒw"hžý+™&Œ)42õ†yk7ËÖ|t™-`ìCÒHçª{;©@9ÏmpÕÚ4Á©PJ©´ñïoÙ¿N׫§õS* ‘æ³ÞÚ€ÕË_ã8˨ º50ÅØ¯n¨ôNϳoñýôÚ¿iÙ—ß°(ÌC_Þ\}`6J—Þ8¦4R©vþ7wÿw!纩9ÁË¥Ó ¼[âú¾Eýw_Gœýa‘ÿ§=øeµÿó~sÕþÃÉ–±_V40Œýë¢&Œ)4²yI#+]4¥Aoä7´bm")w-÷ ЧpÆPí@#õÊ­_|ðîŸç:„½ƒ¥ŸŽôÛüŠ>«8h4aŠ=ŸÚä“úªo÷¤ùÜùû|f§àƒayñW~Yî;Ãùï 8FÛ¤Fú×vWÝëÕk&–Ö:æÓ’úSþùhÿ_Hüø¯ý§qðËÊ«6÷Ù^Þ‘²§ý&üeÀAS¡î³s„Ók+kƒš"Ã[ÿ®9ýþrljŸÿ‡%]øÎª÷šÒzF)¥ÅtqE×~2".Ù¢Ô¾ºÿ»6|»­zlb¨K\:_pNgŸ“|Í)9©JԨݕ»×¥lÞQŒ}ËÞ^°$rFöñŸáÁçg«ï6†˜l œ±ÃÒêÿD"’»')µÍçuÓ‰ã†Øê·9¹[¢R;ë_/û}W¥¡,õc´Ö²ŠHÎÉŒTjTx§Þ)òa[8h-odæƒk6>ÕO<é¾jÅMY'ÿgO‹ßº©Â̱f¥Üþ=µnC©àLÚM>Gºlö´kêÑØŠ¶óˆÓÓý—T˜5ëøA~Uzå¶ïçÎúdÉŠÕßUXꨮõJ)ݹgŸßO–ÿQ0Ç’´¾i¾‡5slÀüUWTתZ÷Íz—ÿ˶®¿íƈ¤ì4“Úâ„ÑZR×DŸR‡Eµ è•-+5Jkl„{µ®TàMpZaYE¥÷IUŸmW©}3ZxëBé¨ÞŽŒHÈòßlQJ©Ê½•éš–°è”.)ÉEºQ[Z\æ z¹Q©}Ò»ºÀplxë®+n{s]S[âqé¡ï¦å—y-0ú†ÏÅ®â-_H,ÉÖ€0…Ƕ‹Tªy·þ3›ýdXDx˜R>S÷ßh×Â#¦jÊÿÓ¶Ö² ·u²)µ]Ù2lGõß0€#ÚQýüÈÈNƒ ZAÿ¾W,`ì)¯¬-(**Ú½bJv3§Û.ªáý·®moŒ=ézß•~»3šµjwE­n†ãÛkÚ7srJ)-¬9¿·Ó¸¹¸ÇY3ö« Še‡ÌQý\³ ;@-^é7pÏšMeú˜ÖŒcÅ2Ê–Lºï ß]¸é·-˜?õTëa|”HxttxÀ>ga Ìhó‡ Ë šá¨ÞŽT¦ô n;+ð@âúOVÆ'yT­Ÿ¹ØïÖ@Iç]9à0¯ô#’Ž ¼Õ{Зx‚ÓáÕšËÊÔqâWÅ{ö/½©óQý=Àíèn¤2¥yòöLÿa•_¾þuq£·^kMµ{òJüX’,¾û4 «yçÉ´@T—Ó{|SØ·½Ä³î(,z¦çaÖzËÊ•¿ð±ËNÍÉÌì1ä’‡æïhëàXu”7R©ØA¾wow¿A•ŸNzqÍáz.}Xd´ÿØ‹s }VÙî¢Õë›uÚ–ÐÚŸ:ñtÿ“Šj·¬ÜåWgÞ÷y‡z>Bi­eUõË”³ÏŸúé†âªª’Mÿ{zÔ÷/··ùŽdÇ¢£¾‘Jkwê“_¼s©ßÅï›ÿvñ-3w–]‹Ñ™ƒ3ý8>7gÇþm¸šmÞ?uí¡Ÿ‰°â·‚Uý»^'Ñœiw¿üº¾~Cª¾¸®Gï³/»züÅCºvð‰)®ÅïÝ –“Ÿq_ß!¹¹åÍ•N«|ëO_qù»% ýìaÓZËJ÷k ­¦áñToxrp¢ÕjµZ¤{DY¬V«5qð“¼÷u®~x@‚ÕjµÞ=[)¥T´ÕjµZ“O{qK­aTþpOo›8b„Åjµ¦š_ÒÈSàÞ÷ó›wËÎ~dLLdÐPSÊ€‹ï~åóÍõw® 1WVkúØÏ˃&«;Öüý´À'fxuýꊅ¯g0[êÞªñ)¦_² Ô]ðáù©VklpÅ£,VkÂÀGV×ÝYÞ]øÅƒC,Aãye_sß™Á7îSJÅŽú¢¢ÑÙh—5á+{Å’«2㬖àç{FZ¬ 'LYcß>}X«5:蜰«Õš|úË[kvYÕ³/»Óo£9åúÅ÷N€ƒ¦BmG®ŠÂ½v»Ýî®ø®vØívûÞ —÷`Q[VPb·Ûíé §Ýn·Û÷Ù݆RFí¾?JÅ]»ÝþGqU 6 L¶Ÿÿr‡}û²Ÿ຋O뛕l WJ©šªª-ÊÒ>­ûÀ³F_{÷c/}ôÍæÒê‚Uóž¿íœã¬õ‹ Ä\Ùíù{«ƒ{i±ýþºhÓ—ÏÝ8¼w‡ý_%bÒúŽø¿güž;çÖ>– lÔ:êÞªñ)æ;u¥Wí)°Û+ƒOf©vØí%e®º92uñÔw;×|<õºý:øXQÉ=ϘðÄœ?¿42YÜZöè†Ñèl”çï­Öê’ü »#øÊÓ‡½¤ Ì¥{EEv»3hñèUõ¿õƒ[Võ,'?³äÃÛOI5)–|ÒMï|ýÒYñ\>àДRFÛ_9À‘EÓ´câx$‡@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4¨ _sIDAT@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑHd4@F#ÑH@shJ©={ö´õlpdINNf_+2 hŽÿR‰3OMt˜7IEND®B`‚stem-1.7.1/docs/_static/twitter_output.png0000664000175000017500000033701413157571677021453 0ustar atagaratagar00000000000000‰PNG  IHDR–ê™sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ 8 Ä•4ÿ IDATxÚìw`”Eþÿ_³»é ÒC ½‡NhÒ;‚4âỳâyörö;+ê ' l RET"zï-”„$$!½ìfwç÷dzíÙ}v³›ôî÷oØgžù”ùÌ{>ó™Ï,BˆöÀX`ÐhÄÒ%D‘Á’pètêߤ“E`²€Ñ,±J{@'@°J°H°H”ؾH)=Þ'm[KŽ:BŸýÔ ç§^9Þ .oÕ¨ëòá¯$þÕ#Àvýh¦Ößdmu…§l­ÌV°XÁ*¥fÒÞéu¤½ôõ Xhô‘zÊÅ•&÷æ¤Moí<þ¾Ð®»þqÞG¯lºPÆ”t6>H/H/|~½Éw{V)‘R¨t¡6?µÄï~Ù~”n:Ñ㨮EjjwÂ?Î !B¸Ð&ýó>þ \o}´Ú살途ÞÛµëb—…O=¬Ã£×ú ê¥ÞÛj>Z¤sÞ¬­èèu¯y®Þ:-ó¶"ﺎ_é`ƒ°Û1/sµô¦šR[¥?4V«?ȉ :I°^j€½Ôî§Ûû¥íYWËhç™2‡Ì°"ß»·#4æ*!lcQrÉ*É’pÈ‚ï+k8ˆL L´n_>£éöÜ;! ãZÉÎ áÂ45Ûí3¤ôÏ“®B’µ‚KÿŒtMé¢ô E]˜{ „´oâ2f7"ý5LˆØ)Gß“e ÀÛ«2ÖÕíÿ„+êÛº“_ýi’ü_¹|vÙS¿E=E"²R^>Q _#ørƒÊßy¿ÕKeýF½ÔZ ünG–Ëä,„ÓM m¬pã‡.Wp©oê#èXÛ§ˆ›@,~B~XfäcšÓù1¡N‚½ÀG—Tª ˆÝM"\¦ÂÎÚV¢õQ%ÿÀ¤¼bêö[šq9ŒŠð·Îï× ØùâXÝÕ£ -¡×•ï eDemõz,´èüïÏÎÿÅ Âýó¿œ=ÿoÒå~M=ìÝï½zyõ”½¬¥? N§ ÎÃãèxBúíèð?r0’¢CØÛ8Œ©õ–B0øè~%ØlßîZZíÊ0Ñð#Nª¿Œ@™+2ò›ÍlAÏÏúÚ$ /,¬¿D]F­P?,¼ æz@k.„x‚‚¢>ÿ  X‚‚ã ŽGˆ m#)ëâímÙù?œC÷Ð¥ûü€ŒÚo9©øçO/GGëÑfJJ ‘‘Qÿ• &55•&MšüB͆Ð;_õäåÒ%Ïm®†×íß8õ—Ïÿ_,4¾¿áh²O"ÞUÏe{ß ¸¶ÿ<ã«ê¿XQÄ(ÿë|“μ€¥$ Áfàno†7§ëË]‰hÑ Š`uleª6ª]œ¿þªƒt‹òärplé Òêj¦UNc쑱tz¼¢ƒJ´¨dÔÁ¶¼·)×5#vP|€W½I+µB΀l°¨Æ U„æcÞ¼r=zÌáškòißþïÉuŠác/2|ìEFM(gà°ƒtL{ ƒ!ÊK'êïó‚‚bˆŠîNxD[¿ž kNûN/ÞºÞ‹²ÀµGjòÏ—QRÅ ç*9<¬9»¼LxDë€l—ð2Vñ™/X°‰'üWN~}ü sæ¼ý»˜‚E½B1ór !xsÎÛ<ñäÓµÚpÛnRmª! [ŽCëŒAWÖ lkûõ·æðø“O5¨L}}6,¦ ÕÐe]{¯¿ €'Ç6v„<š=ðzwR$›“#Iö X A2°–Z¶½›LnB‡G:žÞpæÍê -½ƒ÷SÒÁûÖÐð– ýe8-þÔi–\Xy è Ò^L#}Azj™7ë!|,xî0gÞ=Áŵ¹õ×¾œy¢zíÆ{ jDjêÒÌéÓs=ú\Q~Œššb"£:“Úê>ÛOxD{ ¦ËÀsГ˜<™Vm!,<µïu–Œ;ÿꪔÉ)“iÛþÂÂRV6_k/_p?22’?ÿùÏôèуٳâégžaè°aWÐø×^®ž0^xñÊx@œÜk[̺ŠüÕxîù´ ZÅùÛ×K–pìØQŸý»úê <ïÿ&øÅgÏ~\voÕo×d§mé’%;z¤Aè;~Ïüã…·ãõg—‡~/aØZ'75Â…„f ;Î^"÷…ï“ôó¡ª\š bmr¤ð—‡wt!ºÅñWÅwŽ ¦üd9Å{‹=ÞšJ“ÉÊöMLפYé±ÀHÙÑ2÷öˆ¿*_íÙ{; Žèæ¡.1…9¦³˜rªlÔHô¡:bÓãÑ5 ¡âdeû‹U'ž…€Fýb±%—v]"4%”Ø~qTç)Þ]„¥Ò@·×»Õ!ŠýÛÇñ7Žƒ}„AߢÅ[pê?§(;ZFLZ å'ˉî¹ÂLÑö"Â[†Õ*‚Â=½ qÁÄôlŒ>BOÉžbªÏWyÔiÜ/k¤d÷%B’CiÜ/S~5¥{‹±TYõõ‹EÖHJv’J#×z•Îz1½£ Õc*2‘óM6 ¼núÆÚ$cžÑñeÕ™ ª/TªäÖx@Üo˜û].[&üìø÷ØCc‰êäÜNì1§‡ãïÙK³É¸>C™`Ò¢éö¯n$ IÀ³½-ª>¶½·-î@X3ÏØÀóOï'÷ã„uЦÝs݈˜€Î¥½üµ¹ìœ´Åu‡~«c5KÎz†6´w|_y¦‚µ­×Ù>Š”ÉMÈ]“Kîw¹ Û8Œè´J”"l9jÚ?О3aКAH«tlç®É%ilB/(ÙSÌ/#6a.¯ å¬6¤½Ú =^SÂé·OpøñƒÈ‹Kÿa5K²¥õýíßW­à§öß9þÝw•BGöggiuŸºÞ—z½¾@˜‹çx×õ¿rqÕ^¶øK[Z?ÔЦž|>úØ2ßõÚÏæ-ÿBÇ´w°ZìÛy-W ?DDd''?Óæ8þ~!{)×9þݺÍ_èÖíuôúP‡á8qâ-x«Uѽ^½Þ#.î*.]ÚJllç˜Ì^Æöí3±X*ý䟳4m~3]º¾Fˆ ½Æê\Žz„¬óŸ"á#å¤#­›“Žœ KÙµýzÇ¿“’'ѣׂ‚cUuöí¾s)cûÓoÀ¤´"„²™’›»†¤¤±¡§¸x77Ål.güøñ´hÑ‚ôô>|öÙç|óÍR¾úòË:Ûú|½{÷RQQÁ-·ü‘¸¸86lø‰ùïÏwdŒhÓ¦ <ð o¾ñ:™™™ªçgÞr ©©©¼øÂ 6@4‘>½û0uÚ4òóóyçwuï¿ÿ>¬V«ãß‹…^½z1sæ-ÄÇdzlù2¾[³†ªª*·ÅC ½ç^ºwïÎ¥K—X¹rkÖ¬QÕ¹ÿþû9xð EEEŽö–/_Æöü”½{÷aêT…Ž9o¿ãäÙ÷cµZyíõ7øðƒ8rä0:Ž×^ƒÝ»wñÙ"eLÌü㟨ª¬dé×Kxê™g‰‹‹`÷®Ý|òñBÍ÷öêÕ›)Síüs¾÷>þMœ8‘>}ú0ÍÆç·ßyׄz@Íç   î¼kýúÀl6³iÃ}ú±Ç´üâËÿdᇠÓé˜>ãf:wé‰ãÇy÷í·¸˜—0ãâã5z,C† %$$„Ý»v±m[»vîð°Xý^ŤÉShݦ-¹99>tˆ¯—|Iaa¡Gÿ„NÇM3n¦Sç.œøÀ¹ `ÜÕŠ<&M™FA~>¯¿å”ÇÃÞïä³ðÄP—óœßÈEŸ»¬ká¶e#Ý`¢Ðôʪñ±Tµ#îdx Õ'G2/·œYÇ”cÐE¦Æ Œ»»:·šÓóNqê½SÔ”Ö<>™F=9Z8=ÿ4‡ž>„ñ¢âí:³à ‡ž>Ä¡§qîK§¥òl%qãPÚ;íµ=C„´Ò0D8ðð~Ž?s«QQÒÜ·ŽR´Rñ¢˜ÎWÕ/ÓÅj²æŸæì¼S˜KkH—LtEjp\0mhOuN5ç¥xw9«se_èg>ÌäªÕƒˆ’@åÙJ⯊'(*$Dwq9È`…s‹Î„ä«“)=\JÑÎ"bz6"¦§òSèöNOt¡zòÌãüÇg°ÖXi};Ú=ÒAÓ³ÙúþvsªÉúì,%{ŠÉû6G³^«ûÚaÌ­&ÛVïâu½cOàØS©Îö>qè# ´ÿG†(GÝÏñg|>ýÚ1r—eP}®’Æýã0æUs~þiÎýÇÆç±ÉD÷häÑn£¾±T-#óÍcTŸ­¤ñ xšÜœêáÒO`òÔë¸fòT¯ Þ’¤¤q„†&¨Yó›0"=žKI™HDD+Š‹wSXøK­# ºò4ÅE¿:<ˆ‘èÞçkôúpòr–pöÔ«TUf’˜r-m;½ìôàêBi×é‚‚ã8—9‡Ì/Pti3† Æ”ïòº…Þ¼å_é˜ö.K%{¶O¤à¢² È:;Ÿ“ÇžÆdT¼ÞÙçpüèÓ=ü4çÏá³)èÙóßèõ¡äåýÀÙ3aµÖЮ݃tèø˜ÇûbcûqñâzNŸ~«ÕDÓ¦SiÖìzM¶hóO¡B§¥s—WŽ#óÔN{K…› nLqñ.GgÏÌçè‘§1Úè8vÇŽ<ͱ#Os!Ë ô"#;ЧŸÂçœì%œ:ñ*••™¤4¹–N]^vã•óç’ää«)-=LQÑN5êE£F½l€9NGÛ¶mÄÐO›v-¯¼òOV­ZMHHqqqÌ›÷Þ|ë-'­gÏ2uêTfÍú³Ç¢é_ÿz•è(§ÍhÛ¶-f‹â¹­¬¬$7/×ñqÏQÚ¹KÖÿ´–-[RVVÆûïÏgÕªÕª:Íš5cÏÞ}<òÈ#\¼x‘N:±zõ·<÷ÜóªzS¦L套^æ§ZÚswÜH·oìòhãJGU%¹yyŽŽ¡Ã‡3|äHeaѵ+wÍú3÷?8ÛÑÖ_þzññÎ1}òäI.æ]dÒ¤)Œ3FSmÚ¨ù———G^n.¹¹jþµmÛ³Ù…Ϲ óÜê…††òÓ¦-<ñÔ3””ÂÛïÍå-Ào§ûö;îâÆ›f°nÃfÆŽOeE£ÇŒ¥¢¼¼ö™V#vrÑç‹ypö߸x1’’bfüa&·Üò'›ñø“ÏðãO›ùãŸn§èÒ%“’˜õ—¿R]]­jö¶Ûmýûi3cÆ*ý5z,媮œòƒÏÞôþ7ßÔ‡E-ÛGºP•B¹DDø‹).Š“‰NP‡s~ƒ:og¼œ ®ç4¢é…ËFµ¨“V‹:ñY›viœpÙŒwÔº;9RLõðXšËÌÏ|×z ¦K&œßÕÐᑎ¤ÞÜ‚â=Êö‰·Ž‚æ76'$1„³‹Î’¿1ߣcæ23ßµþέ=3é@êÍ©Žöš]ß C”sŸãøëÇ ‚„Áñ4•Dõñ2Lg+‰¥Ü¾nk¨(0a²Œf¥mîH“-8¾¯÷€­ì¯³Ø1c+Ò"UnyG\¨€ˆVd~ÉÉwO2zïh*ÎT`5[‰lë2[ Ø~ËvF$Ö$Œï'ºS4û4¦QïX . ý“Š×æØs‡9ö¼²½—õÙ9ü0„¶wàôœãXÊÌ*å,Íb÷¶9úg_i»ëgÎÒ,öÎtÖs/Ÿ q|Ц7 yšÂç _œ#ó-%×iìUñÄN¢üh)UgÊ6mêð5EN¹YÊÌ´ú[RnjA©[(CqF!ÛFn+|ŸKúÚ¡$MiÆ©çÕ[Éy¹9L3œÌÓ§4û×¶ýS´ëø¬CKK’—û=¡¡)4OÁÊ=dÛ¶÷Ù&ªw\Ƭv¬}X]yb‡Ñ ´jûB8{úuNQ€ZÞ…%ô¼¦©wqüÐl¬V#aá­ mŠÉ˜ËÙS¯c¬Î²Î`¬V“§é°šHmyÒÞÆl.eÏö _r‚ßs™ `Inr#Á!‰äd-"¿`#f+˜]äÜ©“r¸áðág9rø6€ó C†þD‡râø›˜ÍÎ %+k)[·Þ x™ó7Ò¯ßç$'ãìYÏôcZü³Ïá- kб:—S'_§ºJ›ÞÓ§:š6»‘D²Î/¢°Às+ºm…ϧO¿Î‘CÙ<³KÄÆö¡ `3{öì᫯¾bÓ¦ÍTVVòí·«ëª5==6mZ;¼‘>ú(³g?ă>ˆÕjÅ\cáƒ>àÏþ3O=õ$&“‡ÑcƘ˜ÈBÐ ½ñÆéìÙ½ÛáÉÔ*]ºtaÄðalÚ´ €_~ý…… ?">>ž‚‚^xáEÂÂÂh‘šJQq1 ¹ãŽ;˜7ï?,[ö {öìQÑ1|ø06nÜ„ð«F{þ–wæ(tÜpƒBÇË/zÒ±kçNºuëÀÀW±rÅr&MžBDDF£‘.]ÒØµs‡è}ñÙ"ß¼¾÷í·R:ÞûÂó/ • ë-Ÿ§OWê½ôâ è…k2{å/÷Üûݺ÷ mËæä+óÕŒ?ÌdλïñØ#SYY©š¸òiè˞ݻê…i:uî¡Ã:¨?»vl÷Z¯k·î<úÄS¼?ïß<þÈÃFŸí>öÄÓ ¨îŸ;o¾ü|5zLôþï›­xU€÷ÞQø|Ýõ7²oïnþõò ~#“ÀÒÚ4Œ;ÑÕg5¤ÖWгé Ú„{j!éš¡ÛçÕ. /]õÞ „ å¡Ñ’ðÈ…ð\† °‰xXæðXÚ’Ÿw7DèüLú5€á¿Œ ùt%?¢EÝè(íu¦ÿWýþËpšOonkÏy’Ü–š…!mÿ…ØÀQÅîKª V]¤w¡ë¢þ Ü<œ&7(ý kŽVÞ¦¬/Îi‚±°æ =vÏiaFÁ•”45¥5˜ LªFc¾2ÈMùÊDRq¦S¡ÑÖVˆNS<—ùë[—~-ÄZmA¦'²ƒg:”l/ýóŽ_úWÏg±=j78@hÉ®"¹µ}²3=>ëOÿMÃI¾A‘[˜ÆA­Â yŽAi‘£!®å—Ÿ7q!;Kø6™FiÉ>N|“ââ=DGw¡]û‡hž:ƒ‚‚-[¹ÑÑIL‰Ñ˜Ï¹s_øm´t:e;Ùj©DQ1=sÊ z€CÐ¥ÇBÛ×f;Ý]Q~„²’=‡$3häiº÷YFlüHMP ›0šioc±T²këh¨¬}Õ쌵‰‰éªlÍç­sò¼ð,–jôú0¢¢:ªåQ¸EU )i4BèýâŸýÍeeG()ÞCHh2#Çœ¦O¿eÄ'x§·¶cãsJÓ:òCG Go'Ÿ#\NÑùª?++Ï`4)[aaÍõnºi:#F §´´”·ß~‡%K¾®—333SµÅýÃ?O¯^½ßÍŸÿ>7fÊT§çý–™·ð믿rôèÑ:½·¨¨ˆŸv†­_·½^ϰáÃßM˜8‘Í›6Q\ì\Ø­X±!“'OñÙÞ:[{Ã]ÚkȲ{×.ºÚ€eÿؼigÎdÒ«w:vì„N§ãÀýÊéÔ+oêêO¹fòd¶oÛJbb»¤Ñ9-óçÏÁÄk&{ ‹m[3ü•>NüõN…¢¾u'PÙxm°®ièê¬ÚnÞH­÷Ûq›ÇW„ä¥W©?±•¶Q/¼{^»'GŠ?ºz,oO•Ä o¡ RvÇ«s«‘Öºƒ™ÄQ‰~µ—»6s™™„¡ Œ;1}ްÔpJ·äS}¼LÁÁ¢†%Ònñ „­=c^µ li-8Ê•h³×î!´iÈö ð³V[ Š ¢dŸóY«Éªz¾¦´FÅMC¤}˜2qWœªP=Wy®’ÈöQ„&…RâÑ¿R¿tÒµ^ÀÖVòPø;8¡‡Ç!‚t„5çÒæ|Ê8Û‘HŸj>ûŠü.·õM3ñu%ûÜÇœÎü75æ,V Ž'!~0&S›‘Òâæm»×fçcµUk))µ'„G(±ª•'Q´…ºe±¨¼Ï wz®wmI›ÏѤù­$$O&!y2…ùkÙ¿ó:ÍF½>œˆˆö”ïðkÇDà\Héõ‘èõ ø/¯8éÔ+«‰ÊʳDEu 4T} ¯ª*ÛåïÒLpp,¡¡)TUe¹ðï/üs®Ò3¶Œ¤cççhÞâV’S&“œ2™ü¼µìÜ®ÐÈj>ÄÆç0/|Ö»„:H7ðZSSêU±2228zô(~øãÇ_Í‚…1dð :Ù,W¯Àþýû1›Í :”];w*zšÍª•+¹ëλXüÕWDGGsͤIÜwß½u¶•[32T±€ÕÕÕ6ž…Ell,[3Ôc:?Ÿ“'OÒ¦Mžøj¯¡ËÎ;øç«¯¡Óé0p ïýû]vnßN¿~ýɾÍûýK ëRëIË–­HHLdÛ.µŒ- ½z÷fñW_¨lņõë¤+æšF Ì‹¯ü‹ß®åÌ™LÞyëM>œ?O%£V­[“››ÃÁûýjwÃOëügE€zÀ¦÷ƒ‡ eïžµëýz©9Q;b0eÝE-ý¡TÔ↬{bú{Tm€Ííü‘j§Mëä‘·Ä9¢Wbj{ue€º%ˆÛuBМö\tA:Î}vŽo›¯fu“UdÎ?]gÆ¥=—æÒÞ·¬n²šÌù™õŒùFÎ,<£¾¸*3+81{§nݪª×ô‰4DŽüÅçøµÝ·lH]͹êÖ¿ŠLü•ŸP¶[ßÕšv¶C4qýãˆéCñþbÿG™S¡26êÓØéù‹ "¶¥^y¦ÂÏ•W`ú­ZÁøxÈT`$ë…ÏA±!TeVpø=ì½y« ¶{Váó…/α±õ·ll±šófzïwíœ=ýXký0 ÈÎþ†üü  RI‘3)Íœ:õžÛÒÔ{’¤F±ClJIi±b0«+Úíýë×±þ[õ§¤x›Ë$Q̱ƒ÷ñóºæ;ô&S>q ãHL¹ÎãmU•™œ8ò»@Lã›L³¹ “ÍSÛ8Ý…þ"#}­¨ÈtpÎX¶¨¨Na ¢"S*µùç)Ôššbî¿uk›shÿ˜Œù$$#¥Éu~9\=(•6>ïÝý'¾]äñ).ÚV/ý9yò$¯½ö*$&&¦NmDE©wš4i‚Á`àĉªïß›ûƧM›6L»öZ¬V+‹¿úªÎ}¯íPMEEÕÕÕ´jÙÊmÑ´iSÕÁ×öDö:ÇþýoԘ;½_nîA_1z'OçÆk§Ð³k'6oÜÀ?_{ƒ_ù—ªé’’bâââ‰öSwÍ5æ9ÞôþÔÉ /&î7àÞ³×ü÷$ðû28Y>¹ RáÒa¡‰yÕJ'ü}¹ðÆ¡¢O¸ÞÀå,§DÒ^Œ0D)[ÁYKÎS•]…!Â@ꌵ‚3oy, Q[{YJ{‘Rg¤zøœuA‚f76Ãj²²eâÏì¼i+Ù 31å1B ‹TÚ+üæ<¦ Uè#õ4ué_ ÉPË+)‘BSBÉ|ÿ4±}c‰jÅ…ˆê…Õh%óƒÌ€†O-õP³©"  õO-:1·šŠåü–EéH¹^á º IDATó®)[ØsÓVÎ/°ñÙUn6>ç.ÍÂx¡ }¤&ÓSýSõ:æáÉ÷•"ç6 †²³¿qzè¼.{%zC$IM®§[oeòÏÉú”ò²*)O𵏋àà$[_‚ˆiÔÄdçvgTLOâÇ£×G`®)æ|æÛäœÿHYLÄ^åñÖêªsœ=õ*™'_B§ ¡{ŸoõÈñ(¨²®Ð°Tµ³»ü‹HMýC$BèhÙêv„ÐQ]KyùqÝÍšÝHPP hÞ\‰µÌÍ][;ÿ܄Ө INz3O¿Íùs ½±qWy¿Òp½å±¼dãs‹–w9N™ ]÷#9ejÀ“ÕŒ3øË_þBçΕv[´àÎ;îdË–-”””øiÜÕ-§¥¥a08eôëךš6lØ rü´~=ÇgÊÔ©L2•¯—,¡ÜËÁ޲²2""êw‰„ÕjeïÞ½ :Ôî“”ظððpöíÛ[IW½4ð––¹¬Ü;&“‰ösÝõ׳sçŒF#Û¶fнGÚ·ïÀÎKu'ÿ|çåóä³T)ÏÞ=»5z,áááš–ËïÃî·0ï©“'¸çÏwñΜ7¸aú /aPP£F½Ü®\O'›Þ÷µéý¦<ž+/¯‹>ËÚ»$üc½V†ÔÚÆ¶¨k7Ôüx‘ë2á8”#IÌ…ç%ž‰ˆT[rj°,Ý\–Bºøt]öÐ¥›gH3¥Ô“pôÉÁc À€sŸ%í¥®ôù0â½ÅÄ Œslïj•ó_'eb =ßíIóéÍ Š"s>?ˆÒÞ9Ò^J£Ï‡}|¶'¥$$!¡ ß2BÙž¨´Pº)‚ù§(ݘH.->KÓ§»Òö½t’fÝÏwÿ|•ó_œ£Ë‹]isO[6ü‰£/ÁTRƒ©¨†¨öQÔ”ÔPWMD˿ʑ'’•tCêmã„„¡L˜EUÕyGüenîwnüû‹'ÿ\u[Blã¾tï9«ÕDq‘BoŒÞ‚|Oz/d}ERòDÒº¿KÓfÓ1Es©`3G?À‰c/Ò¤Ù bã3j\6ee‰°ñ¹°`¹9ËÒƒ˜˜fÏ~ˆwÞy!ÇgÙ7ßðÈ#¯ó˜JLLäË/¿âµ×^¥I“&<÷ÜódddPVVæ¡^óæÍeæÌ[èÔ©ãÇy+W®`öì‡èׯ‡">>ž3gÎÜ·§Ÿ~Šï¿ÿ>ø·ßžCç.]xôÑÇ8qâ‹-ºì ÓU+WðÀƒÑ·o?>D\|dÿ¾½tïÑ“Þ}úðÂóÿ ´¸¸A€ƒ{:lé}û‘‘ñ ‡ ]»öŒ;žUËÕúþõâ/ùÛßå_¯¿I×nÝXºd1qqñôèÙ‹Ï>ýˆÂ]¹ò9ÄÆç¸¸8ŠKJ<ø¬¥÷[mz¯Üé4Òß®Zɽ̦Oz?ŽQäqîì6ý^r‘× ^†mqášÃÒÇäçk‹ß2Kx¸œõ‘^äà+ a– ö2@tÈü SñÒ H™ˆ©ÈÄîY»¼¶raùN¾{’šâ’Ç%Û7]°ó"íöv{´×÷Ó~@Z%™Tœ®)i<¾ -æôv$D*üô Ÿ(í5–ˆ¹ØÄ¿ìr ÝÐZkksÍ\fæÈs‡ MeÄö‘´¼­)W§Ðýõî X:€ÎÏv˜Ù§ÊÙ|ÕOï*R¶À[GRu¾’ÝØFÖ¢³—má—-[X·þ'JJËØµ{Oú¶~Ý:®¿þ:ƌ˞½ûøä“OÉÍÍeÔ¨‘š€¬¡Ë¢O?å×_¶ðýºõ—²}çnÕï;wì$µE ¶Úâ@Íf3{vï">!Ç9êÝwÿƒ”UÉιHïÞ}˜xÍ$.äæSViä¶Ûïԉ¿õ뢴´Ì#Ð!Ÿ\÷E¥lsëß©S'=|0‘‘‘|øÑ'ìÚw_þ'-Z¶Äj±ø <½QÁ„k&±lå²r ù|ñR:È?_VßTSSÃÄq£Ù¾5ƒûxˆ­;÷²tÅj®½þÅ›(<ö)}ÚÑ{î{¢r#g³/ÒËÆç¼‹ù&î¼óÎZõ~Ö¬»4gÐ/}BÆ/[Xýýzr JùeÛn¯ìò›W¿‡Dò—©H¿tÄçÖ²r`FØ?hœÈVßB¢yÆ@ª h·ô¨.B GÆb]Ž ˜ ŒFÿÞ& ¬i˜r8ÇìùFïíI‚ã‚™”?K•…µí×*[æ:Id° ÿ–‘DöjÌñI)ÛR`Cä³^‡5"˜²¼jÌV%´U:ûuHB9kb±‚Y*Çëݽ¾vi¦ÎlAϹ½TžOS¡‰ÃÏæäÛ'}ª‹Nt´®7D”›p ŒžîíÚ¸êçeBø¿. Š fÔ…IXª,lî²–ê UŽölILŸÆl³‰K›i£DŽàè Çéw €¯*M›5§  “±ÚÅcíø­ÊÇb»ÚSjÐçÏ]t‚ ½S/T;X^£žu„„¤`4æ(÷‹z«ñXÌ¥X­&•q¯_¼© 8¤)U¹˜Ìf,Ò¾m┳Á‰NŠÉèé½6| qqWñë¯SÉÉYe;¬s¡ŽIÍu²¢Û½N1K!!ñ˜Í¥X-&ïrN kŠ©:)Í^½Î!!)Tsn|–N§)V©|\ǰVY²äk¾øâs¾ùæ›ÀìÛBã%ðóÏ[8þ<3fÜDhh(‘‘‘Jj©"ÍÁ¥àà`²²/ðƯóÊË/×ú®°°0bbbÈÍÍ­÷d•œœLQq±ãPN}œ4öä#BHt¸ÞØ%5GuXXÑ11ä¹Ñ¡²§¿SÚõÀ !a¡ÄÄÄ““ëurÖáa4j܈ü¼\G³oÜo.7C¹™Ë™Yëá×;¬s™Ò}˜^9qi vp‚#é¹1G=IÉ+ÆBc­`L0‰]È>¯9!H©^åÚ‡K]¦Ié&G·…XZ1Vg×ú&sM&ï뺽oïeuu–˳ž˜Íå`.÷C7¬Ú±“öÉ–ÃÌd*(ùouU–O½ÒJuu¶_‹–O×_]ƒøìc¾ººÚ Ú\ì¼ëÔm·ßŽN§ãƒùóýzSUUUn¾Ñ*9 NÝ/‘óœ µ9ïJ‡7}TÖ–DPúäŸkØXUUFcµcÒ𤋮¬tÉ[é›Iî½jËcOªyè½ðêWWUQ]O}¸õ|˜o©:1íöw/s–ôÁ_žEY?‡Ÿ—o¥‹JjÂeçNÄi?1.Üc(¥û”-T iƒM./Q{>¥×%€ôŠÕZ€Êƒû³Ò‡Â×}Eª½±_S\ÃÉwNÒññŽŒ;>Žš’‚¢ƒý+üì Õ§ÊœÁåÊ"×Ë×µ‚ôÔG*'K¥…Â_ )øµP¥4Nà&4è<s}“7×§Ô×pö½“´y¤#CÃ\R£l›Û:”ýÉ*N”yï_Ct\øaýÚ_òÃHÿôø÷S¤çD#±ºâ²ôCzs^ÉúwAÖ"Ý+§hûIIIŒ=š¶mÚ2û¡‡xôÑGN8þß ‰ÂÃZIßðT4„dí#\^ãS‡½?žb{ò|M)k™dVíµT—Wx¬Ôa]}y$(TüÛ%ïó¾t$4·{ UŽÖ‘nÐÙéO“^!N Ô¸Lé@Ñ.’÷Ð1Ÿ\Ð~kCväÅ#í*"ahqâ°V[0fUR²ü<•ër4ŽÚk3ÚoE¬Çå¥BÔ=ÙÕomN½r„’ÝEÄ I Q¿8¬F Uç*Éýú<ùßå^{àjÛ=Õ¬“9suô‹zºTï ²Ë'ßÊŠ³Çc6—]A³y™x…ËÙ³gkݦnܸ1÷Þ{óò˜5ëîzÝMþ{‘îËr•¢¡^-ê"ê¯n~mMÔÝXñôÕ¯)Q÷÷×}ñ®mýÑ{ü\füöEh«ª7¯¥›¹óe®õÏ|âk¹_séz£5o¸ößá픞PÖ,(¤o– Ï}XMÀ*4ÛKm¬$kÖž*Ú@K-l¯’° AT° Ì`u¹~HùÓl˜,£LUJ%Ä àF%¾À,Õ1ŽSV®×þ éŒ'¾À¤'xÐ %~ÀÑÐ1–‚7 V­Kéÿ*¹.^ ‹-Φƪ„8jÇX :¥|§J|e Âm%Ö€‹€@LmÀÒ*• ’j,`¶Ê€¨pÀ„úQ Ž±Ô á©ß~l÷kæ}“þóÎ=6Ì*eƒË.9J©ÖiñŸ{mˆ7»ï÷Øc,í'L}[ éÓ6Öyruó‡Øm²Õ*•‹½ÄÄÙ»¡t:u컨 SÐð{Ø-±X1–Ò±$ló°*ÆÒê’õ\KJÛï-ÆÒßñ \f a³_z¶Üc-kϾâ,¥t‰ ÷@5Ú³˜‚ ª‡ÈA°Nj†—(øD›³Òe¬Z­³Ub² Ìg<­t‰³tİ çx³ã&¡¢SØ.ó”Žñd?Ëb[uÕ g•/ u,¢ŽfÌÿ XJebu&·+ŒÓ½%T;ÿ®ƒC˜}ÕžŸIkÜ ®•î1—Û»)êò._!\^¬ÖjR½«m‚ªI—Ý!§iܤÛïÒ=ÂÍ#ëÃiíñç®8²P Ã|Rõ{ÊWr=võ“Z]Èòf‰®ð5$ */ç¤QPù{“¢(Ö,ÛrCø§|¢¾¶Q^ãë•"ðÛjd ­zÛö´p_Ðjèqº\Κx²ŽíuáVKø8Zn]{Œô˜»ì³³Î·›ÁÛØ½ŒRµĶ¢Ö¹ÍÌo›J:¦ÕM­ÇýÌEÑÀ¡ ?@e ´;y 8®oÈ–ôã*ª†ä¿hÀ®üT®µNw9™Û“WšŸ—é}ÿuÉùê+&Yë<àß\ }||ÉDR[bôú-õ\n.£~;ÐŽøo“±/ºd½éWì!/Ô6к\Øg1’kÖµ UèC·„p“‰ð&U‹%ö¡!©¹(’u4Üöñ¤‚gÝ9Ó¿ÆŽë5g˜h ÑÁÝwßMûöíÙ¿¿£­[¶ä¦›g’˜”Ä™SÇÝzV«À"ii”miæ;òÙûq¯‚ðþEdd¤[ÿ”Ò¢E fΜIrR'Nw½ɯ×Ô–Ó+ ”).•ÓûõgÔè±ìÛ»GóÝÝzôdÚu7rͤ)ètz²ÎŸSÝWH§íÿ{õDfþñV:vNãb^%%Å|¸ãî¿Ò;½}úô¥·íSYQAAA¾ªA)[ ¾¼Š±±±Üpà LŸ~¡¡!œ9sÆF‡í–&¡l‰õìÙ“i×ßÈD½ÙYµÐëç OßþŒ5–ýûöhN.·ÛèíÕ§¯ããA¯ÛÄæX«ÚÓVH?ïÀu+'NäÖ[o#--¼¼<н$~VêÝj«—«ªgßÐ ¸zâDþø§[éÜ9‹ó(ñÒÞø ¶z]œz %@é‡?¬ql,×^7Ü8P2Ïdbñ"7'½]ÈËóÞ?»]ãîõìÙ“o¼‘)S¦¢×ë8wîV‹Usøß(B%oçäæ·µj°ù@x=â jms?±E'üÌ3ÙÀÀIøoSü½UÔ£ »ïEâiW}éƒNt:Û¼jKåT_àí•UBÛî×GN]ê­ü€¬Ð°U>71=z÷œÛûgÐA‚õƒN-'¸t=.¼,ˆœ)º,Òۘш¦jØi«v†k õ»l@qQ¿n¡ÿ€«Ðëõ ê׋³g2k_ükxÎ_þ×Üzç,6þ´ŽÔÔ$¥¤0yü(t‚ðèèÎæq1/£Ñ™&ê…gŸdÉ—Ÿ©‡]^f .yÕ‹ÎÑcÆðé§‹¨¨¨`÷îÝ 2NG¿~}9uê Ä¼ñæ›Ü{ß±í×-ôµÑ;l@/ÎɬóbyÖ}³yæy…Ïí›'xüÃéOz_t¥×Çá{Œe#FÆÿÏ×ßx“Y³f±nÝ:Z´hAJJ £FR-ŠÞxã z#Ù¿ÿ€c¥«CááwÍbƒM¾ÉÉ)\=vìWõè_¯½ÁwÍbÃúu¤¶°Õ§Ô«ÍàNÙÈÑcXøÑ§TTT°gÏn ö”¯“OzGéA/Àƒ³g;ìZ¢†]{ý7yà(**bË–-\u•¢/½zöätf¦€ùoò<ù¶JÒ Xºçñcé?°”~ôD;ñ‘=ÆÖêcƒIc)@o‹³ taîùv?îJ¿½Ç½6Î[ívU#¥7}Ð A¯ä²Õáy Wñú‹éž‚Ùžÿ±ÆêŒS¬ë UŒ¥Îc©,e-**½â-ÎÒÎg«ã¼†t`>¼Á¡z5@D°-¥Ë6¹+.QÇ0ºùmÐb•˜-(1–VÛ˜Á5'¥Ò¨ë¬j®®ÀÒ™?›£F:rY*ñ• _u:×?Î 5aÄ)gÁ‚Œ1‚eË–1mÚ4/À²á†M³fÍ8xð UUULšt ;vì$‹¿ü’^½z‘uö4·ß0^%f«”ÔXÀh†j‹Àlu Içâ±´J©$Ûv– ‘9^·€f5°töo;vìà‹/¾ W¯^dfžvK!ü* ,Ã#™÷þ†Áª˘4eš&°ìÛo‰IIü°v &“‰àà`;Ͳ¯óØÃ³ýî¼ý«Îi]ùuÇ>þp㵬^¹ NÇ×+Ö`0˜<~”£b«VmØ}èÃôVyø¼M"ö n{ ¹;°lÞ¼9S§MãÝwßÅb±ÌÉ“§øôÓOyâ åú@€«¤iJ~\CÉDPp0{ŸfùÒÅ<ùÈlÿäáòCXX8ïÌ[Ààa#øvå2&Lž¦ ,[¶nÃÎ'>ÐI¯P­}ËÓluKE/…#ÝVzz:YYYäääx<×µkWöîÛϵ×NcÙ²åèt:Ö¬Qä1jÔ(U½}ûöqíµ×²lÙ2·z#ýíÖ­{öîcúõײjå2ô:ËV­Á 7põXg{]Òº²}·Roå ¥½«Ö`R×ó&téaš3yê4æþû]jÌ ÁÁ;~R%_'vzít|G  $Ã^°`!ÃGŒ`ù²eL6MXö0€¤¤$Ö¬qŽÓ§3Y¼x1>øàïÎcyy¥«Ö Ÿ@Ì¿ƒœ2`Oe@ÀÒöKÑ@‡¯ÿ§¥rP#P`)¨å†¡ÿò·–nƒ»Ó%½ËÚ–'®À2,H„,…ËAL©öJŸÈ]`±ñ°Æbç¥ô,]ŽîyKáoö78¼¾®ÀRg?¸,]E8‹Îî­4”––2`@äýÚÀ¸8…Þ‹y¹Ûþö¸®‹ž9o¿Ã˜±Ú÷RϘq3.\`Ù2EV«•¹sç2|øpRSS]êÍp©'±Z-Ìûž­^ U½œ X¹BiÏbµòþ¼¹ 6œæ.ò~“ºžÕjå?óæ2d¨ºžjØû(YYçù÷;6ù 0Müà._¯ô¾Ç07zM&¥¥¥ П>ìZFFË—«ÇǶmÛèׯŸ†þ¶ÐA6pK®>ïÞJ/›k T¨{éÏæíåç”+ ðÈö{/;ÏÄJÿŸwÛ“—þй¾Ý­í]RÖ{ Õ¦‰¢–_- cI{iÿ»ÀK`ˆ3ï÷©†¦ÚÛüÞ‚ÐÔ[—Â]«ûå¸bÞl6s×]wrêÔ)‚‚‚œH×íÓÐE¯×³wï^úôIwLÌÍ›§ºMÞ’ä&ÍXµy/³x”‚ü‹´ï؉ÅË¿å©gŸSµwÍä©<óüˬùa-Z¶¤¬¬Œyï¿ÏŠU«êÙ¿>¶þÅ‘ššêßÒÅÓ²nÃ&&LœÈ‰ãÇéÖ£k¾_ÇíwÞíhëܹ³Lš<•;’™Á`à¥WþEtT”ÿ¶Âq×µ™{þ|™§Oä÷óMš4eìø ¬øfiìSûö±œöïwíÜŽ‚Ž»¨€–”’BøB-šâã˜víuL6Õï~õèуÔJïèqXµ|©&Mqñ \3õ:&Nžªy¯ÙbæÁ{îäL¦s|hÅ8ÅjÒ+½Þë3ßj&¶cÇŽ±ƒÛ·+òèÒ¥KÀõ:tìÈ^·XÝ;”z\êµïØÑ#¦w—½ž‹ÔgRì®!__ttv韖]ó§4mÚ” &°ôë¥~…ºüoQËø¬2'áöŸ}jÀÄŽõ„â¿ZD=k‰†êÄ8¹*.W¾ÐË&éÆ¿ e›Ùc,Š@¼êÒßDçš„êd¸öcu—}ß]çcÐ9Ì”²oß>®»N¹–­oßtØÑhÄyx^2ûÉ cp׿^*Áh‘Ü0óNÞ|w+—Ãþ½{tôê“ÎÕ£‡±iÓ&,Vøõ—_øpáGÄÇÇ×é¦ uÿú²ÿ~UüÀÙsçHNˆµyÒ”Ž|ôÉ"nþÃLþ3÷ߎIî£pçÝæÏ>åðŽŒ5†„ÄD>þha}üÿèt:Ÿ4kžÊ-º^½ûЩsžyò1¼?·N-!)‰ÌÓ§T”Úl$%';¾‹àЩ,¢£¢ÙðÓ,ûz1«W.£JãZµ¼¼FÎÉ“§üêG×®]éÙ³'¯¼òŠ&½·Þv={¥Ó¡Sgžú1Ο«If^n“Ç çŒMZE§1>ìÃ(.V¡÷àÉ,¢¢Èß IDAT¢Ùh£÷ÛUÚôÖfðzôèAdd ‰ŠŠ¢]Ûv 4€“'O:’'&%yÄ Úä$'';¾Kò·^b§O«ë•¸È×^ý¬§©»Ây`ÉÒÒìòUßÇí/*¹Õ2>RSS¹í¶ÛéÓ§]ºtá±Çeî{óø¿Ò0“½ø­gò:n‹ÿ¤¦­kyÔãÀŽôø›¼244d:4¡‚]6«]®¦v¿4DxKì+.Oz›õ ASð:W¿km­;‚×xŶcÇÚµkGTTéé}Ùš‘á訑#ÆLdû/›(-)v ú5«V „`â¤)*«Q\TDÆ–Ÿíÿ´~rpcØðè_:.@ÛÆ3)1›ÍH) ¦U«6;zŒ>é}Ñéõ1~øÁ|5n̤INÜŒ?ÌdkƯ?vÔ+ß½&[@tëÞƒV­ÛJbb"ñ ‰µ® µ~ Çèzµ™TÂ)"Â#_/[º˜ÛfNçŽ[nâ¶™Óɹ͜¿Ï¼>öÚþÏ›7‘••U«âÇÄÄðå—_±råJ–.õô¼†GDÖ­-[·&44”„ÄD½ÒùëÏ›¸å—5®rqÙé^þÍbî¸e:wÞr·ß¢ÐûÖ¿ßç½ù×ÉtÎyûV®ZÅÊU«éС<ø +W­fåªÕŒ?ÞIkx¸ÇUsöÅODD„ŸõÂÕõŒÕ*ù5ä®è« &g½úXŠ˜˜¾øâKViÈ×_z)ôèу6mÚJbb‰‰‰ÿëY†ü×FhÚë+åuþ9eC¼ëʃ8×Ó¿:ûê^Wø]×g¿êè¬=!UTІ°¸\2¶ã+!ÿpMZîšxHÔg\Ôù÷ÛÙ}§¢2¸^€î:µ‹½!nÞQþ,//çèÑ£ôîÝ‹ôôtù%­[6wüÈhbDzgG†ª¯— .rúÔIZ·i£ZúìØ–Õju¼Å>…„„œ«Mݿޤ§§óå—_Ò¼ysgÀ 7ðÈ#2tØ0úöíG^n.ÁÁÁü.¥ deg³zÕJn½ãN/ùŠèèh&LœÄìîs„*8camki·.Òï{dµ.L9vôÓ¯›6ÏÚŠï~dà ÁŒ6(` ”Ÿ‘è˜ÕsQÑ1ª´:ÆêjV|³Äñïï¾]‰Á``æŸî 1)™ü‹¹€®î»tIq¯>Ä#€ à`¾ùfF£‘[n™©)ÕcGð‡¦ GÐ8.Ž¥«`ÀÀÁ\=j:ç«`X /ƒSØÁM5+—-q´ÿý·+Ñ»Ð{Q#ÖT•¦Ú-…ÄÐ!ƒÀ7c+ÿùÏ<>þè#6ò/^$&&Ƙäç;åqQUOx©'¸˜‘˜híö òοhÓ—£5ô 6î> ƒC‚Yüõ7MÚò½è'½”#GŽ0eÊde|ÄÅñãë× GŒ¤{=éVªïb“®w'K׿Êe_·;S ·´¶Sàé~/nþmÛ¶‘žž®x·f¨V,U•Õ4oÑÊip„ (8ˆ”&M¹TX¨j«ªªJ…ö5‘€kT¬7M¨ú—‘á`¾ýÕÌ™äñ'žäÍ7Þ¤y³¦´oߎW_}‹U:RéX$Ì›;—¡Ã†Ó¢U&M¹«ÕÊ⯾rünO•dµ?gUÚ°Ÿ:³ç9tÿHûÉIézL{åWx©wÞzƒ~ýÒªuíX oƒE*[Ç))MTß'%§(“~-u~øn  Ä=jÆîÖ²ÒÑéô|úé"Z·nÍĉ(//÷˜ŽÜÇÆ¥K¼÷ö¤÷HËVm6t¸”V’ukzSš4­õ¹º†åääФ‰Z))Š<\ï¤^Š[½d›|]båjè{=à,¬ÓéXøñ§´jÕšI×L¤¢¢< zóü¸û¸¶RXXÈo¼ÎÀiÓ¦ÍòÅý_¹¬xÙ¤¨é}»Ìuwêb»\®¬mˆ‹êó¼Ç<#7r eEàþ£ËÏ ZèsˆªˆZü’è­qõAQ÷ôA‹ÐcE‡ÕeGX•7©¾ªÍ¼tª®É@"¸êª«hÖ¬YƒË믿€Ó§O«~³Z­9°—¾‡ªêÕ;ððpöíÝë³ïÒp¸€0ñËZ3Í+ý»ÞÖ¿Sª¸T)áž{ï囥KYýí·—”"©Ó¦ÙÀ§ þ¸~=Çgòä©Lž2…¯¿^BIY¹ãNW‹tþiqý·Õ%?§ÛÇ:íïs­çÚ¦ë§k÷î6 ^íLÊíš¤Ü  ºòóÇï×Ò³w:QQÑŽïGŽCii »vîð)ëa#•44§OðHîϸ}÷Ýw2d£GâÂ… Úž<½.iÝzMÆêË:W¸·=t„BoæÉ>h¬Ý$TUVRSS£ùÛwk¿#==èh§<ÆŒCII Û·ow|·víZ?êI¾ÿî;úôI'*ÚM¾%%ìÜálïûµkéíVoÔh¥Þ.—zµ¹x\yòÖÛï2hÐÆí"_uYë'½õ)Ý»÷Píxhöùÿƒ<ár`@üÏ,}ƒI/ ¢¡œ=_¬h(Cäĉ:ñEíïÚ=Ÿ$ ÿl/1ˆ:°Dh8DCò»A¸ÍÂyÎÄõöm~»M^8æ-§0iEY°R°ˆ j¢Za”ÁT[ƒ0If VÒ&…‹»Ùྠçù§ö-¥ƒfãÆ?~œŽ;6°œ?>+V¬pÜîÊ”·^zŠ…Kॷ?dá¼·iÕ®3}è1N<Á—Ÿ/ò[’RpÖ®-®ýÓª›‘‘Á˜1cèÚµ+UUULŸ>Ý‘¢H+vuÞ¼yÌœ9“N:1nÜ8Gî.¯7ÎØs{ùØ ·Ú~6[Ýä(á“EŸ³5#ƒÍ›6Ú@Âhfþñ6~üá{Îeg{\¡öPº¯®V®\Î …üûý…üã©ÇiѲ%?þŸú1•••Žº>ü!ÁÁlܰžÒ’ÆOœÄõÓofÑGRZZªÒ5)!,,Œ [¶ñõÒ¥<÷ì?ýìsvlÍ`ë–èt0lÄhfÜrÖ}OÎ…lvCÃÂøaÓ6V-_Ê«/ý£Îz|ÿß#88˜ÍÖSZZ¸ “¸núÍ|öñ‡”••zÀ’zäÈ^[±|9,\ø?þ8-[¶ä©§žâã?¦ªªÊ±…¹ÜQo¡K½§õì=Y±b9…Ìÿp!Ï<ù8-Z´ä±'žâ³EÎz«W*õÞÿp!O?¡èÁcO<Å"·zg½ýèãOrÇ]³xæé'éб#í:t´-n¤C¾€ ñøã9èøäcõ{ý-Ÿþ¿²q£2>FÍm·ÝÆ÷ßïxçÿ¾ÏRÒÐË-ñ»<ú@®yECyå_Y—6´X(kyaC^·+PµîÜŽpÄS:¶–m—I@¥Ã‡è8ÌãH,*µQŽtn[ËZ¤kÿÝ‚+«Ð9œTöP<;†‘:ALÒ $IÇŠ^H ôB¢Ã  v›ïÆ{ï,À½wÝŽ¼öª¦ÙÙ`1Õk Ã±Ç¡¸x=jb=úõ;ðÈ#xúôòËG`òä) 0öîÝ‹_^7 ÿÁhï’bÜãâﯨ#ïkÔ(À1ŽÃqÖd¥.vü°#F^ƒ[ï2ÚûÁ» 0úîÛ1óõWe’aP¾X1öïß3Îø¦O ŸnŒÇ«¯¾Š»îºË¶:9åÎÀôéÓ]åît=¯gŸu^6ËW9ãû›»ïr”+û+ö£ÿÙ†”®–Ëeru¶ÁÓùàC~ã;Ù®ŸÓÞ/|ÛöÚ»w/FºãÆ=…d2‰… âÑGÁ_ÿúWiW.ƒRÝ2HUù¢ˆÈûj ¥½£¶˜@é-h9w—ñYg(ë )§#Tû¨fmPG±¨QÖzɈ@=Äé熨ÿÂô;y ¾Š–åZêkÁ7’e×nc½$¡æ¿Ø»‰“¢ÈI¶d’ÈÁèÐb  ˜‰Øn0[k VlRÌH@вn¼OO¢ ®ƒb±•1š&!´jÕ [·nµAfæSÞV-Ψ™$,†wÇù´nƒÆØ^¾ »ÜŠ”‘;0F5²]TílIá˜ØÏ¦ÕaŽêÔ©ƒŠŠŠ´V“¼¼³)Ðʬ²‘0â!êÔ.BŒûöíM;ÊÍš·ÀöíÛähw¨éÒÞP­zu$ây¦•’¥nTg¥0”€nÊleÊ´<Û™ÂSï֯߻wï¶é¬ü.kÜ*+x¾‹™¹‚c4hP{\ÏcÅ‹ëÕ¯={v£ò@¥’Ú…ýþ0õ¹Nˆ,— ]ô€ö;í¨ÌÊ? ŠŠŠÀâü€­·%Kþá¶ÃåX’™²Móí¹ÐDî‚vÒ‘ž›YÖD`'“ˆ7Û¬±òcœÌ;*À18Šrз¡ÌžQ»6|4ŽíeeÞI—{‡`ôa\33ï}Y\Ö–›—•y'Ê;ØcÕs.Œ6hÄÐ4R®õR4ÙµJÏÜÇRvE1ÈM½vÄ4Bõ¸qj$€ü¸(Ûìʸ£Â*$}g­RFl†1œâ†Î°v¦@С™ ƒ =͘ïºÎÂI¢fÔÅüLÓ40ë`6,“š¦Ù2’L¥Lé¨cP\#6,LìMâ™ÓýCT` å1 òÈ8¯·c«ØÌ§L¨H1*’@J7êmK¤$ S“`º¥pmNGËAD¸þúëñÈ# }ûö!¹5ÓÅý…·PtÍèk7¤>H³«—ݾ®éбŒh!¡‰˜#ª ¥' ©-¸aAeF³AXD`Éò…gž†ÕÀ’œ…@bhƒ ‡–œ.]ö@€Ó|ù¿,Í7f`ɰ‚#)K`Éð'Ó <®Ë!° Ÿó72,j ] ,mñX›)Àœ{¹T˰ˆÁXZk@ŒŽl`Y-&€‚< ?æöfU‚Wk­"IQ™"HÀÒN%uRLHA3ƒÈɵ¥‘!XzI9ï©T šfø[kDfßêH&SF?Àô±¤#ASºÍØ0C}Á±ì´ÊÞEíHóîiÔ¨Î:ë,´mÛwÜqî¾ûn%5Š/4`1¥ Ô“fÂG ! (øüpðøKü¨2d*+«¯¬\ÈÞ-Ùî¤è_NÀ%šÎ¹œ3šYðål&Ò¡y ~޶>’.'gñ!|g 3a¶pK¦t©Ú9pdIò¡ÃCó>ÎÂp•ƒBÎzÉ ™1½!%BtH'\6 !{ÍJk‘÷h0%’z )cûhi;9ÕuNuÝHŽc­•¶Ï§b­¥NÀ7ƒuÃZi¯ç̈“DÆU(nÑD]´\As:p@¹Ž•*A°V1ÜDìkp±| Âd K\§NÜ|óÍ(++Ãu×]‡©S§fübVd¼#µ)…TF·&ó‰žfa³f†µlÙ“} ÅÃ¥â`RQpˆW‘ƒ øà?âæ[Ë–-‘L&}åàH•¹¸Úµk‡X< À®]娾µ,ê"™nÏ‚Âè0 ˆÚ·Ç&_ý—%R%õfœg£Cá©§Z“ o?À¤íâÊäl +»Æ @¨p E¨Ðc`Òl¤3Ù¾œ –9˜ØýL¢Ò(qMsêoÇ,¸|ë)€ T#®H7nŒ .¸ÀÓî~øÿûß=QPP€‘#GâÛo7`Μ9YÂogÇ(ÈcÔÊ'T‹‹â«ÿúÍŽjºõàÕ—'â®›¯Çþ$P™4#Æ ˆÙ¼PŒ”Nf´™›Ý¡‚ª›ÚBåƒÆŒ3ФI”••ù.ÚâõÜsÏ¡¬¬ ?üpÕN› •Ö-·Ü‚Ûn»7F"‘À³Ï>‹[o½å¿~a/,,ÂîÝ»qÕUWáÅ_Df nòòÓ©®ˆP™w§,+‘ðÀòwßÃöíÛqÑE*KKuÔ¢f*¢rÈÁO™jýH‰ véî ®0ÕºÙ5ßžËÁ|óãx|7Pü+«Y"—uÂOnÔÏ*.-¼7殽îz¼:uŠdªU«†’ƒÐ­[wüðÃxïw°|Ùg®AdÓ-„„”µìÙÇ€/FëÖ­Ñ AµË]~ÅÕJÐðÉÒ%X¾ìÓœbK¿l”aä/¥IªU/@ù®=¸êª‘¦þS¿ÇˆXâšE׃´l¬R~ì¿Ú³4Ï )‘Ô qÑ€ž£cUQánf OT«ÚÀ.ËÙíÂàJ‹¯zÂ`¿)Ê'$4ÙÉì­«UB&Q7 û’vTh¨H2® Yz ë£LAƒ¦9>šº` µ cF¤8™QàVÜ #‹™ìDºý̘C2yÌŒ¸9…‘ŸŸÇ‹:uêà /Ä×_Å‹ã‹/>WöQ,Ç3Ï<‹iÓ¦e,Ãݲ+4ã’sNüsÉçöàÅ‚®»ÍLÂPø¾ŽBÛ¿£X{¦M›†FUýþ‡£GôÇb1ÜwßhLœ8?üt]G"‘ø±±dÌd0`N8áDÜwßÿyÀ_úÅ?½cEî€8Qx/‡’ÎH~-¦Ãº‚ßd`”‚­ÿ¹Ðç„ðÛÑ÷¥µväÒ¦àî¿LĆ|Àf˜ù6)GóÍjÇÿ…jg=]¢ÊÍ•W] "¼7æ¢EË–xrÜSxéÅçíï4lˆÌœƒÎ]ºâÓO–¢n½zxøÑ1¸ãÖ[ðçñ̨ 'žp@ÀçŸáYÅÃpUÂôi&jáÉqÏ`ëÖ2ìýQÎQÿÜÓã°ü³OAjÕÄ~åžÑ%`åê×zõ9ÿö>Y·³¿Lú…:†¡… ^Aáæ<,ë™Ë_Hð™7!‚¬"ÁoÞåè4F>ÚGØ£èR¯†´7gûˆI‘¸²Ä‹ŽHl“ »­–âéªÂ@ˆt©œÎ^ËEPª²ihcsìÄõƒÙ fÖ„ÆNf]בˆ‰x•É$âÖo¿ùæÜxà †ò:÷\Ìœ9÷Þ{ïX„Ä*ºœÜ(<“0Zêj÷VÁ(ãØÎ0U*Î}èýIZ|swfñÁ±Ðê„N@½zõð·¿M±IÜ8€Ÿ¯p×€%¬qJÒ¸J2xovul:j3Øc† >b"”x??gÀã4!D—¸7–Ù\%Û‘7ßi;(ºq k×nx套ŒwëŽÏ?ÿÔÞßÜw?ŽëØ gž~*>Yú1à·>Œ±O?ƒ·ßzëÖ­­šÊqU*¾ú¿»ï«Ÿ°a2þuŸUŽ_gB2´o…vëy.EÇ Ôª] ×^:uî‚;v`öìYxãyžçתU ¿ºñtéÒ;vìÀ¬Ù³1oÞiëÕ¸qcÜsÏ=X´h^{í5ûó|õêÕ|öÙgÊtp·Ür V¯^òòr\~ùå¨_¿>f̘yóæy²õÔªU %%%())AEE…>óÛo¿ÅO<IŒ‡ ‚ââÎèÙ³'àÎ;ïž={<ò°tÌ_«V-Üxãv¿Ìž= óæyûïñÇI“&BÓ4 ~:vìˆ5kÖà©§Æ¡¬¬ cǎäIñŸÿüš¦aìØqX¶ì3¼üòË€+®¸ûöíÃôéÓ¡iºté‚ÓN; ½{÷Á_|·ß^€Å‹{üÑҽ׺š6mŠ›o¾m۶ŪU+ñÇ?þ1ó½¤ÇßC† Á¶mÛðì³Ï cz³äS¶ÿ‚M †*P2=ŽïóC¼7•J¡{÷î1«™3g*å*‘H`Ô¨QèÓ§’É$Þ}÷¼ôÒKŠ`5örž²·–õë×G¿~ýзo_äççã³Ï>Å’ÅKðɧŸØÍ0 Ç÷8ƒÁömÛðÔ3ÏÚϸõÖ[ ›¤£š¦¡s—.è{ÚièÝ»·! ÞÆG‹? %k]r0 ¤$tÿ…½¬ñíjëYø§k|Ï2CηPšÀvÜ]OÈÁŒ4rpR¦L~å%“r$š“laa! ¸s¬]û% гgOügõjbÿþýÈÏÏÇe#®À?^›nƒJá÷c~‡nº×ßx#î\êÕ¯3Ïê‡Sûž†¼¼||úé§øhñb|ê“&7þ©Y»®»þFtîÜåå;0wÎl¼ù¯yi,âŽßY.,ç~p¨ß¹%èÖýx” ‚¶mÃãžµ Ý}Ç-’œÖ¬Y ×\#Š;wAùŽ˜7w6Þš?Ï£O7iŠQ7ÜŒÖG·ÅªU«ðÜsÏyê êÝ>‚ÞýäãÅ€)S­nƒ_Ýt+þøôX|ûÍzé÷C‡_æ-ZâÉÇ‘÷žb؃à/¨Ò}¬ÜHfÙÇÉ ?Å ˜öû;€¸=Ó30 x‚_¸€/÷'5l¯0¨„˜uƒRϲ:š>•,œ8©Ì®Ì>ù›}ŽiˆœÈqÃ0§C×uTC¬.sæ»ß3f`ùòåžÏ:ê(üæ7¿Áã?Žüü|¼üò˘ƌƒwß}­ZµÂž={0qâDÌ;×3€¥¥¥9r$æÏŸà†n¨‡N IDAT@íÚµ±zõªÈcU³fM¤RIìØ±°mÛ6”•mAYÙiÁnÞ¼9JKWàn©_ÞPö˵×^‹aÆãƒ¢ÿþØ»w/úõëg§Ã;ýôÓqÆg Nq1®¿þzÜvÛíöïo¼ñ&4hÐТE ¼ÿþ()9kÖ¬A×®]±`ÁÛ¸îºë"¿×Zü—.ý7Üp6oÞŒóΈ·ß~©T*#YoÛ¶-R)£ŸöíÛg÷]YÙ Eé?{²ÐeµmÛIá½[ʶطvìØï¼ãÈÕ_þò›JµjÕ°páBÜÿýعs'òóó1~ü<÷ÜCªBïçÓ¦MÃwÞ‰²²2ìܹ#F\Ž+®¼Òp&7wÍmÚ¶A2iôýÞ}û°eK™}ë:C‡q7kÑï¾÷>JJJ°æË5èÒ¥+ÞZ° ´œí’ƒ(ýæroŸñ­Y³&’®ùf½7“ÀCþRiåO-1gÎ\…,Âý÷ÿÖ–ƒ?Ÿ€gžýc{›!¼………Ø^¾ÛË÷ fÍšxû½…ØV¾wÝ}/†Žmå{pÒɧ U«£QXXˆ Þ”ÀZEE>^²Ýï!=ýoS§ãö;ïräêòË1räÈp+WÐ^³æÍ±ø“RÜqçÝØf® ¯Ïœ‹Ñ¿}È×&)?*`H™$äÇìè£ÛÚócßþ}(ÛZfÜeeÒø6mÖ‹––â¶;œõmÚŒ¹øÍý‰†&Õ¬…w-Å5×Ý€-[6c@ÉyxkWÿ©ôî[ ÞÆ/¯5æ›n2Jž‘׌’üžµXþî÷(,*’>O±áÓ™4³ˆ¥,ßI]¸…ò,°`ù«É¨°Ý¦,t½/eÖ!Åê[wýÛN+Ëk‡«½N*J Y;×Ñ´@w§ÊGåˆà‡ ›ö*R1°®Û6–²æâÊ´(„¬Cw¶Ê²hš´\M@j·›|ÞÆæÕ²”êö‘¹U¿TJw‘äÅÀšq’lËåÎ;ù±Çc2³þ¤¿Iºû÷ïÏÌÌ:uâX,ÆûöíãÙ³g3ñ<À ,ðüÆ{ƒ1pA¸N5âzÕaßk×|Á/NšÀuª‹òÀ5âÆ]ÿí•—xëÖ2>ªQm®•.L€¯¿öN¥RÜãøn×Àq üòË/qYY׫S›cŽøšk~É©TŠ»wïf×aðàÁÌÌܰaCnÞ¼9¯Y³†ÿñp~~¾]F6ƒ-ZÄS§NµÛ"~÷Þ{ï13sß¾}íÏF\v'“InP¿=¿øÅ/8•JqÆ ír+V¬àgžyÆéw„˜7Ï;¯„™™[·n¥üÍK/ýR§Nmû3¹_œ²;wîd]×¹Gã•Ïš4iOš4‰‰À7Üð+ž6mWVVraa'q®¨¨àÞ½{Ùåãñ˜ôû)S¦ðÇìynº÷/¸`'“InÚ´‰ýÙC=ÄÌÌ#G^A¶å{õêÕpà7lØÐþìòËGð?þÈ5ä÷#xžwêÔ‰™YGõ\î?¹|<gMømT9PõOºþ sþœñ­[§¶ý[k|ïÞÍó\k¾ݺ•ï»ÃÞ1"»î~µúΑƒÓìÏ9¨o—¿çž»%9ˆøJSêÔ,àü8q^œ8?Ô .¨çˆ åÒÒå\X-Á…Õ¼µ¬ŒO;å$.¬çê â’sÎffæþgŸÁÕãäÜ â¿O™ÌßmØ`ÿݽKGff>¹OoŽkN[!Œ…ýoó»/¾ø‚ÿòç \-®‘ .È#.4ï)æºÐ¬am.Ìæƒoe¬ 'õîÎ…ùÄ…ùÄmZ6afæ;o»™ÛÝ‚ÛÝ‚;˜wÝÂ<.Ê'.Ê'n+”ë ”q—SÝ5îÿü{5¿0q‚ïoÿ6ÙlG£:vUívÉœL&¹M˦\=aŒÑëõŸ£w‰5ÿmÊ^úñÇœ'»Ç<ò oÛº•ëæsažñÙ˜™¹[ñ±\`~VúÂm~V=aÜâ¿«'ˆ«™²k™õpôæºIñ·\Öœ/šñÌDÌx~^œ8Ïü;3¾³oͼý>7ï˜Ïm½W¥ÿàú\3ñF~ \·:ñQµÀwo îÖ˜ì»k#âÎ »¸ÆÅ 5n[WãÚ ÎËËãx"Á‰D'òŒ;žHpŸóòò9‘0ËÅ­²Ægyyùvùx<αXœãñ¸QÎüÛù,ΉDœó ÎÏKp"ã¼¼8ÇcWËOpõ¼8kA©è˜ÃÝ~׺uë ë:¾þúk|ùå— _Î:„BõNQF¥N¨L9”™œÊn_­sÎ-Á‡¼;wÚu›3g&ˆƒ –|å>xß(g]sfÍò”³®‚‚¼ûî»øôÓOqÉ%—àÀRV;üž¼r÷.¤¼¼‹-´Ë/x{b±NÿÅéö>£K—.¨¨¨ÀîÝ»íç—••¡V­Zž\Úò>‡\vo6s=…³Î”””à}W¿Ì è—Å‹ã³Ï>S>ë³Ï>EçÎM_³ñþûïaýúõèÑ£Ž=öXhš†+VHGx——‡6mÚàË/ BùX,æ‘Ò ÷ÀYgU«VaóæÍög¯¾:µÊÝÒ¢ö_Æ.nŠ«¼¼ .´ÿ^°À”«ÓO·?4h–,Y‚F¡S§NèÔ©6lØ€‚‚ 4( 2¿«uùå—Ø¶mžzêiœqÆ™ö÷ÑüKå½Y*•ƒ‘——„’ƒC1¾³3ßèG{ÊNÛrPÜ©:cÃw†œ7pPdùK&SèÜ¥ J—/C2y 5BÝzõ°¢t9’É$˜Õ jØWiÄÙ°ÒÙ¯]³Û·mÓO=…_œq¦Ç¯4]ð­e)·¬JýÏ-ÁÂÞGyù.è:A× sfã6 d`I3žüÄØ§ñÅWðÅWð¹yÓ¡£a}ÓœÐOŒ}Úþ^YNgáßf„vÀ-®{òwFÔô9ýK°ðý÷ñÃ;‘LÉ”£_Î-dvúgaõêUø~Ófó½„W}2½Yz7_˜o={õišýþ¿LœˆÚuêàÜçã ùÙÐá#°dñGø÷>ÇÁã`Ší÷‹u?˜2nñoñ{ËšÉìõS¥,ô¢˜Ã[-§¢RwÙ/áVX3U7ÃØ}Ì/[¼ƒX·¥@(‹!€ò„MûØw0fÓ€ÖŒ8iÂSœ§YÞò’¥Ò¶X::Ý¢»Ò6ºjhÍE]°²ÎˆišåÚiD…;¶VΙ“®ë¶Óv2™´øT*…x<Áœm(OŠ#“ŠB4Ç¡NݺøxÉbp2€íÛ¶ã«uëpt›6€¢¢"Ô­[K–,–Þ¶mÛ6¬[·mÚ´‘úB×u¼öÚkhÛ¶-Fí:Êr¢ÏHD‹¦E5)–,^ èºád à@E…1±óóìß¼õÖ›xüñÇñÀ`Ò¤‰èÑ£N;í4œvZ_.Ñ ÏcëOÔÆáúE¾,XàûÈO>ùO>ùhš†O<Ï=÷,–.]Š>}ú`ãÆX¹r¥-#ñx÷ÜsN;ítôîÝ[¶lA^^žä×ö½Ð·o_|øá‡Òg[¶l©Ò…?“þËåµxñbɫ–«|û³Ö­[£aÆ–T*…ãsüq¼ŸúèC¤tÇŸP¥ÿ‚æ›ÎRl<`Ãw1gÎl\õËkð÷©¯¢fÍš(9o n¹ùf¤Ò¸Ó±›«+ 5h},Ãe¥ÊÝ‹%}—†º‹¼@$ø< X‮á‡ý1ìJÆÌv™ÇкëÌÜÂCB?ƒ¡Yôè,úŠú\ƒ‘Ü:'19¹·Â`3«KN±ºàº§iNãDÏ«¦s‘a6Î9 x®v¬‡ißÞ½¨¨¨ÀQ­Z üO„D"¦ÍšaÇ¿~0|¼Ìr­Z·–ž–H$ЬY3üðÃ’,jš†éÓ§ãwÞÁ /¼€uëÖáÓO?µë`óý¹|nb‡É‚VQ±ß$5®˜æ¤C²þýÅçÿÆÈ+/Ç˯LÁ°aðhÑB 6K—,FLÉ1ä%HàÏ N}-̾oŸÑ/­[µ–ž.õ‹ÇRqÐwøV­Z…x<Žnݺ¡I“&X¾|9>þx úö= EE5…>4yî»o4.¸`.\ˆÝ»wãÆoÄ3B‡ØÎ ÷ÀúõëѬY3鳪¦€²åªU€\UáåÎð³j~ôÑGgm«b@‘5kÖ`РAh×®~ýë_cܸqhÓ¦ î¼óÎÈm/%‡r|ÿUEãë‘pÈÁaCÌfD²ìŸÅ,­Ðö˜cpâI'¡¸¸36mÚ„O: ݺvCùŽ8ñ¤“——‡yóæáûòíÚCç7\>†mðÝ÷ß™cqûòË58ð ´mÛwÞõkŒ;GÝwÜqG00ÓÅ|ËÀî=ֺРFŒ˜Ñ“y‰š65æeJùï¾û+W¯‚“'Ùm8Ê­Zí,äŠH¹üYÖÖ¤î äØcµã¨V@f{}ÛþÏ2ðõúõhÒ´™ý7@h¨Ðò|[„=»wás¾1dþØ?ýi<Þ|óM´>úhœzj_躎©¯N Í1¢Nʄѡ¤{óTfûJŽôØ `{ƒ¾ÈqôØ}0†mû5T$ÙΓ‘…tŽŽ†‰7íL:®Œ…M•@-ä>mRö¨U†™[8"ç9dfÞq7Lõ謹8Êr×®ë:V­(ÅɧöuÇ÷è5j`Ei©Yޱ¢´}­ræÕ£gO£ÜŠRO^|ñElÛ¶ m۶ŬY³Ð³gO)»…''¹uk$Ã_ñ»˜à¬k•Ó&h4¾¹÷7ÿ‡Gzýî»2q-\R0¿ e½WÓqÍ >+V”¢ïi}·ô)z÷2úeåŠRã÷®\«1RLif$++±jåJ\|ÑÅøä“Op°²K/Æ-·Ü ÿü×?íZßtÓÍxýõ×1ï7ìg rAÆÒôÖ[oâ¾ûFێǤ£ÀÈ¢iVtÏž=(((P~¯ë:JKKÑ·¯,W=%¹ “×Ù{¨¢|oײeË0xð`Ô¨Qûöí o  »víZ\sÍ5ؾ};®¼òJ JßKÄÀ¸lä lÿ¥kž•W_ro©©7r¯ÙÓ†o¯êo% €ÄDî ,{7õ Ÿû#fÍœ…‹.º—\| ~üñGÌž=ï¾÷Æk?ìÛ ßcùòå¸dèPŒ7Ξ—íÚƒ.]»âꫯ†Îäiõšµkqm€\¹ëfeȲ>L¥R(--Å)§ö5™ñŽî=Œq[^Zj0ë¿ 6A®:™‡Àæ]é¢|:Ä>xGN½Gÿ)¥~!ôìÙË¿ÒRûµ^ýÇJý<ßä6¼ýöÛX³f Î?ÿ|œrÊ©˜>}º('Ïu‰'žˆo¿ýßÿ}Èu>ÛœMä/÷ŠÄ¹:9ûXr#g"ÛJHQ°ÆÀØ^Cù˜É˜ÁÎé³zÅgÅ;ÜlÂäÖ*%KNT‰äœ pòñ¹!s¾è:›©¶þ¤D" €Èˆô«Y³f(δªÊ©Í.x”Ÿ—‡  £  µëÖ•ŽÕ ÀÃŒFÇNÅøÓŸŸGqqg\|ÉP<÷§ X·v-þ6e²ýäßÞ?Š‹1qÒó(îÜC/½ãÇOÀÚµk1yòd¥Œ¤R)\vÙe(++ìY³P½zuixó ÔoPùùù¨^½:êÕ«‡¼¼4+{‰0ÆšfÜdþ×’3ëóD"†˜¦¡wŸ>¸éæ[1êW7àäSOA^"†˜†´wÜŽòm| ˆÇ€DÌø¯u?üÀýèÔ©ŸݺvÁ°K/ÅŸÆOÀºuk1}êƒU3~gä„FHÄÌÿjd~o|¶l™á“ºdñ‡HÄŸÿ{%7nŒž={bù§Ÿ"®VÚ—,Æ }ú KçÎ8¦][Œ¾ï>ôêÕKylæš?>êÖ­‹_| ;vÄðáÃqýõ¿J#«Š7ˆ«,³gÏÂ9眃޽{£°°­Žj%¿ÿþÑ(..ƤIÏ£sqg\:T–+)•ƒÄ0!àV³gÏB?ñ½­Ze´à iæÌ™ƒaÆá¸ãŽÃðáÃ1nÜS¨]»vd¥û‹_ü÷Þ{/N=õTÔ©S½{÷Fÿþý1cÆ eÿΞ=[î?W;/^Œ>}ú ¸¸mÛ¶Å} 9Èd‹š®ÿ8ÄÃÈ5¾Å;ãs~¬]»S&O®òí·ªAþî~Ÿ?øÀoM9˜+ÉÁØqO¡VíÚU‹à“eécëv–;Fqçb¬]»{~Ü£[÷îX¾|™ý½õ¿'žø=zôèç_x=zöÀ9ýÏÁŒ™3ñõ×_ão›b—;Ý%W½ä*‘0Ö…¸¹.Ô­Sq—?®3n“P\\Œ¡C‡Úóò•W&{úÐ?¦@Œ¦ ‡ ݺé¾gÍ2ôK¯^½PPP€£Ž:Jú~ôhU;Æ úŸþõ¯pú/Ú|cL˜0C‡^Š3Ï<ýë ¾rzÊ)§`áÂEX°àíHXŽá£ýŽºCÛ«ÎÆõ©Ï=ºš-× B’ÉŽT/¯$|÷cÛ+bH¥RЭ3Û£@“ÖËÒÎ F¤ì%‰ñÅCÎ3"öií|.ܵª¿äÞ(ôß; ÞäcÛ´àšùž¹kçN~øÑž÷‰uúÕµW33óÅCÚ‹ ?x÷íÛǵjĹ0\˜OܽøX~{Á›|ðàAs,æs¯ž=˜™9/"chàÑ£ïKQ}óÍ7ñž={˜™yË–-< ÿ9¼þë¯ùê«Fr"<·ýã&çÖܼY3ž9cïÝ»—™™ËËË•é¢\½ùæ›ÜÒ”«0¬ âçšýÞ¦ž÷º£Â_í5é¹uêr5bÄéù={öä¥K—r*•bfæ7òÌ™3¹fÍ¢ÀþTÍû3Î8ƒ—,Yb×kãÆÇyBTvÌü¯ÍÇñx‚5-Æ1³L"áÜbtw\ø>.|–ð”‰s<‘àX<ÆZL3ïÇ„[Ó4ãŽÅ8s^^‚óòŒÈðêÕò9/ãü„qSA\©’œå1ûlê\Ê1bÄ5oîa¥×435— a£Æ(ßµ{÷@Rg;zË}ZѸqcìܹR¤¢»}ªþ1ÞEv>Ò0Ýà>aRýdåçk1oîlׯIr¥Î<á#W>í«^½:j‰ïõôIP’7ùªQ£ŠŠŠPV.¨)H=hš†ÆKî!þ:‚Ó¶£N:¨¨¨å/åJ÷^Hx-ˆzãy ‘·ªq!WÆU$öÈAYÚqÎåÕ°aCìÚµ+0Q¹ŠzÒq«B9 ÓŽXLC£F$vŒlæ[^^6nÜ„±cÿ€1cÆ–mÕª¶nÝj¸Z„2&’R÷QÚi@,®< ¯º+=b{mÒ4B~ ¨¦ˆÅðãA Y—ó_š:]€™~Qg¶ƒ†ÉHÜm±*U•Û›Ò4)/¸émµƒ§ÑdîV5ÍŒ='‚FÝæG5÷ àJHêAUÕ 2XÆ4+ì?QçdzdL$’&í§Y(m0¡ÊÛLä9ú·€¥¦1b…ÏÉê{â¼kܸ Ö~ó=Îë6Þïm`ÙÊÏ1ãõéøÍ¯ïð…~@1-uCˆòPyÂP¸£X QO†CCQ™R)X’ ¦“Ô¸y,Ÿƒ½9aµûŸ™×sƒË°B¡yœë¸Ûó #:0Åy‘,ýç§-Ê‚oMpe„fýæ'uqÚfº‹‚§ßf ŠŠ–‰žù7 ?= 9ìEþ"³ëúë¯Ç#<ŠöíQfÝ »1 •@´<ç,¬ ¤8(Îu¿…R$š© ãšòRƒn‚>w=1d@KÍL§È¬›ùí€'ú>zSU‹Çá䦛ù¿Yð-)…,¿K0Û´‡"ð´wŒ f º™ÿ<î¤Jtå€<¦ûÀ&U¬¢bïul ”åíõµè’X/á#N³ øX-·lÙŒ9³fà‘1ãù‰ƦMѱS1Î<ëlÔ,ª‰É/¿bZš¡rápUÏ\ñùÐ1i¼¥ŒS™lz¿SÔPhm“Ž•‘9X‘¹åØÊvÅ>¿g&c¤“ie?èE´©ŠÑZäiQÚbÈ‘µ‡°-ÁPÏ>œ Á ²Ê_tèšôóɨ“›žmÔ¨Î:ë,´iÓwÜqî¹çîh 2ÂÜâ §q࢞¡µReHÊH¾4Cfº°fäø¶g„ØX›‰Úq®À:bÁÔ⻃dyÍf²ß!á% Œ2@9Dæé/»Ž$Ù‰r¬›f T·¸"e¤JÔ¹*„;»+F†µ)FnXã$qg!n^KÑÕFÊ%² fÓå ²Xúƒnˆ K)¥–äÆÂ ÀÖ°a# :ÿœ|Ê)hwL{üðÃv¬X¾ /Z Œº‰à»ádyCÀŠ‡ÑºPvè9’.*6U·„ ~ÓòB‡`æXŽ|£ Ò y†“à°µŸæ†ÐkÊDú}EªƒNVÎ&Ó Ã&¶] üßáøÙköÊëw°(ê³ Ý+€û67½uýzEtwf aPÛyÅõT¸-:Yq šA÷gsú¶$:µ‚hˆKÁDfttîõ®F w¥ûL÷‡ªa’À°©ÄµXÌÌ¡mòKšÂl4'4RtðQXXvÿa×I4IÇqÝ7*éǧ,v »ÄÕÙÈ«ë:äX,«W†=óWÿÖ¤\aq’“½U ;±º0›(hW9 MéˆXD¢2¥Ð¡~i„ç‘rì8'Ul@"ÿÝj6ÌÂÉú/AÍqa£…›JdòÌàŽœL½ýÄŠeýˆð‰<ð#aö wä²ø©ZH”®6¤{é{Î[1Y§uTv€±fqÛ%ì£_T€“•»ò°’ƒÕàST›eʪ©Ò'&%Á4]AY¬ûïûnû9Äúcò@§rº(§ïS³÷ ±nŠ›¢˜É¡íbÁÐaû ZÇÆââBì…眮žÊ°Ž”¯­uA³,u>–Mys‘“bÍ&3q+KM• f* ΢-Z´Lš‡$TPD$û3Xª@w)Éc8#¹vv,V1W T&V¶°>™>‹4…ßåA9}ÞÇ c&‘ìÏGÀtUåˆxDŒìç0FŽ`@Ñá~‹e†Ú6,õ…¿™àZú†©,IäÓOªÖ9ÆKþ¶”å|ÊJ“\÷#Í(©Ê¦´@0¹Ü,Ø#g“­!^ žûÙQß0y´™'Ré}%åã`’Ò*JnÐ胜 i#SZ]Ÿ6’2“átž’šq@¾ÏO¯A=¿ñQ[Þ(ï±0Ež¹ÖSY~JÀ6ï©¦Ž­#53wªÁý(F[$äl"K#½9½áAܶ…XaŠ·Ø9çÓ¬ v„: ‡¡´~Š9ljÒ5#nX\uDGHt¸#~¶¡×ïî,:ó+…O ¢P˜yJ†ÞÀçÜŠHUZ>Sô)€œ  …2P”lîØsé>—¥}ÏHìÿ¼1LgñÉ\nCõû#?ŽÂÄ26mSµó´Jëï¦!Qϰ®AVI’`®ôNøo˜³7t‰BÍæðŒ øõ0¾“¹ÔC9D˜r6;xI»ÓÕ•CM,ÿèòÜë81IµÅs`Ãj¥ƒÀ¤~«¢,¹üIصøh&ñ8“LÁ.«:+¨ÙˆÜ|–ò¼¹$E0iëX„çš½q©Ž¼‹9çMßQ"/O¦UO‹žÈz”f˜»ÙŽ ÏÜÂX5êÞŠfÓY-ºD²_ûy½PU¯?Qò7ަ™„ J$z£¨}D”}ß:éƒÉŠH´f`!ÎØBM^åíS:ìžáYÚ2SqÛ¬5 ¤ÿ¥¹0›±@Ë`& ×oŽTíˆs¸ÁϨDœ¹û©7jÊùŸƒÊÕrNêD~ ³ÆTÙLÏÄò[kHAƒŽ1€bP¥åµ¬a$¤OtHÊÝÔäØÂÜù©É:9bû¬Lõ‚Ίݧ_,›“`á7@¤æ¸’z«#Z@­ÿj!.¨òð/‚dVQ´ÒnFØ•"°Š”Y¦çà‡Ë BU¤ |Ïi(’©(;¶´ÐTD!»%èø)ã¹âûP¹sÏÁ`Ëžßß¹J£ZÕb}訔«X[*üi™9bŸd!9dŠ2“‘HÆÁ,¹9}âAʸnáô0GMÇEÙv'åf*‹£ÞŸYJFïC2é eäõ3­”–‡L–l,ÇJ(¦J´¬~îXۃ؛€G5ÿB$C€‚—œÈ_v<áDÞïí6 ®2¤êWBœL'çL)‡r•O3xPÉFêNòs†‹qV**WH[NtŽÉ&墫Ȃƺ”N‘åîhŸ2Š OÛž )U¼tÀ›Àh€ÂåœC‚¾œÏ@E`š/¨Ì€x>pí ™ÖýHØp®yÌQ€F†•§ÛŽØÈú ™7`ǽ’r&ª¾ó²úJëÛHþ°‡"S"ÈQT³ç‰÷uß ÔaÖ}¹ÕY>;Êþ©:4èl}‹§_l‡j;h‰”>{þˆh–ñŒ*–â}Òt²×Že¯ WFf/#»ø.½?ìäqI9F¤ô¬Þ¹hlz¤öðŸ†SÀÂìU Fôš_„)Žœ±f…ÅàÈ@‹!+Ÿ uŒ)Éûî(ƒÜ.(]½C[sÒû™QJÞ}4”ÉiÁû:ÄbpÈå~ ÃKr„^*?ËÜ,Ö™yž§¯Š‚$ÚªeQñ™ì ÀYTFEЬŽØ}Mº6å²=¬¸éòh“Î’C 1èsˆËa<“s,måÉV€BŽ\Ù³±gË¿±Ÿ'lÔ¼î%ìU²Ov†w Ž” È'Bܶ¼’E –%,`ÉGœxK¬üð‚C¹î®`vOd×àà¿èŠš-‡`ÀŸN]‚Æ òQÀ9ãr ð†÷‹ôõ,!V?I¢p¿‘R;Ò‘àc™¾«Ó‘ØèŸâÅUV¸ :šÔ–šœ ¥Ÿ A’}Îö+a‰€Ü>P­jQãC"þaÀ%ýæÌ1u õtÒ`"y™ ÙBƒäØòu]·¡Ât(³ÄÆ‘Vh[H˜½=jGfS:#nÙœr¥S–vû¸Ÿ½ó“D‚t“ÒѰ™³Ïä><ú0Å^RÏâ+Ž»%g}p¤[(( iÊ…f AÊ ¬Šë gÖ¸Lw¼Á¼mþ>+'¦˜:ñðg ϰã"§d ÆÏ¡5‡P×Òay0ûqêå"I>,j^IŠÐdXL¾ 2œcðÈ„÷Þ¢œ ‰Ì=>z,[>ìòo´§tS Ó ’}Ömˆ§³Ù¥Ô-ßCÀHq(põ˜ÿaO<±7Ó³Y]Ì/n¾O¶R¦ñ[¥à¹d=[7Û«ž—d‘‹ÖMéÈŸ4XZGȹOÝ4h±)¹$Bí…|œŽˆ(“6]­Ú5ô3Óñ%R•«ãÌÞǨJz JkñRþ›²UY i (ó¢õ‘e}I9RÒu’³¶°–£“£<´ ×ܤÿF4›q£p£KAx¹êûhš Di ®{øwPȦP´n°ˆKežéÏRpò†¿‚¹Vt.œàefe3Ï·†)ÒLTËBhHGŠu—®wù.²C& Nˆî…r”5»òL²´Þ˜±LÂZ‰ËÛ—²¯¤u&Ù˜ä¡,Á–ë¨ÞŠ_±©ÿȘÍzYÇ隸ȹÂ}Èÿ˜åûPí3tm)¯µM&IW£‚DÁìDr8·ZAÖ­Hö8ÎÉ™ͱˆ½¿ñ¡Úð8[º 'Ã)ç þÊ}HýÃ:ÂôtH—e*ìR’Þª×3t$Ì÷ uqUfW½"ðúDȵ—N2ÈWo†wÙ{)‹Nô¡´ý žÜQ–q+JZ!V“Ûg»g Œ'a°á‚ì:“ÚZ‡à<©kH²†kÅÉòks=²à[(dýƒuìÍ: ÌÅŸmûØÙ2˜™'AHÞ'–ÄmEù%‰HúÜcô š0uão)cBúÔã/jñëºácI –©Õ‘ª\A‰>“ªXXIºÇ"Ä®‰LUÓ2ŽÐe9 tû0ªòŒä% %SKd~àì£Ë ^:‡ãÌô(â*œƒ9m™¬Fôóø‘|ýd¸@£ÈÒÍn‚:/'s‘¼0HFëlòiršGä`lH½5gަÿ$µîs\m#êÍÚcCÆ­CÒRá œÃ"}¡ê5Û·ÐN_¨àr‚^È›TÛšÖ§#}ëÈß$Lîï0A}*CÞî ðñy§ãc '€'³í{U)ǵ•™\&XÅ{}ÒÜŒ÷ö¡Ÿ`yÅè@çN)ŸË©²l 9²Vfíu¢ÜˆP¨ç©Žâs9–~´D–¨²P?ÜYi²²æL' mÿøT6]rØ@%g¢\2j}ø\ßúU£‚ƒrܰº9óQNïæè;î7¢YÑ”©4ŠiqÓ40ÅP©§®qòìtXYp4¯Sƒ;ã³pK±qëVxŸyÕ­[]|1†½ùÕòñÍ7߸Úá”»øâKpÉС¨^­6}÷  ëc礪)<®¸ætíÑ]ïeß{÷b‡»æÕ½Gô=£þ½ryF‘N:u ¥‡_RJJJ0räUèÔ©#ÊÊʰsç΀r#Ñ©S'§œ¢Žç•œ‡‘#Gâ¸ãŒñÝ%Œ¯XüœsK0⊑8ö8ãy~åÂ\uêÖÅ^Œ‹.Šü|Ké`Å~PÕ^¿÷õéÓg÷ë‡åË—+¿ïÖ­.¾ä |>bš† ßm°3i(TÄO ô¦ÓǪdáÙ3(ÀÏ0:ý…Ë#ˈîeÑ­†|Ûf4;/Ic–H±Ï&º=†Ò÷NOK !\~ñÐi<—µî%õ`Â0²-g€˜Fvf<†aTY¿‡;åÑLPép3’ ,¹ðŽÎθ²Œ|°Eê@– „ÌBZb‘N¬Š[fIä˶‚{¶ï¢ûˆ\È@³úô–4M-q®üÞî4Ž~m´¨•HâÍ$¡N‚亀 uiL fÊÙøýøÉøñǽølÙ2œzê©Ð4 ½zõÂW_}•S@i]Í›7dž PYY‰š5k¢²²pûí·ãÉ'ŸÄüùóÑ¿@a‚Q¯¡0ˆIĬŒ$*’ÀÞJÆþ$A×E¿QÇYõ nL®$Ëé5ȼY󿨰á;TVV¢¨¨Hªßþð³~çØÂiä+bZHwk aÍ ,o¼åv<øècؽ{Z7kàù~ÌïÇâú›nÅÎåXòá"ô>ñ$Äb1ôíÓß~³^ÞyX,Å?òøX\ùËQxÿÝhÑò(4jÜCœ‰ÿ¬^i—­Y³Ön*ÇÖ²-¨ûl¼b–[Qº 'Ÿr*bš†¿èo¿ùÊãkJiƨ¨f-¬ü¦Û¶Êíxò‘û0sÚÏðËnÇ=<†=»w¡[›ð£|UÒ!™ ¶2 ìOI¶Sš]cÇŽÃu£FaÁ‚8ꨣФIœyæ™Ò¦È(7£ÜåÎ8+W­”j4vì8Œ5 ï¼m”kܤ ö?«]ÏóÄX\uÍ(¼÷Ž!›4AÉ9gbõª•á¼´…åŒ3ÏÆó/¾‚½ûöbÅòe8édc|O8¡7Ö­]'цXõ“Û{V®ô¾÷¶ÛoÇc=Ž]»v¡aƒúʾ»åÖ[Q^^ŽE‹ᤓŒùѽ{7¬_¿.à#šÀX’‘M#„DMÀj0)}À>TáaŽtݳN Ö ª˜”NH™; V®9Ƨ1"Ä5¶AQº”ªäkuc5h¤ôψ*dŸ·RpÅÛ”L1’:P‘ +ì ,50âšµž±d[eß`ZJ+nó”¹.W¦Œ+Ÿh‚#-3,•¶Í“Ä–%áÉ zÇ}šœõ& Ê×±‚ʉ7d\ጙsE©0{,˜ /SËdZfUøÊ Õó–]@âX2ì#v)»ŽaòU¶×&„'p²™©H³^²~íxú‰Gq\ûv¸ð мYsìÛ·W_}u•*ÇÝ»w£¼¼]ºtq,o={bíÚµžNÑ­óm¥”ÎÑ[¥4ÒikUýzõêå©_UƤ»ª×¨'OÅí¿¾S^þ«o¹¯OÇeAû£šàÒ‹¡Cë¦Ø·w/®ýÕMþõ ¨Ü±‹qݷ⺑ÃqÙEqú ݰ²t~|¬l5¬o,âÆ Àñ[£‡y{@e@çˆL_|þ9ÆüîQ´o×]xZ4o†}ûö᪫d9ýüóÏñ»ß=ŠöÇ´Å¥_ˆNm›cÿþ}¸dÄUá;^(S·žÑŽ‘ÀÉ]ZÛ÷ÌéS¤rÕ«×Às/Lůn»Ó§ü5mW’RT]={öD“&M”ßã–[oÅðáÃ0pàyèÖ­+–-[†±cÇzÊÝzë­>|8ˆnݺ審Ë> CŸ‡{uÊåË0æ÷c¥Jש¿ºéV\}Åp\ VF'9 +S2:í´HÛÅçÊú£0åËì¬Þ]œMž.œí©¶:¶•»lÓwx~üÓÐuã軲²óçÏÇyçW¥ú°  ü1zõê%- n+ @((ª‰kn»OLšŽûŸ˜€SÎ<׳ ºñœö‹3Ñ¥[wŒyò)Løëdœ7xªU¯%÷C¤úæù®Ýºá–[oÃ+S¦â¾ûÀI'Ÿ‚xܦ ÅÑG·Á¸§ŸE«V­=ïvÙå¸ûÞû"÷ßÁÊJìÞ³gœrþ½zµïä]úñb¼1g¦mu­¬¬Ä§Ÿ|Œ={‡žòâ·†-›7áÙ3ì‰ðÂÄñ8ùÔÓѬEKû ÛºuKzE ã//OÃ¥—_eG†‹oþî»ïðÌÓOÛ.~rúÝwßáé§ŸF*il¨Ä{ æãÌþçyÖ ‹Çñ§§áâË®RöBºF;¶•m ìœÊƒ•øqÏnœÖ øò?«3W´Vš)Aq>ý̳8»_?å3† ŽM›6aæ g<ÆÓO?-[¶Ê æM›0#m9óy3gÚå&ýeJ\ãkÕOnÇŸ<í¨¬¬ÄîÝ»qâ }°jõ*ß÷.^¼³fÊóãã?FïÞ½ÿ+@e®7º¹ ëô A–†QÈÄŠàÑMÙ$gTן²é/%V÷‰ÒÎ(=Ø@«^\ÝVMMÓ‹ÅÕ]ÁN‡xšÎtÁZé¶vY©X&ûfº]FHöÅmû$B57X”y·-ÎHÒ4á蟧 ÓÝ–QQTE^׿ÑΠ#˜1Ý~0HOÄΪŒh¦jî ‰tíÚ«V­òL|Uú¨L¯X,†ÒÒRôèÑP¯^=´lÙ«WË‹rÓfÍñæ‡+ðË›ïÆŽí[ѺݱxnÊ\ÜpÏCNÝœ7h0xäwxãÍwÑò¨VøqÏŒûÓDLýÇܬê׳gO©~b¿„-Zà½÷ÞÇ€’¬]»]ºvżù põ5×Ù¥6løk®%½#ãÑÇ~¢šE‘ë—L&qóõ×bý×_!‘H„žÙMš4ÃÙç À¬¯g¤ÚÓ«VȾjË?] "B‡c;ÚrQ·^}0³×ŸÒÏ2X¿J_ˆsž:“[N ËÑs;wÅ—ÿ^¥Ì Q¯^œ;èBœsÞùÊwØíøa[`]RÉ$î½åZlXÿâÊñàpŠ–Of€«C‡(uù.]jŒGÇŽ¥rË3,÷™YîØã:Ú•j×¾V–ºÊ}"”ËÁÕ¥KW¬voØv$“I\{í5øê«ó@³fÍ0`À¼þúkG>°ÌÞ¨—Á+)•VÕrÛ¨ˆiWÚ{sÅŽ¬mÝ i*e…XÓ€ÊpÇõ!1}$‘fXÅâqOã,Ë56¶_£Ø"ѲTÖ ”¤ô„ä¶«“Ë5D®(´­ƒÒ1»KFX´&:uòäÜAÓŒcÍÎxãÞ„‘§-ž÷ZÇÛãbøÔ:—²åÓ²@j‚¥“í¨{˯ӊ·ê­}Z6 w.F·nÝ0fÌ 7×׊+pá…0Ž™W®\‰‚Üÿà#¨V½:NïÚöìÀ8ø5ýļ5wV”.³ëv|ž8÷¬ÓðÑÂ÷#`é’ñÜ_^D½z °eÛ6;Ï'+ózz—úÒÒÒ´èÇÖÇ IDATõûö›oQ·Nm0눙¾}y2†_6ÿGt¼øÂ$\sÝõxð·£Qy° ï¬Aƒ†xùÅ¿fÕš9È~CÔ¼EKŒ¸ò*tëÞŽëˆGß‹&ŽW«Ç4~d 6Â7ëeß[+`£a£Æ «gŒñšïQTTï¿ûf½> ÿœ=û÷ïó¼`ë–͸àÜÓ±^x6Y\¡Š³¼âbCN{lŒB;™œa ×±:wÃø±)Û³µl3.)9Ö¥ltºF;>þ÷÷(¬Y‹Þ} sgLÃü¹f;D92ÿ«išBÑ’¯¿¥J¹vîÒyÕ ‘bFQQÚµm‡“O>°nÝ:lÙ²ÅìóFøÚå ½sg9 qcg<5jäñ™¶|ü˲ÓßFÂø6lÔë¿úJª³J<'G!>€ŽŠÑ¥k7<þØ©PºvPÀüð»Z¶l‰‘W]=z cÇŽ¸÷Þ{0~üøà ©X“Òb£X,ÛCñlMg¹ia(ä#íló`gþ·o\ô\ä’Ý)ê00{#Ô\ÖÜ(öKw°IØß:–ʘÜ¢³ËJéý¥,TÓ‹ÁFšÝ2¸„lON&¯Ž¿‡"ò ¸9gÝŽn’’±+ó™åSìNYíðpÊÖXÑæjnŸt³‡eGgÝñaeyíµÒZZã`}ÇÌV>H,–‘ ˆjת…©S§böìÙxýõ×=ä¾ýPsØë“O>A»víPTT„ž={bñâÅž2ý”`ñ¢÷±gçN»Þý×,Î8wä›¶³¼-ZhÿöýwÞF,Ã)§&¢rèíUPýÄtOÖñ]^^Ž>º Ö|ù%zôì%ø…/LšˆÚuê`à Ç26ì²X²ø#¬ùò‹ Î Â÷u‚wîŠVG·A~µjhذ!4hI)оk**¤.³‚ZjÔ(° ÎúÇ4\{ÅP\w奸öŠ¡Ø¼i#þðì_ðìÄ—Ü' öµxÑûؼñû´ãR«V-ü}ê«J9¨f­Zxþ•©xsÞlÌ›ýºRÙ€¥¾-›¿WÞ˜1 7]57ÿòRÜxÕPlÙ¼cžþ þ0á%µ® à˜§ÃƒûtàÉqÏ`Æì9˜=g.Ú·o[o» ³çÌÅì9sqŽØfGEE…ô\kóSPPq91ˆò`¥·\õê5Pq@~^¥ây™¬³5kÕÂ+S¦bîœÙ˜ñ×¥ïö#ÊUPP€®]»¢M›6¨V­6l„†æüÈpÊ:ÜÄÙý>J.w¥µ’3¤˜a¸Ž-£?D^oĸg–3™ø>Ÿ*Åiõ®¿‘ÐÏ÷’MÎD5'Ò ‡\ Õ™Á-!µU5¸Nzλ­d±X¤ÅÌÈqÝ!—Ò*š@‡tŽäÂ.tK¢ÕÏm¥3Ϲ+…EG` ÈÕ¶FBxŽÑÁʼn©ê{óœšu݉4¢¸åa"tªû\´FŠ_Ë4Gäô©µ¯Ðä6éB0‰J® ž¸¸[Ó´ÿgïºã£¨ÖösfwÓ+¤$¡÷^TŠÒ¤ˆŠtEQ½ô"Š ¬ H‘ÞéPBG@:!’º;ï÷Ç”¶›M\ïýîü~²»gfN?ÏyÞ¸»¹aÕÚµÈÏÏÇÀ˺˜K—.¡qãÆhÚ´)–/_Žˆˆùw___”)SÇÆˆ‹p‚Ί2hrð@*6ƒì*šuvÄ ¢¡mI¾3€3qö‚"o+¹•cŠdÃ@p!ÀÔfÝz6jýICÊþ®É dȆ*Á$ɬ¢dAdqÌ YSáo^ h½Ñ¢ú„‘Ú§'ì@™×ú¿”ÏÌîÓY8ÍÚ ³A(§Ìbæ8Ì[¼QÑÑèÚµ ²²²ÛbpôèQ4mÚÔ±|ðàòòòP±R”àn„I`΂rå‘‘~WŽºÃäåæª—ÕI…Œ§|2~gå€Aƒa„‰˜=k¢*–GU1ëË/ ŸõóÜ9hýô3ˆŽ®Œ={çy¬^µâ±.¾÷îÝÅß|f-žDTtåboÉI‰+®ú.$L°XV‚E`çŸÂÂË;\_9Fç8K~Æéó]» ;Ûxœrœ ¿þºQQÑx©gW¯ Ë)…PT2vJýI^Œ®ÐûSDQÑ ÷Å~"µˆYëžHüFm¼Ã”±¦5L¢ò^­”×.êæEËö¢ iôßéýaÊB Ré“ô¨QÅÐÊŒ§F?Sf/9û2S¾øOµlN;àÎ;u˜²e˧Q¡Ô€åK/½¸zõªê7žçqæôi<ѪJß væððôÂßçÏ8·ÖŸ¤yu` ©ýýÈ‘#xùå—uå“ú{ï ÇÚ5kðÇ[™™ èÞóúîݽ ñq—ñ|÷žx¾{¬[³ ²³‹µü•$²…V¤R·žàBI+Rtð¤Ï»¶ý‰›Â××Oþý™v‘™y'Osú¬6mÛ®ÅÇêðËb,û üîûЪuktêÐwîÜqXöï¿ÿ­[·FçN˜xÇÁü¤GBnù´PëWâJ´¨·çrsrPXXh˜cëŸ[Ñ´iSøùÙû£cÇŽ¸ÿ>޳÷ÇŸþéb>íóÚ¶ïˆÌû÷q"ÖžoǶ­hÔ¸)|Ï“òÅÆ+ÑZðõ7ßã©V­Ñµ³ÐoF ÚŸ.Ö·d›«ð_ý Tóƒ¡Dö ÿQ—KÒRPIr1Já:"dì!Ã2æ2L+Q$0¦e)œ9)—Ãn•ŠA+ñ©Á¡Z—ÊS´ë!æ §ãÀIêcD2è!ÒÆf7—:öŒcà8¥sT!«ïÒÇ”WGÿSsRv kdTãˆ)ÕŠ¸íÏ`2fMÈqÙ£è9—€¤ì/SÛú;˜50rxg&‹Åyž·û•ýXÌÒ«ß|ú¾6Ó§ŒGê5P­Z ¹ì§NBBB‚êe­ZµÂÞ½ûpùòeT¯^½T€å¼yó°aÃÃß'Mš„?·mÃŒoÁÊùß JõÚ<|,n^ÃæÕK…SŒL’ÁàP‡tt=”ÜÑ£GñË/¿–ˆƒŽ;¢Nº(ÈËEïW^A“¦ÍÎçy?ÍEßþP½FMtïÚ†=h”„K~œŸ¿äw;ƒƒû÷Š °ú ŒÝ;¶!ñNB‘ ¥ö·?6¯Ç½»iøî§…ødò8DTŠÄ¨±±â·ÅÈËÍ•] ÿp,ÜÜÝp`Ï.dfÞG§çºá…Þý°lÉ|deeBru µ‘§‡'¶ì=Š-Öà‹+À¥Ðã&ŒÇ[C‡bâ„ñ¨^£ªÕ¨!—I9N'L˜€¡C‡b„ñ¨^½:êÖ®w0sÀ…s§”˜ x6k¡>|—¢¬ŽÁ׺µr2{¤ò9rÄð÷ofÏFtt4ŽÇžc {vïBǶmpðÈqÃüK]Œ)Ó¦#!á¶ÊÐèÑì 9àõ!Cñé³`µZsè¾ül:–9UgE¯Ey¹¹xá¹vXðÛ*>uùyyX¿f¦ŒûH5€ïÞMÃÀ׆`ćã"ìß³“GĆ5Æ¢/ooT«Q Wã/þÞ©“§}¢§ÚÇ©”ïƒ|¼5ëVªÇ³§·7ªV¯…kµ..éwÓÐgÐ 9D„Cûvâ“ñ#±eíŠbñ-†¶²NÀ¥«‘¬rssѾ][¬\µ/^B^^V¬X>úH—¯]»vXµj.^¼¨Ég³¯-V­Z³ ùÖ®^‰cÕÏËËÍÅóÚaÉï«pâ¬=ßø1•Ýtè(¬C“§~¢ËñêÀX²ôW]ùÔõý°DsäÁƒ:ômÌš5V«ÀôéŸ`áÂ…øÿp=òpð®Xeÿ“™àÇV8M¢ЙCgi^̰NI<`Ì“*åPª$‹YõÃí»·–¥”~2ò&"‰­9p†žaôk.6ƒÂšžÄ©ðSY„K±‹d`ƘÝ\º¤3àч/%E»8Ú#H¥‡¹t8³ÇgJzR ʵÆÙ`ž5“#„ELÏ%¤ç1ò(RY422)))ÈÉÉ)†x¢dÇo ¡Œ'Y> ²î#??O®Y!䈡« „~´‡(càIm%„uTœdt'’§µD‹“1Œ¤ß•)ƒ‚‚<äçå‚s²h»¹¹áÊ|3ûk|õù§†Ë<3ÈN—hVôéÛÇ×BŽè½¨P“Ž|a•)„¬¬LŠÎ¥í "“Ëäáé 7³Ed)5u$µWxùܽ›ŠÜÜ<äÛ€|«î‹'ͳå ë|i4sw3ƒ·p3Ù£hë[®|ÒÓRÅqe\gwO˜-¥TÖBƒÉ ÅA.,¾Àjòl@n!äùHjg†WÙ  dff¢ ¿PSÍÇ )ŸÜoúÒqBC‚“ÞV Š„¡:5(+ŽõóŒÁÀØÀ°mHŽmã <‰aý\ªGÉ€’¯/ˆH­·k´Ž²PHGr…É+Ik¥ä•‰¹ÂZ2Ò08%•½¤9Z k6O.„t7kc0q '1pLãÌ$UÄ=+[†“ÔËÙN…J1d¨#¼Ðf KÄ ™f‰§âDÉŽ…c°˜ô!ŠUÀRNÌéH%RWLè.+ÏPÈ3Ø`XJ¥A³»BäyÏIEßi±ŠÚ¨DÍzó$²°3ªL=KjnO[ª}I `Rg Ä”»˜28cvóŽcb$c|E¤ž7’ø\ÿ‹~1ɽÞÍqœÂÍØ?'·½ÒϧRì-Å(gа•ÄÌÚM©Ë Šì…»qãú#”ÚN&i)Éà8Ò4$ê™dC@‰É–¶>°VÄLe€Ë¾‹:ñ§§§«gG Ä ×^ÇqX´`^)÷]»²³²Jýð}ïnšqi›o^n.ò‘ëp§SéNÂ-ý¡Í‰¯Q—Ä4äœ+^œ˜pKÿ½æÁyy¹@^nñô«4-ž8Ò.о+--Í¥QcÏWôóÌ6'¼{7­ˆŠ½‘¸*ÆÁ™tÛvP¹re ÿ`&Žƒ´´48 FŠç8>¥Ð3X¤=3»,ÞÐû5“¬á\G.é‚SÉ7 %3Í0ÁI9÷MGòI†F_ŽÓU"—"ªÅ1m[ÍVªžËô pñ[Ï‘[.ÊL§,®V˜íÔÕ‰i,z™Bß’AwÎ'¨×YUÜp5˪¯ƒÔˆL í¾5e†PÛ$ï;¼Þ‰¸ÎŸ½ô<^"µõ¸€3ììª}Ï´ÉE$£ fâ‰f¥yŽ1a3cÅ­<ÆÕ“çÉ.ž6ذ%v‡©Â#)hi‚"Là#ÚÔ/Q]xçÝ÷’œŒ÷ÞŠÕ+—?>ªò±ó¥·2Ê<ôð]ST³: Ð ŠØÄŠg·PL€ÌÔÄï¿‘w¡Ç³ õWþïúßUÂõ“Diḃš”pù¥ÿ©ÞÖá¾ævž˜ÈJ2ØlÂ3’Bìªu^n_ûÕ,™ýPC:òËÙÚ˜…TÇÌ|8J,!3dAL³‘&Ü£ô™³ï`²OL;ÕûÆ$5˜ŒJ‰¬¦*ކ­%•ZŠÞsL,!‹Ý™£“*cºÀ2 J ªng"^- —ˇ™Žô¹J ³ñ¤÷Ê@ëLDìäD\G*] —÷)WA‚¥4B(—ÿ¾„ÖO6wyá{dësÍ ´(èýÈ´'k¦ñö0‹œSÅb¿Á™ã“¾3¿´ªÓåc•Å ’|c*–á×£Äô¢d_A ¤3çNÝJ'Zú?}jDHSB+1äX9Ød™"Àx’ keq±Ú­½jÖÛ-À«'5Àrò›É)÷ɈF­8ÊtãTÃô3åÑœiØ~R¨@¶—~çE§èœh¼…ñ 逴bŸ”ÚV³§à•!I ÕÒ-¦ÐO&'†&ºvf œv"Ë¡B;ýшÏI4À•¹l`Æ G}ò(Ž–›k8Íî8”§<>Öç1—‰£xF¼˜J¦´Ê¡uCF.t–£|I}̱"Àº „I~ÎàŠk凛“¥;Úµ—KÃÿ`Ò•ÆýßUz‹S G=╎É;™áé?¯» /äX9ðd##8…õ3‰q­y •]"Ij£Uì¨>"à’œ—K‡)¥To" UƒTEHIJˆlí-«×3U ¥í[ˆÆºÛÀ™ºäzIÎQ±ƒJL¤FìÎ4‹+)Ý815ûiOœÂ¡¼æ^…_Q^ÑVÊ÷™•“"׬åÉÀJŸ¹dš5^aÉEJ€§>}*uÄ$¿RRüØ*U«Êq¼ÓÓÓ‘œ”\ ó‘TeuºÔ”€­t¦áã²ØÇIö aµY‘”x§DŒsÕ7¨¤ í")ÁJ°ÚUû—c@Nf:²ÒSJ]¿èòæCÎÍ´x—AcfÆ\+ƒ«m˪W¯ŽÄÄDÜ¿Ÿab?Œ9a Jk£70«ÿ7=¥ùêŠ+Âjµ:uôÿ¨/ŽãÄPyJÕ¢Ú „ImùQ"”à †«ci¬v«T«†ä¤DdÞ¿ïT2bD<ü8Ð+ÐÿS¥çÞÞ>(W¾®]‰ƒÍfséž|2ÃÆ‚f;ÄH: ã"Ñ.Ü A€ÂË—G||—E*^™ßÝútGÝú ‘~ïîÝ…Ø'—C6Àf#C3GîðáD‰ý»pþ<Œ~ÿmxšõî3ŒÚ¯(ëpåf¦Ô‡÷ôô‹ý_Óñ| À©ãGpöt¬K …¤ö‘g“ÀóJkDõÎjh,Dj?dF€ïÌÌL <‹-Ôu“‰c0‹.H8ƒ:+5Ÿ\9|©ý¼¼0`~~ðĉÁñã±(ŽK©5äÚ\+îµÿÀA$ܾ>}^)yYÒÝÐwß}””d|2ípŒÎ"¤:®¹bÅ8áÁ½Â†j#ý²Ù=Ñè<‹÷Jî†Ìëa_—´:aÞ>>¸š‰ao¾†ß—.ÖÌ'fpn/ Xjœš+”°-7 ü®]ÃîÛÏc*fÞd8ø->¸ñ—/þþÜó=q÷nŽ> ZG¬vewC °˜ìëÚ _‹zU‘’œ$ŠF™ƒ¹/¸ûäËï‘”’ŠéŸL}Qrv0(ÖVÇ›)÷±C»uë†Õ«W#"¢"’’uë—r]#ØÇ­+Æ>F$˜Rò(éÝo8Þÿ}„††Âb±àû~Àï¿/3{R ï=]¾Q#G©ŸÖxŠã˜Ì’ªÜM‰Y8ÑÓ ÏóªÀ/’¡c ³gÏFrr2¦OŸ!³¦êyÅiŒ¡pÅ$Ôw玸{7 ¯¼ÒGínˆ´ƒ]LnßÇ…ÿeÆò™çz¢ß÷qùây” FX¹pdddàí·ßÆòå‚‘Ihh(Þÿ}ù…QQQÈÌÌÄÝ»w‘O”ÀÒÕkäÈ‘˜6mNž<‰`þüùøâ‹/ðÉ'v'É!!¡Ø´i#ê×o€s'!°lY ?3ÇÀòß«,êŒãhÀ-Ÿzð×…K½AøùùáÛï¾Crr²žQѹßͶÉÀÒ×Ï_Íþ)ÉÉÈ~ ö%ùÝl^,Kë  ÅÛïŽ?WŠŒBVf&îÝúíÜ™S"°,ÿÀœ³U®‘Jö> Á¢•Q§nœ:q eÊbì”÷áÌùñ‡"Ù1£ëÉ'…þ½xñ’ê à‡•‡ÖS||ý0eæwHKMÖù ý…çqîtl±^åèlæÜ:œ‚ȇRQ¡’Ò„Å»Ç×Wœ)ɺðV› Ç—þüøÿ~­Zµ¡¡¡%šÁ%fç\¼:?×ÍZ<‰ ãÇ»þžâ†.dÌÅò?Ìô!|úÕ·X½|© ,‹{½=büüð½`9fÒ4¬^þ› X–Rñ‹Õ* ‚nåÊU«Åq%ŠoEp$»©Þ.ÈQ¿!t•¥t–GŽž#ƒQ&K?Mœ ãÆÃü ðÉ'Ÿ€·ñ0[ÌjpE“Ù„qãÆcÁ‚ù˜>}l6,‹ÝzZcr,9}?Š.H-('‰V×’ÈYiõ.•ÕêU …Ö•‰òòÜsÏ¢E‹'0iÒ$C¿—ŽûWá×’‘ê{¦Œr% I+ 233ЭMCÜË‚*DcÑ⥘?>¶mÛ†ôôtœ?UªT‘ógddà§Ÿ~˜1cJ<0G…¡C‡¢víÚ¸~ýº|*UÂŽ;pçÎ,X°0qâDÔ®]];´ÆµóÇàiÞ3cf|‹Ã{·áÆÕxyá×oŽ¥?Ë”. >úèCüþÛR˜Ä³îd*^cG„åË–Í|„tÔ:i-j½¾ø×y4ª]Uþ|#) çÿ„©Ç> à²Öþ÷£'¢FÍ:èÙ¹ N8 ð¯ SñéWßbûöíøëï¸R_KÊ@¹bø5câGX¯‰îcT¶Å IDATr¡!K¦ãH¥j]õ¸õ¾Æ‰óC:à ¬Õ§¢ã¿Û¥ÛþýûÕ,ä#ëu*öãÙçºþ#Bò°‡4³Z­(ÈÏH‡^ׯ^A¥¨(‡¿‡…—ÇÍ×JÔ?Ä¡›D§çû÷Pu*òŒªHÊÏŠ¸ÕÅ|1s0ŸŒ€¨QÝá„-žh²eËbÙ²eÈÍÉ@ÈËÓCŠ-Z lÙ2ømÙïrÀ˜ü‚µØY p!©ä1Á@G‡WÈŽ%ãU“ÉžçíÌ»‚™=°ÿ”šÒ Ï=×E¥ÃÉ4~.evRŒý-;¶#h ÙJY­E#~21!®]¹‚üK–üŠzõêaß¾}¥>Y½¼¼0zôh´k×ׯ_G`` êׯ³gÏböìÙ3f -Z 4kV¯BìñcôݼÙ3ÐoÈôyý=|6~„Ü–eË¡UÛNhÙº Ü=ÜqæD,bÆàÔ‰ã22`Œì!à TàaÃÞEƒ pïÞ=lذüñG1;+ñœ6›ÍX¸d¶oûK/ДLÓ©ìaù"á²Ùl¨× ^é;eƒ‚°eãzìÜö‡.ö³ÅbÁ ×ßB“æOÀfµâÀ¾ÝXùÛÝ‚P”¾¨‡§^ê7›×¯@¥xÓ7_ÎÀëïŒÀ[+#ìŒkPP:vê„6mž†»»;bOÄ"&&ÇwÚšv·jéëçAo¼‹Zõê##ývü±ûvü¡*$Ó6u ¼ßh³:¿/þŒãÐóå~¨V£6®Æ_Æü9³‘–œ,¨T0ÀÍÍ‚×_ŠæÍ[ ÐjÅž=»±dñbÝâh±XðÖСhÑâ X­VìÙ³‹/Ò•3<<#FŒ@•*UpîÜ9üðÆåõ÷÷ǻヒ†  =ý¶nÞˆÛìã¾zšhß±3ŽÄÄÐw†cë›±õ͘8y*ÒÓÓ1ç‡o‘•™Y±¯CÌAùê׿寯óræÌÏñË/óÀqúõëÚµkãòå˘={’“½êá#F ;;óçÏ—ïóôôÄçŸ%Kãøñã¨Y£&:wîŒC‡á½áñyó&lÙ¼S§Nýô{øîÛo‘YÌú@AAžxâ ôï?eÊ”Áî=»ñ˼yû÷ ±wïÙÅãÀßß]»vE×®]‘——'‡Ý½qã¾üò 9ß”)£lÙ²€“'O`ÑÂEºµåÝ÷†ã¯¿Î#==ý DPÙ lذÛ·nUÅ–ÖÝ;¡µ8/Ož8£Gbp"öXÑ«’fs}ö¹®hظ1º÷x©i©øö»ï!+FŒ®ù'Ô÷½÷„q‘~›7nÀÎí[¡òV®<Þ~w8¢+WÁ_çÎá—¹?èÆÇq¨[·>žjý4š4k¸Ë—°oÏ.ÄÕZˆŒ®Œ·ß}?~û5n^W¹Þ}¢|DEÌšù‰nöggg!;; †þ)”ñ– u×ëWãQ¹juCío/oøùù«Êc¶X0èõ¡hÔ´ ¬VìÜi<^Фh¸„„†aø‡cpäÐAlZo—Tþküø'†“'O`ñ’%²‹R„ $"<ùäèѽªT©Œ¤¤$œ?+W®¥ Æ;GXXFC‡aÍš5,šóËß߯ Cýúõåý|ëŸ[íÀŒ€î={ ^½ºhÚ¤©@€…ìì,Ÿ|ò RR’0ôìÙuëÖE9ßHdggƒ@øtƧHII‘ •”L¨|ö—£ò_}ù,˜ /‚cÀ×_}“§NbÙoË ˆÜÜ\¬Z%H'Ož‚²eËNœ<‰Å‹©Á]ºtA“&ѳg¤¦¦â›ofËíúÁ(œÒ û~Æ 0`ÀaÆøcëVäæä¨,Ée+bðnÜþ0NŒÃ‚ƒCñññ䨻wo\¼xçÎÃøñãqöìYÌœ9iiiˆ‹‹C•*U…¨¨(øøø`Çöí¢U¸€ òsq66µ4QÅVž¿t%FŒü))ɸŸ‘Þý¢ÏÀ×äõ‹éLƒƒŸˆ púôŒ3)))¨Y³&¶lÙ‚iÓ¦98í°â±=ä|É *Œ/¼ˆn=z:€½¥Õ¨UÿÜŠ•"‘•…Y?üŒek6© ìæîM;à£q“‘y?nîîøò›¹ølÖ÷ºbQõ®ooìÛµCubËÏËCìÑ4jÜDuËŠ•«ðá‡!990` ^}õ5ê°r°õÀi ý`4 JµšX°b3>7Õ°¬ªE¹ÞÚÓ(ôô&z¼Ô«ÿاÛ?‹œœhÓ®deËÏp÷pǶÝ0aâ$¤gdÀÝÝsæÌÅwß«Á ‡‡ö8ˆI“&㾜o¾ÿþ“€ãÇcذaHLLÄóÏ?]»véò+ˆã~ôhaÜרQ«×oÆøÉSåzDT¬„ÇŒÃÔŸÃÍÝ?/X‚ù‹–"88¯¿9cÆM,ùÀ/âªP^]¾š5kbóæ-˜:uš.ï7ßDß¾ý°oÿt~öYûÌáïŒ1§é‹/¾ 3fPùòå)''‡¢££©víÚDDHwîÜ¡öíÛSÇŽ‰ˆ¨}ûväëΨ’?¨N0£z!Œ6¯^J‰·oRÝF5‚ulQ‡ˆˆÚ¶lN¾n ?7P€;¨¬¨¬'£@¯#3#‹ dæ@_ºD?ÿ4—LÈÄÔiÉâÅ”œœLr½Þxã ²ÙlÔ°aCù»°°0"">|8EVŒ èȪAU##ÈÏ˼,Œ¼,Œ¢"ÊѨ÷‡SUñ÷jQB ðv#7¦KÛ?MÕ£#È×ÉÉÏ‘Ÿ;ÄÿÅäÁÈß hÒýû4ëËÏ(Г)(ГÑÁý{‰ˆèùNOSY/Fe½ <€¬V+U‹¦ /P£©ÆP~~>Õ¨LÁÞŒ‚½½óÆzM•‚½)ćQ¨"…%_!õî&ôïËÏ·§p?¦J«—/¥Û·n’‡™‘‰cT·Ž0>Z4oF&âÄÄ&F—.]¢y?Ï¥OFå}U `È(2€ÑšßSZJ2Õ‹ ¤¨@FQŒÆ B6›º¶iDÑŒ¢U.£NÑF)QóêBÿN=œž¨¡JUBÜ(2@xod £ÌûÄóŸñ1¥¥¦P¹w òbäÅ蕞]ˆˆè‰5(È‹Q°7Ä$¬Ο¥‰£??‡x3 ñÿW|ÖL(’ðÝ€—ºQaa!…û›©ç³ÏЭ×éNÂm õaôÂsméÁƒl9ï´‰c¨ ?ŸjV ¡@Oan½*oÃqÀ1F&²p O‹°·y exõ•žDDT+2„T-OWâ/Ó– k©| …¨ê ôâÈdâèСC´bÅ 2™ÌÄq&â8™Í²XܨQ£&d³Ùèû~ //o2™Íd6H½zõ""¢råÊQ¥J•(..ŽÖ¯_OÞÞÞd±Xtù-‹ê{“ɤJK–,¡ääd ~7›éÍ7ß$›ÍF›4&Îd"ÎÄg2‘Él¢nݺQåÊ•‰ãLd2™Édßg±I|g=ˆˆ¨jÕjd±¸“ÅÍÜÜÜ…¿-nBÒ~¿3›-d6[hÁ‚´páB²¸¹Ñ»ï¾K«W¯¦‚‚*S&€¼½½(//ž|ê)2Ë÷ u=tè­\¹R¬³ð,³EH‹PŽ¿þú‹~þùgá{³X7w2[ÜÈÍÍöíÛ'শíÄr¹Ñ AƒÈjµRhh˜Ø?BßIÏ—Ú™3™ä61™LÂwÊYX'ndãï„t¬Û° [·nE§N\Ò1T&W¯Š+âÎ;xî¹çpþüy\»v ~~~„˜½.\€¼½½¹9¹ò‰NbŒòrsàíã+Ÿp®]ùwÓRñÙW³ñtÛ½¥ˆkl_—®]±oß>ddØÝ°lذŒ1ôèÑC—ÿ›o¾Áµ7qåÚMÄ]»‰Ë×n¢f­Úº|_Îú—Åßÿ¾*¤šµj–êà}HH¸ýØô‰22ÒsÈ®¾oÏN˜L&´lóŒÜ~Ï>ß'ŽApH(jÔªƒµê áÖMxy{£s—î®±¶â ÖKîßÝñ$77>¾¾rß]¾|©©©˜=û´kß¾èñ¦‰l -GÛN]qôð>d*ÜììØ*ôoÇçº;9sc9ù³opøüMUªV£¶Ž;y<çOŸp¨‚öìó={ìBCBP·NÔ©S·nÞ€··7ºu·—¯{÷8räBCCQGÌwóæMx{{£»˜ˆÐ¡Cœ;wwîÜ‘„+VèÊßÕ`ÜoÙ$´K—nêv¹z%<Ïãúµ«ˆ»ü· v½~Õª×(ñürÖ·øûêM\¾*Ì‘øk7Q«Vm¹]º:™—Ý»÷Вȉ‰Aì‰pt .Î/Ô÷êÕ«øûï¿A®_¿Žê5j8|¾³÷;v wîÈßmß¾AAAhب‘ü¶kô/Ô¯_yyy*‘|rr2üýý]bô%mI2D\±8p¼øýÎÂzÐæégdÖãrÜe¤¥¦â˯…u—ÀÉù…ÄÄù"€çíyH•˜=ä@ãNéòÄÙ´Q§Ï÷ßEx¦}\8‰‰‰òû¥ÈgR¨Wé]V+žKîȨhÄ]þš4Üåˆå[¼`üñÜó=Á‹÷¿ÜwŽ9ŒË—/ÁîWÐÞ°ÙYYÈVÄ¢—}&Bmá¯l%{yíj<Ìf3BBÃЦm{¬_³Ç¡zÍÚ¯[7®ÛU žïŽÇ ($5kÕF­:upó–~¼©¯u<½¼±öϽ8s2CöFAA¡‚•éˆs8Φð¹ç:ƒã8Ìÿåäççb å3¼¼¼°sçNÄÆÆ¢OŸ>((È7”:ó3ÆÐ¥Kìß¿ééér=7mÚ$ìçÝ{ˆ.êv7@¤ØP$ŸŽJ,•L)<#ƒÝ"S~'ZwŸ8quêÔxâÉ'°ÿ>\¿~5Aõê5ÀqΜ9¥u;)­Ê Ä“È ’^ëÄ ¬pzz::(çÛ½{7L&ž~úi•º½Ÿ•1ÃÕíoVvÞƒ¬L|ðFo¸ûaöO‹'ÓÒêwAWÊ…|~~~ÈÉÉAµjÕd?nUªTA^^l6‚‚‚pñâE”)#è”)[V³øþe’|Gn0ka!ºµo… Ÿ|Žõ[þÄë×ðÃ7³°dþÏ?Ês¾¾¾(S¦ މQu@jj*âããQ¹reÝsƇ-›7ÃÄD•×®èU &M‡­[6«Ô‹®^‰làÑYï?#ûÅbDÒàîæ.ßY)2 AÁ!ØsZ§ŸÙ Qc¬[ý»ËeIIN–)«û- ° ’îÜ‘ \XXˆÖ­ZâóÏ¿ÀÖ?·áÚµk˜5ëkÌ;W.³ãNV›=yûø" ° N;¢Êv/-7®Æ£bTå·ïSÇa×¶Íåûx]ÃÚ»Sß)ŠÁV±’ÐÎÇOêÛ¹Iã&Xþ»ÐÎQQQ ÁÉSú|7Á²e¿ƒ1†6mÚàСCªù™””¤šÊq¯<Š¥¥¥áê•xDEWV){KƒäMz¯Ùlv:•Þfµº“'ŒÅÖ?¶Ø#sp9> ãò5/wîÜY*óF_ß;.Ö×ñ•ššªú|öìYX­V´iÓ±±±E÷o“&ø]Û·oÇÌ™31eÊÌ›7Mš4ÁÓO?6mÚ¸¦L/ºÔ“ÚþÈ‘Xmö¹•››'ê|ºóó ѦMKÌœù6ÿñ'®_»†Ù³¿ÆÏ?Í\8üù‡ÖØ[*÷HiÄÄÄ(66 %%W®Ä#*ª2¤b·lÕ1‡Ù ÀÃDA¿–Ý‘¨Ó>꣱hýôÓhÚ´9’““`qsú›¬âónÞJÀ›7bàà!Xµr|ýüйK7ükäpXyf¸Öffeá~f ù¢ôïIïî @üÕ«àyAaåѦmG|ñé4”ˆDëváîî‰ׯÉå“Ö=1§ ÆKcü¾|Y‘ã€Ä¶aøçy,øm5¢¢«`ÆÇPPXhàðŒ`ãÕ`Tsrô"Btt4qöì9ÃV … žç±jÕ*T©R“'OFaa!´1¸êð+¼aØ×#*¥”ÔTÄ_‰Gtt´@BçÊN•-0Ó/¥ñ‘  àS¾GªGlì |þùLp‡'Ÿxs~ü±±ÇѼysܾ€sçΡ ?_ñB¦VOfŠ••1HþC Ûˆé#9rDý'O\çÜ=ÜíVi…ìß‹†HŒ1˜•î ­…8¼w2ó†Í[bÚ´iX¹r¥¬àîx–L×ïÖ­[¨P¡>Œ^½zÁl6£M›60™L Epp0âããQ¾¼ ?R­ZUìÞÆ`ã VñxY!²2nÁʬ¼Ü>>î2ú¼Ø‘•«àƒQÿÂŒ/¾FtåhLý¡êüåÔ7$cxðàòòò¥S¢/_¾¼ìfIyݾ} ?'X…sŽ­„Û·qá¯óFzëÅŒÚSnAÔ«·ÖHLjuÌÈHDZ#‡ñZß^Æ c1˜ë¤; €è*Õt¿EFUÆíÛ·T/¿|ù2zö莪U«âÃþ…¯¿ž…èèÊøðÃQK-,”Lá6‡!7çòóóQ)Rm0e± 4¼<2vÞUmX¬±ïÜÂå‹ç‹Ô±-õÈ´Ï’öÔûé8zä0^ìõ ø%NOOGÌáÃèÕëCÓ)i½víÊ—/¯š³!!!ª;ŒÇ=ÁbvCxxyì¸{Wc© VÒcŽýÞ„„\øë¼¼xÛˆ E‚+Ö¼ï·:ö@æ %ÝJ5I¡Ñ7Sǘ-Ñåëë«Ó#3›Íˆ‹‹SõïáÇÑë…œ>믿þÂÀñÛo¿¡oß¾8pà^yå|±¸¨7E{öÜœ\( ò¥¿yˆ¾%Å^º‡îÝ»£Z5a^~ùÕ,DEWÆGŽr¡˜Â%¦ÝŸ£Ì Ü!ƒ¨¨({ÿ0‚ÉlAxxy¤Ý½‹B^×®]CXxyè+#Ú¾…ïú÷„Ñã& ÷K½pèàdfÞÇÛ+Yß|‡Áf¯0æÎù[þ܈J•ѲUkð<ËWÌSáž±±¸~ó6 ­Je°R­¸ºÍ ¬yHH¸ÊÕj¡fíºØ³w/|ÊàÅ—_Áõ«WqíÚ5ØìãåHÌaô}ù8`åí†"Eí<V±£yÆ`åW7ë֬ƾ=»ñÝÜ…¸Ó'OèÊ*´9é$šÊddd ((þþþÈ̼ïÀšÄtrX½z5öìÙƒ_~ùñññ8yò¤†‚SãÒŒc¦ÚÏ#UÈÐb1£|xyüyïOÝò@šÙÁt'ÍÁ‡'UtˆF.<ñà§2– :‡ó‡ÙlFƒ †3gÎâÈÑchÓº5|||pâÄ Ì4,¡ìÔHvôÎqLC¨1É¢ö¢“——'G>bŒ©XM‰iÞÁˇ}Æì>o¤ÏŒœ@·+±…ðÇÔ)@DøòË/õV ç£Î®k×®¡N:Ø·oqãÆ T©R3fÌÀ_ý…mÛ¶çyܺu §NÂ+¯ôO‚³×|+V±*jÔi€kV"ß*8Ñ.´ÙÅ*Wâã0üí!øñ›¯ñbハŽd.EŠãyÂéÓ§u§ý¦M›ÂËË §OŸv¾Qþ‡;{ê$Ú¶ïO¯‡ M…vº“p çÏœB—^Q-@Q•«¢N½X¿f%Œ‚+ÄÅÅáÍ7‡`Ö×_£oß¾.BhIT#8½pî4š?¥îßz ›ÂÓÓ Οѹ[p=´[q¡—gOŸD»öàåå¼O<‰ŽŠÎ·}ûv4kÖLÕÎÏ<󌎕S{a£oÔ¤)<½¼pîì sØFê’´A%þ„ "Užà%ßm<‘:Ÿ®|êyyæÌi×ÏSbºtéj×V«¬¸Êò9z¦«²ð:uêÀl2Ëß5oÖ………س{üÝÉ“'ÑÉ…þ€ñãÇcÊ”)¨X±"úõ뇵k×{$jÉBGªJãi«úûr† ‚¯¿þ}úôÕˆÄEñ·6Á&& Ùˆ••%«ÊhÜô©Æ²l›ãàÔéÓ°ñ@Ú¶};š6m&,L¶nÓVÊ VƒÕ {w8Ö®YƒM›6ã^ú}Xm@ž½D¶O¸×Ê îtvìܸ˗ѥ{OtíÑ«W¯Bzf6 lP'^øü„ Øð껡ÀFÈ·‘œ?ß I¿]½rÏvy'NÄânz¶üñ'Z<ñ"*E"þêua´ ã¥]‡N°¸{Éõ- TÊPHD lÂó$à½pÑ"Œ3Û·oÃòÕQ6´< lLLBm¼Öy=Ó‘PgÏž…ÅbAÇNí>¨s(õüõ×_1nÜ8lß¾ëÖ­Cxx¸=Q½TÑøìÌç™3gtóºI“&ºqúŒêÜ%$p„=´"TŒ¨"ò€ 8ò6^mÉÙcË"mŽ¡ ?çÎË/½ˆØØÈÏ/À‘#GP¿~}T«V ÇccUúWJfÐÈt!Œã•• oooÙ‡¨Ì¤jh6P¸{bª˜áŠø‡‡T.Ï ä[™Õ ß&D§IKMÃÇŒþýû—hu|®X±]»vE`` Ú´iƒöíÛ£]»v˜:u*Ú´iƒ!C†ØE‹_|&Mšà§_ Næxâ™g1÷· ¸qí*~_¶  €ÜBBóVÏà½Çà‰V­ˆÆÍš£}§g±yÃ:¨É7w7Ãl6ÃËÛeʔщ³&Mšˆºuëâ—ùóQ¯^=ôéÓsçÎE\\–.]ZL!sñ/OOO=qc'LþG˙ӧ€ã8,[³ ½^îƒj5j¢Wï~øäóYð÷p`ôK[ë‡Ù_ ~Ã&˜5g4jжžÅÂåëqãúU¬^aÛ<Ó¶-ÆŒ‹V­[#00Í›7GçgŸÅºuëtÏvs³÷¯··7ý+å«é“P½V]ÌüöÔ¨]Ï÷êƒé_ÏÁõ+qX·òWWÈ_~7 IDATI'‚Þ*'(Î%_Ší¼nÃfôéÛµjÕBß~ý0kÖlÈ·L™2ÇaÓ¦Íè+æëׯfÍš¥Ê·mÛ6”)S‹/Fíڵѯ_?¼óÎ;º¹*û_æ£N½zx©w|óý\‰ÃòeKaSF 0È (OòÉ\VE²9JdgÀx0ð<`“tó4º^ÊòIórÎgóÒùµvÍÔ¨Qï½÷"##ñÎ;ïàõ7Þx,s)$$ËW¬@‹-ð /`ê´iˆ‰‰A–BoÊd±7kúw¶z˜L&p‡-Zàý÷ßǰaÃЪU+9t­–á ‚»»;<==Q¶lYX,fC©UARHš—cÆ¢U«ÖD³fÍñ¬8/µ÷bl2N6l@çÎѬYsxûø ’Ä6‰×ĉÂ8˜/®Ï¯¼ÒsÄõù×_—ÊcóÏ?…q¿pÑbÔ¬U ¯ôí‹¡o¿-\¤±Çp8&Í[´@í:õ]¹*ÆŽŸ€¦Íš‰¬9Ç*ÉãuÎÜ9èýÊ+h×®=,X þfÉ‚ÿU7/œ:s&M†•ÔóÁ81U*Óå¸x´kß;v쀕'ÜILÂßÿ§Z¶Â•«WEÉa²8^ÖnØŒ—^é‹5× #âMb¢m¼Á®Ð&Ô@z¾Õ†ú#99«Ö¬‡ÅÝ…<¡Ð&”Ûd¶ 88X?®T{ÿJ\ºt _õ¦M›Šºuëâ™gžÁÈ‘#dˆ'l6ˆ””¬]»žžžvFÔ˜³Ð]“'OF:u0oÞ<Ô­[W\7æ >>Ë–-Sût4<ëw­>¨^Wžô–ñZ9øý‰'ðòK/áðáà "œ;{¡¡¡hÒ´ bcÛÙF"X,övöòôDPÙ²°X,²Õ¹òÚ´i#:vìˆfÍšÁ×Ç‘Q‘`’®³ïÎ’˜^{¿Ó‘¡àC>ðDø1ªèÇè§o¿¤{wÓ¨¼£ O§äf1Ó… èüùód±XŠm,ÃçÎK§N¢ÈÈHù;Žã¨Zµjª|` W_}•ˆˆ¨  €öìÚAU#ÂÈßQ€;ÈßQ·ÎíéøÑ#ôàÁ""ºs'V,[JÕ#ÃÅ< 7F3?NŽ®Þ/¿$[…s Ô«× tûöm""²Z­´}ûvŠˆˆPÕS² ÐqŒ‘Å$XKzŠÖZ«ðÁƒiéãÆ¨Rx0Ùl6Ú°nlM«¶ W[†û»`~ÿ~ÍVY…Cþûàþ½´qÝj*ã%XD–õb].ˆˆ† [@yÚ·lJ'c‘Íf#"¢Ä; ôǦõêK!Þ Poi^NLᾌF¼õ*%Ýú·° €öïÞAu£Ã¨¬#o #3Ǩ}ûvt䈽è·¥K©|ùp•…ãôéŽû÷íA/Sd€`Èhè€^”xÇÞ¿öl§'ëDÈ᪤°WYˆª­ÂG¾5@¶2t2ïgЗŸLT[„‹VáþŒ*øƒÂ|=óT:~ÜÞÎ ´aýzò÷óUY7kÚ„ŽSç[¿~=ùúúªÆê{ï½GYYYDD”””D:u¢«W¯Òk¯½ªjCí¸ß¹c;UŠ O‹`%Þ­Kg²Z­²ñ™3§iÔÈ÷ÉÍ,X &'%‘›I˜ ö$X IøÎÌ ÖÈfT!\˜Gƒô¼4HIiýãòmß¾*VŒP[»ŠëÔÄ „û$‹ÙL3gΤëׯËm×®m[ºyó& èߟ«p«Õ*ßsúôiúàý÷‰4 JJJ2öLà佤ÇÓüùó©  €ˆˆÎœ9C5jT×=£iãþõóõ•­Âƒ‚‚hݺu”MñññtëÖ-âyžîÝ»G*Tß;räçÇ›o‘ß+YË+ÇO€h-ß¿ù»víôóréÒ¥^\—„ŒPxx8­[·N~nzzº.ÿ /¯ÏL¹9÷¯¾úª¼WÕ¨Qƒ¶oßN………dµZiÛ¶mÔ¸qc""2›ÍºwÒƒèòåËb™™ü>e  "›ÍFkÖ¬Q•Ëõ$<û_ÿMDDO>ù”üÝÇLDD 6PÝãp¼øùêǦfniÇ^OÑê¹\¹09O… å)!!V®\ILj1çãê­¡CE«dÁª¸bÅŠ´víZÊËË#"¢ÜÜ\Š¥ *ÈÏ’UxDD„lu\©R%JHH U«VZ†%¥eø‹/¾¨/;vì ÈÈH•U³d1.Y…GGGÇqB’ŸÅÉy%«ð*UªÚëhTѺÚMi5îf·2äM""êÑ£‡l½oÿ~ÊÉÉ!w2[„g5Êq;¿5T°ßáææN+V¢ 6¨æ‘»»¹‰iß¾ý´fÍZr-ÅÍf  kñ AâwÂ÷’e¼É$´‘ÒBÜb6“›ÅL,ØKíÔ‘Xm@žHkó!òvEÏÎl6ã³Ï>Ã;#³gÏâîÝ»hÞ¼9’’’P§N½¾€°°Pädf ° ß ^¬ Á1a¡aHLº£;ÍðÄäÓ$OjÓ¥]éShh222tMZÞI%Ä­å˜ ú̉Î'*Tˆ@ZZªlD£gÕlsć)|3'ºšÌá³´±l*ÝÓË >>¾HMIR‡Ö,ÂO¨V_E:w‡ 3ë> òòA䋪ùVûx4qÂÂÂëæ¢˜Dâ\»[/3ƒ‡YŒ!¬é›rȼŸüü<žd€Œuaµ:=¤‰ßl+–d½D{½H¥q% ÚùVÀÍà >¾~²±“C–ÛË ¾¾¾*Ýhí4æ8¡¡¡²±³S~XX232ŸŸ¦Šû¤6†ÒF_ W• G£ëëNX˜“yY‚å+44´H½rWˆçâ–ÁÃÃ>>>H»›æô^ý+e‰ÇÆ1vìXÙÈÈÛÛçÏŸÇÒ¥K1iâÄb VŠ»üsŠyù°*2Å€‡§'üýý‘”èxì— CºbE66÷FW`` òòòÔNà .77wܹ“€¯¾úŸ~ú©åኈˆ@jj*òòòJ0,‹Žµntðö6/EéÜ:œ¦E¨õ †:ö8Ô²øUv¯6¼1™LWøˆT³dêp‹jM"…Ì[T„—ü\«Ô:u¢kûº‘ŸŸoñ*ØOãè< ñ¸‡[·¡‘²ìv,Äó¼ÂI‡3…j–rfc i¿çyEK=¶Ô”n_l¢"=O®™jQ ‚q?2×õš ÓKr}Ì”úõ_¬ç¬­b¹rå€:`×®]òïÞÞÞ¸téV­Z…‘#GjtŽúÿ éúzûí·1}útT«V iiiÿÈ2>Ô\+ÚæJ¯$ƒ¦=¬ÙŸ”`Oàìsgà2‡9Vµc’H—¾*½HŽ1CêÇXjÄîvw† ZïªxÚ p¬€†¸dœâšFgvQ¿¤oΔA¢™]|­\®Ç3äð—™‹;Ïó0q&¹*¼¬óÂ4FB*†Äxœ¸+ ½`ãåb«MP ~ÀÒµ.4©‰ ”‰ÉÁ0‹"5¿«À’Ùý§Xr r¼ð?°4ueP.C½@¦Ô a†@_½S)â[3=³Ê’ɰv< œBQ‰/½„ñ‚…¾™ÜL‹‰ÁÄŒA©èEÔ%Ró²æ )ž£Z(ì‹*–BÇÆÈu‡dläŠ5ç#–ZšVJî’Ñx`þ?–°fÍDFFbîܹHHH@ݺuÑ©S'4nÜ-[¶Ä¹sçþ,ò E‡P¥JŒ5 £GÆ?þø-/s•ô,E`ÉqœÁᔩKžçFÉ1ÂFß+M½‘3\c$°¥…LÁz*uuït,•å“w@­„Š”Q­Q‚ ‚K¦„m”ڑ'^6²»ü!Ù Fß*šLÖ•”]‘B‡’˜DBòÄÛã¹Ë{¸È|ÊÖå ¹•â™L±°wýбeá°´ ÞL °p°ƒ6^ÃȾG˜h…X4°^²sñtÈÀD` `ÉNPW¥òLä*°ÔGæ:py‘R¹ a).G^_´t%—V‘±“Üe”X2Fà™dãRщQÇב¥3s¸)“ÕiX¸¶†³‡Ü JÎX:y‹Ks4Xkùÿ X†††¢W¯^hݺ5ªW¯Ž´´4œ$°ädŸêK› Ð& Ò9¥%·3¡–À³K©I5XÔúd:@©ßo˜Z ê°lÌÐb\y·û›T¨h\n1N!õ"ûÞJj_J2£)¿›c¢Ä @³;H®1¸&"†½$nWJôì¶â$dñ©jÆ"š€eMUÅÜH°”jª–Ì•Q¯®"M´‡ÀRãv£›³I1s 0Çë`iH•Ï( ãHâs]¼u@åú‡I@TZ¬™(¢—DŠí¥²TgŽç?S1±Š| Ö”)è)¡Ï±ºE!vXL^ë‚S·Ë/`’º¢FM^;¤ìûž^µùh÷ '‹ #¯ lZQ,cö®# 1Cè ‹çäƒ|:sme!—6%2š}d IÇN)À$#1—ÛO K‹Ëî9¯9ƒ,úw/È¥‹ŽŒ Š\»E· •BÉÙãhsö_ 2éq<÷ òW1Ç Ó2sjE;& -–Ó8¦òA©Î£ŒIÈtxC~¦f,«±ˆý°N¤×!7bQíàÕ±äL+šw–—)Ýü(öduxlR[El‚*Ы—Òƒgee_Á q½V #yo!»‘’¢ÍF'X&#Oú‡./*[]'H O'ì1ìg¨äµeSz-ÒêD ‡Š2u‘:¨Q«òóóqóÆu•s¬ÕX=QŒòµÇQ•ŒŽn¥žz¬ŒZQ‹õ?ìþ÷]U«V•ý=¦§§—Ü2ü_Ç=rÑëWY±bEX­Ö‡³Vÿr1ÆP½zu$&&âþýû%º_¹E!FÁ J†Z Þëµáeø$áC¶òªT©"ÏóŒŒ EH[c X"Í•{´,«=®<¯’M1R‘EÔ:Ï"PóØu;I6 ’â…3ùo &'r€SDäAL~wÅŠ°Ùlªy¤<(Èè'Ð]m3 Yâ ¢p)tbÉ™GÁXJÆ;8­aAQøFÌÈ‹Žqù"Dáö  [§syu‡qÊFU1…jSZ øð#ðÁ#‹Å‚ï¿ûï¿?¢dP\ÜmŠÆ%S¤"˜§ÿ"ÀÕ¢E Ô®]óçÏw˜§k×®hùTK$&%bㆠ¸~ýºk]è`îvíÚ-[¶Dbb"6(ž§®]»vÅSOµDR’:_)ÞÒÛ|Ð{xx {÷îhذîÝ»‹]»váĉ%f[ÇÄ ** ÁÁÁ˜7oÞ:ô9^¾ûþ{¤$'cÚ´i%Z?\…ƒú‚þ½öîÝ‹´´4¼øâ‹ÿ–÷—+WíÚµCݺuqùòeìÝ»WÖy-í³ñî>>>ÈÌÌÂàÁ¯aÑ¢EÅšCCÞ|çÎCll¬lpÈ 4qqqrhQg¢fûÞªò¤[0”¡ eúEÔì‘w”ÌáÁƒ‰àà`ÌŸ?ï¼óŽCÖ‘œˆÒuÌ#‘ìcÐÚq°oß>\¹zEUûýœÆi›ÆÚ\4¤dŠHÅZPr=DjJ:*)‘ ‡ªŒªC ¯(öèF„=»÷ -- ½{÷Ö´™  ËIªf @wPPFe<@î o Èb2vô‹b¤¢¤;df‚óqo #o TÉÇML1)þ¶çcäe¹‹Îš•šM“£›#c²cf©>Úº×ÛÅ'µLz¶úyÎÚÙd2QZZ}úé§äååIîäëëS¼2°‡MF}æê{XÏaÎø>¦Ôµkš>}z©=oÔ¨‘TXXHiiióÌš5‹rssió¦MtöìYJMM¥õ멜£k“²­´cEzÞ&ÅóêÕ«§·Fùê×¯çØ±r1×G÷»Òn¡¡!tôèQÊÏϧÐ… Èf³Ñ»ï+^8³¾téÍ;שcóÒN]»ˆãÊ…¼mZ·¦—_~Éaÿ«Ý$°’8òv-uëû¸žgäèýq¥Î;ÓÝ»wéÿØ{óø(Šôü]=“„$„3„ \A‡+· (‡ŸŸ‚Š_QWuuwAÖÝõXÜ|°õ€ð~{æ5ºîºk :X»v­A-[¶¤@0H`À6þ@Àœ‡¤¤d!À|RR2ÝpCzúé§ÃÁÖ¹€ëz`ôä”È'„=`ôÑüh‘u ƒÔ¯ßõôä“O’¦„õÓû·fÍš?¾1>s^ () ä¤)ã]Æ9¡¬¡¾-Éë« É‰ÁfjxKÁÍLÌLÏ…ódÄ`±¥wÇ þ”¼Û­½Ž;¢jÕª˜={6NŸ>àlÁYo·WÏ5Šö=§v[úôé+¨y¢íKZZ^}õ5tïÞ¯½ö(­×¢E <ðÀ4h .XMÓðþû`âÄI¸úê¾ß«·7pà@,ˆ´÷Á`Ò¤IèÑ£‡qSåß»@ö^»îT%ó2¥ãÆ=†œœtéÒ7nüíoÇsÏ=eË–á»ï¾óDj=5ÇDšVmŸ¾}=kwÖ®]WMGÜø—Ò×ÇxK¢=¯Z0·R·n],\¸Ë–-ÃM7Ý„3gÎ  âŠ+®ÀöíÛ~\&š¥;k+½N°.Ù$CÏ'vзo©ý ’‹LÌÞ­Ýv¦ó1í"ÝUÜÖ€î¡^ÝzxçX¾|9† Œ3ƒhÕª¾úê+ÑGG¢+ÿ=3¥—×]w2ˆCmèBCûcÓПh}ú\'„€ KF)U‡ìC2sjñ $TÓsy+\Õ¹ Ú¶ï€;v`ùòX÷I Ïú&ª|[·nÅéÓ§1lØ0T­Z«W¯Æ´iÓl‹öÏþ¯¼ò 4MÃ-·Ü‚æÍ›cçΘZ…7fÎಖ„ÿ_53W_Ó ºtEJJ ¶|þ6nÈÃçŸmâ&Ÿ™YW_Ó #õ>ûü3lÈËæM›¢Þ[¿ûÝï0`À4jÔÀöíÛ1wî\üúë¯FŠ+â¾ûîC«V­päÈ,Z´ï¿ÿ¾ÐÎèÑ£±}ûv=zÆ Cff&,X€÷ß_È1pà@\~ùåÈÍÍ<òÈ#FŽáüýï8ô³uþîF‡QXXˆÕ«WaÆŒ’õ˜€W^™Y[¹õ˜$Yçöøq ÇÂ…öqðó׿¿9_}eŸ?¯ãðR4MCË–-ѵkW´ÐýÊ•+——'اöíÛmÚ´ÅÀqøða<ÿ ÜGù¶y;wîŽ?ŽŽ;àºë®SË!CnÁO?ý„…‘\è¡P/My ï¼³õêÕÃÞ½{…úÁ`o¼1,ý¯¾úª­½[n ··€o綾°`Øžþ^¾ÞÉ{eó·b…8M›6EïÞ½ññÇcÔ¨QX²d Þ}÷]üýïÇ‘#GðÜsÏáøñã¾@ùðáÃñÖ[o ž|ò Œ=÷Ýw?Fe<ÏÌÌD¯^½Ð%²Ï?ÿì3äIö¹×âeÿúDmÛ*èj”HW}üqT­Z°ùóÏñêk¯ mùgå> ‘ï{O:Èé@6Þ¸ñŽåùi¯¨¨­[·vä§ü¼tìž—U«¢ç/þóŸ‘’’‚xÀxOaa¡”ö&L˜€iÓÂ|÷Ö[M¾;i’ÉwUó¼AŸgÆñݯ¼ñÝZµjaÔ¨ÑhÔ¨¾üò ¼øâ‹ ¾ž‡©«bÅŠøýï–­Záȯ¿bÑâEXºôC!SOŸ>}ЦMkôïß¿üò ž{îYÐŒ=Ú²nɸ뮑hß¾C„žWãõ×_—n’Kš^èäzutwRføÓ˜1HIIÁC=„3‘ÌP………†É€•þFމ¸qÌœ)„°¹®o´i­ÏËa<÷ì³ÆïxàÁptÇòó1øÖa:üvîËo¾…?<ü:„£ùù:t†ßv»`S)†rvû?~<Ö­[‡;î¸GŽAõêÕqß}÷ ©æêÔ©ƒmÛ¶a̘1øùçŸÑ´iS¼÷Þ{†½”^ €§žz «W¯FýúõqâÄ L›6 ï¾û®P¯B… (,,Ä‘#G‡ÆÁƒqÈ’+<ëÃó—Ÿ””L™2/¼ð¢b=nÁÚµë\Öý½þýàÉ'ŸÂªUæ8^~y–,yW:k׊ówï½âüù‡W‰Âš5kÑ·o?ìܹ­ZµÂŠ&Ýë¥Q£F(* ÏçéÓ§qèÐAãÍSXXˆ‘#ïÄ÷ߤ¤$e½&Mš`Ë–-³MŸ~ Æš5on«_­Z5 ºñF 0Ðs{ŸFÚkε絞lþV®çï’K.Á_þòL˜0)))˜9s&fÏž¬¬,ÜsÏ=xì±Ç|Í]ƒ P¾|y,_¾Lx^PP€¼¼<´mÛVx>oÞ[x8²Ïóóó1tØ0ÜvûíQÑ‹×ýëµ4jÔE…]EövºÚõÝwøùÐ!ôïß={õ²µågž÷‘.a¢³£Ó§^ݺX»v-úõéàî»îê]ê0^D¤.~>^Û€æÍ›Kù)ß^j¹rX¿~=Æ7çeêÔ©Qƒ­=z`ß¾}ؽ{·kÝ‘#Gâ–[nÁºuj¾[W1ÏV~Õ€7¾[±bE|úé&Ü{ï½8pàúõ»+W®BQQQB$ߺd°N:øüóÏñÇ?þ‡#ûèÝ%ïâñ¿þUædggçØéÓ§qðàÁðùII¨—”rå°fÍŒ;ÇŽC¹råðÒK/ "¹ Ð *­ýô’í¿³—îÝ»tà¤õLIIÆš5k0nÜ8ƒþ^zé%<ÿÜsBýììl s^ôó!.6§î¹p±¡§„5jÔ(Û8ßΜ9>ÛÄÁƒ‡"™}Ì~6kÞ +W¬Dýú—àÄÉ“˜:u*-Z,NråPåF•S@™éAÒm.3’AsÞ˜M7nŒØO0_6Tëׯ'"¢ Ï}ôQ:|ø0Áv.??ŸB¡µmÛVi_7fÌŸèìÙ³”U­i,lyÇmCéäÉ“T­b:¥'Ò’@m.oNDD;¶£´`ø™ìÓ:R¯cûv›4æjG¾êÈm*[¶lIEEEôüóÏSJJŠr^f̘A‡¢J•*ÏþßÿûTTTDW\q…`DDÔ¥KãÙ­·ÞJ………”™™ik·oß¾DDT¿~}Óæ†³»1æ/«šñlذðü¥§§ c5×£r>¼¶§£k×.Ƴ¡CÃã¨V-ÓxÖª•9åÊ¥Äü^?Ÿ`0 ü={v„î%u·oß¶¿‹£Ýæ#<¬´±ÌËË£Y³f ö“éi©DD4bÄíRûÊn]»Pݺu¤vÑz{<í¤¦¦Flªn7ì,õz|_Ò¸÷z™?ÞÆŒˆ¨yóæ¤i>}š/^Lhüøñ´bÅ )ͪ>={^CDDW_ÝÃöݬY³hïÞ½Æß99á}Þ¾};WÛJ™¥ßýëÕ¦ÒjgЕ‡ß®_¿žæÎk{îgžãº"m¡?Æ>‚ֶ݆ÁwA IDAT|Û¥2á#Ý—Ü÷êÒÕx6ôÖ¡a>”YÍh×6/ ™—´4¥Ý¿ìÐ4:{ölxEž¥$'Sj¹r”Z®%ƒ6ûÄP(DmÛ´±ïxœgŸ|wРTXXHµjÕ4žýío3m,ýØ>GưuëVzõÕWéÕW_¥ÿþ7üÿÓ§OÓĉ ÛÁ×_ŸI‡¢ÌjÕ »Á‘#GRQQµmÛV°¯ “諯¾RØC†ÿýè£ÒÙ³g©fÍš” RRRÝvÛmtòäIªP¡‚aÉÛ=~ûí·ôŸÿü‡³‡í+5Mf_©)í+eö™úßgÏž¥Ù³gÏÒÒÒ(==ÒÓÓ©\¹Ãs̘1töìYªQ½:iŒ‘¦i4|øpcÂ;“‚´}ûvúÏþcÚ^rö˜IÉI””œdö'¨ÛTH‹Ì>º=çö¯¾¢ÿ¼ü²ð]R’9Æ5kÖQ÷îÝ)))HIÁ 6Œ ©fê”’¤”ä i|šÂÂ"€’’“Q¿a#ìüö[´k×.âšï_*³gÏìÙ³Çø{Ù²eÈÌÌDëÖ­muóòò=:o¸¡?6lØ€ê5j ''ÍsrðãÞ‘žžŽ>ý®7Àø®];ñËáÃxfÒ³èvõÕÜm‚ ·•ï¾Û‰Ã‡cÒägÑãê«•¹£%™ ¥õ®»î:hš†iÓ¦áìÙ³Žª›5kÖ ??ßx¶hÑ"0ÆÐ¿¡îÑ£G±nÝ:ãï+V  [·n¾mdŒù«^999ÈÉÉÁÞ½{‘žžŽn¸!úõðО—qèó÷Ê+Îóçw^Š~;ONNFvv6¾ývG÷%[ÒÒÒPPP Pž>?éééÒ߬Y³ûöísl/²ö¼Öæ/)Ù ³±c‡|þvíÚ…P(„Ý»wãÛo¿üïÿC“&M|͉þþÓ§OÛ¾;}ú4222Œ¿wî ïóÉ“ŸÅÕ?ˆÞ–ÏiÿZ‘¨_3¶x˜6z™gÇ}tý j‘ŠI2 (T0 9%Ù¸} ¨ã¼yhWþ!ñ#ý½øýÑ£G±nýZãÙŠ•ËÃ|¨{W£]Û¼´ÈÁÞ#óÒÿù¤Xû)©©©HNNÆ·ßî0¾ûpÙ2œ>s§ÏœÁSO?-ŽÓ‰ï2Ë<óüŠßoÜ|zá»×\Ó_~ù%8`<{ó͹1Ñ_¹råP±b%T¬X•*UDÅŠ¬;úþëÓç:¬[·ÇòEÈ „%K–€1&áãLJ.zÌJ ü›7¢zVš7oŽæÍ›ô|ýõ×Cfn•ÚÑwÛcÎÐSü=!---BßíðÁ8yò$Nž<‰'Ÿ|’ÓðõÇÆU½:rZ´öex²¾ð¡Îu,I™‹Õ“^´A…©Þ/ÄxÃUî<ÿxýzãÑÊU+Ð¥kWc;õ7ƒA<ðÈ£¸ªKW´ÍmC‡"))ÙXÀhl­ª´/¾ø………èÒ¥ >ûì3á»+V¸ª¿²²²lm¡u›¶xëÍ9aãùBôèzžüç3XüÞ‡øßÿöà¹IñÊËSâò7ž;];_…§ÿù –.ý{öìÁ¤I1uêÔ¨bÄeggãÀøâ‹/”u222P¥J#ä‚^>Œ]»v!;;Ûîø¾è}JJŠ?saþ¶Úæ¯M›¶˜3gN”ëáÞž—q4lè>¾ÇáhƒÁ ÆŒƒ®]»¡}ûö8xð ’““&X’åçŸFÅŠmê+nÕž×z^ç/ À”'XTT„`0èk zÜ9ÝÞ/UªTb¬?:]… ,û|Šÿ}îwÿ–Dñ:ÏŽû¨­(‘/ó@`Ñç+ch1/|È/ŸtϩӧpìØ1dfV3¾zðÁP©R%Ì›÷–tì+V¬p¯>ÏݺvC;Ëùx-òÇw߇‰Ï>õó’ l$ ¥›b o{9zô(>ùä 4zZGýcåDßí܉ÿp²]Їù#&ü{dgcÌ#ƒÏõ¼sçN è²/½<òGLœ8 fãá‡ÿ`›O7’ÌÏÏGff&*V¬¨ *{êÔ) AƒÂó¤¤$Ô®][pPÑmâUÌùèÑð|ÜÚó2/óç{˜âðáÃ1vì8 4ëÖ­ÃñãÇqß}÷á¹çžGi(°–š5k@ØŽ,ŽíñŠ×zÂü­ Ïß½÷݇çŸ^b[W[$/eÿþý€Ë.»LzÁûñÇ…g;wîDÿþ7àÒF—â‘?rûüðõ^¿û·$Š×yvÜG~–&Rwø° ´ì£çcØGqŽWë…ùå“ne÷îÝÈÉÉ1þÞºu« ý÷Ëwùý¶~¹ßdüÊËx÷ìÙƒÚµk ϪW¯ýzy ÉS§NrûÈŒÖLB­Zµpä×#ê‹=¥oz¼Ëüü|lذÁˆSÊ,’MÇcB‡ÒúcÆ؃»ó±8÷ìÙcئ3ưmÛ6)äçE^^n¼q—ˆÙÆ 8 9JQÉŒvc‘|æ1"—=ìëxæÌ!=¤E' @£ˆØô®{ïÇâó±ôýwqìØ 1ô8(¦M•““#Ü’Û·oóçÏcõêÕ¾ÛÚ¼y3zõê…´´TS” Îû-ûðÝwßáž»îij“&âæ›‡ASùi „ëy'&Nœˆ!C†DÅh·mÛ†¤¤$ô’ÕóÒ„­[·¢K—.ÂóÜÜ\¤¥¥L'¾'uþÒâÒl¼Ûûâ ÷ùKÄ{ï¿æÏŸ÷Þ{Ïð˜è@÷'Nœ«bý¨ Ý,’ÊÒ¥ 77*T0ž]Ó³'Ž;†O?ýÔ÷x?øÀÞ^OI{²÷ÊêÉæ/|ù‹‘f>?îý[¶lÁÍ7^ŠV­ZaÞ¼7¥í|÷Ýwy§Ã>÷ LÔþ5誘JÜ÷Ñ(É>4ÈÛx£±HÐüÅe^¸±Ìš5ݺuCÓ¦MãʯÞ÷ȯÜÊòåËЮ];aù2µRNz!‹B!lÛ¶ ;w6áÚ¶mÙGÛ áĉHKK<£y°³eË\sÍ5HKO4¬š­ŸðD–üÊ+¯D:u¤ U•¾ÒZfÍš…®]»æ(*ºyóôìÙiiiBÌ,E$88yééi0ƒ°“¶ˆ9ÉùE¼ÖüäÉ“ÚçƒÖË@‘ý""‚VD !bظ!¹í; iÎåhаþøç±h›ÛNº_¼–¬¬,¼ùæ›èСˆ¿ýíoÈËË3Âáø‘`üõ¯…¦iX²ä] r š4mЛ߂gþ=+V2@c—®ÝñÇ?=Š«:uFåÊ•‘›Û½®½‹.àâW]»v߯ü;wF•ʕѾ}{\{íµFx¿eîܹøæ›o0yòd<ñĸüòËѽ{w<üðÃÈÌÌ4ê7-Z´Àÿû_\~ùå“&MÆ?þ¡ž¿x¿7//:t@‹-ШQ#Œ;íÚµSÖ_¼xz÷îöíÛ£|ùò¨_¿¾·9Ù‹9”… â—_~Ák¯MGãÆÑ³W/Œ÷^Ÿ1C*‘HMMŶ/¾Äøñ㥜Nooúôp{½zõÂc=†3f   À`dÖ÷öмw†å½Âü]ÚcÇ9Ï_iyf´mÛ¯¾úrÛæâÚÞ×báÂEؽ{7Þxã £^÷îÝñ裢sç0?pÚçÉÉɨV­‚Á ÒÓÓQ¥J$ƒÂR=Æíß–—_Ž!Üþ=k–Ÿ¥Ê¢Eît•””„ÌÌL¤¤¤ 55U«VuŒ(à¸Ç{ÛGä‘® :¸Üã>ÒÇÛ¡=ÊgXÆK_̹–,^¼82P¾|†Ã¾t^¸ðîÓ¦MÃ?ü€åËW`È!hÞ¼9ºwïŽÔÔÔ¨ÖMŸçœ-Ýù‹9ÏúèGðáÒQ¥JLŸ>Í›‡Ï„{îù}tkœIŒ1„#€äää`Ú´—Ñ¢E Ü|óÍx饱k×.Ì™ó†”À¦1,Y²½zõD»öíQ>#—Ô¯/Hÿö·¿CÓ4,Z¸ƒF³fÍ0xÈüûßÿFåÊ•…ñû<)¼Ï«V­ª4ÇéÔ©Ö®]‹åË—Û€›) ™>¾Y@˜NË–-ÃàÁƒÑ´iSôu{üñÇ¡i/^‚!‘zC† Áĉ-¦Iá,Y¼½zõBnn®…op¶’Åó6–d4é>GÚÓùÐ%—Ô—ª˜±M™=¾(¤AiAP«æMhåòetþüy*,,¤åË>¤¹mˆˆ()ô `ýúõ4}útúïÿKçÎ#"¢mÛ¶QãÆmuóóóiìØ±®Ù{Ú¶mKŸ~ú)Ñþýûiñ¢…”Y)ƒ’Œ’Œz]Óƒ6nÜ@§N""¢Ÿöï§7fÏ¢zujQ’ãÓóê´qƒYoÿþý4kÖ,ª]»–< …‡1תU‹æÏŸODDtæÌÚ´iÕ¨QC¨7pà@Ú·oÒ²e˨nݺ®™"*UªDDD·Þz««W¸ì#›¿… R…Œ ›Wø¸qc]½ssíUȼß~ûmáw•+‡Ç1tè­ÂóÚµåóW³f ßï•z®Jž7mÚ„–-3éþÃ?¤¶m#tŸ´Õ¯]»-X°À ›£GúÎãÇ+\ïãöíÛ9™1}:¥$'I=³ªeRQQ½3¾2ûN“&b{Ó§O§¤¤$›—«õ½Ó§O§ää$÷ùk#òÞ½{Saa¡ÑîÖ­[éÁ ÐÐ[o¥ƒF•­æ¶áÃiÿþýDDtîÜ9Z¾|9Õ¨^]¨su´A¶ÏkÕê=ñĤ*ÿßÿýŸPwdÿÖ«[ד¸ï°Òÿýƒ>¨ìßwÞ)̳þ›­[·Ò<`D”8xð à}ŸëÄ<öÝ •&v:h¡ƒ äü×9‹—s–¯ÚµkKÚ3¿ÿè£hþÛo‡=m#ŸÊ•+GøÐPÒ4f|ÚåæÚæeÑÂ…T¡BÒl}2ÿÖMjÔ¨A|ðÁ׎9BkÖ¬1³'ùà»^ù•¾;jÔýtâÄ "":xð õîÝ‹vïޭμã-.??Ÿž|òI.³K@ȼ£gÎ ƒôÿ÷Â>Z¾|95hÐ ì¡ Yg’’’©^½KhÑ¢EÂúòh’“S¨cÇ+iÓ¦M">X¼˜ªT©bxF?õÔSÊ}tóÍ7Û<ºÛµkGDD[¶l&- Ê¾£Yþ/ûhT³fMZºT¤ƒµk×ÒM7Ýd{§u‹-¢Š+Ú¼ÔëÔ©C .´ÌK€‚—‰(ñp7?Î3œ÷j¯[¯ž¼½ÈgÍš5ôÎüù””yÐ(«Z&Ý6|8¥$(%)@¬\ Ð=‚:+U®„³8}º@™OÛKY¿~=~üñG <åÊ•CùòåñË/¿DuK³Ú9¤¥¦¡B…òøùçCÂÝ“ë«ijT¯‰Ÿ~Úo@r›xž˜ÆP£F ìç þåârïý ¨U«8àh;Z£F äççÛ¼o]ÒÒÒ‘‘C‡Å%¿,ß^<Š×ùKKåÞëÖ•½Vd]+W®Œ‚³ÞìZ),¬X±¢hèã<º•ÌÌLœ8~çÎs¬W·n]>|ØÄ«Êž™™‰ã’ö¬Ú#U=¾T®\.ó— Ûù¬¬,;vÌ1š€¦i¨Q£†àØkñºý [IWq,ÌÇþ%ŸmU®\g,t`·q#‡ñzÛ@*»¹èæÀûÉêç„+_óšß>Â{’““QµJUÁ;Ú­Q¹reœuÙoV–Gi“¸?ªW¯Áõ-º¼SáHfNkX›‰­Å}tìØ±ÈX×sÎ.0ògØã<¼¾BüH4¦! !== *TÀ¡C?ƒ(dª«9•·a3©:8ÏîúõëãçŸÆ©S§`[iËéG*5¿ÓãzË耯Ÿž–†òå3pÐå\%"¤§§ÛèžW·ëSÏã(>Ÿ¸u~RSÞýz{z~$^ÒÉ\3Ôë‘ö“œ<Ô€gfròX€å¾}ûpóÍ7{b N¢w[}2K™ã~g–$îÑo*Él– ,ñ–%V¼2öD¾×í¤óØX4MxÜ¿æ>£‡#2Ÿ¸ëÁ/`2-U{ÞÃr–LÎ+ÅçÞ©ˆù`HîQÈÃæ$ý—W¥˜ßü§–öùXo‹¢VÒÿØ»I¡€¾ÂȨãÖ0€EãÒM3IêÅ4-`x9‹@V\' …ìÎ8‘çA˜<#Ã)2ìYzLÇq4¼³‘ ÷˜Î8âxÝ–€ˆÀ4Ñ‹[•9K–%HœX.Y2ÜdþKÓ×€i‘¹?É~F¦CŸ+2‘ÌNa«âŒž¼µ‰ ð˜÷Ž è">ñ.T@-ÊbÐü•ĺpû%¶×“+ƒsÀ¢e%AäïéÕó;ƒM&iv ¦測ÇL¼ù Æ¢¨c®¶Y³ä™f‰Öz„0—¾‘b¥§½±1Ë•‚‘îþKRq&yf{dD;­aÊ8Ú`pãi* ¬BæŒ1Æå¶¶cf$ÌÌK*¯n¦ºÏIÁœ¢„Ò¤a^"*Ì<³Ó¼ ó0a-LaŸ ZÁ²Ñ;"O{Æ”╉E. Ôû#$f¥ŒÁm¢™°™)JvôÃ?(Õ¶Å*^ EWÍr‘ ß’褤ÀWiùÕë•à|–È2°ÄL{4?Šf©.Æ3Þ–à#_²./ù†]eenën%Ù·äì •{ƒ:q¡fÌ6o¼Æ[5ŸV`d¶ !H·Æ,`ž¿¦E¤‹á:á@ìa@Êp…ƒOvHÌÎ×÷‹à”DQ鋪rî>Ïì—]R ²ß(dZ\àô¾¿¹Ë"¶7RBZ¥ù‘y KPM¦1µ,’¬.)æÊ¢²úš¦ ß%ƒäþ´ðßZ䣷p|¯Þv  €¦‘ùðßkÂsýߌûhÒzAãý’O¤¯f¿Òvä&ý0þ¿9b]ý}®z€ñ}ø“ Pr0@IA’¥$(-%H©ÉJK qÅèß¿?6lØ€êÕ«#''999Ø»w/ÒÓÓqà 7ذo^^>ÿüs%föÛž[¹á†<·WTTHNNFvv6¾Ý±íÚµãò˜zÇÅt¯ôò)+%³ñ›¹}ü÷SþŸ „øðÑoÍò,%̳j4ñRª(f5r¹—…!Š~-ÊÊÅÊ}ÅŠy|Œ Ù_øÿ«4²Œ8~Í"dõ‰³}dŒ³“”sw‹÷©’0šNBÖçJ3íL"’:› ­G|8r "êv²:âpï3ÆÇ%dÐçZÓí@ùØ–D( …³iŒó oР²²²°uëVHkÛ¶-æÌ™#<_±b…ãü¶çVôö¶lÙbk¯ ×^0Ę1cе[7´oßDrr²ò rGY)+¿™ãÏ-@²28÷ÅT(¶Ÿ21DHÌmþVéî7:/®¡ðÖ*‡U®kkk=Yx§-l iõô6³õ0Gàj†ûñæin¨ØI¤Ý…I\°Pff¸‰ˆäA±,…¤oÓ’§Ý¤]¼(˜NFš¡º'hý¸,=ŠO>ùôÔi7D?í¹GÇ'£½AƒŠ.ñ–Ÿ >cÇà±nÝ:?~÷Ýwž{þù¨ÆqÁ²ëFRy‰Åalnæë~£íüÖJ"Ænsˆá.æjIê†<¯v|æ#îé-=ÙáÅ ¼Lä‡5ø-ìrÅ‹ÄËÑŒÀ  ápTùÑù´‹n´¢âUüwL•œÝê.L9dƒR½ÏW²:õð9¹õìL™7ÓEÊb›ÉĽá¦s ¹°t!-%WŸ`Ÿ#Ö¨‘ÃFŒx-"É E@º¡ ß¼y3zõê…´´´¸l#?íñbe©h›ÌöRSÓläÀÏÝý£Faþüùxï½÷püøqÀÀAƒ—@ùaŠWdzŽÙú"ÓQûJ<¦Ð+ø’©i‹ãˆ‰EE-»Q[?v&â¢bfN?^½-~ ÃóþoÙ'Þï-+Þæ&Qëpq_ãq«‰ch,¦Ž5i-oiG>& äå‚hÆ\”7ù}ì!Äd±)åg w±bQ,¯0‡"?V²u¦:YÕÃÔ½à­&¢c8O÷°o‹ŠŠL`9~üxhš†wß}C† A³fÍpË",Ô IDAT-·`òäɨT©’oR+©öòòòСC´hÑ5ÂØ±cÑ®]»¨¶KNNvîü7Þx#RSSñÅ_büøñ€·çÏÇ; ” Ÿñ°“ý¨€´ƒ@Ëo/b/0"Õª‘õCÅPËJYIì>~ÀY#²¼îöÖç"@ö’ƒ 0 9ì7&Ägc’H &À”ÏhÝ‹ÌÆUS…Mm@Ô¤ò}'Ç|æLù·W»Uâ@±™MRBIÀÆö0ON¾k×.têÔ /½ôfΜ MÓðÓO?aÓ¦M†3ŒŸâ§=+AEÕ^dlÏ>; 6Äç›7ƒ1†•+W¢K—ÎØ´é3ç½()5kÖD£Fp饗"==Íš5ÃΗZµj…`0˜˜ )]à¼-ªñZã/PÂç1 XU}ž´3Åáàb}ÄŠïõq«Å'¹.+ñÝ3ê\пe ™èÃÇ[¸866Õ¯ t¢ Ø„S=Zsj»¥7ârV3ŠØ~šõì1!å 5.焞?žÉ¬;ór’J&9{Hæ.pšóp x= 3Â3 kQ &èÔS:ò±1õg¶7¦¥¥!##C$Üï<»µçncio¯B… Ç æ•+WFAAΜ9#?ðd#±‰Æ fcÏž=…B¨[·.~9|¨Rµ àÈ‘#Å}§ìf’[EÉ—êôƬ3R™#33+F»¤Ìsûxù‚Ç’wšÅ¸³³v^­™Ü€D,ÒC· í¾`¦‚üÓ´ì0WͯÕÉ» ³T^5<ìW*†‹]ܲ…'ävÐ4S÷+±¥ä3ã8‚MÆËè¢Mˆ@ÜQÎãx)ªÕQ¤w;°;… ›©'¾/œÓ\Ì $ ØD^¤ß2G#ÞñÆ*öÎÇH "&󸉨€jŒ! éæÌ0Ô¸‰”Ë A "IšYü§Ò~7ulÄét/ `Iñ£K/>äÂÈü–juMô “ÊUj£¬ÄÊ#™);B}Çâ|cõìõMíoàh$añ¿ÒÇèð•PÀ[|EÓ4eø!u£Ã‘Ô³Ü mЇ–}nxHšÌûÜHD6ïn>G¹“W¹ŒFÔ{ÈéÒ¦¦C?“Ä[Óì·úÇÓ3Z[Š,O Àl«Ì’ …ÀÀ\r…Ç" I4Έ*»™{j©2©8ð«Rž:ÐËØÝ¬ã%})SÙ••„J¦K4ScÉÈÌ‘ìÒ¤¶^´êô{/mû–N—½èÏ7Í‚ Tvƒ˜(!1—Å÷žìü,N>^/&p$)ÝèR=C«+‘RÊ…/g ¶Ÿvúv…o²54Cör|¼­©L‡£ɲI29Ù¤JTó,rp2"N.Ǧj!}"C ÆP"#5fð·"ãBÅŒ¬ôó•b_¦ŠgáÈè(–¿ð'8VÁh.½ Rzˆ3AHÆ…)‘@PtûÌ8*ÿDIBVéT¢òÆ{•ÆÆ[­ém¼€u¬ŒEždiÔ¾åö¹' p”×7G rÀv¾ÚìÆ)„’¾‡30Ç«]4saäS7«Ü6Éêan‘“(½4Â$Qȼ¬êÀS{É4‘‹Ä²T3SûÁW*TôQÀæI] ìáÈ;‰…ÇEkß;³g¸hu°¬˜êeÒL^Öþb÷ÊV©åªV»U3è±¹OM^°è€£ ô‡$Ì+ô$EÑK¯óáÖ¾×}¥®Ë${Oåã­/2i:‘) ã`¥”w«^ùp¿9 ¥a”)P¥š¦Ô*~’|?øL- ÑÃÞà³ï…³º0XÓ&’Í~’—Ú3ø0ð!ÙŒºÌ°1ÿiS«ƒ3“"AîÕA“w*2ÃÙm“ÆÛ„Pnë&û·ÜþÔ&Üâ¾À>†)d· .ÃÑ‹«ÄÒ)÷åo¯Äæ˜Vñêî7åõgWsò47*Fꮲ*Xe%vIÎ…ÆOT²^«ƒJk* ûÅÏò=²ç¡êצүd®ôðëÒ÷^/æ±¼Ë-ÔŒ×K›#£ÓFÄ\³è¸W»‡µ·ÖÙYFÜ-—ºÑFÓ¨•©ý½jNdêvçúìCÝA†ÌCl}þ fg&ë'ù4¦™€’ÂÆ5Šh?‚T îÅz°DOÉÃã8L—sÖNŠq0ügÑð°²rÊâVõ:Õ·åYæA%xÜèñ[I¯]¼ÕÔ¥ÿ¦býÓ.Ùt»¸ðôÃ<LkH >P¹l>­ö…nRe«¤’w¢qZ{Æ4Õ;¯-)Á¦[<[Sõì?)‚ÒANë$þߪúw‹eé%>¯àDzöÁpšFIÔ$Dþ …xÁÚX×!B±äצèpdqŒÍª>ˆ–‘'4/&%—ÜØ¿qdé9À¤?Zg,6`¨ýQÜÀ#6Ïl.e ù&Sz!ÉÀô[×Ä F£—âÅ›1’-dŽ+ýrtÂbØoÎsaÚZÓ6[¥aª÷™uå6•Vp¥ «#öÁérÁ”ñ%íïcJ‰ wdP¹p‡Ÿgf±UñU“¨%Ц)€î¸ôÕd9H#Zžn_²rÁ`·Í.ßüÞc°ˆt:òø8b~ûÓ1Zæí:…TJèÞ‹í–ìRT\¼ÇíÝ^ìißDçkþsùøå6óLb_Å4ÍøÏŶ¸k[N¼Ö‹-bwƒ>¦äÒ˺Ú|x[M'ÀçnÇ*»08‡F4A¤(¹¶Ï¡/aŽÅYܺê¿Ñ"},“X–JpèOÓKܰDKvJ€Nü‹ËèÓMRR¯¦~öG¼iËKLG¿ÀÒ D{•&w1âNeBñ\c>±R0ó.]Óâ%@º­R«@r,ëçÔ¶ð‘Í…¦i®íñõ/‹$§âˆ=$SÚî‹Î>PH?Mö&z^“’†œÖ‹÷ž¶{póàÏÿÅÂ}í ˜èžèT–7&ÏR˜SÁ¡Iÿ» X–ÎÓ›S$5G:²²r1ÓêoAé PõóÑÀ±†Cñöc„»1õŽÆ«¹´¬Yqå/ RØh$°~æÇKÞiohŸºhkx2! ‘ÍYÔºo¬wdÞ^RTÜFÄín.³y4ÞãròêÒGÆœÔþÑ-fÒ£_+Ä»±ë}ÖC–Eê–ËÒr8I/PÎb-ÑhY)•%.æ¢gv*7 ¿_nÛsÙœŠÄèRóp †pf ]ÕCúÅÒOT%K”d1Ö~ªò««TÜñì´á‹<ÛIšÁr<]Bå©£Ù;²Ø–Œ LÎ8›A9Ÿóæ­n]£ˆ¼r­Ì×OÏÞâÕävàÁ˜ËEB3‚/ާkMeÀ²œðª`—,ÁïuÚŒ~™ß¸G¬˜úþ[7Ž6n©• ÏÁ/cžþ$чíqúw4À2aœÃ³”2¢–"&•üÞˆd;ÑÕ\ µ§W@VRö~@Q"@™ýz‘ð•„DØ~ÝlG Ïm# ç Â8rrÞ£ÞòÀ[yº5'¶Ýs܈XI€=¸LjÈ·! ì(ñb±bD>,y:ë$1f=î ºKUu>çsÑŒ5j1“á[ŠˆIçD÷ ×ÓR–Ëb¾9{LLÊK§$I‰¸ÄAÔ…zß(áa‡ Ç‹·s¬¶b* ˆS]¿dJ Tò*3GàA"QÉ“å™9ç±Æ+Œ?M¸IŠüHØÉÏUýñk¿O`î§ÑfâÃîØÈŠxÀbs²Ë™÷=%:WWq’¾ëªo{Ðpf&œ¿bf)áÛÞ.aòó_÷ÙêUïå@‘%,ñ¤^&Òm) XM¶0º~ãËDzò]𣬔6NÐò'‚ÄKKPj¿ÒÆ’î,ÀÒz´º_ûÈ÷;5/^<œý±â”^š,œNi=·bþ=ÀeÃaFÀlò98–y¹ÄÈéQ.ÐådêgH€©=_¶aBR”†X P- ø¡5Ù…„Gä‡_Ëòž‹°›‰Ëi¨ÄÃòÍ™êðR,½Þž‹ã€(±˜eŠ--ŠòË€èE0ãD¢1•šË—L’è,^èQUàqòŸ’ÙõÅcÝüÐMiÉÜ£–àYS<’\w U2óh3-mT¹´UýÖÕ¯a4)çÀÿQ¾.NXç€ñr{K5ø“{Ž‹[íP½Ç¹ôê4h¯/¾Ç®Om¿ªæ&Ø&ÎQÇT󡇂ŵYãåQU\E¼m»üÌSb`ÔÒ"å,Î\ÛpYxÖhh—üë^—âún?*r¿jë‹Tz–]Ú¼`½½/¾ìGµZÓ@šiH¶ÓñÅ4>h¹÷œ¹Û?’)½“I¹D×20ÃgÖ1=¦™RxdBbX«M%l1…ùã#!HòƒËw—ç[\àÆ›¢0‹ÔÏáÜöhIÏa}>dq3™$I8ÏþylØÐÂ’…‰ ~õ x;ï\¨L¾d›³Ç›Öƒ¼Š·77'™x8·DãˆS\N5”Ú™VÉ©»#Ž{·Œ ªl¦¢±[¼Øb±ÆBƒî,J.É{„ÿxÛr—„s“Wºw³%µ'Püx sA”–T%1‡ÑÆWíy™È™¤`a0W'h´µÅ⦅ù=¶,T¦úOÌJGï•ä7Bÿ8h3ÂHnëéG@ãO ™Y@·ÂûÞ XmèMóCBÉ!týY0ÄVVJØþæò©—ÈÁTZ:âÎxŠ«¯^c4¶Œe<Æa[=l‰'‘´DkçeÏÑìORí¸½äÁ‘êÄ÷——h%æÎÊcŽž‚P7ûÍÆøAð‰™ô" /CKNöéöJ*¬«¿@Œé/AŸlHÖŒ~Öþò¿ámCm‹ÊD“cbdJ< –&û ?ŒÌÍ.±¸RwyµL“oG¬R<Û (ÞSZ¦3÷øð¥ ¹©µc·s¤Ò „‰+¿rÚÿ2  O¥”j³ø¤Ú¾`I Ÿš á/ ”À,5Ñ9EÕ†Ó“ ã™Ä¼x—ÜF!ò¸<–€çdS7‡!PX}* âB§:ÁkæÌ¹9•6‰w(› ¤¡‡Hhʼp…„uÕUÂ`LÜÌi“ ¸ ˆL}1ûÎø8j éWºooÙìZf«‰ƒþ+#sW1DZ¼X$”ev`e%îX;Át©’Bº=/+þ/ÀÑ»–glQ‰Œ$ÁÌÜß–¬°Öv±9fH!4k¶Mã>Uý«\€´ß½%Ÿ3ùßV!sé0—ôŸ×šnªåÀ Ûä1Û]ÇNwÖ:à¤w†$ÏF2jlJÒÈÓ’F+b´¼SÓMK<‰ÂmÚ=±MÓ¦¸Z#0cp6^tyoA‚É`J™Õ·O²$;"î½e™wŠá ñÏÄ d™“NYQ1¯^×^l.öy‹f/gF{L9r”<ȤüqDRÓVæ¢ã,ŽàeÖÐ- ÂO~³Íº0â‘ybÂg5ÎbYŸ™”Þ:õdù—r/JìúdýàUë,âá-J ™ãlÛse+RŽ9& ä5 üØ­q$É‚¼ìÃeJ¢µªªÕ&¤r'=Ð|1È ezäÃ1ùþ1~NáÀ$¼4šLu±Ëx¤h‹F=^R‡~<÷L±áRäù\V\i™·qô“º0Q «´ÏÓM¾Dlöâ$„¶ŠŒzÌü‡(“# wÓ«„Ê ÛXiÌJ¯±­ƒÂì…¹Õu竼ížígž»Lñ\~.U¡Œxë‹7AVi+ó7Z²ÚãÙœGäöŠâ%I´õ³ÎH®{>Õ7#¹LÓNk Öð;$Íå(¹h®¢¢'ÑCÞ ­“E=χSå¤wâÝò熋·MB«OküM‘t9%8£HŽðp+! E<è5X^qÅèܹ3jÔ¨Õ«WcõêÕ8þ|±°ÊfÍš¡wïÞÈÈÈÀ¶mÛ°eËüïÿKhóZÒÓÓqûí·#??³fÍ2ž_rÉ%èׯ~øá,Y²Ä÷á–( @‡Ѽysü÷¿ÿ•2²*Uª¢_¿~hÒ¤ Ö¯_eË>Ĺs±¯o‡¸÷Šeذa¨P¡‚ôwŸ|ò 6oÞìQ”`×99½×kÿ¢-:uB—.]ðâ‹/âèÑ£Âw÷Þ{¯Q®^½_}õ•9—8q^€¥¬Þu×]‡+¯¼Ä’%KðÃ?HÛéÓ§:vìèZÏk{^ëy)•+WFŸ>}ФI|üñÇX±b…’9½×ºïrssѬY3LŸ>]ú}«V­pÕUW¡Føè£°fÍšbãªÓY®ð“Ÿð‚7®L–¥&Œä!Š$R'Wé¬[¨\‹5–s ©úÍKø\rWòu`Î#trdÑÍÙÉÒr¬Ç<<&a‚u/±Ý`¢hB2É,¸˜]bÉÏ«Iwrg?TòàÒ”OÚûçêV(‘’bþtÕvXÂn߃r`lÒ‰ÕbÒ|·09\d Ö *UY²¬‘ ìà’¸ñ0Èâÿó€Ò0±±XÙRÞÈqy˜&NœˆxGÅúõëñ»ßý@­[·Æž={Æ;ƒÁ 6oÞŒ¦M›bëÖ­ÈÉÉÔ«W,1¾^§NìÝ»çÎCFF†qÈ<ôÐCø×¿þ…?ü×^{­Àh£qæ‰]BîÓÓOÿÇŽCff¦ ·ôìÙ3gΩS§°yóftîÜš¦¡}ûvøþûï3®8•ð{ŸÆ±cÇP­Z5Û÷ëÖ­C:ulÏ/¹ä<òÈ#ø÷¿ÿíñ†Ï|½×o=?%33Û·oGVV.»ì2ìÚµËø®R¥J8rä<ˆ³gÏÏLJ7Þ˜m;¨¤½¾²òÌ3ÏàÎ;ïĪU«P¯^=Ô¬Y½{÷Æ—_~Y*êy)W_}5¦OŸŽS§NaË–-èÔ©c¸êª«°{÷na&L˜`{ïµ×^‹/¿üÒ¶çF'žxÇG­Zµ¤swÿý÷ãèÑ£øä“OбcG´oßÞvÁ-® …"ÒE»L„ Òª->­šT"B–ÿs{‹–š¦AÓ4GÛ[²ˆñ˜ èW¾•^”|× zä`NÑx±zæ>#Ì6DJÄ‹ádÏ ! ™vïjžþDµµ¤íˆ4ÖÀ<ÄS<‰4f‘"Û@”‰ìÜ/H°ªôEðăP§|÷"¨ãi(:Œ–B°rC «ŠO¬ŽŽÀƒÉpìÎBÊiÊŠ%Wj¯$dÀ,RsóYXvìØÕ«WÇûï¿sçÎ!99»wïÆ¼yóðÐC%Œy6 S¦LA£FpàÀ@ZZ5j„/¾ø¢ø„PX§Nlß¾gΜA¿~ý°iÓ&0Æ0gδnÝ»wï6€eI©ÓÒÒÒðÚk¯¡{÷îX°`(–uêÔÅ Aƒð / °°)))صkfΜ‰¿üåϾ´´4¼úê«Â{½·îÝ»cÙ²ehܸ1¾ÿþ{_G‹×÷ÆÒ?·CgÞ¼yHIIAß¾}Ѹqcìڵˠììl|ûí·ÈÍÍÅÖ­[•€0[ǶmÛbß¾}ÒËVNN>ûì3ÜtÓMX´h4MÃâÅ‹ Ñ»wï«çWr_§NôïßS¦LAQQ’““ñÍ7ß`öìÙxì±ÇŒyÊÉÉÁ¦M›pÓM7añâÅÐ4 ‹-B0.{iiixùå—ѵkW,Z´ýû÷GíÚµmïmß¾=²²²°téRœ?ÉÉÉØ±cÞ~ûm<òÈ#R5n´Ñ!¼j^B¡àÙbò$–ÖíÂb–@À[à+°d9„_`é”=³4‹ÒöÒ{Wqq¢"^0__Q(„¢"I¤°´¦Pˆ$ =ñ¸5϶ íC AYÁIº';ÿùx”²}l•ZÛ$§ÑsC²>p)-öœ^°‹ ÜÊw*)ƒº{Ù”ÖåÒUè†&Žšþe^^.\ˆsçÎÎ;‡7¢}ûö F={öÄ–-[ P §OŸ¶ÊÑ£GãŽ;¦¦âùçŸGnn®P¯Ghݺ5&Mš„™3gbРAHMMŠÉ¤§§cãÆh×®±h¹¹¹FÿtâÒ4 W\q|ðA¼ùæ›xüñÇÑ©S'ƒ¦µAvv6^xá4hÐ@ °ÇŽë{þÎ;‡ãÇ£cÇ‚„ÈÊS÷íûÏ>û,ŠŠŠŒß}øá‡èׯ_Tëf¾·#¶oßîë·£FÂÒ¥K¥ 2 bÞ¼y1bDLïõÛ¿¤¤$¼õÖ[1b„!­Ñ?@Àø 2]»vÅ /¼`Ð _7++ pèÐ![;üG¿]ò7zœ8q"®¹æiÿo¾ùf8p‹-2@ÉþótéÒuëÖ{=½ÏƒÆ°xñbƒÙ¾üòËèÒ¥ êÕ«çLïÛ·/¼ð‚@§Ë—/GŸ>}¤ã]¼x±Ñ?ý½ü8t:èܹ³aŠ +7nÄ’%K ­Ä¹sç°iÓ&´k×N8L¬6®Ê Î€ãwþ@ jq'ઠB\$‡!¤D²/9“=O° @ø—ê/ %·r¾¥ÒÆx÷ͽ=ÿ¦*SŸ›Ìö{¦¤K²à~»£2yZë8½ä¦gQÆhuâѶ‹3‘b/ÙS„ê&Ž‚“I¡ÉSF+Yþãõvfµm…Dìt™#À–ÖR»vmôéÓóçÏO(ƒx÷ÝwѱcGtìØÑ±^ÿþýI ¤¤¤àÞ{ïEãÆ…zO>ù$V­Z…úõëãĉxùå—•¶n%`ëÖ­ÈÍÍc ™™™¨W¯žVtª[·.Ö®]‹~ýúaçÎhÕªV®\‰»îºËhë‡~À€pÏ=÷ˆQêƒA<óÌ3J[D§RXXˆ‘#ïÄ÷ߤ¤$_ªžV­ZE¥®4ß;Ò×{upÝ·o_¼øâ‹Òï«U«†o¼ ”2t¯ïUÕ³‚9èU¯^ƒ ÂÀ•`°fÍšxöÙg1zôhœ 擼%ŒŠx°úÀnò=é Ner!†„\YÿÄgÅâÌÊ_´Œõ°®+IóoYû,8÷ð7 È‡ ´ì¼<6%Û¿ '>+°³4×ýK¤^w÷¢q)‹<#²Ã;~¯óï–«¸Éx‚³ß$GºVj ˜ÝÖ—Á Ho`¾R½zõ0bÄ´mÛÍ›7Ç£>Š)S¦$”./^Œ%K–`íÚµX°`¦NŠU«VÅÔfnn.ºuë†5kÖ;‰¼öÚkÈÌÌÄ/¿üâùpÓŸoݺ7Þx# ]»vøâ‹/û94VªTÉ´ÀìÙ³1lØ0Dâ•W^Á=÷܃qãÆmôìÙYYYxõÕW£»»Fº¯išRde2-Z´ÀW\§Ÿ~*æ5´¾×©Üwß}ؽ{7–.]*ýþÀèÖ­›ƒŠœ¯]-%Ð@Àè§J2xèÐ!\sÍ5ؽ{·rù;vì@q”Š+bîܹX¼xqÂ%Ò|ÉÈÈÀí·ßŽ)S¦8nˆ5kÖ`ß¾}oñ¦ô†· 6™z›¯³nÝ:ìß¿_ª¢:t(rss1jÔ(Gz™?>n½õVãóÓO?ᥗ^ŠÚ#}âĉX°`,X€Ë.» £F2þîÕ«—Q/55ÕvÙÑÿÖi4õøqêf2ÖzÂMZÖ^4 ªbÅŠ˜5kÞ}÷],X°@øÎë8¬B'З––†Ë/¿ 6 ó¿êÕýÙåJo)†ñÛTm^A('µÐ%„ª1»©Ô쀼¥˜ó:ï~10뢚èp=¸ðL°Ï‡S¤™É‹ÌœÂ­¯RðëIÈÊ™¼ÐªÓ$æ~ùPH…)¼ÒÈI¤“·Ð.‰Èø›,!dªgRôÝ[Àtĸgm@Òú^}59@)sÜ´îOò ‰v6Í<™«—ÆRzÓã´d†/ qaЉå7ß|ƒþýûªV­ŠåË—£S§N¸êª«:–-[†eË–¡cÇŽ˜‘?Eø¯é‰ Võ5òyçûåMdm:îˆicôÐ9ÑD6ß½$µvÙ7ï©-³gÆ4¹Ú[xmHòµŸwŒ"[ˆ%ôÚ."¶Uò†3γ_©Ãüõ×_1qâD\yå•ÈÎÎ.6ð‘——‡áÇ#==×_½c]Þ¶’/gΜ‰ê†á87n܈ÜÜ\¥Ärøðá7n&NœˆZµj¡Q£F˜0a‚´Ý)S¦ [·nÈÎÎÆ Aƒ …ðæ›o&xfÃF3gÎDÆ Ñ·o_ÃNÐ ÃUÆ iî»ï>Ìž=ùùùžæ\eiõX5žG$NN1^TÞVeĈÈÈÈÀ„ ðõ×_ã믿6âš.]ºóæÍslóƒ>©7²Ÿ~9•ƒÚÂèè*kÞ‹\Z¯¦ÇzÚ#"i=?EÓ4¼öÚkhРú÷ï/¡SYÿjÔ¨ùî¼ÙÊ‘R täèLž<:t@Æ ÕÍÄÓOÄ# ò²û„Ã'Î4' ¬ÀT*ZæûL]W÷ðPÏk{Šz~ʳÏ>‹N:¡[·nB´ÕxOœ8põÕ=<¾×Ûnò¿3r±‰gFî"1”IYöR–cÛÇÖZcºeå± K)ÆÕýJ.eߥïa.“C2i¡ýÝr+@1ײMºªtq"›4/îgœSh ÖžI†BÈr{}^¢%´CnÒu.ç8ƒÍ‘7×àã[JUѺÍvÎ;ìØ/óµíO¾mYzG$ÜŒ$HqXãÔºY°Ê~¯vð±ú2ˆ¿aL~6…À'á2€åo¼¼¼<|ôÑG€k®¹#FŒÀ‡~ˆýû÷Û:ЩS'|ôÑGعs'š4i5‘O›6 {÷îŦM›ðã?¢mÛ¶¸óÎ;qäÈÁÁãwÞÁ]wÝ…ûï¿K–,Áu×]g ?”ȲqãFL›6Í¿"“´öìÙ-Z´À™3gpóÍ7!ŠTRËaÆ¡iÓ¦‚­\,ÀÑ  ;wß}7ÆŽý š4iY³p½-[¶Hרïõ•xÖ>Œ=ëÖ­ÃW_}å,SSSññÇãwÞÁ?þñGÀ³íׇÔÔT¬_¿ ,0Þ˯ýÆ&på•WâÞ{ïÅÌ™3'—?þñHNNƪU«pìØ1ôë׃ÆôéÓqüøñ˜úÌÓ‰õv½xñbüú믘6mƇK.¹þóŸ1kÖ,A‚_Rõ¼–G}wÞy'ÆÆ‡µ¾¶uëVüôÓOÂ{_yåŒ7õ.¹þó_¢~ïë¯¿Ž 6`íºµ€Ý{`øðáX¾|¹ñN)è`Vd!±UãT²#ÃMK-ÄâÓ3®™WâSB¡çÍ΢¾‡20pbÅÔäaŸ“§ …GŠîˆà%ŧx!dNÇ¿ ˆ&%`!Ï}‡àͯƒ~·9°J«J]š+Û£:]ÓŠŠtçÓFÏ Ä’,µ9¼¼OpŠÑI$4ä=í¡Zæb7ŸrŠUKÊ‹ZMn½ÈXÌlá%æDÊ~«L5lAà%”)ü† únz®›âNXž:u wß}7&Mš„ÂÂB¬[·O<ñ„ÒN·}¬_¿>á¡!tPò¼Sc<¬AÑåÜó/ÌLðQœ °hZÌé tÈ΢z$18`P®:ä%eÒTˆ^kfª2mãëÛœ ’¤Ã yÚe‚èÌ·ìÓz!6æïk¯}f=«âU2/?m<¥ >Öy·´QXT(Ò¾C¸+h3æ ©A.¿çÜy¨}É4NLK­·Ÿ2j¶¥{Å i( À˯¥¸‡˜ÔŒƒKiI©°²¬>’ù%ÓŸJ–˜Épw# ˆ²³TÏkýêÕ«ãšk®Avv6þð‡?`̘11J?©äÜB*¹©¹/Dðïwn¶œÊ€·Š\´^Òp‰·oQ ¸XZ…ĘøK¤6Òë°OàI _,‡n¢%S ŽìN½e’žÔ½¶ØA–ç `ÄÀ4ÄÛJ›I§Lb!`=&¬ a„‡©RåÆ&oÏx0µ>?ïâ•å¦b'¯¿óp«²&Õ&?3Ã8Šxš€¤i„ŠŠF2ýtyÚõ›j‘™!¸ ·Åe–96ëZÇ8µ:¸F.Ž-–sFv®ª@¥UZj·›äe„ï#`Lzž !˜˜_oqÓäB–ÝšÖÑ*Œ×4- ,C¶Ú*“X_iÒ¤ f̘C‡aîܹ˜;w®oÓ ðñBÇ*eL$8Œ&£Š“¤Ïk_ã'‘»p ï?šïQIœO;ðr6þ‡Ç«Á>9D¯!¢¸Ð«iðÿ¹‹Î~ì Ky–[¼wœÎ‡p‰Ì²®F ›d‹ü#'±1g|XZO$æaŽ%KéO¹½¥­SPeZ(æÇÀä{ÖúÓÂÂB€B0h`ÚËËlP=f«’Ù8 êg‹ˆžÈ ,-A‡ ²“£ŸmÆí âëóš('‰¥ˆ¼IböÅ”AâyƒE²è|¾Úµ!z¶¸êÙ™Ù@ˆÊ€å#•Ù:1Å-ÆbG/pòô½ßBÕ¿#O¢¿Ýâ9úMIKxP »ô_¸>Ö±x•|ɃQ“ãœx:¨=Ù xÃ6^æ×*1’¿E¢:%(ýz|nP¥X¾íÜ.ߤ~ó,•4!³9–„öq$:/‰[B!š¶º£’5d‰µXªù ßO¥ZL)Ñm–Å`ìö¸”DnüÒ9å¨J«HVo1.¼~–_Â-hŸ™{ÙÙ†S>OcSS Ë$m0Æ Q$õ¹+°LÔ±U̇oÜÔº^¯£î»ÑÍnQ•¬4Îm¼AL)‡û€x%é’]Rh01æÀÌ%Ók˜W\æbÏêp…—: ³8x7+ƒ˜XEÞø«ß>ò ØÑ®S’lþ%ÌŒ8ÑË‘ádê {f͉ޞÌÃû=dŠk§œ$ÿÅ…Ü‹ŠŠûJ\Û.¦äx–XCóx;ËÅ âRUµ‰‹e)¥Mf·{—šY~C²pGœÝ#¯jv3U““d逷‘ÒoÂ)³³^¨ëÇtsë5‚´u)g€1ö×b¹uúMš4Áùóçmù€ \܉Ö‡Þž"œœl9@ù¬0² 1ü³ * aÆ8vìXøöÀ…é) ÀèÕ)ÉÉH’K+X¾ÐŠ|íóZ·n]¤—OÇÉ“'%óÏldn5õbQk=yÆ3 …tÇYè¥nݺHOçÆá}Éú`¡81eGl½ˆWß”¿K(À  Q£KQ­Z5dff"àÔ©SÆúòÿé‡ÿ_Â@ŸK<ÄÆ£°°0¶s&Aì«iÓ¦F?&S~:Åï£x D¸ô§AÓy Aîã3ZA4êzõê!=='Nœ°í^­oå¦Ö„|wU¼JY¸!·q1y¾Q˜¹¨˜môhРòóó}9°òc¿jC€1 û#;(µJ,+Uª„: |ùòذaöíûQ ¸ßýîw¸âŠ+„cÉíÛ·yyy¶°*±”òåËãøñã1b¦OŸ^jrÕÁþÜsÏáСCxâ‰'|o ýùõ×_yóæá’K.)ÖÐJ#FŒ@rr2B¡~øá|ýõר»w¯£SÊ…#qŒÎ.ÀI‘[OGi‡Zc¿íÚ=IW¯Z…}ûöa谡ʾޅ2j/`gµ·:ç±Z.–eË–á×_ýÿ¹{ïø¨ªíô»ÏLf& H!¡JHâ)!¨T%tH€«€ RD@„ (¨p¥ 6r¹Wšt)’„&%tè…À%ˆ”$@„23ëýqÊœ}Ê̽¿÷>ïø9’9eŸ½Ê^{íµWAß¾}}ƒ˜w«Xy’w?ýÔÓhø¤X‘ç^Ù=\¾|99xù§²XÖ«WíSÚ#44¹¹¹8q"»¨k×f³aôë¯ã×_ÅæÍ[ÝŠjl°ùß)nªïìÞµ 111ˆŒŒDFFF½þºWÜ–ïå6¸ùáš‚ë׋0tè«øç?ÿùÿ’LÒwlÔ¨Qxã7€€,X°o¿ýöÿDãݾý'\¿îGÚdØfÆ_sy¬–œUœùãâ.åŸäó _¿~/¼ð¼Î²®M;¤¬™È{”¹·~ú;?pá^@u{dà›®[Œ©©©X½z5jÖ¬©èÞ¬•Ðä[U»Ü ƒÀ¥È$¸‰ “UpQácÆŒÁ”)SpôèQܽ{‹-ÂŒŸqIµÓÒÒðæ›oâÔ©S¨\¹2ªU«†’’¼öÚkX¾|ùÿo¬?¾î™•€~øQQQJÂðÿ·”.oG³{Ó§OǃPTT„Úµk#((«W¯Æo¼7nø~`’|‚ô¿T.õ>.Þàc9ï‘uVÄ©QÄa9pHL—Á÷nž±B`¬ÁøSÎl’éÔ©š7oŽI“&Á,ýŸÛÑK¯¥ ÄØ_Ò ^¼[º§vÇë£FáôéÓ¨\¹2ªV­Š’’Œ=«V­RÚ²Z­ÈÉÉAݺuqâÄ X,%¹|||<®i‹Ï>û,>þøcüöÛoؼy‹Nñ%©U8%þ¤Bé%àG÷m•]¢•Tb7÷Ä ïôUÑCß_%þ¯=¸Ì<Ÿ¨|òÈb±`„ X´h¦M›·Û€€€GîS§Žêqdnpf¬|òÍEI¸\.JMtƒÜ“þˆ¯òÉ[u€q¼§pR£„éJ2’Ïy‹È¸tâ£Ìœß'Óg "?ðæo¬Sý  LWÙ8nUl¿ìª(–o¿ý6†ŽÄÄDäççjÕª%•4»ŠŒŒ åÃ%%%ŠÕ2..ÿüç?ñí·ßbÛ¶m(..þ?SšuR÷– ÕÛ}­/„Ù÷þùg¿_¹‚ràÃÔ9ÙÇ÷222ðá‡ë>ùå—Øºu+š7oÎ Ÿxæÿ5ûöÿN©4ÍP¬¬ð´~(º¾È)þ‡ Ò.ý²6¥82*#¦ºNj~#˜m=[#e§íGÛþö©i@îÜ©“_&AÌ—FA~[RýUjnݺ…fÉɱq±X²x1¾üòKlß¾ÅRMùÞ}ú 66qqñ¸víÀ€à  ÄÅÅ¡ @_¢g8tø0’š6E“&qøÈŸÊ·^#ß~µ8úø¨îW£…¥*r•ð'SN™YfËåcèÃA“1Órœ—i'{ã䌦DHNnŽððp,_¾\)²!nÓ3¿ä-gÑйs'óyè¬xËɲ]n·³biS…‰ÂÂÂаaCäææböìÙxï½÷°dÉC?óçÏcÁ‚Xºt)4h€]»v)LÕ°aC´iÓÉÉÉøÏþƒ¬¬,ìß¿_LG :ªU«†Ñ£G#>>'OžÄ_|ahÅŠ1jÔ(4lØ7oÞĆ °yófå~½zõбcGìÝ»¯¿þ:6mÚ„M›6aÊ”)(..ƼyópûömÄÅÅáÍ7ßĬY³%Z&`ÿþýQ³fM¥c HIIA«V­àp8päÈäääàðáÃ\ÿÞÿ}DDDŽ=jZ.""íÛ·G«V­`·ÛMÛÓÑÑÑ;v,öîÝ‹~ø±±±xã70kÖ,\¸pc–~ýúá±ÇôiÓÊÅLÚ#33 @vv6^}õU,\¸£Çˆ#РAcãÆØºu[¹V ‹Ñ£GcöìÙ =äC†C]Èø»[9Q1êõQ(-½‹%‹—(ïaúôiX¶l>b˜CÑÛöÅ´iÓ‘‘Aзo_$$$ //sçÎå*F`èСHNN†ËåÂÎ;¹­¶ºuë"%%û÷ïÇk¯ÄæÍ?bóæ-˜4iŠ‹oâ‹/àöÏÖj€UÝž;vìIJeÿTúY§NtèÐAjï5lÞ¼›7o–Ú+Æ_|ÁmÕ>|øÉÉÉèׯ±s×Nd,ÊÐ)Ö+†ŠæÉÉp:عs–-[¦ãiÓ¦"#c±„—>HHHÀÙ¼<Ì›;Ëé¨Z¡ìÜ7FZZŠŠŠ0{Ö,ÕŽÊÛœ r¹Ühôd#ôëבذ~¶nÛÆW½bjz4‡ËéÄŽ<þø™¹/.ü÷¾üò+dd,Bý'žÀž={ÀÀ’’‚'NˆJ¥tÜ-+ÃÉ“§ôx¶Xѵk7Lž<!ÁÁèÙ«§XŠ{2ØëeÀè×GãDî ”Ý-Cÿþý;w"cq†^[€ C‡¾‚dúÊtò—¾åWæ`àâÁO=õRSS‹k×®áôé_°råJܼySy­bÅŠ1|84hˆââ›Ø¸q“"ÔGÕªU1jÔ(ÄÅÅáÔ©“œ,SßËãwÇŽX¶ì_€Vý!U¥Uâ“iç­Ç£AÃ(¾ÉË+ùHKKEýúO iÓ&¯Qü§M›ÆáÙ[u3YfuîÜÔãh¶záxÁåráÉ'ŸD¿~ý‰õë×c›viäšÈ/; åV¹t»Ýút:Ξy椥¥!>>W®^ÅéS§°bŠܸqC™§?ÿüsݼðÒK/á±ÇÃÔ©SÁÛo¾‰'N ´´ @DDvìØo¿ýÖ“òGRˆ\.7jŒþ/½$»n¶lÙ‚{÷ïq<6+† ŽæÍ›ÃétbGv6¾[º”ÏïàÓO?Å·ß~ AЯ_?$$& ïlfÏž­l?¿ùæ›8~â8Êî–öOnkôèÑ(--U yD„   |òé'XúÝRE.Œ~ýuœ>}ÅÅÅèßÿ%DFF`­ ǽ{Ð¥$S¹8DGGcܸqøù矱fÍå;‘‘‘èС=Z·n »ÍŽÃGãÀþ8|ä°GÑ•-¸r8y¼;¹¼–лwoüúë¯8yò$ÒÓÓ‘››‹O?ýׯ_G^^âããQ»vmÓm¨Ê•+Î;§Ü¯Y³&víÚ…®]»âìÙ³xòÉ'‘™™‰aÆéÝÁƒ1räH\½zݺuCVV–Î2V£F ?~ãÆCaa!êÕ«‡M›6aòäÉŠõ°V­Z˜0a>ýôSØív,]ºÿú׿…aÆáý÷߇ÅbÁï¿ÿŽ´´4 >‚ (1øä“OP¡BÎ"ùý÷ßc̘1(,,DII úõë‡è Ο?ÂÂBtïÞ)))¦+Åï¿ÿo½õ ¸ö¼UªTÁöíÛ-[D¬ß~û ©©©xõÕW¹U‰ÕjÅ'Ÿ|‚ÐÐPŸVY,¶ûöíCnn.:wî¬ÀZ£F :tï¼óŠŠŠP·n]¬[·“&}Pî•­eÂÕÀÕ«W7ùî‡Ü»©ÝSÑ¡}îšÝnÃðáÃñøßþæ1xX§Í¬ÑC† AŸ>}: ¬¬ )))¸{÷®òŒÃá@vv6&Nœˆ[·nÁn·cÞ¼y˜3gŽBŸÇ{ ï½÷¦M›»ÝŽŒŒ ,Y²•+WÆ«¯¾Š &(F‡]n/·n•Àf³cþ|±=ù0no ßžêhܸ1Ö­[‡Ãˆˆp|1>fΜ¡( ÌGz:JJJ`³Û1oÞ\Ìž=[QåÿŒ>}z#++:tÀÝ»ªœ–Ñ IDATw‘Ò®Jï–rÏ©L3+W\l,\Nqì—Ý»‡‚‚åT,hiêÕömÛP«V-”Þ)Å‚ ±V”z";{&¦OÄ- ŽùóæaÎì9ÐàA›§±Î1îoñWdd$à¿çÿ«<»ùÇÍHNNFródïÛîÚ´mƒðð0üøãøñÇÍèÙ£‡±!ÍÈZËxSY=0uêT¬]»v»]¤ïó1sÆ îõ@G ²³³žžŽ’™O=ôUÓiðàÁèí…¾ÝÞ5Nœ˜Žìì, ø2Š‹‹…#†ãÁƒû¼<8xP’…’-- S§NEff&bbDº}ýÕWظaƒ',R$ȪV­Š¬¬,N¿µbÅ ¼ýö;(((À­[·ðÒK0pÐ ÉIªZåòÜ ]úCÁSáÑŒ3hÚ´iT½zu*++£ØØXJLL$"¢°°0ºrå µk׎c4sæLº~ý:1Æ(44”ºvíJyyy´k×.bŒq§Õjå~ÿë_ÿ¢œœîZ¯^½ÈétRµjÕ”k“'O&"¢Aƒ)×–.]JN‚ 4tèPr¹\Ô´iS²Z­Ô¥K""jРÙl6*++£7’Íf£É“'Svv6Ùív²ÛôñÇS©¨¨ˆBC+Ýî »ÝA©©iÒû •k5""¢-ZÝn'‡ÃA‡C¹/ÿ¯ÙÉn·Ó¾}ûhåÊ•Êoõ©mÏn·“ÍfÓÿû߉ˆ¨zõêCyyy´nÝ: áÚûøã©¨¨ˆBBB”w»wï®àÁó¬Ã°?êÓápPII }òÉ':˜Ö¬YC.\P®/[¶Œ )::Zyføðáär¹(99Ùç·´§ Ghh¨r-55U‡ˆoù»QÊw4|Är¹\Ô,9™l6ñÝÝ»wÓš5k•÷ìvEGGÑÀAƒ égtªûXRRBn·›žzê)CÜ9JOO§PõêÕ•ëƒ ¢ÒÒR #»Ý®Ð§Q£ÆDeee´iÓ&²;4eʉOÅþyÚ«¡\4h°ÒžÍf£nݺIí5âÛ³ÛU퉸ڷoÝ¿Ÿbbj“]âã‰'Òõë×)0(H¼æpPzúDñ»5j(× –¾.öEºîÁËÓJ›ò=î´{¹§:Ž@:}úúæ›oLŸÙ½{7¥¤´W® 4H”%Õ««àH÷‡æ»G ÷·öœ={6ݸqƒŽ@ŠŒ¬L=zô sçÎÑž={¸wÃÃ#hãÆMät:é‡ÖP‡ŽMaY´h?~œìvµhÑ’ˆHâ1-ÎìžS}OyF”=DDuêÖU®{£o5•~<„JKK)<<‚럚ïåg½gΜái§ë«oy””D.—‹,X@*T0x†—¾äPïÞ½ÉétR­Zµ”kS§N%"¢W^yÅpüÊã_¿ááá:™àëäú'ÑΛœìÑ£ýíoóK^û:OŸ>Mß|óé}Ï8JQ® ’Æ‘Œ5^jÔ¨¡\,#/Þd¨Õj%AÈb±Åb¡F‘Ëå¢ùóçS`` 1APNAH°$X,4yòd*,,$‡#Py·k×®DD” \Û»w/ÅÇÇ“Õj%«ÅB&Œ§¢¢"²ÙÈjµP€ÕJ»ví""¢¶mÛ’Å"Õj¡—_@N§“¢££¤> 4~ü{ôàÁªR%š¬V‹ò\ii)…„„(:ˆ ÊøHJJ"AEýÌÏ?ÿLDDqqqʵñãÅþY­VŽ]»vÑ?ü ü¶X,ADD/  ^SÃñì³ÊsˆpDEE‘Åb!«ÕJ½zõ""¢ªU«R­Zµ="((ˆ( €, =ñÄ¢ÜiÞœ¬ Ù¬V °Z)Àj!{€•lV Ù(Èa%»ÍJv+9,`Èf(ÀÊÈ&v«@‚lñ¸rå :wîŒS§NáÂ… ¨P¡àÎ;øå—_ÂmåÞ¹sGنܲe :vì¨[µÈ«A›Í†¸¸8œ9sÍš5“ÒñˆGJJ Nž<‰«W¯*ÚïÊ•+9`‹Å‚.]º`÷îݸ}û¶beüñÇÁCZZ‹EY‘ˆÛ .\@^^c¸xñ"êÔ©£,ñ-Z„J•*!5µ»gÛµ?8pgΜQ¬yçÎáúõëøÇ?þgŸ}ž’PüÊÌÔOAs?//EEE˜9s&Ú¶mëÓO"88™™™8rä^|ñE<|ø»/Ñ––¦à¯ÿþ8¼l3ùJs îOii)Ç;wÆîÝ»Q"ù”ÀÆÁC·nÝÊm¯ðÐ#•Ûá8«¬ì;uê$~·¸D rÙ¸AünwÃï’ÞôSŽd¿Z¼äääàèÑ£¦ÏwïÞDtt4‘€K—.!88XÁ‹ŒÖóçÏÃívãÂ… 8{6 ?_æS±ÏÚöqéÒoJ{êþéÚc@~~¾Ôžç8|ø0®^½ªl eff"""ž|RG7Ïw‘˜ˆK¿IptíêqM" ^ÈÔå×Î(30Õ™‘©¸¤?ïýYù½#;‹m¤ #zÔOLÄï—~—àèÆ¥=ò÷ÇõëE¸ví*Ö¬YƒmÛ~B·nÝ9Kßݲ»øûóGjZbãb±uË>tIII\[‹Ý»wÇÆ›8ÚôèÙSï—GÒ8yw6ÌÏÏç¶9ú’–¾QHHL@bb"~“øªk×.º–EúóøCúK×rùòyìØ±#A@FF†×T@:uÆîÝ{|Ê¡víÚáÔ©S¸víšbaYµj•nŒ+üR¥ŠÈ/õëã÷ß—ðÒÕo"Y¶vîÜ»÷ìFÉ­ÅÄügä¤Ù®¡zž1 1#\II öîÝ«üΖÆQk/ãH”C—¼xÅ…À X Ý:A|ûí·xðàǦø³Š#òÛo¿EXXzôHã¶Á÷ïßÿüç?..\¸àá{ư}ûvDFFâÉ'q¾åÅÅÅøùç=ʰÊÊÌ‚ÅbAÛ6m%^`HMMENÎDEE#A’¿Iò¯{÷î:\ïß¿GÔî+óé… 8—5¹7– ܤ{]«[ŠtÅÅÅøyÏ…ß²²Dºiõ @ôïÎÊÊÂáÇѧOüñǯÊzɬٳñÜsÏ žP’hH iûÛSþÑ"°XXäT‰Ò B… (++C\\®\¹@Œ\¼ÿ>\."##ñ믿*ݾ}Ï?ÿ<—Ë…¼¼<Å|­6WOœ8™™™¸qã¶nÝŠW^yEñ»^ëÖ­qôèQX,Ea,**âË * <<999Ê»‚ àú8þ˜ !þˆ‰‰ÁùóçAD AXXrrr¸g®_¿®Ð£¼‡ŽŠßqÛEááá8pà7 ]¿^¤â¾øm,_§úÈÊÊò*äcbbðÌ3ÏààÁƒÊ¹uëVѯ§qcåy·Û­L˜"Ÿ^‘cN…OI»Ø^ŽrzoøöÜ.ß“B'5OœåPË–-qìØ1U4:áZÁ5C9'óKŽÂ/"^š4i¢_€{©0*ÊÉ9Ž®_¿a('%§¯¿Îä´?DÐùz8p€ó]Ö#ž_ŒðâkÑ(0A æ!"ÄÅÅáêÕ«ÈÍÍU‚œ˜ºbœt\¾|7nÄСC•ù­[·nX¼x±î3Çç˜P–k­[·âbúDx=+àû’k…ÝaWˆS-Z´ÄÑ£GqôèQ9zÛ·o‡ËåBÓ¦Muy^ðäêÔ†cÇŽq¿sssát:ѪUkÓù˜i£ÁT?=pˆÆ.ÙEÄn·sϹÝn¬\µ qqqظq£.Æœ¢uëÖ(,,Äæ-[ð˯ÿÁð#$½°(é˜ý-òŒèwl‘¶ÀåÒV¸téjÔ¨}ûö¡W¯^°Z­hݺ5, ¢££Q¹reÑ’yœÿeçã-Z`Ê”)Xµjç¿ñòË/câĉèÕ«~þùgܾ}£Fœ9s8¿Æüü|Ô¨QCIÍ#ûªË{÷îáþýûŠŸ§ül@@ªU«¦8r«£â|ECÀW_}…Í›Dll,Z´h·ÛÕ«Vëd^^þþ÷ç·ßƒ3f 66cÇŽçx ­WÆsçΡW¯^xüñÇñöÛoc挈‹Å¸qãtŽÏkÖ¬ÁÎ;ñõ×_ãüùó†Ö2ŽÍ<«Wûµâ5S2Õ÷ä`®~øA B¸{÷ïßGLLŒÎ¹[Mò<-Upb5õðg”ùûÝÇüO{‚i¥6¿¸¸û÷ïGïÞ½ýÀ½G]!]m@q Ší0h” Ú㿤\Tûzî…„„p¿«V««ÕŠsçÏóp0ø.™áå¡N¡T¥Bó;ÀÃ|üê#*'u£6¤*=˜ïò¾ü!eØöÓO``xæ™g0iÒ‡øá‡5J€…: ¸Úâ7dÈ?v ]ºtQ¬e={ôÄ•+W¸€ÅjÕªãõ×G¡aƒ8‘›khØÓEc«@ Ñ­X­Vœ;w^yΜ¯`T/Ò×ÜÒlBL}{LíjR2T²¢EDD R¥JJ‘-oܽ[êSÉßÈÏÏGµjÕ8šT‰®¢ó,..ƼŽ_Ãê'‡,¯üéŸß¶\®N¯yö£>›îÝ»gšeE~VG}úôydÙ)ïTºÝn””” 22+VTè«e¹O .ĶmÛ‡–-ÅyaÅŠºþ†††ªR 1T«*ɵsç¤ñ(¨ä†~ ©wdx{õêéIê.uO»c)ëD¦<"=£ö ǹؿ¼¼³^ñæÙq"®T£Zþ‘jühÈAÀêÕ«•`¡sçÎñÖUi~8——‡^={">>ï¾û.fÎübcc1~ÜX±&E3O5"1¹Æ žˆA6ÑÖ¯_»víÂÕ«WqñâEÄÇÇcúôé8}ú4~úé'©¹Çª&+‡“&MaæÌ™Ê¶µÅbÁèÑ£±fÍlݺ¥¥¥=¥íµb™••…¦M›ê¬˜êÃív#77-[¶äÖ¤Iáĉf¯ÇŽ;——‡ÔÔîHMíŽ5kÖ ´´Ô`ñ-^É;—‡#F`Μ9èÓ§Tp‚iêî0óúÞê§ùsç0bÄk˜3g®4`õQK—.Ezz:¶oߎ~øU«VõG*RSS8þŠÃb±`úôép8˜9s¦Žꃣ‡ßâ’™ÀÑ]ùæé8sæ ¸¯µjÕ ù¡nÇŽCJJ ‚‚‚ü WðU2úØñãHIi‡ à }(‰6œAЉ¾Â ˜˜¨X1š%5ÃÇ•Œ€ôÝvíLà06Où»3êÏQZZŠàà`@*z¨ƒ.´–R"ïU'UÿðÃADøä“é†x×.1 À†ÔÔîX½z5fÍžY³gcöì9˜0aJJJyYÞmf5} Y³$}%xŽ“øÊ>õ,xws0bumõPÊÍÍE@@Úµkgj+ÊÌÌDRR׆vž‘­^íT|ï3Y·¦_Ì˼%OMšŠýË5Z4h¬—êà¥rø¨Ç‘YÅ3,¥Þä#ãÁ£ ä9qâо}{œÒ&“šŸ={iiiHKKÃêÕ«uócLâ{‹Ò$‰ïwîØ©3ù1¦²’ÈÕcÇŽ¡}ûö 64(0’*×¥7õë×׌KQîîܹSéÝ™3g˜ÀÑWæS…‡L¤"ASÏ[õðwß}‡ñãÇã§Ÿ~ÂÚµkQ½zuý™‰[ÞçϟÈÃ0{ö,ôéÓ.·”žà¦3ä1›r‹©‰1¨k×®ˆˆˆ@Û¶mѾ}{´oßü1Ú>û¬¸U+mUkË›7obÊ”)èׯÚ¶m+^·Xp çš7oŽ'<øøx¤§§+þEêh¢íÛ·#<<ß.Z„„„ôíÛÆ Ó è?üõë×ÇW_}…'žx½{÷ÆüùóqîÜ9|ÿý÷¾–Î~)ⵯ¿þ/¼ðž}öY,Y²D·‰×ºMk¼;v,Z´h°°0$%5C‡°~ýzÝð@DDl6.%·e ömÛcǾ‹-Z",, Íš%¡C‡öJ{Z¡!®Aƒ£  «W¯F`` B-Æ_§V­ZèØ±#^ýuìÞ½ýû÷Çøñãq^²h&Mš¤Ð£~ýúxá…8zxÈLgÆùá믿FïÞ½E8¾ûN‡ß| k×®E:uðÚk¯¡V­Z6l ô—Ï Z±4yÊ‚€µk×¢OŸ>¨W¯úöí‹™3g¢R¥J“’÷‰yŠÜÞš5èÓ§7ê%ÔCß¾}0sæLT¬XÉåU¿Õ[¹re,[¶ Í’š!5µ;&Mú999¸sûŽ¢`qßíÝõêÖCß>}0sæ T¬TI½N6¡*Óç@.DZqãF´oßIII A­ZµÊßS&УO_Ìœ1•*VÒ¸ÞúVI¥d®_¿Ž?þ}ûöE‹–-”ë .Àøñï¡}û$$ÔC¿þý°pÁcÛ¶mO?ý4¢££±vÝ:®±yófôèÑC_V\Ö…5eÕ‡BßfÍ––ŠI“&‰ô½sGi@¡ïZ‰¯êÉ|5•*V4æIfrJ÷l6*GFÂjµ"88aaaâDʘéÂGk’õ§Õ«Wã?ÿùfΜ‰>úõë×G›6mðÖ[o!22Ryî£<ò Aƒ:y Ë¡ÌÌL„……áÛo¿E½zõЧO¼úê«:9%ãeÍš5èÝ»·òìŒ3PQ?˜ÕŠfŒ)}ÿòË/Eyõ ˜?O/¯þÚµ®Gžú3ŽÈ[l?3ÆKݺu¼TªT‰_œixV¬1-"‹I%W¬X_ý³fÍÂÇŒ'žxmÚ´ÁÛo¿­dYÐîfõéÓÏ=÷œá68!** ß¿ÉÉÉèÑ£&4Àí;·U†kŒã#>úèC‚€7âž/¢^B^|ñEÌš5K‘ãÌÀÂJD¼‚§ðQQQX¾|9š7o.öoòdìß¿_U^R,®R§n]Œ5 1111blº¸Rqµ¾+K_M¡—Ë…—_~………X³f =‹„¶mÛbìØqh)é%IIÍбc'¬_¿N²†ò mþd·Û-.œåk«•¬V+}ýõ×tüøqŠ‹§›MŠ®uPbb¢¹,ž³fÍ¢7npÌAAAô믿ÒéÓ§¥¨e5hЀ233éáÇät:iûöíÔ¼ys"" â¢ÛÞzë-ºsçP×®]éÂ… ôÊ+¯pϽð tùòe""r:”™™IqqqÊýnݺ‘ÓéT~Ÿ8q‚Þyç²Ûí4pà@ºVP FBÙÈf·‘Ýn§èèhº{÷.ååå‘M†ÓnWþîС#åääÐÝ»w‰ˆèÊ•+ôïÿ›bbb¸¾½óî»dvŒ1By®cG}{ßÿ=ÅÔ®í‰ü´ÛéùçŸ'"¢Çj=¦DÖ®KW®\¡Õ«ÐE'ªá(oD¶š–%%%DDôàÁ:}ú4­ZµŠ’’’ ßëÝ»·Wzh#8Í¢‚=Q·%Uó¾áwããT³v ¦™3gÒÅ‹3æmZ²d ýñÇDD”››KO<ñ„Âûr;O?ý4:tØu´¼/ÁépPLíZ¿~½2NŠ‹‹9úŠQÿktc€ˆhàÀÜuŽC^àPG+;ŒKø›5KŒ —ïÛl"¯yä_(ÙíZ¼x19s†œN'ýòË/4{öjÚ4Iió‹/¾ k×®IÑÚv¾^xˆˆš4ib<†ì|äº,;öíÛGÿüç? é«—þÑסЗö $»jÜ~ú駦òïÅûi¢ë "‡ ®Õ®]›Ö­[G÷ïß'"¢{÷îÑá#Gè±ZµÈáðDEɃøø8.zÚn·Ó˜1c¼Î3òsÞøEéŸÝN?#´ûoølÏž=Ũþ:uüŠúöuÖ®][7Ž´QákÖ®åð/£Aƒ)üèðrø°/•+W–ÞåqÂã…¿gµZ©F´fÍž¾‡SõêÕ¸¨h92úîÝ»töìYåš:Êü矦ï¾ûŽ2228¾OHH «E «U «…víÚ)E]Ëï ÎE]Ëí6kÖŒ<¨À{ùòeZ¿~U¬XA‰ìfRTøûï¿/ýfžÈvMTø’%K¸þ8q‚êÕ«çi‹1²ÙlôÙgŸQ~~¾òÍvíÚÑo¿ýF/¿ü²ïN%zÜJ‚ÅB‚*züå—_#ãUQá5jÔP®ÕªU‹._¾L«V­¢€€²Z­Ô¾}{^/¹|™þýïÑcÕ”"Ã-d·#ÀsÚ›ÁÁ©†Ö"ˆŽ®¢EüÙCÚ»víªj[Ô ø§ì”äcßÔf³!??_‚ã3¯8ôVñÇ›ŸÙ½èèhܾ}[GoÛ+ú<ÔIŽ^êGGGùÅQQÑ¢ÿ›Y[L»7í­X·ÿ˜ƒ‚‚¢O"ís‘ ób¨j¯Üu õp9ãÆšº\øí·ß¼öeðàÁJz"£ïªß¸Hâ IDAT»Oá{’*Ð(ÛÅÌ¿ÁƵWV†{÷Ê$¥©CY·ìJøàÁÃZZx´ú33Sž€ACÜȈ¼|×åváêµ+ªœ*ÒKÂOöw»Ý¼®´ð`¬ÚA]PP )7剔â#Pmu%×0-Ïåû{ú™Ëx°ŠhŠŽÂsÏ=‡¸Øx¼ùæHOŸ(®Œî ‚´ «šÚ&Y#ñgJb ñÊQQh÷ÜsJé« &H©dôbÜ›rék¥íŸòg%MJQuo¢¢$zÄÅâÍ7ßDzz:nܸ®Q&üž}u|Aê¡‹¨%ï“¡šH¯$ÿuŽQFMÒ#(rj‹š6Ø„LûÏ|MòZ¥’ü2Šú@™XkËg}e Oi=”æ÷Ì óÆhøKò°V9XÏŸq\™Nªho£ª˜åµ¦©3”·/2'¨'Z~Aâo!†òÍ” `ÕV¬ùëòs`Ð#2±÷9F` V«N§S5/€³Øµk×qqq3f Æ¢¢"FY$8wJâùÕX#P×z×[óä]5û$›ãª;)«¥»<§ñ¥í9‹£âç ³š÷L)q,+áüXD%?R˜T'ÜM·œVЬF+–¹z“äO«zzÓeP1ÝDÓ”ƒ‡©@ð×BcÞ;†°°pŒ9 …5jV®\埅i”Df<˜ˆ´Öj3EÆ`4ý†……aäÈ‘(,,ÄÈQ£°rÅJ˜*={„Ñ0oyQâ4>y ‚¼(M8dz¬ÔÑ‘Óí¸"½Ü×LggõjŽL·.™oYÉ¡—y;å”ͦlá/¿OÎ7²œûî ù¡M‘E˜ÌùE}ß ÿó ½‘ÞΦrÌ—:f%ÿþ3:=Ê <ä/^4´ÜyS.yÂ#ÿÛòf¡ã–vD>ÔD#OþYÉÕìLj+¾'?(3諾¦üŸ“¡Fed}·ÎÁ›µÐxZd>IòsV6OsT^ÄÈV_Áb‘ʸò†€°°0¼þúë(((Àˆ#°|ùrSEí·ß~S,|Æz ˆ©¬°ò·ÈPQ$κ§vIÓ[q™ЦÜ?³q <žÕéu–dCÜó‘ኂ¬ÖŒ‰8Þ$ðˆÄÔBÊT € ¤DÁ»‰`a€`à&>ã¯=Îìv;yç1ï3¤±¯éü¬Ü"òÏ.ù¡ä{ò|„ù^u0ÿ YåúdŠ+c?-8'cs¸!Þ|È´LJæÂÊêÍ@ÑgåÅ“±r§U%ù;jng\ygÿ©Áü5³—ßóOŽ ò_)c¾Æ¶:1˜X‘½á|Nb^ º-nE–kÖÌê¶Ïð—Z¢}›¥Õ„aº°}T«åÿÝÁ[üÊ/ûÊg2WÉ “E˜7¿³ò(ß¼Uô5QÓþå3•ú‰YÓ„³Ýìì‹óN'—¤Ý…[›–ÈœržR£-l Ë;³¤ZøíÔêSd1ÃüÕFý2²ä- xÝbBQ!˜b•T÷×8Š[Ûñ·Erí“K‚ˆ3"‚U€b™¤tBÜ2i'ZVê­¾W¡äƒ°ÚÙÝxuGZÅSc·eZðúó®vu¢×L¸mR2nÃ%…|ØË‰©?@\j,ï‚TNãB>,6Z3â¬Ïœ[seÜ@Óæ¬Ñ ®|m£0/Ö5Ò 9yëŸ362oÛ·zíŽ= Ûø3w™ù×’¿‚ÿQ&c¿Y¦]­þi‹˜¦oår0‚Wº3Ã~ò>¡Üð`d xù#O~!â™DØÿVwüÿœ÷'­’1lž O“‘Qe7¶ê”o¥o,éOÂn,0ˆ¼›Zþ²E {ùa ²h ÝÞñ_Þwßë5ÙßÒ_×oJ¿±Ï§`2˜ŽÆ|{Œ£±l4Ö+¤ä÷˜Ó*‰d:¶ˆ¼õQN)äaBf‚doJ¥î[Äÿí&7ÆD¥Ò-~WPt$I~KÖTFnåë×®Á®Ž.õ©ªÔÓ$U§Då,e>ÒÃ1ÅAëOâÍ¿Dé#ãqå+=—+™LŸÍÑF£GM Í4z¸!ûjÛìÐ\›k-Ó"¨sÊ«OZ2⟥ÈÏÐtzLæ:»¡ø7I›®Ì3xƒ©Q{ÍO4›u|)’ä•ÑjÖ¬*UªðyQÆ=÷˜;ê?©|ßßyý5ó ?Þù˜ia^‡4™ð—_Œ–ýß+~ŒÁ§[ßJÛŸôµ«Y³¦a±£$ÚÚ„Ú"Џ÷•¤ßž{uþV+TÐ)ƒ¤*'ÂYŒ4s”’…„ºuë"¶vm.5ó§_´à­K šŒù\ìƒ[ÜŒ1Ô©SÇ0/¦ÿrˆx!®9kÖ¬¡¢/•«iÒx±±r8Q1­™ƒióˆËEAëN?ê¸xì±ÇP­Z5ŽnÜbÒKE<_ÖDEá"£çÍíGåñŸ5Røe~fŒ¡nݺ¨P¡‚7´|kôÛœjòòò““ƒÓ§OãÓO?ÕôS ƒÖòHÜäΓt:0vbòЀÊÁÁÁ8~ü8ºwïþˆ 3^Õ#ƒ)`Ñ¢ |þùç~ð3ÉF‰Œø˜é <ŒSNôƽCÞF,Ábª3x³Â-Y²sæÌ1QüÔ™ ”,õÅDá#i1êÏQ·EmëÆ‘AŸÕr%88§OŸFZZšÖʧYpñXó?xÎȸ,Y'%eß%E€+Kv·[±œºÉ —Û-Ö'yÔënó) LŸ#~ð1Íœ"·1vìXäç_À—_~‰¦M›àã?Æï¿ÿŽáÇëåÝ1œðÖ[o¡[·n¦“LJ~ˆgžyF§$˜u^[nì‡~À™3g8ó´¬ÉŠF§NñÑGz&Eeé·k™OT—'e‡<Ì ,¶¦¨oþ·VAÐlé/¹…µFÈÈÑmž ųúg¦¦VŽà2_?¶.~9¤R«ùêÒ€ÆÂªS§Nøè£4JƒÞhÊLíöFŠ*371ƒï2–F³5‰ÙÅd¸0/,C¡Æ` Pn{§Ï…-Ոϔ‰Ôoÿ¦ôoòäÉœœ2Ú4Ч/Ë¡,_Õ÷;wîŒÉ“'ûY¾Êò-uÿù2¶^”R‰‹öõFO ‚|Z­VŒŸ0+V¬@•*UV ~8‰Ç³©‘Âc˜F^›° šò[Ƶ–x¦é#/bE%à ñé"†#¦5Ü”ZæYtéðª þeF¶J¦G¹ÌA‹ 4hëÔ©¦L™ÂÑQ[ûœ‹ž×ìzjÝ+ ±åPì}ëD‹0:ß#3†Sýk¤3¹%eP·ÝÎTÛðªÒ 1Í¢l©%XÇb 0À*°0AzžÜâ;Vµ¨Óv0Ót9ÆH»…m°‘ÉÌgÅ‹cûöí8qâ„â¼›žžŽqãÆañâÅþ'A'à¿ÿý/j×®múHµjÕp!?úbŸ µŸŸ¤…ïÙ³G5úH¿e sçΦ×8ƒÛ0¿|8õ9Ì/k£·â¿Ø3‹„÷}nnó–ú¯PL“.éíÅjK4ñj2)<­&"¿ZìÔ¹³8Ø4ä`>1A~*=ÆÏtîÔù/OIB^øÅ4¥#ñhbd’î `¯õà‰oVòbH>«¡ò ÁiÔ?CBÕ"œÈ÷N·/˜;uêäóNÇþ¼ù¡ˆú¶cªiåœ^b¨•†ääd„‡‡cùòå¸OÌ=)æ ,‡`‰Á’ÓG‚GµyéÆ9­ŽÌÌàÊäË~¤Úa¦¥_õß°Z-xøÐÍ]ïÚµ«©¯a*'ÕAàƒxý‰ècL—sÌzKj ²Yx"©Òw1æñ•T÷ƒkÓíý$Õ<‘[T(¥-q’|(ÝD°‚Ø&¹E %Ë:º%^µªWe:ôU$''ÃårbÇŽX¶l™‡R·§M›†Å‹CôíÛõ——‡¹s碰@L,X4xâ ´jÕ Í’›áÌ™³ÈÎÎBNNœ=ÕŠŠŠtU)Ö¬Yƒ÷ßuëÖÅñãÇý&øùóçñ·¿ýÍP,£bÅŠÈ¿pAyÚ´iÈÈÈPàHPÃQX¨éƒ>@DDàèÑ£Xºt©jKË£P6nÜiii(**ÂìÙ³•{cƼÍ1¶ˆç¡Hnž —Ó‰;%<» ‚¡È»J(0 Jxn–Œ3gÎ ;;[ij¶Jù0£GFî‰(++Cÿþý;w"##CÙ’’6/0mÚt Lƒ¿yª¤é„Š+bĈhРŠ‹‹±qãFM®TšŠ+¢sçNèÔ©3<¸»wïS5ˆÛvþÒM& hñ’…œœƒ ^êÖ­‹öíÛcÿþýxíµ×°yóflÞ¼“&}€›ÅÅøbþ¸}ç¶®0Š‘:,‹óÎ;£IãÆèá•Ä].5zýúõCDD$6lX­[·r‰ŒE8xÆÑÎ {G¶‡j‰ü×ÈóÔߣ¬þO=õRSS‡k×®áôé_°råJܼySºbÅJ1b84lˆâ›7±qã&‘¾*v~}Ô(œ:}%ÅÅèׯ"##±~½ ï}¹‘hß>­Zµ‚ÝnÇ‘£Gs ‡ñs¼ñðúÃ/£FBii)–,Y¢¼èp`úôéX¶l9Âiz¼œVáèÜIäïýc ¼))íx=ŠàÈ‘#åSGйS'/³fyÆÍÛoórÈåráÉ'Ÿäè±mÛ6]"mE^%'ÃétbçN~^àszÛÅ¢jÕ*5jââãpòä)|ùå—Ü.c ãÓÓqóÆ ,X¸Py=22&¤ãÇDVVѽ©~ýúhÒ¤ à­·ÞRj/OŸ> ……E^&me€E°à iÞJNnÆËÓ‡NÅ28jä(üòËi—Hã76l0Ä_ÕªUExãâpòäI¼þØÆôB;"")))&üâY´¹\.4òB_&ÍÓõë?Ö­Z¡Y²('wìØ¡š?<ߟ:u*gˆó~Ÿ¾}”q4oÞ\®HF@@^yEË/ÿà6uPÿƒ ˆÑÈ]ºtA“&MУGaÞ¼yÊso¼ñ†b…“ámܸ1 €ÈÈH¬]»[·nU*ÉÏ`ذaxê©§àt:±cG6¾ûn©ašÞ0,Y‡ ”ÛgžyiiiˆÇÕ«WqêÔ)¬X±Bª®#¶Y±bEŒ9 6ÄÍ›7±~ýzlÙ²ÅÐ6zôhÄÇÇ#77_|ñ…¡áI Gvv6¾[º”ËAŠRÁ­KóÆ”hn)²›©vÕãV à!¡Å â=…Äl-.ÀMp8‘½'¦ãÖ­ØìvÌŸ?sæÌÖÈ †!C† OŸ>ÈÊÊBûPv÷.RÚµé¹5j 33]ºtAÞÙ<4lÐ[·lÅ+C^ñ9œzõê…Û·oãäÉ“åšÏŸ?¯X,m6rss1ã³Ï@ű÷Â… Î8²³Ð¡C”••!%%¥’B#oéœ;w………èÞ½;RRR …S\\\. ¬ì ”S͈Ž@²wd‹x.)ÝnÇüyó0gölã]N+*ÏygѰalݺ¯¼òŠ ƒÁÐ& GZL:kÖ®…ÝnGDD8¾øb>fΜ¡Ym2 2}úôAvv6:t耻þd…ªW¯ŽC‡áwÞAQQêÖ­‹uëÖaÒ$ý6ÕÁƒ90`¶oߎ`øðá¨X©N>ÍáfÈÁèÓ·²ºÝEJJ;î»<^ò$¼låðòØcá½÷ÞôiÓ`·Û‘‘‘%K£rå( {õU¤§§ónS†ŽLµ‘Ãïˆo&$ÔömÛP«V-”–ÞÁ‚ °víZ/ôÍCÆ ÇQ\l¬” N¬ŒaÆå቉Ó‘¢¸¸QÑÑ1b¸ªjCõê5pèÐA‘¾…2}×bÒ‡“¸-™îÝ»cÊ”) ¼wîhàU}þûïÿ·Þz …())Aÿ~ý1`ÀŽüxãáÕZäq.ói™Ÿ¦¦¦¢C‡üv»ÇÇãÿëßĉy¼DEaĈ\5¸¸X8]¢âïž1È=ü÷¿ÿ…·Þz ……"¼ýúõÀ|¬ „±±qpJ|`ú] 7õêÕãè±páB¬Y³†ûŠÃá@vv6ÒÓÓQ"É«yóæ)Š2¿½o¾C'•*UÄÞ}û0løp\½z ]»tÁÖ­[ár¹§"ÂÑ£GñÏ?GçÎ%Ë1aá‚…xî¹çpàÀåÛ¡¡¡p:J…·ëׯ+ðz+ÿèŸ<=‡ bËQn¨]SSS9~.--5Ä_ÅŠ±wï^ 6 W¯^E×®xý3üê÷ÔþýïKüRÀñ‹ö5}KKyúÊî5%x;Kò¥Aƒؼy3† ¢ëÉÁƒÑ»OodfeŠãH=ïKlà°;•eÄ/³Tæ ÞOÝÈh‘ËøøxÃq®Í ‰‰‰ÈÎÎFLL îܹƒ¯¿þ6làç_‡»wïÆ| ôoÁ‚…˜?¾]BsŸþ>ø»víÂàÁƒqóæMDGGcäÈ‘xðà²#P³f =zcÇŽEaa!êÖ­‹M›6)n2j~ÉÉÉÁk¯½†«W¯¢[·nÈÊÊÒñ‹Ýn×Á±páBÌŸ?OxœœQ)ÆêômÚJž8QÑdÌȬ˗udLô©´‚üè-ØíŽv»ƒÒÓÓéÁƒT½F ²Ûd·;hРÁTZZJaaádw8”³¤¤„Ün7=õÔSʳFgPP0÷ûûï—ÓÁƒ‡¸"õÚsÊ”)TVVFݺuã®Û¼¼#Ÿ={ö¤‡R`PµKiG/^¤Ë—/“Íf§””öTZZJ6»l6ñ”áhÞ¼¹Ï¶mvíÝ»—V®\I6›Mº®‡ùôéÓôÍ7ßxð¥¾ïPá¹z å™Aƒ%<‡‡{ŧ/<Ûìv²Ùìôý÷ß›âÙ¦:yÄw÷îÝKDD«SG¹7qâDº~ý:qßõ‡–-[F………­\>b¹\.JNNV®uèБ\.Õ¨QSÁUnn.}ñź6¹ï:<ý×ÂÄá^促Êsݺu'"¢'5"G` •••ѦM›ÈnwД)S(;;[Á©½ O‡hxa÷îÝDDÔ.%E¹7pà r:T­Z5?Ç‘þS]sp82ë·ŠOJjÖŒ\.-X°€*T¨èiGu:}Ž@r8i„޾vÞ””öRì4pà@r:T½zur8Äö7nLDD-Z´P®É§ºòo¼ü=õó<ŸêÇ„Ã!ÒcÍš5Üõèèh""8p /II*¼TàÛ‘NO»žþÁ`·Û©Q£Fæðj~óg Á鹯ý®öôÐ#E¹6hÐ =dyU£F …D¥¥¥&ñ‚ÝÿÊ©º×»wor:C齩S§Ñ«C_áÞ›;w.Òc5kÒ¨Q#éþýûÔ¬Y3xDÙODT§N˜í¿NsÏ-_þ=:t;JÏñø¯ ¤åg-¼âµiÓ¦ÑСCùþØ=ýT÷Ùîy†ç¾ßÞèè Áú:(Ðá ^-_¾œ:$ݤ éYy=ýôÓ(žwNTøÅÃCƒ¥ù-<<œ{V†É3~Äkž­V+Y,²X:uê}õÕW$‚á¹sçN""jÓ¦rmÀ€—ÈétRtt4Y-Þ{ï=zðàEEE©ž@¥¥¥µÉSþ¶X²Z-J,ñz£FÈårÑüùó)00{G|O|géÒ¥TPP@áááʽ¡C‡’Ëå¢&Mš(×zõê¥ÐH¾6eÊ""4hÒ¾ Gtt41A f‡ü}«ÕJV«…¬‹‡üŒÕ"ÍjÏ Ù¬Ú,ä° `¡@›…‚lVªh¡`;Ù vX¨B …B­h³Ý*œc§cèÞ½;<ˆ*ÑÑHLLDbb".]º„àà`tëÖUòñôh®9998zô˜W ˆ¬eÛl6ÄÆÆâìÙ3HJj ‹Åbh+™6mÞ|óM¤¦¥aÛO?ùòN4´XZ­VDGEá¹çÚaÅŠ• ¨Y³.^¼(:˜ªV€9998v옩¯”ÑzÜg@‚£ŒçhÏ ‰¸ô›„ç®]5_õ/G‡ç¸Xœ9{IIM!X,æùùIë=äqÈÎÏÏGþ…|å^ff&"""Шѓ:ßÇ ³Ç0ÆÐ©sgìÞ³%·n)×7nÜÆºuë®\kÐà Ü¿wJï(mš¦äPø`àÚ.N— ‰x©‹3gÎ )) LZ Ë+åóçÏÃívãÂ… 8{6ŸQ“a€écg ciÈ •+342—”`ßÞ}ÊJ2;;‹mÚ´áÞWèkék6ŽÌøƒÈ›©Áx" c‡‹ã?xV©r¶ÕÖÿž={pëÖmåu5}ÕQÁ%%%Ø»÷ge íØ±‹­[·VÞÍËËÃõë×ñüÏ>û¬×:ÄfLŒ‚&D~9êÝЧQ—бcG/†õ~ÉÄZgö 5¼mÛ¶åŸ7IBdœ‰Àw°K‘{•ß2ÿ©é¡“W‰ мêÚµ›AÀþ=ßm×®N:%UI¹hõªU†½8q"~ÿý¾_¾Ÿ~úÆ‹ÜÜ&2²Š}ÐWÎN ^»®_¿ŽóçÏ#66V/3+ S§NÅÄô‰ÈÈÈ@“&ѪU+´k—bH“¬¬låÍ#„­V+Þ1ã?Ìn·[QœN'®^½¢ÐÃjµòJ¡¦Â3LÄt•gšíéÙœ8Ÿ·îK »ò«ÕŠwß}ǘ¾Ì…&“¯OÞ4O;±±±¸víNæž4tp'*„V@XXÈñÔŽSèËñî ¼r`žÝnW®=|øÏ>û,¦M›†7"??sçÎÅ7ß|c¼}è#¸E€êqþg/n:_öðáC´mÛÓ§OǦM›ŸŸ9sæà›o¾Qp%ûúÆñ¿J“WzØì [y›š4nŒ+Vú"}ºeË–Ø¿?7©]•Kñié<À¨Q¯cïÞ½8vì(¾úê«?iÿŽ«ï¼óZ™Ì[ÆüLþèøY†WM¹ô /wykRߥæ—7IãCÍ/*㊾DÀ=ƒñf•àmíENª±­š÷øÍ+¿4i‚U«V©¼@I“ZŠ—§‚ Àår¦2Z@íß¿n%-ŽGž:veñ^»vmDEE)Æ$uÿš6mŠåË—«Æœy ¡¸€bˆ‹‹ÃÕ«W‘››kº` Exx8ØÏ碢"œ;wqqqÊ;­ZµÂ¾}û8Ÿ`#~Qà8zÌÏË—/—ŠJh¶¼ÕþêLr ²D·Ë 1§¼Ê¯”øôr®K\DŠ/cl¿@ mD„ââblذÁÁ!ÊŠPŒ7ŽKŽ Î‡½ð—ú÷Ç„ñã1gÎÄÔ®z ˜ùŠà±Çj"33{öìñbüc^Ô>ààòå˨W¯êׯ=?ïÁO?ý„víÚ¡zõêÈÏÏWÒÈïéýp4ùê´uÞ¼ÏÊ+2ž7¨ð¬œçwpðIDATcÇŽårJr•®5‰kÕxo‚g5Êtþ#Ì ¹¸ôwhh¨'ªU­«ÕŠóçÏi3ÂÇNn%§VžJï–âþýûˆ‰‰á ÖT«V 7oÞPpõËé_0dÈŒó~úiºt銗^zI' k¤ó¡W;]ÿÕ®‹zõ–‚À žü»Ês‚ø·›N·”$rÓ6áÁýûgÁ°çرãHIi‡  @ÑšÅT޵šÜ„þLX#GŽÄÚµë°eËVܹ} @Ï=L…ž={ÐUÙ 6JNàkO¼ÿßÿþ]»vÅÑ£GqçÎmlûižzê)ÔªUK´XúëïÅ]_ÂË3Iß)-EPp°)fŽ;†””*y29a¬r²õˆc3Ïk±eË=ž™VL§è¨ÿƒJNLL„ÕjUÌæIIMñðáCìÚµ[cÓ unO·ËÜÜ\´lÙ’Cm“&M„'ru“ÈÇŒøøÇ1pà@¬[·ŽKÖO>“q{–ö¼lÅ­Û·=Ô fµÊÌiª5ú1mSƒ.”––"88XtnV9|8:tè€=Ò°`Ádd,F”¤”ñ5¨˜×­n#å\›düÿéíÚc³¬Òüïy?ú}½Ú ‘ZèÎ8@[’ZÂeBlj…1KVæ¨dGíîF„Ù!Þ0H$ÀÈŒ›HÔĉÁˆ £⪔¶þ±Œ&®\D²+Q‘q¹µQ„Òö{ö÷v.Ïy¿÷wImûöýÎyÎ9Ïù=¿çxÕªßb÷n_Ÿ^¼èg—ß~û’˜ETgEÉÂöüÄaD­­³´z… ÚzFïê}Ž™8¡‘„O?=¡í]fBÇ’h¿]µJ™ïÅ`¾·ëàÏQÜ–Ùîv$Ø/eå!÷7aÕ&ŠFšèÿå¨Û]|ÎÓ%"н¼˜qäÈtttûÙÔáJ†³ÖªØnû¾óèÑ£())AGG‡eô†_ù|GôI¸†­­­žü ’ãž={ÐÚÚ Ïó¢çÌÐ(8¢££C;㤉l-œ;w&MšÿœÌíE>ôS´_®È7|òy¿Ôßi*Œ’­<Â;C#üqÐC‰_xì±Çàyº»»Ñ¹¬Ó~: wtvbËO ¦¦…‹rë›ïÀ˜=» MM3ÐØØˆGy³fÍr¹®®.;v 'NDqM¤ô±œ8q¿üå-‘ëëüùóøø“1oÞ¼`YÀ=RR‚Ñ£ëÍfQVVŠºº:”””Dî µº_o:ní@kë,TVV¢¾¾^Õï¯È¹³Ó¦MÃËïÀ–-[PSSv5.²Zcùòóå<MMÍhlüCÎŽË–Íœ<}mÇŽ‹—_zm­m¸ýö¿Ç† pàÀ\¼xQîÐ#îÿ߯›ÐÔÔ„ç¶nEss–-[Š?ýé|úé§Ø±cGô\&ã[§mmmøÝïþ+î]yóæùq>lt.Ká||ï½P.3Ð8µ<²­­­ºb¤ÄN? ¥PU,øQ_ßèèèÀ¬Y³PQQÉ“'Cª>®¶¤“¦®ïŒ30uêTa}õ}}}èèè@kk«½ÿR8oC%ûꫯâøñãØ²e 6mÚ„ææf´··ã¾ûî‹Joùë»MMMغu+š››±téR<󌿾;wîL (ãé··/ÀïÁüyóQSSƒÖÖV,ìXˆžž½õXÂ|Ó¥Ž/ÜîînÜ|óÍXµjêëë±bÅ tuuiX–HKK ÚÛÛqÿý÷c̘1ÚÙeæh|mmmâz´··cÍš5˜??žoGGzzz„®/ib¯u¹´µ¶¢ª² õ é;ë(ÿÞ »ví²eK}}ÕÙ‰'žxÕÕÕ‘ájšhê;¼à ìÛ»µµµx~Û6L›>¸çž{¬˜Ìæ–<þø¿býúõ8vì}ôQœ?Û¶½`㾆κbÇ4öÏ[[Ûl455¡±q*Ö®ÕÏ[*3‰Â‹ñûö¢¶¶Û¶mÃôéÓÑÙyî¹gEq{q9³ööX³f æÍŸ‡êšÌjí.Ü7Yûx/˜ïŒMhllÄÚµkù&ÕÏT‘ ÿŸ?löËë¯céÒe¸ù§ÓÐàˆÚšjíqŒ)™Ç1(ê¥ÞÞ^,\¸³gÏFeeeì%Iã{ÓÆð<½½½Qé±åË—ã©§žBMM£5¯ÝÌ ¼ó_yå|ôÑGxê©§°yófÌœ9·Ür |ðAŒ3&ú»õë×£¹¹Û¶mCKK :;;ñì³Ïâ“O>ÁË/¿=·gÏ›¨««ÃöíÛ£±­\¹ÒÚ/ƒyôõõaùòåѳO>ùdÄžªõcçÏÿ9Þ~ûmìysáê¿bKDSú]uˆÉ!4ž_Ô>|.zAh.WúÁœ¹sùСC<22ÂÌÌgÏžåÞÞ^=z g³¹èëÂ… ¼aÃFÿ{#Û8Ìðjiiá}ûöñÐÐóÞ½{yΜ9ÌÌ\QQie¢>ýôÓÌÌÜ6{¶ò.GÖª’}gÜú¿[·n33/h_àg+–æxó6ûïnk³²‹7nÜ(fɆcX³f »þ­\¹’³Ù—d³\’Ír6›ãú†îééáK—.13ó×_­e]g³9ž3G–ó˜1cSfÇ2hi™™BÎ¥©ßûî»ïòK/½ÄÛ·oç«W¯23ó‡~ÈÍÍ-Ö:Äòseœûÿ¿tÙ2>sæ 33ó¾}ûxÊ”©ñžÊåx„ ÜÓÓÃß}÷Ÿ8q‚OŸ>Íù|ž¿úê+ž2uªönýsÍŒkÿ™æÄýWÁ¹\Ž/^ÌÃÃÃÑX=Ê=ôP”±<00 g¼–æèvfzCÃaÄï ³Ã ÙlVÉBîŠ2¹[RÌCýüqÿ¹ªd…sßÐÐÀÝÝÝ|åÊff¾|ù2>|˜'Ož¬=·LX߯ÆFMnjÖu˜Í·«+úìE‹ñ¢ñŸ={–wìØÉ VÆwii)O™bËÙÌ5÷©ôUQQÁ[¶láÏ?ÿ<úÜ… ò©S§øî»ïÖ2›%¹¼ÿþû~ü8ïÝ»—ËÊâ îŸýìoùòå˼nݺ8[:ÈÄÿõ’%ZV¸•ùdªþ13á¼UVVhY×ÝÝ»4™†òëêêâ²Òœ?ïÒ?ðÀýÆ|ÿ.˜ï?ÝfF¸ZiÀû¯~µˆ4ÏÇ%ë\_·–9>>ßÝÑçÍœé¾?ª*+µ¿Ï‘Y_ªetÏ“öK_°_‚ù™_Rf{øåyOš4‰wïÞ­£0s›ˆø­·Þâ×^{-Èšö3§G×Õ13ó]wÝdBûÙÜmmm|ðàÁh|gΜឞ®®®Ö²¥½Œgex ²ÂÕŸOœ8‘wíÚ¥éƒC‡i™ÝaÆ÷éÓ§#=¹wï^®¯¯Æë¯^½:Ú/ýýý¼hÑ"þì³Ï¸««KŸ4Ý»wsuuµ•ÞÖÖÆÌÌGމäàg‰‡áçJ2œ+ñ87Џ"7ŠË³þ÷e¹ W•Žâ²Ës¾¡lWæ<.Ïz\YšáŠœÇå¹QœEX¦G.—[ÂÀ®°˜xUeeTôÔÙº6E»æÚÚZ\¹rÅ/‚ìdLü–\?šø£ Y f›a¢â"ç¹` íäì×ßKÍhÊÊÊpà 7àüÀ€Å‡…———£23Œ%-$ç\¹2Ç™P¹Ø¿Ü¿?N:…;ï¼¥¥¥¨¨¨ˆb@8åk­g8Žùæ›oÄX»>úo¼ñÆX¿~=¯ð{¤þå/ïcÇŽØ´í£ÔòñGÉåÊeaÚ "¤œ©"BAÌ}ÖW”]‘î`øð™ÚÚºà]vS$E}.R½Çg“3¸é¦›Ðßߟ«(®o˜YÉîXH6”LX¸yܸqî\¿îâ »2 çÛß? ½G‹`ˆ.-óçãÆÓ >‹cfåb¥ÙãS×C Ð÷<7Þx£– š6|Àl §òèºâ‚{™¢ ~2øxFyy¹/|ñ…Ô6Û¹ä’Îð<ãÆUȧ¡ß ¥ö8ŽÖÂ<[ªsÝ­,kkj088ˆï/_†ÔÔj3X!oÏœ3yþ~îï?WPc&yO8˜sÆó0.Ü/BŒ¯|sªéz†ouM-Ã{š8áŠ#»ñ­ÒŠ´¬¬ •UU8þ ®Qä!«\VÏK“’¡CCC;–PZZŠêêê¨.«Ü‰G ' ?„u90s¢Ž”R"µ^ÙÂæÌd2˜0aÎ;—¨'Ç .hz2œvø~ÏËhú ‹¡ÿBQUUÉÄlá>\ßЀ/¾8ï¿ÿ^9‡´(í®2#A2XÆF‘_ = k=ÊÃìñü¯‡¹Û:ÍÙln++ ]Ÿì¼à9 kÁݰØ– ´rŠëÝõŒób±FHrì‡-³ N ’usrárÉ•fYLf° rÉ–§OŸÆ?üæ7ñ‰/¢í›¥ŒØt‘‘uûŽ?ýëIÜvÛmØ¿ô¦ŠŠ |øáQ¼þú.<üðHý±£¬½ ŽÖzR³#NÜIHÕ3³Àåu-Ïý`ÿRIg—‹|!‰›£p<Š–bÕe¬7 -èÄ‹&±’c¥œÛ§ØFædàbݳa E_%ºº.bG´YðÆnǺ–£xn ºï'¥b2ä¾Ï¢rlx’9c›­Q5ëÄQ‚ÒÕ÷R(CºŽ#bC« ôÎp§‡!KQ¼²åN$MÆ,u:tcIºlÆú%¹ã-3V«êÍ6?‘”ÍñY4âLƒÃCæYSÖOO÷TÁŸùœúŠäx5–…Î,ͲD! >4_@߆åuHŒ­4Üöש»‰R´ÉTÀm¨ÕžéZ›FEædZÏ$kˆø^æ(qgdd$긓!‚X#A‡À0ÆÖ[àç® åï ߪæºzuðÞl.7€Ÿ'Á7‚ðf]·ädAßè%k¶h¡+ÀÍŒU$–¡‚9|NP.šÜ„®xA‘ë»HîêäÈœ«ÁbpнÊÉ„mÜä#gf¥ÅÏ ô£§§üããxþùçqöìY45ÍÀ­·ÞŠªª*¼øâ‹–¥!^ä¶,ŸwÎ?Éz`kßiJQ•DBï`S)2ÛÀëz¯D³Ã‘aÎ%²rÚ;äªW¶â[g;ºƒ³ÃoÀÊøˆœëaèRaìa># Ba¦& &TÈòeDÅ0êÉFo”Á¤k‰1a'8& Zº ƒÀZ dj;A‡@éÌ~&ÇVu°,Êö;LÊ‹Xk¯ 㻂F°Ã#ǬÂÞ 0‹Ã§C =vZe‡´QîšØØ xHaªRJkBFãõ$ÖÆ¸ëXLúÑǧvf¡0Q)wD>ˆ‹à,Ùkâ‘äLRö ÒÒcæñQ —aovÆ‚¤ÃÕ\Øë0"#àíèƒnê›4 Ó•‹W9wGž "À Îa˜„—Ï3¼Œ_Zhh˜‘ñà·ˆy~G•° äµÀ¿˜™ØªKThb)ùfÒ ¢€¬Õ†÷ pŠ,Èg‡c3Ë%úwƒ1$$ .àa) U›fsÌ|{S?þÏçŸc`` ZQ[ù’ܰš\ m\«W¯Æ’%Kð‹[~ŸüøÇøòË/qøðûX¹jN~vÒ9=6ý0œžt"ƒ™fqÍ — 2cš³Œ‹P„éúÓ*7›MŽ¿KÊâ&(½d]Ü>»O=™»ÅUi"¸ %sŒ50Éš‰KF!eV.'©…µ^À<¾ck\¾X "OËÌ)b0£0ȬҫV‰Ðó¡MFÌ.¥râÉ>'¡’.C6KÉt¹¦·{Øqž‰¦‡:Sak”ý¥ÊMÏð É÷Iá¨F-ëIƒ¤Ë&2~Ôæ ÊýÄ™c\Í&‡74PAg g)Õýš¤DÖY9o6ñ@‘#ù°6åÀM ¥î£Ë8“FØôP  ¤ì¥"Û¥þ Aµú õ¯eƒŸ¬"¢À&èXˆÆl *ˆ7CTù‡}À£@±a5bðü~â˜óQ!‚ß^Ó#Ò½Ìð9â(–¦B#¹\éxfþ7DÌ¥ýT€ÑaMÕ§¨žÂƱÿG°l]' ÀRw•°¡L¦R–"P5Uñÿ—KSº¦(Λñi.–ƒÈŒ °b”r-”ƒ@…=Z‰kc¾+án£DN™[4}W–¤¿H£Åz‚pûI [±„bœ¼l¶ÝSêe¨ž 9Ö)VnÛ#*Û% %ÍCe>ØÉf²ÀòÀ–Æà€®èGµà %œXiInzó¼’bXK2 Írt›#;·€YÂ:—°æd»†T¸›Àä™HNý&ñ :›uóÆ–³@z ¢gLˆ/ù3È/©È(Á…Í:‚6JE ^,£æ.ì»ËfÝÔpã)‹K ¬™PÌÎþF¬¬³LJN»^î.D×Z‚?ǧ'd1óù¼ï ô†ºÔBÿjŒ¥ì¦–C)~ÑbŠMcÇ–i~<.·>Æ®XÉcaÆXÂ4ˆHóØä`™ñÏ‹·Ö]Ç#xŒòyöK ùò£wXzeh¤¿(š+›ÍnÑ WS‘dÞFr@vË¡Æ×C}ÊÆ #ÉAës^¢ÌOQžÉ´Ù/©àd1ñ«6EÉìš+Ü¿ÁV:vB‡¬×Ód“(H — BÙâZ ‹Ž’LTq: ÞxÓu˜ä^ Ó5u­q=…x%6AN “ÐâE{†«Yý›„ªŒJ¬ÅD'3HËÔÐÓå¹s-(uËEFæÁN.ZeÛ,:s¡‰]»Äžâa°^ò1MïH®à$ÓÒßʧÝÙ*ÕýëŠ)’×€œa ‹šK™oDBļu^Ù¡ØÕd#µKVó"ß§h#C`aèEÈ–øÞ€†A£QÅYÝûÉ{I½m‰LÀ+¹ÈdžÉVPQÂÂ`@Ö T0çòn±ƒIþºBÙÿº€âõÏçq5hÂADAQnh,¦ÊÌÅÇ2z!Œ;?(T÷ˆIf€®Áø„àUa§a¬Æ_ª€±Ûœ À4¼ÂõʇŒ¦GÈxß1—¡îõÈÿ½*?wipäÞ”N ‰½Ì-°ÀÌŽi£dÈ$¹#ðȆ ìËÄ@Ãl³ed9¨®5e臼âÙy¹œ\(ä¸yØ&Âø5‘Ì8]¦9ì@47Š#J‚ja&[°„HR2€Éû[tâd(5ËŸv\ wÔ/œû¬˜Qèò´f8 õDñŒ()êLÅxNÐ&{àÈO2ªTú'T’¢‡Èáf†âf¤DvÒSØC6Zñ™lq¬7cÖ×bH…Œy½ÃPì¶Œš›yQ×Ö­28Ž• ÀgÞÒÌr‚(‰@ËÞçyG”•t¨Na`錔T”ݸŽL/‡ö! þ2Ýë¶ A$AAr9ÞÙ£øï˜<ËáLy.L‘ƒzç(~Oo! ‹ï÷…122‚á‘a0#(–.ŸAäƒóDš±à‘nˆèÍÉnl}]cÆ8ÅÚ¾Ô÷ËÀROàa¸=.Ï+g0œ?‹•8bÝæi‰@@FalGe<¼ûƒò2„|>À¦KƒùîkAxÀ¼ À?AuŒ :ÍÍÏ"…ÇÌGdb&ss¨I_CºNÖ§Ø ìâ˜ÇÔ×%§·†’àƒ*5Ë]ïøw¶µÀ º]É`HxgêeX`Nz d¤Hk?™~ÍåÎ n«ÑÕ©Aã)Šæ¯XꊘŠ«`‚Š lmצR¬%±¢-µ¸, Œ0 yØÉHdjTð¬‰#þ‘ܯ0V °nhr0QÄ,h %ÞM9•LO³ºÉ`2(,عdXº„M&TQÚгÕrF:Oªœ¶H›nmÃ)!&YoŠå‘,0,³¨œJïº×]M„ʳ¬ÌÏ %MD–‘ Ê×üçQ¼gYMš¢8ô$4^¼ˆ™Bá‘c)Å9»Î«Gº‘ʦ$E·ùNÂÕá!%VÚd¾¡°†Fþ€27òä¤?W(†ä"gÓÀ ce¹8–ÒÅJ‘,9È’AmêÉ(a‡tfTÝgçÛÿ ‚xJå3•÷ð/\ùóõP‡Ió' ,0À €&‚Q—XB82,fXY ĤòE`)Çñ‘¡œŽü¿b.íCö­ìpi¸À à.wäduáp[Ãf­8ÉDsÞ˜Hš~ë@‘~XN±ÝYvÍã¤øÀ„-DE3š?°]bI7ªÈ°ðg9fNq[Gn$*bsgWÞ"îÓeoC†+ÓLerÌúޤ%o˜fŸg= ¡âB¼5›|‘ñ{Ò@—8+!2²8ô˜U’¹B‹‘ÀÈ!"ËUÇÀŠ%S·¼ä‚e؆‘cãdsÉ],ÃV99Ʀ'm0‰l0§*£©CqR.üxl®=á‘F}Cí5·NÔK\™L#%öHIdrËP ]±!r$À†Õ€"Ã=ϸ:4„_¸ˆµü˜îÖSˆÈRWÅKun¤„8Õ>¥×oR6º¾¿ôÚ›j‰!m¼dd‚Gaê»Y —ˆºëäó‘a°Ö_pÌÿà?=òÞünpøãbn¤ÿ®9t3w¸ÎIEND®B`‚stem-1.7.1/docs/_static/logo.svg0000664000175000017500000001222313157571677017274 0ustar atagaratagar00000000000000 Green plant seedling. plant seeding seed floral green Open Clip Art Library Jakub Jankiewicz Jakub Jankiewicz image/svg+xml pl stem-1.7.1/docs/_static/exit_map.png0000664000175000017500000003012313157571677020126 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs€€›¥w{tIMEÞ+5*,< IDATxÚíw|”UÖÇ¿ÓK2™$“J„$$!„’Ы4AÁ.‹uÝÕUWEìew]×¶ˆ®úŠîZuE:(½#¡÷Jz/“dz}ÿ˜ÉI#…’}ßü>Ÿç“™'óp8 ¸?ûÿ’ÀL`ÐÝÝÙ!"‘(0((µ5þþø©üÐLbb"}âãéÑ …\Þª/Òétøúú¶«‘&“™LŠ@pùñšÍfª«kÐjµ”–•QPPHII UÚ* F7aLF#:½mu5Ú*-µ:Zm‹7)´õŽªz¯ €“À)7aŒÿ nÆ}€X ,$$„îQQD÷èN¯=7~Rú¡T*=êõz|||Úõ¥F£©TŠH$j×õƒÁ«-m…ÅbA*•P]]MaQçÎeqöÜ9*Ê+ÐVWS­­¦J[EyE••UTVVâp8pO'Uîé¥Ì};€õn©Òi &¸;=ˆW«ÕQQ‘‚èîÑDGwgø° F‰ŸŸŸ×…ee¥‡x:@.—# ÛÕˆŽŒþ«A€¶~II)gÏãÀƒ¢Õj©¬¬"77]­›ÝFyEv‡#ø xέ×t†…†„$öé/Œ‰‰!%¥oš@D·n-^l³Ùxëµ—™ûòkÈŠþºû‰Åâv^‰Dâ%þÛ«ÕŠÃá@&“µ»ýy¹¹|þùBb£ÂÑâp88|â;÷`ÿÑã˜Í–L``w‚Ο,—Ë?š‘7th:Þ?™LŽJÕú°o&II‰Ü#¾#´»óèn/L&s›~{SXøÙg ˜tY¬ …ôKˆ'<$„Z½žg²Òívû»Àc7š‘HôÉ·Ïêñч`·Û±X,mºIöÅ‹øHAÔN‘ß™àëÛ1òfîÝKxÚëܺ­;Ùº+½Á€ÙbE,b·Ûgïßh¼7f̨.˜_oþ4¶iæçGöÉ#íVÚ:•cFбYyËÆ Jˆñ:7iÌ&€ÓéäèÉ3¼ýÏ…ÁV«mÆ2!b±xÊ=wÝåõ£Û2²/]`ͪåt E"“ñÍ—_°ní*òrsÚ=ÿ¶UúÔ‡Ùl¾á2›ŒW$XJRBƒ‚âo$æö‰ ¹uÆô6§ÃÁ¶Í›XòÃb*ÊÊ™=çAÊ‹ Qùø2eÊTF®¶–Ÿ~ü›ÍFiI1[6mð¾‡Ó‰ÉdBo0 ×ë1™Lît™_V«½^ï9l6›×õz½žÚZ:½^ïE §ÓYg޵v»£CÔf³!p:[%eB‚5Q7r •Ð&S­¢¢œUK—2aÒDTR!y§”œLYQ‹™­k–aÔÕÒwp:cÇOdá§ÿ$4HƒLáƒÓéôK  ‘H …MN"‘ ‘HšmGSJfýû›Íf Ä ²zŠ¡ÙlvK(•JÏ30¹Go]ûZjCS(-+Cå£hÕgÝmмQôËHOó:ép8¼a0¨(/gãϫЄ†c³Z=r™×`vq%ÈJÊŠ Ê Ÿ2“#29橌I&°{×Nn½óÞFÝ”¾ ‘´ÿqŒF”J%…¢ùNÉdL¼â¢"¶oÙLeE91±±Œ=‡Ó‰Ñhôº—Ífóšf¤R©IŠ‹ŠQù´Îÿà¶t¤7j x ,,LvÛ­3°Ùl^âÖË ¨TÒ-"‚ˆÈî(f"ƒ8”¹ ‰:”Ôc˜–޾¶ƒ®€à "!½û§£ÖhÈÉ:Ði§¼¬´u£¢¶·R¡h——}é"Ï>ñåŒUUU¼ðÌ“¬]±yƒöˆÅb|||•ÊA©ià„Ò’RlV×Êãø‰“‰OHä³?âw?Juå‘}1;‡eK÷èïO\L4q1½Ðø7úÜÞƒG=àF`¬T*åæ›on¤x5Ä’ÿ|LjáÃ8üëã§à£R#S(H쟊É` ûìiºE÷bÄÄ›ÉÉ:É{ð bÄÄilX·–~ ñä_y 0›ÍH%7±­Ú»HtåëΟ;ÇÁû°Ùlôí—BJÿ˜Íf¶lÜÀ™Ó'¹ýÎ{¨¬('@DiI1QÝ£yìɧYÿó¦L›~E/c~A!»÷W¬ÎÇG¨V©Tj?Ôj4þÄ÷îÉ‘“§ÀéëM!Ð;º{wFÖ¢ õä‰ã¤§gpx×VÁäd_bð4’!ëä1j´Ul]ýÚÊr´•å¬ûñJ óñ Âä¨ Â×G…½¶}µVË—_,¤¤¸ÚšZzÆÄpó´Ä'$´êGÆ+ú/6­ÿ…¯¾øœ{~{?l^¿ŽE_~AÿƒHKÊ€Aƒq:øøªÈÍÉF¥R¡×éðñõeúÌÛ[埨¨¨8ÜÐëAz½qfaqi:ô‚Ýd=|r½u€@Þ½c®hâ9x}U9:«ƒ “§b6¹´ßâ‚j,1½{7A€–GYi ÇŽaĨ1’«ýý1›‘’2€ž½bˆˆŒòò(¶;wîÆét–áŠj½ùz ÐX•4iâ¦LžÌÈÃùú__àç+G)a¬­FW£mtaDtOÆL»•ß,$¶_ïÚæZQŠˆ¢$?—°Èh×uHä˜mvâ¢#9y&‹~ÿxó<½‘X‚L&£²²§ÓÚOMMm-½ŽO>üµZMBbgÏœA«­búm³HMKïTæä½³ç°rÕê-¸=Z멈€;T‹ÅR\TÌž=™¤¥§1jô N#¨[$z‹Àˆî(¥¬Qø¨Ëåøùâ«ö§g|"™›~FÖ 'PUVJXd4F½¡XÂÐñS1[¬$§ôãÂÉcôKNHH(ùùlݸžû÷aµZžÏ]¡P¸|ó" …‡ÃAuµ–³gN3vÂDf̺~)ýÙ¹}+û23é×`§Y‚ž¿àCŠ‹K2¥•Ïó•Je¨Ùlfpê`V._JTD„G„*•J|T¾ÔT×P’{^I1a§²Îó›™w‘¹ù4Á¨üÉ:q«ÙLXT4Åù9…PUVŒÖ`¦J[I€‚Ü‚BÆOš À±£GxýŹôŒéMŸ„îßÏß~ƒX,¥WLL“ –+$§ô'9e›6ü ÁCK¤¤¦¥#‰øö드2y+#¯ªªªx÷ýù †-ÀºÎJ€Ù~~~ƒ/úš›&L`ÌèQôˆîÞhY­Vjkk)˽ˆÄWͱ£G˜~Û, ²/pâÀJ‹ H;‰²Â‚ÂÃQ(|èÓ0¾j5Ù°Úa̸ñÞû+©#ÇèÖ WïX¶mÞÌØ 71vüMd ÁžÝ»Ø—ùk³£¹¨°e?þ@ú°á(Jdr9UU•ÄôŽ%¾O«W.£orJ»PNg»çüúX¿a#‹¿ûàG ³³*š5Ç mQiR(äèuµ„t‹¢¼8¾ƒ2¨,)&sË/H$nýí£„B”¾¾dŸ;TÓ#Æ¢RùQ’Ÿ‹X*cÿŽMøhB½¶Ð0BBÃÐëtäç…D,aÖ]÷pîôI>ýp>=õ´'Ðjµòë®”—–2rì84ׂKn.r™ ­V‹¯Ê;ïù-µ55¸‰Öt4z¸{ödÖyööµõÚëJ?µºQçÛív¯‘'“Éɹt‘Ñ£FQRG ZÅÆeߣT_Y]-—ΞÂ/0˜ÃF²cëVBÃB>iëZLY‘‡îõ41lܰދYYÜýÛ9”—–àç€Á c`ê"»wgíªåÜrë,kº¾Ifseó R©K$X­VÌf‹+ËHØ®âtv< 77¯Îý{²S À¿±m2™-EDuGîëGXdwv­[ 5Ã'ÞBà‰cÊŠ\+€&‡£QOµVËÔTŽìÙAÂÀ4Œ¢×ë(•JjkªÙ»çWbbz“DYiÁ!Áäç! ±Y cÜMS¨®®öHºõ}‘XŒÁí4[,…B/÷¯ÕfÃR­^&CR/ºØh4zE Õÿ͇£ñr(—X,öZšv‘Xq5E€B!÷49y¹àÊ9ÔvVHÿµgî³ÙlX,–Fp8Èå Jòs(¸˜ÅØ[nçü… ¬]µ©;`£¬¨¥¯Š³½Þ@Zê vnXÞ* FªD©RyÝSå§füÄÉU—HR‡–üù Åps‰XìÕá§¶ÆA"2¹«“…Ba‹÷n*ˆ¤åååäÔ­ÐY Ь“f³¡P€ÓéD£Ñx}Ðf³qôÀ>”J9v«•²Ÿ3bÒ4R~„ÊÊ Š ˆKêÒÏœs§É>­£{l"#F^7q¶ÿ*++3ft»s$âŽ?þ-[·QYU®äÑNK€~€O Û•*—7ycµXè?xiC‡qñÂÖ­\Fæ–õ˜|ýÔÜ2û*KK°Ú¬èôf”êÆß2&¨Í2™Ì-¶¥)ü´t >üˆ#G0rÄpÖ®^yÃLÀÌ̽àJ=ÿOg&@ @Ï^=¯èBõñõ%m¨k©¸WL ¿êNž<Ááû9››‹¶¢ …JMxLñ Iøù©šµ·lÝÆ‰“'9qòB€¸¸8âãbINîKRb"‡½Õ?Àápðò+¯ñÑÇŸ¸Ú©TâÄÉŽ»ÈËÏ'*2ò† 7?àÕ™ *‰è›”Øæ B!}“ûÑ7¹ëÖ®¦¬¨£ÝÉ Ô!˜LMÇá—••3aÒd.\¸èuþç_Öy)aéiCHèÓ©L†Ê×—~ý’I<ˆ€‹>6›û|˜+W¹ØœœÄÓ?Êó¯ýƒÁHIqI› pµLÀ¼¼üvÏÿדADEFuè&N”—–˜2£; ·)¬Z½ÚÓùãÇŒ$$8…\†ÅjåÈÑœ:{½^Ïæ-[Ù¼e«×µB¡{žލÈHt:OþéOçO4—ž}Š—¯¢¨¸¡PHBBŸ6ÿ‡ÃÙá‡ZT\LAAÀÑNO•Ÿ¡¡!^?¡PØ&_º'y…Ü>ff‹µYº¾¹5qÜF Mo0úŒ:zŒÌý9|ô86»»ÝNaQ1‡ƒEß.fÑ·‹‰íMEE%•®@ &MËKsÿ„P `õÏëHîÛ·]ɨWÁügÓæÍTW×èÜÀÎM€uƒŠ–6'B:œàã§F ¶¨¼MûÍoxö¹çq8üí½¬úq°—Æ­T*ž‘Æð +źM[ù×7‹))-#+ë¼Ç)ô‡‡æpçÌžßP«Óyˆüλï£Ñ¢ÑhÐh4iÐj h2ÓØd2µ˜;ÐZØàp±3@øûtøFã&L@"iÙäÊËÏç¯ý›'ô«J«Åf³µÊä’J¥L›2‘)7ãÀá£:rŒè¨HöïGxX¨×gãc{SZVΩӧ9õæéf}jµÚCŽÀÀ@ä2}úÄsß½÷Ð=êÊSbMM F£ÉózûŽœ¿pNÇ¡ùèŸNC€Þu £ÉäÍŠüM›·ðÅ¿¾dÃÆØí—µû)Éœ(‡¡°y,‹IODzjó!Z÷ßwY.R\RÚ‚«×‰V«E«Õz+¤+áÇ%?q`ïž+ÆF~ÿÃøÇ <õƒLf³(.{€?wv¤↋%Ƀ7›ÍÈd2ÊÊÊùfÑ·üû«¯ÉÍÍõy}âz“ž:˜»o¿ aƒ ×lî˜6›Í$ÆÇñÝ¿þ‡ ÙÙÔÔÔ"•JQ*(rÏ_™Læ/3a2›1™L˜Lf.fçðöüغm;7Mßäw|üɧìþuƒà `Μ=Sd6[Ö_‡qUë0®— WÏWí†;vîdñw?°zÍZO¸´R©`ä° 2R“6x þ-Hœí»ö°{ï>þüÒ¼v-ÆØÝJ¦R© 9±åÐq¹ÌUnÎK¬×ºRÙ‚‚šw^Mž4 •JÅé3g).)ÆO­ +-)½«¤´l˜V«½¹#óþõ&@D"!½A"h{°zÍZÞøË_9{öœç\D·pf͘Æo&ß„Ïìê‹Ù9DEFЭ[8Oþþ¬V+g³Î“Üÿ„ÍfïP ™CGóÚßÞ!¡Oú§ôkös½zõ¤W=ÇYÖùó‚W_{稸$ø8¼«X»q=ò‚‚‚4ÄÇÅ]Am̃/++göœ¸ûÞٞΗˆÅüîÙüç«…ÜyÛô+v~Iiyû}jkkIˆëM&‹ÕÊ‚O?oS[¬V Ò6¦m{®µÙxã­w1Œ¼ðüsm "Y»ö”J%ééCHMü›ˆˆˆW€o;Ú9×#(ô@ß¾IƒöìÚá9¡Óé[­>r”é·ÎôØâuøë/Î¥gt÷V?x‰XÜ(Ý '7èîQ\,]¹†w|LTd$ÇêP<á=÷ý–U«×|Üß™%€Є6Xvm- ‹Š¸ãλ½:ôð¡|öá{­îü’Ò2}òY¬6[“Š_HpgÝöþµÆž}®õG~°ÃÁ¤ù®%àòήt‚BBƒ=eYl6;zƒ±XäLi±XêjèzL»Û︛¢âbϹ;o›Î#÷ß ¼¨ +‹‰%Ýo³ÛùãïÂfµz¢zär¹Gù³Ùìüã£Oùàí¿º]Á"d2©×œoµ^¾·D"E,yYõ=õIV÷›ëpò´ËdŸ4q¢çÚº@@€\®ðJ2m.^P¯×SPXXçêÔèø†††ºíx …™LÚh%P*õ>÷èçè±c»ü¹'cÚÔIM>‘;Œ»áÈ_²|ÿîA"ÂÃ.w˜Åâu½JåË3O<Ö¬Y(‹‹è ~øiCÓ“WÏ7!kÁÝ{¹Zˆ¶º†*wKTT¤çÚºë›ÊY4™L—É%xôœ}ûPVVfw+‚tæ)`@RbÀ£ô\)€bë¶íuQ®H¥Ræ¿õg¦M€ÑÔºBÙ¿îÝÏØQÛpöÆKÀ=ºGrøØ‰–Å÷Þ|þÕ".\Ìà̹,~Xº¢õ"» €€€€&×A#b+ŠËAê)¹»víÆápT¸AšáJ¥’´!ƒ[}Áh䉧žö¼Ÿ÷§?’:h@«µÖÚZeÆo¦Ø'¾ ×´KX(²à“…žÚ¤zôâcÉ/,Âh2ñê_ßæÓ/¾¤Ü•’}Eä¹Ví®JÜ@ŽËéU}5t€kM€ ððp¢££[}Á[‡ìl×(›5cS'ޝ§'X‘\Az¼÷á'ßyCX¬Ö&]¯b±˜ùÿ3þþìØ½‡¼ü‚&GèšC~a!ÿøèSìv;o¾ú"A BÚ®$ºEtëðCÍ/¸: àõ @pTT„—½kjA„×ÔÔ°ðó/\sGJ2Oýᑟp"¾‚öüÆKÏ5ZåóˆÔ2xü]¥T¤ kÖmà³ÃSó^vMK;vñÍK©¨¨"4$„ï¿ü¬ÙïiºÓŠ<þ‹ŽÀf³ÕÅ\•º7×Z jb³5†µhñw BC‚yëµ—™J­ ¾Ü°e7ݬRv%¤Lº{Êúݳ=n[±XLUU%áaa„µ9´¤´ €mÛwP[[‹J¥j×={öE…EàÊèÔ ŒíÝ šþ°Óéäó/þÀ›¯¾Ø¢/¿%,ú~ÉUý~*ï|ðOæ¾üÉI‰ýSúºu”ZfÏyÀËäm 6oÙŠÙeòtvÄÊdRÍ„qã¼lfi3fÓö;¹pá"©ƒÐ7±O»¿tþßÿÒìÿœÎö…aÝ6ífú&öáéÇ¥G÷(ju:>^øï6ÝcúÔÉž"Ø›6oáåW^kW[²ÎŸWئÎN€!!Á!Âøz6³T*mv¬rŶ7;O×%“\ f³™Ò²ò&lêörŽéÕƒÞ~ÓS¾5%9‰ž=¢Ût°ÐÞ~ãÏï_øÅ¿<GmAž+ ¬ˆ6&ÞÄxiÝ-ÍÁu[¤>vœý‡Ž4Ù±­qŸ;yŠ-;v5:ïp::”‡W?€ä“¼Í]3g´éz»ÝÎÀþýøóË®%h›ÍÆ×‹Ú¶–ãp8Èv™€¹\¥x€kI€ à6$kôKNF¥RQ[«ã‰¹/òäs/±÷À¡zغ4êaéC5,ãšj¶í!’{ÞfÌÈá MK ¼¬¬M÷8yòùyy9Wë·\Sj1¸9„††ðÆk¯xÄýÞ‡xò¹—øÛ{´Ú<Úùk&••Z¬MLW# «½p:^QI£†\ §mÁº êˆtéjµíZ>• Mƒ00£ÑØbõC>@Qq1ïÿãYVý¼žÉ7'¥oR‹ø¾‡ãRŽ+,,0ÀŸe‹¿ôZl’´s ¿Ê„™Ìf¯ÂÏ9®yœ©S&·é>çÎeÕ)€:»¹yyÍ»a€æDë«/¿ÄšU+¼r~ÍÜ×bç‘c'<PY¥å™—^Ç`0Ò ‹=ÓFMm-›¶í W¯žŒ;¦M÷ÉÉÉ×¶³{;;"€À 7qÓ¤)äææb2™Z]KgÄðaŒ~y!G¡hùºõ›/g÷ËÁÃGùóÛïw Ô…•WTòâëoR]S÷ß|Õ¦òô£‘\WX­ÜôF PõïŸÂ¸±cÑh4X,ÖFfœÝ½ç®Ýno&æï¹ÊuvN•M—¿+(,bëŽÝ.§Ÿ‡ögr`ïîºóv¶íÜÍKWx°ö¢½[ÀÔ¡¶VÇ7ßÿȬÙqàðQÞ{çm’ûömÓ=23÷RTTtUÀk© xé…ç?n,N§…¢±ïÚ€ÙîÚgÇéôÚtáž»ïbÉOK©®®fÖmlÚ¶ƒÔýIèGTD±ˆ¬‹Ù,]¹ÆS¹ãé§žô$v¾úòK¬[¿‘?ûiƒÑ3:Êë{ëï¼!‹½t«Õ›¬v»Ã+„Íh2¹ê»w–’ÝnÇl± ÓéÙ¸e;÷ìåøÉÓØí®`Òwßù;3o»Õ³9Fý*$€×¦B¡ÐO°eë¶:"^øo @w5qn7pSkÝuŠYsÊÙàAI¿ÛÒÇIDAT9zh?¯¾þg}»‡ÃÁÞ‡¼LÃúxàþ9üññ?xÞGFFòæ_Þà?ÁÁC‡½PÿÁ69g7h—Áè-q[ZTºp1›ŸV­aæ­˜ê‘, €E_ɨ‘#Z|pÍ)ÉÙ—.«¾ïºÿhüT~„‡‡wì& ´€G~ˆƒ’¹w/™{÷“M·ðpââb‰‹‹eô¨QÜ>>ñÑÑÑ¢Þ½{1,#ƒ?üþѶ)a‹×ΛõÍ­ßýþ1þóãÆŽÎë/Ìm2JÇ`4¶zúyêùWÈt'o…BÆKß¾I ÍÈ =mõ§µk‰}û÷STTŒ’´!C=vç²²rXÀÒÙ%€? ,Òõz½È•h!`Р¶o‰b³Z›$À‚?â??.aÚÔI¼ðôMŽr‡ÃÑê-åív;ûꙘ«V,cðàAíÞ²îžíɺpño¿ý./]"$$­+ZùôÕîükå \„+}5ÐÀa·óùgŸ’6$µÍ&XsîÒ2wÐÇÏë71ïÕ¿°ÿàá&®·´ÚÝZRZæñø¹ìõê.ÍE'_ wÝq;¿îÞÁ”É“(--Ãl¶¬î¹ÒæjK? %5u°ß+/½HEE•••TVU¡­ªj³%`³ÙšíÀ×_{»ÃÎç_ü›»÷°c÷’“ypöÝžÊm}R©¡PˆÃá ¼¼œ¼ü|¸QP*,^ô5·Ì¸í;vúÑŽ:À­Õد&žfN2™Gy˜ÄÄâãã;ft»¢`ÅõVÑšúß„ñã¹cÖLª««9uú Å%¥¬Û´…£ÇO’Ô'M@J¥‚SgÎyrÂBC1|x‡$@kv»’â§e˸xñR0°(éìJàÏR©tòò¥K9µš×–TðŽ +ëÄ“ÀqR¸:,N^W·”}âZ}ÇÕ”ùúú>¾rùR’êN’˽77¸¥ãdÉß‘uî 6‹«ÕÆMS¦2rÔdr¹§˜b{ç`½^ßhNÇù 9wî™{÷±öçŸ).n<­j4Öý¼š>ññ7”÷Íy€+Vêqmûz¬³`C\\섃û®®ît:9~ô0Ÿ}üáÝ"xöù—0¬[»Š#2çá߆ŸŸŸ—e6›½Öé …—ëµ¾ßÝl6{6Œª³(êÇH¥RÄb1âØñãääæRTTLïÞ½™1}áaažPu§Óé‰9pMb¯õ‰†Å-d2V«Õ³äܦÝB$ßcøÈ1=vì8®jëÎÎLp:H£éyë­Ó™7w.!!Á­ºpÝÚ5 f̺»ÝŽÉhäþ¹€©iŒ7¾Ý j(ÚŠ¶è.6›£‡röìi‚‚‚:|$„Ò}ò È6­V»˜y­¤ÌÕrº „BŽ;Áûó]¡ÜW År:TUVÐ#&ƒ^‡Á G"•ñô¼©¬(çÐþ}ínPGK±K¤­×ÞÿüÊK,ùá;zÇÆa4xõ…çø~ÑW˜ŒíÝ[³fmð(×WËðöÔdágŸ0a¼+Ðd46i›Í&vnßÊšU+ˆéGttÄ Nä£ "1©/:]- …üŠ5šm\}·Ò‰ät:‘J%˜Œ&jª«¹ãžû>r4¡¯¿XHϘÚS'ù‹/¿äøñÕîg[q­pµ¦€þþêñ»wl£»{gn½^ß(Þ­þÈ·Ûíˆ%´Z-R©¡P„Ñ`@«­båÒŸÈÏËE,3lÔhÆO˜ˆâ*l®p-át8xóWyáÕ7\•H$jkjùìãÜvÇÝMn:]ŸD‡ÃKYž0i ™™{Ꭿ¼V»§n¸ÂÚãhèôïïé|—rÓ¼] "v+oõ£år9¯½4œNž|öy4AAlZ÷ Ï?ûwÜ}C‡¸²ó¥••ÁÛ‚ÊÊ Ö¯]ù3§ñS«9z,S‡x~ßù¬s¬]¹‚£Çb6›  ¨¬ŒˆÈHž}áeÖ¬ZaÍ„È]¼x‰3ga±XQ(äˆEbkn^^!®bÐ×àg·™Q‚+âä°Û}¾5eH~&=ôàýÌÿ½7È ×SZZÂçŸ~Ì›ï¼ï‘‹¿ù €Ù<Ô¢xïHñ—ò§óhÿuxì‘QÈåüiîóèt:6¬[KÎ¥K<úøTkµÔÖÖ‹X$Æl1c·ÛéÖ-‚’’bzôìå’ˆ:> î{Ù460ýÖYœ:}šêêê*\™?ÏãZU½¦ÏÇöŠîÛ³‡F(ÄMæA‡cð ®Ý¾'5®åH]=I1øCpp°dþ{ï¶Xü¸µ0»GÁÉãÇ88PˆÑddHúPL&¿îÚAßä~͸NØŽv—rµ¸7„lX 8-c(¡aa,ÿéGf̺!é IÏà‡Å‹Ôh3~jµ?©Œ à`5H$üë-&µ´& ‘Hš‘L*%00Pa6™ûVWWß,ÄrM%ÀÖñ#‡Ž~ô·wát:ÉÉ+à×GÈ+,¢¨¤”òŠªúáÍF\µiÊÝÓG ŸóÛÙ|´`~‡STXÄö-¹x>‹;îMHHµ5µ®üQ*}(*,D«­$!±ïUý-]o6›Xðþ»<ùÌ\„Bv»™LÆÊ¥Kð dôØñþþ:<ðÐÃ,ùiÙ> ízL ú&Ä=ñÒS¿o4w:NÊ+«Èº˜Í¥œ|ªªkÐÖÔP¥­¦ºVGM­Ž˜˜^lß²ÉóÃÛ’ÖYgÏB¡¤´¤§ÓÕ†°ðpòór‰êÞrh™Ãáh×.Þ—¥Oãè#‹Å–8|p?ÓgÎ"ºGOtµµX̺EF" 9}ê"¡˜½zuhõ¯Î==tø(N>ýOà׃‰ Sà¯êÙŸl]È–Ñd&¿°˜ÒŠ*ä %™"ä¾JÔþþÄöŽ¥Gž„††\³€ÐëÓ'ã§ 8$”êê*lV&“‘={‘›“MtžWÅñT‡+V2çÁ‡õv»=vlÝ.30À_}~âèá1Æ "<4¸Ã75[,”–WPU££VoD"•¹‰Äeˆ%ˆD"B ¹µZŸZŸŸjµ_•/*__T*Õ5yÚƒÙsîgùŠU»€×ãûÄ2©´pê„11Š6n£Ú¬_X*%ª[8Q­XP³Ùì˜ô•”T‘m2a¶X±Xl˜­VW!e‘‘PŒH"F$!‰‰Å…"Db÷{‘„°°0BCC F£Ñ´z.noÜÞµ€Ñdâè±ãp•êÿ´Å4`ÚÄqfß>]øß8jµ:=Õµ: &:ƒ³ÅŠP(F,‘"’ˆ‘ˆ%ˆÄbÄb1õ‹…™-ä2©'A·Sœ8œÜ®Õ§§ûÁ9Óéª}ç¾iÝ­Åb12…‚‰'ßÊUÅ¿¿ó{ëïyN§s®¡®Ÿ>w¡ÿo$€P(Dí§Bí§êtmûyÍšV ¨¸˜Å‹ãt:W\¯Î‡z‹A9yù‹Þœÿ‰£¼™<ü.´z]M#ie³Ù¼ö7xú™çÈÎÉ=¼|=Ûç±û,6Û¼Ã'N—=ÿ—w_ ðW«ýTøú(ñQ*Q«|‰ìFDxAþÊóûÿ™XDNvÑ=¢1™L®‚Q N—¯XÉ–­[–5׳}M©Ø±À}¸‚ÃpíüéI$b‘¯R‰R!ÇÇÇ_¥__Iü|}èJXH~*_ü|}½vÞøÿ §ÓÉÉì"žyöÙ&ÿèÐa~ô÷œ;—u—KÞtC$@} ðjƒsA@/«Õ6°ªº&¶ªº&ÈMŒ ðu>@(—I‘ËdHeR2r÷Îuçårr©_%ÁkñóóÅW©t]'•üŸ!€@ ÀbÐQ\RBX¨÷ö³›6oæOÏÌ%;;ç,ð»ëÝùÍI€vI: Wbho ‡ûµÊM Uƒ×¾€û¯P  “ºÈ!‹‰Dî­ZÄH܇X,B"‘¸þŠÅˆEb$±ç3R©¥BRÊו¯/¾Jr¹Ìuo¹ ©DrCü N§“íûŽòì¼y( ~øÏlÛ¾ƒ=™{)..>ç–¸ûnAoÔÔX01¸6— îÿÕÒ+¼ãÚ™¬î¨;/©³$ 7i\Ä#ºJÖ]»5y^ ¼×ã pŸ«ÿºÞ箽|Ϻ6…r K°X=õþ‹p­¸>ÇUªýÿßD€« ¹›8J÷_…[²¨Ý¤òs¿öuCê>¾–58_G0ޙΛ:×ð:·rWí>r\‡åÞ.t¡ ]èBºÐ….t¡ ]èBºÐ….t¡ ]èBºÐ….t¡ ÿ_ñ¿"_ë<îgâxIEND®B`‚stem-1.7.1/docs/_static/label/0000775000175000017500000000000013411004021016631 5ustar atagaratagar00000000000000stem-1.7.1/docs/_static/label/source_repository.png0000664000175000017500000000530513157571677023202 0ustar atagaratagar00000000000000‰PNG  IHDRæ#€Ov¼sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ7 ŠlYStEXtCommentCreated with GIMPW IDATxÚ휖UÇ?,D«+®ËAT~¬‚”`P&E¤“0MI˜&9b£B‘1‘ C”?‚DM†¢ÉkÓ&SCLr“~À¬*%lЏ 2°+ì²,»¼ýqÏÓ{÷¼÷yŸç}Ÿ÷Ýö~gžçÞsïsï=çÜ{î9ç]ðððððððððððððððððððððè8ts”LÎFÀËÀKÀ_z`pXå—0FÃbÐ5{=ÀÁ.¼^}YÀÀ½ÀºÊÄgu¢ŒW—w‡€£ÀVQÊ%^¯ãRàAYÛ”ãi¶µ@«””6“ºàzU[kS”u…I_mMúÓŽú³ÍWÌÂáÂÅüZÿgUý3ÀÉ]d:Ö狺àQ`Ú‰0éþÀ~™ìÎ7 Ûí³(xW ]«ƒf0Ьèžzt‘5ÚnÍû¨(«Æ©ÿ‰0ák¬ ¯‹ â³(x-†b¬wœu‘5ºX lf8ê§ÇNÅ vÚ¨{O_`_ÁØîõ¨Óð†£ìãÀ¦.0÷Mâópa°:‹µw\¡Ä²ß¼Olô3³´[ ü7¦â•>ß+÷”88(IÛÐs8ì(;­ˆc,ÃxAóÙôsáýûájÝ+€ž1ÚN6ÄX‡bËèÀB3ûó¨I0ŸÉ^üãA|^þý'0×±£]ls<0|7¤~¦ºû¾è ù¶Ô߀ ù¤€Wp{4/þ ¼-4ÀãÒ¶\ÑV÷»€×1^Ó½À=9(t¾¦ìc^]é ‹3Æ©!k;MN g1žá”øîŒ!À¹ð>°Öªe¾{åýŠŒý€Œ#LFÆJ½Ë«½Ë¢;'á8󑯰1o“u ú­QuŸ·?üaË6×O½(n=¨’vÍÀh).‚žž<@wà;Žïžmê6U?O}{8&®eÓ,ntôýŒÕî$`éPÄùRni3iïç…b-¤ä¾ƒ0ò)«zI1KŔը7ƒ\Æ8t(&xnÆÄL«?(ÙØ(J_ÞÅ„ÞRÀW…×äûÁ†0Ndd¶ƒ“¹.ÞQuUR¾è“pœùÈWw9TtÝO•âŸü^êœfú!Š< À1 axÈ¢¿OÕ­°êžTu²(f€-Š p·¢Ù&wå»,H‰ø…Uþ3«|²êër1«j­²ÉÊñ”/*‚bö”ÓΦySSÓå:ÆçT¿O„ð.,+ï·JÙÛŽþ–YŠ\±šŠéòØfsþä+£ùÈWw`‡j³ÚÑïj±„œ(ÖD(gJŽ×é9UÑÍUõ³TýVÝ)1óéйÄÑO¥Ô}Nà puZاÁµV_½Õ)=¸IõmŸ•ÊÊè•P1Ûd<‹0Vï(…¼Åab“ç«U›Ÿ¨>GªúÃÀ „¼/WkÿQÕ¦xËRLdÌI3‰Œæ#_8NÔCJ6J0I=Ó¢œA ÈŒ©é§ÆqÔëmŠªŸèØmŠ­˜ÿv\ôíl-ãýírïyPvìêDë¦î!v_*æ1ùnÊ¡°c²ô“Ïõ:Ìqô»OÑ\—÷§«ïðMåìªø•T1“Èh>ò8ÏdY»KåÚÐÃå• pL„±ø%&ˆëÂÙ±í{âhEÓñ~nL[<¯Þ[Õ8ƪz͈bfÏ·7‹£rùŸ/Ïl‡S# ŽÉwåØÊ¡“mÒ»èÜß6È¥ÛÆW"èušâ„ï<¹bØ8îéˆ1ö Ù¨òå}±ÆÀx_狹Y¥h?Y ñw¶Œ>¦îé˜PVU”bN&ú7~/)/m"­Š`äéê}•2)Z#­Xã¸7 ¡íCf¬iîL˜K¤.”8NDû-A¶1œ· Ðc"O€ê;ùð~0&.;Ü*ß#ÎåÊ¡’l§ÍÈÈhR´bªZY÷gk¤4ÕF(Ä÷H»|g8løYõ?Rõ‹­ºío—Ϊ˜¥6ýªþnÇø–*šÍ‹UAfÆÈ›ÊéÐ ¸U¾7óé×’ŽKu®’>GåȸF2C#½tUºw-gL>c¬VôÏ)e^¤ê€÷“äýÇÏ·è[|hRã¸Äjó$™6`B¿-Œæ*_ƒiŸe55ªkXC:-ÍÞÍ'[tKCúC:·Ã†2Òñµ7h4p³št£ázQ–ªþ-iSj9>tœê™ñPÏ’™kÙŠù%ÃÃ2Þ;¬ìF2SØZD˜D)rý‘ãÅKN‹¾˜@¶+ñ£_žc¬vlNO_Æd{Ù}m Ù¼såý$k­çÑ>mîv©«# 1Ñ1g[±®rÔ¿&r2°2š¯|i<*m÷ÐÞƒª˜O‰ç¯I·ø±œuÒÙ â½Í†rL\¦ “лB.Ðm˜\ÍÞYLWZàÆÇ1±½ZQÖ{å/“ûÊÂ"þ1æJqlév;ÉÌ „j7™Ù0ÈÌ`Ɇë#ÆÞoQíf„Ð6gå1F­˜s€oaÂdöfu?ÙCJ¹ð~’”ÿN„ôˆ˜vrlÅ„„årße9rÖZÖB+ðܱÚ\e4©|Ùø îì*ç=æVa~³,üyòœ+ òª˜š/È{œ \ B¿SEqâf£¤]“ìð»¥|<&1{_ïœ0Σ ó‡Çê"Ön&I¡AN’ü·wŒÕ´Ï‹Éî|DNÛMÄ{Æáý@áõy?K”¨B”¥ÆáEƒ^˜Ë–¨û[M‚Rq(]@çF%<ޏNLÂ@Çg/þ–«'ÐÃã0(+£^ÌãóðöÕ#&ô_ß»Ç/Ibè_ªôÃ$éÔEÜÓ=<ãÔŽN¿Ó‰£ÖtƇ3Ã/G¦é¹µC& ü%Â÷I‡fj1ix±àwÅ® ÜÉüš0iiÉГÐáááq<ã*ãö÷CNIEND®B`‚stem-1.7.1/docs/_static/label/resources/0000775000175000017500000000000013411004021020643 5ustar atagaratagar00000000000000stem-1.7.1/docs/_static/label/resources/mirror_mirror_on_the_wall.xcf0000664000175000017500000002055113157571677026670 0ustar atagaratagar00000000000000gimp xcf fileú6BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) º4¤ `=Mirror Mirror on the Wallÿ      "[gimp-text-layer?(text "Mirror Mirror on the Wall") (font "FreeSerif Bold") (font-size 20.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 352.000000) (box-height 61.000000) (box-unit pixels) Û`=û(`=  •ð@@@þT„„þEþZ„„ú;,­z'ý TÿÿýØóñÿÿùE¬ÿÿ+(úßÚÿÿFúo·ÿÿÇûwÿê (úØoÿÿ²ù»kÿÿ´ý( )ùØôÿý!öH{hÿÿ´&88ü88ùEI88úEIû#Y[&þ88úEIùØ–ÿÿ‹Ì®hÿÿ´Gèÿÿ(%ÄÿÿdÁÿÿo%ÄÿÿdÁÿÿoþ“‡þ— %ÄÿÿdÁÿÿoðØ*ÿÿî #¥hÿÿ´Õ¦ÿÿ(^ÿÿÝtãÿˆ^ÿÿÝtãÿˆŒÿ¸³ÿ”^ÿÿÝtãÿˆðؽÿÿd>hÿÿ´Õ ÿÿ(XÿÿV XÿÿV #üÿŠ…ÿý&XÿÿV ðØQÿÿÐ Ãhÿÿ´õ ÿÿ(XÿÿpûXÿÿpðZÿÿ|wÿÿ\XÿÿpðØáÿÿ£khÿÿ´õ ÿÿ(XÿÿpûXÿÿpðtÿÿroÿÿxXÿÿpþØôxÿÿó hÿÿ´õ ÿÿ(XÿÿpûXÿÿpðQÿÿywÿÿUXÿÿp÷Ú÷ÿ˜ûhÿÿ·õ ÿÿ(XÿÿpûXÿÿpðôÿˆ‡ÿöXÿÿpü ú<üŸÿ.ûÿÿáõ­ÿÿ4gÿÿŽûgÿÿŽñsÿ½¿ÿxgÿÿŽñhÕÿì¤2Ä­ôÿÿñÌBnöÿÿÈ =áÿÿîŽù=áÿÿîŽñiô²³õl=áÿÿîŽ1û// @@@þT„„þEþZ„„ú;,­z'ý TÿÿýØóñÿÿùE¬ÿÿ+(úßÚÿÿFúo·ÿÿÇûwÿê (úØoÿÿ²ù»kÿÿ´ý( )ùØôÿý!öH{hÿÿ´&88ü88ùEI88úEIû#Y[&þ88ûEIùØ–ÿÿ‹Í®hÿÿ´Gèÿÿ(%ÄÿÿdÁÿÿo%ÄÿÿdÁÿÿoþ“‡þ— %ÄÿÿdÁÿÿðØ*ÿÿî #¥hÿÿ´Ö¦ÿÿ(^ÿÿÝtãÿˆ^ÿÿÝtãÿˆŒÿ¸³ÿ”^ÿÿÝtãÿðؽÿÿd>hÿÿ´Ö ÿÿ(XÿÿV XÿÿV #üÿŠ…ÿý&XÿÿVðØQÿÿÐ Ãhÿÿ´õ ÿÿ(XÿÿpûXÿÿpðZÿÿ|wÿÿ\XÿÿpðØáÿÿ£khÿÿ´õ ÿÿ(XÿÿpûXÿÿpðtÿÿroÿÿxXÿÿpþØôxÿÿó hÿÿ´õ ÿÿ(XÿÿpûXÿÿpðQÿÿywÿÿUXÿÿp÷Ú÷ÿ˜ûhÿÿ·õ ÿÿ(XÿÿpûXÿÿpðôÿˆ‡ÿöXÿÿpü ú<üŸÿ.ûÿÿáõ­ÿÿ4gÿÿŽûgÿÿŽñsÿ½¿ÿxgÿÿŽñhÕÿì¤2Ä­ôÿÿñÌBnöÿÿÈ =áÿÿîŽù=áÿÿîŽñiô²³õl=áÿÿîŽ1û// Š@@@'þZ„„þ5öN!Îÿÿ(4ü.õ8û ÿÿ(3ûÜÿ8û ÿÿ(þû#Y[&þ 88ú JJïØÿÿc8 ÿÿ(UBú7eLþoìþ“‡þ— 7Ùÿÿ[Ûüÿä åaÙÿÿ»¨ ÿÿbãÿÿܾæSžß*þˆìŒÿ¸³ÿ”‰ÿÿ­Eÿÿ|ûÿÿ8í ÿÿ ^ÿÿd²ÿw+ÿ¾þ ë#üÿŠ…ÿý&„ÿÿDþÿÅûÿÿ8ì ÿÿ(ÿÿ­.ÿÿVÿÿ! ëZÿÿ|wÿÿ\„ÿÿDüÿÌûÿÿ8ì ÿÿ(ÿÿ´^ÿÿ¾¤¨ÿÿP ëtÿÿroÿÿx„ÿÿDüÿÌûÿÿ8ñ ÿÿ(ÿÿ´vÿÿwþ ëQÿÿywÿÿU„ÿÿDüÿÌûÿÿ8ñ ÿÿ(ÿÿ´YÿÿŠëôÿˆ‡ÿö„ÿÿDüÿÌåÿÿ: ÿÿ(ÿÿ´%ýÿÙ+ ìsÿ½¿ÿx’ÿÿP þÿ×åkÿÿŽ{F­ÿÿ4!ÿÿŸÿÿ©=X« ìiô²³õlYïÿÿÕ¨ÿÿþ{æ×ÿôxnöÿÿʾÿÿùl ÿÿü¾ û//ý$ü9 ‡@@@þR„„ý"#„„øƒ„„RþZ„„üZ„„þý®ÿÿð8[êÿÿµиôÜÿÿ Üÿÿ þ(ÿÿþ$û…ÿÿ»ýÁ* õ¨ÿÿ ¨ÿÿ ûÍÿÿuö8ÿÿø Ì õ¨ÿÿ ¨ÿÿ ûsÿÿÉöyúÿÿX^}û(a<õ¨ÿÿ ¨ÿÿ ÙýÿþÌ€ÿÿ«±(XähLÁõ¥¨ÿÿ ¨ÿÿ Ú¿ÿÿq=šýÿô Ëõÿ<Bÿÿn¨ÿÿ ¨ÿÿ ÚeÿÿÅŸ6½ÿÿPX~ðÿe ÿÿ¨ÿÿ ¨ÿÿ ñùÿþ'Æaÿÿ£«(ë"C+‡ÿÿ ¨ÿÿ ¨ÿÿ ó±ÿÿÊoöÿðÈë[ÎÇhÿÿ ¨ÿÿ ¨ÿÿ úWÿÿøû©ÿÿ~ê²ÿÕ$ÿÿ ¨ÿÿ ¨ÿÿ û òÿ§ûNÿÿ)êOÿÿ‚$ÿÿ ¨ÿÿ ¨ÿÿ ü¢ÿCüìÔêZÿÿËHÂÿÿººÿÿ0ºÿÿ0üHÝý–éÏÿÿÈ*ÑÿôToúÿÿÇ oúÿÿÇ ý/ýø-7  £@@@@    °X,^6 New Layer#1ÿ      Ü^6ü€Œ˜^6 0@P`p € € € € € € € € € € € € € € € € € € € €TTTT¯W +`=Tor Descriptorsÿ     Qgimp-text-layer5(text "Tor Descriptors") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 352.000000) (box-height 61.000000) (box-unit pixels) ©`=Éë÷ `=í¡fËÛ@@@þGHHþ!þ%HHýþÿÿüùØ×ÿÿüÙ×ùÿÿþ!üHÅýÿÿöòÿÿãchÿÿ÷tcäÿÿ#þfÿÿùðÿò!þhÿÿþtû$ôÿ #þÿÿúÔ ÿrþhÿÿþtüsÿ #þÿÿúÔ ÿ!þhÿÿþtü#ÿ#þÿÿûÔ ¬þhÿÿþtý¬ü"þ þÿÿþÔþhÿÿþt÷^ÇóÐóÌmýÒÔÔøsjÖÿ×@þÿÿþÔþhÿÿþtô§ÿø,$õÿµý$ÚÿÿýŒkÿÿþ¿þÿÿþÔþhÿÿþtû©ÿÿŸû–ÿÿ¸þ’ÿÿøÔì‘ùÿÿàþÿÿþÔþhÿÿþtþKÿÿþmþcÿÿþVþ„ÿÿù&PêófþÿÿþÔþhÿÿþtþËÿÿþGþ>ÿÿþÔþ„ÿÿþÙý þÿÿþÔþhÿÿþtý÷ÿÿþ<þ3ÿÿúû„ÿÿþ©þÿÿþÔþhÿÿþtþ(ÿÿþ2þ)ÿÿû,„ÿÿþ¨þÿÿþÔþhÿÿþtþ,ÿÿþ*þ#ÿÿû7„ÿÿþ¨þÿÿþÔþhÿÿþtýüÿÿþ2þ.ÿÿû „ÿÿþ¨þÿÿþÔþhÿÿþtþØÿÿþ>þ9ÿÿþáþ„ÿÿþ¨þÿÿþÔþkÿÿþvþsÿÿþRþOÿÿþ|þ„ÿÿþ¨þÿÿþÔþ€ÿÿþŠúÓÿÿ…úƒÿÿØþŒÿÿþÉþ$ÿÿþèýÖÿÿýÛô0àÿÜ Üÿã4ý Ëÿÿýù ý ™ÿÿþbü=ÞýÿÿüýàMö¥ý×–Öý¬ýïÿÿþ¶ ýlùÿÿú 9_< b@@@€üE';øÉíüÞºx 8÷.Ìÿÿâ[8ý§ÿÿýÅ 8ýòÿÿþ—9þ†ÿÿþM8ýýÿÿýëýø$ý þþãÿÿþ2÷ŸâáÞè“ö-Àüèø×Ÿï4ôJ¾ê×õ´jÒÔÔ÷sjÖÿ×@iþÄÿÿþ`ê2ßÿ®¬ÿÏ 1ùÿayúÿ4ñ –ÿó+vÿÿÉ $ÚÿÿýŒkÿÿý¿þ¥ÿÿíŽÞÿÿDLÿÿ~Îÿêüÿ4øšÿÿ”DÿÿûR’ÿÿøÔì‘ùÿÿàþ†ÿÿû·rÿÿó&ÿÿðþÿÿ9ëé4;þÿÿdýÿÿS„ÿÿù&Pêófþ~ÿÿôÜÿÿüÿÿñTýÿÿôo" Àÿÿþ5ø‰è¤„ÿÿþÙý þ—ÿÿøoüÿÿ÷ttþ|ÿÿýkÃÿÿüäjþñÿÿþ þ„ÿÿþ© þ°ÿÿüB(ÿÿþ®¨¨ü_SüÿÿúÕ%ÿÿþþ„ÿÿþ¨ þÈÿÿûþ2ÿÿþ"ýGñÿÿûá4ÿÿþ+þ„ÿÿþ¨ ý÷ÿÿû”ÿÿþEüŒôÿÿüyÿÿþQþ„ÿÿþ¨ þsÿÿýÛ þëÿÿþ€ý$iý¦ÿÿûºæÿÿþ±þ„ÿÿþ¨ ùÚÿÿý<þžÿÿýãûB£ü$øÿÿ¶“ÿÿýü)û„ÿÿþ¨ù¿ÿÿåQý÷ÿÿö® Yëjÿ¢÷+ÿÿƒëÿÿõå%‡’ŒÿÿþÉ÷>tÕÿý’ýküÿÿïúÍñ÷L@ÿüp‰ÿæýNôÿÿöüȪ㊠Ëÿÿýù ùÿêÀ—m,ý@äÿÿñ÷½9@ý¨çù³ÜÿÎ.ý&ÌÿÿùÝmïÿÿþ¶þmú$UF öCL]4ûKVQ@@@ûw‘&:úÀÿÿð 8þÿÿþWü±L!úØÿÿûü„ÿT!û8®ÃUûLþÿT9ú4ïÿÿT/ý ý;ñÿÿþTü"þÔý1KÔÔ÷L4Âúÿäý4ôÿÿûâÔÔ!÷^ÇóÐóÌmýÒÔÔôsjÖÿ×@-eÿÿû<;üÿÿñyçÀ²þÿÿÃ2|ëÿÿî§||§ÿø,$õÿµý$ÚÿÿýŒkÿÿù¿1ùøÿÿû<Íÿÿúó?–ÿÿþþØÿÿþTû©ÿÿŸû–ÿÿ¸þ’ÿÿóÔì‘ùÿÿàÎÿðÿÿû<Àÿÿþ‹þ)ÿÿý÷þØÿÿþTþKÿÿþmþcÿÿþVþ„ÿÿô&Pêófþÿðÿÿû<ÀÿÿþlþìÿÿþfþØÿÿþTþËÿÿþGþ>ÿÿþÔþ„ÿÿþÙ÷ ýÿðÿÿû<ÀÿÿþlþÒÿÿþ‰þØÿÿþTý÷ÿÿþ<þ3ÿÿúû„ÿÿþ©ûÃÿðÿÿû<ÀÿÿþlþÃÿÿþ«þØÿÿþTþ(ÿÿþ2þ)ÿÿû,„ÿÿþ¨ûSüðÿÿû<Àÿÿþlþ½ÿÿþ þØÿÿþTþ,ÿÿþ*þ#ÿÿû7„ÿÿþ¨üGðÿÿû<ÀÿÿþlþÍÿÿþ~þØÿÿþTýüÿÿþ2þ.ÿÿû „ÿÿþ¨þðÿÿû<Àÿÿþlþáÿÿþ[þØÿÿþTþØÿÿþ>þ9ÿÿþáþ„ÿÿþ¨ú$iðÿÿû<ÀÿÿþlþÿÿýîþØÿÿùZ)sÿÿþRþOÿÿþ|þ„ÿÿþ¨ú@ü$öÿÿûBÀÿÿúÍ~ÿÿþ|þ¸ÿÿõŽf¦Óÿÿ…úƒÿÿØþŒÿÿþÉû@ÿ¢>ÿÿû…Àÿÿöåº]‚üÿÿà þYÿÿïàé0àÿÜ Üÿã4ý Ëÿÿýù û@ÿüþÿÿü‘Àÿÿ÷lqûÿÿü¡ø®÷ÿüÁ-ö¥ý×–Öý¬ýïÿÿþ¶ü@ý¨þÀÿÿùlJD ü Gú 9_< ýCþÀÿÿþl9þÀÿÿþl9þÂÿÿþ“8ýïÿÿýÏ6ýGäÿÿýåw5þ((þð@@@ø$6÷Àüèø×Ÿï46÷ÿayúÿ46þêüÿ46ýÿ9üé46÷ÿôo" 6ÿüäj8ÿýÕ%7þñÿÿýá6üŒôÿÿþy8ý¦ÿÿþº:ûÿÿ¶:û+ÿÿƒ6÷p‰ÿæ6øçù³ÜÿÎ.8úL]4y@@@@    °X,,  New Layerÿ      µ,  Õ!E!Q!], õ!!!%!5€€€€–K%stem-1.7.1/docs/_static/label/resources/fedora.xcf0000664000175000017500000000611113157571677022645 0ustar atagaratagar00000000000000gimp xcf fileZ BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ¶ = \$Fedoraÿ     Ggimp-text-layer+(text "Fedora") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 92.000000) (box-height 36.000000) (box-unit pixels) °\$È 1\$Üy   €þ%HHþ"þHHþüBíÿÿúúÐÇÚöÿÿþ|üˆÍÿÿþ@þ@ÿÿþ6ù8­ÿÿ|þÿÿþ@ýíÿÿþüü€ÿ|þíÿÿþ@þàÿÿþüüß|þìÿÿþ@þàÿÿþüù,Š|þìÿÿþ@þàÿÿþüù¨P=]ýù!ìÿÿþ@ü" þàÿÿþüüçP÷ŸâáÞè“÷²ðÿóšìÿÿþ@÷^ÇóÐóÌmýÒþàÿÿþüühÿPõ2ßÿ®¬ÿÏ ö2æÿÿç•ÅÆóÿÿþ@ô§ÿø,$õÿµþ$þàÿÿøüròÿPéÞÿÿDLÿÿ~áÿÿõ*…ÿÿþ@û©ÿÿŸû–ÿÿ¸þàÿÿþóÿÿþPþrÿÿõ&ÿÿð gÿÿþ¨ýñÿÿþ@þKÿÿþmþcÿÿþVþàÿÿøü4Z¼ÿÿP÷Üÿÿüÿÿü>Õÿÿþeþìÿÿþ@þËÿÿþGþ>ÿÿþÔþàÿÿþüüŽÿPúüÿÿ÷ttþ|ÿÿükûÿÿþJþìÿÿú@÷ÿÿþ<þ3ÿÿýûþàÿÿþüü ïPþ(ÿÿþ®¨¨ý_"ÿÿþ:þìÿÿû@(ÿÿþ2þ)ÿÿþ,þàÿÿþüý¶Pþ2ÿÿþ"þ7ÿÿþ5þìÿÿû@,ÿÿþ*þ#ÿÿþ7þàÿÿþüýh>þÿÿþEþÿÿþDþìÿÿú@üÿÿþ2þ.ÿÿþ þàÿÿþüþëÿÿþ€þõÿÿþWþìÿÿþ@þØÿÿþ>þ9ÿÿþáþàÿÿþüþžÿÿýãûBc²ÿÿþýñÿÿþ@þsÿÿþRþOÿÿþ|ýõÿÿþ!ý÷ÿÿö® Yë*2ÿÿúß wÿÿþfúÓÿÿ…úƒÿÿØþfÿÿýýküÿÿúúÍñ÷Lþ•ÿÿú¶]ºãêÿÿïÚr0àÿÜ Üÿã4ü hìÿÿüòÓ6ý@äÿÿü÷½9ý{üÿÿöÃÔÿòÄ™yö¥ý×–Öý¬ýïú$UF ö DY%B$ú 9_< ðððXþû! ÔìsjÖÿ×@iÔðÛÿþÙp þÚÿÿýŒkÿÿñ¿¸ÿ®+ÏÿÿÍþ’ÿÿóÔì‘ùÿÿàhÿÿÀþuÿÿþ”þ„ÿÿ÷&Pêófÿÿû+6ÿÿþÕþ„ÿÿþÙó ^ÿÿñ0ÿÿþðþ„ÿÿþ©÷Jv( iÿÿþðþ„ÿÿþ¨úO­õáÿÿþðþ„ÿÿþ¨øeãÿÎO4ÿÿþðþ„ÿÿþ¨÷ ÉÿÿÙ4ÿÿþðþ„ÿÿþ¨þ®ÿÿûq4ÿÿþðþ„ÿÿþ¨ýûÿÿû64ÿÿþðþŒÿÿþÉý þÿÿû† ·ÿÿýóþËÿÿýù þ¼ÿÿûÓí’úÿÿû·`ÿÿþ¶ý>ÕÿÿûÔ7™ÿÿý™ü5Tû3Xã.-  New Layerÿ      ã-  ÷-     Z Selection Mask  Z  ¥ =Z ¹ 9,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ@-stem-1.7.1/docs/_static/label/resources/ubuntu.xcf0000664000175000017500000000636413157571677022741 0ustar atagaratagar00000000000000gimp xcf filed BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ¶ è Ân%Ubuntuÿ     Hgimp-text-layer,(text "Ubuntu") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 110.000000) (box-height 37.000000) (box-unit pixels) ±n%É Ün%ÝT @ @ @€þ%HHþ-þ(HHý"HHþ!üD«úÿÿüåšPõKªõÿÿú­BÔÿÿþT#þZÿÿýòû#÷þý ùÿÿþT#þÿÿþÅýºÑþÙÿÿþT#þÿÿþ´ý¢°þØÿÿþT#þÿÿþ´ý °þØÿÿþT#þÿÿþ´ý °þØÿÿúTþÿÿþ´ý °þØÿÿ÷T_ÝÿÿÛyþiÔÔüxÔÔû\KÔÔúLÿÿþ´ý °þØÿÿû×È…Ëÿÿù¬vÿÿú >ýÿÿþpý=ýÿÿúc¸ÿÿþ´ý °þØÿÿúÇÈÿÿþoþÿÿþ þËÿÿþpþÕÿÿúçsÿÿþ´ý °þØÿÿþWþQÿÿúê ÿÿþ þ¼ÿÿþpþÈÿÿþ…þÿÿþ´ý °þØÿÿþTýüÿÿûL ÿÿþ þ¼ÿÿþpþÈÿÿþdþÿÿþ´ý °þØÿÿþTþéÿÿûp ÿÿþ þ¼ÿÿþpþÈÿÿþdþÿÿþ´ý¢¬þØÿÿþTþ×ÿÿû’ ÿÿþ þ¼ÿÿþpþÈÿÿþdýýÿÿþ»ýºþØÿÿþTþÌÿÿû… ÿÿþ þ¼ÿÿþpþÈÿÿþdþßÿÿþÓý×lþØÿÿþTþÛÿÿû] ÿÿþ þ¼ÿÿþpþÈÿÿþdþ¸ÿÿþíü õHþØÿÿþTþìÿÿû4 ÿÿþ þ¼ÿÿþpþÈÿÿþdþŠÿÿþ9üoç þØÿÿþTõþÿÿÈûÿÿþ,þ¼ÿÿþpþÈÿÿþdý Ñÿÿý±ü ä`þØÿÿþuú]ÿÿþ6þÚÿÿúcDîÿÿþ’þÏÿÿþjýåÿÿö¸1#dð±óØÿèöÌÜÿûtþyÿÿúõ§¹åÝÿÿùéyúÿÿý«ü‚ïÿÿúüöÿçYôذ%Ãç¢ãÿÛ:ý¢ÿÿô­´þÞ¹•z LûÿÿþÄ÷ ?`|V1þ?û"XL÷*YO5L¦¦¦}ü±L)ü„ÿT(ûLþÿT'ú4ïÿÿTý ý;ñÿÿþTù’ßÿþÀ$ý4ôÿÿúâÔÔ!iÔÔüxÔÔþ\ ýóùÿÿøâ 2|ëÿÿù§||vÿÿú >ýÿÿþp üáÿÿþoþØÿÿþTþÿÿþ þËÿÿþp þ£ÿÿþþØÿÿþTþ ÿÿþ þ¼ÿÿþp þzÿÿþ³þØÿÿþTþ ÿÿþ þ¼ÿÿþp þxÿÿþ´þØÿÿþTþ ÿÿþ þ¼ÿÿþp þxÿÿþ´þØÿÿþTþ ÿÿþ þ¼ÿÿþp þxÿÿþ´þØÿÿþTþ ÿÿþ þ¼ÿÿþp þxÿÿþ´þØÿÿþTþ ÿÿþ þ¼ÿÿþp þxÿÿþ´þØÿÿþTþ ÿÿþ þ¼ÿÿþp þxÿÿþ´þØÿÿøZ)ûÿÿþ,þ¼ÿÿþp þ~ÿÿþ¹þ¸ÿÿøŽf¦ÚÿÿúcDîÿÿþ’ ý¾ÿÿýéþYÿÿùàéyÿÿúõ§¹åÝÿÿüéy þÉÿÿôí ®÷ÿüÁ-ý¢ÿÿö­´þÞ¹•z ü G÷*YO5¬7-  New Layerÿ      Ž-  ¢- ²    d Selection Mask  8d  P èd d ä,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ€2stem-1.7.1/docs/_static/label/resources/python_package_index.xcf0000664000175000017500000001421513157571677025574 0ustar atagaratagar00000000000000gimp xcf file#BB G gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ¶G!$Python Package Indexÿ     *gimp-text-layer(text "Python Package Index") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode dynamic) (box-unit pixels) ¡$Á#/;$áh –   €þ%HHü="þ%HHþ üD¨ùÿÿ÷óÐôÿÿßzýG×ÿÿþ<þRÿÿõórýÿÿ÷Gü±Lþÿÿþ<þÿÿþÜþ¯ÿÿýó2ü„ÿTþñÿÿþ<ÿþÜþXÿÿþŸûLþÿTþðÿÿþ<ÿþÜþ=ÿÿþØú4ïÿÿTþðÿÿþ<ÿþÜþ0ÿÿþã ý;ñÿÿþTþðÿÿù<" ÿþÜþJÿÿý“iÔÔûÂÏÔÔý…ôÿÿøâÔÔ!ðÿÿ÷<¨îÿûªþ^ÿþÜþpÿÿüAxÿÿôŽ °ÿR2|ëÿÿø§||ðÿÿûaÛîþÿÿýÄü§ÿÿþÜý âÿÿúŸÜÿÿþ£ý£³þØÿÿþTþðÿÿúï_/ùÿÿþGü©ÿÿÿöá2IvàÿÿðXþkÿÿøô æLþØÿÿþTþðÿÿþ^þËÿÿþuþKÿÿÿ÷üåàÙÍ«ný ïÿÿùfCçþØÿÿþTþðÿÿþ<þ¢ÿÿþ‹þËÿÿÿþÜ þŠÿÿúÊŒþØÿÿþTþðÿÿþ<þ ÿÿúŒ÷ÿÿÿþÜ ý"þÿÿû.ð,þØÿÿþTþðÿÿþ<þ ÿÿûŒ(ÿÿÿþÜ þ¹ÿÿü“RÌþØÿÿþTþðÿÿþ<þ ÿÿûŒ,ÿÿÿþÜ þQÿÿüî´kþØÿÿþTþðÿÿþ<þ ÿÿúŒüÿÿÿþÜ ýåÿÿýøþØÿÿþTþðÿÿþ<þ ÿÿþŒþØÿÿþÿÿþÞ þÿÿþ«þØÿÿøZ)ðÿÿþ<þ ÿÿþŒþsÿÿþ1ÿÿþñ úüÿÿKþ¸ÿÿøŽf¦öÿÿþBþ¦ÿÿþ”øÓÿÿ˜ÿÿýd û±ÿçþYÿÿúàé>ÿÿú… àÿÿýÐú0àÿhôÿÿýñf üIÿ‹õ®÷ÿüÁ-mþÿÿüœëÿÿýèý¥üû*ü G+þýJÅ6÷Èþ¬º`6þcÿÿûGæ6þ0ÿÿü·øU8úàÿÞ[;þ©   £þ%HHü="1üD¨ùÿÿ÷óÐôÿÿßz0þRÿÿõórýÿÿ÷G/þÿÿþÜþ¯ÿÿýó2/ÿþÜþXÿÿþŸ/ÿþÜþ=ÿÿþØ ü"ý ÿþÜþ0ÿÿþãò! ÇóÐóÌmþKÔÔ÷L’ßÿþÀ$ ÿþÜþJÿÿë“iÔðÛÿþÙpø,$õÿµý=ýÿÿûc¸óùÿÿýâ ÿþÜþpÿÿòA¸ÿ®+ÏÿÿŸû–ÿÿ¸þÕÿÿúçsáÿÿþo ÿþÜý âÿÿøŸhÿÿÀûuÿÿmþcÿÿþVþÈÿÿþ…þ£ÿÿþ ÿöá2IvàÿÿðXþÿÿø+6ÿÿGþ>ÿÿþÔþÈÿÿþdþzÿÿþ³ ÿ÷üåàÙÍ«nô^ÿÿñ0ÿÿ<þ3ÿÿúûÈÿÿþdþxÿÿþ´ ÿþÜ ôJv( iÿÿ2þ)ÿÿû,Èÿÿþdþxÿÿþ´ ÿþÜ ÷O­õáÿÿ*þ#ÿÿû7Èÿÿþdþxÿÿþ´ ÿþÜ õeãÿÎO4ÿÿ2þ.ÿÿû Èÿÿþdþxÿÿþ´ ÿþÜ ô ÉÿÿÙ4ÿÿ>þ9ÿÿþáþÈÿÿþdþxÿÿþ´ ÿþÜ þ®ÿÿøq4ÿÿRþOÿÿþ|þÈÿÿþdþxÿÿþ´ þÿÿþÞýûÿÿø64ÿÿ…úƒÿÿØþÏÿÿþjþ~ÿÿþ¹ þ1ÿÿþñý þÿÿñ† ·ÿÿÜ Üÿã4ýúÿÿú«¾ÿÿýéý˜ÿÿýdþ¼ÿÿóÓí’úÿý×–Öý¬ýLûÿÿüÄÉÿÿýí ýhôÿÿýñfý>ÕÿÿõÔ7™ÿ 9_< 1ü5Tý3ÿ   þHHþ7ý-ÔÿÿþD8þÿÿþD9þéÿÿþD9þèÿÿþD9þèÿÿþD2ýþèÿÿþD û!  ýþ ôJ¾ê×õ´jèÿÿûDÅÔÔòKiÔðÛÿþÙp ÷0²òûæî½ˆˆù=Íò –ÿó+vÿÿÉ èÿÿþDìrÿó‹.¸ÿ®+ÏÿÿÍørþÿØ- ”ÿÿùt2ßÿ”øšÿÿ”DÿÿüRèÿÿþDü¹â.ûhÿÿÀþuÿÿé”FýÿÿqûÿÿcÞÿÿÕñ;þÿÿdýÿÿSèÿÿùD“à þÿÿû+6ÿÿûÕ¤ÿÿþKøäÿÿèrÿÿþðþÀÿÿþ5ù‰è¤èÿÿúD“ë!÷^ÿÿñ0ÿÿûðÒÿÿþ<þÕÿÿü#Üÿÿþðþñÿÿþ þèÿÿúD“ÿü=÷Jv( iÿÿûð—ÿÿþEþÞÿÿü%üÿÿûðÿÿþþèÿÿþÈÿÿýâúO­õáÿÿûð=ÿÿõ]óÿÿå(ÿÿûð4ÿÿþ+þèÿÿýÃàÿÿþ­øeãÿÎO4ÿÿôð™ÿÿ±Qÿÿü^2ÿÿûðÿÿþQþèÿÿüD=ýÿÿþg÷ ÉÿÿÙ4ÿÿþðóJçÿצþÿêRÿÿþðþæÿÿþ±þèÿÿüDƒÿÿýö*þ®ÿÿûq4ÿÿþð÷«¶i]L#þëÿÿþðþ“ÿÿýü)üèÿÿûDÈÿÿúÒûÿÿû64ÿÿþðûyôÓþžÿÿùóëÿÿöå%‡’ðÿÿúJ%úÿÿû• þÿÿû† ·ÿÿóó3ÿÿî; ý÷ÿÿù·`NôÿÿøüȪãŠ=ÿÿþ~þ£ÿÿüR¼ÿÿûÓí’úÿÿü·`œÿÿóîÉaküÿÿ™ý&ÌÿÿúÝmFüÿÿû¶“÷ÿÿûý=>ÕÿÿûÔ7™ÿÿü™vÿ ÿþ¤ü@XûKVü5Tö3XŠöÿÿþ<0ûdϳù’ºðÿÿl0ûµÿ¸û/þÿF/ûþÿ²û øë 0ú±ÿÿqú5Àé-1óoÄüÿñÏÙæÆj5ú(" ˆ   ‘þ%HHþFþHHþüC ìÿÿüú°„üˆÍÿÿþ@þ'ÿÿþ‡þÿÿþ@þÍÿÿþ0þíÿÿþ@þ¼ÿÿþ þìÿÿþ@þ¼ÿÿþ þìÿÿþ@ýþ¼ÿÿþ ý ù!ìÿÿþ@øŸâáÞè“ þ¼ÿÿþ þKÔÔ÷L’ßÿþÀ$÷²ðÿóšìÿÿþ@÷ÿ®¬ÿÏ þ¼ÿÿþ ý=ýÿÿûc¸óùÿÿýâ ö2æÿÿç•ÅÆóÿÿþ@÷ÿDLÿÿ~ þ¼ÿÿþ þÕÿÿúçsáÿÿþoöáÿÿõ*…ÿÿþ@öÿ&ÿÿð þ¼ÿÿþ þÈÿÿþ…þ£ÿÿþþgÿÿþ¨ýñÿÿþ@úüÿÿþ> þ¼ÿÿþ þÈÿÿþdþzÿÿþ³þÕÿÿþeþìÿÿþ@þ÷ttþ|ÿÿþk þ¼ÿÿþ þÈÿÿþdþxÿÿú´ûÿÿþJþìÿÿù@ÿ®¨¨þ_ þ¼ÿÿþ þÈÿÿþdþxÿÿû´"ÿÿþ:þìÿÿù@(ÿ"þ¼ÿÿþ þÈÿÿþdþxÿÿû´7ÿÿþ5þìÿÿù@2ÿEþ¼ÿÿþ þÈÿÿþdþxÿÿû´ÿÿþDþìÿÿù@ÿ€þ¼ÿÿþ þÈÿÿþdþxÿÿþ´þõÿÿþWþìÿÿþ@üÿãýBc þ¼ÿÿþ þÈÿÿþdþxÿÿþ´þ²ÿÿþýñÿÿþ@ÿø® Yë* þÞÿÿþBþÏÿÿþjþ~ÿÿþ¹þ2ÿÿúß wÿÿþfÿúúÍñ÷L þTÿÿýªýúÿÿú«¾ÿÿýéþ•ÿÿú¶]ºãêÿÿúÚräÿÿü÷½9ýhèÿÿúõÍLûÿÿüÄÉÿÿýí ý{üÿÿðÃÔÿòÄ™y$UF +ö DY%B$¨¨¨=ýõŸâáÞ蓃ÔÔü«ÔÔñ?2ßÿ®¬ÿÏ ŽÿÿþŸì}ÿÞXÞÿÿDLÿÿ~Èÿÿõì ™Ð rÿÿô&ÿÿð +ùÿÿú‘Wì!÷Üÿÿüÿÿû>~ÿÿûþpðEûüÿÿ÷ttþ|ÿÿúkÑÿÿþzÿþ®¨¨þ_ý4üÿÿþœÿþ" þŠÿÿþBÿþE ý§ýÿÿýÝ þëÿÿþ€ûqÝDüÿÿþŽþžÿÿýãöBc=õ5‡ÿÿùý6÷ÿÿð® Yë*ç‚ ëÿÿùÓküÿÿõúÍñ÷LÒÿ"þ…ÿÿþŠý@äÿÿò÷½9oóÿÿë^öÿÿþtú$UF áF #-  New Layerÿ     í- -     #Selection Mask —#·iu#×Y]ae,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿÓÀÀÀ÷ŽG#stem-1.7.1/docs/_static/label/resources/osx.xcf0000664000175000017500000000735413157571677022230 0ustar atagaratagar00000000000000gimp xcf file} BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) º ¼ à ºŽ$Mac OSXÿ     Igimp-text-layer-(text "Mac OSX") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 142.000000) (box-height 36.000000) (box-unit pixels) ·Ž$Ó ¤ °Ž$ë† ”   Àý¤ìÿÿýÜþ{ÿÿüøÌ#ý’ÿÿþMýåÿÿýÐ&ü8ýðÿÿþ¼ýYÈÿÿþz'ü,üÿÿþ,ýÇ\ÿÿþh'û,ü!ýÿÿþšü5éÿÿþh'û,ü°ÿÿýöü¤„ÿÿþh'û,üAÿÿþwûõÿÿþhö#ŠÌÞùïÊ…÷ËçõØ—& ú,üÒÿÿýâû¬ÿÿþhômüÿe ¦ÿÿõQõSòÿ‘<ÿÿùO ú,üdÿÿþUúè@ÿÿþh÷)þÿÿa!ÿÿýöøUþÿíÿÿþß ù,ü ìÿÿþÄý^Ôÿþhþ^ÿÿûæÿÿ÷Zóÿÿ£ûìÿÿì ý,üþ‡ÿÿú3Ìiÿþhú+ûÿÿÄÿûh…ÿÿþûiêÜT ý,üýûÿÿú¢;ð ÿþhø0ub SÿÿûhÏÿÿþlý,üþªÿÿûùª‘ÿþhú ^¸ù¾ÿÿûhòÿÿþrý,üþ;ÿÿüœú&ÿþhø}îÿîCÿÿûhùÿÿþý,üþÌÿÿþ¹ÿþhý Êÿÿü`ÿÿûháÿÿþÈý,üþ^ÿÿþMÿþhþ˜ÿÿüÿÿûh¤ÿÿýþ*ý,ýùèÿÿÞÿþhþïÿÿü ÿÿûh<ÿÿýÀý?ü>ÿûÿÿuþÿÿþyþäÿÿü‰/½ÿÿúxœÿÿø¼4yÇú¡ÿ‹ûùöýnÿÿúЃÿÿüðRÊÿÿùýÄ¢ÿÿý·ýµôÿÿüñÑý£ýˆêÿÿîüÒ{ß÷ׇ2ÐøÝ}øG®çúæ¶UJ   ÅôK“ÏçîëÔ›Qð}Èîíç¸u*Dÿìÿÿùýé@tíÿÿýøKòKÔÿðj cîÿØMö<éí[ rðÿÿúÿÿþ$ù2ÿÿÌEù‡ÿÿñ)ù)óÿÿ…ûðÿVú Ýÿÿþ«ÿÿþ<û"ÿ´þ‹ÿÿþdþkÿÿþ†û“ÿÿû-øÿýæÿÿýÎü¯ÇþVÿÿýåýêÿÿþPûÛÿÿ#üŽÿþHÿÿþuüxâýßÿÿþ˜þžÿÿöÛøÿÿ¯ü þþ•ÿÿùõ"L÷5þXÿÿþYþ\ÿÿûVòÿÿýÒD ý Ùÿÿûº(ñj þ£ÿÿþ3þ5ÿÿû »ÿÿüÆO ý6ûÿÿýî¥ þÙÿÿþþÿÿû×JÿÿüÖ` þ€ÿÿþ# þðÿÿþ þ ÿÿþîþŠÿÿýßEýÊÿÿþ² þùÿÿþþÿÿþøýo÷ÿÿþZý'õÿÿþa þåÿÿþ þ ÿÿþãý&®ÿÿý÷#ýèÿÿýñþÆÿÿþþÿÿþÃü0«þÿÿþ™ûÈ–Àÿÿý¼þÿÿþ7þ:ÿÿû~@Oý/ÃÿÿþÜúŸÌ+ûÿÿþlý,þÿÿþbþfÿÿúý)€Öýªÿÿþøùnñ#Œÿÿýõ%þ§ÿÿþ§þ¬ÿÿù£€ÿ2þ$ÿÿþáü@û\ý äÿÿýÆùäÿÿõôøÿÿá€ÿªþ ÿÿþšüë®þVÿÿþxú1íÿÿ™úŸÿÿì/û€ÿÿPú@ÿÿõ!û Ïÿ)þÌÿÿýú5ù"ÏÿÿùƒÿÿÍ ú€ÿÿõVúÐÿõGú%Èÿÿ>þ’ÿÿýã#ò_ÒÿÚ‹s‹ÛÿÐ]þ€ÿÿ÷Ê„t–íü°%ü ÕþÿÿøâY›Èüÿÿý÷‡ øTk{kSô@d Dbv}pPøøøøG# –  New Layer#1ÿ      d–  € È Ô– ˜ ¨ ¸ÀÀÀÀK%-  New Layerÿ      †-  š- ª    } Selection Mask 0} Hà} \Ü,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ >stem-1.7.1/docs/_static/label/resources/slackware.xcf0000664000175000017500000000675713157571677023401 0ustar atagaratagar00000000000000gimp xcf file‚ BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ² •˜2 Slackwareÿ     Kgimp-text-layer/(text "Slackware") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 152.000000) (box-height 50.000000) (box-unit pixels) ³˜2Ï } ‰˜2ç¨ m € € €„ò _‡¬¡wLle%HHþ þHHþð\æõ¬VRŠôûÎù„Hßÿÿþ0ý-ÔÿÿþDû[ÿÿF÷ Éÿÿ„2ÿÿþ0þÿÿþDúîÿÝûäÿ„þüÿÿþ0þéÿÿþDû^ÿÿ·üGÿ„þüÿÿþ0þèÿÿþDú‹ÿÿúýׄþüÿÿþ0þèÿÿþDþ¤ÿÿýÅýZcþüÿÿþ0û!  ýþèÿÿþDþ€ÿÿüöƒþüÿÿò0iÔðÛÿþÙp ôJ¾ê×õ´jèÿÿûDÅÔÔü6þÿÿüð€þüÿÿñ0¸ÿ®+ÏÿÿÍò –ÿó+vÿÿÉ èÿÿþDørÿó‹¢ÿÿüñ‚ þüÿÿù0hÿÿÀþuÿÿþ”øšÿÿ”DÿÿüRèÿÿþDü¹â.ý­ÿÿýÇþüÿÿü0ÿÿû+6ÿÿþÕñ;þÿÿdýÿÿSèÿÿùD“à üwòÿÿýÏþüÿÿõ0^ÿÿñ0ÿÿþðþÀÿÿþ5ù‰è¤èÿÿúD“ë!ü›úÿÿþ–þüÿÿõ0Jv( iÿÿþðþñÿÿþ þèÿÿúD“ÿü=ü—úÿÿþáþüÿÿþ0úO­õáÿÿûðÿÿþþèÿÿþÈÿÿýâýËý#¼ÿÿû,üÿÿõ0eãÿÎO4ÿÿûð4ÿÿþ+þèÿÿýÃàÿÿþ­ýôbýËÿÿûRüÿÿõ0 ÉÿÿÙ4ÿÿûðÿÿþQþèÿÿüD=ýÿÿúgôºþlÿÿû"üÿÿü0®ÿÿûq4ÿÿþðþæÿÿþ±þèÿÿüDƒÿÿùö*ôþ@ûAÿÿëþüÿÿü0ûÿÿû64ÿÿþðþ“ÿÿýü)üèÿÿûDÈÿÿùÒôÿÞ ÷zÿÿUýÿÿü9 þÿÿû† ·ÿÿùóëÿÿöå%‡’ðÿÿúJ%úÿÿùôÿÿÏ+úDôÿŒþWÿÿü€¼ÿÿûÓí’úÿÿù·`NôÿÿøüȪãŠ=ÿÿþ~þ£ÿÿòôº´ö÷·†’æÿÑEþnÿÿü>ÕÿÿûÔ7™ÿÿý™ý&ÌÿÿúÝmFüÿÿû¶“÷ÿÿó‡/W~|W1 ü5Tû3XûKV € € €û! þýüÔK?ÔÔüD$ÓÔÔíª­ÔÔÓ'iÔðÛÿþÙp ýÒÔÔøsjÖÿ×@ñŸâáÞè“.wÿÿúc!êÿÿ댡þF¸ÿ®+ÏÿÿÍý$ÚÿÿýŒkÿÿò¿2ßÿ®¬ÿÏ ýâÿÿþcþ“ÿÿþ‘÷¬hÿÿÀþuÿÿþ”þ’ÿÿìÔì‘ùÿÿàÞÿÿDLÿÿ~þzÿÿþ¹þQÿÿþØúÏFÿÿû+6ÿÿþÕþ„ÿÿ÷&Pêófrÿÿ÷&ÿÿð öûÿÿü˜ÿÿð 7á^ÿÿñ0ÿÿþðþ„ÿÿþÙó Üÿÿüÿÿþ>þ°ÿÿú ñ¸ÿÿûfŸ€÷Jv( iÿÿþðþ„ÿÿþ©úüÿÿ÷ttþ|ÿÿþkþJÿÿúâcÁ<ÿÿû« òúO­õáÿÿþðþ„ÿÿþ¨þ(ÿÿþ®¨¨þ_ýâÿÿõGÉZæÿÿí`»øeãÿÎO4ÿÿþðþ„ÿÿþ¨þ2ÿÿþ" þ€ÿÿúÍë”ÿÿýãX÷ ÉÿÿÙ4ÿÿþðþ„ÿÿþ¨þÿÿþE ýýÿÿû‹?ÿÿýíþ®ÿÿûq4ÿÿþðþ„ÿÿþ¨þëÿÿþ€þóµÿÿþ%èÿÿ’ýûÿÿû64ÿÿþðþ„ÿÿþ¨þžÿÿýãüBc•ûPÿÿ½û—ÿÿ0ý þÿÿû† ·ÿÿýóþŒÿÿþÉý÷ÿÿö® Yë*ÿRûæÿVüBÿÍþ¼ÿÿûÓí’úÿÿú·` Ëÿÿýù ýküÿÿöúÍñ÷Lÿý=ü…èüêjý>ÕÿÿûÔ7™ÿÿû™ïÿÿþ¶ý@äÿÿü÷½9ýEýKü5Tû3Xú$UF ƒ°°°°L& ,  New Layerÿ      ;,  [ Ë × ã, { ‹ › « »€€€€–K%stem-1.7.1/docs/_static/label/resources/source_repository.xcf0000664000175000017500000001254713157571677025216 0ustar atagaratagar00000000000000gimp xcf fileæ#BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ¶9)$Source Repositoryÿ     Sgimp-text-layer7(text "Source Repository") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 297.000000) (box-height 36.000000) (box-unit pixels) Ç)$ç!-)$/ ¾   „ô _‡¬¡wLle2ó\æõ¬VRŠôûÎù„1û[ÿÿFú Éÿÿ„0úîÿÝûäÿ„0û^ÿÿ·üGÿ„0ú‹ÿÿúýׄ0þ¤ÿÿýÅýZcü"þþ€ÿÿüöƒ ÷^ÇóÐóÌmþiÔÔüxÔÔú\ÒÔÔøsjÖÿ×@ý6þÿÿüð€ð§ÿø,$õÿµvÿÿú >ýÿÿþpý$ÚÿÿýŒkÿÿþ¿þ¢ÿÿüñ‚ û©ÿÿŸû–ÿÿ¸þÿÿþ þËÿÿþpþ’ÿÿøÔì‘ùÿÿàý­ÿÿýÇþKÿÿþmþcÿÿûV ÿÿþ þ¼ÿÿþpþ„ÿÿ÷&Pêóf;üwòÿÿýÏþËÿÿþGþ>ÿÿûÔ ÿÿþ þ¼ÿÿþpþ„ÿÿþÙú Àü›úÿÿú–÷ÿÿþ<þ3ÿÿûû ÿÿþ þ¼ÿÿþpþ„ÿÿþ©þñü—úÿÿûá(ÿÿþ2þ)ÿÿü, ÿÿþ þ¼ÿÿþpþ„ÿÿþ¨úÿËý#¼ÿÿü,,ÿÿþ*þ#ÿÿü7 ÿÿþ þ¼ÿÿþpþ„ÿÿþ¨ú4ÿôbýËÿÿûRüÿÿþ2þ.ÿÿü ÿÿþ þ¼ÿÿþpþ„ÿÿþ¨úÿôºþlÿÿû"Øÿÿþ>þ9ÿÿûá ÿÿþ þ¼ÿÿþpþ„ÿÿþ¨úæôþ@ûAÿÿëþsÿÿþRþOÿÿú|ûÿÿþ,þ¼ÿÿþpþ„ÿÿþ¨ù“ôÿÞ ûzÿÿUúÓÿÿ…úƒÿÿØþÚÿÿúcDîÿÿþ’þŒÿÿþÉøôÿÿÏ+úDôÿŒô0àÿÜ Üÿã4þyÿÿúõ§¹åÝÿÿùéy Ëÿÿýù óôº´ö÷·†’æÿÑEö¥ý×–Öý¬ý¢ÿÿô­´þÞ¹•z ïÿÿþ¶ô‡/W~|W1ú 9_< ÷*YO5   Ÿþ%HHü>& 1üC¤ôÿÿ÷úËÞüÿó¤@0þ2ÿÿú3 Âÿÿý¿ /þòÿÿþüýøÿÿý¼.þàÿÿþüþ¹ÿÿþ8.þàÿÿþüþœÿÿþuýýþàÿÿþüþ“ÿÿþ…ý÷J¾ê×õ´j÷ŸâáÞè“ þàÿÿþüþ³ÿÿþXߟâáÞè“K –ÿó+vÿÿÉ 2ßÿ®¬ÿÏ þàÿÿþüýãÿÿýâí2ßÿ®¬ÿÏ šÿÿ”DÿÿóRÞÿÿDLÿÿ~ þàÿÿþüý“ÿÿýå2çÞÿÿDLÿÿ~þÿÿdýÿÿSrÿÿ÷&ÿÿð þàÿÿõýd~›ëÿÿåþrÿÿ÷&ÿÿð ÿÿþ5ó‰è¤Üÿÿüÿÿþ> þàÿÿýþ¤ÿÿýý0÷Üÿÿüÿÿþ>ÿÿþ úüÿÿ÷ttþ|ÿÿþk þàÿÿüüÿÿýÓúüÿÿ÷ttþ|ÿÿþkÿÿþþ(ÿÿþ®¨¨þ_ þàÿÿûüäÿÿþþ(ÿÿþ®¨¨þ_ÿÿþ+þ2ÿÿþ"þàÿÿûüKÿÿýþEþ2ÿÿþ"ÿþQþÿÿþEþàÿÿþüþ¢ÿÿúåÿÿþEÿþ±þëÿÿþ€þàÿÿþüýçÿÿþ¬þëÿÿþ€ÿýü)ýžÿÿýãýBc þâÿÿþýþPÿÿûažÿÿýãüBcëÿÿöå%‡’÷ÿÿø® Yë* þõÿÿþþ§ÿÿúò"÷ÿÿö® Yë*NôÿÿöüȪãŠküÿÿúúÍñ÷L þdÿÿý„ýêÿÿúÇküÿÿöúÍñ÷L&ÌÿÿýÝmý@äÿÿü÷½9ýiïÿÿýôþUÿÿúö@äÿÿü÷½9ûKVú$UF "ú$UF BþG=þ~   «ûw‘&:úÀÿÿð 8þÿÿþWü±L2úØÿÿûü„ÿT2û8®ÃUûLþÿT9ú4ïÿÿTý  ü"ø$ý;ñÿÿþTÔ÷L4Âúÿä÷^ÇóÐóÌmõ-Àüèø×Ÿï4iÔÔü14ôÿÿûâÔÔ!û^Ç;üÿÿöyçÀ²þÿÿÃæ§ÿø,$õÿµ1ùÿayúÿ4eÿÿû<2|ëÿÿó§||§ÿøÍÿÿúó?–ÿÿþû©ÿÿŸö–ÿÿ¸Îÿêùÿ4øÿÿû<ØÿÿþTù©ÿÿŸÀÿÿþ‹þ)ÿÿú÷KÿÿþmþcÿÿùVþÿÿ9ùé4ðÿÿû<ØÿÿþTþKÿÿümÀÿÿþlþìÿÿûfËÿÿþGþ>ÿÿðÔýÿÿôo" ðÿÿû<ØÿÿþTþËÿÿüGÀÿÿþlþÒÿÿû‰÷ÿÿþ<þ3ÿÿüûÃÿÿüäjþðÿÿû<ØÿÿþTý÷ÿÿü<ÀÿÿþlþÃÿÿü«(ÿÿþ2þ)ÿÿü,SüÿÿýÕ%þðÿÿû<ØÿÿþTþ(ÿÿü2Àÿÿþlþ½ÿÿü ,ÿÿþ*þ#ÿÿû7Gñÿÿúáðÿÿû<ØÿÿþTþ,ÿÿü*ÀÿÿþlþÍÿÿû~üÿÿþ2þ.ÿÿù Œôÿÿûyðÿÿû<ØÿÿþTýüÿÿü2Àÿÿþlþáÿÿû[Øÿÿþ>þ9ÿÿüá$iý¦ÿÿûºðÿÿû<ØÿÿþTþØÿÿü>ÀÿÿþlþÿÿúîsÿÿþRþOÿÿû|@ü$øÿÿ¶ðÿÿû<ØÿÿùZ)sÿÿüRÀÿÿúÍ~ÿÿþ|úÓÿÿ…÷ƒÿÿØ@ÿ¢ø+ÿÿƒöÿÿûB¸ÿÿóŽf¦Óÿÿ…Àÿÿöåº]‚üÿÿà æ0àÿÜ Üÿã4@ÿüp‰ÿæ>ÿÿû…Yÿÿôàé0àÿÜÀÿÿ÷lqûÿÿü¡ç¥ý×–Öý¬@ý¨çù³ÜÿÎ.mþÿÿö‘®÷ÿüÁ-ú¥ýÀÿÿùlJD ú 9_< öCL]4 ü Gü Àÿÿþl9þÀÿÿþl9þÂÿÿþ“8ýïÿÿýÏ7þäÿÿýåw6(þ·   ü"þ*ùóÐóÌmýÒÔÔ÷sjÖÿ×@iÔÔûÂÏÔÔþQø,$õÿµý$ÚÿÿýŒkÿÿü¿xÿÿ÷Ž °ÿRû–ÿÿ¸þ’ÿÿõÔì‘ùÿÿàÜÿÿþ£ý£³þcÿÿþVþ„ÿÿö&Pêófkÿÿøô æLþ>ÿÿþÔþ„ÿÿþÙý ý ïÿÿùfCçþ3ÿÿúû„ÿÿþ©þŠÿÿúÊŒþ)ÿÿû,„ÿÿþ¨ý"þÿÿû.ð,þ#ÿÿû7„ÿÿþ¨þ¹ÿÿü“RÌ þ.ÿÿû „ÿÿþ¨þQÿÿüî´k þ9ÿÿþáþ„ÿÿþ¨ýåÿÿýø þOÿÿþ|þ„ÿÿþ¨ þÿÿþ«!úƒÿÿØþŒÿÿþÉ úüÿÿKø Üÿã4ý Ëÿÿýù û±ÿçù×–Öý¬ýïÿÿþ¶üIÿ‹û9_< üû*7þýJÅ6÷Èþ¬º`6þcÿÿûGæ6þ0ÿÿü·øU8úàÿÞ[;þ¥ÄÄÄÄ”J %-  New Layerÿ     ß- ó-     æ#Selection Mask ‰æ#¥O[æ#ÁCGK,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿÓÀÀ2s9stem-1.7.1/docs/_static/label/resources/exit_map.xcf0000664000175000017500000000632413157571677023221 0ustar atagaratagar00000000000000gimp xcf file} BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ² z˜2 Exit Mapÿ     Jgimp-text-layer.(text "Exit Map") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 152.000000) (box-height 50.000000) (box-unit pixels) ±˜2Í b n˜2å” R € € €Àý…åÿ ÿþ€û(Ííqø¤ìÿÿjÿÿô³B€åÿÿ€úÄÿÿþ,ý9ù ù’ÿ ÿÿþjû Áÿ€þõÿÿþ]üæÿ ý8ýÿþhü÷€þÉÿÿþ1ûÒÿÿ ý,üÿþhý¤€û0ÔîxýÈÿÿ ý,üÿþhùs€Y€ý!Ôÿÿ ý,üÿþhý»€þŽÿÿû¾«ùÿÿüv?÷ÿÿúhØôÿÿì ý,üÿþhü@þ€þmÿÿþœøÿÈ%3ÿÿþhþhÿÿ ý,üÿøh#tñÿ€þ¶ÿÿøå }Î þÿÿþhþhÿÿ ý,üÿýõýÿÿþ€ýñÿÿúˆeäÿþhþhÿÿ ý,üÿøh4™þÿ€þgÿÿûüò3ÿþhþhÿÿ ý,üÿþhüwÿ€ý½ÿÿþ`ÿþhþhÿÿ ý,üÿþhüæ€ý"ôÿÿþ¦ÿþhþhÿÿ ý,üÿþhý›€þþrÿÿþUÿþhþhÿÿ ý,üÿþhýl€ý=Ðü·óÿÿýìÿþhþhÿÿ ý,üÿþhüОû†Î*öÿÿþµÿþhþhÿÿ ý,üÿþhü—ÿlúUò#|ÿÿþeÿþhþgÿÿû $kú,ý ÿÿþpñ”ÿÿ94õkáÿÿúó!ÿÿþjþIÿÿû}AÓAú>ÿnÿÿîÅ+pÛÿÿü =éÿ"þ›ÿÿûÅ 5ÿÿþ¡ý Þÿÿþú¡ÿ‚îÿÿüôòþÿÿüÕ‰ÿÿûý²ÿÿü´?øÿÿþµù$­éòÈWûµôÿÿ¿ € € €ÀÿýÜþ{ÿÿüøÌ&ÿþMýåÿÿýÐ(þðÿÿþ¼ýYÈÿÿþz)þÿÿþ,ýÇ\ÿÿþh)ý!ýÿÿþšü5éÿÿþh*þ°ÿÿýöü¤„ÿÿþh*þAÿÿþwûõÿÿþhö#ŠÌÞùïÊ…þŸÿÿøh ­îóÄV þÒÿÿýâû¬ÿÿþhðmüÿe ¦ÿÿõQ qÿÿûyâìöÿÿþ þdÿÿþUúè@ÿÿþh÷)þÿÿa!ÿÿúöÿÿúèaàÿÿþR ý ìÿÿþÄý^Ôÿþhþ^ÿÿûæÿÿþZÿþ‰þoÿÿþÑ þ‡ÿÿú3Ìiÿþhú+ûÿÿÄÿþhÿþhþ2ÿÿþ# ýûÿÿú¢;ð ÿþhø0ub SÿÿþhÿþhþÿÿþQ þªÿÿûùª‘ÿþhú ^¸ù¾ÿÿþhÿþhþÿÿþb þ;ÿÿüœú&ÿþhø}îÿîCÿÿþhÿþhþÿÿþ[ þÌÿÿþ¹ÿþhý Êÿÿü`ÿÿþhÿþhþÿÿþ@ þ^ÿÿþMÿþhþ˜ÿÿüÿÿþhÿþhþ2ÿÿýú ùèÿÿÞÿþhþïÿÿü ÿÿþhÿþzþuÿÿþ¬ þûÿÿuþÿÿþyþäÿÿü‰/½ÿÿûxÿÿöì/$éÿÿù) ý‹ûùöýnÿÿúЃÿÿüðRÊÿÿûýÄÿÿ÷˜ëáúÿÿüY ûÿñÑý£ýˆêÿÿìüÒ{ß÷ׇ2ÐøÝ}ÿÿøh%¹õí²53ÿþh9ÿþh9ÿþj8þÿÿþ}8þ1ÿÿýÆ6ý‰øÿÿýÛpP°°°°L& ,  New Layerÿ      ,  @ ° ¼ È, ` p €  €€€€–K%stem-1.7.1/docs/_static/label/resources/archlinux.xcf0000664000175000017500000000676513157571677023421 0ustar atagaratagar00000000000000gimp xcf file– BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ² “˜2 Arch Linuxÿ     Lgimp-text-layer0(text "Arch Linux") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 152.000000) (box-height 50.000000) (box-unit pixels) ­˜2É { ‡˜2áÆ b € € €‰ý0™"þ%HHþüÿ6!ýG×ÿÿþ<ûõÿ£"þÿÿþ<úmÿÿø"þñÿÿþ<þÔÿÿþ|"þðÿÿþ<þ=ÿÿýä!þðÿÿþ<ý¥ñÿÿþVþýþðÿÿù<" ü÷NÿÿþÂýÒÔÔøsjÖÿ×@ôJ¾ê×õ´jðÿÿ÷<¨îÿûªûu½ÿÿþ/ý$ÚÿÿýŒkÿÿï¿ –ÿó+vÿÿÉ ðÿÿûaÛîþÿÿýÄúÛ_Sÿÿþœþ’ÿÿïÔì‘ùÿÿàšÿÿ”DÿÿüRðÿÿúï_/ùÿÿþGùEò äÿÿýöþ„ÿÿê&Pêóf;þÿÿdýÿÿSðÿÿþ^þËÿÿþuý­šþ~ÿÿþuþ„ÿÿþÙú Àÿÿþ5ù‰è¤ðÿÿþ<þ¢ÿÿþ‹üû7ýúÿÿýßþ„ÿÿþ©þñÿÿþ þðÿÿþ<þ ÿÿþŒý|Ûþ³ÿÿþOþ„ÿÿþ¨þÿÿþþðÿÿþ<þ ÿÿþŒýáÿ ÿþ¼þ„ÿÿþ¨þ4ÿÿþ+þðÿÿþ<þ ÿÿþŒüLú'þÝÿÿþ)þ„ÿÿþ¨þÿÿþQþðÿÿþ<þ ÿÿþŒý´®þzÿÿþ˜þ„ÿÿþ¨þæÿÿþ±þðÿÿþ<þ ÿÿþŒü%þSýýÿÿýöþ„ÿÿþ¨þ“ÿÿýü)üðÿÿþ<þ ÿÿþŒüšû þÑÿÿþ‡þŒÿÿþÉýëÿÿöå%‡’öÿÿþBþ¦ÿÿ÷”cýýCý ÔÿÿýøNý Ëÿÿýù ýNôÿÿøüȪãŠ>ÿÿú… àÿÿûЬÿÿýëHü Í÷ÿÿû”ïÿÿþ¶ý&ÌÿÿúÝmmþÿÿüœëÿÿýè&ûKV“ € € €ˆþ%HHþDûw‘&%üBŸñÿÿüöª€úÀÿÿð &þNÿÿþ= þÿÿþW&ýøÿÿýû úØÿÿû'þðÿÿþì û8®ÃU(þðÿÿþì9þðÿÿþìý þðÿÿþì þiÔÔý1KÔÔôL’ßÿþÀ$iÔÔüxÔÔ þðÿÿþì ýeÿÿû<=ýÿÿûc¸óùÿÿúâ vÿÿú >ýÿÿ þðÿÿþì ýøÿÿû<Õÿÿúçsáÿÿûoÿÿþ þËÿÿ þðÿÿþì þðÿÿû<Èÿÿþ…þ£ÿÿû ÿÿþ þ¼ÿÿ þðÿÿþì þðÿÿû<Èÿÿþdþzÿÿû³ ÿÿþ þ¼ÿÿ þðÿÿþì þðÿÿû<Èÿÿþdþxÿÿû´ ÿÿþ þ¼ÿÿ þðÿÿþì þðÿÿû<Èÿÿþdþxÿÿû´ ÿÿþ þ¼ÿÿ þðÿÿþìú¾ðÿÿû<Èÿÿþdþxÿÿû´ ÿÿþ þ¼ÿÿ þðÿÿþìúbÎðÿÿû<Èÿÿþdþxÿÿû´ ÿÿþ þ¼ÿÿ þðÿÿþìùÝ ðÿÿû<Èÿÿþdþxÿÿû´ ÿÿþ þ¼ÿÿ þðÿÿþìù•ÿrðÿÿû<Èÿÿþdþxÿÿú´ûÿÿþ,þ¼ÿÿ ýüÿÿýö÷’ÿÿCöÿÿûBÏÿÿþjþ~ÿÿþ¹þÚÿÿúcDîÿÿýwÿÿøw*pàÿÿü>ÿÿû…úÿÿú«¾ÿÿúéyÿÿúõ§¹åÝÿÿýiïÿÿþöÿÿûçmþÿÿýÝûÿÿüÄÉÿÿúí ¢ÿÿù­´þÞ¹4÷*YO5°°°8ü\ƒÔÔü«ÔÔþ?ûpŽÿÿþŸû}ÿÞXúpÈÿÿøì ™Ð þpý+ùÿÿú‘Wì!þpþ~ÿÿûþpðE þpýÑÿÿþz þpý4üÿÿþœ þpþŠÿÿþB þpý§ýÿÿýÝ þpûqÝDüÿÿþŽþpú=õ5‡ÿÿýý6þ’øç‚ ëÿÿýÓøéyÒÿ"þ…ÿÿþŠô•zzóÿÿë^öÿÿþt.L& ,  New Layerÿ      A,  a Ñ Ý é, ‘ ¡ ± Á€€€€–K%stem-1.7.1/docs/_static/label/resources/tortoise_and_the_hare.xcf0000664000175000017500000001762113157571677025746 0ustar atagaratagar00000000000000gimp xcf file6BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) º 5¹7³9Tortoise and the Hareÿ      "Wgimp-text-layer;(text "Tortoise and the Hare") (font "FreeSerif Bold") (font-size 20.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 435.000000) (box-height 57.000000) (box-unit pixels) ˳9ë   )³9@ Ñ á ñ @@@þ*„ „þ["ü,­z òUÿæ™LòÿÿvÍÿ²ýN! û¬ÿÿ+ òYáðÿÿL´ü.õ8 ûwÿê ý]x÷ðÿÿL#¶ûÜÿ8 ý( ý/"ûðÿÿLøR#Y[&þ88óEIØÿÿc8û#Y[&þ&88÷[PHþûðÿÿLÌþ“‡þ— %ÄÿÿdÁÿÿoaÙÿÿ»¨þ“‡þ— Gèÿÿ(àVuæÌ¾ûðÿÿLèŒÿ¸³ÿ”^ÿÿÝtãÿˆÿÿ8æŒÿ¸³ÿ”¦ÿÿ(ø©H˲ÿûðÿÿLË#üÿŠ…ÿý&XÿÿV ÿÿ8#üÿŠ…ÿý& ÿÿ(\ÿ÷eO.ÿÿûðÿÿLðZÿÿ|wÿÿ\Xÿÿpßÿÿ8Zÿÿ|wÿÿ\ ÿÿ(þÿÿÚT^ÿÿûðÿÿLðtÿÿroÿÿxXÿÿpçÿÿ8tÿÿroÿÿx ÿÿ([øÿÿúvÿÿûðÿÿLðQÿÿywÿÿUXÿÿpßÿÿ8QÿÿywÿÿU ÿÿ(! þÿú YÿÿûóÿÿOðôÿˆ‡ÿöXÿÿpßÿÿ:ôÿˆ‡ÿö ÿÿ(€V>ûý%ýÿþ"ÿÿþ|ñsÿ½¿ÿxgÿÿŽßkÿÿŽ{Fsÿ½¿ÿx­ÿÿ4€ÕÕ¹ŸÿýˆÜÿÿüð®$ñiô²³õl=áÿÿîŽú×ÿôxçiô²³õlnöÿÿÈŒÚÚˆ¥Ä7 û// ý$û//ú",$ …@@@%þg„„þB þZ„„þ'ú ‹ÿÿ€öN!Îÿÿ((ûHÿÿ€ü.õ8û ÿÿ((ûHÿÿ€ûÜÿ8û ÿÿ(û7eLû(a<þ 88ú JJ÷@c'Hÿÿ€êØÿÿc8 ÿÿ(UBæSžß*áXähLÁõ¥7Ùÿÿ[Ûüÿä ÆÿöǦÿÿ€êaÙÿÿ»¨ ÿÿbãÿÿÜw+ÿ¾àõÿ<Bÿÿn‰ÿÿ­Eÿÿ|¬ÿî-’ÿÿ€ûÿÿ8ñ ÿÿ ^ÿÿVÿÿ!àðÿe ÿÿ„ÿÿDþÿÅ'þÿ½Hÿÿ€ûÿÿ8ñ ÿÿ(ÿÿ¾¤¨ÿÿPá"C+‡ÿÿ „ÿÿDüÿÌZÿÿ—Hÿÿ€ûÿÿ8ö ÿÿ(ÿÿwþ á[ÎÇhÿÿ „ÿÿDüÿÌwÿÿ}Hÿÿ€ûÿÿ8ö ÿÿ(ÿÿŠà²ÿÕ$ÿÿ „ÿÿDüÿÌ`ÿÿšHÿÿ€ûÿÿ8ñ ÿÿ(ÿÿÙ+àOÿÿ‚$ÿÿ „ÿÿDüÿÌ/ÿÿ¾Lÿÿ€òÿÿ: ÿÿ(ÿÿú©=X« ßZÿÿËHÂÿÿº’ÿÿP þÿ×¶ÿóDÂÿÿ«òkÿÿŽ{F­ÿÿ4!ÿÿüü¾ßÏÿÿÈ*ÑÿôTYïÿÿÕ¨ÿÿþ{ÂÿüÞnÿðÃhí×ÿôxnöÿÿʾÿÿ9ø-7 ú#3 " ý$ Š@@@þZ„„ý^„„þ .ývÿÿú­"kÿÿý¶$0úýÿÿKúòÿÿW2ûüÿÿDûìÿÿP$ú7eLûüÿÿDûìÿÿPû(a<þ88óEI7eLõ¾æSžß*ûüÿÿDàìÿÿPXähLÁõ¥%ÄÿÿdÁÿÿo¾æSžß*õd²ÿw+ÿ¾ûüÿÿ™ttàõÿÿPõÿ<Bÿÿn^ÿÿÝtãÿˆ²ÿw+ÿ¾ô­.ÿÿVÿÿ!ûüÿÿŸ||ßõÿÿPðÿe ÿÿXÿÿV .ÿÿVÿÿ!ô´^ÿÿ¾¤¨ÿÿPûüÿÿDììÿÿP"C+‡ÿÿ Xÿÿpö^ÿÿ¾¤¨ÿÿPù´vÿÿwþ ûüÿÿDììÿÿP[ÎÇhÿÿ Xÿÿpûvÿÿwþ ù´YÿÿŠ ûüÿÿDììÿÿP²ÿÕ$ÿÿ XÿÿpûYÿÿŠ ô´%ýÿÙ+ûüÿÿDììÿÿPOÿÿ‚$ÿÿ Xÿÿpö%ýÿÙ+ôŸÿÿ©=X« þÿÿþhëüÿÿtZÿÿËHÂÿÿºgÿÿŽ÷Ÿÿÿ©=X« õùl ÿÿü¾ýiÝÿÿúð¨nÛÿÿîò°ÙÿÿÈ*ÑÿôT=áÿÿîŽø ÿÿü¾ ü9ø-7 ü9 ˆ@@@@@@@@@@@@ [ [ [ [Ùl6Ÿ2 New Layer#1ÿ      ÝŸ2 ý•¡­Ÿ2%5EUeu… € € € € € € € € € € € € € € € € € € € € € € € €Ïg 3³9Event Listeningÿ     Qgimp-text-layer5(text "Event Listening") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 435.000000) (box-height 57.000000) (box-unit pixels) Ƴ9æ+³9 ‚ãó@@@€þ%HHþ9,üBžîÿÿúúÑÈÝòÿÿþÌ.þAÿÿþ6ú*Œ÷ÿÌ.ýíÿÿþüü\ÿÌ/þàÿÿþüý¯Ì/þàÿÿþüù9ZÌ/þàÿÿþüù\ ˜ý ý þ;þàÿÿþüý› þKÔÔûËÉÔÔòoŸâáÞè“KÔÔ÷L’ßÿþÀ$ý4ôþàÿÿþüü%ø þWÿÿ賌ÿt2ßÿ®¬ÿÏ =ýÿÿûc¸óùÿÿùâ 2|þàÿÿøüUÜÿ þ¾ÿÿþËí{×ÞÿÿDLÿÿ~Õÿÿúçsáÿÿþoþàÿÿþðÿÿþ þEÿÿþ*úÄmrÿÿõ&ÿÿð Èÿÿþ…þ£ÿÿþþàÿÿøü0Pœüÿ þÒÿÿïŽ(õÜÿÿüÿÿü>Èÿÿþdþzÿÿþ³þàÿÿþüüNÿ þeÿÿóëžüÿÿ÷ttþ|ÿÿükÈÿÿþdþxÿÿþ´þàÿÿþüý¶ ý ñÿÿøUë6(ÿÿþ®¨¨ü_Èÿÿþdþxÿÿþ´þàÿÿþüýo ý( þ•ÿÿü¹XÏþ2ÿÿþ"þÈÿÿþdþxÿÿþ´þàÿÿþüý0}üñþ-ÿÿüýÒhþÿÿþEþÈÿÿþdþxÿÿþ´þàÿÿþüýžæþÅÿÿýó þëÿÿþ€þÈÿÿþdþxÿÿþ´þàÿÿþüü\þ´þ]ÿÿþ™þžÿÿýãûBcÈÿÿþdþxÿÿþ´ýõÿÿýþû^üÿƒúìÿÿ1ý÷ÿÿö® Yë*Ïÿÿþjþ~ÿÿþ¹þfÿÿø‡ *\ÎÿÿþQüÿÊýküÿÿ÷úÍñ÷Lúÿÿú«¾ÿÿýéýhìÿÿþøÿÿþ ü%þcý@äÿÿù÷½9LûÿÿüÄÉÿÿýí ý[ ú$UF U@@@þ%HHþDûw‘&%üBŸñÿÿüöª€úÀÿÿð ü±L þNÿÿþ= þÿÿþW ü±Lü„ÿT ýøÿÿýû úØÿÿû ü„ÿTûLþÿT þðÿÿþì û8®ÃU ûLþÿTú4ïÿÿT þðÿÿþìú4ïÿÿTþñÿÿþT þðÿÿþìõ$;ñÿÿþTÿûâÔÔ! þðÿÿþì þiÔÔñ1-Àüèø×Ÿï44ôÿÿùâÔÔ!ëÿÿû§|| þðÿÿþì ýeÿÿð<1ùÿayúÿ42|ëÿÿù§||ØÿÿþT þðÿÿþì ýøÿÿú<Îÿêùÿ4ØÿÿþTþØÿÿþT þðÿÿþì þðÿÿù<þÿÿ9ùé4ØÿÿþTþØÿÿþT þðÿÿþì þðÿÿð<ýÿÿôo" ØÿÿþTþØÿÿþT þðÿÿþì þðÿÿü<ÃÿÿüäjþØÿÿþTýØÿÿþT þðÿÿþì þðÿÿû<SüÿÿýÕ%þØÿÿþTý(ØÿÿþT þðÿÿþìú¾ðÿÿú<GñÿÿúáØÿÿþTý2ØÿÿþT þðÿÿþìúbÎðÿÿþ<üŒôÿÿûyØÿÿþTýØÿÿþT þðÿÿþìùÝ ðÿÿü<$iý¦ÿÿûºØÿÿþTþØÿÿûZ) þðÿÿþìù•ÿrðÿÿû<@ü$øÿÿ¶ØÿÿùZ)¸ÿÿûŽf¦ýüÿÿýö÷’ÿÿCöÿÿûB@ÿ¢ø+ÿÿƒ¸ÿÿùŽf¦Yÿÿüàéýwÿÿøw*pàÿÿü>ÿÿð…@ÿüp‰ÿæYÿÿôàé®÷ÿüÁ-ýiïÿÿþöÿÿûçmþÿÿõÑý¨çù³ÜÿÎ.ø®÷ÿüÁ-ü G#öCL]4ü GC@@@žûw‘&:úÀÿÿð 8þÿÿþW9úØÿÿû9û8®ÃUaý ý ý ýõŸâáÞè“KÔÔ÷L’ßÿþÀ$þiÔÔý1KÔÔ÷L’ßÿþÀ$ç0²òûæî½ˆˆ2ßÿ®¬ÿÏ =ýÿÿûc¸óùÿÿùâ eÿÿû<=ýÿÿûc¸óùÿÿýâ ørþÿØ- ”ÿÿñÞÿÿDLÿÿ~Õÿÿúçsáÿÿþoýøÿÿû<ÕÿÿúçsáÿÿïoFýÿÿqûÿÿcrÿÿõ&ÿÿð Èÿÿþ…þ£ÿÿþþðÿÿû<Èÿÿþ…þ£ÿÿû¤ÿÿþKóäÿÿèÜÿÿüÿÿü>Èÿÿþdþzÿÿþ³þðÿÿû<Èÿÿþdþzÿÿû³Òÿÿþ<þÕÿÿûüÿÿ÷ttþ|ÿÿükÈÿÿþdþxÿÿþ´þðÿÿû<Èÿÿþdþxÿÿû´—ÿÿþEþÞÿÿþ®¨¨ü_Èÿÿþdþxÿÿþ´þðÿÿû<Èÿÿþdþxÿÿû´=ÿÿ÷]óÿÿåÿÿþ"þÈÿÿþdþxÿÿþ´þðÿÿû<Èÿÿþdþxÿÿô´™ÿÿ±Qÿÿþ^ÿÿþEþÈÿÿþdþxÿÿþ´þðÿÿû<Èÿÿþdþxÿÿþ´ôJçÿצþÿêRëÿÿþ€þÈÿÿþdþxÿÿþ´þðÿÿû<Èÿÿþdþxÿÿþ´ô«¶i]L#žÿÿýãûBcÈÿÿþdþxÿÿþ´þðÿÿû<Èÿÿþdþxÿÿþ´ûyôÓý÷ÿÿö® Yë*Ïÿÿþjþ~ÿÿþ¹ýöÿÿûBÏÿÿþjþ~ÿÿó¹3ÿÿî; ýküÿÿ÷úÍñ÷Lúÿÿú«¾ÿÿúé>ÿÿû…úÿÿú«¾ÿÿûéœÿÿøîÉa@äÿÿù÷½9LûÿÿüÄÉÿÿûí mþÿÿýÝûÿÿüÄÉÿÿüí vÿ ÿú$UF *üŠöÿÿ3ûdϳû’ºðÿ2ûµÿ¸ý/þ1ûþÿ²ý ø2ú±ÿÿqû5Àé2óoÄüÿñÏÙæÆj5ú(" Ã@@@@ýˆ=<ýÿt<ý<þ=þ#=þ%=þ~þ=þ¤=ýÿ<<ýÿl<ýÿF<ýë <þ-~@@@@@@@@ [ [ [ [Ùl6,  New Layerÿ     Ý, ýmy…, -=M]€€€€–K%stem-1.7.1/docs/_static/label/resources/freebsd.xcf0000664000175000017500000000703313157571677023023 0ustar atagaratagar00000000000000gimp xcf files BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ¶  és'FreeBSDÿ     Igimp-text-layer-(text "FreeBSD") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 115.000000) (box-height 39.000000) (box-unit pixels) ³s'Ë s'ß  À À À€þ%HHþ"%þ%HHüBíÿÿúúÐÇÚöÿÿþ|%üBžîÿÿþ@ÿÿþ6ù8­ÿÿ|'þAÿÿýíÿÿþüü€ÿ|'ýíÿÿþàÿÿþüüß|(þàÿÿþàÿÿþüù,Š|(þàÿÿþàÿÿþüù¨P=]þý ýþàÿÿþàÿÿþüüçPýÒÔÔøsjÖÿ×@÷ŸâáÞè“÷ŸâáÞè“þàÿÿþàÿÿþüühÿPý$ÚÿÿýŒkÿÿò¿2ßÿ®¬ÿÏ õ2ßÿ®¬ÿÏ þàÿÿþàÿÿøüròÿPþ’ÿÿßÔì‘ùÿÿàÞÿÿDLÿÿ~ÞÿÿDLÿÿ~þàÿÿþàÿÿþóÿÿþPþ„ÿÿ÷&Pêófrÿÿõ&ÿÿð rÿÿ÷&ÿÿð þàÿÿþàÿÿøü4Z¼ÿÿPþ„ÿÿþÙó Üÿÿüÿÿõ>Üÿÿüÿÿþ>þàÿÿþàÿÿþüüŽÿPþ„ÿÿþ©úüÿÿ÷ttþ|ÿÿùküÿÿ÷ttþ|ÿÿþkþàÿÿþàÿÿþüü ïPþ„ÿÿþ¨þ(ÿÿþ®¨¨ý_(ÿÿþ®¨¨þ_þàÿÿþàÿÿþüý¶Pþ„ÿÿþ¨þ2ÿÿþ"þ2ÿÿþ"þàÿÿþàÿÿþüýh>þ„ÿÿþ¨þÿÿþEþÿÿþEþàÿÿþàÿÿþü þ„ÿÿþ¨þëÿÿþ€þëÿÿþ€þàÿÿþàÿÿþü þ„ÿÿþ¨þžÿÿýãûBcžÿÿýãýBcþàÿÿýõÿÿþ! þŒÿÿþÉý÷ÿÿõ® Yë*÷ÿÿô® Yë* õÿÿþfÿÿýý Ëÿÿýù ýküÿÿúúÍñ÷LýküÿÿöúÍñ÷LlÿÿýhìÿÿüòÓ6ýïÿÿþ¶ý@äÿÿü÷½9ý@äÿÿø÷½9híÿÿ"ú$UF ú$UF ÊÅÅÅ2HûG5ò _‡¬¡wLle%HHüE' öÿæµöÿÿÍkï\æõ¬VRŠôûÎù„HÅýÿÿ÷òÉíüÞºx úÿ|ÿÿýå'û[ÿÿFú Éÿÿ„þfÿÿôð.Ìÿÿâ[þìþÃÿÿ÷çîÿÝûäÿ„þÿÿþÔý§ÿÿýÅ þìþˆÿÿùK^ÿÿ·üGÿ„þÿÿþÔýòÿÿþ—þìþpÿÿø~‹ÿÿúýׄþÿÿþÔþ†ÿÿþMþìþ€ÿÿü_¤ÿÿýÅýZcþÿÿþÔýýÿÿýëþìþ£ÿÿûè€ÿÿüöƒþÿÿþÔþãÿÿþ2þìõ$øÿÿÜ86þÿÿüð€þÿÿþÔþÄÿÿþ`öï@\‘óÿÈj þ¢ÿÿüñ‚ þÿÿþÔþ¥ÿÿþŽöú´Ïõÿü¹hý­ÿÿýÇþÿÿþÔþ†ÿÿþ·ôìsõÿÿïfüwòÿÿýÏþÿÿþÔþ~ÿÿþþìþmÿÿþ{ü›úÿÿþ–þÿÿþÔþ—ÿÿþoþìýèÿÿýû&ü—úÿÿþáþÿÿþÔþ°ÿÿþBþìþ¿ÿÿüeËý#¼ÿÿû,ÿÿþÔþÈÿÿýþþìþ¡ÿÿüôbýËÿÿûRÿÿþÔý÷ÿÿþ”þìþ³ÿÿüFôºþlÿÿû"ÿÿþÔþsÿÿýÛ þìþÙÿÿúï ôþ@ûAÿÿëþÿÿþÔùÚÿÿý<ýù þJÿÿøò8ôÿÞ ûzÿÿUþ$ÿÿþèù¿ÿÿåQîÿw ^ðÿÿÇ9ôÿÿÏ+úDôÿŒý ™ÿÿöb>tÕÿý’ÿùýõÙ¼—6óôº´ö÷·†’æÿÑEýlùÿÿúêÀ—m,ô‡/W~|W1L9-  New Layerÿ      µ-  É- Ù    s Selection Mask  _s  ws ‹ ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ`9stem-1.7.1/docs/_static/label/resources/nyx.xcf0000664000175000017500000000437613340051401022202 0ustar atagaratagar00000000000000gimp xcf file7 BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ¶ ä5$Nyxÿ     Dgimp-text-layer((text "Nyx") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 53.000000) (box-height 36.000000) (box-unit pixels) ª5$¾5$Îtttsþ¸ÿÿýËþêÿÿþPýžÿÿþ£ù;Ûÿ ý¥ÿÿþuü]ÿ"þ,ÿÿýýHý5ü#ü,þïÿÿýï&ý,ü#û,üHýÿÿý×ý,ü#û,üwÿÿýµý,üþùÿÿúý’ýÿÿû¾«ùÿÿþvú,ü§ÿÿþˆý,üý Äÿÿþ ú#ÿ³mÿÿþœûÿÈ%ù,ü ÏÿÿúY,üþ?ÿÿþ>ù!ÿ*¶ÿÿøå }Î ý,üýëÿÿúö3,üþÈÿÿþ›ýoÆýñÿÿúˆeäý,üý@ûÿÿûâ,üþUÿÿùò Èeþgÿÿûüò3ý,üþmÿÿüÄ2üýåÿÿú_"õý½ÿÿþ`ý,üþžÿÿýÂüþ‚ÿÿûÂz¤ý"ôÿÿþ¦ý,üýÈÿÿþüýüÿÿü$ÒDþrÿÿþUý,üýæÿÿþüþ±ÿÿü°áü·óÿÿýìý,üý8ùÿÿþüþIÿÿþƒû†Î*öÿÿþµü,þþcÿÿþüýÞÿÿþ#úUò#|ÿÿþeü=ÿ û”ÿÿüûxÿÿÂø4õkáÿÿýó!ú ¥ÿ¢ ûÀÿüûùÿaû=éÿ"þ›ÿÿýÅ ý¦÷ÿÿý÷¦üáüü§ô þ‰ÿÿûý²ÿÿþ´ý1òýl ,ø#1³<+ø†ÿÿ³Î,øòÿÿõœb,þÇÿÿüËÂ,ù"µñì— ·-  New Layerÿ     °- Ä- Ô    7 Selection Mask Z7 n7 ~,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ ,ÿ stem-1.7.1/docs/_static/label/resources/east_of_the_sun.xcf0000664000175000017500000001663613157571677024567 0ustar atagaratagar00000000000000gimp xcf file@6BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ºèDDV<"East of the Sun & West of the ...ÿ      !dgimp-text-layerH(text "East of the Sun & West of the Moon") (font "FreeSerif Bold") (font-size 20.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 342.000000) (box-height 60.000000) (box-unit pixels) äV<ÄÐÜV<(î ï ‹N´ýuÓÿÿû×»Ãßÿÿþ\ø‰ÞÖܶ,úÿÿöüºÿýYïø‚ÿú ÇÿÕÿþðýðü5öðøÜÿð™Üÿþðû¨„û3íÿðüøÿðÿúðëçsÌÁàÊfÔÉõÿ€³ÿÿüÀœñyÙÎÚÀÿÿüÀŠÿúð¨ÿé ÿƒ'ÿÿ‘‹ÿ4×€ÿÿðò±ÿonÿ¸ÿÿðÿýüÞÿÿéçÿçóÿóèÿE=€ÿÿðòhÿÿÿÿjÿÿðÿúð¨ÿðsÏ€òÿÿéÿùˆÿþðòÌÿýüÿËÿÿðÿúðéö-š´øÿÿrÿÿ÷õ|ÿÿðüöÿóøóÿõÿÿðÿþðþ¦õx¡ÿ‡ðÿÿý_âÿÿùÿÿðüöÿñøòÿõÿÿðÿþðæC¿—ÿÿðÿÿ¶iìÿÝÿÿðüËÿùøûÿÌÿÿðÿþðâá”ôÿÿ+/úÿÿø*ÿÐþÿö6!òlÿÿÿÿkÿÿñÙÿÿüFÜÿiÚÿÿðÂßÿÿnÿ· 2ÿtÚÿÿ¤²ñ»ÿgiÿºÿÿþý„çÿÿûëÅÊïÿÿå=AÞï• bóâqÿÿïÈÖzAÙõ¹öÛÍÛëÿÿýëx „ø\°ÿÿðú,¨çÐ×ÿÿþ<÷Yïÿÿðõ5öÿ^O÷ÿ<ü5öðÿþðû½ÿùüoÿ<û3íÿðÿþðûõÿÿ(üé<ð³ÿÿüÀœÿÿð/Æõ¾ùÒàÖWúêÿÿæV÷™<±ÿÿð›ÿÿô·ÿÿð+ÄõÀÿþðÿùú‰Zÿÿ®÷ Ïÿ:'ÿþAþÿÿýÍNëÿÿðöÿÿÿÿ÷|Yÿÿ±ÿþðÿùõ÷ÿï÷{ÿþ÷ÿ¯ýÍÿÿóÌ/ÿÿððÿÿÿùô÷ÿñÿþðÿùððÿÿ÷Òÿòðÿåü ‡÷ÿÿôð$ÿÿððÿÿÿùððÿÿÿþðÿùððÿÿ÷÷ÿþÀÀÞàÚüŒöÿÿõ£ÿÿððÿÿÿùððÿÿÿþðÿùððÿÿûøÿÿþÛñÂÿÿáÿÿððÿÿÿùððÿÿÿþðÿùððÿÿûÕÿÿHýÿ0òÿÿÝÿÿððÿÿÿùððÿÿñþÿö6!ÿÿððÿÿö„ÿÿ̯ýÿ°çÿÿñÿöôÿÿÿÿððÿÿæÚÿÿ¤² ÿÿööÿÿ ÛÿÿýàöJÿã‹™ÿ̶ÿÿ†¬úÿÿbÿÿùùÿÿùAÙõ¹#¼ÿÿýz|ÿÿþ²ùžëöÆBÿìíÇÝÍu#Æ÷Â*ΡxYçÿÿý™—ÿÿ € øqÔÏä© ývûÿÿûÙ04æÿÿ÷÷¾ûÿø•ÿû iÿË þnÿÿ÷ ÐÿÿŽý–øòÿþÿò ú÷ÿÿ>ûoÿÿÆý®(øèÿÿ{'ÿƒ û­ÿÿ‘ö?ÿÿþ Çùyÿÿó¯V ïSÿÿã—æÿÿpYzñÒàÖWÔÉõÿ óèÿÿ¢râÿ´&Þñÿÿ8Í_ÿÿŰ$ Ïÿ:'ÿþA‹ÿ4×ôbÑnùÿÿEŠ· ñŸÿÿ‹Z{ õÿþÆð{ÿþ÷ÿ¯èÿE=ò¦þ$ŒÿÿÞ É! ñEÿÿÞ¸¥ÿÿp^vñÒÿòðÿåéÿùˆósÿûêÿÿŒzj ñçÿÿR±IÿÿÆ´ õ÷ÿþÀÀÞàÚrÿÿýõ|ôÙÿÿ>cÿÿü´ ó‘ÿÿìPèÿþÄûøÿÿý_âÿÿñøÿÿºÇÿÿã ú7ÿÿçûÿÿrûÕÿÿHù¶iìÿþÑÿÿô…þÿÿÜcŸ+ üÜÿˆû3ÿþï„ÿÿ̯ø*ÿ þRÿÿûîìu^ÿÿþš üƒÿ%ýÖÅïÛÿÿýàöJÿ· 2ÿØòOÌùè¡(Záõ— ý)ÁýzoñžëöÆBÿÿïÈÖz þ\ø‰ÞÖܶ,ø\°ÿÿðýYïø‚ÿú ÇÿÕ÷Yïÿÿðü5öðøÜÿð™Üü5öðÿþðû3íÿðüøÿðû3íÿðÿþð÷€³ÿÿüÀœñyÙÎÚÀÿÿüÀŠð³ÿÿüÀœÿÿð/Æõ¾ùÒàÖWù€ÿÿðò±ÿonÿ¸ÿÿðÿþðÿùú‰Zÿÿ®ï Ïÿ:'ÿþA€ÿÿðòhÿÿÿÿjÿÿðÿþðÿùõ÷ÿï÷{ÿþ÷ÿ¯ÿþðòÌÿýüÿËÿÿðÿþðÿùððÿÿïÒÿòðÿåÿÿðüöÿóøóÿõÿÿðÿþðÿùððÿÿï÷ÿþÀÀÞàÚÿÿðüöÿñøòÿõÿÿðÿþðÿùððÿÿûøÿÿùÝÿÿðüËÿùøûÿÌÿÿðÿþðÿùððÿÿûÕÿÿHöÐþÿö6!òlÿÿÿÿkÿÿññþÿö6!ÿÿððÿÿì„ÿÿ̯tÚÿÿ¤²ñ»ÿgiÿºÿÿþÜÚÿÿ¤² ÿÿööÿÿ ÛÿÿýàöJAÙõ¹öÛÍÛëÿÿýëxùAÙõ¹#¼ÿÿýz|ÿÿþ²ùžëöÆB ‚ýrÔÿÿþÂþWÿÿýØo,ùÿûÿÿ.ú¹÷ÿÿ.úÿ©ÿÿ›ù2™ðÿÿ.ùÿ<ÿÿöúŸ.ðÿÿ/ùÿÎÿÿuù»ðÿÿøyÙÎÚîyÙÎÚ·ÿÿð+ÄõÀÒÿaÿÿßzYðÿÿ±ÿonÿ¸±ÿonÿ¸ÿÿ÷|Yÿÿ±ÒÿìÿÿOÌðÿÿhÿÿÿÿjhÿÿÿÿjÿÿô÷ÿñÒÿ‡ÿÿ¼T„ðÿÿÌÿýüÿËÌÿýüÿËÿÿððÿÿëÿüÿÿ*¾ðÿÿöÿóøóÿõöÿóóóÿõÿÿððÿÿþÿú¬ÿÿÀ®÷ðÿÿöÿñøòÿõöÿñóòÿõÿÿððÿÿþÿþ?ÿÿþD÷ðÿÿËÿùøûÿÌËÿùóûÿÌÿÿððÿÿýÿûÑÿÙÞðÿÿlÿÿÿÿklÿÿÿÿkÿÿððÿÿüÿ-üdÿoÜ ýÿÿ»ÿgiÿº»ÿgiÿºÿÿùùÿÿ ñÝÿç¢ âyÕÿÿõÞtÛÍÛöÛÍÛ çÿÿý™—ÿÿþØ Œ((((«U*6 New Layer#1ÿ      6° ,86Ðàð € € € € € € € € € € € € € € € €‰D "b: Utilitiesÿ     Kgimp-text-layer/(text "Utilities") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 354.000000) (box-height 58.000000) (box-unit pixels) Eb:e ,8b:‰Îàð€€€Àýjýÿÿýù‚ýPúÿÿþN ÷(Ííqgöÿÿþhû(Ííq ý ÿÿüÞ.ù?Úÿ¢ý9ù÷Äÿÿþ,>ÿÿþhúÄÿÿþ,ý9ùþÿÿþ€üWÿüæÿþõÿÿû]ÿÿþhþõÿÿþ]üæÿþÿÿþiý0ýûÒÿÿþÉÿÿþ1ÿþhþÉÿÿþ1ûÒÿÿÿþhý,üýÈÿÿû0Ôîxÿþhû0ÔîxýÈÿÿÿþhý,üý!Ôÿÿ ÿþhý!Ôÿÿÿþhý,üýØôÿÿìý?÷ÿÿþhÿûh?÷ÿÿúhØôÿÿþìÿþhý,üþhÿÿþ3ÿÿþhÿûh3ÿÿþhþhÿÿÿþhý,üþhÿÿþÿÿþhÿûhÿÿþhþhÿÿÿþhý,üþhÿÿÿþhÿþhÿþhþhÿÿÿþhý,üþhÿÿÿþhÿþhÿþhþhÿÿÿþhý,üþhÿÿÿþhÿþhÿþhþhÿÿÿþhý,ûþhÿÿÿþhÿþhÿþhþhÿÿþüÿÿþjý8îþhÿÿÿþhÿþhÿþhþhÿÿþìÿÿþwýRØþhÿÿÿþhÿþhÿþhþhÿÿþÌÿÿþœýŠ¢þhÿÿÿþhÿþhÿþhþhÿÿþ„ÿÿýâü åQþgÿÿú $kÿÿþhÿþhÿþhþgÿÿþ ýæÿÿþoûÎþIÿÿú}AÓAÿÿûjÿÿûjÿÿþjþIÿÿþ}ñ(Þÿÿþ*NÂá"ý Þÿÿü5ÿÿû¡Bÿÿûž5ÿÿþ¡ý Þÿÿü „éÿÿùýúÿ÷˜ö$­éòÈW?øÿÿüµg÷ÿÿü±?øÿÿþµú$­éòÈ÷5cwyiC °€€€Äû(Ííq:úÄÿÿþ,9þõÿÿþ]9þÉÿÿþ19û0Ôîxvìý?÷ÿÿþhøG­æóî½Yú‰Ûõûÿÿþ`þ3ÿÿþhé¢ÿò4‹ÿÿ™ØÿŒTêÿ`þÿÿþhøšÿÿ ÿÿùJÿÿ ü7û` ÿûh7ÿÿûyÿÿù­ìÿÿVý ` ÿûhŸÿÿþjÿ÷âòÿÿú„$ÿûhÛÿÿþóèèôüì¸ÿÿüö”"ÿûhöÿÿþŽý,ðÿÿýóg!ÿûh÷ÿÿþ¨ý.ÎÿÿþT ÿûhàÿÿþÛüQÊÿÿþÎ ÿûh§ÿÿþ!ûòúNäÿÿ÷ü$kÿÿûhHÿÿþ ú'à$ÿQû%ýÿæûAÓAÿÿþjþ³ÿÿõ§ü/«L;ü”ÿÃ;ü3Ûû=þ @@@þZ„„þ÷X‹µ§”H öN!Îÿÿ(ýN!ö)Ìþn .¿ò ü.õ8û ÿÿ(ü.õ8û6÷ÿý´ ûÜÿ8û ÿÿ(ûÜÿ8úÓÿý÷8888!ïØÿÿc8 ÿÿ(UBû(a<øØÿÿc8ûrÿÿÆøÿ©!¦ã9ÜaÙÿÿ»¨ ÿÿbãÿÿÜXähLÁõ¥aÙÿÿ»¨û±ÿÿ©ùÿweûÿÿ8æ ÿÿ ^ÿÿdõÿ<Bÿÿnÿÿ8ûÞÿÿ“ùÿÜ¿ ûÿÿ8æ ÿÿ(ÿÿ­ðÿe ÿÿÿÿ8û÷ÿÿŒÿüA%¡ûÿÿ8æ ÿÿ(ÿÿ´"C+‡ÿÿ ÿÿ8ûÐÿÿ¢ÿü¤€Aûÿÿ8æ ÿÿ(ÿÿ´[ÎÇhÿÿ ÿÿ8û£ÿÿºúÑÿ÷¿ûÿÿ8æ ÿÿ(ÿÿ´²ÿÕ$ÿÿ ÿÿ8úHÿÿò ûiÿÿÝÿÿ: ÿÿ(ÿÿ´Oÿÿ‚$ÿÿ ÿÿ:û¡ÿÿbú óþ!ÝkÿÿŽ{F­ÿÿ4!ÿÿÂZÿÿËHÂÿÿºkÿÿŽ{Fú¿ÿòAú­˜ÀÞ×ÿôxnöÿÿʾÿÿùlÏÿÿÈ*ÑÿôT×ÿôxóhêüΣÕéuc_ ý$ ø-7 ý$ öGZ;° ;ýa‡<ý§ ý@@@ýHIþZ„„þþg„„þBýù`úÜÿÿ ú ‹ÿÿ€ýÿ`û¨ÿÿ ûHÿÿ€ýâ`û¨ÿÿ ûHÿÿ€÷UX#Y[&þ&88ý88ù#¨ÿÿ ÷@c'Hÿÿ€Üþ“‡þ— Gïÿÿ!©ÿÿ ¨ÿÿ ÆÿöǦÿÿ€ÜŒÿ¸³ÿ”¹ÿÿ/ÿÿ ¨ÿÿ ¬ÿî-’ÿÿ€Û#üÿŠ…ÿý&´ÿÿ(ÿÿ ¨ÿÿ 'þÿ½Hÿÿ€ÛZÿÿ|wÿÿ\´ÿÿ(ÿÿ ¨ÿÿ Zÿÿ—Hÿÿ€Ûtÿÿroÿÿx´ÿÿ(ÿÿ ¨ÿÿ wÿÿ}Hÿÿ€ÛQÿÿywÿÿU´ÿÿ(ÿÿ ¨ÿÿ `ÿÿšHÿÿ€Úƒ“ôÿˆ‡ÿö¨ÿÿ(ÿÿ ¨ÿÿ /ÿÿ¾Lÿÿ€Ù·sÿ½¿ÿx[ÿÿl1¹ÿÿúÿÿ0¶ÿóDÂÿÿ«öiô²³õlå ¼þÿÛ\ÿî¿ÞúÿÿÇ ÂÿüÞnÿðÃhû//ú, # ú#3 " œ@@@@    °X,^6 New Layer#1ÿ      o^6+^6³ÃÓãó € € € € € € € € € € € € € € € € € € € €TTTT¯W +`="Hello World"ÿ     Qgimp-text-layer5(text "\"Hello World\"") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 352.000000) (box-height 61.000000) (box-unit pixels) :`=Z²¾Ê`=~«Ç‚’¢@@@ƒüXŸBû n—+þ%HHü*)HHþ- þ%HHý %HHú5ÿÿùûgÿÿØüGÅýÿÿøùÂSPÂúÿÿüüÈY ýHßÿÿü0HßÿÿþwÿÿþPþ¨ÿÿþþZÿÿþHþHÿÿþ_ þ2ÿÿü02ÿÿþ`ÿÿþ0ú‹ÿÿøý üÿÿýðýíÿÿýþ þüÿÿû0üÿÿú3ÿÿùû[ÿÿÍþøÿÿþäþàÿÿþüþüÿÿû0üÿÿûõÿËû%ÿÿ˜þøÿÿþäþàÿÿþüþüÿÿû0üÿÿüÀÿ”üìÿaþøÿÿþäþàÿÿþüýþüÿÿû0üÿÿü…ÿ[ü´ÿ'þøÿÿþäþàÿÿþü÷ŸâáÞè“þüÿÿû0üÿÿüAà ýmÒþøÿÿþäþàÿÿþüò2ßÿ®¬ÿÏ üÿÿû0üÿÿþøÿÿþé00þæÿÿþüñÞÿÿDLÿÿ~üÿÿû0üÿÿþøÿ ÿþüþrÿÿõ&ÿÿð üÿÿû0üÿÿþøÿÿþê88þçÿÿþü÷Üÿÿüÿÿü>üÿÿû0üÿÿþøÿÿþäþàÿÿ÷üüÿÿ÷ttþ|ÿÿüküÿÿû0üÿÿþøÿÿþäþàÿÿûü(ÿÿþ®¨¨ü_üÿÿû0üÿÿþøÿÿþäþàÿÿûü2ÿÿþ"þüÿÿû0üÿÿþøÿÿþäþàÿÿûüÿÿþEþüÿÿû0üÿÿþøÿÿþäþàÿÿþüþëÿÿþ€þüÿÿû0üÿÿþøÿÿþäþàÿÿþüþžÿÿýãûBcüÿÿû0üÿÿýþÿÿý÷ ý öÿÿú÷ÿÿö® Yë*ýÿÿû9ýÿÿý†ÿÿýuýuÿÿùŠküÿÿøúÍñ÷LWÿÿü€Wÿÿýiñÿÿúðyvðÿÿùô@äÿÿú÷½9nÿÿþýÿÿ*ú$UF O@@@€þ þHHüHHûEHHþþ0ý=Ðÿÿøö«33«ùÿÿôÅ„•×ÿÿÞ?þ0ýÑÿÿþ•þTÿÿýæûýÛ þ0þUÿÿþ¤ýàÿÿýø üÿW þ0ýðÿÿýìþ„ÿÿþOüRô þ0þžÿÿþEþIÿÿþ¡ý¦¨ þ0ü"þDÿÿþšþœÿÿýîüòSù"0÷^ÇóÐóÌm ýçÿÿýêü ò¹ÿÿþEüMô ê^ÇóÐóÌm0§ÿø,$õÿµ þÿÿþBû_áýÿÿþ—ý ©ï§ÿø,$õÿ0©ÿÿŸû–ÿÿ¸ þ6ÿÿþ–ûÁ€¼ÿÿùçîSû©ÿÿŸú–ÿ0KÿÿþmþcÿÿþV þÛÿÿ÷è#ü`ÿÿú<Gô þKÿÿþmúcÿ0ËÿÿþGþ>ÿÿþÔ þ‚ÿÿ÷?…¸öÿÿûŽ›©þËÿÿþGú>ÿ0÷ÿÿþ<þ3ÿÿýû þ'ÿÿû“ãUþ©ÿÿûßëTý÷ÿÿþ<û3ÿ0(ÿÿþ2þ)ÿÿþ, þÍÿÿûåJêþMÿÿütõ þ(ÿÿþ2û)ÿ0,ÿÿþ*þ#ÿÿþ7 þsÿÿýÚýìÿÿýöªþ,ÿÿþ*ú#ÿ0üÿÿþ2þ.ÿÿþ ýýÿÿþ)þ–ÿÿþUýüÿÿþ2ú.ÿ0Øÿÿþ>þ9ÿÿþáþ¿ÿÿþÆþ:ÿÿýõ þØÿÿþ>ú9ÿ0sÿÿþRþOÿÿþ|þeÿÿþbûÞÿÿ«þsÿÿþRöOÿ9Óÿÿ…úƒÿÿØúùÿò ûƒÿÿVúÓÿÿ…ïƒÿ€0àÿÜ Üÿã4ü°ÿšû'ÿö é0àÿÜ Üÿÿ¥ý×–Öý¬üVÿ6ý̬÷¥ý×–Öý¬ú 9_< ý ký>2 ú 9_< @@@@‘þ%HHþ þHHþüXŸBû n—+ýHßÿÿþ0üˆÍÿÿþ@ú5ÿÿùûgÿÿØþ2ÿÿþ0þÿÿþ@þwÿÿþPþ¨ÿÿþþüÿÿþ0þíÿÿþ@þ`ÿÿþ0ú‹ÿÿøþüÿÿþ0þìÿÿþ@ú3ÿÿùû[ÿÿÍþüÿÿþ0þìÿÿþ@ûõÿËû%ÿÿ˜þþüÿÿþ0ù!ìÿÿþ@üÀÿ”üìÿaþýÒÔÔõsjÖÿ×@üÿÿþ0÷²ðÿóšìÿÿþ@ü…ÿ[ü´ÿ'ýµý$ÚÿÿýŒkÿÿû¿üÿÿó02æÿÿç•ÅÆóÿÿþ@üAà ýmÒýÿ¸þ’ÿÿõÔì‘ùÿÿàüÿÿô0áÿÿõ*…ÿÿþ@ÿþVþ„ÿÿö&Pêófüÿÿü0gÿÿþ¨ýñÿÿþ@ÿþÔþ„ÿÿþÙý þüÿÿü0Õÿÿþeþìÿÿþ@ÿúû„ÿÿþ©þüÿÿü0ûÿÿþJþìÿÿþ@ÿû,„ÿÿþ¨þüÿÿý0"ÿÿþ:þìÿÿþ@ÿû7„ÿÿþ¨þüÿÿý07ÿÿþ5þìÿÿþ@ÿû „ÿÿþ¨þüÿÿý0ÿÿþDþìÿÿþ@ÿþáþ„ÿÿþ¨þüÿÿü0õÿÿþWþìÿÿþ@ÿþ|þ„ÿÿþ¨þüÿÿü0²ÿÿþýñÿÿþ@üÿØþŒÿÿþÉýýÿÿü92ÿÿúß wÿÿþfýã4ý Ëÿÿýù þWÿÿû€•ÿÿú¶]ºãêÿÿüÚrþýïÿÿþ¶þnÿÿú{üÿÿöÃÔÿòÄ™y1ö DY%B$Z@@@@@@@@    °X,,  New Layerÿ      |,  œ! !!$, ¼ Ì Ü ì ü€€€€–K%stem-1.7.1/docs/_static/label/resources/doctor.xcf0000664000175000017500000000511413157571677022701 0ustar atagaratagar00000000000000gimp xcf filed BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ² rf&DocTorÿ     Hgimp-text-layer,(text "DocTor") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 102.000000) (box-height 38.000000) (box-unit pixels) ­f&Å ff&Ù¤ € € €ÀýXÛÿÿ÷üñòáÅL þ€ÿÿþóÿÿùöûÿeÿÿõ¤ TÏÿÿàgø€ÿÿ¸E ÿÿùh ÿÿþhý•ÿÿý¸ü€ÿœÿþhÿþhýµÿÿýà ü€ïÿþhÿþhý ýÿÿþý€ ÿþhÿþhþ´ÿÿýú"ýp\ÿþhÿþhþpÿÿþy÷,œßïìÀf÷ËçõØ—&ÿþhÿþhþ8ÿÿþÁõwüÿr"äÿÎõSòÿ‘<ÿÿùOÿþhÿþhþÿÿþâûtÿÿÜútÿÿ× øUþÿíÿÿþßÿþhÿþhþ ÿÿ÷÷&ûÿÿ£þ:ÿÿ÷óÿÿ£ûìÿÿìÿþhÿþhþÿÿûï•ÿÿþ„þÿÿûõ…ÿÿþûiêÜTÿþhÿþhþÿÿûÙÚÿÿþsþ ÿÿü@Ïÿÿþl ÿþhÿþhþ$ÿÿû¨öÿÿþlþÿÿü]òÿÿþr ÿþhÿþhþPÿÿû^õÿÿþiþÿÿü]ùÿÿþ ÿþhÿþhþÿÿúå ×ÿÿþmþÿÿü@áÿÿþÈ ÿþhÿþhýãÿÿþ`þ”ÿÿþ{þÿÿûõ¤ÿÿýþ* ÿþhÿþhþsÿÿþ”ú'ýÿÿ—þ5ÿÿûŒ<ÿÿýÀý?þÿÿþiþÿÿþnùNúÿÿû|ÿÿÎúmÿÿ× þœÿÿø¼4yÇþÿÿþzþXÿÿõµ =¡þÿÒLõ‚þÿd!àÿÎý¢ÿÿý·ýzÿÿùÑPÁþÿÿ÷ýñ÷åÉE÷3¡áîìÀgøG®çúæ¶Uý¯ðÿÿýþÞ¿¤¤¤ ÿþ€úfÝÿÿ€ û Èÿ€!ü(ý€"ý¾€"p)÷,œßïìÀfý{ùÿÿøh‚ãñ˜ õwüÿr"äÿÎþ=ÿÿýn¼ÿÿþZ ûtÿÿÜ÷tÿÿ× ÿÿüé†~ÿÿþn ú&ûÿÿ£þ:ÿÿþÿø¿wòÆ þ•ÿÿþ„þÿÿûõÿÿþzþÚÿÿþsþ ÿÿü@ÿÿþhþöÿÿþlþÿÿü]ÿÿþhþõÿÿþiþÿÿü]ÿÿþhþ×ÿÿþmþÿÿü@ÿÿþhþ”ÿÿþ{þÿÿûõÿÿþhú'ýÿÿ—þ5ÿÿþŒÿþhû|ÿÿÎ÷mÿÿ× ÿÿþsõ‚þÿd!àÿÎþ;ÿÿþ® þo÷3¡áîìÀgýzùÿÿýÞaª3-  New Layerÿ      -  ,- <    stem-1.7.1/docs/_static/label/resources/gentoo.xcf0000664000175000017500000000533313157571677022705 0ustar atagaratagar00000000000000gimp xcf file_ BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ² ˜2Gentooÿ     Hgimp-text-layer,(text "Gentoo") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 152.000000) (box-height 50.000000) (box-unit pixels) ­˜2É i u˜2á… Y € € €ÇòF“ÐéïëÆ‰7Y¨/ð>ÌÿîjB´ÿÙ¢ð¨#ý9ùúpüÿì#úZ÷ÿÿ¨"üæÿþqÿÿþXûBúÿ¨!ûÒÿÿùAüÿÿÜüpÿ¨ ýÈÿÿýÐÿÿþüϨý!ÔÿÿþKÿÿþQ ýM¨õG­æóî½Yÿÿ÷hwØøá‚ýØôÿÿìþ˜ÿÿþ+ò¢ÿò4‹ÿÿ™Pÿÿýl¸ÿÿþ þhÿÿþÓÿÿþøšÿÿ ÿÿüJÿÿûÞp }ÿÿýþ$þhÿÿþìÿÿþþ7ÿÿûyÿÿü­ÿÿû‡ÿÿþZþhÿÿü&úÿÿþþŸÿÿþjÿüâÿÿûhÿÿþgþhÿÿü•èÿÿþý–ñôôüó‡ÛÿÿþóèèôüìÿÿþhÿþhþhÿÿüÚËÿÿþ!ü-ÙÿÿûœöÿÿþŽÿþhÿþhþhÿÿüö‰ÿÿþKþ{ÿÿû÷ÿÿþ¨ÿþhÿþhþhÿÿüõ5ÿÿþ~þhÿÿûàÿÿþÛÿþhÿþhþhÿÿû×±ÿÿþÓþhÿÿþ§ÿÿþ!üÿÿþhÿþhþhÿÿú” éÿÿþAþhÿÿþHÿÿþ û'à$ÿÿþhÿþhþgÿÿú $k'ù7ñÿÿÜ þsÿÿþ³ÿÿ÷§ÿÿeÿÿððÿÿÿþðÿþðüËÿùóûÿÌÿÿððÿÿî¤ôÚÎqÿÿððÿÿÿþðÿþðålÿÿÿÿkñÿöôÿÿ&½ü$ÿùððÿÿóþÿö6! ÿÿûé»ÿgiÿº¶ÿÿ†¬úÿÿbÙÿÿòì©ÿÿööÿÿ ÷Úÿÿ¤² Àÿÿý¹0êÛÍÛ#Æ÷Â*ΡxYÏÿÿ¼ÿýz|ÿÿþ²ùAÙõ¹#¼ü®ôØØüòÿó5üÇõü íß5üãö#ü8úc5÷*¢ÝÈ¿À®B ˜ÿþðývûÿÿûÙ04æÿÿ÷÷¾ûÿÿþðþnÿÿ÷ ÐÿÿŽý–ÿþðú÷ÿÿ>ûoÿÿÆý®(ÿþðû­ÿÿ‘ö?ÿÿþ Çÿùð/Æõ¾ùÒàÖWïSÿÿã—æÿÿpYzøyÙÎÚîyÙÎÚÿÿú‰Zÿÿ®÷ Ïÿ:'ÿþAÑñÿÿ8Í_ÿÿŰ$±ÿonÿ¸±ÿonÿ¸ÿÿõ÷ÿï÷{ÿþ÷ÿ¯ñŸÿÿ‹Z{ õÿþÆãhÿÿÿÿjhÿÿÿÿjÿÿððÿÿ÷ÒÿòðÿåñEÿÿÞ¸¥ÿÿp^vãÌÿýüÿËÌÿýüÿËÿÿððÿÿ÷÷ÿþÀÀÞàÚñçÿÿR±IÿÿÆ´ üöÿóøóÿõöÿóóóÿõÿÿððÿÿûøÿÿ ó‘ÿÿìPèÿþÄüöÿñøòÿõöÿñóòÿõÿÿððÿÿûÕÿÿH ú7ÿÿçûÿÿrüËÿùøûÿÌËÿùóûÿÌÿÿððÿÿö„ÿÿ̯üÜÿˆû3ÿþØlÿÿÿÿklÿÿÿÿkÿÿööÿÿ ÛÿÿýàöJüƒÿ%ýÖÅë»ÿgiÿº»ÿgiÿºÿÿýz|ÿÿþ²ùžëöÆB ý)ÁýzoøÛÍÛøÛÍÛ ((([ý5¦ÿÿüôÿÿüðÿÿüðÿÿ ÷ ¶ô¬vòÿÿ ùÞÿ†Jÿÿ ö~ÿÿ)ñÿÿ öÏÿýðÿÿ üõÿóüðÿÿ üôÿòüðÿÿ öÔÿýðÿÿ öŽÿÿ$óÿÿ ùóÿyeÿÿþ õ:Îô§mÝÊ´¦«U*6 New Layer#1ÿ      6° ,86Ðàð € € € € € € € € € € € € € € € €‰D "b:Hidden Servicesÿ     Qgimp-text-layer5(text "Hidden Services") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 354.000000) (box-height 58.000000) (box-unit pixels) Ib:i"F"R"^b:´!]"&"6€€€ÀýmëÿÿøýØZZØýÿÿ÷ê€(Ííqü"Èøÿÿþhü"ÈøÿÿúhwÿÿýÔýÕÿÿýwúÄÿÿþ,þ1ÿÿþh þ1ÿÿþhþ ÿÿþvþwÿÿþ þõÿÿþ]þÿÿþh þÿÿþhÿþhþhÿÿþÉÿÿþ1 ÿþh ÿþhÿþhþhÿÿû0Ôîx ÿþh ÿþhÿþhþhÿÿÿþh ÿþhÿþhþhÿÿý?÷ÿÿþhø ƒÛøÚfÿÿþhø ƒÛøÚfÿÿþhÿþhþhÿÿþ3ÿÿþhýÒÿÿüæõ†ÿÿþhýÒÿÿüæõ†ÿÿþhÿþvþvÿÿþÿÿþhþ²ÿÿûv²ÿÿþhþ²ÿÿûv²ÿÿþhÿÿûh?ÿÿúÞÿÿþhþ?ÿÿúÞÿÿþhÿþ’HHþ’ÿÿÿûhžÿÿþ›ÿþhþžÿÿþ›ÿþhÿþhþhÿÿÿûhØÿÿþyÿþhþØÿÿþyÿþhÿþhþhÿÿÿûhôÿÿþkÿþhþôÿÿþkÿþhÿþhþhÿÿÿûhûÿÿþjÿþhþûÿÿþjÿþhÿþhþhÿÿÿûhéÿÿþwÿþhþéÿÿþwÿþhÿþhþhÿÿÿûhºÿÿþ–ÿþhþºÿÿþ–ÿþhÿþhþhÿÿÿûhiÿÿþÕþ!ÿÿþkþiÿÿþÕþ!ÿÿþkþ ÿÿþwþxÿÿþ þÿÿúj àÿÿû_Ðÿÿù¥ àÿÿû_Ðÿÿú¥zÿÿýÖ!ý#Øÿÿúz5ÿÿþ¡ý6óÿÿüãürÿÿùé"6óÿÿüãürÿÿüéoðÿÿúá]]âÿÿûòƒ?øÿÿþµò%©ìöÈLÙœlF"ò%©ìöÈLÙœlF"¿€€€ëó}Èîíç¸u*Dÿ1ö<éí[ rðÿÿþ0ûðÿVú Ýÿÿ0û“ÿÿû-øÿ0ûÛÿÿ#üŽÿ0úøÿÿ¯ü þ õG­æóî½Yÿÿ÷hwØøá‚ þòÿÿýÒD ûG­æóò¢ÿò4‹ÿÿ™Pÿÿýl¸ÿÿþ  þ»ÿÿüÆOù¢ÿò4øšÿÿ ÿÿüJÿÿûÞp }ÿÿýþ$ þJÿÿüÖ`ûšÿÿ þ7ÿÿûyÿÿü­ÿÿû‡ÿÿþZ þŠÿÿýßEþ7ÿÿþyþŸÿÿþjÿüâÿÿûhÿÿþg ýo÷ÿÿþZþŸÿÿþjþÛÿÿþóèèôüìÿÿþhÿþh ý&®ÿÿú÷#ÛÿÿùóèèöÿÿþŽÿþhÿþhü0«þÿÿû™öÿÿþŽþ÷ÿÿþ¨ÿþhÿþh ý@Oý/ÃÿÿûÜ÷ÿÿþ¨þàÿÿþÛÿþhÿþh ý€ÖýªÿÿûøàÿÿþÛþ§ÿÿþ!üÿÿþhÿþh ü€ÿ2þ$ÿÿûá§ÿÿþ!þHÿÿþ û'à$ÿÿþhÿþh ü€ÿªþ ÿÿûšHÿÿþ þ³ÿÿ÷§ûýšV>ûýþ"ÿÿþ|÷sÿ½¿ÿxþÿÿß}êÿÿÐ[ÿÿl1¹ÿÿÂÕÕ¹€ÕÕ¹ýˆÜÿÿüð®$ùiô²³õlýiÛÿÿúõ­ UÿÿçɼþÿÛ\ÿî¿ïÚÚˆ¥Ä7€ÚÚˆ¥Ä7 û//ì, #",$",$ ÀÀÀü,­zþR„„ý"#„„õƒ„„R,­zþZ„„þû¬ÿÿ+ ý®ÿÿì8[êÿÿµи¬ÿÿ+öN!Îÿÿ(ûwÿê þ(ÿÿþ$û…ÿÿ»øÁ*wÿê ü.õ8û ÿÿ(ý( ûÍÿÿuö8ÿÿø Ìý( ûÜÿ8û ÿÿ(þ&88þû(a<ûsÿÿÉôyúÿÿX^}&88íØÿÿc8 ÿÿ(UBñGèÿÿ(XähLÁõ¥×ýÿþÌ€ÿÿ«±(Gèÿÿ(aÙÿÿ»¨ ÿÿbãÿÿÜò¦ÿÿ(õÿ<Bÿÿnñ¿ÿÿq=šýÿô Ëõ¦ÿÿ(ÿÿ8ö ÿÿ ^ÿÿdò ÿÿ(ðÿe ÿÿñeÿÿÅŸ6½ÿÿPX~õ ÿÿ(ÿÿ8ö ÿÿ(ÿÿ­ò ÿÿ("C+‡ÿÿ ñùÿþ'Æaÿÿ£«(õ ÿÿ(ÿÿ8ö ÿÿ(ÿÿ´ò ÿÿ([ÎÇhÿÿ ó±ÿÿÊoöÿðÈõ ÿÿ(ÿÿ8æ ÿÿ(ÿÿ´  ÿÿ(²ÿÕ$ÿÿ úWÿÿøû©ÿÿ~õ ÿÿ(ÿÿ8æ ÿÿ(ÿÿ´ ÿÿ(Oÿÿ‚$ÿÿ û òÿ§ûNÿÿ)é ÿÿ(ÿÿ: ÿÿ(ÿÿ´ñ­ÿÿ4ZÿÿËHÂÿÿºü¢ÿCüìÔØ­ÿÿ4kÿÿŽ{F­ÿÿ4!ÿÿÂnöÿÿÈÏÿÿÈ*ÑÿôTüHÝý–çnöÿÿÈ ×ÿôxnöÿÿʾÿÿùlø-7 ý/ý ý$ ÀÀÀþZ„„þ'6ý jÿÿü¶,7úøÿÿ]:ûôÿÿH:ûôÿÿHø#Y[& 88ô88'7eLûôÿÿHæþ“‡þ— 9äÿÿº–ðE¾æSžß*ûôÿÿHæŒÿ¸³ÿ”jÿÿ—]²ÿw+ÿ¾ûôÿÿHä#üÿŠ…ÿý& ìÿï ±.ÿÿVÿÿ!ûôÿÿHäZÿÿ|wÿÿ\†ÿÿ\«^ÿÿ¾¤¨ÿÿPûôÿÿHçVtÿÿroÿÿx ýÿÀ€Fvÿÿwþ ûôÿÿHçW‚QÿÿywÿÿU·ÿÿÉYÿÿŠûôÿÿHáßTôÿˆ‡ÿöPÿÿw%ýÿÙ+úþÿÿaò2Ðÿ%sÿ½¿ÿxûäù÷Ÿÿÿ©=X« ýh×ÿÿïí²«Ðÿÿôiô²³õlý¨ø ÿÿü¾'û//ýü9 ÀÀÀÀ3333†C!6 New Layer#1ÿ      =6 ] Í Ù å6 } ­ ½ € € € € € € € € € € € € € € € €‰D " ? Client Usageÿ     Ngimp-text-layer2(text "Client Usage") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 269.000000) (box-height 63.000000) (box-unit pixels) ð ?ºÆÒ ?0{ƒšªÀÀÀˆñHx§¦‚X” %HHø w‘&"î¾ÿûºyVÕ÷­c‘ÿHßÿÿ÷0Àÿÿð ú`ñÿýVüuöÿÿü2ÿÿü0ÿÿþWþ™ÿÿþg÷Hüÿÿüÿÿ÷0ØÿÿûþLÿÿýåømÿÿüÿÿø08®ÃUýãÿÿþŒù»ÿüÿÿþ0$þ•ÿÿþ5ù%üüÿÿþ0 ý ý þéÿÿþ úKüÿÿý0iÔÔþ1õŸâáÞè“KÔÔ÷L’ßÿþÀ$þÿÿþøþüÿÿü0eÿÿþ<ò2ßÿ®¬ÿÏ =ýÿÿûc¸óùÿÿúâ Cÿÿþãþüÿÿû0øÿÿî<ÞÿÿDLÿÿ~ÕÿÿúçsáÿÿûoqÿÿþÎþüÿÿû0ðÿÿû<rÿÿõ&ÿÿð Èÿÿþ…þ£ÿÿûrÿÿþØþüÿÿû0ðÿÿô<Üÿÿüÿÿü>Èÿÿþdþzÿÿû³Eÿÿþðþüÿÿû0ðÿÿø<üÿÿ÷ttþ|ÿÿükÈÿÿþdþxÿÿû´ÿÿþ þüÿÿû0ðÿÿü<(ÿÿþ®¨¨ü_Èÿÿþdþxÿÿþ´þêÿÿþ þüÿÿû0ðÿÿü<2ÿÿþ"þÈÿÿþdþxÿÿþ´þ•ÿÿþf þüÿÿû0ðÿÿü<ÿÿþEþÈÿÿþdþxÿÿþ´ý âÿÿþÊ úRüÿÿû0ðÿÿû<ëÿÿþ€þÈÿÿþdþxÿÿþ´þFÿÿþ1øþNüÿÿû0ðÿÿû<žÿÿýãûBcÈÿÿþdþxÿÿþ´þŠÿÿýã)÷¸ýdýÿÿû9öÿÿúB÷ÿÿö® Yë*Ïÿÿþjþ~ÿÿþ¹ñHáÿÿëe)R–ãïPþWÿÿü€>ÿÿþ…ýküÿÿ÷úÍñ÷Lúÿÿú«¾ÿÿýéü •îÿÿùòýÿõšþnÿÿýüþÿÿþ‘ý@äÿÿù÷½9LûÿÿüÄÉÿÿþíøIvŠxM ú$UF ÒÀÀÀ“þ%HHþ-þ(HHþ(üD«úÿÿüåšP÷Kªõÿÿú­ü±L þZÿÿýòû#÷þü„ÿT þÿÿþÅýºÑûLþÿT þÿÿþ´ý¢°ú4ïÿÿT þÿÿþ´ý °ý;ñÿÿþT þÿÿþ´ý °ø$û! ý4ôÿÿûâÔÔ!þÿÿþ´ý °å-Àüèø×Ÿï4iÔðÛÿþÙp 2|ëÿÿû§||þÿÿþ´ý °è1ùÿayúÿ4¸ÿ®+ÏÿÿÍþØÿÿþT þÿÿþ´ý °üÎÿê÷ÿ4hÿÿÀþuÿÿþ”þØÿÿþT þÿÿþ´ö °þÿÿ9úé4ÿÿû+6ÿÿþÕþØÿÿþT þÿÿþ´ç °ýÿÿôo" ^ÿÿñ0ÿÿþðþØÿÿþT þÿÿþ´ý °þÃÿÿüäj÷Jv( iÿÿþðþØÿÿþT þÿÿþ´ý¢¬ýSüÿÿýÕ%úO­õáÿÿþðþØÿÿþT ýýÿÿþ»ýºýGñÿÿôáeãÿÎO4ÿÿþðþØÿÿþT þßÿÿþÓý×lüŒôÿÿõy ÉÿÿÙ4ÿÿþðþØÿÿþT þ¸ÿÿþíø õH$iý¦ÿÿüº®ÿÿûq4ÿÿþðþØÿÿûZ) þŠÿÿþ9÷oç @ü$ùÿÿ¶ûÿÿû64ÿÿþðþ¸ÿÿûŽf¦ ý Ñÿÿý±ü ä`ü@ÿ¢ù+ÿÿƒ þÿÿû† ·ÿÿþóþYÿÿüàé ýåÿÿö¸1#dð±ò@ÿüp‰ÿæ¼ÿÿûÓí’úÿÿõ ®÷ÿüÁ- ü‚ïÿÿúüöÿçYñ@ý¨çù³ÜÿÎ.>ÕÿÿûÔ7™ÿÿü G÷ ?`|V1öCL]4ü5Tû3X¿ÀÀÀý ý+÷0²òûæî½ˆˆô=ŸâáÞè“'ørþÿØ- ”ÿÿót2ßÿ®¬ÿÏ %æFýÿÿqûÿÿcÞÿÿDLÿÿ~%þ¤ÿÿþKøäÿÿèrÿÿ÷&ÿÿð $þÒÿÿþ<þÕÿÿõ#Üÿÿüÿÿþ>$þ—ÿÿþEþÞÿÿù%üÿÿ÷ttþ|ÿÿþk$þ=ÿÿõ]óÿÿå(ÿÿþ®¨¨þ_$÷™ÿÿ±Qÿÿü^2ÿÿþ"-óJçÿצþÿêRÿÿþE-÷«¶i]L#þëÿÿþ€,ûyôÓþžÿÿýãýBc"ô3ÿÿî; ý÷ÿÿø® Yë*"ü·`œÿÿ÷îÉaküÿÿúúÍñ÷L#ü™vÿ ÿþ¤ý@äÿÿü÷½9&üŠöÿÿþ<ú$UF (ûdϳù’ºðÿÿl0ûµÿ¸û/þÿF/ûþÿ²û øë 0ú±ÿÿqú5Àé-1óoÄüÿñÏÙæÆj5ú(" uÀÀÀÀ3333†C!,  New Layerÿ     „, ¤ ,, ÄÔäô€€€€–K%stem-1.7.1/docs/_static/label/resources/openbsd.xcf0000664000175000017500000000714513340051401023013 0ustar atagaratagar00000000000000gimp xcf file‚ BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ¶ + )OpenBSDÿ     Igimp-text-layer-(text "OpenBSD") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 129.000000) (box-height 41.000000) (box-unit pixels) (hinting yes) ¿)× )ïè  @ @ @Çõ;‡ÇäøðÚ©a 2ñ6Áÿÿ¢4 kïÿëp/úgùÿÿyù-ôÿÿ± -þjÿÿýÁþpÿÿý¿+ý=ûÿÿþKý îÿÿþ‘*ýËÿÿýòþ£ÿÿýü()þFÿÿþ¸þbÿÿüžœÿÿø$EÅôï¼J÷bÂï÷Õ~ ÿ÷, é÷Ë“ÿÿþ‘þ:ÿÿûè qÿÿûkñ¹Ýÿÿþ‚ò ¹ÿâ*·ÿÍLÿÿýKäÿÿýÑÿÿþqþÿÿü(ÿÿúÔ$ ÕÿÿþOò¡ÿÿs5ÿÿ˜ÿÿ÷ÔZ ƒÿÿêÿÿþdþ ÿÿüAÿÿþJþiÿÿûÓ4ÿÿõ= ÿÿùÿÿ÷SÿÿúÿÿþZþÿÿüRÿÿþ4þ/ÿÿü(•ÿÿþ!ùõÿÿ^ÿÿ÷4ÿÿëÿÿþ^þ ÿÿüBÿÿþ4þÿÿüXÑÿÿþ.ùïÿÿ•ÿÿþ4ÿýÒÿÿþhþÿÿü)ÿÿþ4þÿÿüjñÿÿüµÿÿþ4ÿý˜ÿÿþ‚þ-ÿÿûëÿÿþ4þÿÿübûÿÿþ@ÿþ4ÿýLÿÿþ§þRÿÿþ¡ÿþ4þÿÿüFìÿÿþdÿþ4ÿüÒÿÿþáþÿÿýý+ÿþ4þ0ÿÿûû½ÿÿþªÿþ4ÿýEþÿÿþ1ýÝÿÿþ—ÿþ?þoÿÿû®hÿÿýý0ûG‘ÿÿþ4ÿþxÿÿþ¨þVÿÿýÄÿò¾àÿÿø(Öÿÿöíq8E—é&ÿÿù7ÿÿúwýÿÿ\ù êÿÿ·ÿ÷§á°èÿÿúTý%Þÿÿúæ0Rÿÿù~QÿÿñAÌÿþ‘+fêÿësÿø4LÍøêª.÷ |ÏôóÓ€ÿý4ÿÿõDÍçúïÙ§` ÿþ49ÿþ49ÿþ88þÿÿþQ8þ^ÿÿýÃ$7ÿþ4 @ @ @§þýùÿÿùøìÌSñuÃíúæ¯aOÿ€ÿÿùôãÊ”W ý†ÿÿõüC$ûÿÿÞ;î2âÿµ-!xòüÿÿ.©ÿÿô÷<QÇÿÿì€ þÿÿþßþƒÿÿýö.úèÿßû$âÿÿþÿÿþÜý†ÿÿýÒ% ÿþÜþ)ÿÿþ§û†ÿÿü5üÿÿþÜþ§ÿÿýâÿþÜþÿÿþÙûÓÿÿ¡ýžÿÿþÜýúÿÿþÃÿþÜþÿÿþÑúõÿÿðý1ÿÿþÜþ®ÿÿüSSÿþÜþ)ÿÿþ…þöÿÿýÞ9 ÿþÜþlÿÿû°ÿ`ÿþÜþÿÿýÀ þÃÿÿüþ¢ÿþÜþ6ÿÿúôÿèÿõÜI¡ÿÿÕeþQÿÿüøŽÿþÜþÿÿûÿÿ% ÿüÓhþŒÿÿüñsÿþÜþ ÿÿû/ÿÿ3ÿôÜ +víÿÿûžýtûÿÿý¾ÿþÜþÿÿû(ÿÿ4ÿþÜý éÿÿýã ý1ÇÿÿþÿþÜþÿÿûÿÿ4ÿþÜþlÿÿþ»ýTØÿÿýøÿþÜþ$ÿÿúáÿÿ4ÿþÜþ ÿÿþüfìÿÿþ_ÿþÜþMÿÿú–ÿÿ4ÿþÜþÿÿú0ÿ$ýÓÿÿþ€ÿþÜþˆÿÿùü+ÿÿ4ÿþÜþÿÿùþÿrþ?ÿÿþzÿþÜýÞÿÿù˜ÿÿ4ÿþÜþ@ÿÿþ³üÿ×þ ÿÿþLÿþÜþhÿÿøÂÿÿ7þÿÿþæý·ÿÿýàÿþcú%ÿÿåþÿÿþãùC÷ÿÿ³ÿùt/¦ÿÿõ^ ;µÿÿý¤ÿýô6öŠÿýO$©ÿÿôýF>›ýÿãjÿü4¤ÿÿùýòÝ´w#óÿþÿö%$‰üòWþ€ÿÿùùçÏ–Sôÿ7 r¹èúïÈ€Y((((@-  New Layerÿ      Ý-  ñ-     ‚ Selection Mask  “‚  ¯MY‚ ÇGK,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ?A stem-1.7.1/docs/_static/label/resources/debian.xcf0000664000175000017500000000610113157571677022626 0ustar atagaratagar00000000000000gimp xcf fileZ BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ¶ 5 Y$Debianÿ     gimp-text-layer(text "Debian") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode dynamic) (box-unit pixels) …Y$ )Y$±o   €þ%HHüE'þ"HHþ ûw‘&üHÅýÿÿ÷òÉíüÞºx ýBÔÿÿþT úÀÿÿð þfÿÿôð.Ìÿÿâ[ý ùÿÿþTþÿÿþWþÿÿþÔý§ÿÿýÅ þÙÿÿþT úØÿÿûþÿÿþÔýòÿÿþ—þØÿÿþT û8®ÃUþÿÿþÔþ†ÿÿþMþØÿÿþTþÿÿþÔýýÿÿýëýþØÿÿúTú!ÿÿþÔþãÿÿþ2÷ŸâáÞè“þØÿÿôT_ÝÿÿÛyiÔÔô1iÔðÛÿÿþÔþÄÿÿþ`ò2ßÿ®¬ÿÏ Øÿÿû×È…Ëÿÿú¬eÿÿø<¸ÿ®þÿÿþÔþ¥ÿÿîŽÞÿÿDLÿÿ~ØÿÿúÇÈÿÿúoøÿÿù<hÿÿÀþÿÿþÔþ†ÿÿû·rÿÿõ&ÿÿð ØÿÿþWþQÿÿúê ðÿÿü<ÿÿþ+þÿÿþÔþ~ÿÿôÜÿÿüÿÿü>ØÿÿþTýüÿÿûLðÿÿø<^ÿÿñþÿÿþÔþ—ÿÿøoüÿÿ÷ttþ|ÿÿükØÿÿþTþéÿÿûpðÿÿù<Jv(þÿÿþÔþ°ÿÿüB(ÿÿþ®¨¨ü_ØÿÿþTþ×ÿÿû’ðÿÿþ<ùO­ÿÿþÔþÈÿÿûþ2ÿÿþ"þØÿÿþTþÌÿÿû…ðÿÿô<eãÿÎÿÿþÔý÷ÿÿû”ÿÿþEþØÿÿþTþÛÿÿû]ðÿÿô< ÉÿÿÙÿÿþÔþsÿÿýÛ þëÿÿþ€þØÿÿþTþìÿÿû4ðÿÿü<®ÿÿþqþÿÿþÔùÚÿÿý<þžÿÿýãûBcØÿÿþTöþÿÿÈðÿÿü<ûÿÿþ6þ$ÿÿþèù¿ÿÿåQý÷ÿÿö® Yë*Øÿÿþuö]ÿÿþ6öÿÿüB þÿÿú† ™ÿÿöb>tÕÿý’ýküÿÿìúÍñ÷LØÿèöÌÜÿûtþ>ÿÿü…¼ÿÿüÓlùÿÿúêÀ—m,ý@äÿÿü÷½9ôذ%Ãç¢ãÿÛ:ýmþÿÿü‘>ÕÿÿþÔú$UF þ?û"XL ü5T„„„,ý ý úÿþÙp þKÔÔ÷L’ßÿþÀ$ù+ÏÿÿÍý=ýÿÿûc¸óùÿÿýâ þuÿÿþ”þÕÿÿúçsáÿÿþoþ6ÿÿþÕþÈÿÿþ…þ£ÿÿþþ0ÿÿþðþÈÿÿþdþzÿÿú³ iÿÿþðþÈÿÿþdþxÿÿú´õáÿÿþðþÈÿÿþdþxÿÿú´O4ÿÿþðþÈÿÿþdþxÿÿþ´þ4ÿÿþðþÈÿÿþdþxÿÿþ´þ4ÿÿþðþÈÿÿþdþxÿÿþ´þ4ÿÿþðþÈÿÿþdþxÿÿú´ ·ÿÿýóþÏÿÿþjþ~ÿÿù¹í’úÿÿú·`úÿÿú«¾ÿÿùé7™ÿÿû™LûÿÿüÄÉÿÿ÷í 3XÚ,-  New Layerÿ      Û-  ï- ÿ    Z Selection Mask  …Z  5Z ± 1,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ@-stem-1.7.1/docs/_static/label/resources/down_the_rabbit_hole.xcf0000664000175000017500000001522013157571677025547 0ustar atagaratagar00000000000000gimp xcf fileÈ6BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) º HÌ6³9Down the Rabbit Holeÿ      "Vgimp-text-layer:(text "Down the Rabbit Hole") (font "FreeSerif Bold") (font-size 20.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 435.000000) (box-height 57.000000) (box-unit pixels) ɳ9é $ 0 <³9ñ ÷ ä ô  @@@ýhÜÿÿùáÃÖÌ&+ê\°ÿÿðÿÿõUíý†(÷Yïÿÿðÿþðû3øÿ’'ü5öðÿþðÿþðûœÿÿ:%û3íÿðÿþðÿþðñEÿÿ¢yÙÎÚÿÿöƒ!ÏÿÿÛHJìÿÿùð+ÄõÀï³ÿÿüÀœÿÿð/ÿÿðÜÿÿß±ÿonÿ¸Íÿÿ7ÿÿ—Aÿÿ÷|Yÿÿ±ÿþðÿøú‰ÿÿðÝûÿ÷hÿÿÿÿjhÿÿf ýÿܯÿÿô÷ÿñÿþðÿøõÿÿðÝõÿñÌÿýüÿË÷ÿÅ\æÿÿ&Drÿÿððÿÿÿþðÿþðÿþð÷ÿÿÓöÿóçóÿõ§ÿÿ(´Pÿÿn£ÿÿððÿÿÿþðÿþðÿþð÷-ÿÿŽöÿñçòÿõGÿÿ¤¢ìÿ¦ÿÿððÿÿÿþðÿþðÿþð÷yÿú!ËÿùçûÿÌãÿÿ@ŸÿÿMÿÿððÿÿÿþðÿþðÿþðÛêÿllÿÿÿÿk†ÿÜNÿçÿÿððÿÿéþÿö6!ÿÿðÿÿû 6Óùkà»ÿgiÿº&ÿ{ôŠÿÿùùÿÿ óÚÿÿ¤² ÿÿödÖÿÿùãÅÓÏŠøÛÍÛýÁú¬( çÿÿý™—ÿÿþØùAÙõ¹#¼ÿÿþz ¿@@@ýwÝÿÿùáËåψ ú ´ÿÿðú ´ÿÿðô!ÿÿ÷´ÿë, ûÿÿðûÿÿðûÿÿðû'ÿÿ¼ ÿþðÿþðÿþðûûÿõ ÿþðÿþðûÆõ¾ùÒàÖWÿþðüøÿèísÌÁàÊfÿÿót°÷Â/ÿõót°÷Â/Zÿÿ®÷ Ïÿ:'ÿþAÿþðû+ÿÿ¥Þ ÿƒ'ÿÿ‘ÿÿþ5“ÿîÿÿþ5“ÿî÷ÿï÷{ÿþ÷ÿ¯ÿ÷ð0ÅÿÕÞçÿçóÿóÿÿð.ÿÿ—ÿÿð.ÿÿðÿÿ÷ÒÿòðÿåÿøüÑ÷ÿÿžÞsÏ€òÿÿÿÿðþÿÞÿÿðþÿðÿÿ÷÷ÿþÀÀÞàÚÿøðêÿÿåô-š´øÿÿÿÿð÷óÿúÿÿðùóÿðÿÿûøÿÿ ÿüðKÿÿþ¥ò¡ÿ‡ðÿÿÿÿð÷ôÿòÿÿðùôÿðÿÿûÕÿÿH ÿûð“ÿÿþSÞ—ÿÿðÿÿÿÿðÿÿÇÿÿðÿÿðÿÿö„ÿÿ̯ÅÿÿòÓÿÿêôÿÿ+/úÿÿÿÿò1ÿÿjÿÿò1ÿÿöÿÿ ÛÿÿýàöJþ4ÿÿ×(,÷ÿÿ¯ÚÿÿðÂßÿÿnÿíù-˜ÿ¾ÿíù-˜ÿ¾|ÿÿþ²ùžëöÆBý úÿÿúúÂlÿÿë–AÞï• bóâqÈ:¸Ëà† ÷È:¸Ëà†  ¿@@@ü‡óyþ\ýeÖÿÿúÏxyÐÿÿýÖnú¹ÿÿðüôÿãýYïúÿÿû ú ûÿÿû ÿÿðüô~ü5öðÿþðüðÿÿ ÿþðû3íÿðÿþðüðÿÿ ÿþðú¿ÿÿðù³ÿÿüÀœÿþðüðÿÿóyÙÎÚÿÿðùÒàÖWù ÿÿðÿþðÿþðíðÿÿ±ÿonÿ¸ÿÿð÷ Ïÿ:'ÿþAù—ÿÿðÿþð ÿòhÿÿÿÿjÿÿð÷{ÿþ÷ÿ¯ùÞÿÿðÿþðÿþðíðÿÿÌÿýüÿËÿÿð÷Òÿòðÿåùúÿÿðÿþðÿþð÷ðÿÿöÿóøóÿõÿÿð÷÷ÿþÀÀÞàÚùòÿÿðÿþðÿþð÷ðÿÿöÿñøòÿõÿÿðûøÿÿùÇÿÿðÿþðÿþð÷ðÿÿËÿùøûÿÌÿÿðûÕÿÿHùjÿÿðùþÿö6!ÿþðíðÿÿlÿÿÿÿkÿÿðö„ÿÿ̯ø ÿÿ÷ùÚÿÿ¤²úÿÿýáýÿÿ»ÿgiÿº ÿÿöÛÿÿýàöJý¿ÿÿþžúAÙõ¹ýlÜÿÿúÛ‚‚ÝÿÿóÞvÛÍÛ¹ÿÿþ›ùžëöÆB Å@@@@@@@@@@@@ [ [ [ [Ùl6Ÿ2 New Layer#1ÿ      ðŸ2¨´ÀŸ28HXhxˆ˜ € € € € € € € € € € € € € € € € € € € € € € € €Ïg 3³9 Interpreterÿ     Mgimp-text-layer1(text "Interpreter") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 435.000000) (box-height 57.000000) (box-unit pixels) ѳ9ñ*³9uÒâò@@@Àþºÿÿýõ?4ý˜ÿÿýÚ&ý9ùþÿÿþyüæÿÿþhûÒÿÿÿþhýÈÿÿÿþhý!Ôÿÿÿþhþÿÿ÷hwØøá‚ýØôÿÿìõG­æóî½Y{ùÿÿøh‚ãñ˜ÿþhþPÿÿýl¸ÿÿþ þhÿÿó¢ÿò4‹ÿÿ™=ÿÿýn¼ÿÿþZÿþhþÿÿûÞp }ÿÿýþ$þhÿÿøšÿÿ ÿÿýJÿÿüé†~ÿÿþnÿþhÿû‡ÿÿþZþhÿÿþ7ÿÿûyÿÿý­ÿÿø¿wòÆÿþhÿûhÿÿþgþhÿÿþŸÿÿþjÿýâÿÿþzÿþhÿþhÿþhþhÿÿþÛÿÿþóèèôýìÿÿþhÿþhÿþhÿþhþhÿÿþöÿÿþŽÿþhÿþhÿþhÿþhþhÿÿþ÷ÿÿþ¨ÿþhÿþhÿþhÿþhþhÿÿþàÿÿþÛÿþhÿþhÿþhÿþhþhÿÿþ§ÿÿþ!ýÿÿþhÿþhÿþhÿþhþgÿÿú $kHÿÿþ ü'à$ÿÿþhþÿÿþvþÿÿûkÿÿþkþIÿÿù}AÓA³ÿÿø§’ÿÿýª3ÿÿþÙù$­éòÈWô^½íøÝž,zùÿÿýÞaƒ@@@/ý9ù;üæÿ:ûÒÿÿ9ýÈÿÿ9ý!ÔÿÿþŸÿÿøh ­îóÄVý{ùÿÿøh‚ãñ˜øG­æóî½YýØôÿÿìõG­æóî½Y qÿÿûyâìöÿÿþþ=ÿÿýn¼ÿÿòZ¢ÿò4‹ÿÿ™þhÿÿó¢ÿò4‹ÿÿ™ÿÿúèaàÿÿûRÿÿüé†~ÿÿõnšÿÿ ÿÿûJhÿÿøšÿÿ ÿÿÿþ‰þoÿÿþÑÿö¿wòÆ7ÿÿûyÿÿû­hÿÿþ7ÿÿûyÿÿÿþhþ2ÿÿü#ÿÿþzþŸÿÿþjÿûâhÿÿþŸÿÿþjÿÿþhþÿÿüQÿÿþhþÛÿÿþóèèôûìhÿÿþÛÿÿþóèèôÿþhþÿÿübÿÿþhþöÿÿþŽþhÿÿþöÿÿþŽÿþhþÿÿü[ÿÿþhþ÷ÿÿþ¨þhÿÿþ÷ÿÿþ¨ÿþhþÿÿü@ÿÿþhþàÿÿþÛþhÿÿþàÿÿþÛÿþhþ2ÿÿûú ÿÿþhþ§ÿÿþ!ûhÿÿþ§ÿÿþ!ÿþzþuÿÿþ¬ÿþhþHÿÿþ ú'à$gÿÿú $kHÿÿþ ü'ÿÿóì/$éÿÿù)ÿÿþsþ³ÿÿö§& þHHþþ%HHüC¤ôÿÿ÷úËÞüÿó¤@üˆÍÿÿþ@üGÅýÿÿþ2ÿÿú3 Âÿÿý¿ þÿÿþ@ þZÿÿþòÿÿþüýøÿÿý¼þíÿÿþ@ û üÿÿþàÿÿþüþ¹ÿÿþ8þìÿÿþ@ üøÿÿþàÿÿþüþœÿÿþuþìÿÿþ@ üøÿÿþàÿÿþüþ“ÿÿþ…ýù!ìÿÿþ@ üøÿÿþàÿÿþüþ³ÿÿþX÷ŸâáÞè“÷²ðÿóšìÿÿþ@ üøÿÿþàÿÿþüýãÿÿýâõ2ßÿ®¬ÿÏ ö2æÿÿç•ÅÆóÿÿþ@ üøÿÿþàÿÿþüý“ÿÿýå2éÞÿÿDLÿÿ~áÿÿõ*…ÿÿþ@ üøÿÿþàÿÿõýd~›ëÿÿåþrÿÿõ&ÿÿð gÿÿþ¨ýñÿÿþ@ üøÿÿþàÿÿýþ¤ÿÿýý0÷Üÿÿüÿÿü>Õÿÿþeþìÿÿþ@ üøÿÿþàÿÿüüÿÿýÓúüÿÿ÷ttþ|ÿÿükûÿÿþJþìÿÿþ@ üøÿÿþàÿÿûüäÿÿþþ(ÿÿþ®¨¨ý_"ÿÿþ:þìÿÿþ@ üøÿÿþàÿÿûüKÿÿýþEþ2ÿÿþ"þ7ÿÿþ5þìÿÿþ@ üøÿÿþàÿÿþüþ¢ÿÿúåÿÿþEþÿÿþDþìÿÿþ@ üøÿÿþàÿÿþüýçÿÿþ¬þëÿÿþ€þõÿÿþWþìÿÿþ@ üøÿÿþâÿÿþýþPÿÿûažÿÿýãûBc²ÿÿþýñÿÿþ@ üøÿÿþõÿÿþþ§ÿÿúò"÷ÿÿö® Yë*2ÿÿúß wÿÿþf øþÿÿdÿÿý„ýêÿÿúÇküÿÿúúÍñ÷Lþ•ÿÿú¶]ºãêÿÿüÚrý†ÿÿýiïÿÿýôþUÿÿúö@äÿÿü÷½9ý{üÿÿöÃÔÿòÄ™yýiñÿÿú$UF ö DY%B$‘ € € €€Hü*)HHþ--ÿøùÂSPÂúÿÿüüÈY-ÿþHþHÿÿþ_ü±Lüÿðýíÿÿýþ ü„ÿTýÿäþàÿÿþüûLþÿTýÿäþàÿÿþüú4ïÿÿTýÿäþàÿÿþüû! ý;ñÿÿþTýÿäþàÿÿþüõiÔðÛÿþÙp ý4ôÿÿûâÔÔ!ýÿäþàÿÿþüî¸ÿ®+ÏÿÿÍ2|ëÿÿû§||ýÿé00þæÿÿþüûhÿÿÀþuÿÿþ”þØÿÿþT ÿþüþÿÿû+6ÿÿþÕþØÿÿþTýÿê88þçÿÿþü÷^ÿÿñ0ÿÿþðþØÿÿþTýÿäþàÿÿþü÷Jv( iÿÿþðþØÿÿþTýÿäþàÿÿþüúO­õáÿÿþðþØÿÿþTýÿäþàÿÿþüøeãÿÎO4ÿÿþðþØÿÿþTýÿäþàÿÿþü÷ ÉÿÿÙ4ÿÿþðþØÿÿþTýÿäþàÿÿþüþ®ÿÿûq4ÿÿþðþØÿÿþTýÿäþàÿÿúüûÿÿû64ÿÿþðþØÿÿûZ)üÿ÷ ý öÿÿû þÿÿû† ·ÿÿýóþ¸ÿÿûŽf¦ÿýuýuÿÿûмÿÿûÓí’úÿÿú·`Yÿÿüàéÿúðyvðÿÿûô>ÕÿÿûÔ7™ÿÿô™®÷ÿüÁ-)ü5Tû3Xü G™||||E" -  New Layerÿ      J-  ^- n    n Selection Mask  ôn  ¤n  ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿ,ÿÀ7stem-1.7.1/docs/_static/label/resources/double_double_toil_and_trouble.xcf0000664000175000017500000001772213157571677027630 0ustar atagaratagar00000000000000gimp xcf file6BBG gimp-commentCreated with GIMPgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ºÆJx³9Double Double Toil and Troubleÿ      "`gimp-text-layerD(text "Double Double Toil and Trouble") (font "FreeSerif Bold") (font-size 20.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 435.000000) (box-height 57.000000) (box-unit pixels) å³9¢®º³9-` “ žŸ‚’@@@þZ„„û}\7þU„„þþZ„„þ ýwÿÿøˆ6kéöƒ úÄÿÿ8úÜÿÿ þÿÿ÷8åÿåûÿÿ8û¨ÿÿ þÿÿþ8únÿÿ½ûÿÿ8û¨ÿÿ þÿÿþ8úùÿÿXû#Y[&þ&88ý88ï#ÿÿ8-dE¨ÿÿ ú7eLþÿÿþ8ÏÞÿÿŽþ“‡þ— Gïÿÿ!©ÿÿ ÿÿ¯½ýÿϨÿÿ ¾æSžß*þÿÿþ8ÏÀÿÿ»Œÿ¸³ÿ”¹ÿÿ/ÿÿ ÿÿnAûÿµ¨ÿÿ ²ÿw+ÿ¾þÿÿþ8ΫÿÿÅ#üÿŠ…ÿý&´ÿÿ(ÿÿ ÿÿ8Øÿÿ'¨ÿÿ .ÿÿVÿÿ!þÿÿþ8οÿÿ˜Zÿÿ|wÿÿ\´ÿÿ(ÿÿ ÿÿ8°ÿÿQ¨ÿÿ ^ÿÿ¾¤¨ÿÿPþÿÿþ8ÓØÿÿjtÿÿroÿÿx´ÿÿ(ÿÿ ÿÿ8Œÿÿ^¨ÿÿ vÿÿwþ þÿÿþ8ÒüÿâQÿÿywÿÿU´ÿÿ(ÿÿ ÿÿ8”ÿÿ8¨ÿÿ YÿÿŠ þÿÿþ8Í„ÿÿEôÿˆ‡ÿö¨ÿÿ(ÿÿ ÿÿ8°ÿç ¨ÿÿ %ýÿÙ+þ&ÿÿøOiüåSÓsÿ½¿ÿx[ÿÿl1¹ÿÿÃÿÿ\ ðÿ^ºÿÿ0Ÿÿÿ©=X« ýgÙÿÿùíÀ̳~ ùiô²³õlÞ ¼þÿÛ\ÿî¿o¯XÂuÀð[oúÿÿÇ ÿÿü¾û//ú, #ø1+ ü9 ‡@@@þZ„„û}\7þU„„þþZ„„þ ýwÿÿøˆ6kéöƒ úÄÿÿ8úÜÿÿ þÿÿ÷8åÿåûÿÿ8û¨ÿÿ þÿÿþ8únÿÿ½ûÿÿ8û¨ÿÿ þÿÿþ8úùÿÿXû#Y[&þ&88ý88ï#ÿÿ8-dE¨ÿÿ ú7eLþÿÿþ8ÏÞÿÿŽþ“‡þ— Gïÿÿ!©ÿÿ ÿÿ¯½ýÿϨÿÿ ¾æSžß*þÿÿþ8ÏÀÿÿ»Œÿ¸³ÿ”¹ÿÿ/ÿÿ ÿÿnAûÿµ¨ÿÿ ²ÿw+ÿ¾þÿÿþ8ΫÿÿÅ#üÿŠ…ÿý&´ÿÿ(ÿÿ ÿÿ8Øÿÿ'¨ÿÿ .ÿÿVÿÿ!þÿÿþ8οÿÿ˜Zÿÿ|wÿÿ\´ÿÿ(ÿÿ ÿÿ8°ÿÿQ¨ÿÿ ^ÿÿ¾¤¨ÿÿPþÿÿþ8ÓØÿÿjtÿÿroÿÿx´ÿÿ(ÿÿ ÿÿ8Œÿÿ^¨ÿÿ vÿÿwþ þÿÿþ8ÒüÿâQÿÿywÿÿU´ÿÿ(ÿÿ ÿÿ8”ÿÿ8¨ÿÿ YÿÿŠ þÿÿþ8Í„ÿÿEôÿˆ‡ÿö¨ÿÿ(ÿÿ ÿÿ8°ÿç ¨ÿÿ %ýÿÙ+þ&ÿÿøOiüåSÓsÿ½¿ÿx[ÿÿl1¹ÿÿÃÿÿ\ ðÿ^ºÿÿ0Ÿÿÿ©=X« ýgÙÿÿùíÀ̳~ ùiô²³õlÞ ¼þÿÛ\ÿî¿o¯XÂuÀð[oúÿÿÇ ÿÿü¾û//ú, #ø1+ ü9 ‡@@@þ*„ „þ[ú,­zZ„„þòUÿæ™LòÿÿvÍÿ²ö¬ÿÿ+Üÿÿ òYáðÿÿL´öwÿê ¨ÿÿ ý]x÷ðÿÿL#¶ ÷( ¨ÿÿ ý/"ûðÿÿLøR#Y[&þ&88ù¨ÿÿ û(a<þ 88ú JJü@cûðÿÿLìþ“‡þ— Gèÿÿ(¨ÿÿ æXähLÁõ¥7Ùÿÿ[Ûüÿä ÆÿöûðÿÿLìŒÿ¸³ÿ”¦ÿÿ(¨ÿÿ åõÿ<Bÿÿn‰ÿÿ­Eÿÿ|¬ÿî-ûðÿÿLë#üÿŠ…ÿý& ÿÿ(¨ÿÿ æðÿe ÿÿ„ÿÿDþÿÅ'þÿ½ûðÿÿLëZÿÿ|wÿÿ\ ÿÿ(¨ÿÿ ç"C+‡ÿÿ „ÿÿDüÿÌZÿÿ—ûðÿÿLëtÿÿroÿÿx ÿÿ(¨ÿÿ ç[ÎÇhÿÿ „ÿÿDüÿÌwÿÿ}ûðÿÿLëQÿÿywÿÿU ÿÿ(¨ÿÿ æ²ÿÕ$ÿÿ „ÿÿDüÿÌ`ÿÿšûóÿÿOëôÿˆ‡ÿö ÿÿ(¨ÿÿ æOÿÿ‚$ÿÿ „ÿÿDüÿÌ/ÿÿ¾þ"ÿÿþ|ìsÿ½¿ÿx­ÿÿ4ºÿÿ0åZÿÿËHÂÿÿº’ÿÿP þÿ×¶ÿóDýˆÜÿÿüð®$ìiô²³õlnöÿÿÈ{úÿÿÇ åÏÿÿÈ*ÑÿôTYïÿÿÕ¨ÿÿþ{Âÿü û//ø-7 ý#3 @@@þg„„þBþ*„ „þ[þU„„þùZ ‹ÿÿ€òUÿæ™LòÿÿvÍÿ²úÄÿÿ8ùHÿÿ€òYáðÿÿL´ûÿÿ8ûHÿÿ€ý]x÷ðÿÿL#¶ûÿÿ8ú'Hÿÿ€ý/"ûðÿÿLýR88úEIû#Y[&þ&88ý88î#ÿÿ8-dEǦÿÿ€ ûðÿÿLÒ%ÄÿÿdÁÿÿoþ“‡þ— Gïÿÿ!©ÿÿ ÿÿ¯½ýÿÏ’ÿÿ€ ûðÿÿLÓ^ÿÿÝtãÿˆŒÿ¸³ÿ”¹ÿÿ/ÿÿ ÿÿnAûÿµHÿÿ€ ûðÿÿLÓXÿÿV #üÿŠ…ÿý&´ÿÿ(ÿÿ ÿÿ8Øÿÿ'Hÿÿ€ ûðÿÿLûXÿÿpÛZÿÿ|wÿÿ\´ÿÿ(ÿÿ ÿÿ8°ÿÿQHÿÿ€ ûðÿÿLûXÿÿpÛtÿÿroÿÿx´ÿÿ(ÿÿ ÿÿ8Œÿÿ^Hÿÿ€ ûðÿÿLûXÿÿpÛQÿÿywÿÿU´ÿÿ(ÿÿ ÿÿ8”ÿÿ8Lÿÿ€ ûóÿÿOûXÿÿpÚôÿˆ‡ÿö¨ÿÿ(ÿÿ ÿÿ8°ÿç Âÿÿ«þ"ÿÿþ|ûgÿÿŽÛsÿ½¿ÿx[ÿÿl1¹ÿÿÃÿÿ\ ðÿ^ÞnÿðÃhýˆÜÿÿôð®$=áÿÿîŽùiô²³õlè ¼þÿÛ\ÿî¿o¯XÂuÀð[o "û//ú, #ø1+ ‚@@@„þ:ûÜÿÿ :û¨ÿÿ :û¨ÿÿ :û¨ÿÿ ú7eL2ò¨ÿÿ ¾æSžß*1ò¨ÿÿ ²ÿw+ÿ¾1ñ¨ÿÿ .ÿÿVÿÿ!0ñ¨ÿÿ ^ÿÿ¾¤¨ÿÿP0ö¨ÿÿ vÿÿwþ 0ö¨ÿÿ YÿÿŠ5ñ¨ÿÿ %ýÿÙ+0ñºÿÿ0Ÿÿÿ©=X« 0òúÿÿÇ ÿÿü¾9ü9 ´@@@@ [ [ [ [Ùl6Ÿ2 New Layer#1ÿ      nŸ2Ž&2>Ÿ2¶ÆÖæö € € € € € € € € € € € € € € € € € € € € € € € €Ïg 3³9 Examplesÿ     Jgimp-text-layer.(text "Examples") (font "FreeSerif Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 435.000000) (box-height 57.000000) (box-unit pixels) A³9aT`l³9‰×$4D@@@€þ%HHþ9,üBžîÿÿúúÑÈÝòÿÿþÌ.þAÿÿþ6ú*Œ÷ÿÌ.ýíÿÿþüü\ÿÌ/þàÿÿþüý¯Ì/þàÿÿþüù9ZÌ/þàÿÿþüù\ ˜û! ýþàÿÿþüý› þƒÔÔü«ÔÔó?iÔðÛÿþÙp þiÔÔ÷+Ÿäÿð­þàÿÿþüü%ø ýŽÿÿþŸê}ÿÞX¸ÿ®+ÏÿÿÍVÿÿûFÐîýÿÿü¸þàÿÿøüUÜÿ ýÈÿÿòì ™Ð hÿÿÀþuÿÿþ”ýíÿÿúàa$ìÿÿýÖ›þàÿÿþðÿÿþ ý+ùÿÿú‘Wì!þÿÿû+6ÿÿþÕþàÿÿþmþ¹ÿÿý½þàÿÿøü0Pœüÿ þ~ÿÿûþpðE÷^ÿÿñ0ÿÿþðþàÿÿþLþ’ÿÿþœþàÿÿþüüNÿ ýÑÿÿþz÷Jv( iÿÿþðþàÿÿþLþÿÿþœþàÿÿþüý¶ ý4üÿÿþœúO­õáÿÿþðþàÿÿþLþÿÿþœþàÿÿþüýo ý( þŠÿÿþBøeãÿÎO4ÿÿþðþàÿÿþLþÿÿþœþàÿÿþüý0}üñý§ýÿÿýÝ ÷ ÉÿÿÙ4ÿÿþðþàÿÿþLþÿÿþœþàÿÿþüýžæûqÝDüÿÿþŽþ®ÿÿûq4ÿÿþðþàÿÿþLþÿÿþœþàÿÿþüü\þ´ú=õ5‡ÿÿúý6ûÿÿû64ÿÿþðþàÿÿþLþÿÿþœýõÿÿýþò^üÿƒç‚ ëÿÿûÓ þÿÿû† ·ÿÿýóþèÿÿþQþ•ÿÿþ¢þfÿÿø‡ *\ÎÿÿùQÒÿ"þ…ÿÿüмÿÿûÓí’úÿÿû·`5ÿÿúÊÿÿûÚhìÿÿþøÿÿõ oóÿÿë^öÿÿüt>ÕÿÿûÔ7™ÿÿû™lþÿÿü™äÿÿþé"ü5Tû3XQ@@@™þ%HHþ 7ýHßÿÿþ08þ2ÿÿþ09þüÿÿþ09þüÿÿþ09þüÿÿþ0 ý ý þüÿÿþ0ýø$ùsÔÿÿÚAþKÔÔ÷L4Âúÿäþüÿÿþ0÷ŸâáÞè“ö-Àüèø×Ÿï4ýûðÿÿýú+ý;üÿÿöyçÀ²þÿÿÃþüÿÿç02ßÿ®¬ÿÏ 1ùÿayúÿ4ü µÿÿþ§þÍÿÿúó?–ÿÿþþüÿÿî0ÞÿÿDLÿÿ~Îÿêüÿ4 þiÿÿþÕþÀÿÿþ‹þ)ÿÿú÷üÿÿü0rÿÿó&ÿÿðþÿÿ9üé4 þBÿÿþëþÀÿÿþlþìÿÿûfüÿÿõ0ÜÿÿüÿÿôTýÿÿôo" þ@ÿÿþìþÀÿÿþlþÒÿÿû‰üÿÿù0üÿÿ÷ttþ|ÿÿýkÃÿÿüäj þ@ÿÿþìþÀÿÿþlþÃÿÿû«üÿÿý0(ÿÿþ®¨¨ü_SüÿÿýÕ% þ@ÿÿþìþÀÿÿþlþ½ÿÿû üÿÿý02ÿÿþ"ýGñÿÿýá þ@ÿÿþìþÀÿÿþlþÍÿÿû~üÿÿý0ÿÿþEüŒôÿÿþy þ@ÿÿþìþÀÿÿþlþáÿÿû[üÿÿü0ëÿÿþ€ý$iý¦ÿÿþº þ@ÿÿþìþÀÿÿþlþÿÿúîüÿÿü0žÿÿýãûB£ü$ûÿÿ¶ þEÿÿþñþÀÿÿúÍ~ÿÿú|ýÿÿû9÷ÿÿö® Yëjÿ¢û+ÿÿƒ þ}ÿÿþ*þÀÿÿóåº]‚üÿÿà Wÿÿú€küÿÿïúÍñ÷L@ÿüp‰ÿæý›ÿÿúøUÀÿÿôlqûÿÿü¡nÿÿú@äÿÿñ÷½9@ý¨çù³ÜÿÎ.þÀÿÿùlJD ú$UF öCL]4þÀÿÿþl9þÀÿÿþl9þÂÿÿþ“8ýïÿÿýÏ6ýGäÿÿýåw5þ((þí@@@@@@@@@@@@@@@@ [ [ [ [Ùl6,  New Layerÿ     , >®ºÆ, ^n~Žž€€€€–K%stem-1.7.1/docs/_static/label/east_of_the_sun.png0000664000175000017500000000630613157571677022552 0ustar atagaratagar00000000000000‰PNG  IHDR@6¶œ@ÂsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ %+˜iEtEXtCommentCreated with GIMPW !IDATxÚí{°UUÀ.÷‚‚`¢$Hjj¢â£µe´´t*sd0ÓÒ2@ >(P(aÆ243LKgTL‰ÒÈ|óRˆ•<ÁËKàôÇúöœï®³ö>ëœ{Î=×Ë÷›9sï^¯½Îw¾ý­÷·Á0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0ÚW;\Ægp£—ïl`{Júo–Q~Àà}àZþC`sà—Eæ¯T= Ãh§t~02Ëc€º”|õÀ`àMI°_Æ}¾(Æ4ÄÓê¾»€þ*•¿Rõ0 £²oÀÈ\™w¨¤Ï2~½•’.D“wï器Ž0+¥êaF;¢ƒú] ~Md9K¤·ô^J|w`6°F‹3®wFÔaq‘ëJÔÃ0ŒvL±^Vý)q{Ï{å†8NŒÍÀueÔ­XþJÕÃ0 3€Qð`1&¹ÃS­ºUº†a´Ã!p5x8(¾N}[Z`àbòW£_ÂÍ'n’ãÀ°@Ú½€›¥¸9ƽ{|×TÑ0Úçø²ˆž×€ˆ{gÅÇä¯T=p«Ý9`#p­>]Õ§§¤éõºWËpg Ãhpg™²+n+H{Ç?Ý;"ÏbÜYæE)rû nEØ0ŒÀ Þu·Èrz“~ ®=á ™ïI{0/?ÆTÑ0joWxׇE–sðân ¯ç¼ëCq§LB$Cู¿08·2ü®J{„©¢aÔÞÎö®Ïˆw¾-wˆ\JžÄ€\ÙJßµõ˜;·?ðPéEÝ‹ŸœJ~åx½©¢aÔž½É»ŠJ>W1 w 3 噞®ø©€Ëß»«+TõEâ‹å¯T=þHó'Ü ñ±À5¸cq(Ãû*ùUaÊ!Ünªgmƒ~8G¨Ú)è­À‘ÊÈõÀy}~ xølFy{zåéÏ ’f` N÷¶N ÄÿNÅË_©z€s©õ$éÞ³·Ó|³tþ/œ§€F`¼„/×3 £ÐMÐ5Þý“¼ü-¸Ì}"Ê;ç8` nNìyœUpN¶¦“¿à¶‰lI‰$"¥êá÷|/Ä9?x_ò½%F¹`è­?IúwpÇçö1u3ŒÚPW$¾ø<îôBOyð7à\à¿ ³a†a†a†a†a†a†a†a†a†a†a†a†ÑÖ…s u½ü wÎõmZï¥ãT°¬N8×öË×pgs£ðH[V=™ê»o¨ò÷ïܬ^’ßAË~Pu¥¸ç vð?ààÀËù1…ïP^‚;S}<…Ž;¶àΧ'<©òßezX1†Ëo«eÿT‘R†_æ-EÊ̪‡–ͱÒ#i’¹¨Rz7Spï Y!s?C‹Üÿ=uŸ•Ày^ü4QÊG¿ÕÎÓv÷Ò<-uŸ |¦D­ÊÛ„ó~^ tî[ª¼ÿz½‡Û½¹Àk¼áá˜enz§‡(Z¨î9ÊKÓ·N@†Ì’Olºjèq”Ü_ziVý÷^ëxJk>IÂŽWå¾®¯Ô–­ƒ2W{óI³Õüe9­e®HË»7¡}¾ {ØKÛ·@¾¤ä² ç:»(ô1¸ç o~̯gš?Ìy ˜^Hø‰íw±Ôa«îÞ£â†ãÞ‹œ>Q^gÜ«E“òNRá €‹TÜ3*ßLœÈRdnz§‡Ú~O•ÿ¶×±#º”fcå“®Òzœ)ôzX±JâV©°Mªwà›NWa'·@ñ.Sé“×Wö¡ÐÕ}5¯IýpÉü•?a>V)Z½—vFƽ{ÊCrÜ:_Zü¬z¦µÂÚak¯>– ›‹—E9·©rõïz‹´Ö¥p·*k’„/rìªzj»¤—³W`N0F榇qzˆ7ŠX§î;DõØæ«ž\H÷båSª[ªÇÑB? Hp„´0׫!ÆÆ€ ïÓÛ€‰¸Çþà!æ“÷b]§z@;h¾"Y Å‹18¯P¸0¤}·Èý÷&ö”½AõzÊ1€1iCtþ(RrÿÉ*ÿrÜ{Q:ÊÐòàõît¯,¤åO†û¼að…¸m4¥ÊÜô0^uYTù—°s½õ€PbåÓ9Vtî1tƒF ß™ës4p‡ {¶*4Ü{›¤ Û¡LÅÛèeêÞgSo‹jyçÊg¹ÌÁ¼Y>bd6{²ûC àòÛ"ÔPXÏYN–!Ñeè]G5šÈáÞ±¬‡4ú¥WÏŠžT†ÌMãõP—ÕW£îBOJxVbåÓ9VÝ"­¿æ:e§Kž E*t‘šJ>ãZ¨x~·wcQ<Ýt/áÞKa½qQ“òÞ©\Bx«Ê%Þ´É£-н©ª¬uÀÙž\­æ§ùcenz̓ª¬¹ùÆ,XL>-‘c«@Í—Èÿ·«<=2*ô˜"_®æÞ*Sñæ©¡Œæc5_VKÅ{U…­Ä{ï«Ê{«P?HsTxùM½É*noW 'ªrV©9«„)*~x ŒÌMË7€ƒ½Fã+0V>-‘c«À¾Ò¹M®?RyŽ’Iúí mõæ[Ž”ø—TØ.òûNȘKú‘ºGòæµýTØ•Þ÷)e‚4­¥¼·xÑKÍ©ÎIü4ùÏ „ëïv«„}èÕ³Áû=ê*h_ö”ÿgb ê¥>»TÜ2éÞ-:Q ɆቸªØ7#sÓÃ8=LêÜ1E–¸ÐFèXù”*ǪÀ>Þp¦‡×ÒŸ¡ôr Ó«ÔS4?7|ùåëÇq+zàv瀑꺬{Y¤¿½#nÿQ÷jMÈÉš#ñ½i¾‰¶g¤Bõ؃æBë(Üv¢_ŽÞ]†³ú•£+$ýY Ð$5×VÛÿ—(qwÕ›IÒÿ\†(ºñ¹Xz:Z‘¶I¹ 4_ÅíVD&çd>Ô(Y”ðãï(Co’¼‡¥Ä¿Fó­0”(sÓÃ8=<@Òí…Ÿæ[UºJÙþQ¸ùĦ«„§2Þ›„Îá6??ƒÛؼދ;Yò*“ªëqgD»Êƒ·IæY®•(É·÷¾Þ×dÂ\+Ö©Ò²4áÎö)RçFܦ֥¸­#KåºQò® |Ÿë"dá×ãÜÊ—.kŒLžë°Y^9½pï^+ ÷,î%ð1=ðî$Às2<[ †¦Q¥=DÊLœ‰Û@:]¾ç0iMýßuš7u‘^/Æ1ÀÛd>n:ÍO«œ/£ƒ&)¿¡ =<·¡>1d²/&sÓÃâz8Nt.™Š¸Gu†ºÈs­çG{Cíd%d„|bå¸gõØ0 Ã0 Ã0 Ã0Úÿ¬ƒÃh@IEND®B`‚stem-1.7.1/docs/_static/label/fedora.png0000664000175000017500000000256713157571677020652 0ustar atagaratagar00000000000000‰PNG  IHDRZ ’o¥sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ  .•’ ûtEXtCommentCreated with GIMPWÒIDAThÞí™h•eÇ?w׿ÚÔaf?`Ôüµ j­ecHPP‘ E?hý¡ÌˆH*(£?¤ÈR\!Òý¢ò¤)a™öCG’WËùkÎj‘VÛ®s:7מ§óÞ÷¾»÷F“÷ /Üçœç9ïyÎû<çùžçB‚ $H Á0 ˜Q à@ýšÜ¢ûøk,{°øqžA`ðô¸Ógi‘}ºxhwÞÕ<ÖWwsH M¿s€¹ÀÇ% t€KÏÆ@—9«z(bÌó%4ŽOÍc5¸NÙ˜ã_:KìãÈÙp–bÌ F~&œ¢4^ 4¨özàPHß©ÀE1ý™¤ œ×8`ºœ'…ââ}¹ø\ç}9º èæç°1X tÉ8ü¼T„Œ¹øè‘÷f7ñÀÑ9úaGYaJY`;°H¨¬e6?ó¥œCð É¿uFþkLFVù8@Dû2ñw0ÄæÓ2gÕ;òñçÈÞ'òsësÑ 8x¸Ï‘O7”¬B.…M pL˜†}OLf9ñxD{œ|àÌ( ¤a Mž4p‡¬ò[ä%ÐY¡O•ŽlIÄÞuŽìÔ(ø²Å ÓöVnUÜ: Ü/{°²#·#ÐÈv±×”û~3"ÝåȪcúÒ!+,#MyAÝ]@'ÊyÕ¨|¸FvBC1+ÃÕÀWFÖël›#ìt;ÛzJL_åÖ˜è®QÜéh¼mn4WçsSFñ°Þ¡U^I:OtŸÝ\gÇE•µo™öù¦}ADÿ8¨n7²-qT¨*J?Óò_ ˜±ëgNwGTQRoú4ùþ)ÇŸçcìTúeFÿ‚Òý,ŒCc¹±ÿ]Ž9ÖJ™­û¿¤vÒ§ù×½M þÅÿ«1rùB¡BöšvI/R%j¬4ýÛ€»Ï€ÃR0h}‡G)Ã_ƒ`Ÿú¸UŠßvrh¥ÃÃOªj±É‰ÑNÎÜ›¯ùjÝàÞ ¤<äàécy»øÅŒ4Æ3Ÿq>Ðf)t2ʇ¯Vàiç’¨Z8î°\­’CoXîZÎs.•þÎ1ç¶_›œB+£XT«Ñµå©]¿¦„u\-+y³;&HŽž*Ò^•Ó»„Ùäó'@%p¥påýR€+Á¯åÌ_mßÊÂÒs¯Ž¿5„]%H A‚ÿþÄó„‚XîIEND®B`‚stem-1.7.1/docs/_static/label/over_the_river.png0000664000175000017500000001025013157571677022420 0ustar atagaratagar00000000000000‰PNG  IHDR^8µñésRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÞ ^hÊntEXtCommentCreated with GIMPWIDATxÚíw”ÕÅÇ?»ÀBbÁÅÞ ¶¨5š“5Ec‹‰½7°÷Øö5A‰=Æ^lG±a9,ˆ("eY^þ˜û;{ß¼ù½÷û½÷ÛWà~Ïyg÷7½Ü¹3sçÎ\0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒ€£€o\̯øØ[Âï-ßíEâ|œ­òXxø8.a¹V^~¤hÓ¨',œ!uš&í9x8 XØ^ê×µêU} f`X€9½,gàý@œa’žÆ‹Ê°nвm”ÓÌ"Zc+`Š0§?=Å}Yàx`ºW¿Fb¼•ЇÁÐÐè`NCKÄ 1ë^pm^˜}S”«KL3‹4j‰бþ!&Ì@àãe¼•ЇÁÐ+Ý­ÿ™%âϸ…Òy¯Äw1´gPÏöï§¡@_ùÿɘ0Ý€¹ X¿JèÃ`hhÆÛ™8DÄß§oYÓ§ÂÎêÿ~E½ \߀õ3ú0,ÒH»?4§ÊÕYiÔ úpðA [‘°qrÒ®FÎâ¹âÌIÈôzç„ÑŒN™_iìÜ|ÌÂi< ì¥Â\NX£ãPazÃpÚ?ŸçVÀ ç©ÿwÃil_DäÐ Ì/³n§‰¸"T¯nR/pb¦ MŒiÓ%ÌÕjÃ$¥€¥s€×qÚmÒÆ7«—Ùú í´I¹u™0vah¤ïàé. ŒõÂ|%à‚„åÊ"à.ñŸ l,ÌòRï& úé‰Sï 1¡;Êì—§cÒ{ø-Д 4uûE ¯£gaw`tÀ€WŽAâ~îÐsp¾ÙCʆKÙ·RqæJ[”ÓK Ï—Iü`Oœj¤1^CUïP`¹"¿¡ os‚õamŠ>¿¸™E7Ç0Éþ^Ü]Ľk ÝO€cqÚgx~ €UËè—]ˆ×™Îc(&‚HS·È™ÀÎ 0äÛâmç•c%i‡5RÐÇï%N§N×-¦ý?-³oSn½½¼7“Õ¯1^CÕo9¿´+é!ÆÕä­FJ Ì,ÒØÌó?¥Èäq‘º]¨ü–)²BL‹K´ý§À¸åÔÍOûyg˜¬$_–†ÆK^¼»=ÿ“d圔>–1Aä÷O/îTå7µÌºê4Bêzwã5d‰R2Çk€ÇJ¬ÄŽª° û{ßÏz üÛ*¥á3b­*·ÀóÛ¤H:Ÿ•È·w™í4˜\ôˆ 3x wÁâîŒëö´úÿbù…p!ð_õý;` œÆÀA3,…£É× ÿÈó?'÷ œ\f][”Û¿€õ«„!cL×PíoVZ ÅÒý°È %i¹²Hc‚ç? øZýZÕojŠt³Ö¦Xx ÄÊwN–ZIÝÊ-wù9´8b[™<º¦h£·(”¡C9u Éäg×ÊŠÛ`ÈÍuP†þÞ÷Ì¥±¢÷} ùòì^êׯ†í5Øw ú¾˜É®ù·«Y·NË@ã¯ò÷`àVâ5.Bä}·tB?žHáe ŸGÈ ûc†…ñv ÜZ¤ák¬P'}´ §õoã6½uàc»ÖívYuGX_ÄR¿FXIßè„~|ØšðÅ^8µ¹=]&Æ;Íûî]£4¦x߃ëˆñ^XÄÿÜáâŠìª]·iÀ½žÛ]89ñ—)ÓúÚûþy'õãX »;NOØÇ©Æ. ã}Çû^©Fi¼â}¯ ¬¶Ú¢†µ€Ÿñ_` Sj\·ë¼ï¥"ˆ$í}oŠ{þ2Ë~œ‰SQ‹nn*»ŒI^ ã}Ðûâ}‡M—NHãÎ@˜³nkc(O·œœr¥÷dë6xM}ŒÓ¸H‹¢„ë kä ¡PU-I]{¿öüÁFšß»0tBÏBKÀ J= RÆ?\ù÷¤ðºéþjåúv þòeyY¤N Êwî†Ô¸‹Ó€}$|·@ø#JÔýˆ”ýr¶Š»[ ‘D®-0Ù¤©[¨Ü'”ASû«ø'Å„)Eàäü0ÏÐq#mœ&Ë+8Õµ´ý˜Ã=ÒÓ3P¾è9ÎŒE²FÙª†nDÅmÓQ¨Æ•“tôjd“@˜;ÛÇY^˜/p§ßÇV™š‚³0‘e}çˆWÓš‡ÓCV^ûÂܧê¿SÀÿ.’]ñ 1Þ6 þKªÉ¥Mòõ‘¦n[ü(ƒ®zàT¶~("ÂHBú pÜïqg¤­+Ê}4°¡¸uÎ÷p—p †Ìp …Ö üßgtýý: ÷÷E„MÍ\ˆ»¡vÊ"Fc›àlÇ•2-ùW«§“ÿ0Ò|Üõñiä%­F¿WAÃÕCqÖœý«õâCúŠBóV£TüçTüÛêŒ63m¤ùÀHòM­ Ÿ ü­Ž u/òŸùk©Ò\Ù#œÈheàQqÿ–·ZéxôgQDkBÆ;g¦'z¤ÈïÓ®Àa@»„¯V¿WYÖ¥Vããh‘õö&=™^ˆîí’z£ÍL=ùî(ËÐñèÎþuºŠš  jVs‘|Ö ÿÉC+¥ƒÏ\Dïô„Œ÷²„}zƒ„¯V¿W YÔ¥–㣯,H¢¼¶öüQ~/â?¬Y‡´Y1Ö•n8­H¸Ëéx¢p¹:"ÌÁ¸—ªr5"¬bù4«­R†rïÆ ÛzKc¼u;>îWy ÷ü†(¿Þn»…ÖGÆ{­Ê¤˜-«íU¸s•ÛlòÍgŸ†{K6z×÷%5ó]…“OĽ üGñ[ gÜQÂÒ8Ý­¸ç(ã ÈŽD%·k™QÛDvÔ?fvŽ+c¹ƒ#z"1²3Öx>§Ú²÷8úàIû5œ%áf)ûã^ÚëH~mÒö? ¤;÷Ôc+îm㡸gFK÷ Ä›÷ÛºF0“ö{š¶êŠ“ÇÞÄY†>‹ ÉÊv Åå…;âdšãpïHë'BG–IÃõ8>ö ÿ=í&o§¢e½ÇzâßüU©~H®\Ú¬úáóž%AhKp¤rׯûI#·àÌj¿%a¶P[ð8S,Ñì¦ßþ}w@½¥ZãÓd_ ìMü#àIʘ6ÿuÈ·Ž¡gLœZ·åæ¼€¨d¸š8´Lût ‘ÛÃ^š}poþæ€ ÄmÊ?ÀH²JKÓïIÚªY1Öc<Ùå8£Ýekò&S}•ûFò‹¾/-³.õ:>z3TÚ›+÷7È·jò’Š÷ù&«’ôCšpYÓf*´©ATªñ¢Â|é1‘ï¡Ff‚vU[¿ÓT'E+˜Hîó`€r8ëëÈ Q!aµ©ÆŽòõím%-c’ü›p'·/Ña‚fùe®u[N–ð“•[ddV íV:lüEe˜á¥y¦ ¯KΨãMÒïIÚêPå­ªW¤Ð¬Q¨lqÛÖñâö£ÐK“ùM¬ .õ8>þ˜Xö–t{)>´@VÛ}2ߤý4\Ö´™ ³+„®ª0“<¿ ”ßâv¯ÚvŽU+ Ÿ 'aNFƒ1Í@HZÆbùÏÇYGÖ‡ ·Ëj(i™kÙ–'Ȫælµ}m»Ò´k´Jj÷ÄÓ«Àx§'̯T[QuhR“kÄ(_/#ß9~œ8H[—z;oõY}FŒq„'nØO¶ýåôCÒpYÓf*ŒW™w)n)U˜W=¿Ud¦Ê‰ ©Ÿ·åœ£f³‘òûDföñû³ ¬¤e,•ÿr8«z’Z"E™kÝ–ë7ãÔá~¨ñ¶ÅLìõÈx§§\œøŒ2M¾#ÕdÝ,¿vqS‡Œ·’ñð–É*íÝ=ºþ•'Ê|”»Iû!i¸¬i3nP™¬^$Üæ*ÜßþϨŽ.uÿ€)GX]­oÒ2&ÉW ­§©k­Ú²;Î(et!®½Ò´kk`¥Ô¨Œ×£Ì¬€ñ®E‡Ã-pjVQ¸ƒêñV2>" WiL%ßÂvÜtD÷/VÐIÃeM›©°¶ši/îtµ xþ‰|K¿ÚèäûÊoç:e¼I˘4ÿk<æ»GŠºÖª-õ$¼xFŒ÷=µ£jnPÆûºøÏõÜôV¨ió]g4´UVoÇ‘ê_/Œ·’ña3•Æd 5V®RþÇWÐIÃeM›© ™?Œ‘Gö¦ã¤÷à"«¥©æÏï|U‘1t\¡í/‚ù>2Þhk>[¾7%ÿFYÂJZÆÐ*˜9{à®[G~ßà.¢$ìµjK}cgœŠÑ¼ ïÊ}ÕÀ¶/ qëË*3ªÈxµ¶Idxåv„¸Íðè°ÅkSÍPWÇYKž/íÒ”Q]êm|øøHÒ¸(à7X­xTÐIÃeI›e¡I˜o»È]ú)¿å…@æ©ÇáÊ‘E_`‚ªL»È†fãÔ7ÀéTFþ?R¨o—DN“Ä#ä«lͦãäX«÷ôLYÆ6öV¶ú–ͺä´E§¿ºls¼Ù¶–m9ÞŒ£€O•ÛѸC¾œZQ´ÈO›××BWT„½Kq×fK&,ß@ò•íCƒ½GÊ~OÒV]€§%Ì!âv˜|?¥ÎFSi]€Ó Õ×j÷2ŽBôÑü^9+H[—z>Γø«Åø@¾JY9ý4\–´Y±ØáFY©Â=’3Vd3«$ŒÿBŒß²¸þo¥³^~©ÑH¯ÂOâT²’`[!ä6‰7HÉI£ß©J\ýIQÆîðV¤9*f–Ž´ž¸ÕC[n+&ß×áÔ|âü\Úïk/í›<E´sÒØB¶Ñ­À=ÀQ¸Ç…^“C”sÈ ‡«ÕRô{w£R3Ý4ýž¦­ºK9'àtO'È·Þ!’¾ˆ{Y[ê}'îZþ^t¼åñV ãÕWÌË¡áz!¬U„®‘rSâ¢T?¤ —m †Áâ¸K ­2QE¿èh–5‘Á`0d‹Wdê_±^ w‰æSk¢ÆBWkƒ¡îÑ'Síæ¹¯‡“‘µ&j,4Y uµqrß-q2Ó92v§á®zΚÈ`0 †"ø?áI¡eD±D7IEND®B`‚stem-1.7.1/docs/_static/label/ubuntu.png0000664000175000017500000000214613157571677020725 0ustar atagaratagar00000000000000‰PNG  IHDRd ä+Ý.sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ-Mè8OtEXtCommentCreated with GIMPWÁIDAThÞí™IlQÇ}E ¥5—ZE æ †ˆØhĆH, ‰ CZjC,,ˆHl,DXHL!±@R1©’(©©ZCQSMU:xï<¹ŽûÞ÷¥ïkßÓ÷ý“—ô|çÞÓsϹ÷ÜsÎ>|øðáÇÞ#äº[”ô ;ÂØóÂnáݪ}ÓGÆ\àP-¿*`?°PÍ›j±õÀ ˜ܳÈ[ä›Ü–XŒ÷èî0/¨~ƒ¯ð³ :$œòZBp×,üR ÆAF9pEÆ>W¼: ² nÞmÀ £×‚Û¶ðk\Êy|À ¶1gä›[òèy_IÖ'‡%Jh‡4½^ bìA@—(üé@ÙÒ—S<°Lîž·À;à1P`Ùy«%SÓ¿þÂÏÀ_ª²AÛ˜<¹öÀ3à+pj9ç€nêûnC^ŽGúþA¦%Ë:ãÒÀSx”Ì2à°(V¼ã@cn*°É¢W¶±¡fMŠ¿Né0Ã2f9pVœ 3Áçê´Œ eó˜ãŽÈ÷B §‡ú¶ªC®'³ƒ8Çä¯Uó³¢,0Œb ¼¯Æ¼ÖË®,'$𶵨Rø˜ôGÈÚc$õÀNÅߤô72?»óUÑ€]Rk=.+þ˜f®/&}ãá&E©o½Ù­ G…¢ËÝ'^g¼ñø ¾ ƒ:uOùŸc˜ÿQÑC’µPm½KÒ\ÊÉ^Ä G­C¼OJ‡ü´ô¢²\Ê(uEs‘aÉf’Þ!Ýß…ŒÎRå>‰AîlÒ:䮢{Sd¬”‹ùZ3uè+ÿ'Œ›@‰Aÿ°ÜOé b?³ˆé…¾Ú!Û-NÉ’qd¥íá6îç(zž!?¬áïq£%Ebü=W*i§¤ -Š1mt{‹ŒJKK`°Õc}ÿºªT%y'‹ z”Z|"ôP-E W·áý-c±ê‚@°!‚Œ¥O­´-Ή®åŠ_-sÂïø÷Eô˜±!S Ú)‹-Ux¥Œí硾ÿ '¡G˜5±QŒn=,vq"H[¥¡÷û+2÷dfAi.Ns ‡,Æ8!rÏH†øT½Ð›Ei"6`ž¾j„Iÿƒj{tNJF¶Ç%`´Wú:?éÀ 39²°GbÀ2‰—N˜%Jë#:YÚ ·W.ÃÝ(`¬lŠà¥|Ÿ$aâ}+Ý]e[j¨DÔׇ>|$~¥ÈvýæNoÍIEND®B`‚stem-1.7.1/docs/_static/label/to_russia_with_love.png0000664000175000017500000000757513157571677023506 0ustar atagaratagar00000000000000‰PNG  IHDR¾6y—#(sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ 4ÿY`tEXtCommentCreated with GIMPWØIDATxÚíy”TŇ?¦afd›™ ‚lƒŠ¨ (*·(P£(.‰ž5â‚dA£‰Çq‰Æ%*b1‰»Á PQpÜよ[P@@p€™üQ·Î»]S¯ûuÏLO÷œ÷;ç™~U¯º^Õ­[÷Þº÷6Ĉ#FŒ1bĈ#FŒ1bÄ(<´ŠP§ °¿\:à#àà`ƒÔ+•ž¶æßÊÿ;ç»wËZÀxîòÞ.þ¼«>÷z…ÔÔÆ¤š;ôf ¡×È\ŒnÞª§„€o—ºåÀ0`¥|Ö×þªýWÕýõ@»0fÇOÛ<ï^'/ðcç¹áÀãÀfUw›Œm"&ÅÜágÂÉë€Bì.ÀåÀwÎä–Kù „ßÕSvz½0 ‘åógyÞo#P‘æ¹Ja&µ@˜ s‹I΄]˜¦þ0`»‡ðqº_#‹!_ðgéש Ø-]ŸñÙYÀc2Ì-Fx¶æ¢ÏÉ‚ð¦ÿN˳1¨m á—{ÿÙˆÏþx:&ÅÜ¡#ð¹3Y7gðü‹~>â  Jõ·9JLø¹‘e-®º;åeÐÖÅ¢4:‹…)[ôH£@¼ì,Ü|D Ð(U÷*€âúÅ@o±µÉð»v±-×s•S¬öp©² ÛîL€ã_¼ç¹ð´W<|| | |üMMüðöFH;”…©V¬I}=œ~“çý?SíõnfŽ¿Ÿô}»ŒÁ`‰ŒO•¼ƒ^vœ×ËÕûüèòýûÓE¯Vë„)Ü Ü ®¡ÎUÞaÏDmi„v}„Ÿ.ð|ß÷g)‚*÷ZOʽÅjò†Ên£Û;˜97Øê!èvÎw] ¬uê="÷¯:5#á Þá\Ù©»`ÌËÖtz"újܬ9t3ÛŸ…"ÞjüZé7Ke±µîÄož—Å\åŽö¼ÔçMDøÈ–»%á ǰeÇ„(àרûï;í} üF&·§p!]>ÖÓߥN|‘ñIk<õoq´úÎWº—;}ºS•ë0_9ú_ÃTÊe‘e3Wy#ãð”­mÂï­I³£\êˆ ÕÿËe9É·N“…(6 ÑÏuʈZ¦Fg`ˆS~­³ «ÿ(œÞbŽóì‘êÿsOóF…-®ÃœólÍr®ò†ð}® m›±_«ÿwˆœj±Á!ŠBÚXé|^âï %Â1µõl¬Ò¥6ÈbXâ!îÎνÍi»[ F°!Åç]>8W9Gkùû®§¬¹´òb’ýVjDd±(õ(}s#´ëú»´*Â_,P¢`;à6[&`?Võ¾öUJ*ÀNžÝBc¾Œ%ª>)>5á\åŒðß ÙbKd;Ë%úìŸR æp+mfÝDËB‘èF· Ñ&n}p Æ÷g¹âºÏË•N1f˜,ˆ0<,úñ%D̲X¬öl sµÆ£õl`›©°Ö‡(·>Ÿ>¾ë5ç™óò+#(›¥Ü–x¬L/F|v–˜ ]Gà?å^Ÿ:b‹µœÙÉE²rž[ïì€Ú]eÝÿdç¹s8Wy#ãƒñ*ô v®±Âs¯’ÂÂVŒÉ4Ñq÷1˜)öŒ§FEŒD4ºs ¹ 8P9¬_ÖpŒýýD‘Æx‰ZƒÇHŒ[EAÏU‘Ã]æù¶w ™záQ¢Ü-ùðY>t>ïá™¶BÄ©{}1‡QˆeeÆïÿ‘ ̓ÀÁêþ=Žrœ‹y˜X‹;äï‰Ò.vú–4WëÙº¢hâ ‘Cke"ê€1Eºg ¾ãö£06å¦uÎRe{g8–7yÆrHšgÆbδÙïǾžú·ª¶Ÿ¦Sã|§^©D0b›ÄØUùÏf®ò7y^$Õ¤—aN w8ÄVê‘s‡(yÒõã?J=Û㗮˧*‚HgÊÖÛ_q*]ÿb§Ÿ×8å3=ï2éóW¹ÿ Ùò3AŒ{q#7‡T/à L,á×)ñBcÕöŸ¤Zç;'HÝö½uÙ·J9=PÝ_'œ»³¼G{U§!s•·FòIçZQ–ö–‰«±ænYUÔ*:ÝÃñþ(e?ð”]ç<‰gÇØ†9 Ù ƒ=B ¾õô„åÑdöZíáLgzúõ‰ÔÍ&^`wŒk·no†ì¢%Ò¿JaëC†%üíí:q£”­"ryÉóï߈èâŽÓ ²Øî Qœëœñ:Æm¢u–s•÷è æ²uÔ$²œ|³(Q.Q\–bð¶{¸’½n÷LúNjŒÃ”Ý=Fx¶w{Í“:¯‡”C²ºT¸Uµêë’íÛ™¢ætµÊ3v×ûRGÈx?*õ¶ψ`-6úðéÔwßx8DÊÝ@£I{ü__ÿÊb®òQå¸î2ùûa‚Ä×ÉàÎöXš¢•Â%7`Wªs°èÞ”wm ´q¢·\5bqYŽ9u sáè*"ÂËò¹§ÌC…<·¿;ø`©ûš¤ÏA¢ /PÖ§Žg¼KSˆ5.†*æÒ\sÕ¤„£å£  w‰,” `?Q–­ån ÉŽn1bžS:H*†8P‰ªÇÆÃ£Ð¹½%æéD¶-bðh]ŒBÇ4’}ñw÷ˆ:ƒ1>þ«¨ðLj‘7H`Ðæ˜&7ˆòü!Ædºs>ò½BÙX¹áC!î Œ=~ -Ï 6FŒ1bĈ£¥"¿?ÉÞŠé°— ÎÂïÐdýE¾¥ki3ŒÙ¾ÀxŒÊ„¶u æÕÅd™›s=e;€?`¬,ãÕ.œgÒ7wœo#u”VÔyø'õ]³ §8DMÂøÈl$0]!²höàT(£¾¿Ïƒ˜#ò› òßÌÃï®Û”xRõiŸ¶U†ñ Òïy¨sø É‘qÏ‘œ §+ð6æÐ©S„¾HrF„r‚Ô%u˜“ÙLÐcåÑý^˜C‹1œœ‰ñØÔ&Ú§^{ßÝOô<2a(!9÷ŽöþG²ÛtûŽÃo rÜ4ÆN?‡pÜ…|©Ãç(®›ªo0~U‡:÷§4€ð‘ªçéìB æ¢ ê¶&R?í„2lÛ‡­„›Ð4tÇ8”å 7bܳ{Ñ8zK…ëZœì”?£þJrJ¹øiú¶«ì,M‘2fÉÁñk ð[gP÷¢çx_ñﶨÄ87a<ú³?nXyK>÷q&Å:_uNY(¢ÁŒ4eú;ÊEÌØâpï!Ë7¨ŸÇ& +YÿTà/ªìHŒ'gÙ‡c\”­èbciÃúÖ ãÙica­´PÚuÑ ô ð ™…-fŠ0ºèEýå•2ž{Éç*Ñ!ì‰òŒÛö\‚”*M†0QÇ¢]‹Iz½ü?‘h®¯_‡ˆ:‡“°3&0^û¼ï,òìcêÞy~<&Àd&?Í*Y(éÊŽÅÚ ÎÀx4Ž–q˜#‹æ!³kt#ˆq¨%Ù]à-L°±˜¦úÖ·s…@´¸ô¨Yµ¨ós’SÅD´ìÑ:áî°õÓÑÅ’}ûga\¬wÅ?­~$ŸgË£ÀJr镎ðo&ðøÓ[·›·1*á·±f‘’ïVõg:„ÁÖYÂï,œPç{&'U™æÎš¸Š ~»ÊÆ ¥ê\q,_¡~ÞÊ¡˜@½06 qtpúåë›¶Öhå9LÆŸ‚9­=‡ðØåÆ ü(t¡•扪ÞÙbDA (u¢ÛØÝ¬NC³~%ÏÇMem‡lÏQ ÿ ’#·&z¸é³ÂïçLìO ¢ƒ.PºÈIiÊ”Á5¨­ÚÖ¹?âXê ÒV¤|€ Xüe‡ œAýD¬SHøý”Þdï=ÕÈ„•.vRó_¥$„ibÍ ¾s”ñì½Þ¥ÜfŠC™µÌµQ}÷Á´7äsÓÈ,u·Å\˜Rá¦KE®ž–¦,•>“%x²p «GT3©Õ †ˆ,»—,xHõ)×ãM4w[ëZsÐEµÌ%葘Ô+ÛD–×;FËøÜ£î l.Â×yd¾ Ôî¶9VäX«„=…½ø3Ù.mjÄ=DnŸ¦,VŠ2ö¦(õŸf1^Ujëo…9Ò"×Sa|'ˆÐx 1¤ŒÊ.î%Èyz¾è —Ï]w&¿«\3›‹ðW„pÒ:Q°Ž ¹’UèÆdØF±ì{cŬÕâ*‘oÃÊÚ¥°cOŽS"Üú¥,ÇL§0 į9¢5m–aŠ #1[™ÐÅ'¢Ø‚Iy~¼2eîX¢¾r®ê¦$üDŠ-}²%—9¶g¤có³hÿieγ¶ëþJÖ´û½§ß çY‰I«q„Èœ i+¬,,CÜáÀD”‡Sa:AžÿS?Ð]‹zOdùvÎséS_Žùé w² ‹Iêÿ©Š½¥vƒ“ZîNšSõ†~’OL݈œÕJû¬¶p«\]+f¨0tuLiÚD5†à ¤T8e1ɇ=#1Ñþ·;ŠU‘ô+¡dþeÂ¥W¥)ƒä¤öÎNp¼(w“‘/*‘UüÊ}žò0öõ÷©Ÿïß×7‹åêÿSßü‚Šï}¯cš>ïBòÁ˜›jf&j«&ÁV¦tñ &7Ñ6mõ;Ù$[{bR*¥ÿVêŸõ4 n Èë¢ÓÑM¥þ‘ûE‰§ËKlƤ°H…‹~°Ì^›…£¶UÊ­.]ý%eýY®,5ëÄdX%ļLÞã!ŒÏÏ!b/+CL“:Ük²Í.vîõ'È¢¶‰Ì².“­>Lw¹[ކ¯oíw_¢úseÈ3oˆ5L'ßÚšb¾F«vu®¢é²#½­îorm&t1ÞÙå-v«™ÎU4;K£G“)6åj“ƒïë!òdB§ÒÙ©Je‡Ø×Y¨©ÊÒa?GY/•Ó!˱Je4èœå¸¸?Z(tQ‘ÆR.ºU¾ÿTkŒ1bÄÈ9þÀÊëIEND®B`‚stem-1.7.1/docs/_static/label/tortoise_and_the_hare.png0000664000175000017500000000724613157571677023742 0ustar atagaratagar00000000000000‰PNG  IHDR6úvM:sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ  „×¶tEXtCommentCreated with GIMPWIDATxÚíy”TŇ¿a`Q"BÆà¾E% ÑFÔˆ7NŒ¢ qIB4¨q1ÑÈQs\â‚ÆT\Ð(F1¨DEc0 bÔ€`TE$“?î}§o×¼×ý^wOwOOýÎy§û½ªWË}U·ªnݺ<<<<<<<<<<<<<<<<<<<<<<<<<<ÊUÀ@`@žé4/´SÆ¥ßzàé˜inœlüXTtkuôˆÀþÀmÀ§@sÈõ?`ð"°Xç•vN¿Û•ñ†ÑïKà>à¢iÎ6ï¯6­@ºµ‡:zdÁ~f¸ ÀUÀÚ b:€G€ÆßA¿¡ ÓÙ:$£J\·B£5êèÑF;Ý'NCXŸåã*ˆé\¦u•ãûµÀWý¾Vº&ÅÛN[—¸n­B×ѣ⽄Là¡ `:ÀÆtÌUýþ›c:{ÏG”IÝ BÖѣ™NOà»æþ˜6Îtv>3u.¦SŽuóð(Ø’*)~œbîkE¦³°UïoGfå>À, {üvµ@=ÐÙ<ëÔ n­M÷|‘4ý-¾¾»·Ý™ÎŸ€)ïþqÍzk¼—œ°3Žs;ð>ðoà]à#à:ÓÁ¢òiÔ8×Kµ‘’úYÀ´h¾oÒûf‘g:ã"êµ³‰3Dë³^éò°Piö™Ö+—º‹î™êXˆôìÌ@v[¿–!;´³€k€Iæê»~ù2ÚȧdHã¨Æþ¨:!»_ÍÀx3ãÚÅ4ªõYð€>{ èªÏ‡œ|NfŸëB:œwÎ>vâÝ«ÏÏz™éTcBè·¯†ïlêu‚Òm+`¢ÚЬ 'iÝŠI÷luÌ7}€_9ÖÛʨ»×¾Ã8Þwýòc:ÝTØ÷Ž>Ÿ’%gœtæ…Ä9OGèj½¯ÑÑ5xg¸‰Ûhž_`ž¿åä³ø•–·¯ŽØ6üÌr¼íÄ)µL§-wÁ‚ùªÞ¯ yïjÃt’Ô­tÏTÇ|Ó?ÀaZ¿0aÝtÖc™Yw]ªz” ÓiéHq˜ÎBÞipâÌNwF'¿‡ ä”'u_tÞ¹ÜÉãÏNø­m€é„¥³/PgFïfÒ…ùhøŠ˜N©è¾*ÓÉ'ý»œ°λš°tFçQF‚ä À0à0ý°b¦ûð¦óì$ó°.î4ÏNuò]eεsD¾Kû…!ŶŠZí(–Ægšek“2¢… Óm tO’þNXS†ûÞ@ÏÊ‹é¼<¬LãÇ Ò¾Î¹?Þt1À4Ój€~&î×:¯×'­!1˰ѹoË£ÚJ`®¹ß˜¬K£Su™ú.°&Ašm•î™Òÿ»¶I–ûž ÆŸ<3î=ˆ°¸›Þo¢iŒv¦½ýld§boD8`šùÿE;ý^“u6ciµ-r`ò4àP`q‚ô*‘î÷cͽÝú¯FÔ,CÎz”1Óx2bš=X×ËAÃ\£ëëS%VµÆ{Ù<ï’Þx¹Û:ßw–P.¦+³¾Ï0ó È)ö½ÿÄÌ·é>¸8YïGSu7ØÌÄ2kò(ƒå•‹gCF‡Þˆî»uy£s?8¸Éy6Ú hGßád¥9&Ó„ìV¹K©ít•H÷fDyu"( ¼¡3 éçcàpÒeŠeÌt^.už]¡`…óüMGÑQJ»Û‰×DËž}ÚÑ,ç<í™P(Ö¡tèMÝëÄÛ/AÞ•L÷×tÖó¢Tø„2 z]r=è»Ûa:.Ž~Šè„áÆ5÷ç!ñuîODô9\ì¯a­«Äøí"|ƒ«U¶’éôA„óVw¹Î’&›gëÖ­\è^HL@d[ƒuÆs²Íþ˜Îîü’ªL˜NgÒ…lAx¦³;£*YÂp?b2#Š ¸Q³l)Ýjàh}X)¬ÍЩÂîÃ:Ó{Î} çr2ðÛ´ìáÈ ™Im†ε¤d^ ô·*C=ªIWÒ p‹ù??aÝJA÷ª,ïä“þ®ÀD]êo‹È¸¶ÐúlFËÝ+âdÂUįІˆ~¸ݼêÄ;,ËhÞLºð8 §éHíZ.œ¯Kµ¤ Qõ!¥ú\÷FZMKÍè!àè:¿§qãÚx©Ή ß9¤ÎœuTúEKEÌ€á/$Ë}©@Kü,Ò1\©aËHWî‹[·bÓ=ªŽ…Hÿ–ˆï`¯Oä ä¶™â‘'Æêº>Û‡ú*Kx¿ y Ô)mœéù0ÒµF›µÑÏ"¥…ÛHº:»½æhœ—"Â?qÊÚY×÷kM§~–ø:)ãH7u}™!l¹¦u:éZÇöZ€(ïMÕøëtiMy•–ŠqIêV,ºgªã’¤vŒoa¯»< ¨\KømÔÌ¡9ïu@‘¦Ä]{A刭‘-õ}• ¯Ë¦êÔ­t/4º¿ËÂ䣛zþ܉G¥¡N™æi:s["§ŒØþ®33Ìë=é<<šäŠL´ŒÓŽ6”°ìBÔòÊv«‘Cx×!V7êŒ)°Õ2P;OÎIˆ¡)ë§úD…=xöb̪.A>"ÞÜ%Äň5½#_«Ìê§1?£ÏnC0÷ïn¶6Wš@º…Âá!áÖ Ü¡ h§å[v6Àt®"ef À£úÌÚ/Mºõ¸ñ¦ÑOÒ8“Mœ½rÌç‡él¡³iŽŒdž¹ŸAÊìh0Ch&ó.Qv k j“÷Î’Ï V·"Ýüù&n ÿ”ÔAÅkÈt2ÑÐ2)ÈÑÑN'·&aLç&RÞDƒkÃt’Ð2N;ʧìE–é$ÅÄ–o°4Ãù?ŽÔ©&ÏV&²› /m¥|‚ÙO-²›3Fé1ÙÂE§ßëÿÀŸvàÈn?¢wѪ̒%ðº`ØíèÈ9Ü ³±Ùf9sþ~‹”[ç×Hùм¾Ý$Ä«íˆåI“(æÜÙ¹ò¡e¶vTȲ{A¦“{’2¡i×Ë« ÃÛÑ»`:Ó Ä“ek僮囵±ß¬Ë«suF°“‰;V™SG§Á/ Iw°‹6âÙ:šg«c\7j¼À3®¤ôª©}X/µyÒ$ w#^I-Î"]Ð+-ÃÚQ!ËîQ†Lgóÿˈ†Ü§Äù¼Ø¾U;Õ@ÄóÀ%ˆÎ‘ò> Üa:dÞÉ[ªBÏyÚqîȳžV pY ÛL>4É…¢e)ÊîQD¦³$d”Ä™B/)q>5:ÚÎU&3ZgãÞ˜¸½téÕÀC:•ÿ§ŽÔù*¹­ˆ`@ÅF®4É…¤e±ËîÑ 2ê Óܹ¤ta¬Ba° ²–ø[ðQåî™g>ç"»VK/¥ÃAgµ¦õ )o‡8ôêC´Vs£‘L/з²Î ë 0pX&A®4É…¤e±ËîQ`¦ÓŸt–CBFæ õÿîú[Ej×ä³L°Ìb»ˆü›ÿ£ÿß»%̧«I#(û…†a>§ò’§õÅÀ6ñ>Ù½F—ga°ÚÎ!;b·9K ³w )Ó¦æÛi-@üqõޏ¥9Û¼¿=™ÏÓEÑ0Š6öY7“F.4q›SÁ<¶$}k¾>!-³µ£|ÊîQbL"åä-¸V!Ú®nC‡Xk›lc¯~n‡"Ç+¬÷Å?„äÙ9DÚ¬éý&a>gî éEdwc‘^“t©5NØDe>Á{ë‘]^èS«3›Wƒ2Ž ü££%ÖQß[Ú1§šg•9€èéC™‚ _  Ø$]Æ“‚úõÀî*Æ tg¯ßg…ìë€.‘Ù<½ÀZ`ð°øx–¢3Á÷gU9N§é[†gͺï &YN1Ö°ÎÈ{€;$KÀ¿k úÌ`·fèQ’ƒvCw\»®­{K½Ùô=,ò3…“*$:Y”^×vaJzl®‘èË€eÀJà–,:Æjˆx.hCˆÎ$N¨¡ïóÀW÷ºl 4gã7›U¤z`,0’ÂxçTêx«µh€Ÿ‚>­A»&à 9Ϲì^ &²è»€m¦n+ðŒsÂH_ÿLqþ%iWÔ8ý2˜-Àc@ƒÓçúã¶I÷ {“q: i½*èÓîÚ´E–™f©êÖ»Éy¢7k€ùÀ×N¶T– Pî ô¹Òü±Ñ£ úÉÒ!iÿ 0ÒÍ᪠üíÐx‚H©g ë>¢—}^pÛs»‘]cdm¦~ÞD¯6G\½H·òGMß!À_%ˆ¾ßÔuºy<éú¼̵۵٠<¡E9W;µ”^59ÄŒüq'k2²I.^o(A´ƒovò=À#/– z±«ŸlúLu²î`®~ç;ùÛN¾8-gˆ¬ÇãWóþ K㋦¼ß¼7º³Ô§ÿŸ¹ºf`Fº~aÞ{å_øk…³+o‡+oråÓláĉޒïÌ6cêk«Ùdq>ðeßìÕu€È„ ú-öçïkœ$–BÔq$¸GT¢7˜K¢‚#örg=ïš÷ß«øîoŽèqôé>ÔSnîÔ]ÏÞÁŽ£k%ÚÇÃýÆ¢OÚÏ•s¬¸ò û€Ùr¾-Š6n~QD“I¢GººWul úŒO‰èÆ ö.‡`…º>½HÆqq–3ÃvwÎþ<åœß’W¤¤wSGáMC2Àk"9Ó)x=pŸswºv¸rG‰tw¦d•àtàTS^«$£Üð÷0]ÿÕ]GK ]BéO8úÏLÎÍR–è1Ï…€-r€ æÌ¼Mu«Kè8Ö•¯5½xÄXfÉ­Q49Ç p“~GÏg¹o?4w rx2XDüËlÅ•ÓåÌ’ ©OyþÈ2‹ùGÿ™±c’î*Kô™á.íuFéFQÉ]ó\÷­éþIb±"mP¨¸@:ùī݈—¿g µ|îä»=Ù¹zôìQ꺘£x´RÌ~vãTò1-pl˵›&ê^y'ð–¹ÄÚªPÑbŽŽ°H÷µÝAæ{©ú{C[$+mÓ¢Fã®2ÇW$ß—äuÇñ˜ªSÔ1E–¼Rd{\í²¸$NžªXû[—}V‹Kt7±F‹oõkÕâ~¥‹¡9räÈñ?À¿ Ü(׺ ‚IEND®B`‚stem-1.7.1/docs/_static/label/slackware.png0000664000175000017500000000336713157571677021365 0ustar atagaratagar00000000000000‰PNG  IHDR‚ Þ× sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ,y'Ò´tEXtCommentCreated with GIMPWRIDATxÚíšyˆWUÇ?ã8¹Nj *)i®9)fšDYV¦¡R.d+%íjE´(Dd‹%• ͘fafõG‹ZA¹T–¡•b:©ce¦¦–•f9ŽK®¿þ˜óèx¸÷m¿I,Þ:÷Üíœ÷½çžsÞ2dÈ!C† 2dÈ! ޶†ÀP #ÐØ|¬;»€ýÀKÒ§cžÏªc¨K3 «£}°#{ÕÉp°U^þL`0xØ V ÆÉ˜Ë@Î<]ñÞ;Ž}ôÉ^k2\¯Œ××!o,U}Æ)Y·ã€§eDÈM?Äpë=WFÐï'Dø-#BrÔ’ûMäÿß‹}F¾å8×)—½ÖôDè¬Ú.N 3ø.3Ýÿ“ÍU[ðÐ2dÜ ¦Á @k‰9ŠRÎѨûµyMè¯Ñ'öèmÆ7¦›MÀ±MYØ!:W6•s<;…(S¡0OÚf…Ò^”«þËóÖ&KŸ*0Z] Ô B€ûÔ\Ï]”lŒCµ"jù\×fˆ-ûÖ€þmU̦×åØç§&‹Û¨Ö jF3¥­<ìà½ê!BðTKÁ) îTm ͘͘IŽy_ôÈû˜±Cba¾œ’.޵j‹ÌGäDiùsF>V N é_júT¿ËºûUûêêÙàÑ jÄG„ºâÚrÏ—ïà#Â4Ó^b<‘–­1sžo<Õ­JvpXÉ†Æ B™¬Uˆg{ÈŒŸoäƒÜÎ妓þHšnßA{‘ UÜn<^ð4Qsµ7ž¾8,xìŠ C¹ qˆp£ñ*Úýuu\C ¼‡‘?-/þuxùˆPl÷|Tã-”ü‡=bõ”û¸–êŸþ."¬ux±êïÌÞ LÜ¡çº0*ðkFõw„!d˜“…è¦úû…¾ûGD¢ÒÈëÅZ]D(S†écŽwÍc¥½ìiž‘§qºÄSùèï"›‰~û€Ôó°™kTÜÔät`Ї›RT +å Ú#sø ÑÒ±fãDXbþÞlÜ¥/C±cjI¼ðp‘¿-$Ù%6ó!‰þ>"¼2G‡ÍfË×s“`Y„‘Û;9+& Û€-"[!ébˆîŽõJRa‘ĺmVŒúŠ ûIvr¸Û­J¶|B€¤ú§!‚ë›ÏIŠ»›#ú a\‘zŠ9úcÕZuo…¢‘C©Á)¯†^&°Ìw$¬­,—£ŽÈ'ùàÇ"5‚ÇÒGõ›`äW;î¦ r™«%À*u¼˜¹æ ¸Âì/ð K¤Æ¿…ê_PH,`ײ´×}†xŒZ[…Ã<§*ˆ|ÈGÿúޏlDA I ­‡> û¬¢ ô] ÊGœ½Òq®°·Tc¥#ø¸'¤Ö0QŠkeÒž2~ª‘M•|SûÊ1ÿzànéÓס|ðÌQWÍ>‡üpH}áI¹Š<ô6ùäCZý›†ØvNzóψt]axë£D¯ãÇ€¿$*î(OqmëäãÇJ@%Aɱ—Èõº‰ÛþBÒ¶°B×9’³/‚þÛh.i²/5 {©<ú'E¤þgËþ 2dÈ!C† báo'æše›8áIIEND®B`‚stem-1.7.1/docs/_static/label/python_package_index.png0000664000175000017500000000604213157571677023565 0ustar atagaratagar00000000000000‰PNG  IHDR#©mÞsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ*7ZoIÈtEXtCommentCreated with GIMPW }IDATxÚí{”WUÇ?3òfC(y h¢ˆ=TÈ a¢µ l…•H$J¢)fË)]ÅJñrQòÐP)D)Š C®À„)ÞÏe€é³ïúÙsîïy¿ùÍÌù®õ[kîÙ÷œ»ïÞçìsÎÞûÜ|Aи4‰{O{€½ÀGÕÀkŸëãµD5E6Ú=å€#ud%«·óÀªðÓ¸.„öOàhu ¬?ðð1PáøÞNZeïŸÈ!Ÿÿ8ø»¡uÞš¢ W[¼ö¯C“÷MÀoÃ!z;ü˜”#~Z?6:x¹1Ÿ74¤“_h­ŠÆç,úi1Q¢X”„̪µÙèä›.’Å%uÜè¸,ÄèL©&~:ä»Ñiá`p‡ã¾?8C¯ù˜$í ¡—Õ£“/ºH¼ÑÕEÏjäçH¾BëïcIÖù½ºn Ü?%²Uˆ‡Š:ÐqóA©¢.è%]ÝU§Ï1ïôR˜F=޲/DÀËg€²uð¨^]xxä•Ñ9á(k’!׫-ŸE&ïÓhb½zR¯~2m<²¡‹ €N@Ç Þ³Ð0ï• ¯‹/#U´Âø ó ©ö¥B‘[Q†ÏÍ©,’ñ# rÜ7 ø>&Šáúý]ê¶6)Úd*Gc‚ßnëžNj©ª}:a¢>G¥¬X"‹‡‘À?ˆE…NoÉE¯¸‡¼[‰ ħ0‘¤ Lht Ð¥št ¥—ãÀ»Û€{€f øü8ˆ‰ž^ûö‡øtêëBd78"^{/ˆî÷J_X LÅDr‚_«^ `¾ôµ÷Ryi×?;tÒ1Ë}©½¼06NsD¦‡“ôé$#‹ÇâŒñçåž©Ú3íè÷8îû’X×;h¿R¸&|X‰Òô©zÏJùÃbTÂŒÎw¤ƒÙ´µ!ÛµæÒ~&ÏåJ)ï"ƒªxÅa´úP9bTܬEì0œM²htÂt â•R¶Ôšýº‹áîß(òÐhÌ´:qw)¿ßªû&Ð8Ñ 0ÞjëI ‡28éò:ÞÒûVL¿10w$é>©×ËØK¥¬xAÊ6%aÓ5:Qö¥^bdƒûö3Äп!m%2:ÉÊ¢žŒgý~óU{?‘òR`x¦½‘¼¼~`ÐIФŽM_àxÎ`¹*Ûªê…E¯´Ñ9Ü.÷j‡²†8`Ã6Ó¢­tÔ}Gµ¿ø‘ †2KØôqY2:‰t1Æ*_£êNPõ¦;ž?'„Þ_Õš¤ÑyMøíáxVº¼P÷^5±”«}¡ô“ d@¸x-±Êɢщ¢/ÕW÷œ®°è“I2OU…˜„\»ÍØ F€Ù²shœNG_¬àÍ2Ãí²hÇC¬ØXÕÆI5cŠe.‰ÈèŒTô Š>Á±´µé:Ús‡¢ßªèZà“Õ¦?‘ÑIUO«úÝ-Úgí‡Í^5޲h-Õ@ÿzFgšð6øÒåu¡¢ VíþÏ¢í·V½ãU½VnJ®Í²ht2íKßSôçF©,ÑIGÝ“û¯…ö 1BÒíèg%B²KöÕeïöCq*âÈ<¦ÚmÑo‹^/"££ótžQô'%½ê«è[t”QŠþ¢/È褪‹‘VÝ2µ-é©ÚÖ!Ý5ŠÞ[Ñ!ƒx¡åè 3:ÓdëÜ)o-^ÿ• /è•DpTa‡’«½o­êôÍ¡ÑIµ/é÷»ÓñŒD>teñˆ¢—íþqàˉ¢6ñ°+ gè)`®ZaŒ’å:ÀmÀ"yÁl༺¶…Xdùol~ã]_&KÐ3 (x]++è`û>LüåÀåÜ|PV.çæ}ÒgkZ…È<d*‹·0Ѭ Ê'º“fáDa…2K]S:ÕüjTÔv™U‰³„t˜×@ƒÓ 2#ƒx;p-æ0m<¼ë(ë–Æó¾¥¶CÅù¯ÒÞ`ñ) ?ÏbàE¹çºgäz§£Kk ~w;ÊŠSl# Y´slç'r•M£³\–´Z`œ‹ÏV£¢ÎP5ôÜ4ÑÙ;ó7ßñ;LäÇž’9‡S†qôÛøvš<¼<®Ê¦R9¬› ¯6ɪg&±n… .²åZªÞOoÙ®¯úÝçp\”b™Êâ^ÑÛ@5™w&Îg< •S)J£tV–ÓÚ%û!›ŸOG¨¬¹êZ‡æâ÷ç™ê¢øª*[—BýÕõà8:HÔÑÅ$h$[ †ñú ¬Î.>ƒ 5¿,3ùù µ%p·è'´|Åjuýy‡;!Ñ1’teÑG ËpLÄNG‰Ç©‰Ä‰k¨ê+ËP(mÅø„åQØXIÕLfd¿¾Xþ.ënß×Oµ³˜ø‰oõ€Í„çFD/ºÚ}x…(ú/,a•¿¥Óα½ê95€Ê‡C=j ~J,]Š9úàá‘-a"*k‰EoÊ0ù/Ûd•ý&ÿ¥¥W~ [ÿy¡•,e=Æ“é×Xt>ähW,qÇéI?xR¢úV™ƒýÀN9A•¨ú/:æ± 8K,ì> K‚ßÛ²EúÕb ývö<‹žçUqRÞL0Ê/1†ª,ìt€/•Î_€á–v5Àk7Ê<éë0PiÂ/íz€›6ÇË‘Uë_,cë‹dÊžŠ‹ôæˆ? ‹ Fðæ­êå2qM9È®Wy;É[¥À¦ˆ:[dÓ,fÓ roaÌ»,e“â<§¯~‹à**ÅE˜¸>‡O/mÀªl¦øÎù@½#‰„f Ø,ÁÚ6ààžÆÜe)+Š“ôŸ£ŒF+ð¨%}YžÃÄ?m ÞV7¥aÚ=Œ”àµMÎ¥À R÷™Â–5í;#g ¦Êêµé¿Î²;žu,’\À‹û™ ||Ÿ†¾1âwW;ðàý˜Æ;ÆRÖ7éu*z<#G0•b/“@ÉÃXŽÌyçÖ9Þ;ÔŠO7±5Æ±Ž·X㦸I·MÐd éåÀ½òù ð¸’Ï0Q•£ä³4¢Ÿ<ÎQ¾èPsCšó3ÓR6h$h¢B§‡§©ß[~Þ ÛÕê}>õóeõ{u§²K$€3 (v+ý]’ ð;·êëÝé–:KI¥R¿’Ï0¸RÚžâ×útÔ)tdÌtph;kO¯e'ûœÓ;¥­·È; Y¿$ƒB¯øjK;”ïœ/‹á£Þ€‘q›j D›žŽ><¿Tf‘×+£%@´å¥k"VõÒ¦{ºµX&Ñuùâš³f5g9Æz@²g;Uù $…†9HN"ÿÝrœ69¨Kø R‰{¿¿Cu©t¢ù´ˆ®5–Xf˜—þ·H]¸ô9äÚ´–’ºpèq5:̨ yisPÔ|Uw“#öX üîó>¤rù² –ˆ‹è¾ž0vóE²Pú€ŸÄjdü&º^î!õ·²-–¸!ÁFìW·yÉœ{HH?9KHzM¦åèÆ…Ÿþ‰ã´ÿŠWp8XËâ;IEND®B`‚stem-1.7.1/docs/_static/label/freebsd.png0000664000175000017500000000315513157571677021016 0ustar atagaratagar00000000000000‰PNG  IHDRs !YG¿sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ5 œªtEXtCommentCreated with GIMPWÈIDAThÞíš{ˆUUÆ3¦™a SS+ía"ff–Ѧ¢è!¥‰ÓöG)%feFaFY„†E/|@i†a>PIóQö0-ÇÒFÓòuGoÌwq·ÜçÞó¸ÁLœ6÷œ½÷Úg¯½Î^ëÛë\H‘"EŠ)R¤H‘¢±¢8è’pœÀ/ XÏ0:f¿€j`PbÜVÀí@=#|l–{€QÀaà­ó8 l~ 9‡a 0Ø-…l©ÖËe´ƒž>ãøK;˜!cùtÜ|jt[ ŒÚŒ9Dr`6p'pð"p8|#CN”Ì À2Ì7}ÀJÙ¢Näs`,pJ…< ¯é×èÌiDÆÌášÏU{[éâ¶mº›qîuÚ¯÷<§“Œ’ë3Ñ´Wxæ°(s<æÅÀ*§}«ž[FÑRÏî¬+ 3¡‘Ó§ã.O¿%¦ÏÀ©jëàìðÍy·ð{€1ÛyŒùgŒ“L¿eA»´Ô¹>ì¸8-ˆ#„Õq™¹?¸J׃×»Q ìÃ`x@[&ä|+æºsîL)d̰è tÔu0ëH «=u—ë·—Sw-Ð>Ï8 Îe7ðš©«n)†1Ç}œûy@Uù3Cô9]»! âÈ¡ÌSWå™SàcàœÕŠs.OpËA­,¤qš‡Œ™.~óÈôNbÌJÕ—ÈwuâH®LÅ·ùÒ‘ë­·7 ÌuÝlÕ­Z›gÅ‘ cÌ®À!§}“Ø{}µK²ŒtB£Æ1æRÌÐ8ÆlŒÖ9(Ÿ1¦z&¹ xE=WŸ#NÍ´£rõƒœ±nvêÇ;õqd‚tü[^bˆæ¸_õ+äMZxÆx'À˜¹²xFI…bó=Ì”(ÆÌ:ʹ¥¼Ãµý»©­Ø©1+T7ÚôuéÝÌ[ß:L޵À|íäŒó/”'j`Œ9 šU¢¥¬HÆœä‘ù,êÎìÜ,ŠiÌŸLûI@Kç~“y^‰‰ÃîXW' ãf›(ÆgÌέðœ'K1Ž· *kDÎ’s¼Gfº]ØBX¥ò¾¶õ#™ØZs_ç¸ïfÊ–äpÄ!LxHL/¹¿¨2‹CÎõ¨˜c­ÂEŽÙ¾)ƒc~›„Í,ˆèf?ÌÓ··Çut. T™¨GĶísF_`«]LHÊ•ž Ýì Óÿ˜çq’Ÿ(7Y lXŒbËÄÁVOÝYÀÔÉ7¿Á Mbí€KLÝëöE,é‚iÁözvÆ•ÿL´õÔ-×ï]!bïÌÜ! †.° x¼é¼bcž¹@$:‰ë82QawÒŽ'ày2Xœë]Äÿxß xЯaÊ:åÍJd<¾ü¼ˆŸläWèߨ12sóaànàOàÂ2(`u<ìI Üȉû9„*+ã´Ê£×Žüž,SÖ“2´8ÍÄîmÀ­aŒPpNz9ëm!‚`«S¹‘"[ö0¿ZnµF™$2%ÔNòé8F/B{à>íB÷à…aÇîò"·äô›lÚ[ê¨ã›ÇÀÙ:?¦Ý•ÛžÊñoª¨”ÈwðÝ'Ü7Ï8tÀcAy àøÇÜ\©¾0‹G¦’à¿ÅdË(ɱ˜ ïêÿÊ1_®®F™˜IZðíop‘eRšAe'ð•æð°aÂ(¡a¡DÌô2í®%Z¬bË$ÁóJ¢þŸ=Tº+žý¬³è:Nül•"EŠ)R¤høè׬æ½þ»IEND®B`‚stem-1.7.1/docs/_static/label/openbsd.png0000664000175000017500000000333513340051401021002 0ustar atagaratagar00000000000000‰PNG  IHDR‚ Þ× bKGDÿÿÿ ½§“ pHYs  šœtIMEá %'Ô˜67tEXtCommentCreated with GIMPWEIDATxÚíš{ˆUÇ?ûpwk¥Ý(•ÖZ™Y›Vjµ¨E)‰ZR’½, Ò²4³„"‰LJÒÈ’¬+J%MM“LÄV‹"ÍÔvm}›o]ýñ;S—ã¹3óÛý…ëî|aØýÝsî=wΜ{^3 A‚ $H A‚ Î\5”ô^¾¶G€½À¯ÀGÀ E#|S£@*â:ì~fC€üë·ž–»€c@ð©è´0Pd˜c?)à°øx¸»>ÕXê,þPm€ÑÀ¡íÆ9Ì  EŸúˆrË€çã}“ ®¶ï ‹¬Õ˜ì)eÍ€+åê=z@)0Ho@ß)†T‰FªÓðŒ‡¯‹X_À÷y#ô- ¥ÿnðMV<‡ä¡i”Ûu¬“ZæJÊ Ÿcìé7ƒ/Ç0äŽqn|”š¸4â¤QüKbºÆ3 q”ÞÙà›gð¹fvˆÌk¯P×=˜§x·†ÝpoåâR@ÿ% ìVs¦5AC(4ø~1ø*úœ¹ïdÉΓÄå_îcÎV+æý1O÷ûF í”ë ¾ƒ}/Ð:Dn·,À|cΗ!Wþö“dÐÅJy¨QX¢~çOËÿ³<™m™È\!yÆàkàö9¹ÀýÀ2á? l&Šg ST ¸h ¼ ü%óWk…Ôc_zœ›¬®÷¬¹6‹ øbcì^‹ñuCqq]ü ÆÜírÅÀXƒ>Ø|lT´ g oã.“Ó´HÆÖˆb 0dö—Ø2’ûêé¦*žo ãD\²^ï¤TeeÙKé*Ð*3Oñøë Ʊ17ÕÆ£Ü <´õ₇¼AÑ*sÚ“*© ÆßtÆó=2‡‰qN6 77¥·©½m¯haPDOâU ä0„¶™m4cÁô`LCháR²qUôJ‡V®h½Z±3~87Dæ•@izǘJ÷]•À#²v^‰XgŸ{^ ¡¹GVWÍxÌ`Óò´Ë¡—Œ¿4Dg㌠M_‹C@™B~„×þ×îóLŽßf÷fó¶cWÉß^†jç\ÇZ blX"%L#ªqô6B’½ö!^¡;°*dý Y;hî¯Ñ†Píéį:ƒþíé a(sôÒƒ«•CkšJÌÍ’w¸h¼2g­T wyzH¨)ÍÂþJ=‡o·6„•ž$0n²¨±3äæâžÐ#C«Ók]ý9}°Êž1r†O$ÄŒ”£ûÙ¸§ÎÆØ«`ÝDǘB,¾…RÅ…õŽb›'l•5ÐÆS•g¼µ2xkÿµÀ[¤ß߬W´YØ[OCÞt˪L=èÄAoõûdb›vé'¤ÙƒÑ¡»¥B‘ÇÓmScw„¬Q Ë€éÞœ©¤µñSÀÇÞ<ΦÆÁÀdà# 1á³x x˜,OH3Û± _ÞLh·=¼iœM™ƒR„ξ ic•.t2³— ÇÉ¥ ðßà¥XWäž\è”Ä::Ž š˜ eÌ/ÜÜçÍè8N9B'+[CÌõ_¼ÇiN¡s8pª¹þ{3 ¯ê€í>Àfȯ7P[ ~+ {òïl[Áúè‘!Ýæ@ Þ„m¡íç8-ž·(>§s=pSÊý¿^MùDÑ„„¸/›h´†-æj96¯g‚gŽNyÞ@ p#ð®æ³¸Gµµˆkú¨ÎsIuË)Ïì<¬ò5ê³&¤Êbs:[hyßÞæ‹«¡0hÐ<«€Ùzÿÿ´\ŽÓê…ÎÚ¹Ó„N[`<ù«47é.ÔðùÀH#pÒð{V2˜iòzèhkßNxæ×€‘­ëƒ¸‡4ÿ‰ÀZFá6A™H?ÞÓ—Š Ç(îI"Y…Î^ÄËê÷jX p·†Í4wO`µ†Ÿ¬mÐCË ?:N«:áÀ~S‘!Û3A>MšI*Ú›°Q&}Cç˜ ¿«ƒøòWÞÞÒ2~|ÄÿGµ¶^ú2ßÄßžP·çƒ4- àAü¸ŒB§Np~ˆ¹g˜ ¿HÃ^Ðë÷Ê8Î…ŽÓš…Nc‚PLèDÚÉêàž+5n„ €íƒ{nÒ[Mcß nV†²ŸÄ?ÄÿS…•¦{FCæ·Aü.AüJ g¡ó£ ÜjH;ÿ‹^F5$(C`‰ §¥Rl"y=08Z…ÂúŒùÎ. ÂÎÐ9™IÀq:”°·ø[Ƽ/Žv3C  Àú¢„ܪЮúœåÞ.á×¼6”_Sæs!ØÅεÕ!+tk‘Ém+¸,[O_Ôë:75¸T…ú|ïÚNk:–)ÀƒÓ®NÑù»TÝ·€Võ€~j#“sK¶¢6]\÷-’¾oÐ>õÀíîNóý2C‚ûz¿NŽBVþ§Õ hndÏ„ð‘åâOLØ d5kŒ ;¸ ˜–G-ð=d´²bs<°x®•´i8ü´Húö açfÐVŽî"w%ä\Ü£*¸zwZål|9mªüÿVU?d»„¡Ëõ /['6\§g°w ù–B×ຘ𘗖ÅÔÈÃÈ$ó¸ÁÖ[µDÇ© ¡ó"² Ðr™vü%Aø9ÈÊÓ¡äNB÷~¤½™Üí×’;aÚZèžA¨„ñpøx@ôý‘•6´½ÏEöO…Küy÷vZoQÚ)s“æã–U 6‚Éæ½Þ™.ÈPšI}È_Æ/VöaAüÄ þAüPò÷…4iNOÐ0lüGÁð'mÉ|r¾€äÍÖ|ú'ÄO0y<àÝÙiéšN=rÞ'ŒïZàþ“=;5:ÿb‡Tw©êÍÅ\¼Èmeø:d_Jx.ê(ýÛ1A³ªMH®òlV亮ÄôIœ¤ûn?žx®žü±vú÷"d§wD/dò¸“©ïq6]¯/J(¤Ï{÷vZ:? Ùˆ×eúDó.T»y!Hw´¦é¼¬aáÊÍ% ùÿFãMˆ{Ù÷ò;âíýÑçAó’N¸wB àž âç »•#.LÈc@Mg!ðp"pq ÉÈ&µMØÄšã€)÷ž | ÙThÃ_öÓû'q“T[9ܺaˆ|†Ÿ%*®/PçáE†WçCÃu:?eÚ™ÚmB0Ä ËºÙ==ĤYÜœûZ L%>¢òñÞ(Çq208ÖhW5ÈjÖH;ù,H›Ó醘ü8$ÐnÊ¡Fçk†#‡VÛñÛ_1ןW èDûªõ.ä8ÕCšÐq'#m¼ Çq¡ÓzÚk'oÇqš‹ZÄ"Ÿ^ͤüƒ¡Žã8©Jú ØBà|o"ÇɆÿJgc ä|Y+»ÆŽã8Žã8Žã8Žã8Žã8UG)ÉÇ“äìÏ›ˆyÌ×È7×Yi†»›ëk‘•¥båK²I ¯6hžY™Ø½Î®À/‘í—6CÙ+Á©ˆõ„ˆi$[¿l†¾”™ÎÈÒ°].¾±{srxrb†¢c3–£ ð/S†ýSÒu#>Hõú7­ƒF'Ø'!ç½–›üÏ~NìlJ yßM®ë¡J—½´G\%YؘmU }©$ꃗÎr[dÏJ´w¥g3–cb††9‰]Ɇڔëâr§‹ ³>ѬѴÈ7êVˆH˜¿OlòöŽ&t@œd:ÍÙV­¾/•z ¢%ÁEˆ=—èüÕ·hS®[àšŒÃÇKKì[W Ž ûPÜý¦ÞVUÑ8•ä:UAëÓš#TBFôÓáHÄ¢à·#°¥¹ž¡×ÖØ$Û„ØÝy1žµ*£ÀŒØžyx‚ØÊŸ×?Ÿ—§2¶Ã øfл›ôú—ÏÆª÷j`/íà úK{‚‰/f¾u­Oj‰íZïM¼0‡Ï†HÐ-A<«P-}©9„Î6ÞÖ\¯0ßC—+•à ó½SJš z³~~A–yý+ÂÆ¬÷›:üœ ¡››˜ŸÝ¸ˆ–CUô¥J¯¶#v·@'òì ¹õ`ýTÍ«ÐómžiÒ~ùÞMUlûYéõ¯«Þµˆëé[ô9CwFMaIŠú¬©Š¾Ti¡sªQÿNQI÷4ñÞ »Y*râ·’xyñ¿YϤüâ`Ìk™Aì[ýÈ  z©zîõÏþ§ cJ©wSfæî©P?¶Ž#ûWhdP[Â/ªèK¥ Ðy^dتF'±~¢êè±Ä+7K-ß»®!^ù¹Ø¨°SMÞÇ{Wš°~ eŽ:EGâ=ç«ú¹eÂ?f.²qt»q<ñAõŽ×?s_°Ç=%h YëmÕ÷(Ϥ²'ÑÁ|? Ù5<9’DyuNxNÓ¦Q^/!Σ²¢ÃæóÌýɾù³X[‘ Hz§h`ÕØ— þŠÛ}ˆ÷Í•xSW·iã¿Ñ*}§hÚOÉwáÒIUãÈyÞ\Œ–.Cö+LDöŒD6"Ñr,Eö_ é¬WÐéæßÙ~näM#×[¦×?ËÉ=‹ù—¿—|ëÅê}&¹NŸ.(PöÍU3±÷PÁѨÏ>9š`÷®ÌB|†Ù¥à úl'LûÌ'vš¸Ù87ª‚mu ²!¯Ñü¿Ço}©Ùi‹Ìhï^Dåëœ<®ÕJõ+0Ñ×V¥øÀ2ÔÖ®:ÐÕëß"êÝ“¨õÈjO§&æÛYͪӼúú»Ô"Þ%Çqœlü³¼ßë9OçIEND®B`‚stem-1.7.1/docs/_static/label/gentoo.png0000664000175000017500000000217313157571677020676 0ustar atagaratagar00000000000000‰PNG  IHDR_ t8¤ásRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÞ /5Y½,™tEXtCommentCreated with GIMPWÖIDAThÞí™YlNAǺXj©=Ô’ !Aâ¡Ä‘TBƒHxTãÉÒ¡H‰‘F¼Ø#Ôƒ%ú‚„â AJT¨ÄöQÒR­¢½z¾f¾ÉÜûm·z%óO&ùæž93gþwî9g΂ÙÀ~à>P4ï@0Y»8c)K3€»€4E@?‘¥3K"”LþT é ~ðGˆ­FyŒÍ~ÈX' ägož@£X!Ò–Ä 3øPò3Ê~‹\åÄ;ÀS %ޝ%hä÷ni‡)è$AU5toú)À½‘?x¨í'°äÏ3º0Î9æG!?¨ÿûEùUÉ’ÂØk°Ã 4 ¨~!`§<×Q |5ÌS¯4ãcÀ ÉêêëÀ*—5üÒåÁÐq>½ØÎ’ 9Àg`¢´GYë°2~Á–µÀ—sÂeÝÂ8N~‰âr7Š' ÔȳJ`H;èPe0´Oäq!j¨¶Þ\yžf°å¹Ä•@©&k²“ ³çÜdž>ê¶¡Þ`hˆŸ¬Í¹E‹ª¬B‘é¶ìVd òüÉ üVä§4ù48˜Œn½ †5û@~¡Öÿ¤ünÑd“<æ )¿ßä=´o½æ“Cë†÷ÓÕÝòâØÐ!ñ«Gû"§uº¦[Ô*í›Ò2b$ÌqÉÖÁ,­ß¥ŸLñA7‚ü×Ãz»\ô•+û »ÖΈÞb4GAJë¡´þå ÕúMQúÃ|Ð ÿšaàX£›%H—dÛ¤g:‘YK±(®Öi'ÝòÏd91ÿÁð¬Vù]—Àœÿ¯´¾ž“§t^û Aþà‚6pQ‚RéMM–-·O:Âí\Õú½¢¸ÞïR²HV7‚üpô~§ÝÚr“ÜÜIóí†gch-ag·£K覂5´þWÑâ†kýƒr»&I]×¼ü“vqðJã6ÅK_4Œ9-™Ð¹<5Êçª_£Ì—EÆøR9PUÊÁÚªÈ+µ9ÖE¹(%£kD¶ÉŠ·]NdŠÔ/ÔÍ… ã2% ;.í°R І1矚g—‚{w¹›ÖÜ¡Ý)§ØV(Ź—1”’Ñ5"X&® Eº,F»”*hpXìQDJ–‹Ÿü Ÿß3ุ·0öy¼¤s°ÝäO\R…þÏâs»Ø˜#n2${ ÇVÇPKH7–Ëɹ*–üþl¤x$•¼ÀÿKdaaaaaÑ‘ø %殕'‰¼–IEND®B`‚stem-1.7.1/docs/_static/label/mirror_mirror_on_the_wall.png0000664000175000017500000000722613157571677024666 0ustar atagaratagar00000000000000‰PNG  IHDRú6îÆ„òsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ Tˆ99tEXtCommentCreated with GIMPW ñIDATxÚíy”TŇ?˜a˜T 8#Æ•HP$EÐ%‰Kâ· ‚+'è‰!‰GM0®Ñ`b ˜DLDâ î Š1¢¨  JP‘Eg˜üQ÷¾¯º^÷ëeº{zêwNŸ™WU¯Þ«[÷VݺUï^ðððððððððððððððððððððððÈ:Èßêÿ\0h)¡öí4¤)Ó ,Þ¶¶S>Ø8 Øø#ðŽòÄ6Ðà·X ¼e¥·oKúG^§k×Hà9æÇoðð)м< \ tmGý?WÑd-PåE¢ü°êä2²w”¼qá˜(y¥ì‡*¯K‰¶ñLG;ÖµJ³ÙX ò—'åIÓ)eÔ9hóãVäµûÑ^ì Njvëoå¥ôÀÉ+Õ™ —£o8Êuî´Ê=×f÷Ū½_‰ð·.—gŒñbWxtâ_èÈ‹#èI^u‰¶±KLA…uVٛ˜îž~ØJÏ­–ˆ^Ћ€nBüþ9zƒäÕ– \é(”g•¬1ø\ÑÒ z‘Öç³0Vçl±TêØ‘ßØüëê @—km™Ã±#Ð'FýeÉ£ëëlãÞ]r´…ä“~UK}* <‘å$P(¾É¥?Êqgô(œ ¼¬^“¿ € $¹z¯ËL«IþÙÀ›òoÃ[qFc˜´ïä(טŽ1Þ}€±Ü ÜèÈ}1î&)³YÚ2]f¼Áïò=àI`µ”ß<(4©É~g9ʿ쌊È-ïù4f;²c½Î!ƒ•ýFÿ–«úú‘o²í/è‚îʨµØGÒ…I[€‡dÔhÄìáêç] œãx§ZYПuÜsŠUfhB-²ÆEñ^I[¨ìû“Ø’+ÚTà%0ƒö“©’·Ø[Ò®Þé% 2KúUg8ò¾­fã&+ï`•ÈlÂ[³ÏÈÀ§és)ð?«Ž;%ýR±‰ƒo²é/èîRå§[ySUÞ#Ž{ÿàÈ5À „÷î—µ² ÏpÜs­Êß^fï ïËð¤O–´WåzuÄRÁÅX·¨znRéGXïulôë$Båt€W¬¼õÀ¡ýÙ"m±±Ø*3¦ø&›þð‚®0Ê*?ÁÊ?ÍÊÿ‘•¹ã™$ïé˜õ˜½ñÖt—Aîa•¡•§g²„÷ëë­™o¨õ¬à‹±¶î9]åõ$|è¸é·6… Ïµò~o½ûžVþ& o‚^H¾©É¢?¼ [˜o•aå’Fàì{Ûa Ét¿>AŸì¸ç¯*‰Jo²Ö޽Œ­spžeìÙÍj—-`Xï7EÖ•·[kãlè—‰ wÐjUæÌ,½|³SýÑæ­îùD…ZWؘæz4ÖÍ׬ë&G­—•öu¥¶÷Sé_‰ñg¢üÎpŒž·¬Õ׋ê¶Ðí=«]û[uØŒ=IÖ”?‘ç“~+­ë†ç›ÕYô‡t…Ý–æ/Ó\wT*– ÅúHÆ%èÿU£}…¥1|KT½Á´w©ßa¤f«¾¾˜H^ÚØE S³lG!è÷…u½[à›Lú£Í£cêÛl]»¾+E©ƒq‚½ÒQ~¢Ìéìw;„x/àq,> ®-Q>Úšfö-E¾™•AøÝÂ;ŽQ²KŒÎy³ÄèÒ h¥M•µ(˜Bd¡®Î‘Yè‡0ìŠÙ?x×qï€æ#û0Ì{m„oâö‡tǨ»ÄJ떦Öc¬¡¥„S,F[‚Ù»Öªê랃SÔ׈9œÆš;QTÃ;­r‡©úW9Þ©T±ƒu½´Äù&Óþ({A¯Èâž¿¤a‚Ò”/6¶~¦®·aTØkĬëÓpÕ<øæ¤\£J_œ(kÅM–ji«ý{¦Ð@Š…]åàsm\4°gø¦>‹þ(kAß1ÆèmãÂâoZùzoòmàª4*[ÿ<´³>f;jD 1+1[AÏ:ÊN¶Ö‘õÃ[µ$O´äz²£ž[Õÿ¯Xõ¯±ÝÇ-#Qà·2dK¿$[¯SY³ÇZš­i\‹ùúOcYœ ü²H|“i”-êIœÖ¿w­Ü…oH綈JV­Ô¯`ÿyÉ*IÞOÝBx++STÆíaæTŒ‘ëQßIz3æ¤U÷4uŸCòÑ­Â _`ŒÆœ¯öÛÏ·fà)’·’ð¡€£I>+Þ¼(F¤Âðr ß!º\¡òçZya¼ðü¸Ìjÿ3•ðìg,µ¹®|“m”†‰1%ÊýR ËHýéf æi3æC©2p4c΂÷´Ê÷&ü)£ýûwmÛå•ý[- }3æDÖ>úÃã¬àšÑ=ÊÌçáááÝ£òÈž$å… ’ ] )Øí#HÞMÐ[l“<‰ÚüÈì…¸?® ð%檇‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡GLdbŒƒùè@cðXŠ{NÄ5Ôx¸pà7˜@®lctó´(-Ø´½žd¹âXÜ<¦‰uä5c¾,ÜNú7·WIÄȤ]Wc¼ E¥ç•Âàz›eqŠÁ¢;æÜ·þšèHŸ@Þ«òöncŒåiQ\Mø3ÔZ~Ú[€¯·Â3kD8uŸ$}^ ±½Zå=DøëÇ:ÌyýGˆï? aoÃýÒ¤çñˆrçÉŒ”{ÁÊŸDâ˱¶êV×Ó¢ðØãöé +ý¶Vt¤^-èVþ*Ï¥ÝÍshué03B gf"èÙÝ‚ñ”`|Ä’`4&>X€O­2S0ÞEúÑvÝêzZ½eV­,Òó‹æàV¾ö¬3ŒpñZÄ‹â1[/°·ÉèU…qqÔŸp4Ö˜¯ž¢>õ@â»âZQi6KGj•l‰¨¼Ãå]Åx†IWF?·8Pµù2kÆÉ¤.O‹ÔHU?žuI}ÃåzNšúûb>+ œpKœWpûµï…qãõ)&ÞZ‹c’;@4„U˜ ‘ëbðþj­>†päšÃä]:a¾Í%3o°Ü¸?BKŠqèò2no·EÕ  ËÓsŸ0ŽŽôò Åü;T­Ý 7<]Ôàú¼˜eõoþøFŒË¥mç]3xž§EzZÄ©ÆTPßIÂ܇šÓ¨ c­û!ªq¨î§ކ»„°§ÚÞ˜è´+1ᬦÉàG­îKÂ)Ë6Œþ €_«çÞ£òî·–ÇK›Ç‰Æ7O´¹„]yåEuÏEÐ÷RúLuhƒ¼,)˜;]kª“ {Q™¨:íw”¹šä€|°0N]ž©i·þ)ªþY2éÒ.MCïë-CXÔý6ÌÞ“qÇ®›-i“”vÐ"ÂO©z/Pªú-Ö@°Ax¡Z4=0ÑaƒðW‡«:Ï-%AGT)›×`ü¥cî(ãÉñ$Ç:ë ªW³Lƒš)®rKšIøIó±Ù.Ÿ‡ Rù'•60F½÷ªµôPÌ7ú{È©3Àqò»Û2â’ÁnšhÚÅxE¾gç\}6‰/˜b¼­Î,;ÂÎêÿ/#:¾>ÏÏl¯´(­s6ΑåÉù˜}î:IK‡ÏÕ2¥ðŒ[ï³Hø ¯TÍ•X^7ÅXzZ”­£x·g†÷-PK…ï[2POü“‰³Uÿþ“d¯¶3Ôÿ÷Xy£I¸JŸU&ÈTлɈJ[£TÔ©VyUÄÞº¨¶êÅÁ,Q"Ò•ù„Dô’”Šp.#á.9Îó<-¢‘IýÝí¬R|˜Îø©ƒOŽ~A"˜ƒ‹†:­»ª#д`â­ ƒÙuÄw¦± ø—àm<ŒÙÃ_„q!­¡Ûù]`¤¬Õõr¨§c Ó[„Qé9c‰H&k,ƒÃ Âa‹êd¤²£Œ,Àl#œ+ë¹ ýEéœa²VÑ[U×Zï§L€³äf‹*µ‘ðéµLêò´HtõŸ@ØÿÜ"Œ?um=Þ&Â…ž"4ÁÖÕÅ’nÓðeÌa¢' _¼OWŒe[ x’ÌcØ”eIÔ7S ‡ËÒKœ…VŸïüGµm æìÂVÂG§»¥Ho×è(Ʊ¸ƒ zZ´=Z7’k-ÔÊú¸6ÇöFagÜñ ìKØPÙE4Äj<<<<2Åÿ\íÙ³<gIEND®B`‚stem-1.7.1/docs/_static/label/archlinux.png0000664000175000017500000000312213157571677021373 0ustar atagaratagar00000000000000‰PNG  IHDR– ð’ŠsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ 5*ø¢ktEXtCommentCreated with GIMPW­IDATxÚíšklTUÇ}QZ ( ´`µÖ¶Qü hD­ÄÔ6b@Cª¦>hMƒF+â;цEÄB"!š"Æâ#â#Ú5©¦X…´ V)‚ÐZ[Á¾ü°³á8=wïÝuiwÛóOnvï™{æ¼þwÎÌœ c)Ÿ»¨L°þ[Ê÷g¸ >`w@S `:°Ø?V X ³¬_¥@³ôͼ®cs€­@§¥A ¨žBççFý଱HªI@·L¶ì_Î&VeÄ*‰RO®EÇâ±H¬jcNç%`;‡X™2~³^ 5]?(¹c‘XMj2ŸNÀ>v ±lí‹QϵÀ;À—Àc‘T%³Ý¤;bý/bzø™ñeÀŸªl°0Ž}º äãccle£$»³?øÛÃiý"@ýiÀw²•š×£"¯¾}ÍÀMó€Oßå™n`—Ôäc±¦oÇ _¦8w-V¥e>š€YÀ|Ùy¡Ö¥Ý‰, èž.ò'<äKEþ‚‡¼ Ø!ϬµÈnŒvk }b!×åtJŽÆ¬÷2ðEßgF½,àU)ï.“òÇç÷Ù ~/p@H5 d ÏßÅ›XiÀý¢Ø _É*€eN)ÙφõJSó¾ò Ë}ƒEÿÃ"O^±ÔߪÆðŒ”·K¢ÀY˜»å~‘¥Á×êZ¯ê5É‚¬SuȨóšQ¾Á(Ÿ«t-ôXðÒ÷Lyô‚”Ž •a‰.MŸpŸ’+?¸øIÉ—û¤^òUû_y+L¾=–1N0žÙ4/uT¸E|«lƒÍm–Äàäº^´ ¶Xd·Ë6×< e×)+sŸ¡k²zãy,x¹ÏdÖŒ°ó)ØÐ [«ênSò:C6!±vG ²;èqÈ˘/ŠÕy_&þIÜ÷‰AmW1Lê~Na¼+>@Ž¡¿VmUßÿËVzؼçÑF«ºoV÷‰˜‹óÂÁaË> ™«…€›€;-} D¬\qØëTùfq€MTÅ lT÷}┇1Ë’G3±Bˆ¸ÔÒ/ X¶údÅpŒe•^fkÕÀDZ¦*Äßi‘È0|õ©góÛ¢ìô OJa¢*-i‚dB¯ð _•ÄšÇJ•¨¥8j¹XtTÇq@Ó,e3FÁB—´I2Yʯ%JÔFgN,Äš'[á%òk»´ÿr3piœsÀRV< ˆup¶µNDäY¶ÞÍA"ÂT‹Ó¾ øh÷¸ê,z–Çi ^›¸gX«§”Ï’ x„ÐgR¥jK,H?0±ŠÄbm÷©³ÅÂârñÃâê~~‹8% h,Æpë¤C¨D´(ò,‘ôÄKC2;(±j„™ø4Ún‰Ô²8}Tc{cMøå@žUù¡4\‘ŠRVÏÉÿqJ‡ß},gŽçX);Bp>†©Ri¿þfF9– aëTÀ5Æÿ¹À•>y¡£¯5„òáÐ1Å›:K_þƒ4#èŸ)²ú)Mø[­2ËÄëää)†&í4Ê€¿T½>BÉÃzà }SSè¾ÔªþRòFµ ~H‘4‡íC¿FБÌ”œn3|F©¿çÿ(ÙäI`ʨ±¬TònàM‰è•h_×_)/BŽXÖA áj-ý^iÒÞ¶T8 Üj!Ô7„¦#\ŒïD„çÞ÷YÌb‰Lt½#­fèY yä”!c±ÉÛæà*}ÆažDxÉèo‹„ù6YƒÔßë!ÿÃxYÇoXžÙ)îÊ.éC«m#ð¤\]ŠåÆvî5¾Ç¼ÞÄDGp¡ÃÖà7—f „™„ÎI{Ä ´IùÕ²]ºoÉ’ ÿo=QXä¼(IEND®B`‚stem-1.7.1/docs/_static/label/redhat.png0000664000175000017500000000272413157571677020654 0ustar atagaratagar00000000000000‰PNG  IHDRn ó MçsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ-\ï˜tEXtCommentCreated with GIMPW/IDAThÞíšh–UÇ?ómnål©EYc.3Á4(ÝúI!ýRÐ~€­ß™Y+ˆa¬°$,¢?ú£Òˆ K ÂPI%µÊŠÂ \QFjË9kËöÓå›Ûúã9®çyŸçÝž÷ÝFÏØ{Ϲ÷ž{Ͻç×$H A‚ $H0TççDà=Z€®<Êx2pYíKàpÄq¢®³ ø˜L‰Àß ìå] ¼ tÆ—¾öǤ­KúÌ̓|§Ï» Ù²™°è XçQàc`‘ðß$¿ÓüÇ€/€êá¾}³œ£x*d1šþ!pRä›2DÅù¸5`óøçðß•ƒ5Ž6 ³íØiœ*eÀ_ßà„<(ï7NYÿkRü)cÞ~`|Ö·JÆ_EÃQüÅ Á0·•yPÜ@ cô²[L¨…>ç÷çÀÏ/Ïæj¿mW$±Þ Q ¬“`1§Šë5ÚN éspF–öþì &l$c¬È^†ð^ÔGØ¿ŒØÁÇl1œõ-ßà5 ±‘Èôð"P0v9°YüŽÁ®Š€¶|†>þ5@£Èþ“ò‡?µ†_¬ ˆæ›dœF9±(®XL¥;Q±¥îúF•7¾+mß ™ Tã¶«%ŒÿL”8WlWkõ­ÄLY§ßo—ä¥z½+Vgü Ò¾˜‡âÆÊmÑ<Í"€Ë·Wñ\ã8a¿ýIÕ^(·Ò§õç)úÓ1¥–â~.Èð Ù—í#‡Vçô}Éç‡gñPMe°T6øçd4O¥Æ8Ëq&(Út' ÷oÝýNŸ·1 Ž).ÛÏUÜ«}¦¢]äо‹Cqa¹WlÎmF8¼ø6 ßƒN8Ý®~w¨¿K %©Ø£Þùý·|¹@+pCú{!U°DåÂ:êN;¼gÅ!p˜âúÛ¥´Ä‰øÖUrz]3Yálø#ŽÔ8_ü×t£˜/¤¥|„£!ýß’Ài–VÒ~"pi.ŽZíX.µ>}ZfI ±Öáê„ðÅxEb}òÞq’ßrC–öQþ÷[åK7wJ¹¬-d N¶¾¸6BÍsjȼ}ª ¾‘œ¤€ûTÄýµ(°Ò(¯ ÙÇe“€¿/æÑõ¯UÛÏFß°ç”&£­tݸñbî×âÕr÷àç7åjÂl+'µ’@kœ)ëà£Í¨dB Þ{ŸÆ¤Q¤¸7$zôñ2ñÔU#+nŒq£4KuÀÅ"à§²¢qo@éç*¡YQä%†?.J+®wÚvÆP2ó1#J‡Ã×L4ø6|Ê—•I=SÓ7ªœ-…÷Ùª’l×7îã¿ï|s.ĦL߬ÇéJøÇ‰5pç.z…1Þ3B+¶9´.£þºÝáy^Ú—ëô4 Ù\eD|§¿¼Ÿã“âøw¯´”}:d³ÜÃÕÿVààqúîœ{$âZUOɦZë¬ °@uüÏ©}ÙaÐwã½ã½Àñ¯èÛ€»Õ<ÕFÿýRÑ™´˜àÏJA·TI4nà=¿ÿ«1W"6÷t×gÈož0þ Þ¿04ªÛý)°XQq5FåeÀˆøVÿ£ªÐ¶/WJEDÓ%ZFäÔ´5Ž9,‹Ô«¢ÖÉq‡ À4Qôu’”†¡Dê›Õxÿä£}â´,nX¾Q%¡|™±sð^PÊC¢Óyî)A‚ $ø_àŠYëßôd¯IEND®B`‚stem-1.7.1/docs/_static/label/osx.png0000664000175000017500000000334713157571677020220 0ustar atagaratagar00000000000000‰PNG  IHDR} ?w sRGB®ÎébKGDùC» pHYs  šœtIMEß-,Û™¥ÇtEXtCommentCreated with GIMPWBIDAThÞíšklVE†h¥\½€´¹k¢¨‘1J0¢Tˆ V@4‚·!¢±QDÁK”¨(( (I%@ŒwÑH€ ŠÅ rW¤PT„"Pt>³ ³çìé×6žIN(ßÌ;»gßÝÙÙ©¤’J*©¤’J*©¤’J*©ü‡e° ¨2žõ@ý¾&xüV ëȘÔúÓ5À`7ðð 0äúkLVŠŸrñù>08 ¸\Æ*W0 "xÉ<‡_Þ‚+¾}ôÓ/ù¬ÇøêÀ;Øfà¿NªC‹ Ÿ[T£þ7n⪀ïƧXˆ)nËïÀiï\ÅˤÒ;zÚìîØ¬ú(¿ÿÊE2st'–Ö`™ÉºcÔ¡Õ=Åé÷^ Èc[üáØNêv§9ã9Èã«-ð“‡ôŒ¼é!½Øã³½èßò¢^º pxÒpÞ%`ÐVC ìíu„ôiªß#cìïPö6Óý ¾Î‘í×Gzs`»1¶_xBÌ"á#6œfHo'+ÞuþR ¶‡la ê(éƒTŸ·I¸Š’†ÀN…ë¯lÖ9º1þžŠ à Ïj§ìÆ›%|J:Àbåø/™mQÉà#òw]#½°QõyF ö…[§H;àèÅL¤¶À‘Òž3ÆwŸlçWûe’”ôK ç÷yp…Òp네w¦J¢±¨ö«$FžÓß–@)ð™dÂû$±z蜀ôŒ>ÄZáÌÝ¿+Ý×’¥×T?m~œ)yÈè$]Ò‘ºŽ7{fa)°ÀùéwI[UÀ­Nfü†šÁ<}½ÎÐg¤_Ŷ¸&ð½ç}>/ÛÃÀ¾êè?òlÉË¥õj@üÀ߆ÏÝÀëIiÒGŽ[ã/Î91„ô"ÙÆ2úᎮV ~ ƒ/w¶Ì\…ÝøÞÖÊiˆÍ7°ß9ú+cÎÙkaùƒ–‡<þ:dKz#£8°LaJäLKÒK”~»£Ë1ðC}:*ÍU¾Ýþî |ï £ÍÆØ&žçÊÔâ3´O®r% j?oeK:êÜjm}«Q I?[mOËà'+Ý$…%õzàúÀ÷®4Ú ­Bæx*_Zî‘+Žü! ø:CB ö1<[Ò[ñcŽèzÊ*išt€nrÔ4“ߎ—X…_£twÖBönUe±Ò·xl; cHߟ`‹n%¡UûØ ´É†t€2å´R¶Ù2I¢¨én6Z"5èJà“¼Î†ÇÔéË6ó±§ØOc0ݤÂvÄCü‹íæIõóy`©ácIh’è#½§átpÐs4 !=ê ˆÝN¼,¯·â§kôR£Í ±ØE×;æÑU&ˆuÉ'³%´æá2Ñ.è#=»µÓ<¶q¤73’aøMJ·²Hïb¬ºØÛ8öÖ«Èɰ×ÔûËrWî–-Ü OxŠ6²!½„ðÛ·8Òg6-ñó”îÕ×’ÙÊ|åw~ nÂÍ5ŽUÝc|tT>6EØö–U=TýÞØê©äÄ‘~8¢Té& "2Ü8Ò÷6':Âú¥ž¢Ñ%U=7)ÚªVÉÉ1˜BUfݤêÝÒËbü4#ìžãtªïóÞdžñQ÷ŠIbJ#Šü8¸nô~ecÍÈÇ%Æ}ìé´[,™åI\Îòó¥Í$»Ç?—£?@ˆK¨f«š@׈Jÿ˜ÕëN¶vž‰‘9¹Eø²ÂðA_->xMŒ¦yVN¡$R¾Ë—zo¬(ܪÚÞY\kÄûÃr–Ïqv91GŸ÷TÈ•öêX8ÉÈ‚ë«wø\.K¢ªfû°ïÓ›Ëødlú68ú;…^ý÷}³Eßþ4Îz_Éë:õËFcqì5£û’Z~C™P¤ µ_Ê–SœÕÜ]âÕLľî+[Ý™ÍÛwRqRÉnvî~”…p¯ü»Î™Ì7EÄL«TºŠêÛȱrÜ*—±Yl$]M€o=G»ÍêRh¦LŒC15€)Ô°àÿ’Vr,+¼£Br›ª|ìÛ¶;Ê%H¾ÚFr…<)'ÿ,ÉÖÎt¨SI%•TRI%•¤òYnˆö×´®TIEND®B`‚stem-1.7.1/docs/_static/label/the_little_relay_that_could.png0000664000175000017500000000764113157571677025147 0ustar atagaratagar00000000000000‰PNG  IHDRú6îÆ„òsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ 4ÍofâtEXtCommentCreated with GIMPWüIDATxÚíy”TŇ?˜a@P@ "ƒ¨¸EP‚šà–9ÁÄ$n‘ Íq!šÄÄ}IÄ = ˆ$ .ˆ¸¢(¨lAÙT# 3€“?ê¾óª««^¿×ýºgFëwNŸé®ªyUuß½U·nݺé ‘ñ{(0x˜cäµF·‹µ¼€Êõ­Þ‘gì£ü‡ÀÛ úãjÇ< SDÞ§E¤ñ~Òß(,>º‡æ(»xJ¾7N±”yx¿„|t@ž´Ý8Ö‘÷ °É’ž/zŽjåS ´7ò/Òòß3òÈKÝ­•©5ž÷<0XÊŸ&¿kåw/g%ìÃ@`¥åy_Í‘WL|xÓÑÏíÀÃ@)ÛG~W;ÊϮמ]Ü&‚”ù/p|‰y'_Úvn^·üï )ó¨‡àjƒÐ§ù“ü.–g s0èÀ±•?¯€~ôŽ`¸Þu èæ´ÐR÷mŽòC,e×Ê nþ2È.šÕÿBÛýb z<ú¥„Î8Œ¼UÆï5Ú÷j`½åy Ã騢©š&ž²¨gµÀ£ôi¥ qòЉZc&ÐÆQþ‹êÝhî(_-ïò×ò½.Pmßw¨é&ÒàÑ/½ ëkáYKëxSû¾XÔkÛ,é[#`·e ÷y‘×Ìu…i2è™M¹c`˜h¤5¾åxv¡ý´LŸÚeÒàÑ/½ /”5#À[BHÓ8àUOºÄ¨¶h*íåçYÒNPõgŸ}Áièy4AߥçeKÙeÀ'ù¥Ä^(+z±Qtš¤ô¼-ig8ʶ¤jÑšƒPF¼Rö§s|·?ʘ˜ ‰Gë­ ë³È|Gù—äï‹uÐÖ=ûP[t¯IÖ·D¬]óŹBƒÿÉ,¼IêEö–ḏ¬O³0|p&ð L ày3SêOG™-ŸŸIþODe^‹²öŸ ÿ]ey± µ;°¸›dÄúÌ£ 'Š£›#”0Aviùü GùUdo­™èM¸}¨¿€©’öÐÚù]Öߨ¼=€‡$}ážvY×OˆF‘/n&ÛÂ|’Qæ<”ê+doYÞa”LqÔ•ozKzÇ—XÚþLLÚö–Á!È[‡Úu˜'Bù)¹­îiñ¨G 0}ƒ¼p×gmAo*£ÿM-o–þÛ}Š–~ŸÑŽÛµ¼YЧ¯EXn7Ê<\#ߟ6Ê®Ó4±&2;vÔUHþfÔ»øø+™ûü«bж‰ \Aú6 —ö7o{Í£ zÒ)èWù{jy=µôÍÚ¬ž ÇHe´c¸‘f4ZfÊ Å†‰Õû‰zÔÖY´Žö^ô¼ ›˜nüŽÝ…ó$ÉË÷¿;¿÷ÎQ>_õ]ǽe_D9 ˜éPÛë²?.Ì6~÷³,5šxql8è,꨾Mò™e6ÑgsëÈ©Š±FÖÛk¿ÐþŒ7è”Ëw<жæYõ•†ýåj \èÅ©~¢ ‡Ý fŒE{h,é¶ò Ó t Ù{´5¨È$[d $e`yÞ51ò@íû®’ôåÚ`Ò’p? pTŠt{Lž{wŒ²F¦‰c8Ë·?dïÃWãv;CÛÛŒ¼™À9(þ5( =)j›±‘­úƒ‘d{6™ŸÍÀ/¤üUò;ªüV`¬VÇ (¿yS[˜­Í£#ž·;"ï/†¡h’”å*úŽüžŠ ‘&Δ6ôYþ5iG\$íOGÔá­lÛy£cÒöW–{®Ô¹HÓl^î~ñ‚ž5ÀöVGÊÀ2—âÁ®Ž@í-¯@9Œl-B=-€ p‡•2Ñ_Ú± žö'ZÉ}/´–i6–ÕÒ¶Z/šu„$ûè½PW.ÅEp˜ìf²©ŠaF: ;2 ¨  cQžuãR®<…·võ§n=*æ{uØÆ´ßY1ø")ÊQÁ?úHÛªPGƒg œ²Nyy²ˆtˆz/¡‚…˜Cö%“©à Â;ÀîB¹œVz8]üŽð¼i@[”cGPæ "´«5*±é½uhÄ@6U+{ˆ%ÿ»¨¸ãÄÈkOf¸«nö§ Ùžf÷£.kòé¯EyõˆùÌ´Û˜&ÍŠÍQïφƒQÎ;Ÿ í÷âÃQQn«P.Àç§ÜÎ$ï¥ø#v÷âTq*’§~–Xwc¤¥ÿ]FBPላ)è üìõXuçä(¢ØH¶Ïøá¨0Ký,ÿçÊ›œ²53ú£_&x¥–¾÷!ŠÜƸpѬX|õþlèKxhj¬ƒ·fHþùE O’÷20_AOrLµS|KŒ²ã(íØÝdÆ/û(Gù›dïFfì´Ž¨“q¶È6Qyi£·{ª~aeÜ÷‹×”’fùÔ×T&¥æ2›ßáà­ad^àØà$”Ô[Øï³aî³ÕíQ~ÍŸˆZTk|Ž–‘y*8CUŠ}îIx£-Êç{êêáÙ„l•þuÔÙmW^®°Hi÷ÇŒØÒ*…ºB Z†º¿¬ÆB«KD@Õx™çäì›f¹ø"ªùÔp)aÍ—qß¾Z… JªÇ/¬m 1ê¤ßR!Ë‚v¨ˆúd´"Æ@t¬ÔõB].ÕÝ¥¢] #cð{¹›>"Ï;À`àÂD½b´e+¹ïcöx½Emü‘0qþ”¨UmräE©_…ôçc‡ê~œ–^EP"W]¶6E¼XÞßs¢áL&h¼ã)¨Ã(û£‚f¬!<9h"Í’ðE®vƩφǾÅÕþ$À-Àï5m …Æcú ÀB3ýB 9x§*ØHp,y¾Ð¼èkô4}*ØÂ¹ZÚµ²Ó$íjmT®i]Œ+èÓׇúuIæ/*Ïõ² é)èMdt_ ­ÏONP—ÙÆ¦„×2Bœ¤•-iz ú±†cDŽ>DÑ,._Ämg®úlÐoº%&Ï9ôØûÓ%íV-í߆ ƒ:=WЃñ&Tsȼ=§hkô4p£Œt:£[3¢œ*ßU0ˆÿ}bB+j.Ô” ¯iöç—²nŸ‡:¢{§¨s³ ¨«‘¦Ò¬1>S‚:>Ð뇄;ɾq¥|·ù ³aÉ…Jàrm)‹ñ}$a ûÛKHxEö„÷ÂÏ,Å=M衇ƒ›4õÛT.Fm‘”/te²¤ÙŸq¢ŽŸ-¿Ï™v]‚ºlL×[gE8[Ë/ÓÖàSP;•„@ŠLÒÆqÛ™–h´Ù;Fù¯iõUkø`âìk¬×óAm@]šaëS\÷N†Ús¿|FÐ-)õ÷ôÚŸËPLvÃÕ}2ëÕÆ¬k¨å™+eýªÔýŽºï ܲ.kè %ä¸íLŠ·5Aï£ü>Ú÷펪K íÒcÖ¦ÑÑúva]o|Òˆ$3˜ì«ŠJ6‘yýÒ‹ó©«LŒQeö<us« ó5õt0ꞸgKDÇ$íLŠIÚ÷~äŽÃ·Â¢q@fÌü)´kƒCèëLÐËRR¡ ôLøžÑ¶.Ø=Ø’ ­¬ßJH›v óÒê¶ëâ›PVõ|꤭ë‰A;5¦~žäážâЌڙ¤¾YÀ?å{kT€KöŒëPFÀÀï¢Á[È€lAë~ICY¿¡}^ˆ w's÷0G¹ÖÚ÷V–´=äï2è=‡PnŸCQWG´eo2$:ù½eê,t´)hC€!¨`†GÅÈkgyé…ô§3™ÛKúvÜ(B‡ æ¨„÷cÔe¶±¥aøˆÚ’ÓÕTý&îlÄUÛ£h—/’´3ª>.×´“›QÆKS]Ÿ*σróå¯ …ÿZMÕžnh’G¢î–× {¼³Ð§þhY²uF¹™8„Ä|¼‘LÝ Êë£Æ4šÌ¸í¯ ¶æFøR)ß婤_“<‡è›=.&<@|>Am7=ŒrˆÑ#Ë^n´é%ÑÚiÏÚ ü\«Ç•wÊ*É“]éxIEND®B`‚stem-1.7.1/docs/_static/label/down_the_rabbit_hole.png0000664000175000017500000000504413157571677023544 0ustar atagaratagar00000000000000‰PNG  IHDRÈ6‚ÀÖ÷sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÞ(dô9tEXtCommentCreated with GIMPW IDATxÚí{Œ_EÇ?»Ý>Øb·UG+©€¶’ÆúÄG@Æh”`ˆ Fp•¦¨5Ö¡¾.¦ŠmUR+Š$¬TŒ¡Ê#R¬X!ØÅmKS Ð®Ûî˵ݮ̹ùßìÜû»ßþö®{¾É/»wæÜ9sÎÌ™;sæƒÁ`0 ƒÁ`0 ƒÁ`˜ä¸­ñÞjª2LU¬ ÆàŒåá À°…鬬xyÀ@:Äûdà9ái0•¾´7€gðwÅÓ`:3ÌõxLgf ÀiÀ?< ¦³Ò 9Ç;k{ºÚ`ð4ð`7ðU ÷ñ[àÔ@ø~õóqp—ô½û€àÀ¥­ ZCy›.yÙ§D3ðãyN~=ÂïÏÀG¼<åá™U®²é̾ 5¾ Ð.6ÇT¶ 1é´§l g·Iü!à<1ºoª÷~ ´o¤¹¸/þQ ølŒƒâY©tƒ^Ü/Yyæ‘«L:3©a -Únà3À±Àu^ÜQ`aùaŒ±-ðÞ}0-æ>ààú@%ˆ*“ÿÎ Àå°Ë‹ÿ ÊGžYå*›ÎÌ@jŒA|ÚUÜ+S¶ÃmÄÚ|wäPVÌîI)CÚ7â–úw¤Ðg®z£åß|Qâ;€¿yñO‘îØ¡Üºñ.Ã18ê;C¢y‚&àøq#¸ó”&Ó$ä¥À¿ÕóŒ)÷4Åg˜%ásT¥}‰øE‹IÈ"CVyû…vOJ}¦©O‡©ìk‰Ð*áM–Æ¢u" „L—R™S¸e’Çù¸“{3ÈY/4'ð9SÅÝ7eU„öÛb$×gÐg^¾½ä?ƒ¸tp«¢YVrãX*_½Ñ 2$>ͪõ(™äѧˆà]To’ÒýÂÜž¿ân¯Z-Ÿ÷Õ^_ókÒýØFõ¬öŸ£2÷{ô½Àٸ倻Ñ+½ëwk@Î%¸¥'¸MH iµ7ãîíØ%ýåK ê3ú¿è­”q߃Âï/À•^×6J»ø¼Œ­†€-TvKf¡…;q1.ÏIú¬·$Õ§4iç-¯Â¢·îîT­áÝvµ„­ç͸-Ÿúšú͵ŠÇ͸­¥ºÿþ%éûFaw”Gï¼ëÄ·ÛîeÌËT÷è(•-°YùŸ­ân÷â6¨†ÄïŽ}'öQ*½¢£=À«rÐÖêÛ6à ’¦>%¥]¤¼êòÙ:¬*nä‹Þ‹Îhš¯Â>íÑ\©<,#öŒrlôòÒ¯ZÎ! ;X'P Òö ×*·x´3òo^<$áO'yïõH’mqL£S”¶¨¤ù‘¡>%å¥HyÕÅ@¼JºUžG¨ìKo’Ïð¨¸6çªL>¤\…Ï)žgï¤rJ`(/Yû¬µ $MÚÑuh‡´{Sò?‚;`H…­·³•Ò~Yž§ o?o!¦SÙbÝ]GÚF~AÒÔ§¤´‹”Waô‰'Û%l0кéV/„Þ¡Þ=K\ú.’ÀOãKf CªEz@~ÝÒ·Ý‘ÿ‰À‹*l/ÉÇ›.Â]spÕ+’kÉÖ§ºõ¤m”¤­Oqi)¯Â-R4ßòò»=‡<ôi(?“Aþ45(ßüßëu+n¼3wö•¾v¢7ƒôZÐzÐ6Ú@jÕ§¸´‹”Wa:T‹æ÷•ó¤Bc•­jðµGñx›„ëkÒÞWByR…_\}úG0}È{g­Š››Ñ@ô¤à#u¤m¤¤­Oqi)¯B¯ºËUørõ^´•U_²£•»A Ê£þåûÕ ´¥Îõ±åùªg¸Ó¤ýu¾UyáÈ oN o}`›n¡gI÷4Š{Qôå·ê£âíZBõÙ]¾~tÚç³yi{3賞’¶>Å¥·¼jÂ_ ï–¸@ u˜±§(NÃ]È2 |RÂ>%Ï÷*/2Oƒ®0ýÀM*L+dXZ»TŸñ”æÒž^·n“çÊCm¢ú®ÂVϧޥâF¤?;Hõõi>Îó¾g©¸s¼ûƘ<÷J×s§7V›%ÿ,’w×IøýžÞÓÒ¶zîõæúŒ[vt¢§³¶À”Áˆ¢9)C}:6P†EË+Ÿ`ìâ²=âqÚ.^•›ˆŸ ›‰;ù¯Kæ<ºä9ä¥y±“qwª 4[¹:õ…”k½°§SÈu¡L6 à¸ÎØË+¯‘y¶)Ðx¬Ç­ÄM,¾=ï¯Õº¥[bZÊQàû*ÏÝânþžT†Ë õYÜ¥¤M¸åN_ÿféšì’¯´¿î) ­?QyÚ’ô9?FþåŒ]üÚ…»Uùë/æì¦rnR}ò+ŽâîH)R^ƒÁ`0dÀÿÂ.Ÿú‰>3IEND®B`‚stem-1.7.1/docs/_static/label/doctor.png0000664000175000017500000000212013157571677020665 0ustar atagaratagar00000000000000‰PNG  IHDRd ä+Ý.sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ 4~aB&tEXtCommentCreated with GIMPW«IDAThÞí™IhTA†¿dL4ƒ»ˆ.xoЏ$x 4<)¨ ¨QTãBÌAðƒˆ&‡ÜŽ¢¨FTÄ !A/\ã·$nKƃ5Ðýf&oÞdFí†y]ÕõªúÕ«îªzààààààààààð_ x„=~?À' ¸T‹€P­£ÒÃþÏZðÃc~eº,h­Å¸@Žðså@³Á ”¦¡C€B±˺ʄ>XÆx œK ¯Ck€QÀTàd’ˆí6t&;ía¡5«3ÆDwŒ1ÀxùŸ¢èÙ}œq&b{JêH:¨Q¯öQ]å…o¢ЋõQøµ=e)Pã6µ}èŒKçìY–{>—ÿ׊>·’ˆí)qH°ÂRuãKŠŸ§Æº!Ù%M>€kŠ7˜Þ‡IÄö”8¤\í³‡€#jÎAÕïÒûòËAÉÒj/8ìQÕ/ˆRXfÄI#@ÛAêÒ†ÅÀw•ƒ{}¬ÚeÌkR¼1 Ã:‹MÀ,qÌ(iÕ܆zèf¹GEœÏįí¶ÂpkoRb¹ÉyIç"YNpÔ¨žïñçËa,T2k„6I”ÑZ'ÙÀ1¼¿f†¥Á9ÜCoH¾–¹ Œ‰ó¹ø±}¾Eç©x±TúO= þ%°¯ÀKà¶DDaœ¡ÁLqf«ää‘]iÍÅ"YÐ+‰Ì6ÉæŠ£Èœ–έ—#{€ÇRi{…Gs1,úVãààààààðïã7 ñ³'O=IEND®B`‚stem-1.7.1/docs/_static/label/nyx.png0000664000175000017500000000152013340051401020160 0ustar atagaratagar00000000000000‰PNG  IHDR7 ¶àesRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEá  ˜¨tEXtCommentCreated with GIMPW«IDATXÃí˜;hTA†¿¬„ø,|¡uW-Â6Ága¡MŠâ‹`¡A¢"JP!h+v‰">’ÂF]_"!j@ˆ`+|º11fmN`8œ¹Ín–ûÃårÏœÿÎü3çž9s!EŠ)R¤à P2®×@}難·'IâêkžÞ àe€ÍÀ;ñ½ ,OâêÕ·=;B¸{Åoa’Ã3ï÷ØÀÛŒ'QPF=—€†O°Ö󎱤®–7´ÊÝÅà0¦fͼ^'=!úИ¼',ÿ„ù9ñ¹,Ï¥×3áÜ1Þ}"Ž8$­N.F70ø+•_Nì h78=гDìƒÀš¸+мñl `»Áݦ|V‰½É±=RœO2žIœ†€Ùå„å$Vߌþš#ˆCf×åv«öcÀKek~z"¦ øwOõ rð×øAÂ#L\‹âÕ* Ê€5+Þ8Ð)üæ©$vOxëCÄÕJX¹¼}Ò–FyžÂâ©Ñçþ©fK ¾­?Â&~Þàœnð²À/ÅíquÆ÷ã†LÅÇå¬Þ;C¸ÇþZ*-`ð¹ qHàrîÃÆ¾©‹ŒÇÀˆâ~–VZÀ&cÂÛmLÊ…N—¤ü&Éк ˆ%n˜Á÷Pâ2À{ÅË…dÙ¢ãsƘœ¶¨â¶z*®ÄpÊH*6H=¢ÎÃJ܈hpÎs7¤t C-ð<¦¸ÅNH˜ä/â“UmÝÆê½æú:ì•c‹K‹˜rÉlÆ9ÏõIz·&ð’QdwJÛý€¢úÁt&ÖÉ·GëÕðó)'âk[Ø2Ó…u9aSp¾¹¡jXµ¢#nTl=ÀÁj÷ÊøÚq­þ²óON3jYIEND®B`‚stem-1.7.1/docs/_static/logo.png0000664000175000017500000000646613157571677017275 0ustar atagaratagar00000000000000‰PNG  IHDRVhk&*sBIT|dˆ pHYsÃÃÉ=tEXtSoftwarewww.inkscape.org›î<tEXtAuthorJakub JankiewiczÙ´Ç!tEXtDescriptionGreen plant seedling.%9ˆÖ cIDATxœíœy´UUÇ?ï ˆŠ.K ]qV—™”!š…ãoiNäˆPšµÔÒÌ0M)ÓPŸ$¢–Zò~ Ž8 YR-+ÔôíBd"'D׿s}÷ž{î½çÞ{λ¸ßµÞzïî³§÷½ûüöoÚ»©½½ò¡^ç3;ÄÉ¢rÛ75ˆÍ‡zÝX|\|GœÜVN͉ÏjÃÀ ¬¿»·ª×_–ÓAƒØhDñrzýF54ÿ-P~“zí§ƒ±Ñø;ð^DyOàè84ˆ€8y˜Pàñð8}4ˆ-Œ_E”ï§qƒØ'KIvQ¯M¥Ú7ˆ-Žaã ;¦‚EƒØ"'ïß ÿOœ¬.Õ¶Al ˆ“»³Šþ§]Ý«^ïV¯›Õz²­®kã4¨[b€9êu‡ZODœ¼,fŠ“9qÚÔ3±kýçÕ뵞 ° ·r=ûIð{{`¶z=¾VQ¯C+ÅÉ[qÛÔ3±k³þÞ¸[½~¾³'¡^·N'÷•Ón}!Lœ¦^?×Éó¸_n£º$6°l¶ŒxÔ˜¡^7í¤yŒ^'¯—Û¶.‰> RµöÎM{êuWà<*X­P¿Äº¬¿?‰xþõµ¢zíÜŒ'WÒG½Û?ëïvòíõÞÀ9)Ž 0]œ “ó…|  Eœ,©kbÔë.˜&W_; ø'6ùº@©½¸ ¿Œ'×r^dVavÀn+l‡ ãÂÀä«)Ôk“z¼ üKæ¸[¥uA*t¬ØprDWÌ’É‘ô¾ ü¬æ õz:Íή&è—2+6l~íy{£^»§;¥|¨×~êu&ð$Fj;vøbïz$:Vl”“á݈²>˜géŽÔf‚z ü sjü[¥³;k• K`ÿ†»•N V½öÁvøc‚¢vÌæ¿Dœ¬L{üjÑ…Âa‰}0;;Lì ˆº‰B½‡9Œ3_øÛXHúÁ´ÇN Í÷|Q¶Wµ¼BvüñÀt:Øo}"JåŒÙÛÜE`ãß…YPü8Xœ,ˆnU¿(&  ðaÝþ˜o3Ñ‚©À¡AQ;p¾8¹1©1:¥Vlv¨!ŒÄR{‚Ã$—ÔsÖgR¡ôŠÝ–è󤉤¡Ï¦# n¦JMN¢ÿZ¢ÔŠ]AtRŸj6ÀÈÍ,Ü H#­Xr) LÄ’Ý2¸>IRƒtû^X”·3Ñ—Š“¨DæÄÑ…|7a6–í§íQêõ"à쬢Y˜Ç¿Òþºa r‚ùúb™‚á³ ëÔë2ŒäÅÁï%YŸgd«A¢eh+°ÍkÛPùõÚ\É$ÔëQä:rÕQÅÉ,52J¯Ý xsá ÂÂÍ©×SKŒ1ŽÜÜþ{ÅÉÂR —a÷R¸ûÆ/§u¼8y:F½Š‘£ü‹“{°„Û"ên‡ý£ga¯Ø(l•´º¨A½"_v_WjR¹;•x¯ÿy˜¦qAŒº`êåÕ1ëVŒ<«JœÌÂLÍ¥õ›€ 1oÔêh *£dàYõú(°…8¹x"ÈE@½&ÿÀ’«Û|F”¬eñ°Åäfv— äÞH”b%¯ôá˜ó¥&ºcæðǘ.|{ö)=õ:³ß3xIœ ,1Î,jP 3°Õúg ¿Âдek©dt«×~ÀÈÝ´N'W‹z=ø-¥±ÍÅvý¨,ïb˜&N¤ŒúU!­D·3É%h!PðN•À1s'¥Iý¦ºÍ¤;.”Èä_õ:ÛЊ­Ô÷0Õn–b´{™ó™K>‰¤±#CŸÛÄÉüì‚`U_Cn¨; Ïa)¤}1¹Ü[ãVb²½S¢ÙHTΖ°ScV¨N?à Š“úfb ÓQŸ¢|RÁRýÛ*hW5’–±_!_ýù”XõzvÞáí_ÁäsìøÐS˜•TÉÑËé⤥‚v‰ iQ¶¾>ž ÜZÈ7VcÞûç€G€éX4c¦ø—{@Ó±pMÍôŠýZèóóÁå¶«K/bäŽÀ¢=ÄÉþÀù˜¡1x ÓS+%u"îIÝl-†ÄV¬z݇|9˜k±ˆéjÌAþ&2NT¯Ç`_Hµiø‹1™zÉš€$EA”&CìJÌñ|eÂc‚‰››€Ë3‡èêiûß6“W¯³±ã—ýo1f­MÊ>”\/HÄWè¥+°&2xDœä­â (Ø|½‚¡Öb‘‚‡k¡ŸÆER+vgrI;jž‡`3;!p+ŽÆvïRW¼Š…‡¦”s9n-‘±{E”=àø|_P¯çbzë@:ò¬6ÁÒã_^¾Œõ 5#6ƒàª»×ƒŸ Ié±»¡¢AlJ¨šØ ξì#,t£E+vùNêÕ^º¾# b£ÄÀzw|(i¤EìF-_¡Aljh›ª"6¸ä&* ݱU¶ïY ¨¤º I…Bié Ò"¶ØÙ±Õ»Mò±U¶oˆ‚h¬Ø”ÐX±)¡±bSBcŦ„†º•¢ %4DAJø? D¶u)ª ¶IEND®B`‚stem-1.7.1/docs/_static/prompt/0000775000175000017500000000000013411004021017073 5ustar atagaratagar00000000000000stem-1.7.1/docs/_static/prompt/run_file.png0000664000175000017500000010326513157571677021454 0ustar atagaratagar00000000000000‰PNG  IHDRÕ?‰„?sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEá-±Kñ IDATxÚìÝwxU÷ðïlͦ÷ž@B z“"R¤ˆ öŠˆ ¨`E_EP°¼XPDTˆ—!$$$$¤÷²I6ÛÏïMH!e‚ñçù<ÏyعsçÎÌ™É;Z×ÀÏ<ÁcŒ1ÆØ¿C.€$Çìpº¥‰…¾àøNcŒ1ÆØ¿Ü!ïøµ-Iõ&pÝ1ÆcŒ1ÖÀ'm-©¶‡åöö0®/ÆcŒ1ÆštÀdêæ’êƒœP3ÆcŒ1&*±^ûI½/6ý+je0æ¾¾«Æz@ʃ1ÆcŒ‰3¬&nTÃ? µ`ˆÁ“&£¿[;¦¿VaXðÒ“˜ÞÕ¶ÁÆÿ×u¿)uÈcŒ1öïôHM}-|¡þ·Rç^Ø|ø(NÅÆcÏs×>÷¾o7 Ò>Æ0Gáo)µU×Eر{#æ(þu[¬½Öýß\‡Œ1Æc7Á µIu_4êöÑsÙ :ò8FLÿ~/®ÁG@êu/6|л.Ç¡2âêcŒ1ÆcÌ’G÷€5¨.$4õšN/ô!©Ó:¨>KúÒôy”ñÙ(’5˜VL(É/r}}4•ÊÌDDD&uXÞ¬j¦‘zßKÛ’ËÈ`ùšª³NÐæÇz‘½¤f6CèËbjRåÎQd׆ò¶]iþ¦£”¥#"ÒSÎù8RÑ…ç:‘¼v:™;ݹx Åd눈ÈPK;– #7©å{Ut ­ÂRÖŒ£ôíæßèr%‘©è4­Ÿì]WG ?ºëµÝt±„ˆÈLÅ~¢W'ø‘¢-õ'bÝe~shwQáÖiäUSF©ç4Ú^L”¹i9KÚ·988888888ÄÀ2âGƒ/n̤Ü-‘ä?øCºZüÍ›¿ƒò27ÓXgI #ßÙ»¨„ˆ n ç˜FãÇDÒÝs¡yýIR;U'?c2ÔŸú¹‹žü"™ˆrè£Ö–ïyw¡^3·QѶ™½(,,ŒÂÂÂ(ÄÛºn>­…Ôƒ¦~_BdºD_??ƒ&LžK‹?>N•õ“jÁŽîx7‰HGŸ?=™†F÷®ØK¤£Ã ûÈ_HK ´zü º÷“L"ºHoNA ¾Í'ÊÛH­AœhäÆL"J£íKgÒø ³è¥W‰(“6t"Al™E­»„\Æ|B™TM‡ž %¥Ìîߣ&sò;4ÐNhß:äààààààààh §ñrÿ™ôù¹|*/J Ë_ ]¹Yôå8—¶/Àf0}V@d<ö$uR´áwŽiŸŽèâÒº»Ç©ú­§Ê¡õýT7´Â²À§éÅ=\7_‡Ét°^R-õ}޵5×›¤×[Wºç€žèü3 «IªÍ‡iº3ÈnìO¤1¥™®ÙÚI•æã4ÇC ©ÿ£CD—Vv%eí|”áôJx˜ü¤m+{«ë.ØPïWΓ‰.ÓÖOO’ÆK+º[·}>m ¯ÆC ßaaO8¸Ý¯»<ƒþGÞCÒü#(*ÏÇ™Oï…Ÿ\\¹Ï rÎ|þÒôÍO'ó¶Cj‘&³¥—þ‹Ñ @i£h×9TCŒ<9’CsÓ„ŒF¸T‰‘_gÃH"™ ±c”p{ãu7›A 2a†RA€uð„!ÑûÓ «V—Š_£ò€°áVµsoªÂ™7¦cÑÉÜ÷Pd¬žƒµç5Üˉ1Æcìæsm1gu·›F ? Âsý£1%b>.Mú^îc-2Ñ3ƒ˜M-<Ø(“¿ÀÛã+ðí31°×@DÎ1ú›°ºT“Kš½D$PˆofôF×®]DØ×§m¼Z))j"j×J„{×þ†¤rËweI¿bí½ÁP ÿüMiÓ!rBºyAÉm›1Æcì–‘5÷…2äqì9·Ãs¾ÇÊ^À¡l9üzŽÀ`stæúSžÅ¢Áó]Q÷‰¡$8ø »ÛC \'mÁ«¬5» Í€©i`@ú'!üW[¸×Ÿ¦  9i††eñ.ÞŽü³÷ÁÜì*]_“:  qÃ]ŸÇö{²ðñSã±ð’ sßÀºíÇá­ ÃÜŸ [˜ïí΄¬¯& ó…`è΢ŒÛ6cŒ1ÆØ-uý«¥Þ4{¿–¨p Ýå&iæuŒ2êøT,¤É­½ºQBsOQ½Wx·a‰ç<:iª¦¸ÿe’>í?4ÀØÒðmådŽ™O^qå‘?Oqd¢cÔ{ý¹,€žˆ1]XB!r1¯¡Èmúo¤£|úôëzŸ+)|u*‘öWšêZóZp™;ݹx ÅdëjÞK;– #7i½usDÏ|ôOÎ#µ¾ö=î¥ttI—k¯3—8ô¦'¾8AU5_›ª(/öëlYŽÔg!¦zM!Ç&_ÑîGw½¶›.–™©øÂOô꿺צKÜiÜûQt!£”j߯NÙOïNëHJ~ý(G³Ñd÷‰ÛH<:J‰ËÞÂþÂÛåÞ­>xßZ?Žuv‚¼Í¿—À¹ßd„ã¾û=ÆÚ™Ø÷MÐm2ú»HD]ƒù GîwOX]ßeE'L™ýá/q´„Áw¼u‡ÞèŽ oß‹;ïŽÙë³1ìÍßñÃC×þD ó‰'Ÿ ×ÃoãÑéc1bØHDNyoí¾ =ÀÞÙ‡ 3LØöØX ê?CÆÍÃòM¿"¹Òò†ySþ÷˜Þ¥+ºFŒÁÉÍ[pÂÈuÇñËŠÄ¿}&Ü5ï%õÄÊ=ÇñáH' ±EèÈ‘è¦ß‚Ç&E"òîñQF,Þù#ž®éŠÃcŒ1ÆDÞ©¶ê¹–®’†~c×BF^{g¸±Ã4ÝùfÜ©.¥-w:RÇGަà+íh×ÌêÆÎÓsAr¶"‰H¿ÆÛ7\¶ýø½¤£dZÕU!îjDâI³¢ôDW×R/+ËgÊð×(…ªèç»]IHêû 3j)j®7Ik'¸Ò=ôD矡™å3EØJJ¦*Ú5º¹ºv¤‰ûtDY›h¼§¬årÉ:Ðçš¾S-õ”bˆèÒÊ®uw•áôJx˜ü¤ ÈéÙ¸†¿—u|’ÎÑŸûÕ­GëwªA&˜A>´B¯·Q‘²ý­ë~Ïëƒ>}j¢ç(¿Yù¿éß,ÁgÚxc^'4}ïô, îŽîÝk"|¾Ê0´o1ÌùØÿÑï¨öŸÙ]U¬ÐõþyèTú#>ï"²É]úúB±?±¦‚©Ê¶öªFÉU9RbÏàLù-*qÕŸxïµSXøÊ"ô=×Ôj¤ÅÇ!®üú„¼8­{£“³ P¯Us'(P€+ÅFÑ7÷‹£×aWéÌz°V&Ëñø<doùÇk–+(Ä73"ñf¼¶á¯õÅH׊_åêÄO0=èGôž8sçÜW~^„7O¿ƒIã_BT‘©áßj4=˜‰pÝçB«£ž˜a4‚D€Àû cŒ1ÆX“š¼Sm.:Œ-'Í}r†:ÝnCY‘±ýe|#Ì #ìÛè™Qrj7⎙c|ê®&d~˜0'¸ø bŠÅ÷§ò£øÏçWá9{1îµ ÷¹žÇûÎYF= I>€xrÃà~rd$& !¡.SòQMm\m}Îüð<;¥'|— ±ï XÿPPþå¤C…€ìÝVÖ\ŽF<0bL`Ýp{ÊNˆé $ÄåjÞcŒ1ÆnTÓCê3ðÍSkðØé•ØwØ +ßÚ†˜lút±obb{t‹@DEýß—áÊ¥ TŠÌQ®Añ¶…{[ü»F ­ 9I)(Ò7‘}VœÀ»ï_ÄÃk»·ie )_áåmKñÓú]xß¼ß]’¢û¼·°®_)¶Où)mê%¢EÜÆµˆyn6oªöÞ‹oRëf`ÊÚ¥.ÃÿGãój¬ÿ9yx‡ø£ä‡ Ø-ºKŠ=¿öL)FÔ™TéTð:>0ár^UÃ!Íe¸x<xn ^}¬?æ;¢£Õq|º%ÚÌíxñ“åøãÕ_°Å¸[â¥èñÀëX’…OF},Z`‘1ÆcŒµ¦Ùú>L£/SyÍ#†’T:ößy¨héÁ@"Òí¥qöbT”SÈÒ„&f’H/†*=¨h[×Üm*í®$¢6 ©€ëPšõA¥TX–R‘EÌ %ká:¥ Ž4fK1¥Ñ;½UM MèFCžÝL‡¯¨kÖÉH%ÉûhY„ÕµiZ}PQêNcÖüBqùÚk5£Í‹£_Þ¼›:(¯Ÿ^ê6ŠÖü‘A:""Sýx¹Jê†Ô›¸f/]ªÙ e‰{hÍDÿº!õšxPv#iGQÊkÝxX=ŽærLÄ׌1ÆcŒÝ8 WcŒ1ÆcœT3ÆcŒ1ÆI5cŒ1ÆcœT3ÆcŒ1ÆI5cŒ1ÆcŒ“jÆcŒ1Æ8©f-“Ã{üjür±:"±™gwâ¹nV5ß pù1.ë58»ºT7¹4‚M OšŒþnÒ›¾æ·rYŒ1ÆcíœT Puš‚Õ»Î!OO "TežÂÖÅýá :> "º.Ê· ‡-‡IÀÜÄ÷D2îÇ]–d1diBÓ$âÅP…¥žóp’Ú?ÀÿÚ[ÿl1|[9Ì1óáÕJyLQáP»Vª Ü»ö7$•[¾+Kúkï †J¸Í7”çt|¹ëeÜ™ÿ)FÞ‰;ÇÎÂâõ»qªÀpmSÚtG \…n^u¯"¿I¬º.ÂŽÝ1'@qÓ×ýV.‹1ÆcìF4ûbjeÈãØsn†ç|•¼€CÙrøõÁæ*è¼û, žèz¯)7”¤BDxw{H!ë¤-øcµ€•£æ`w¡0•#­ Hÿï$„ÿj ÷úÓT!'­á«¼•#ÞÅÛ‘?cöž"4ÿôëËcR§¡$n¸ë³ãØ~O>~j<^’!bîX·ý8¼µa˜ûs!Ì·é†RúöG˜²Û^~[Žkš˜Â„¬¯& ó…`è΢ŒÛ6cŒ1ÆØ-ÕÄ«±½iö~-QáºËMÒÌ뎭¾¦¼õi,¯)¯¦¸ÿe’>í?4ÀØÒðmådnÃkÊåÁÏS™èØ#HvíÕÜôDŒ™è ‘·åu”Jò‹\F_M¥2³åµß&uXÞ¬P÷Zð»^ÛMKˆˆÌT|á'zu‚_ÝkÁ%î4îý(ºQJµ/!W§ì§w§u¬{%¸Íú²¸é·Á', !9@RŸ…tºþõ_3^?¾4á•)®ÈT[`ʼ°ŸÞ‹t#‰Øõn¡<•;G‘ݵzu§;o¡˜lå÷±´cÙ0r“Z¾—ùÍ¡ÝeD…[§‘WÍgRÏi´½˜(sÓ(r–´aY\ÿ¡Äs.1%¯êZ—þíIu)};e }‘¯¥˜§;‘¼ÍIµ„ìGÒzóSõ[O9”Cëû©š/—¬=q®é¤Zê·Ž›‰R_ïQw'Ýa2l"©–ªìÉÑɉœœœÈÉÑžTÒë—ÕRy¤¾Ò1£–¢æz×­ƒàJ÷ІdµŸÙPïWΓ‰.ÓÖOO’ÆK+º[·iY·C4ý "™`¶$ÜõX¡×Û‰¨HY‡þÖõ??‡ç‡õAŸ>5Ñs”߬ž*F¤³ŸigàyÐôckg±hpwtï^áÓðU†¡]K!÷„AnÀ™Ï@š¾éi¬ƒG yˆÞŸ]퇺Tü•„ Gp3Ãs‹“¦¼íÑžc]¨‚G¡›P€¨½Éж8¥ mJGiI JJJPRz ´iÛ²BF#\ªÄȯ³a¬}`Ô\ˆ£ä€{Üåµí¬ gÞ˜ŽE'pßCý‘±zÖž×p‡,ÆcŒýã4ù ¢>ï"²É]úúB±?–¼Q€Te[{U£d¯)±gp¦ü•¸êO¼÷Ú),|eúžkj5ÒâãW~}B^œVȽÑÉY¨×ªÀ¹“(À•b£¸2å’Ãl¢V&ÐxP¡ÕQFÌ0šArýo[/Wý%7Z®T)LÐ[+s5ο9#·¨,CØ«‘y¡ºMŠ⛑x3¾a Oúb¤×ûHî; ºIA& töèýþS1ÆûGiòNµ¹è0¶œ4#ôÉEêt» emDÆö—ñ0 /Œ°oCâiFɩ݈G8fŽñ©»šùaœàâ/ˆ)7ö‡!÷$bŠ€^ &£ƒ¼éi4—£‘ŒX7¼²"Gz q¹ú&T éP¡`ç»F·¹µ§p^2ÈòVê©üÒ1DGE!** QÑÇTnnbQ•ÐÁnv×_—i’ žÜ0¸Ÿ‰ HH¨‹Ä”|T×äÌ‚m¼üãF ]„"Êg1v~0®ñËbŒ1Æ»4¥3ðÍSkðØé•ØwØ +ßÚ†˜lút±obb{t‹@DEýß—áÊ¥ TŠŸNá„o[¸w° À¿k"ܪ“”‚"}w-+NàÝ÷/âáµÝÛ´²†”¯ðò¶¥øiý.¼o^Žï.IÑ}Þ[XׯÛ§|±½D*ObõK¿ãžO7áÔ¼½ù.æi!sðAù1|¾õ´™Ûñâ'ËñÇ«¿`‹q9¶ÄKÑã×±*$ ŸŒúY&´0 á 2—áâñLà¹%xõ±Bü˜ïˆŽVÇñé–DhS¿Å;ûWâ‹w~ÄÇ¦Õø)]ŽNÃB/7°(]V â«—áî7^Áü5û‘'óAˆýI|úUª³v`é‡Ëð¿ÅÑ8ä¼ëŽEžÁÞ!þ(ùavgÁCߨ‰•þ»1³ëzÄå,Ä­_ãÃÝa˜³»àÚð†-.‹÷aÆcŒÝ&š}pЩïô1ú2•×<òg(I¥cÿGŠ– $"Ý^g/öAE9…,Mhb&‰ôbÍu*ÚÖuw›J»+‰¨ Cê Á:”f}E)–¥T¤DѳBÉZhc‡tAEWÐÖéTqmœ·L:±a<¹Iê†Ô›¸f/]ª©À²Ä=´f¢݈*M<¨»‘´£‚(åµnu8¶áa=©Û(ZóG鈈LEtöãqäZS‰ÓzöÛ³T`""ÒSÎ…‹TIDçŸ ¬bPt((`æGt,»f0@CÞ0–\j×]êFCžÝL‡¯¨k*ÇH%ÉûhY„Ù |ŸÒ©„¶Oñ¨{˜QæO ¢µDÙi¨½ ~Ys¸ë¿õÏálÊ;(˜î‰Ñ?sC`Œ1Æ»Ñ¼Š«àßÂ=z Ô‘”[ ‰KWL|~5Â+ÅŒceœP3ÆcŒqRÍZßÒÎèzç\¼vO8\ÌåH=ò-¾;óL\?Œ1Æcwÿ`Œ1Æcì/’p0ÆcŒ1ÆI5cŒ1ÆcœT3ÆcŒ1ÆI5cŒ1ÆcœT3ÆcŒ1Æ8©fŒ1ÆcŒ“jÆcŒ1Æ8©fŒ1ÆcŒ“jÆcŒ1Æ'ÕŒ1ÆcŒqRÍcŒ1Æ'ÕŒ1ÆcŒqRÍcŒ1Æ㤚1ÆcŒ1NªcŒ1Æ㤚1ÆcŒ1NªcŒ1ÆcœT3ÆcŒ1ÆI5cŒ1ÆcœT3ÆcŒ1ÆI5cÿ@Ê`Ì}}=Võ€”kƒ1Æcÿ_’jÁ&ƒ'MF7Nq¸o«0,xéILïj{[_5¶×6å¶ÁcŒÝ¦Iµ2è!léØxìy.âÚçÞ÷íFAÚÇæ(´-Çéº;voÄœ×øæ‰\‡¼M¹m0Æcÿ¬¤ºïK+Ñcþü^\ƒ Ž€Ôë^lø ;v-\ŽCeÄ5ÇcŒ1ÆX=Ô0d4õšN/ô!©Ó:¨>KúÒôy”ñÙ(’]7} a3„¾,¦&UîEvµÓ)üè®×vÓÅ""3_ø‰^àGŠzó’8¢g>ú‰Ž'ç‘Z_;—R:º¤KƒéZ ‰;ûà%åkj~¯§¼3Ûé¥Ñ^$oë²Z)³ªÇ :VADDÕGéÛÍ¿ÑåJ"SÑiZ?ÙÛRbÊ#¶oa´Z?Êzý Qù¶ád[û;‡Étˆ.<×ɲnw÷~]È(%mÍÔ)ûéÝiIÙÆò¶]iþ¦£”¥³ÔaÎù8R×_@¹Ó‹·PL¶Žˆˆ ±´cÙ0r“¶a{‰l«í±_ÈüæÐî2¢Â­ÓÈ«¦ŒRÏi´½˜(sÓ(r–Üžmƒƒƒƒƒƒã_×8pc&ån‰$ÿÁÒÕâŸhÞü”—¹™Æ:KÚ6sAEžÁ]¨×ÌmTDE´mf/ £°°0 ñ¶& @œhäÆL"J£íKgÒø ³è¥W‰(“6t"¡f^а•”LDÉŸ/¢Y“ÆÐð;GÐØ»gÐ]!ÖâË# ¤gãˆ(ù=š5v$ž´ÞÚ_@Di´þNGñËQfûÈ_HK ´zü º÷“L"ºHoNA ¾Í'ÊÛH­E–GLÞâhµ~Ä$Õµëžò!ÍŸ8–ÆN^@oF—Ñ9Zª_©Mý¾„Èt‰¾~~M˜<—|œ*ë/K°£;ÞM"ÒÅÑçOO¦¡‡Ñ½+öRéèð£$»½D¶ÕvÙ/ !—1ŸP&UÓ¡§BI)ó£û÷¨Éœü ´Ú0Ž¿-©–ûϤÏÏåSyQíXþíÊÍ¢/ǹÜðBTýÖSåÐú~ªë¾“ú?J1Dtie׺;”Êpz%‰ˆN€xºƒûÉ‘ñýYT6‘“ÊEl¯¶mw<†?ŽE‘xþÈ3¶i¿Á¶^þq#†Æ.BGªñÞéMØùA4ÂîC‘¹½ÛcŒ1ÆnBR­ÄÈ·?ŸãO Çž\hGgCëU ÔHÍ×·i!º¬ÄW/ÃÝo¼‚ùkö#Oæƒû“øô«TgnÇ‹Ÿ,ǯþ‚-ÆåØ/E^Ǫ,|2ê{d™nÂZ÷]‚7Ûb²Á3^Û]˰sÚNdˆLþL"Êl×Îåi±o·VeÊGô7§AëVã¿kÊñ^T&ŒîCà @ßÞ‹ÊÜ—6½Œ?^Ü_d/á£èth]†Â¸ÖEÔµK?\†ÿ-ŽÆ!çÕXÿs,ò 6ðñGɰ;ÃÐnÛýë¾xõ»uxÄXàt >~Ýeh‹ÛTpÀÐ7vb¥ÿnÌìºq9À Ç#që×øpwæì.¸v'ýÕ6cŒ±ÿÇ®ëhí4òJÏûž¦yJ-ŸYGÐâ½ñ{*Žb·/¤ E[;o+(`æGt,»fð4CÞ0–\$uÔM\³—.•[¾.KÜCk&ú7¦L샊3ú‡ú]È5X±Ë>NŸ>N¶B—ÕJ™ë?øVÿw¶#¾#µù$Íó”ˆ.¨:¼å£´^?“ÞúR*jyÓRQÊQúè.ËÂM=¤i7’vT¥¼Ö­mÃê)|(rÅN:—o¸64aqêZ?Á½îÁD© yv3¾¢®™ÆH%ÉûhY„•øí%²­Z–çIwy… ÆtúzªW3^6·M²ø>¥S mŸâQ÷[™?-ˆÖeo¤¡öÂmÙ6888888þ­!Ôüã_r_>ÏžMÅû%Sá4ìG”qycŒ1ÆX;p0ÆcŒ1ÆIµ8|—š1ÆcŒÝ$ÿ®îŒ1ÆcŒÝÜýƒ1ÆcŒ1NªcŒ1Æ㤚±ÿ?kØt‹=þžKê —¾óàíëáï® Eþ1ÆI5»Áì RŸþàf„õéÈùOßš6ÃÐå¡oЧ6îêƒ:E ¶°í<n¾.O õkÑpr²ú{+TÖ^‘+áç£Eu¥þܹÉÜaÛ¡7l¬$·= ¶°í2î~.ÿ싌[ÙÆn‹ö,…Üo:‚§oDAŸ…Ÿ!bê3ðpªy«Ô ®Gè´gàæ àƒ)cÿb²ærm™ûpøôg/OHŒ¥±(8ùr³ÊêNR?øÜó&¼½>°2ú1\J­¨;‘„ÏG‡ý RÆ’SÈ;öòó*ÿáOH ÚúA)QÀìäø÷Ÿ$Û¥žåPÜ ßCáàê Œ0ŸAÁɯ—£¾¡ÄHâ8Ç? û¬×w8æ¿e½ZGÕ§qeçH¤Np±ž|lø ¬a7à9ø¸¥#ëÇ÷‘_¢¿iû—Äi:é‹ÒŸ. J«ÿËû´Ä%Ágîz.îÜ…ê¶¼ÑUÌñ°]Ë#@êØ ná#áìk«dìx•¦[¿Éåþp0ÞÁÁPHÍ0ÿ‰¼_"?·ñq£Ž ·¼9÷CÀè»a“ÿ3ÒOÆAOVÛØB¯­©gSòö­…|Òt˜0º]_@­åçÿã¤úڙʮ§ÃN̨$$¾pîs¼Çª ûî-WÕ%dR@{~-®¤”Ö<Í0WV]»ÂW†>ƒÐþ¨Šû )y€mÄýðÿ4L߿ Ó?¸êÌÐ'¿‹øO˜KÓñ÷®I{Õ³$XÁ˜¹éæÃ¤ð‡sÏð+‡vÛû(mÉB° „sÄ4øtïãߺ^bV½ ºÒ*@¢ÞȆ¿”š:E¢C{T[}ƒ õß³IG!è®PÝðŠ·v¯.¾(>uUÄ] ²€%è>ª#Š~~W¯ÔäPõy]#òºu­%á“ØÃ®Ûlø†÷‡µ ¤Í@Ù…-¸z>ÆÚ|P>à䕤Р2æ$ÅåXÖW÷óà… éa(9Š´½_@­#6ÃÐyÖBØÔ1÷œÛóçõQ‰ z΃o×^P) ÆÒ³(8õ5r3Š-Ëìá0à øÀÊÆ“:E§þ‹¬´BñwbÛ¥žÀý•-¸z¥öÿP©ïçH?XÛÈPª5ˆ½mUø#ðõÍBÁ ø$œn(§n¯õëþ¸ëA89XêÙ\•‚’Ø/‘™˜“ØŠìá0à)øuê+•€ †¢?Qpj ò²Ën/¯…_ð,dRÀ\‚“Ÿ!;½øÚ4íRûµÿx‡†@!1ÁP’ €§þ÷‹6ì_¢(aÓm¬4ÿÃ¥ËÍ´a‰³e¿ë••ú²”Æ|ŒÌLµ¸ýKŠ€Y+ࢴü×ýîÍp¯=|¥½…óQñmKj¬Âá9²øµH·Aî7PÏ­k¹NEè¬'`m#U]FÑ™ÍÈLÊlØ–[,©Ç õu@Áîç‘W¬½á6/ª¶¶îV]áÞÑÚ?7!;% ªÔëûž‡G˜ O¤Á,ö˜ ¢žE•YĹ Õù4jcn“6íföÚSÏãâù¼í›Ô‡põÌtë3Nç^GQ•™3 Æ8©®=3ë0Hm\!E4šz‰•Ìr©&©#ä - nñ ª ØÛšÓ—! [Žn}ÈýyJŠŽ> ®Bß깚`Ì;‚Js} ÉO³œ|$îp tåí@…ŽXÁ¶ïJ„v3 (f=² 5ûL€ߥÒ-AR¢å/Xw…[Xo é[\É‚Ao‚ ´‡PZT³¾ Øö_ÿÀ<ä}ee@é+;tª¹+q ©ß_†TâçQËàÕd¹m`Ç*w1¡äÔGÈ*`2>cWA¾ïE\Í®+Xyw…Ê´é¿ÇB/8Á¾ÛxŽz†«W.î^NûÔóu™¤vapè A}åjC~k€æô2œ?M€,~nðX;®éÒQüç'(ª*ƒI°‡Mèløzæâç‘/ònª`+ï.°ÒÿŠ+‡ba”ºÁ¾ë½ð¿ ò=Ë‘‘«©›¶ò,rbNAk´ƒ]·¹ðý ôÛ_EÚÔŽåq€Ó+б£ŧ6 ¤\+ß‘ðqnµº_ˆÛ¿Ä^yÁÑׯÌcÐ4Ùd¬a7p‚Ôل¬ürÀ¦'üï {G„Lµ¸ý˘†¬Ý/ ßu BF„CýrK 5u[ض„Zâç¡Ã©ø¿H8—åЩçÖ‡uóÓ¡êÂçÈ)7ÁªÓtø]™n RÓËE–ǽG@‰B¸Œ]%¨2%ç¿FfbÚµÄRLkuë.Hm “¦ºîœ¡Ï„ºpr÷i0‹9&ˆ¬çÖ×Kܹ Õù4ÛÆfMQŒFh/ïEEßGáêë€â¤R~ cœT7qÎq†Žƒ»Añu–×®…-Ì#솽…î@U‰(<µY)¹0¬Ü ƒ•ÕH]Ý!•Ë¡”ë¡Ñè7È$€¾fv‚L‰´æa#2ƒ Õ0ב´ (Ì5!°ãXJƒÆŽáâ Gù©‹0 Ø €o¸ Ôÿ{W/×Ìò³@žÐ)¬I¿CwíÆÕ©Q’­m²Jd6Ö€. Ù ¨Ô˜¤¢Á}'³ú2 ÑÁÐÜyÓv|º8C{fÒÎg”ggBp~Þ}ú#7'ºîîKUJ3â`PQ¢€ýÌypör@~y1·y¿{4äM-D{—¶ýš6Ô³(ÖƒÐyÖc°˜R‘³g* mmZýtÒníLù(¿’í¿U%‚žƒ§3„ü¼¶•V“„ò¬‹0Pg§ƒ¦¯Wß~ÈûåPÝ6­8‹â+±–mZj Ç™sáâeui›ÊÓÒz ¶à`ƒê˜UH³ü¦<·Ža‹®íØ¢ö û—ø¤Ú66€.¿°É¿"6ýàæ]ìr\9[ó—…ú;ÇÖŒDì_€†ò˜• aTç º´é‹‘–Û†Š ‡ÐÁí<®üpz³Ê&öåÖêYÌñðšÂ½ÈºPsç=ë*ಾ=ûA™q:sëåÌNîr˜òO!/îªu2XÎDÇAË!«^Œ”´rñm¬•i bÝ©:ê À3bì³wB]e‚ÔÖ J9ƒµWŒµÜÄÖs«e{.hµ~Ä·±ºcrÔjžÞž8©fŒ“êF‡9H]"Ñé®ÙPeŠK1 û‰QùïHÞú; $¶Ap¯€¤z Ò³«œ«N½ˆ¸x •FØ]·%l€ÐàÚ?øV¢è—gž§«Yê„8˜G€‹ÓÐTÁC ÔÆÕœŠš›Ý ä[ÞÃ'A^IP/©n1c‚úä×(¿Á³û@“~ ÅI‡P”™Ý¦?ËK B9г ꬦ|”g—Ã;¨ ”²è&]ÒæBg¬m,=)Í¥?#y×aˉ©1“ZÚPÏ"UŸEÚ®UPØw„c×{à=q9°{5rŠtS3ý‹í€  ƒÇ€{àæÛJ+¦êjH$€^&ûkE3æ ,³^A]¡”jq›ZÙØ@€åD+®<-¯—ľ3¬PŽ¢¼’fOÞ¢ö cëû—ø†oI¢Èhj¾nŠ­çÖÊ,ö\pSŽ æ*èµ€ÔÆæÿß0’Œ±¿’T zLAÈ„©¥®Gâ‘è›= ša®LFÑñÏ`ã¿ Î; #;¤-„VP¨”€¹úJ‚#Ö @Wc½;ÇšØ÷tYa9‘ú8Œ9¿£T· Ρ].…{ˆ ô—÷£²f2A @â?ÞA^iÃÛªdªlÓÃgæ²h¤~÷'¬; ‚KÐxŸÂ=HùmÔZs{ÞŒmúoýùË -U73©D€ ºžÅ¡º’TèJRQ‘éÌåðDÞÁÄ[ú¤~»µ‰ÜǾ_û È=þÊJ«ëpø™Ñô_nd› -BM–í$´µ<­íæš¶ßÂ^,j¿h}ÿÍTƒPÙÙ@Àõ#Æ‚ Ì ³¸jm ²æëP€Ì;NJk`äGè=²þ廉ëÝquû«(QÏbއæ޵ ]žB£¥kžÌºÞ#Œærh«ÁÊR `„ˆ6&ªŠYw‚©pR¶ý©+dL²!>”‘݆c†ˆe‰(³¨6³Ž ‚ )@zcœT×lî@@äTÈS×!ñÈiÄI£Ü,êJÀ=¨3d©1–?#[…ÂÉÐǧÖû³2ÁT–ŒŠ²–ÎIÈO*‚Kçñp.QÀÙ*Ù éרæ²xT£?lݤÐ]IÿëÉŸY MگФý†l§ñè<ý>øwþ.ÆæÖ;×`2;XúRýs\ªÑv¾î ,Ý? õ€ƒP–Ñr.mõîÛý­vÿ¨]Ï …Ü{<|¨ã@­i­_HMMJÜÖù4§ùù´[û‘yÁÞE€îü6ä¤dZ¶…Z½××+™`6Ù@Òh›6½\`çå”'‰ïb#º<-¯—¹ü"ªÑöþÞä7ÝæEï­ì_â“ê u€•ƒ©äR@°ò„ÊY “.Ú*¸ù´Wû1棢 p âý¨¨ÔA°êdÙåº<« Úb5 ¯J¨ ¶PH.£(%§nynàa…ò2¬:Mƒ¯“¥NYºIÚ¹<-ݬmc=–!H²…9…0+;C^ï&¯øý¢åýKüÅh)Ê“®ÀÐ88ÛD~£yPÅqäeMAÇ~Ï¢ý„Ò )”ÞÃaF#i´¶Õ.®*ZãD8õWé$N°R¤ 0YÜRÒ¡áðÖJÈt&À¤†®¼&3õ 1ÇÃZ6áèW ƒÔöaÓáéPŒÂ£§,Ç1åA ãÓàÑzV";³ Êyð°)BþÉ–ŽbÚ˜ˆiHÔº ØøBåà•[8œÃFÁÞ&ù¿nFY5‰>&ˆZ–˜2‹ióí´^wí:Ve(Í,àþÔŒqR]—\Ùx:Š^è8©WÃï ?Åù݇a€2U8GŒ…µ€†â8äFmEîµþƒ&è.­C’|>:ô|Á=Sé)díÛŒ¢c˜*Ž!;uB‚ªQpæ\£»`Tœ|—*f·Ûd„X0ÃT~¹ÙQ€Øñ9$‚ì»?•¼æŽi&Ô±ëp5µq_?ªc?C®ËCð¼ã¸R%4‰Q’’3U¡âø«HÑ·o÷ǤLe±Èýý äd·aÜZc)ª‹K[»=(¾žM(Ï,„k°€òÌÆCž)!· …[·‰°RÉè /ŠCîmõ¶©˜ù§»2e®½_¬ÃÃèÒ0¥¾óÑõþÞâ|Ú©ý˜sQ°dƒ¦ÃsørøJkî‚V¥£LÝøaU=ªÎ|Ž|§á>tܩ²MSë%Õ¤‚møCp³–‚4—Qxx2kGnh÷ò´DƒŠã¯à²æ~ø„ÍC§)ŒI()¯nó~Ñòþ%úV5t©ß£¸÷Rø ‚²ß5|–Á\Œ¢è7 ½ãx x ®‚ †Ò¼š®tý…t³ûWí_kÎ#ãpŒBDZã³U—6¡ørvÃUÿõ,ˆ8’ÚÜ$è‚F# 2€ †â?‘ýë7ÈËÑ´¡€»0ÆcŒ1ö—H¸ cŒ1Æ㤚1ÆcŒ1NªcŒ1Æ㤚1ÆcŒ±1Ys¹¶Ì}8|úŽƒ³—'¤‚ ÆÒXœü¹YeuO6JýàsÏ›ð²køëÊèÇp)µÂòÁ¶áóÑ¡G?¨”€±äòŽ}ü¼Ê¶=!)ó€sïyðî+`*CáŸ_#çJžåikY0:Ü· Ž©+qáøËgVáè0e)\«¿Cž=¨6ògŒ1Æc·*©–xÀuàtØi¢‘•ƒÄÎ}îƒ÷Xtß½…⪚Aƒ%dR@{~-®¤”Ö$Éf˜+kß¾'…2ô„ö@UÜgHÉl#î‡ïø§aúþmŠ}+ž`Ç!«X‚‚ck‘^.…uнð¹ ÓR\¹ª¾þ7RO¸X7ùŸHûùWN¨cŒ1ÆØ-NªÍ¹Èûå)ä›5‰r*4Þp˜Øö WÕ¼ÆU°‚La‚¡0š’&Þ„&õƒ[Ï. Ì H=uÊ °žù¼ºø¢øÔUQcz öCàd‡Ê£+‘y© 2?pùüûANæ^4x±¬àÇA/Âß;¹?‚â*~÷cŒ1Æ»yšïS}-¡RWHQÆP/%w€\j„Yê¹âúü\PÁÞФ\†4l9z>ð*<­RPR (|:A&ˆ)¢™[/¨‰’¬Òº2™KP~9pê «z3ì`×ïE…šP¸ÿäðÛ­cŒ1ÆØÍ%ꊇaè8¸ô_GayÝ]_Aa ³Æ»ao¡»PU" OmFVJ.Ì+7È EeµRWwHår(åzh4zÀÅ 2  oõ&²2{Àœ®þÄ&Õ% xB©”z˧òà§,—¡âÈdd”ó›mcŒ1ÆØßT ºD¢Ó]³¡Êþ—bQ?­¥òß‘¼õwHlƒàÜk!:_Iõ¤gWÕ›RªS/".^C¥v7q…Ì%çQåÐv}çÂ5 Kõ¼•cŒ1ÆØM%i1¡ö˜‚ɳ¡L_ÄèÃÐ5{WÙ se2ŠŽ†Âj{8uî ÒÂ+(TJÀ¬¾²$XAa­t…0ŠéP Œj5 q²Ü‘¾F ™½3¨ÜÁ6íCÊÎw_Ý&= 7GoeÆcŒ1ö÷$Ղ͈œ yê:\:½¨' ÎŽªS ®¬ƒ:×õŸ¶ …“  ÏN…QTß ‚±ð ªág'\ë=-q†C°PzUZj0=UÇ!sÏZê{ ÃøypPñpÜŒ1Æcìæi¦û‡6=gÁg‘~)2Gÿº EÐVh@°‚MødØÒ ©¨)<`:n*5Š.ÕŒêaÊDal"<?„N}ÈËì"æÁ‰¸š˜%jä õd§NDРgá‡()“À:x&üܪPràК›¸<ÐÆ!ó·m°žz‡Ä#þÀ ¸ƒ5cŒ1Æ»eIµÄ6ž€¢:NêÕð»ÂOq~÷a „LÕÎcác­`€¡8¹Q[‘{­?µ ºKë$Ÿ=ApÀTz Yû6£¨¢ ÃÜ‘e‡_Å•êà3à¸Ë³ú" ®CvººÙŸ™KGZL?tx?|½Ï#-[Ã[œ1ÆcŒµ;à2cŒ1Æû+¸³1cŒ1ÆcœT3ÆcŒ1ÆI5cŒ1Æc؈gí IDATœT3ÆcŒ1ÆI5cŒ1ÆcŒ“jÆcŒ1Æ8©fŒ1ÆcŒ“jÆcŒ1Æ8©fŒ1ÆcŒqRÍcŒ1Æ'ÕŒ1ÆcŒqRÍcŒ1Æ'ÕŒ1ÆcŒ1NªcŒ1Æ㤚1Æû?öî=>βÎÿÿëžó)39Ÿ“6Mš4IS(mi TzJA ¬[TX¿Š®®Š¢ü°è~WQw¿¢à~ý®+.VWô»â"»œê¯,§¦ô64mš4§I&“ÃLf2ç™û¾$=§í¤´¥ÐÏóñ˜‡6½sÝŸëºï”÷\¹æº…BBµB!„ª…B!„ª…B!„P-„B!„„j!„B!$T !„B!$T !„B!¡Z!„B ÕB!„B¼·™dNƈ¹êæ._‡;/E“ ´ãÿó?â¦cÅFš®jÛ7Ù÷f/Ú9½RŸ*ªÐý;‰&´s|WœÇs !„B¼wCµSñ*–m ¿¬£¢’ îbäŸáóN ÎUT|øÛ”åûݑ͟b_÷äÔ®–1çÒ˱[!heøÕŸáŽiçB东škoÆéÿ#½oì&¥Û0;]¤êô FWVƒ-/å—cÈÛ@íuËþaÑDê=s.!„Bˆ÷n¨6”P¸ò6rb›xq?iC%ùK?Bùz;Éß<ÂxtzöR±b2B¢í{ì N‡d -=”º±6|ކå5Dwÿ„®ap-úK*oøkÔ§¾Ãè¤zÁŒÁY‡Í&ðæ÷Ï,5RO{ -Ø‹*÷’B!„„êcó¢áÿø,~-3”w3+ÇsÓåxÜÆ£‰éPmÃdQIv DNlÇXEÑâFôÇén}ƒ´£iwÜGYc%ã­}Ç,™0V}‘K®Ñèúå÷ §oÌŒ¥êz*¯!·¤#@z”pÛ÷éÚÙ?ÕŽ¡ÏâT6_†Ýª“ î`¤õçøúǧú¡¸ñ¬¸ÊšlN  †Ûký)ޞѩcL ÔÜùÖ©³}à Š¦+H´~‰·Ú†Á¹šwÞƒóPi¾GÙùÌ›'kCþT=M—a·) 'HMtÜú „³¼BÇÖS|óºL=ÐöbûÔy nrÞEeËrœz¢Ÿ‰=¿ ¯­ƒŒŠóJjoû®ðÖŸ·‘ÖAq,£æ¶Ïá:ø{_m'cÌò\B!„"‹P p8P(…#;*íš<˜Tc.fK‚t*sLн· bÛ`lz…Ë,øþø8q˜[Q‹Ié#•Õ#–ºûh^³Ý÷¾-{‰Ç’(¶BŒáÀt0wâ¾bóU­?ÂTpÔßNÅúM˜Ÿý*}ƒQPlØÊ›±«ÏÓûÜ.RJî…Aé5Ÿ'ýÛM ‡2éÁûô—ñÞBýÚ›ÁH:ZlljLâ­t?u£!ük lÆšä¬ÜÄü&…‰í?Æës1ÕW¯ÇkGg·üå¤õ€ž¹6\˾NÃÂ4c[Ã;Ã\q#Õ˾B]ò~öwŒ¢G_£÷¥š6|šyþ¯ÑÙ‘"Õ'ÉOü‰}[ß"£g{.!„B‘}¨>ŠÁ³š¹W-$õÖß1:­‹ -–!gõ#\¢€í`´õ ¼]>4@±a"A$žÆXXŒÑlÆjN‹¥  “RÙ$5Så+—bð?Iû³/œá³sŠkù$¶?@O›  ä›ò¥Ëñ mæð"Žè^‚ý»QÉ€÷É/ó࣓"BµDÐÉ ·üC‹‘šˆ!I:3sÉŠór*š Hîzƒ;¦gä-VRW¯?aГƒqz#]COÇÑ'îÓ×£8WPÙR@xËè;0½ ÇïE/}œÚ¦Ë°ìޤ¦“ñþŠ®u4]ñ%jò#äV0øï¿'’Ö³>—¡h#-7_‹y¦N'þ̾_ÿ”HF~°„B!¡ú踆±àzjßöÁbßÖŽcf+õÐstþës€ƒ«ŽüËîa0Äï§w0zÔ‘)¢­_ew»t$CÎ1!í£,¼y=–£¾V÷/§þOl3ûþí ¢Îz\6ˆmÝ6c ž þMØ 1î92¬ú †(¯kÄjÚ’p8ígu`ÏBì„ ôûN³+ˆ×UÒ0ÿÐb’cÿñ9z‡“³;—bƸú1–¬>î/ce˜ L[’ØÎÒ_ù]ª”ØþþñÙ}Q þ‘Îÿû2ÊLŸÌTÃ$d:[!„ª Ô%·Pã­˜º£ã¿·’:i:ÔÐ"Œ½öœÕ›È_0‡þÁ½è‰Q2ذح …HE%‹ÃÉQ2hÁÿ ó÷[PcéFVjô?ó "i@›$™™j_ÐÏÅ~!:g¼ É)¾OQL(hè§Ý‘.El×?°ÿ€ej=E*0» «( aÆ_ú.ÃÁc£ëj„£Wå(ÎFró  ƒ­î}8ÚM$5‹ÈLžd=¸®›K$„Bñn ÕŠó j®¿s÷èøïm¤³Ù®X9öY2z¼‹pŠë`êÞ:µn×Ö@^¤Ú»§×ñNL`tÆÐ5d ŸøÑÙ0ÖE4 K°vožq¶Z í%Îrr*‹QF¦–`,ÁS቎©p~Ö÷½K£ª€ÙƒQõ¨@©EºI±Wiʨÿù[Gèdrâ4§ÒhX1YN|^6ÑNœå¸ŠŒ$žb¿ls e×} ×ø/yë•U7œÚ•{yëå]S×"‹sŠþR–!„Bdª­8ßI.;èÝçÇ”[}äÀô‰É:6œ-Äî!6E·”àn¸•"{˜±}ÓkˆÕFwuPrÕ½Ô.µ0쇜EñÐA_‡7û‡¥¤»ðmÛMþªÓxC5Ãû÷§Q,ùX Œu ¡EÞÀÛñA–|‘yÚSŒ Øë?L¹'Àè³[§>y¶Cµ#)o 3wb1v2v`mò5†½·0÷òÏ3GÿÁI#Öò58€3ÙùY‹v‘ÈÜDÞ²QhÜCÚ‡ÍÒÅhç Zt+Þö›hXô lÿŽ¿¯´fÅâ)$Óó<p³ìs”»¶sð©ç‰Ç ÷åKi^û?¨îý2ûÂÙK–!„BœÀ<|ÂW …ä-ûW¹ ë(n:êUâctšâÄ1g% ¯§¤i5óbÍìcäµÇì?´gµŽ:¾“Étù‹>HIÃRì™ ½ôcF3¬V#¤'º‰Ž3ë :êØ6ci¬å+(j^Gáü+ɯž‹)ÙIÐ;ŒFš”·•˜RKAËM×/ÅI'þ-âõ†¦šQœ¸×ãQß`¸shz6»˜üE«0¼ÈˆïH°Tœ—R² ‚ľçÅN–52c^”¢¥7­¡ ¦s|/¯Mx Õu E‹ÖSTwsƒÝ:ð£#ÑÙ]©Ì(ÑIÎyk)n|5ó1Å÷ôú§ú>ø:ád.9µë(i¼š‚ºËÉÉDßV"qcÉíÔ¯ª%´ù{øFScê$SzeõN&÷·Ys~ªsi 2ñ Ò±^‰8²úC!„#$·Ávo éö;H¿x=!„Bˆ÷“ Á¹bñ`ÎÔ ‰xÅZIî¢Û°§Ûðùc2ŹšwÞƒóÐ|²ó™7Q/‚¾ !„Bˆw$T+rSzù-Í©ÁlTÉ„; îù ÞŽîãÎòöò6P{Ý2‚ØC4‘:'ÕãÛ8ø»ƒŒy¬½ŸÒ»í&oí7©™Wxx_<ÀÄÞßâmïÈîqíïDßÍÕ®øåóçc1jdÆßdøõÁï ù$ªâÂÕò1æ\z9v+d­ ¿ú3üÑ#Ç«¨øð·)Ë9¶ùÈæO±¯{òØû#wsoø+ÜÞo²ûåNäí€B!$TŸ-=먻õnÜñíø^{šHÌ€¹ ™»ñÝ»_ˆ%Œ‚!F*sò!1¹ 1ž¢óåݨ¶Ê T-‡ùktlï¿ð£â&ïêÿ—¹Õ>†_þ;‚îK>Få_Dêoñ‡2€kÃçhX^Ct÷Oè×¢¿¤ò†¿F}ê;ŒNNÏ×+VLFH´}ƒ]‡žŒ©¡EŽ<R±Í#ч¨¸ä,@F~Ž„B!¡z¦–KþwáμÊ?ü˜Pb:E÷·2vôq†<‹7RÙ|v«N&¸ƒ‘ÖŸãëŸ cŠÏŠû¨¬©Áæt j¸±ÖŸâí:ÆÔ@ÍQ`j²øæ'(>”{¡íÅö©åÖzJ–ÞH^EöF@ŒÈÖ‡Ù¿{ú‘ã§«g6RÃÄF{ÈQ/ZÉãÔÎ_mW?15Ës®ælû~:¶fŠç:H¼ùc»|è@4˜Æñ‘/QÒTÅèë=hÆ*Š7¢Ê+oí›z³ Ø0YTÒ£ÝÄ3=õÑŒ½å“TVzyéq,+?Cžü !„BBõ ì )ª4“Øþ„'‹£NÜWlb~£J õGxƒ ŽúÛ©X¿ ó³_¥o0 Š [y3võyzŸÛEJÉýð/(½æó¤»‰áP2=xŸþ2þÂ[¨_ÛBxó#øiôäèáP©8š)jZûEßV/锊bu£ǦClõœ1MÕ@1dß÷ljβ泥Pcñ#>5@8yÅéA·×ávAlÛŒM²p™ß'0s+j1)}¤tÀäÁlÌ s1[¤O˜ÒOÛömÛt0ÕPµB~ˆ„B!f ÕGRÄFÆN:ë¸VPјObûô´yÑÐàJþ·)_ºßÐf¯Žî%Ø¿˜ Xpß±‘ü2þÐ8:)Ò¡!TK ™ðñàÉÖ§ˆwÿ™À`âÌê9“e+&ŽêPYe&Õ±„:Ûs¼ffÕ÷“Óã]„'¡tÑ܃¿#U1ºÊ°š´EÅV„‰‘xca1F³«9E,–‚‚"LH© X\h± 9«áôh£­OàíòµìEž$„BqÚP®¡Ÿ&:Tš"ÚúUv·HG2ä}BÏÑù¯Ï ®:ò/»‡¹k¿ŸÞ·5Û/„Bq‘…j-î#{aŠ×w–ç%õwÇDçøoØ¿¥L&Jj2ˆª]ÈE먣ÏÒõëç0: 1’¨¦U4Üv;zÿàÔ sb” 6,v+h!R@ÉÅâ°@r”Ì Ÿ¾ÔÐ"Œ½öœÕ›È_0‡þÁ½²Ã‡B!Ä Àè _MtÕ±5ß@ŽU™ñµÐ^âxÈ©,æðÆ<˜è 9Û-!´VL–3{ͬêÑU4 091('i0=J||€x(pB ¾Ðú~„Šõ“Œ;È_y3öÔ›øz¦–ðèñ.ÂpÔ-Àt¨h[yì&sÒu>ò| !„BˆÓ1Ý@ѱ!oŒ±WŸ¦ð曩ÿ “¡¶×ˆDULîZ\Ž} mo'yoÇiXòEæiO14`¯ÿ0垣ÏnZS¬Ì"WF»Hdn"oÙ‡(4î!mÈÃféb´s0«ÙQ=›z%1††ë)«N»°0Ö5töÏuú g%vOö¢ò›®ÁíÀÿŸO0Ÿ.F`tW%WÝKíR Ã~ÈY´ôux§ÏcÃÙòAÜéb“QtK î†[)²‡Û×w¤£›Çƒb,ÃlÅVŠ=?šô“ˆ&å§J!„e¨Þ·‡ƒŽ6ú{öÿßQ*–¿ŸâUŸ§\=ÞOhßÁ©Ù]=Êäkß +ñ1*/ù4uP'vá{îg ÉÚÛDý/¿HÍŠk˜»~ha¢û~ÌøA²[y1›zRD·ÿ3þ¼OPü¾¿¡XŸ$Öñ¿ teb/´¾›±_r?Ín2á^&{Ÿdÿî-LF^Ø­’Ü÷ö›?Ɯşdþ¥ [ñ>ûcGïQmŸCþ¢õT8,@šôøn|/þ+¾£úeÈ{?õ·lÀrè sþŠÆ9 v‹¶Í²DD!„¸øw !„B!έiÈÛ@íuËþaÑDê‡tÚzÎâ¾ ëÉö>3ä®bî …ÛûMv¿Ü)³B!Ä™‡jÅ³Žº[ïÆߎﵧ‰Ä ˜ šÉ±ß¡ýB4RO{ -Ø‹úvb“{%Å!ÂCFÜWa{ëwÄÕ‹árŸ½1|/Ö£Øæ‘¿èCT\r  #ÿ>!„âm…j%—ü+îÂy•ø1¡ÄtŠîoeìèã xo¤²ù2ìVLp#­?Ç×?~$wgs̱'ÇTv; 7Ü{¾Å¾mûЫYpç=8â{”ϼyb3¸ÉYx•-Ëq:Lè‰~&öü‚¾¶2‡OfÆ6¶Ðqð µ·®£(ÿôNϤ«©øð·(9ê‘Û–%4lüLo|‘½{üè¦jî|ˆëÔ·ßüÄá'çh=Ðöbû‘ÚÊî¡åãŸÇdm²‘7~Â`ïÑãsšš7ž÷QYSƒÍé@Ôp;c­?ÅÛ3:ÕNõhÎ,Ç3–ªë©X¼†Ü’â©uîéQÂmß§kg? 8–SóþO癪G‹vØõ/ tôNýãlÖsºû'›ñÉŠ{Ë'©¬ô2òÒãXV~†<ù÷A!„o+TÛRTi&±ý?'NKœ¸¯ØÄüF•@ëðõ·S±~æg¿Jß`4ËcŽfÄ\õê¯[‡¾û:ßÜ7Òâ­t?u£!ük lÆzl¸–}†…iƶ>†w4†¹âFª—}…ºäýìï˜XÆr ê ˆïÙJ"hd,ø!JæWáíÎþ×ü™¼Oá-Ô¯m!¼ù|4zrôØ`ÙÁÐÖV™r~”²k?Gêß¾ÁHXÍ®fņ­¼»ú<½Ïí"¥äá^ø”^óyÒ¿ÝÄp(“]=Y¡KÝ}4¯YŠî{ß–½ÄcI[!ÆpàðøèÉ^Æßü?ŒE'P7Ά»¨¾òKhã_ ßŸ:‹õdqÿd3>YIÛömÛt0ÕPµBþqB!ÄÛ ÕGRÄFÆN:Ó§¸VPјObûô´yÑÐàJþ·)_ºßÐfÒÎÓsd¥­{ãg¨½²‘Øßà`ûQË´©‰’¤O’‘ç *[ où}‚Suû½è¥SÛt–ýÏ‘ÔÀw%ùΆûèLtù¨l¾{k7Ѭߟ"BµDÐÉ ždMõäÆîB&ƒrïø(enFÂÁìj>ÔNt/ÁþÝSí,¸ïØH~™h=›z²CLu”¯\ŠÁÿ$íϾ@òdï2T?¡ƒþÌْç !„â,†jt ý4ÃàiÂNˆqïÈ‘ãT?¡ÁåuXM›Q³8&u(9—ÝÂ2±­_¡«}hÖñFñ,Ä®˜1®~Œ%«ûËX&$53¶ÚË1?ÃDtêÄɾ×I,[M~î¯‰Ž¥Ïé`ë É ØœN‚YÖ|òvNûY­OqÖã²Alë¶“j@±7Q²âÃUÎÁjSPãq H™LgµÃlîŸó0>B!„³ ÕZÜG öÂ<¯ïüÌß…^e4yEË>MÅøwœ<ñ¼§(DQÂŒ¿ô]†ƒÇ†c]ÊÆò梸ïfÑ'î>öûç”â@G£áìF¡¢ë (³¨yÆ}æô3ŸT=å÷M½™B?ÅA†Š×•J÷|¯ýÁ(8Z¨ºîvÌg½μ“2é,„Bˆóhæ­FulÍ7c9Zj¡½ÄñSY|$|KðTx`¢ƒd&»c‹íÂû§¯ÑÓã¦ô†‡¨ªtÏjÓ¨*`ö`<î/µ‰vâ¸qI‰õJ„CS°s]F^Î8#Ï?È[¿ûÊôë!Œ`w)V EI%Áà®Àtº“µVL–3Ûa9›šg×`6õœ| õXÑ8–LÅŒoÃÊp($÷þš¡®·ˆŽ÷îšzp–ë™Õý#„Bñ2ŸðU=N|Ü€§e¥s+!£¢ØKpV^EÑQßZj„¤ãJJ­À®M¢[ç·ô^*JŒny’@8 Ù£8q5®Ç£¾Áð¾N¢}­$Ü×Q¹l ¾Îä1 5”¼UÕÔaL §waŠx`==BÒºœ’–ëðähhŠ ³»šœêK°ÄzH¤ Xëþ‚в_{žht’Lb’L"DZi¡¤©†dç¢É$ªéJêWà0NÁ…­°™¼šùà}žÑ‘#®ÔužæUäæ›IÇÌy È-ΟD?º_ÓËYŒÅä/Z…yäEF|á,jÖŸ“´“U=ÙŒ¡6AéqâÞ=hU¢¢©€Xçv™#,3æE)ZJqÓ jê1Ç÷ðúÑH“|p2—œÚu”4^MAÝåää@¢o+‘„‹Üå!/ùŸx;úŽ™Ö5yÍWa{‰±@ul71ã\ò›n xÁ* jæB¸›P׫„CÉ#ߘ%:éÂ9o-Åf>¦ø^‚^?ZVaï45ǵمÆSÕC6c¨£Žm#0–ÆZ¾‚¢æuο’ü깘’½Ãhz„˜w¥p9Å‹n¤¤i …u c„{^a";‹õœÁýó6Bµ¡à6oý”-X†Ý†Ü%5­£Àñ#³ÚžO!„Y}*„B!ÄÛb!B!„BBµB!„ª…B!„P-„B!„„j!„B!„„jq~(œÍeÎ¥5ró!„Bœ×Pm*Æ5g NÛ¹>‚±ânZ>ñMKç^¡ï¼õýhÞ­,¼÷§ÔU;§¿àµ`=E•çà1îç¨æ‹ùz]D}B!ÞÑÈ7ãWmK˜÷ÁO‘ï¶ Eû˜<øƒ;þ›XjöÛZò6P{Ý2‚ØC4‘š}•Y×£`tUa5XÐòr/ˆÐ÷¶ûþŽ2c›w%¶ôn†cEÍóõzw÷]!„¸CµbÌÁê¶ßþ=ú|:–Â%_öW4UW³ÿé_1™<¿Ï‹É¾TçßÓ(E ö"–~›ŒeäÏ/Ax’HJ—š¥ïB!„˜M¨>D $â›ßn‚ýÃ,øð]Ìmy™ö7ûÑűœš÷‚<Т]vý ½¨:`j æÎ‡(°NµW|óŠ¿=Ðöb;j6ídQÎÕ,¸óÿÒÛ÷(;ŸyóÄ`m­§déäUÔaÏñ`4Ĉl}˜ý»§smp“³ð.*[–ãt˜ÐýLìù}md×cÆRu=‹×[RŒ =J¸íûtíìG˲ï ð,ÞHeóeØ­:™àFZޝüÈ£.OW³ãJîüÖ·¢ýõžéG€;ð\û8ó‹^bï¿ýŠØ¼Ã0ä^IANŒÐw8Že÷ÐòñÏc2‚6ÙÎÈ?a°÷¨šOÓ/CÁÍÔ]û~Ü96´h'ƒ œóaÍô0òòÿb /8‹kqúšÏë½jÈŸê{ÓeØm è R]·þ#áìêÉö^Íözò_óx¯Ê¿¹B!.ÆP}4=ô ÃCwP[{9¶ýÄUГ½Œ¿ù‹N *nœ wQ}å—ÐÆ¿@¿?™¼Oá-Ô¯m!¼ù|ôT{ÉÑÃÿá?m;ÙÔo¥û© yä_óe'é‡âh¦¨i ìÿ}[½¤S*ŠÕ›þ¾ ײ¯Ó°0ÍØÖÇðŽÆ0WÜHõ²¯P—¼Ÿý£è±ÔÝGóš¥è¾ðmÙK<–D±b ¦BmV}wâ¾bóU­?ÂTpÔßNÅúM˜Ÿý*}ƒÑìjŽw0> s«aÙÚCBLexŠ-¨C;IžÑ”½Ûü•XR;a)AdC[[IdrÈYøQÊ®ý©û ìAí IDAT#a5«~)ŽZrrøþ량Ïý óÄ~þ[$æ}†¹«n&0ø3"™l®Ev5Ÿ¿{ÕAÎÊMÌoR˜Øþc¼þ8S}õzܹv”0z–÷üéïÕY\¯S9Ÿ÷ªBq±‡jHŸ€’ ̈«€ê'tÐøˆh@ÁS÷rJóQüÃè¤H‡†P-t2dÂCă3„äÓ´“U=驉’¤3§ëKŠx÷Ÿ &N ÝÎT¶ÞòúLÏ–ú½è¥SÛt–ýÏ‘4ÔQ¾r)ÿ“´?ûImæsœ®ïŠkù$¶?@O›  ä›ò¥Ëñ mæÈoñO^3zˆpg7\µ’Üœg©(®fÜŽ4‘žþ3[cª¦°6ŸLߢ3½¯™ÜÁøÁ]¨ÀdÐAÌÍH8˜U¿¦jš$6ÒIXïA[CÌßA(³Ÿêºj¬f…¨5‹k¡eYóùºW—SÑT@r׃ÜÑ7õËb%uõúcØN[O×}6×ë4?çí^B!$TŸH±7Q²âÃUÎÁjSPãq H™LïH;gƒâYˆ]1c\ýKV÷—±2LH9ëqÙ ¶uÛIuv ž&ì„÷Ž QªŸÐ`ˆòºF¬¦Í¤ÒÙ´¤’î{‘É+?IÁœ"ü»G0—,Á¦`È=³ÚòW‘çˆ0±ÿàiC¹žð‘Ì€ÍéD!˜U¿Ž™KÕu˜þX©®«è@ÉîZ=þ§ªù|Ý«Šg!vÂú}hçñžŸÍõzgïU!„â¢Õ6¬¹$­†Š×•J÷|¯ýÁ(8Z¨ºîv̳ú¯õ™¶s\=‡ÚÛ ÕŠ‚B˜ñ—¾ËpðØ” «Rmê4ú…ó m=ÞÆÈ@ŠÚ+±½õ¶Ú9è#OIœIV —cN¼ÉØX6³*ºÊo·¢¡kÚ^‹,j>÷ª¢˜PÐеsqÏŸ­ë%„Bˆw,T+î•”–I¶m›Z£k)Ã] lû5C]S!3l'•áÄ` %аb²Ì°ÿ­i휪žÃÒ¨*`ö`T8惎YÅ»‰vâ,ÇUd$y°wæÙÆXÑ4,ÁÚ½ùÔ³Õ§è»ÚKœåäT£ŒLýJc ž LtÌÌ¢p=L¨íÒ7­¥¨Âµ"¯ìæŒ60Ï¥p®›LïËÄÎ`öq¶ýRÈΟNçÍÙ^‹lj6¿{U‹t“b)®Ò<”QÿÌïñÎðž{×ˈ¹üJ*Âí/žé“«çë^B!.¶PmôÔà,É`ο”â¥7àœ|ÎÝýÓÄó39ž†[)žÉHÅV‹e†µh‰ÌMä-û…Æ=¤ yØ,]Œv¢Í¢SÖs8\ƈûÇ¡åFÊ›ÂLÄXŒŒ"›•zt+Þö›hXô lÿŽ¿¯´fÅâ)$Óó<Ò]ø¶í&ÕÇi¼¡šáý{ˆÇÓ(–|,†NÆºŽœë”}¼·ãƒ4,ù"󴧰טrO€Ñg·Î:k#ÿ…?¸–ÊÕwû8è ÑMa,\M®-Dp/g²ºEÏ¢_Ƴu-²©ù<Þ«úäk {oaîåŸgŽþ‚“F¬åkp©3¨ç¬]/Ó<Ê×~”";Z»ÙýßN8ö|Þ«B!ÄEªuu’d8Iþ’/Ó¸´X?“]ÿLÇŽ-Dí ­ùyþ˜®¼Ò5R9µ§j´—‰ðq¿‚N´Ñÿò‹Ô¬¸†¹ë7€&ºïÇŒDË¢¬ê9,M|×OðÜK韣Pëøßº†Ð²úŒÉ7fßäT.ü 5õ6@C íÁ7ø" *É}òVì*¯¦|õ5S3¬™ÑÎ'tu®Sõ]2ùÚ7èJ|ŒÊK>MÔ‰]øžûCƒg°Zó1¶­•²ë.‡ƒÏŠŸIÒ±ãXp¦ØkŒÎô g«_Ù\‹,j>÷*Ú8c›¿…ñŠ»)[ñY •tpxjŸ~?;gëz©#„F)œ¯yý|Þ«B!Ä{.¯÷ÎKÉý€Þü‰ïë•…–3kòPŸ·ñ—ú¢•ótû¥ßxÍŠ{ƒÞ|ï“z}ë¢ë»¼ä%/yÉK^ËË$ï)Þ,¥8sí`­£øŠaîý!þñ3›e6–¬ÁcgìÀÚ»¤ûVÍ6 ÖáL ’ˆ'P¬•ä.º {º Ÿ?öï»Bqñ’Pý`È¿‘Ú›Ö`Ñ'‰u=ÉþWw>£5®N\ .Áy‰ñà»e´ ¬fƒ{ÙUTÌ«ÂdôÉáWéûÓoÄ´÷vß…Bˆ‹˜ò 3!„B!Þƒ B!„ª…B!„P-„B!Ä»™xøÜžBÁXq7 ÿŸ¿¦ÐØÆøÐÄIž2WŒ«j椟tæÜ,óVœ«i¼û2wÉ­”/¹•òò~üC3Ô“eÍïZ6œËÿ'‹®¿“ï‘sô8¼ópM…B!.¦“emkóßÒrEõ £v‹¶Í{g±}—‚ÑU…Õ`AËËzÆ y¨½nÁ?ì!š8n;8ÅMÞÚoR3¯ððÔº:y€‰½¿ÅÛÞA:Ëbôø6þî ckï§ômÖüîeÁ’W‚b0`wZ€ø99Ë)¯é,ߘ™ë¾Î%kÌôýúëŒF´w¸!„Bˆ¬Bõ!½ üñŸµ[—žôÏr?\TçßÓ(E ö¢ža™&w!†ÀSt¾¼ÕàÂV¹ªåâ0ŽíýÙÕ¤EI£`ˆ‘Êœëš/da‚/}™Ž\‰±Ð}{Z*š1·“Œ¡¦­¤R ¦ü…Ø“û˜ŒfÎs;B!„gªã$ƒýÄg˜dTœWR{Û§p ü€·þ¼´Šc5·}×ÁGØûj;ªc5 î¼ç¡oò=ÊÎgÞ<6¤š¨¹ó! ¬S,¾ù ŠEÛžGh{±ýÈñ©ab£=d€¨¿­äqjç¯À¶«Ÿ˜  ð,ÞHeóeØ­:™àFZޝ<ëåŠ3‹š0c©ºžŠÅkÈ-)fêIÓ£„Û¾O×Î~4Ç•4Üù)¬o=Dûë=Ó¡ßçÚÇ™_ô{ÿíWS5gÃZOÉÒÉ«¨ÃžãÁhˆÙú0ûwO/_1¸ÉYx•-Ëq:Lè‰~&öü‚¾¶¯¼°]Á‚~×Ñmþ/v>»ãHÿ²içt}ŸÍ5=åÝYMÉÕ÷Sâ éBSM_ÿž7©ö£ÇP<ä¾ïajç+^|˜ÞÞ£–ì̦!„Bˆ³ªON¾FïK 4mø4óü_£³#EþªO’Ÿøû¶¾5Àâ­t?u£!ük l¦†2=xŸþ2þÂ[¨_ÛBxó#øSSãzrôáKES5P-qâ¾bóU­?ÂTpÔßNÅúM˜Ÿý*}ƒÑìú•MͱÔÝGóš¥è¾ðmÙK<–D±b ¦Z¼ƒñQ˜[µËÖ`*ÃSlAÚIrÓߊ£™¢¦%°ÿWômõ’N©(V7Jpl:8Úp-û: ÓŒm} ïh sÅT/û uÉûÙß1:u\rŸú FP (¸öËÇ-ɦ,ú~Æ×ôø{ã Þß~–±¢F .¿— LÿLç«û‰ÇŽ ÂÆbéoØS¤CC¨–:2á!âÁÓ¬¿5ypT€Ê*3©Ží$TP\+¨hÌ'±ýzÚ¼è@hp%ÿÛ”/]Žoh3©l¦«³©ÙTGùÊ¥üOÒþì $gJezˆpg7\µ’Üœg©(®fÜŽ4‘žþ3XR’"Þýgƒ‰C·s•-„·|¾Á©0é÷¢—>NmÓeXö?7U£ž 518õM†ô ý˪C}?“kz²79™†²ë(Îïfp›FÙe×áêÝIX;1€mþj¥B¸ýà A9ëv„B!Î~¨îeà™Ÿ2yhMµ#yL6JÛùCú+¿Kõ‚ÛÀ?ž:wÕ–~–KïýìôbÄ:Ê­]h€ÑÓ„ãÞ‘#3”ªŸÐ`ˆòºF¬¦Í¤ÎÒ“œg=.Ķn;I¨PI÷½È䕟¤`NþÝ#˜K–`Ó0äžÕaQ< ±+fŒ«cÉêãþ2V†ÉÀ)êœ];©¬ú~YæRP[Iªýïð·«(u_'¿v.~ÿÞãÞ˜¨¤‡žÃ;ôvÛB!„8ë¡:Nr¼‡XêT³‘Ü<è`«{Žö_9~Jølí¦6þöoi#“‰’š ¢jçp›¶S6­Mýµ~êóëñ6FRÔ.X‰í­—°ÕÎAy‚HâìÖ­( aÆ_ú.ÃÁcß9èjä4Êœm;Ùõý¬IuÐÿûÏ` ¦)øžþ,¾t|ö·ÔÙjG!„boïá/æÊ®û®ñ_òÖïŸ ì¼Ú•—`:aº4ª ˜=SëygÌ© 4¬˜,§()=J||€x(pB ÖB{‰ã!§²øÈxÆ<˜è ™9&!¢i€É‰á¤ûå¼f=ÖE4ކ%XO5‚z˜PÛ+¤=k)ªXHa DöíÎnÊ,híÄqã*2’ ?ꕇ²^3œM;Y÷=ÛkšUa‰©ë…Ž~Ò lÄ\¾žÊ˯Çí0¾v„B!fï$1`*^KI•‰hšÕƒÙ>ý²™Ð’qtä¬xš²½ô<ók&'{™œœCÉÒõØÆ^&JfPòVQTS‡1€œzÜ…)âÉÃÁF×mxšW‘›o&S0ç- ·8C||]±ã\°\­•áÎÁ™Cbj„¤ãJJ­À®M¢[ç·ô^*JŒny’ÀÑû¢a(ZCau†èЧwAú˜zNY³6A„¹÷‡çvg”Ó§h,ó>L‰{˜hpCñzŠÝi"Û½²O³B!„„ê “!ÿFjoZƒEŸ$Öõ$û_ÝAZg/µÉ]†{áu”Ø-er÷côœ_U!„B¼M²üC!„Bˆ·É C „B!„„j!„B!$T‹wˆ±”‚e)¯ô Èh!„BH¨žS1®9KpÚNÖ}cÅÝ´|â š–Î}÷ Òiûu|¨® ðÒkÉ˳]õ!„B¼·Bµkó·XzïƒäZÞƒÎÛ@íu£ ÇtòPíªÂj°`ËË}×Ìâž¾_w=B!„犤i¤:ÿžö@)Z°WŒ"„B!Îa¨6àY¼‘ÊæË°[u2ÁŒ´þ_ÿø‘}ú ùSÇ4]†Ý¦€ž 5ÑEpë?20Îî<ŠÏŠû¨¬©Áæt j¸±ÖŸâí=ê\§©ÇÔ@ÍQ`:¼øæ'(>£{¦ž,¨9W³àÎ{pjÓ÷(;Ÿys†`mÆRu=‹×[RŒ =J¸íûtíìŸz ŠÁMλ¨lYŽÓaBOô3±çôµu™ÍF†–ŠWn¤t^ §H^¡çO?#œÔ³ê— `®¤pùÇ)o¨ÇbPI†0©Ù\Sc5þÅ#ߢmóÞ©~Z–аño0½ñEöîñ£g[B!„„j'î+61¿Q%Ðú#¼AGýíT¬ß„ùÙ¯Ò7ä¬ÜÄü&…‰í?Æës1ÕW¯ÇkGg·I¶bÃVÞŒ]}žÞçv‘Ròp/ü J¯ù<éßnb8”É®žLÞ§¿Œ¿ðê×¶Þü¾@=9:ôâ­t?u£!ük lÆ‚ŒXêî£yÍRtß ø¶ì%K¢Ø 1†ÓO(´áZöu¦ÛúÞÑæŠ©^öê’÷³¿c4Ë Â-¸–ßOõ¼a†_ù1°`ËQIzšL6ýR<ä]ýsç†o}œ@È„­rù³½¦YȦ!„B Õ ¸VPјObûô´yÑÐàJþ·)_ºßÐfÒŽË©h* ¹ëAî蛞մ’ºzý™8º—`ÿnT`2`Á}ÇFòË<øCãE=)=E:4„j‰ “!"<îÑáZŒÔD IÒ™“Zå+—bð?Iû³/œá9ߊs•-„·|¾Á©í÷¢—>NmÓeXö?7ã÷Ít‰LN$½Lî%Sn"Çsú~)®”Õ8‰oÝDïîá©ññÅÉmú›Ã×"›kšÝƒÖ³g!„B Õ`ð4a'ĸwäÈŒ«ê'4¢¼®«i3ÏBì„ ôûÐÎrázÂG2§=ëzRé³snÅY˱­ÛNŒÏBìŠãêÇX²ú¸¿Œ•a2e¨Ž~ãçoø8óïZJ¬÷UÆ÷ÿŒ ¢Îb ‰Á½!Ɔ'!Ïj 5ù¡B!„8k¡:«ð©˜PÐÐÏIÓÏíÖOÙ¶6õ׺~о+(„é» Móº!•ɾmb3Ý¿yÇœ+)¨[Eùú TŒ>C×ý–p"ÛÁÕ¦ë:;ã® ²·µB!Ä´3Þ@X í%އœÊâ#áÊX‚§Â$3 EºI‘‹«4lê9rp +&Ë©ºŸFU³ãqÅë±.¢ p4,Áj8Yn'ŽW‘‘dpøQ¯D84û™{-L¬ç?xáAÚ~÷kEï§zAɱãzŠ~i¡·ˆãÁ]]~Ò‹žÕjQRI0¸+0îîÉjœ…B!ÞýŒÀÃ3emSñZJªLDû»Ð¬Ìöé—Í„–Œ£§FH:®¤tÑ ìÚ$ºuyK異4Áè–' „ÓG+^GÑ‚,éº}ž†k)(.Bõ>ÏèH–|Sœ¸×ãQß`¸shzŠbò­Â<ò"#¾pvõ ź Oó*róͤc æ¼ägˆO5A­¡ä­¢¨¦c"9õ¸ SÄ“èÚñT-EÍ×SXæ݈ÑQ„½°wÁô1é’Öå”´\‡'GCSl˜ÝÕäT_‚%ÖC"•í4»×’»))´¡-˜%8+–‘_YFºëOŒÇ³ëWÊOÒq%-«qšchÖ‚fòjæÃôµÈn S¨¦K(©_Ã8A¶ÂcÛ™Ý8 !„B¼çCõ< ë(n:êµ ŒHûk$Õ4)o+1¥–‚–›(®_Š“Nü[Åë M§ª8±·P]—P´h=Eu—á0§1ØÝ¨ÏÕP YÔsHf”è¤ ç¼µ7¾‚šù˜â{ zýGÍ kdƼ(EK)nZCAM=æø^^?:êØ6ci¬å+(j^Gáü+ɯž‹)ÙIÐ;ŒFšÔàë„“¹äÔ®£¤ñj ê.''}[‰Ä³œ«VØÊ¯ xáJš×Q´à}ähDÞú½{»®ú”ýJ“òn%ªW»`%«(¨™“u½B8”Ìr uÔ±ÝÄŒsÉoºâ«(¨™ ánB]¯N·3›qB!„x÷SàüN*î 4Ý~é'"W@!„B¼ëã'*Úp,X‡35H"ž@±V’»è6ìé6|þ˜Œ¾B!„P}Z'ö²«¨˜W5õ¡6=FrøUúþô1Y „B!ÞÎûò!„B!Þkd¯3!„B!$T !„Bq±‡jÅgå×X°ª £\!„B!¡úLBµ [y.ãÝ7z¦b\s–à´É„¿B!ÄÅì付JÈ_²‘ò†lVÔñá7ð½ü¯"ê…×ÅMÞÚoR3¯ðð;uò{‹·½ƒô9ØlÄ·Úë–üâ‰ÔÖíÂÕò1æ\z9v+d­ ¿ú3üÃù©B!Ä»;T[p,y€y‹ ¸íGôûÆÑí䔺I¥´ ¶+&w!†ÀSt¾¼ÕàÂV¹ªåâ0ŽíýàSüŒX>GÃò¢»B×0¸ý%•7ü5êSßatR•;T!„â]ª \Eàû!}»ZÉp€ÉÞã+À³x#•Í—a·êd‚;iý9¾þñ£fYÍXª®§bñrKЧÖM§G ·}Ÿ®3]SÙí4Üpìùû¶í›z·¥†â•)W‡Åè)ÒWèùÓÏ'šÓM í!Dý½h%S;¶]ýÄÔ,k¶ÖS²ôFò*ê°çx0bD¶>ÌþÝCè¦jî|ˆëÔáÅ7?Añô·j=Ðöb;YÅacE‹Ñ§»õ Ò:LŒ¦qÜqe•Œ·öÉã¼…B!Þµ¡Z‹D f-ùù» $f8ȉûŠMÌoT ´þoPÁQ;ë7a~ö«ô F#–ºûh^³Ý÷¾-{‰Ç’(¶BŒáÀ ш¹ê#Ô_·}÷#t¾9¨±àZ~?Õó†~å;LLÄÀZ€-G%™>Õ" MÕ@1Ì¢fPÍ5-ý¿¢o«—tJE±ºQ‚cSÁ;Óƒ÷é/ã/¼…úµ-„7?‚/@OŽ’íü²b¯Ãí‚Ø¶›dá2 ¾?>N`æVÔbRúHÉ!„Bˆwi¨&ÎäkßcÀüª?ô#ŠûÿÌHû Œ úaŵ‚ŠÆ|Û §Í‹„Pò¿MùÒåø†6“2ÖQ¾r)ÿ“´?ûÉSN»Z±7~†Ú+‰½ñ ¶÷NM˜œHz™ÜK$¦ÝDNÙ3ŽêPYe&Õ±„še͇ClŠx÷Ÿ Îô†"E:4„j‰ “!"œýšjÅV„‰‘xca1F³«9E,–‚‚"LHÉ !„Bˆwk¨RÝø_ø"cž…4^Kñõÿ@ÅèézþwL&4 ž&ì„÷ŽY6¡ú †(¯kÄjÚLÚQ˱­ÛN¨²{XPöÿ·woÁYßuÇßÏ1'r$!„†B0`·ÊÁVd†ª³´ŒÚ±£;v;ÚÖµãlwêî^¸®£Ý^쮥3;2ë…ÕÙvÖ íhoêÒjm§Ò²Tˆí.D* !'ò$Ï!Ïq/ )¥}@Qq߯›ÌóÏÿÿÏ/¿.>ùÍ÷ÿý…Iî}˜Þ§Þñ’^’øžï3¶õ‹,¿gÉã»9´“áþ™•ìYZbõ¿.yø?8²·—*aÌ™ìâ1dHt=B÷ ÙÉÕþ]J’$ý‰„j äÇ»9³§›Ø[›éøÌ—XºöM~½»¯ÄÛ¦Ãk±„†ñÝĦ>LÓúiyœ‰9ÁºpöúžyƒÊöÌïØÄ¢-wÐÛAïÏ~D<=+±<áW÷“Ë%ÈLŒ‘/üñÖOÓ1r”­(ƒÂ8™I PG´2 S1rTK’$]Jn°\œ<Àø8Dæ/ ÆCŠZªÛ8wR¨™ÚÖZ8{©“½$ÒPÙ¹–²÷ûIÉ}œ|þ9v¬†–­_gq[Í…ûžOÖq’Ç~JÿK_cÿ³?$Ýô ®[Ñ<÷¼lŒÔH?©ñÑ‹u)c¾,…4ÊG¯¬Ou1ÕK|*;V>7 òNêçCf œõÔ’$IׄðOGíêo¹‡ù5¡rÂUmÔt~–¶e-L|–3C3g˜ªÜH˪[¨(LP,k§~Ý´¶¤‰½úŸŒÆ³P8K*³Œ¦n§qa C„*›¨h\IÍü ©Ñ Š*æ­ÜBm~C=‡Iœè"]óç´­_ ¿d"‘*˜·ö>šË „¢„+›©j]OCÛB²½Ï32’‚@U+î ®ÐÅÐáwïšQʘ@ÅJ|°“ܑ相tÒ.Ë©½au ²É‘úÔ-È‘™(­Çtq‚©ü šoüó‚cäÂí4ÝúE«ŽpòÕHø–¢$IÒ5!|©¬ÈWQ³ê¯h©®$ÇsýÝçêL¼þ½éûi»éA:¢?»ÁŸæÔL È3Õó-ÞJn¥uÍfmþøôÒxn”Äá§í;uqø-Œ0ºëq¢µÿBÛ–ûHþø;œŠ ÔRsÓ4WD¦óhªŸø¾íœè½ŒMRJóeHïçí×^æú[>Î’-w@!N¢ç;Œ ´ª“Âu‹üÉ“Œ$ò>iI’$]5—®©>¨„ª 1L2™Ék‰„rBuD¢çó@E5ó Ù{„пƚû£¥¼—ш¶.#(eˆÂM7SA?£'Ç.Œ©0Êø‘~¨_KUù¬ª©Þðyb?߯©3)Ÿ²$I’®ªpIÉ»v3K>ògdÞúgbãV}Ñy’9ª7“›PL$Öõ'{)ò&¤™Le 5. ‰PÉLf`~á dÞw9D¸¦ §™šš}rž\|”"-”•… 3}4²ü!–GÂLìú*o¿=~yuÛ’$IÒï>TÍ¿eŸ¸‡ŠïÒ³÷ ³cmqüEÿàE Hp^ 7‰%·}`ê«HÌ:3C¢ëºÉNæ¨¾Š¿Pat?‰ÚQ½þó4žþ6±±ŒOY’$IWUð=uó§ùÀ÷Pvüß9øÊkL]rU¹@aò0ïXª†úíb:FŽr¢ePH’™œ¤('Z…©¹R ªÉ“‹Ç!X?½"}^ˆpMâsV°óÃ/Ðûì6N§ÖÐþ©¯ÐTõ)K’$éªUæúÛï"Ò·ž]{É”ôFáÜÛS½Ä'¡²cÅ…úéòNêçCf \IµEr±7I±˜†ÖzÎWO¨]¾Æþ—Dº8çübª›þOˬ¦}ë½ÔVØŽ[’$IWÏ%Ê?ʨZó—Ôñ?ï9M¸îº 'f‡IO$)RNÕwR“=Fr"A1ÚLMç]4UÄî™éê‘ï'¶ï Íy€eë¢ †êU÷RËANZoùD ‹3¿ØÎÀñø%/+Œ½È±½¸áÖ/жh?Ç’>qI’$ý΀_ëœ I’$éÊ}Nƒ$I’tŲ hs.$I’¤+2zI’$éŠ »I’$éŠíÏ9’$IÒ{.Èt÷Î…$I’tÙv¿:·eÊ6çC’$IºlÛB3z…دZ’$I*Õ“À·`zó—Ù~lv~$I’¤÷´¸í܇à;¾y'ÖWK’$Iï¨ïœ}à¡:>“¸Ÿt®$I’¤‹<9“—㳆.qò  h–8w’$Iún'ð 35Ôï(áë™^ÞÞt2ýB£$I’ô§l8ÄôF‰Ï1݆ú’þAf…Ô*IEND®B`‚stem-1.7.1/docs/_static/prompt/attach.png0000664000175000017500000004541513157571677021117 0ustar atagaratagar00000000000000‰PNG  IHDRÕ»ªÒbhsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÞ1½BŠ IDATxÚìÝwtÕðïìn¶¤'¤JRB EE°+ŠŠÊO»D,¨"‚•.= H©„ôÞËö½¿?’BÊl Mîçœ{ì¾yóæÍìÝ—™7Ä›`€ž|8ƒ1ÆcŒ±ÿ– ÎØ`»˜ M¼o `>€§¸p3ÆcŒ±»L6€uV(mNR=À{œL3ÆcŒ1†l |Sß›Ò>´ÀrVÜ~Œ1ÆcŒÁ ÀT\½§î›õTÿà!n7ÆcŒ1Æêõ€é5_¨;R½ÀãÜNŒ1ÆcŒ5(uF¬%5Þœ àùÛ¹ö‚•ŒŸ€`géM]¯¼ÓbÄR)~ëÐä·{oU}cŒ1Æþcž¯ÌŸk±€ÂïIÚ~‘N‡GÒ®Wº%@€”<ÜAÙ‰ŸÓ`{ªÊÞÌPõYEé”N«ú¨nâzôv+¶Îroûöº”ODd¢¼ˆí´dŒ7Ék,KâØŸæ¬ÙN'b3©XWµ”:6¯c­rÖù&×G\›îwÀh5€Š'%ÖxÃ’ú}‘BC©õ€•””·fÌÜB™)h¤£ÄÌ•ÈÈkú6Ê'¢œC«éÕÇ&Óè¡4ñá§iF°#IªÊ)}iôÔ 4¬0K³¿‰%¢tZÓϲâ}AEnþ©Ç´M”K¹´iZ ¤ÀÀ@ ð°¬^N‹‡’z~œBTð…ØšùY1u(ä‹"J¤Íó§Ñè1Ñ[“ˆ(…¾ q ¡rYòÀEKD±ë_¦‡Æ !ƒ†ÒȉSil€¥ø:ßäú4]Fdßàààààààà¸ýc"P1ãG­7,ZO£õ糨(7ж,|¶e¤Ò·£Z™ŸèX  ¯²‰ Çg“¯ÜŒÏÙ£=Z¢KóÈâV^¬êC+Óˆò¾ÒìÑðÆê,mý …Qô¢N¤¨z]DoÅÑɧÈ[Z3A-£mÃmþuoV}š,ÓܾÁÁÁÁÁÁÁÁqûÅj €žu/Ñ'ÿŒ'º»ÂÎe¾ï8ÁG?BÌÌ£È.ÊÂÙuÀÛBÜE&žýÑß8»þW$ê.'sŠ×6GBn9Œ& ¢¿Æp9 °’ךžä_“yâ¾ÏÏ¡˜ºÌ³øeù£èïã ïá+pxߛ説]ܲë LñÈÃï_ŸAÉ ¸ÇÒ(‘‰ƒ{¡­zQ›€?ögCà¯jÆ2ÿEoD}þmß`Œ1Æ»ô”ð­ÿ= œB?Ä—CãµíýñJðALê2Ñã?ÆÿzYŠ[<™@LÆFn–³ðÃìû°bt ~œ3ýzôCèÌv-U÷Wñî苘îí„N|’+q,!É{Ÿ‡°w;b55K[¡ûÌ)pÏÙŽ gKoà>®›¦O𻬖¨sKÖç_ö ÆcŒ±;ƒ¯W_ŸR·÷×Ç‘g_ÅQUk("2õ&Û¢ƒ‡BÔÒõ§– ô˜5mÝV`DW >Ÿ‡å?Àéðó;†$u=y˜¶ZXÁÙFÖ¬­UŸy}gagjâö}†Y½aߺ<\0äƒÔZ¥uÌœä‚ìß¾Á¹óS\‡¼ˆ÷V¼„·úëÔXËã" ®:Â×ZTá‹Ð7 êâÔfn ˆ:ßÔúüÛ¾ÁcŒ1vgpê».DâHÃ×'SÆæIä*Ù…þFÙásÉϺ -I¥ ¬D^_bAížü“Jˆ(çðzõщ4jD(»ÿqšýP‡Šäíiþ"JÛJ¯MLÁ½zS¿Ð×舖(þíÎÕ×ö$´šH;ˉ4aÑÌq#iÔ¤Y4gF ©nÀµ16ƒ¿¥\Ê ÏûZ6\β}™U1kEöº{*çó®ÖYp ¡_Vܸå‡hÜøGèÍmÉ ÜØô5Õbê|³êÓt}ƒƒƒƒƒƒƒƒãΉº/ä²–®fþB“ݤ•Écš»;’ÂO_¤ðÍOŸ97– *ò÷&ýtò*•\›Ã-…N®MΕSæ)}&Óû{.Q¶¦ò}“š RÎÑ´!Y­åɩݴ5t<­² >›Î¬I­$-Ý(¶4tc>QÚ* ¶l¤œÔ&~{…ô†«ôý}î$­·\u–{Ó¸e»)º¨âíÂË»hÙ¸Öµ¦°—T‹¬óMª¨:‹èwBU™5«Án86%íÅÀoûÀÿ¥3PscŒ1ÆX#$Ü׳ï÷$FÛ¥`óƈ;&9½ëÌcŒ1ÆIõ•à€{žÛäŸñÃ% ×™1ÆcŒ5Ž/ÿ`Œ1Æcì_á‘jÆcŒ1Æ8©fŒ1ÆcŒ“jÆcŒ1Æ8©n ‚•ŒŸ€`gé [‡Ôó œ!UÅáI°¿K¶1ÆcŒÝ’¤Z€²Ýx,Þrij‘yq‡°öù`8Ü€T\ÙéelÙñn'¿akÌúÓ‚º¢kÏÑx/®¡qÁ}[®¢¼Fò]œxßÍ WÙ©W‹l»"Ëjü`¨ŒcÓœ ÜŠ2Œ1Æcw‘ÓD¹ÿ3øýüçž½Ë_xÇ2¤ðê‚A®2LwèÖ YÈŠ0°¬¡ßr8ù´*â>ëOÉ[¡}èËøøÃCèiÛ½_Äm9iÔ Ž–@܊јöS J’ ª§w¹™ecŒ1Æî2õ<~Û¦ÿ¥&ÊÙHc% ?’QîMcßÞA—ò‰ˆL”±–Œñ®~¤µÄ…F}²Ÿ"’ ¨ê äÅñ{éÃÉmIQUÆj }›Gõ*Ý:Œl*ËIûÓœ5ÛéDl&ëªJбy«××T}ªBÖ†ž?OD‡'‘ýuÛîEOýCDG VBÕã´hÊ>Ñ•w¨«Büºš¬³Èm6Ãé×R=žìx{”áààààààซ¢Þ‘j‰ó0<3\‰¸%ïaoNÃÒ‚B>;ϰeÁƒ˜)A·™ïbù®pÖÏ(I¬Ñ>$u«0kün¤K<1xÎ'X°õ7duÆ1: ü,舕=aï¦áØ÷à,½X1l(¼Šªe™[žnðõ+xæÕKÈ(2@îà ‹¨$èÄÖ§Ù?; PkŒ€D A¿®&ë,rÛÅT.pWi‘¯r‡»})2 u×mïÍ,ÃcŒ1v×T+{|@ITN¿°i0—¶~†Âˆ(zQ§êQgE½CD'Ÿ"o)2zébíaYÛÙtžˆþyÊ›¤5–§ê³ŠÒ)VõQÕ»>yà"Š¥2Ú6ܦùõiÆHµDåJ]øŒ"ŒD©«û‘•ëjªÎb·]LÈý_¤ýÉùTj¨éÖ'¦•ÓÛ“¥pkÊppppppppÜMQÿ-‡&#L FG-ý‡"™8¸7Úªµ øc&8þªú?gÈ‹Ab9`ça‹–œë¢¹õiЀÍÈ5Œå™ß<úïŸBèüS(»ëjº¸•ÖÚÖ2lÚÀ³{]1û‡#X3ÌáÚ̓7³ cŒ1ÆØÝ¤Þ¤Z— X¢CX4úqáº$Jh2«2Á`‰p°æÔ§æcp·.èà G…zÌü ‘etcÖÕ¢Œ(M:ŽõsÇWÙ.¸ïñî°º¥ecŒ1ÆîÒ¤Ú”ó7~×’êBDŸÏžx ¯ÏÌÃÞâVhmq_ÿ-jº<³Öu¶°F¯—bDÉYœ¿Z“†<¾OºdãÛ¯ÏWÞðx3Ë0ÆcŒÝ}¸àZBvÝgÑʽєWyCš.+œ~[6Ž;€cë†Âö?Õ²öžý)¾|½?e1ÆcŒ“êL°†ÿ¡è`×De8„|Ž8]9Î-íÕmÐx‚•ŒŸ€`gi=-ëˆ~OÍÁÓ#½›xÔûMªÏ-hÃÛ­>Œ1Æc· © l7‹·œAšš@¤C^Ü!¬}>’[SU«6Að±P! ³{õãÁ›Cê…YG "\|Õ¿ÙI¯²ÓËØ²ã <ÜN~[ì̦ëÓ‚mxÖGäOXvx ›R Ùëûó_cŒ1&Jƒ—û?ƒßÏŽáÙÛ±ü…wp,C ¯n!ä*ƒÁt+ªjDêwcÐ!º¨s(üK²ð™Š9ÁYØ{È#žyV½‰íݰ»[® ÿ‹õ±pî_]‚¥¯Bk¹|~`Œ1Ƙêyìµ;MÿKM”³‘Æ:K}T÷Ø·wÐ¥|""åEl§%c¼k?¼©2×=Ê\BŽƒVÐE½.®¸—$ ©çt†j¨ùØóš!s¡As7RXš¶òißá´eÁ`r–Ö,§  ¥ñ¤‹x:wýE›Ré³Þªê÷]hù¢¢MCȺê5» tˆˆ"^ñ% €`5¾Í£z•nF65·Ë”K¹êÊ÷öÑ“ê<6½©:K\hÔ'û)"¹€*bNÅñ{éÃÉm«ó.¢>¢Û ò]@ßK BSEQcq"í[Ø•”•e¤ЦØBÒW=¨<õ$mx¶ÙJn@}šê?bÚGT(©Û;—(3|3ýï©´.(g}²âÇ®rppppppˆ‹ë_”¸=BGMD±‹;ÕNk†à@!_¤Q"mž?FyˆÞØšDD)ôeˆ bËÔJªeä6êŠÐièì»C¨UU’&³£6)0h8-i lèžcˆ´iý‹èÞ~ƒé7wS6iéÈ3íHVUNÙV$jéììv$³ð§yFJ[Ù‡Tæ$Õ‚ŠÜü;Ri›(—riÓ´HàaI’šÛ•´fß?†FŽAË÷™NÓ‹¾âë\µœø•4sÜH9a½{°ˆˆÎÓ¼öòÊ利ˆ6„Œ¼¦o£|"Ê9´š^}l2J~šf;V, (}iôÔ 4¬0K³¿‰%¢tZÓϲeëcNÿi¬}Ć T,SÕ‹>M多ƒƒƒƒƒƒã_&ÕÊP•Óo#lü ´õ3FDÑ‹:U*‚è­":ùyKÅ•¹–ýý0 xúWJ7æÒž9ÝÉF¨o$º =¾þLêõ87hhÿ#$½–$9ÑýûtDæP;YÕ¶}HIÚè¹¶2,¨ýëQdJ[I}Tf$Õ•¡ê³ŠÒ)VõQÕS׺#ð Y»9tˆÂfyDlë[NÛÙtžˆþyÊ»úsMÕGDÂj}•Md8>›|åft"ûq´GKti~€øö³OÍé?"ÚGtpRÍÁÁÁÁÁÁafÔˡɨ"ån€¥ÿP"÷&âÚåÈÚü±?•¸2×Ü»G¿œ„ô1é³ó(!ó®aQ GTïÓ` L9Ø2Ìp €‹(ÑñÁ)p»¸»S ôHÜñ3âÜ'bj ò†_gcÈF¢pðv€LtëYN^ Ë;[H[°~žýÑß8»þW$ê.'sŠ×6GBn9Œ& ¢¿Æp9 °’·èt2fõŸ›Ð>Œ1Æc æGõ½¨ËŠF,Ñ¡‡,öÆ@ßàÇu_šS@ìF|U0O¾ó#–ž×äÂX· Õ\jÝeJ ?L Å»‘šÚÓå᪀“&µÜw ®ê×Ô*3a‚?Þ8-F •Ë ´|Z H+ÚDTëÍ M0˜A"˜_ÇFÚd0ùEcá‡Ù;÷a…ï>,}qv]ʇà>mnÍi’ÆêcNÿi©öaŒ1Æk†zM9ãÇÓ„Ž/ÎÅ ÇúÇËã" ®:§z*4…/BCÜ€¨CˆS‹+sMÆÌÒýâŒyûŽâã‘Î×瓤E‰€+lê¼Y»‘äŒ},|9 QQÕq9> jämÇáþv)ø|BwtêÔ©2zaú–|øNƒ¶ Hɬüá,k"Ô–B +8ÛÈšÕøbêlV~*¦>´¡>ãÂr³& MCó ª0¢« ŸÏÃòàtøy„ C’ºåëcVÿaŒ1Æ»…êÏv WñÝìex2ìMüuÊËVü„)zØûã^Ï#X¼hrS6ãõµ q`ÉNl4,ÄÆH)º=¶‹R±vØ/H5$¢LÍ:ß͸ ÃÏ»þDÁ€!XV\=˜i*Ä¥)À+ó°äÙü–e¶ÊX·ñ24©[0åü=÷ ;.ŪßÑ©·‚G@käÿº;’ ÃïG‡²“xáP8¢Jª* {ëy¸ÃÚŸƒË@x¨{E„65 ‘ê˜øÎ[˜¹l/2ež°=…ußEAL¾gl²Îz³v¦¨ú4Ö†¥§°ô¿pÿº/qz_¬Ø°—25Ùy¢Åq¬ÿ)MþŽFÍZŒ9á«ñwR$N}à­ºõ1³ÿü[‚Ò þ.P¨à¢äNþèÜ¥Åù ˆI-ƒ‰ÏŒ1ÆkD\KÈ®û,Z¹7šò S•é²Âé·eãÈSV=ÝÙ¸e»)º¨âýÂË»hÙ¸Ö×M©×h™zn4ƒ*ˆœ1eo¤qu¦ô“:£e’IKDdÌ¥sŸ"§ªYB¤Î4ð¥ täJqåäjÊÝC º( wz䈑èÔ,òÔÞV ÿyt‰ŒtôQ÷Š™)äÞ4þ½¿(¾¤j¾7 寣5c]ëÜø&§vÓÖÐñ´ÊÉÜôÙtfõÈŠYKêÛ.›ÚRBÿvçêï«3ÌXNSõÛ†‚Š|ƽI?¼J×6¿4…N®MΕe”>“éý=—(»j;“š RÎÑ´©že¥¥êÓœþÓ`û4ªžSJ=ÓÖºi•ƒƒƒƒƒƒƒ£žÿ®`Œ1Æc¬ù$ÜŒ1ÆcŒqRÍcŒ1Æ'ÕŒ1ÆcŒqRÍcŒ1Æ'ÕŒ1ÆcŒ1NªcŒ1Æ㤚1ÆcŒ1NªcŒ1Æ㤚1ÆcŒ1ÆI5cŒ1ÆcœT3ÆcŒ1ÆI5cŒ1ÆcœT3ÆcŒ1Æ8©fŒ1ÆcŒ“jÆcŒ1Æ8©fŒ1ÆcŒ“jÆcŒ1Æ'ÕŒ1ÆcŒqRÍcŒ1Æ'ÕŒ1ÆcŒqRÍcŒ1Æ㤚1ÆcŒ1NªcŒ1Æ㤚1ÆcŒ1Nªÿ-ÁÊÆO@°³”[ü?цB>Gœ®ç–ö€êŽÙ. xŒ^Š—r %Šrn+^é¬äÆcŒ±–Oª~ObsøEœÄ®WºÀ …ǃ;ø9Û f­DÙéelÙñn'ço¦Û« %°j :»Cq‡l—Äm ¾Ýö? ÊZ‡'BaÐȇ0wÕœÎÖßž;]„e ¢Úqlš„[Q†1Æc ’]ÿ’z¿±ÝvAÏo†ãøÉe²a<þTMÆêO»bÛCáïBâ–»«‘úÝtˆð‡.ê ïZ+¼‚¨ÈƦÿ-ÇÆå·…¥Vp´âVŒÆ´ŸÒ`˜P’TºecŒ1Ö(ªtßáb:ó„'I&Ñ¡âsô¬MÙšIÉ_ #IÝò„Õ@ú6êUºuÙT•“{ÓØ·wÐ¥|""åEl§%c¼I^cYÇþ4gÍv:›Iźª¥бyk•k4$.4êÓÓU^ùyežÝLo w' s×ÕDUÝÞ¤}‰%DD¤N>F?nø“âJ‰Œ¹ghÕ’‰­Ø6¼I!õ|‚ÎÔ¬ÄáId__;²Ÿ"’ HSY¬8~/}8¹-)ÌÝ.™ š»‘ÂÒ´DD¤Ï§- “³ÔŒýÕȺ¢æ\kk©Ç´)¶ô•ï©SOÒ†g{m­>¯ ïÐôý±*4U”3'Ò¾…]IiFE…ÍpúµTO‡';Þe8888888‹º/XR¿/R(cc(µ°’’ò¶ÓŒ™[(3et”˜·pAEnþ©Ç´M”K¹´iZ ¤ÀÀ@ ð°$ @(ä‹"J¤Íó§Ñè1Ñ[“ˆ(…¾ q ¡rYòÀEKD±ë_¦‡Æ !ƒ†ÒȉSil€¥øúÈ|襋Dû=42„†‚ÞÛ›MD‰´j½øu‰¨³mèNÒP-ÝŸX›BD—èÝ CiÖYD™_P?K‘õÓ†73dvÔ¦C  §å1 $ÕUÛ¿’fŽI#'Ì¢wÑyš×^nFß°¡{>Œ!Ò^¤õ/N {û ¦ÞÜMÙ¤¥#Ï´«øa"j5´®ÔÎQ^]o¥/ž:†õ¦àciö7±D”NkúUõ1yMßFùD”sh5½úØd="”&>ü4Ív4«ÎbBp™N'Œ¥´ëáNän/¿Ö?oU³’jEëi´þ|åFÑ–…¯Ñ¶ŒTúvT«f'pª>«(ÒiUÕõ#Ÿ­Ÿ¡0"Š^Ô©zSDoÅÑɧÈ[Z3q*£mÃmIUÙ’½ƒ988ƒ½-©¤õ${5AUz'Ètüqò¹.1u¶ ÝIÓšâ²¹ÊMÇhš“@6öR©é=ì*ˆ®OSmhÖHscícFÈÚÐóç›Hªk¼'k;›ÎÑ?Oy“TlßðzœŽ4´ÿêÏNtÿ>Ñ…9ÔNf^ß0» íÇÑ-Ñ¥ªÑl«ôU6‘áølò•7о"ë,&äþ/Òþä|*5TŒˆë“ÓÊéíÉR¸5e8888888ŽzoTÔ'ÿŒ'º»ÂÎe¾ï8ÁG?BÌÌ£È.ÊÂÙuÀÛ¢å®=±ôŠ@dâàÞDh«^Ô&àý™@àø›5µ„úyùùÈÏÏG~Á¬égÕøGÔÑøý¯LCD¯Ëì:›L ™ 0A© ´X}Z¶}šÑ†"òbXØyØBì<ª€á’*ò} U7Ï™r°e˜à‹–m™ëP¼¶ñ8rËa4iPý5†Ë…•žýÑß8»þW$ên|uq+1¬µ#¬e2Ø´€g÷ºböG°f˜Ãµ›ofÆcŒ5’G4ü–N¡âË¡‡ñÚ«ýñé»1©Ë<¶ÿûfž>Ù’7z ×}q Íú&Wã»ã²QU1­‰I”uŸ!‰Abfò`FÉ£Á“¨å6·>-Õ>"Ûj¶„&L€ Do— H ?L Å»‘šÚ«×å᪦›ÆÂ³wîà ß}Xúâ8캔Á}>ÚþÜ®­Ô`2ÒM®³¥IDZ~Îãè=î8¦=Þ/ì;ˆÒ[V†1Æc¢“jI«xípy¶'Ž:í€"ñ'D¦^ÀÁd[<ê¡ >©&m)´°‚³Íõ«+;ˆ(Ü¡#| 8Y1ò«ðEhˆuqjs6Ç„¢èã8mN2ÕC»±GqEdÂcnKößÛÊ㬛YŸÆÚ°eÛGd’%6®°‘ÆæÕ¨Ñ¾»‘t?ô±@ò/çPz#§¡P`DW ÞŸ‡å?FTìÓx;$©q-©ÖgœBX.0}Ö´Ù´‰õÌÄwCë,æ‡ÖÍ,ÃcŒ±&’j‰#BV¬Ã¨Ï£Û® h†§Acß­Tñð±+FB–ά•hSé^€‰ï¼…™Ëö"Sæ‰ÛSX÷]Ô)›ñúÚ…8°d'6bc¤Ý[ŽÅ©X;ì¤oÀV÷ž‡wæZco¬þS߯» ±uòV$Ä}Ü(¢Î6-\ŸFÛðVôS!.H^™‡%Ïæà·,{´UžÀº—¡i©¾‘ºóW.Àßsâ°ãR¬ú=™z+x´Fþ¯«±#¹ç—Ö$àïh`ԬŘ¾'•AâÔÞ5/Á)=…¥oü…û×}‰Óûº`ņ}¸”©ÌÎm,ŽcýOÑдX­Ñëå…Qrç¯Àdç‡!/Æ“.Ùøöëó(»éecŒ1Ö”:Z ä²–®fþB“ݤ¯Yv¡¹»#)üôE ß‚Ü0Þ IDATüùÉͽx[Ní¦­¡ãi•¬é³éÌê‘ÔJR==ݸe»)º¨âíÂË»hÙ¸Öµ¦Ê{3ÄÌþQA§éÒNкǃÈZ0s]MÔ¹æŠ5?g=ôg*6¢nÑõÕ†· ¤ÎÃhÙdÒséÜç£ÈIÒÀ ¡6!´¥„(þíÎÕ7wŠÙ.©3 |i¹R\9Ñòc÷Ђ.J³ûFS7**}&Óû{.QvÕ<€&5¤œ£iS=k‡ "ŸqoÒO'¯Rɵ9SèäêÑälF› ©+…®øƒ"3ª¦[TSú¹ßhùd?R ·  Gã³vwѳd>xé\>É¿ƒ»õ-¹ÝêÃcŒ1ÆšEÂMÀcŒ1Æ'ÕŒ1ÆcŒÝRw×åŒ1ÆcŒÝ {1Ö,0?ªž2—ñzûŠgKÜfà4f¡õµgRZcȦ"˜Âf½‰ú÷ƒ]ÕV©üðÀ"¦¨â½Â˜?ðÁþP w~ײj :»CÁÇcŒ1ÆþÃdwJEÏa×ùÕ’þ =ö§YÀ»ûP 0•AkªYò^0Kª_Ñç' =Ž ®¶B§ñq`©€EÃÆŽ`,Bb èqõëñúÃ.5Ëd—!=±ö#¦C?ÄŠÐß1}W.L Öüúú‹QgŒýê6ߟŠÏ_'¢eèòÈ;øló xhñÈï9,÷vgDêwcÐ!º¨sü`ÆcŒýçÕón%õÿ¤…>`MöʆÓÝBeD=²Ùƒ¦ïÕål¤±Î’Êɨí áDtˆ&Ø5µL ¹>r’ˆ*nf‰Û :eTÓÅ¿SH—ø1õµÖ4dS™Âf’»D\},ü_¥‹d¤ãO×x ¶¬=f"Š˜GbÚG ç)’–²hÝ=–5^WPÐÒ"ÍtŸ“P¹l4w#…¥i+ŸN[ &gimsìOsÖl§±™T¬«zw›×ñÚ#Ø%v=éùoNRrYåÛÆ2Ê _K#+Ö#õ|‚ÎP 5W^çQïcßÞA—ò‰ˆL”±–Œñ®~<½Ä…F}²Ÿ"’ ¨êÉáÅñ{éÃÉmë<꜃ƒƒƒƒƒƒãÖF½—È|ZaàäVúa¼„'—»"°½´Öµ"-UF ‰sž¦@Üê÷°7çv»Õ âÓñ£åsøìq_X˜ýy ûL@"ðó_i0T½lHÁž.' ¸•DÔo¢¼£ßá˜Á£î¬¾vYî‹IS} ;ò-Žå Øàž÷Žâð;]±â ºg¦¯JÃàwÿ¯O¶»ö' ™[žnœŽ¬À3SFbèà„NzïíH‚`‰¾ïïÁê©Flzv$ú÷ÅÀQ3°ðË?[Z1å¹1ëLéØ ºŒÀ;± T[p@Èg'°óÍ.ˆ\ñ ÆŒ}ÅtÇ¢]'°2ÄH¬Ñ>$uñìøP„N|k’ƒ1wëox±òRÆcŒ±Ûw¤Z*%çÎ4êóŽ´(¹½_oíö¡‘“¬ÈRÚ‚eDdþÊîP•Óo#l)W52\ךâx#Fª hã {jûôQ*ÏþކÛÛ40R]×zÅÏ‚9¾C¤ÛC£mk¯ÛvônÒR,-î$÷ëHâFí×%}@=*ÿ" z›â©Œ~ŸèD@R¯Çé¸ACûñ iÕç'ºŸŽèÂj'«xM¸ˆb©Œ¶ o¨­íiÜ-Qê—4ÚMÖx½dmèùóõTK[?CaD½¨Sõ¨³"ˆÞŠ!¢“O‘·™½t±öçemgÓy"úç)ïêíàààààààà¸Gªa4"çhþxî2–vˆÀÚײp¥° rDÈ wx©Z°Œ¨´ßÓu~T¢ÇŠË(‰ÿ Á–5_?W÷B¯^•Ñ}öݨß#\ýa¾ÒLÅ;3|QÿØé9¼< +ºv­Œ Éø.Yß²Õ0eaïš¿ n=Ó;©(ÑéÑð-ø +储†#Hª@È÷i0TÝ4iÊÁ–a€K\DµbÿÜñ«éiìÎHÇ?¿~Œ9ãa'5¯Ê–þCˆLÜ›mÕ‹Úü±?ÿú†!/‰å€‡-¤`Œ1Æ»=4z£¢ÜÛ]pBð´VhS9]¥j¡6¶|™Æè2/!,ѱ·ä{/W^† @ª²…µ­ªNrU„øð³8[t“Z°ì|ôöi<ñÖËè}¾¾ÅHŒ¼ˆ‹E×'äy‰9€…|e@±áÚ.qôõ„Ù¸’gýdž¼ƒŸa[Á><ôx7,еÀs3Z#mãJœ¨\¯ H ?L Å»‘šÚŸÖåáªFü&«/¯Å¿ßÐsÜÃxäáGñÖï/ãÝ3ïcüè7°?×Xûo •êŸÌD¸îu¡ÉYOL0˜A"@àã—1Æc·sR-õn…‰+½ÜÓâZ"“} '¾ÉÁÙchM-WF SîlDÒýÐÇÉ¿œC)ýËÍÖeãì¯ã쯟àÎsq4â¬zrº¼ƒkãð¤E‰€+l¤@A|»<î ¢p?†ŽðâTdÅhµÂ¡!n@Ô!Ä©ÌÄcŒ1ÆîŒ¤ÚXn‚C[†óßgãøOùHΦRF\ÞšŒ^X†gÏ,ž#J,zoÂÒdèÕѶžÂ¶h×¹ º”Ôü|!®D'£TdŽ*wòC€‡5\ÚXкStq.CzLüäžú «Y›¥ÿÿÛ4ÛWmÃ'¦…ø9ZŠ®3ÞÃg} °yÒ7ˆ7ë* .~ñÂ^Y _e»À Õ 0¦nÁü• ð÷܃8츫~G¦Þ ­‘ÿëjì}IŠ-¼ý1&Äþ³ ÈÕªà}o?xˆ¸Ì²ÚSš qéD ðÊ<,y6¿eÙ£­òÖm¼ MÊf¼¾v!,Ù‰†…Ø)E·Ç–cq@*Öû©FÜA>2ÆcŒÕw±µ !‡@)»‘°¥Êˆ 9ô~о8GE•·üéóèø×3ÈGÞØD¤ÝM£lÅÞ¨hAó£êYÈez½½¼ÎŠÖÕ§;ßG;J‰ÈŒ)õ`Ùžút?Å—T¬¥$~?}úP{²šÑF‚=ؘGD‰ô~OU=7 :ÓÀ—6Б+Å•Ûd üØ=´ ‹òZ™&oT”ºÐˆe;éb–æZËh2/ÒÎw'RÅõå¥ÎÃhÙdÒséÜç£ÈIR=¥Þ¸e»)ºr‡^ÞEËÆµ®žR¯žaB[JˆâßîÌÓêqppppppÜ6! þ]ÁcŒ1ÆXóI¸ cŒ1Æ㤚1ÆcŒ1NªcŒ1Æ㤚1ÆcŒ1NªcŒ1ÆcœT3v;,aÕé´éÖîÖ\R7´ê=^v·þÙ9òvp¶mÛÚñs|ؘž÷ÀÆRÊMÁØ]ޝÑüì RÏ ½Æ o#úŸ«0q£Ü¹{Ój0:<ô¬ª^Èøçwý£Ù ²†u‡‘pÖ^Fjxâ-ø~÷„S·áiþ@Fê­<³´…{è"x:D#%\׌y;E_2X{zƒ²Î£Ls·RXxOB›àØ9Ø@ 5ty‘È:ü9² ô-\†5¼ÜáÔ÷9xZöEÒï«‘S¤ã6aŒ“êš$¹ gïQppwƒL0ÂPŽìSß #µ°ú Rê Ï)ï½΃ K>‹è„’ê$#h&Útë•0äŸFæño•Yz‡O-@jí …D“ƒý­‰k‘v¹ßE}шèf´µÄ~ ÚŽ~ ¶©oãâ‘ØÿCê3¸²õ $R´:n|nø,aÓ÷x:_EêoŸ +_wÃŽ/‰Ã(øŽè‚í(Ó4g=æöy’V¡ð76êm¸´uÔÆÑçEPõA»áa•µWOE@GJȬ¬¡×[°Œ Šv“àÕí^Ø99@ô¹g‘ö-2ÓKê´©}8…ÀÑ;–Êt$oY‚ìRãM>ÝdÆTdîùãç¡Í˜‡¡Ýö Š5üøÆ8©¾ö=ã §~S`Sv©ûc —xÁ±×ƒð©‚öç÷WV™Ò Èd€æÂ¸_PyÒ3ÁTZvmDÞ~Ú·CÙůŸ Xwy^£_„ñ—È)1ÞÁMg‚.öCDæ»ÁTp·vKZ¨ÅîwQ_ŽMõ ‘‹QúÀ±Ëdxví 9à ÛeД’rè |bøW¿ïBѦ£-J/mfB}/3û¼Ä~üÆN…êöyÑU·öƒRZŒüv /KwƒÊ A CÊv$þ“ “¼5»O…çH ¨7}‚ÂkÉ£ªÀçàß×ÚøÈ9ùÔ¥yЪM7ÿ@†‰-l:O‡WP0¬,e M2 #6"éÂeªÎýЏöO?¨lì •@9JÃÞBÌÅôŠí•·ƒK¿póñƒ\€tÐçCâîoP¬%ñ— HZÁ¾û xvê•‚`(8‡ìÓß##9¯b=‚-ìú>¯¶í ´¶„ÀX‰ÜÓ_#51GüÈL‹´³û]\6ÜxßŪ §á啊ì«!ï7ÍMô,ƒÑnìãp°«hgSY<òÿEÊå«0ŠmhÁv}_€·¯/”*9#ô¹ÿ ûôFd¦ÕÕtA³^‚L ˜Š#‘öÒ®æ]+Ó"õ /8Ï‚GûÈ%FèóÓ!P+5jô¸0ãøE«Îà,ÿÑq ôa‰#ìº? ¯ÀžP)€4ÐÆ£ l RRJÄ_²öh÷Лh¥¨ø¯ËÄ p©êƉïáÂþHqI9}^ïЩE~€«6/Âϵ}^Ì9 2ȽGÁ³ûØ»º@ ú_øñç“aª³íÎã7À¹ò“šÓ¯âÒ…LPK•º+‘t¥ªn(Õu„c¨7¬¬¤(ÔºN…_o;dïx™yš¿nÝ.Ñç±&–ÓRí,ºLeb]ü7’Ά s¯)p8¿¹e|A cœT_û²1ÔøB µr‚¹(/¯qÌRŒR{XÈ5Ð×âT~°µÊÏÄA¸{Ë‘ñûjävž¾ IÐ5ù]M0dE©© ì|ºÍK]llÁúØÁaЛhÛ¶y§W#¿H¥W<kjú¸w|‰ýç{/[RŽ£þ.c ›~‹á( ðŸ/‘š]XuGëA#ak¯‚R"îø2$"uÇkÈrš„€¡A(>ø2òõ•m›cÞ(¡˜>/q€ã çàû5¢ÎÇCqosú¼˜s”r¿ÙÒ ÈØ‡Œ¿£ .×BP:AZœ_±oÜv‚©¼ò<ÖRejÿ"€Ô&.]:@(>„¢bCõÍžC¡@Z\O+¨4ù¾GÊåÄʉMo—¸ó˜ˆöi©vU¦V§„&n7Jz?'/;äÅ€/aŒ“êëO¥vƒÑv@gè.-CNQõו ·†©Ì›Áï¡«PéeäœÙ€ÔøŒŠ“¤Ò2hPªÖCêä©…:”—é'gÈ$€®rq‚L‰´r¾2ôj˜ªÎHš(ädáÓ¶/”§Qnû~he§CÑéK0 Xõ…WP+ÿý ’â*OfY©€ûjøö€<æ/h¯uP'B~š¦Þ&‘YYÚT”¤F¡Tm€ZãN¦rè ˉúrEÁº/<;:Bsv/¤‚¥¥@p|½‚‘‘~°z4±, ÉaP’/‡í´pt·CVQçš8õ­DsÑ›¾F¹ílކö»¨|¯‰¾aF:,n}õ0f£èJöµÿ–åv~saãæ!+Ó¼/¿ò¥^‚@qÚUÐäepïÝ™;WïÓ’sÈ»^±O ,a?í´r·EvqYõil»ë¾poguØb\½Xñ™¢ 5ì_¾v`‹:.D_â“êV°²´Y9õîgÁª<[A¾WÎWŽ<ÊÐ Y}2q|:è‹Òa”—‚`€¡8ê]óúF“}^ ¹ß“hã|W~=IE3ú¼¨}!ñƒG¿^f}‡È=ûjœ³ÌÝö–*SIÕ¦? k€1é»¶¡´ê7‡Ì .0fFæÅóPkePúLCÛþ !SÏE|b kz»D}_"–ÓRí,³/êž“Q\,ÀÍà 'ÕŒqR]çôi«PøŽUÚ:D‡E×¢¢¿»é/H¬ýàØã ´ò&$êy¸šVVëä]vúu\Œ”@_j€MPÝõ(`=àS´÷¯úƒo)rwÎÁÕLm劊Qu¦á}ÑÊáW”çTþ¡ÐžARzIå ]g¨ H¯BÏÁu“ wÈ$wRD9ŠO}‚Q³àÿp/”'G^ìa䦤™õgy‰] T(D^jvõ‰Õ˜…¢´Bxøu„Bv°ÞD—4ÐK«Š«6M¿#vÛõÝ©e,†Æ3ÚYtJÜè~• ‹î-¡‰þ@PÂ5ø~8{·B)À¨VC"t²9Ž!…©…p÷ë…ìp£ûTie_´âêÓøvIl;@‰Bäfæ7øå-ê¸04}|‰ïør@CÃõA1ò“3nÒl9M÷&û¼ª¼ûú¡äؼFo@kªÏ‹Ù:+X+ò°3"ÏW7‰æ·-†Ü¶-ì;Ýq K‘ž«d[šÄƒÈO«è‹åùë¡l»î K ƒÑ¬íjø<&ˆXNKµ³Ðœ}a*ƒNH­¬xIÆ8©®ó%ã: cîƒ,a. ƒ®Á‹ ¦ÒXäžø V­ñ}$§E490@ ¹J˜Š + ØCn%´90Ô9.ÿ1qòŠé «uƒÁþ ´ àØ¾ ÒŠ¤p h]Ü^”VŠ‘wà}dÖ™ŠŒ¥fÝ|f*<ˆ„ÍÿÀ²M´ò‘£à™³ ñnAqÍi»šL²›sZ¥ÚË5BSPÜ@QˆAt;‹L¨EïwQ­YoßhÙ|¡‰þ#q…ËÈ×áeô¡¨  °ì ïÓêÿ @³~‡4¶¯ûI0·>M&B£«w\4}|‰f,Þ¨l¬! äºCDd`™Ä 7¼o4ÙçÈ©ÎDI!`ïåÙ… èë´Ÿ©4:ô‚µ›=„œì&ò憯êj`‚2¹¤y}£É>O0¦|È­Š‡«–½¢Ó1Äÿ¹%å&Q}^Ô¾(G™hÕ¾' o¯ÑêZ?æH*·OŸ‰²RÀÕËçÓ*îß9ÃÚ0åfÀ`HÄv‰ù¾³œ–jgjξ:ÁÊÐ%çñs 㤺ŠVÝ‚=Îájtdö­« ês¡))A «  °Õ'¢¼¤ $w…mûûà¬*FnLåµ’Æä„_†ë€'áÛKެ,ÀºË Øá2’.§šyÒÑCµeA3Ðv`J^…üâê,†ÊÂ9í»,DåoÈJJ‚Þ¤€ÜÎ †Ä½(=Wª Ö=§ÃA…âÜ,ŒrÈÝü`´åÚºg]¨³ò€ 1ð,F¡Ú ri,rãÒa*=…ÔËоç\ø˜~A^ª€ûáa—œ=a_<"’jQ—í,óÇÐGଜ ¸x4®Æûbö»˜åˆè¢–@j¥©;,¤€ tƒÊQ£6 š2­¸]jÈBI!`×þ>¸æíEI©‚Ò·bf—ë¾IË É+Ú‡Â= ÅzkÈ%qÈO¯®—óxuQ¢¨Ð¥ïdx9”£`ßéŠÑMI ×§±ŸU}¬ÛøI¶ ;=¤è‹ƒ¼â‹Æ/ñùVŠb® uÿQp´9…¬:Ë ’ÈL„¶}^FÚŽ‚)C`‰:3–4u|]KÒã¡6ŒƒCïÉp’F@/q€RœØ4‘ç}^—‹ÚS`+ Óc1´E90šDöy1ûBŒ3á8p:Žn̘¨ÕzrGÈ%±µûáÍ ±‡]—(K¯B­Ö@»Âºý}pR"7º2a5¦"çR"\ƒF»î¥HK)…"à1¸Zç"ë`lÅe4b¶KÌ÷…˜å´T;7c_HœúÃNYˆ‚”l¾žš1Nª«O¤Vnv€¼ÚŽïQû½œu¸°ãôP@¦jÇ.#ái) ‡>÷2öoBƵkfÐF†‹™hÓýiøuŒ§‘ºgr›1ç(•GZüdø«‘}ö|Q°r”œZŒè’áÕyÚ(˜`(Š@fÚ~@ìUÁ‚$‚l»> W•EåJ ŠÂ?CrBÝkWõP‡…ŒVOÂíž9p¢R”_þùñé0QJN,A¼f&¼º>?9`, GÆ_ß ÝœkŠ Pç45<(¾Ù(JÉ“¿€¢”:Sž‰Ùï$b9‚˜¾!b9$c0iäU/´y ÛÆ„wpá`”詳÷~Yÿ)p²^ÒÊQв«(,®{³ªeg×#Ëa\î}.TR±Oj|’ ÖAOÂÙR *CΑÏrµÈŒÄÓœú4¦%'ÞB\Ù£ðì4~]¤Œ0Ç ¿HcöqÑøñ%z¨Ú„_×s>< DÁŸ‡k_>dÊCîÁw ½ç1¸÷}N‚ú‚ÌÊK3êù!ÝàñUYD{)GöCÖwÚŽ˜ŠQý%òâÒ¼Ííóž7Äôy1ûÂmô§¸T>žÝÃcð°Šßi†|”Ån¨è‡75[“ú=œ;ƒR% ….÷"2öÕÜ.4‘"V6Þç CO¦Ò(dø©Yš稦¶KÌyLÌrZªÍÜg´êu/, ¶!;—ŸªÈØÝHø5câFí\à:écxk›ùó»§¡ ký$:CÄ»ˆ ‹jtÁv§Nƒ~ÿóˆM,åæcw 9T]^G`°#rv.@r¦š›„±»Œ›€1Ö²L0$ƒØvèpÏø—ÏGôŪ{”°ì+]4j …'ì»LJé™åÜtìÎ#XÂ*è·EÙéÅH儚1Nªc¬åè ¾ô1.÷…2¯Æõ¥+¨ÜÀÓÇ2 *‡6ó8’vÿŒ5ßÚÅîĤZ …“ŠO.ÁÕÈd¾A‘±»ùt¾üƒ1ÆcŒ±EÂMÀcŒ1Æ'ÕŒ1ÆcŒqRÍcŒ1Æ'ÕŒ1ÆcŒÝÅd åÚ2—!ðì= în F ‘}êd¤VßÙ(õ†ç”wán[ûÓ¥ŸEtBIÅkXÍD›n} R†üÓÈ<þ ²2KÍ»CRæ ‡ž3àÙ¡ ”rÀXt9ÿ|ô+™w[ËüÑæÁŰOX„ˆW*^S¡Í}óá¤þQ»vAmàÎcŒ1ÆnVR-q…S¿)°);ˆÔý1ÐK¼àØëAxŒTAûó{È+«œ4¢‹1^ uIDATHP@&4>À•ø‚Ê$ÙSiÕ“¶¤·ŸƒöÁíPvñ+ÄgÖ]…×èaüerÄ>UQ°ýÀÅðõÉGöñpµHK¿©ðY ¹ñ5\I*¹þ3R7¸„¼ g‹øûœP3ÆcŒ±›œT›2¹ód™ •‰òE””{Àn\ØÙÊ‘WVùèYA ™Ü}NÊóëyšÔ.Ý;‚RV#áô)è (ÌÖCõàópïè…¼ÓI¢æôlï…§Ÿ J-BJt.@iV*Ðêc´î}/ÒSv£ÖÃ;Ø÷­=2ñûZä•ñ³ïcŒ1ÆØÓð5Õ×j µr‚¹(/××HÉí`!5À$µ‡…üúü\PùÁÖ(ƒ4p!º?¶nªxärO_È1U sîRŸZP]'S>ŠâR‡ž°RÔX`Û>¯Ã¯½9{ßGz6?ÝŠ±ÿ·w§ÁU•wÇ¿÷Þä&!„$@@–$‚‚ n̸àn—ª¨Ô2Õ±:Ö±vtìb[+¶ÚjëÂÔÝêµÎ(Ö ×© Š.A‚Š@ÔÈžÜÜ›§/I€`Р8|?3Ï‹<çÎ=9çyñ»gžûI’´suêŠÑÜ£ØëÈýH|8ŠêÍO}#ñî´Ö'É9êFö@¨+¥bþý¬^ö­@$³€4š¨kl!Ö»±ôt2Ò4Ô' wiQH|íCäi9¹ÐZNssÛâÉš*{‘ƒY?}è/’žFíì«X¹²Ú7ÛH’$éûÕb½Ndð©ç‘Uv7Kæ-¡m¬ Õ³X:c%Ú}=Ç\È^G_K´ñ*V”Õ·©LPÿö¯ù`Q”–º$9#wÞ?ÔZõ>õ¹cÉ9x ½Ëï b]»,I’¤*ºÝ@Ý÷4ö™x+n§ôÕ×iîð©r+­uK©œ{=ÈVDM$É$ž•­ $êê‘LâÙqh® Ù™ Õ¤HÖÖ@4ŸŒŒX›þ±=‰PCsÓæKU>Dz'þJyãhŠ&\NA^Ü»,I’¤ï'TG²gЉ§“¾ü6–ÌžG¢S¿(l¸Ð¸Œš:è6døæùÓ™ÃÈå$;57#¬X@#…ôÏW³§£=ÉZëRßÚÕ‡ÆXõÌߨH@ÑÉ›årÜ’$IÚy:˜þ‘AöèsÉc!+–”“–·çæÂ–Jšjd’=r"=Z>¥¡¶žïKa§SUCåGWõH­¢â½RúyƒŠS^ÝG]@.¥|VººS+„šÙ”-ÿCޏ‚B§j}”nCÏ¡° žª—^§©u_š>`Õ 3èvúdö·ˆE/½I‹¬%I’ô…êhÙ{äB| {MÓ~[Åݼ?óuZÈ -«ˆž£N`@·8ÐBKåû|ñò ¾øj>uŠæ%·ñQúTŠF_Ì µîmV?w?•µ;°Ì]¨aýë×ñIãOpèÕôI‡ÖšYóÚm”­¨ép·Öu³øtÞ!ööŸO˼ã’$Iêrp I’$éÛp²±$I’d¨–$I’ Õ’$I’¡Z’$I2TK’$I2TK’$I†jI’$ÉP-I’$ª%I’$ª%I’$Cµ$I’d¨–$I’ Õ’$I’ Õ’$I’¡Z’$I2TK’$I†jI’$I†jI’$ÉP-I’$ª%I’$Cµ$I’$Cµ$I’d¨–$I’ Õ’$I’¡z—/þKCOžšO¤Ë!ÿØ»ø8ÑÀÂëÇÕQUöÞ9a"c bŽ$I’$CõMÃΞÂк¸gÎzÂN¸,ÙE#Ù;=‹}öëGFU™Å¿äñ™Ó9PÜ‘$I’´KûafêáL>05Ï_ÆÜõa'|@ŠÕÂð’¡$/d½ãD’$IKFµ[uÇ39âÖAœxVwò2;ص«j¾Ìçqî jž»çÍö7½?Çÿö1|ÑLj)[ô·œÔgÃ#ùŒQÜðI zÆÑtß´OîD^ ’+“Ä\ÈüÉj–¾ý+žDÞ–'=Ž×æ]F?úqÙ¼†Ÿ¨{b<9,I’¤ÝIuX¹eoÚÞ½wF/޹y8¿Y<’‹nèˈa±vsEºªæDjЧL¦hý3Ü;¯zsw$£nˬiDzîá˘tüxNå_‡z¢Gý‰¾ÛKG „›ÊmŸpß”î‡Cþ#Ýv¿~(ë?þÚÞÚ¼$®\áEÁÖ[³“EVftÑŒ½õ=¶TûÂGõÖEÜ6.¦ƒRh„º™ïbß}ô3þ]ç>/[Ž?ßë;~mr2oTwð¼¨x‰“‚eõ#çcrzö§CÿýT:¶Èú˜B¡P(ÿ›Zòߨˆ_óeîu½ø®Iß¾Eâî‹&‹q§œ)fÿåqñÜý…DÚ ›…Ä_ƺú$…]Xšè7p 8p°8íîmBˆí➉ƒ›ïë—*ÂtÍu™b3Eÿ#ï%bMš„®Û±Z!DXxV¬Ð€PqêÂzá[s…è®ë\ž~iaÍ£‹g¿]!„s£xîš3ÄÉãÏ׿¼MxD¥x眸–rÿ‹—yxx¿õ‹¦ŠÈ#¿Ó‡‹¬ÃDjˆ&WVĹâ{!Ķ›{ £l]ºx1ýý:!ì«ÅcO£N>_üßâr!ú ?ósáûÅÃ̇>÷#³\¿èš{ÚÕÏ€E®hMk¾/h„xºXˆòŸ$‚&öcĿ˅8ðè– .ÿ6‹üðQ¶ù=q÷fŠ—ŠåííéP3˜„¾Í=!ã^•¢N¼3!TÚdÚ.ç‡2¶m»Y x0G¸¶Ý.úº[ìö‰§Gf/ËñX¾¶/gŠ]kü›%¾¶ qà‘Á-öjù<ætñÂþF±áþ‰âì5‡'³ø|§åHù†»KÇ„Ãúm7qá‡uB>'&DjéÇŸI•#¥Ã@žƒõ‹cë_êR—ºÔ¥.uý^Ÿ´nŸîœ{ØZrF 'ψá´Ç{ó;0÷¡úfëÛkÝU÷È ‹›ÈŸ&™Ù÷ì?XZéû•¬¸;ØöÔ¼|O_Õóðí†r­"zä¹ `ï.)ÆÓú±§/ßÞ ýÏeTŒ¤¦t¡dOœH×®=g*SÏ»Šç FqËscË–ofô£_òìL/ ¯ÂØQ£9ùŒ9ÜõâWìµ¶÷Ú+ ý.MjÝç¼²¦þà§Þò÷¹ O?ú <‡÷v >鯯൹±,»kgwÿ\eíÄîí×¥³D®ƒ†Ò¼-Ÿ‰†m|·Gõ!\tñœyߟÈТ˜³¸—ðИÿ¯]7œÖ]ÍRåZP<݃œXƒºÓ=Ò$u®Ù¹w.s“9ë²Ì²þ<‰?M¶àÏzÂ2&qý-ã1å~Ââ\ç¡ÍÇ ó/‚f 4q³nºˆ´ªÏxcsSóç®rvâ'_Ȉ–=³A=OeLl=ë–àDΦà`ó]ýé>x&óçbÇ®Cáqô ЖœBùl*vä?þÚp9Ä©¶[úpÉ%Élû÷ûìÞù¯îèΗhÿȬOÃÄØôŸŸˆ¸þ{êWs{ÜÞÝ©G׺ßÖȬWßaƦk8÷ÁÕÔûŽÑçý”#çþí¸-4"N¾ŸïãÝëæ±¼N¤>&SNàqƒãˆ-ö/…B¡P(þg9衦ùg_¯^œÏ÷Ÿ7a5˜Éº4™Ë¿½_d0ezÁú®»GS÷¤hvvü\€ËïÝø¤®íYªå\}b4è«ùžûï]Ç€»ïeB¤&)ÏnÎ4b2âÁ]Bn§­ö©Î-ÆE<1ñ.úž/aɧ¯qÏ•w±™ÁÌ<%¡åœ˜‰˜äH¨ÙÎK—ñÓÚ5¬\ú¯¾ø yí)5h sf&Q³øUÖ6´¯žüÝ;Ù¹k/%¶Ƶ©3¹ç‚(¶ýíl®zü=¾øtÿ¼óÖu$wuy+Vóíyë_™œlACOXr6©a€1£îÏŒ1fê~þG®œÌˆa§rÍBÁ¬ç–ñÆù èdËŒ1ØŠ]Lxc;%µN\?𯋳 î,YVò¶–B·~t7ÉØL=äýY×íVx<4ä~ÃÃcwrÿÅ÷±Úzè{y™;–çøî9º]X‰Ï禱h-o\¥ç­koã«ÖA¼·€Wü‰Lá‡ýøä÷ùù§»p>rú²ºù,¹„M›u/¤ÞbîO‡‡å‘½®â•ç'Sò̼’ã–÷C‰¶RŽ_[H´ÝÒ÷fõØÆ«Ÿâqà³ÿì¡ûŒK$o/cL:14RTê$<=ƒˆÐt2ÂíÛ &h#€”K_幑_qÅŸÞ£ÈÓN —òyÿåHû†»f ÀÆÅÿ¸šn›fÞ×U´¦¤rúñïc2å7dú©ß~!Ù¿ …B¡ø 0ÍŒ;êc¯—Ê•|µ¢’¯o5“qN<“ïJ c@4Ñ‘÷M{­]u„˜Â‹ï¨Ç³…¡lâÇK™4ð&ÖLÐ6q넹üÐZ®·žœú¥?Þ¾—ïú‡ç<ÙÁ;oä¯ã®`Yck&m£¸À ˜N¨e=Õ{ȳÁ€áè/u|{Ë|¸äE¾(=Ÿ ½Í‚7^á/wRïmgì9hô¨æ³W×Ñ`ÝAãÉ¢Œ7Wá–¸¿Ãº›™ÿ‡[éýÁc|]p[ˇÍ%º¾,¦Ñ ºÐD’C!çÃóŸoŠð›·Ï%ëüÜ{íx¢?|Ÿ*‰r\ûþŤ”zBSG3ëžWxéíå„UôæÊoj;i€Ý_³?Ë 8}•ŸqÙÐѤe áìçsßÊïÑFç¾MR2 yºÇÿÚzÇ.ûº‘ ˜T†žw¾¿‘°‹‡2ë?ExÐ’”EFh1_=ÿ«Œ'‘ì føEs9óåŸXç’³i£u:lµaØ¿ðÁ²'ô팽íGꄼJµ=€rälÑiJLŸÙÐmë£|Ñ’]æ}ú.ûºš™}og퇔̇°±þöA¤>­£,ßÍ)7·I®ÎáÉÇG±üÚ>|ÝÑ ¦„ÏË”ˆotj÷€læ~×pë('_^ø9íš¡cýHù˜L9Ä ™~*×/ …B¡ø]0®yôÕÁkSr˜~Kº¸~ÝpñhAóõȲd‘Ôõ÷tvéº]*Vú„Ø}Wa:øyñ¯b!*^'ÿ7Î׊§„ 0ˆ”«—‹¦¢7ÅÝ‹9S¬ —¬Bl7öšֿ[).í&yÞÔ!þ²õˆó½aÅ¢F!rèعbLñbØŒ›ÅSoµBÛÚGĤXýe†ˆ±ÿ.¢âqrhGçbSÅõ›šëŒ:â»°‰‹D£(/Œ –xÑ–D]EdbO‘™Ö]Äöû›Ø&„X}š0€ÐbgŠBˆ=÷ö=äZŒøÃ !Ä–›D†A®œvë 9Iü»\ˆúwO¡œÁD‹3–ºÚ¼ÄÈ¿êº_.~Bì¼#»ý—Žut…M¯U Q÷Î*)óûL1ºîⲕ>!6ß(Ò ÂNoT ±ëî~ýR=Q<_$DÓ'g‹(-P›".ž*’<óØ®u"ò¤ûÄj»y¯_(RLû¡TÛ¥ü0À3¡µÝÜ_<#Ú%çÂ,)³>õ:±Q±ê’„C/þÓu—¯Blø£HÖk"nö Ñ!îÕâš½„ÏË•°oøí;21¡åYSÿž˜r„MüëGÎÇdÊ‘‹Çv¦¸ÓØHÿR—ºÔ¥.u©ëóÚ¨RŽL•õÉ1ÌøxóWeó‡›bHMðQñ]9Ÿ\²{'Rhïº{¤Vzª–³`µì?ÿ•ñQº_ÙÄ‚‡‚÷îæmí"n?-<€3>jÖ~Êv0ëôÄC?ÍaHfÚ%aÇbÖTŸ€óÓ® 6|ø™>„Ä·±kÄí<37óð3Ñ¡C¹bz<¿ÎÆŽVò…“F–@ØÛàmû¾e œ~voÿ¿a,SnêŠsÉ-äOÞCÿ†ùûxaÝÇšBÈœ2†„V9,éŒN…¦Ü=T{äÊiXçמ¦ž³¹õ4#û}È>§ìÊå¼³VÐçÆ[8%:^|t†NÎHÈüˢà×ÊnˆîË y[KhU—¯f#KwxNM%B¨M¤’fóæ—óèñî ÆÎ}ŸWà~(Óöc/'pLigsaz!ÏŸ;„~ýúµ\ùxQ =/˜FšQNfoùj¾+€!³ÇÛzF?îdf‚üo×PéÔ|q }ÖÑ~ýFpùb+½ÀyÃf±¨Ä+áórå³otØw$laéÍ…çöÀ¶ìMÖ±Úê_?r>&SÎ1Ç®Š- …B¡PüvI11G~êµùˆ`„ª&6½UÁªÿÔPP!NÈ=rygoß0Ÿk×ÝË—Ë-Üû…¬)60¼Ox;7‡“Þ ÛîÃõÔ±wVÉÓ›I¯¡Ä§†)ý20®‰’=9T¹Ú‘¿ñgr×<6( f¹sÞäî…ã“g>âIß]¼»[Ï 9ÿà鑵¼7ýõ¶é+áŒ{à ¦×.ãÛ ¹T9ƒH?†D¼ì+k¢­j†_Åyqe,z}n¤óÕ±ã§B¸ù6î¿¶’Ë#I³üÄK vá(\Äÿ½x7ßݹ”ņÿã¹epÄŒ'82oì¼.à¤þ ÌJ§÷ÈÓ™}íuœž´'Îø#Ÿ”·HìØÎËÏlàæGŸâ»k¸ç‹²®xŽ›’óyfÖJêeË!”ὋÓ7°é@-¾ˆLN½jsã+xãÕfÙZ‡¡‘ÙÃ9ÆI÷AÓ¸þ[}àY&=¾‡´?àÍ?Ïgîš{X²:Šùü‡Ÿ ÝDöÅøÄåÌ»÷ªtÝ9óö?‘U°‘Ý¥V´ÈžŒ¿ò>®Š+ãµ—7¶èÊ¿Ì]OÇý«uŽ+,%›ìì‚bÓsѽüs´‡U7|M‰<嫸:ÇÄÿzŽ›´œRà‘±)h–nôÊŠÇÔ‹x3˜b³è?°‘†š\ö5á3Èè0„‘wý“s´ÅÌ}9—ؾ‰muqk»÷×á‘òÿm'€rüÑyÛô˜|!½›~æ†ï7³³ñPªø`ž?\ȤÄÇÆ—Neönãù‡à†_eÑCÁ<¾ ÆÞú Sµøã Û›}¾!ŸÝ;ÛJBl­äì9@@ÂçeÊ‘ñ )»ËÛÂÐm“S`Û}›i8Ò ýÈø˜L92qÃ'ñ”Š-ýK   …BñÛ!Ú[BÖt"ª¯YXô,3wÕ=Ò—ND¸F¼°lŸ¨oÝQW“+V½:Gd˜ÚnkçâŒpÙíÓFÑëo;Û)d—¸3ÛÔÎöé–- qç‹O­Bˆ~’ Zp¶¸è©oENcs-9ߊ§.ÊÁZº‘Ù>­§Ï_,¶–;¶ÈQ¶U,þûy"µío€.N[P#Dñ3bTpçõêã&‰ùß§Bx«ÄÆçϱºÖmÚ‰bê=ˆMåî–Ú\¢:w…xfZ|›Ÿ&ñWWùL¡Â)ªöý,>|ò:qj’¹öw“ïýXl¯ö !„°ç/O\˜ÑfÛ¸D9ú1õ‘¯ÄöR[‹¼vQ²ñcñÐŒL¤µÚø\ñŸ«ðµÜa+Þ,?y•¥;†í‹:1äJñ¯¥»Eµ§ECå›ÅÇóω¦žâò—‰åΖڬ¢pýâÁé¢ÉËÜõÛ§;î_ºøóŇ%Þ6_ØDé¶%â¹?ŽQº6?¿ÕóBñØ×{öcoõ.ñÕcˆ s 6E {B¶#NýÂS›·€ÊèИ)nÙÖÁ–݃}Ù¿ÿȵ]ÆŸåü§Ó¶ëº‹K—{…X}¥è¡;ògàn;„W¬¸¬»0HÚ }ŒwÛ"±­¶ù®Úmï‹ÛOŽ9ì'†8âHÄø7kŽþ}a>/[Ž?ß±»llzÊQ+*ÄK'wp”Ä~¤|LVÏþt(ñ”ÒDÿR—ºÔ¥.u©ë7ti-ÿ£P´Ì“LfaþRN~c$YY‡ý·R—B¡P( …B¡P´ƒN©@Ñ–È1s93¢÷l;áIê/Y—B¡P( …B¡P¨¤XÑ9Z'Í=ƒð‚wy{‡ã·S—B¡P( …B¡Pt”š ¶O+ …B¡P( …âwŠZ)V( …B¡P( …JŠ …B¡P( …B¡PI±âØÐw#fÄz$E )m( …B¡P( …JŠÿТΧÿÜWÉL iû)úÄËpÕkôž&§$}"±ƒ'e°.…B¡P( …B¡Pü·0t”+âO%qÄDuï†Aóâ©ÝLÅê×)-ª;ôf.}2‰üîá‡ÿµuÙµìÎmlÉC p©ƒGdOÍZÊV½Ny™õWð†/–Œ±XÜ[),³ž‡&cÖ™ðEEvÑÊouSˆ}=²²0é}xª×Söóë”—6¡ }äPâL$:¹Á– ÝO…Õ+_Ž?{Y†‘qîµD‡[ð5åÓ° %W`sµ–¢ÇÔïAž”rt‹ÿɦ/7ám‘W6„n#Ï#.5£Þ‹§a/µÛÞ¥hW.^aÀœ>¤Á㉈B‡wÕ*Ö¼AYI2KÉs|÷xsf˲ø‚FÐsúõD…´taÇUµ…Ê ïPVX{HfC7¢‡_Nbïþ˜à³î£fó›î>€W`ÓV=FžLÚ™×^ô[—ïÅׯ§üëP²/ûóÙ¶ûõCYÿñ×öÖ[¢‰=ëiÒºiØ×ÜÊέe‡d‘•9 ¥¡‹™JÖÙfÿˆ|„ÝÛæ»N}^¶¾!ÙwüÙÂMúE÷ÓÞ<žã{v/|«GF?’>&¥g:”è§²ú‘õ1…B¡P(¿Ó¤X—@ì˜ kZFÑ·{pë’ˆ>›S‚p¾ûª›Z† šƒ[cNë Ó‡ÏÚt(ʾ‰ìQé4m}™œ2xIgÞˆ÷ýG¨lôþw[¯ïAtVÞÂ7±ºÚ•|¸ö>Îöšnøjà=QuiáDžr7i)¥”-ˆZk(ხ iÚ­ˆ÷¤¼ÞÓòÇ&‚ú^GÖèLœ9ßQùóWØ­Õ8í¾ÀÊñc/M†9Ü‚}Ãcä— L±Ãˆz }SRØóé;4:Ûêè…Ÿ½Dƒ»ÍGºÒ"N#óü+·¯§ô§Ï°Útcú¤oyß¹@h<…Ÿ·¾Ÿ)…è!3IœbľðIêBÒÇää9ž{„³ éB0…°¯{ˆ¼B'ºT¢_BâÔx|ïÝOyƒ"lÌÝddVQ¶b>5õ:‚3g“:î´Æ[È+j’³) Y2ˆ8ƒÄAƒ0ž£œJB‡2}Y¤Ú.íÏþã·í­®?š„øzJô„÷‡eÇ“K9{£t‘“ÈKîÚÕ¸ÔU¸ š}=Ýû$Q½6ÿ°Yy}ò- šä%çí§,káDŒ¾ž¤´t,¡Áh€·a;Uk_¥(¯òÐXÉ”Nü˜9tËÈÄd„ wÍJò¾xçÑk>ºÈ±Ä„Ù¨_‘sh02Þ]ÍÁ Î¥O±éóõG'ÆÆ$bG]Iì^˜t^Ü5%èWŠn¯.,ýHH ƱþEŠsJ@S­›àÙ·’Ð7™ÊŸóð¡¡O˜Iæˆ*>½•²êv~ÓWª {µà­ßµ´J·R[PFï /&mÀr¶¯/h3.µã¬-ÀÞ^ƒµH¢Oº„pÏ*r>yñP‚[°–ªCµàÚ¿€üý­ÿÞ†ÕÕ‡è©É„„è©sxä|LFž.¾ÇÛX„­ºª÷Ód!rÆ™„†›“,Cw¢R"ñä|€­ö-BzÎ#"1]Q“œM14à$%Qñݳ˜Æü™¨£%ñ¯C™¾,á?B¦í²~èWÏ2mo_–¬‰Xê¿fÿj=ÏŸH\ôgTºäíHŒ2 yêL Ûã@Ød&êóåHù†„Ýel!8+÷á<”Õ5q2!öoÙóÓFÜB2†Ëø˜L9è°Sÿ‘‰-²>¦P( …â÷›à´ ÔBbÑS…ÍÖ&[5D`Ô{ðê#1š¸]‡ÏµkA™„‡‚mÝ>ô}ï¢ÿ¥Ÿ=Km5D$öÄ åã’ÙC­Y°ôèGo)–lÆ¥EÞÿºMú îEó(«÷&BGÝFJFe+¡®Îæ,a^œnÑîÀÛ’5“kU•‡¶3 ûZrß߇^Eô¤;èÞ®<Drii T¯}–šz–¤‰$FwÔ€öëÒôÁè5ðÚì‡tí*¤¡¢âÑ“‡O 'bØi˜©$fÊ3$†˜Ö\j¶¼Eá®<¼B² {µ‡¨_IYÉ,zö‰eSÁ[<;ÀÒŸ¸$#Ž ‹©wÈX‡>¬/ñ{£5|O}ƒGÚÇþ{è›WûŸ„Ù±ÂjgëŒv«À8ŠsN.¼¡M¥U-“þm nlëî`Ë:†t’G‡ýôeÿñH´]Úý"Ùv}"1™1Ø·­ÁQ«§ªv YÉUæ¶SO2ËÆ(]ѧ\GTÕ«ìÜ”ƒyü1ú¼¿r¤|ÿÝ·…†¾Û RÒ5K>¤±%0KëÇŸÉ”pÜà8bK ýK¡P( Åï3)n;¬ˆ˜@Ú¸þ¸v̧²¾Í‰?S(¾&aþÁ „u•ë^£(§´y»©%¬v7úØxôF#f£ [“ bã0èÀÈÞä¦ÔlÅ 4Ö˜Ÿ5‡èî”×W#0` gE;±Ú½@.®-Rˆí'ÿGšÚ®6øl¸êl sâî ÿÒBGÓ==ûšy°ÌYÆ IDATh9ÃX_j'²ï_ÛWhu {. Ðmà„@C“}hwÌFÀmBÓCQñF¼åk)Ûº »Ó€%cicïÂ`¿…œ¼z¹r„{µgu$$bÔÑ&)îC朷ÛÜW@á{÷PÞàE’Œ ¶Š*ÿçÆƒÆÒûâk Õo.%Ÿ„µÍ¼‹¼ÌËs|÷ì!÷­©uú$ô´~Z뿪¨úvá¡A¼¨¦úÇ× ?óJ²gõ¡î@9¦ôÁø¶GÕóyÿåÈûFçvÌ€.–˜‘§b¬~—’¢Æ6ó‘Çðö|L¦O qC¢Ÿúï×¢‹›Ã€ó&cl7,¶9s­P( …â·žkèc¦Òó¬‹ *~‰Ýkv¶XÔ/aïÂ%€]h&ÑC¯&íÔ{ÐÙoã@qÛ3Ÿ.šÖÞÉÖí:ÜVaÚ<.¥ÿyS0µ¹»×å-ƒÛ2v¿÷Öv26á(ÅéàÖSy6V¿EíW’uÉply«¨ÞûU…Åí¬®€.úd¢‚­ÔíÙð™a]xo,ÔQUV#•¶tX—7ŸÒïþƒeÒlz]4­õÃæöÖ4ËmˆÂdGÞ2jŠ›ë³Õ¼‚%íº÷í!o ™r²— GœéNÜ­/ˆ>„lJçØHÞGó0…§ÙïBzœ}|ú %UÎeîDž@ïùüUÞcÃyÄMûÚùä9Ð̱„¤M#iÒ|ôßßÍþœ:t! ˜µÔï\ŽU׋ha"$óT"vÑ#gÓ@LáG‡~û²¤ÿøm{åÈÙ¢3ŒXzŽÄXý9uMÍçÌÿLj DG.¤©Ê-%³LŒ"h(É£3i\y ­`Êø¼L9øFgvÈ EFB¼›úoWàhw†¬ýH>/ü–HÜè§rý¢c|µŸ±÷£å‡M ŠÝ 8¼( …B¡øí'Åú„éôšv>†Ügصb ®—}ø¬{©úéeBRæJAñN„£LAfðÕã²Z$¦8+ñøÀW»˜½þˆè»Í!{Œ‚Ï4Ïèûqzèà‡£ÄQ£'_Ý2rß[OpêXb2O¦Ç”3H¬üœœ¯ÑpØHÏLpöHŒŽõTU9:äv:\´öKGÑY]oå—ä,\‚>$ƒÎ…×0Žì f! Š›WBEó¶DCp›Wòøê±ÛA³D¢×Ç'QŽŒ½Ú•ß‚9&lŸ+¨ã3}>{)nLÅF¡•v®JaÇY“‹³&—Æâô³î"a@eßï:Bîöe–;£à=ÕyØ:;Sl-n>£ÊšJsðÆ>CúÀ˜ö/Á©ïMòiÓÐm½ƒœME–P¶y©3î$uÌÏÔ-Ý„Wʦôb¿:ô×—åý§Ó¶ä‡2¶è}‘i±há—3ðªË\©Ý(ª*”’Ùå7FizL%Ê ŸcØÄ¶5O¿Ë‘ÿÞýTúõyÉr<øF§vÄ&‚³Çavm"¿¸áˆÉGÿ1\æy!õ,$nHôSùØÒž:µ O‚5€P( …â7Ÿk!'‘>õ|Œ¹O³kź#¢ŽþHwĘ$‡+ÄgöÆ»,ÙDÅ€k{nó¿=u8jêšÇ¹!6„Ï‹³¦»û[äkÀ–÷¶¼¯)Ž:“ÞÌ&¥÷ìØÜfeL#6-ÏåØ:¬Ç× #šÏ扶cÔØExJtå:`IÕåÅÛT×ЃøÓ§äZOn^ËBwMVHHʸ©¸ùüž!ŽÐPðU•‘ôodd Ƽ©§„Ìþc”@¾ÀöÌmt`"xÄ]¤Ç®$çë/h´ù>/ðÊ”£«otÔw$l¡ïATj¾’‡%‘á>&UÎ1Ç.Š-G ‹»LmŸV( …â÷› r‘läÀîr ‘)‡ntWáh´!°2à\ÂÝyØ›¦³Ï'.¨ª=-olõR¹y ãæÒs¸‰òr8‡v‘¿«¨‹2ˆÐaåÚICU9¯ S·LŒøpÚëc'i©£vO' ­°a/¯†ÓèÑ·:{&ý^ªö•à³®¦h×¹d¾ƒLÝ"*J*æÞ9z¹óº4t!IEÄ7€è¾“)¤ü«W©³·”ä-¢rG £.!}ˆ•âB+æ^—“ZEù²½‡~Ø_9öj¬ë#Ò Ið`ŒLüð3 iü†½[ äíå«¢jÕ§Äžw½Î ¡dËOX›¼Â{¼›’ Ûñh‘D œˆÅz»ÝfJ 4û|b-uTínÕ•„u9A˜£Rj;!špÖU´­>´;–ˆt–8B3§“ïÅúÓÜ„}/ ºt9 ¾¯h° L‰gœ¤Ç±iOK² cS@%"Mߣ4K7‚¢xå8šœ “Ñ¡L_–ñÿm'€rüÒiÛ=“FbñäPP’ßfM×ÈExÈ—Tú$d–‰Q®*®Ãã£ÁåoÎúJ¼> Ÿ—*GÂ7¤ì.o -¸á¡`ßôvg©.ác2åÈÄ á¿Ÿú¤b‹ÿþ¥¶O+ …Bñ{OŠu‘„t‹ÓPÒÎzøw•/±åÓå¸1cJ%zàƒM€wÕJ¿]HéÁ³ž^œ»Ÿfñ R‡ü‘ÌÁà­]KÑ—¯QÕÎoûj–R°JÈ½áø¨üÒˆN‹ |Ð\‚šçö…½úÍOSÛöìoÁÙC1Ø~¢ª¦³½wnì›_¦4f.ÝNº‰XaŶëjrJð ?ÝǾ¦ËHì7‡ÌzÀ‹§a5õŽÃ¬Îë24è6úô ÇÓp€Æo²gë4¶}KÛg¯á ’ûßDïa>ëNÊ¿{‚¢r‡|9š{ o#Î'ÑÃn§Ï0ðÙ hÈy…]¤) U¯òCö|TI⨳ˆ?ù/ôÐ@Ø ¨ßÛ2È4a Í&®ÿÙX‚ €WÕVJ¿iã?šŒu5i$Ÿóð޹™} §ÞׄË&ˆy/ýG¸p×î¡jåï®hö1o>%_=c/¤ÇÔHp–P¿õ_ljýI+›‚.ê,zM?ãÐyûÔkè“ Þ܇ٲl'>Êôeáß„LÛ¥üYŽNÛþ} a©Pû vÏá~ç­ÞŠƒYDw £²HFæÀbÔqù¼T’ñ »` -´'f¨©o¯OIèGÊÇdôˆ;é§ýHô/O-öêZ5JP( …âw€ôPí7ƒ©?³ï tï½lÿyÿ Zmü/Ô¥P( …B¡P(Š€ÑýÞ¬O8•S5µû Ox’úKÖ¥P( …B¡P( •û!„ÐìAè­«©®uÿ†êR( …B¡P( űðûÛ>­P( …B¡P( E :¥…B¡P( …B¡P¨¤X¡P( …B¡P( •+ …Bñ;Cߘsè‘ö¿Ú-˜¾‘2(½ëî¿ý( …BцßVs4ô‰sè;u<Þ-°{ýÿÚ[Ÿµ ô¾èjBZ?(}ŠMŸ¯Ç{BkÕcLžNꨉDD…¡ ;®êí”ÿð<å'ðe_ZÔùô»`Ž%7’SФz•âWˆ…Q÷Ñ»¿ŽŠ/æQXfW*Q>‰<ƒã+J‹þW¡„ö9“xç^Š·ä)ý( …Bñ»MŠC“1ëLø¢"s6[Cy2ig^CxÑl]¾7 [Ø×±ÿƒýèôQÄœvÝŽUŠˆiô¹p6Ú†;ع©¨ù­hºî$œû(ɼÇöÏ>ÇÑši$}òy„”ÊÕÛp †PÜï l»KÆX,î­–ÙNˆMuáÃè>j:±)©uàkÚOÝö7Éß–‹Wè1õ{'¥õ—Þ܇ٲlg×NŒè“I¼àït?ücë²kÙÛØ¢’nD¿œÄÞý1ÁgÝGÍæ7)Ü}o—¾Ö®+ÛîOÏ€!¨asHì=‹ ¼õ[©\ÿ%ûËðê«Z4±g=MZ7 ûš[Ù¹µì¿ñψ)*M§#(ÄØ»X‡z,ƒþNÿ‘=Žø¼„âEÿGi½GÚ¦RåøñC]Ì,úŸŸßH^©ãàÄ@ØiÏ¿”ï¿Ýû †fC6éÝCŒ¹ïß³{á«X=]×/ºÊùÅÿdÓ—›ä&9µp¢N{€ôŒØƒ«·ÞÆ}Ôí\DÑö]¸}Çc¦’uöÅ„Ù?bÇfÏ_mŒ:Îvù%‚˜sž#=äsv.z›´è è?ã<¼+ob×®jÉ8¤Ã*‰#Î ª{7 šOíf*V¿NiQÝ¡2´PB\Aêà‘™ÁS³–²U¯S^f=¢ÙgîqêGF™g\WéçkW òOìºdlÑ%ö’ñCÉvuIl1`NŸNÒàñDÄF¡Ãƒ»jkÞ ¬¤ñûÎqö‹.•¹ |Þ˜Bìè+è‘•…IïÃS½ž²Ÿ_§¼4@ýtyŒ:Ñ2ŸXßø%Å>\{g{M7|µŽyUV³d=p‰ƒaŽi¬ækÂYÛ:®ãì‰úoÈßz}_DôžÇ©¶©çe$Æ–SöÉRÚæ»ºÐL,újÖJu¹ë—i»¾ÑY x ßÄêêú´F‹˜DÖùs³­¡øÇ…460Åô%'â°êPøÙK4´YÎò®ß) ™1À±å1öçÔ¶t@>kë yacî&#³Š²ó©©×œ9›Ôqw 5ÞB^щXI?þ¶ûÕ³FäÉóè™QCŪÇ8P¯#8s&ÉçaòÞÎþüÆ€|U MB|= %zÂûŒÃ²ãƒœ¤5RûÝíìŠÔpTÕŸzqîù'; -R¯%{8ùuv'îÆ@&YŽ_?ü•áͧä«û©ÔšªÔ‚‘4ñ\L…›qv©í»Êû/ á±èjÞgïò­xu¡X’Î yÔ]ÿ] ŽSºÈIdž5“ cÒϯ7F_»d’Œ,A@è(¢#?ÄV-°dŒÁ ¸"#ÐLŠu ÄŽ¹€°¦e}»·.‰èá³é1%ç»ÿ ºÉר•uÉØ¢‹ž~ýPª]][B³à)ü„¼õøL)D™Iâ#ö…ORç]7V—í]$s—ø¼Nä)w“–RJÙò‡¨µ†>è ’¦ÝŠxÿAÊ[&~ýë§ëcÔ‰—ùÄúFÇI±¹ 畘IPXz€ ëšûسµDêÁ¡‹9ÌÉgfÁgÝK]‰ƒŒ˜=û©Xþ$…ù-XCä9$öJYà©ÝHÅÚ·(-hó€ò#’Û•µàQ¤ŸuQÁh€¯)‡šÍoP¸«uËHЀ?’”TDÅwÏbóg¢NÔZ 'bô $÷ì‰%ÈxqW­§bíÊŠ[gÞ\4myª^w4¤u,$Ž€gç|J+]í®ÂÄóq­‹0koeÇ–:Â&?O¯·Øòé¸ÛÏ<’ìK®ÁóõŸÉ-öÜv]äXbÂlÔ¯Èiw¨O¾…A“¼ä¼ýÔáƒJ} ‰>L|E›ÕÓ0²çüÃê›Ù¹­¡E=ö"Â<«ÈùôÅCA¥t35GÕdÇY[€½½¹€ ±d_|-æ÷°ýç¼–X0“Ÿ%+î;v¾÷ŽHI_Õ,L^Ü•¹Øj¬íô¨îD¥DâÉyš’œ}ø[í[„ôœGDbº¢¦æUU¿~˜Ò‰3‡n™˜ €pá®YIÞ¯ÓàRm×BÆÒó‚k -|š߯Ã-@ Aú…7ºÿì\µþõ¬…'13 ëÊ{)Ü]…¬åEó)#ÆSRøŸ„¯¶„KÖD,õ_³µžçO$.ú3 ÚÞ£‹&bÈe$õFEáÀU—Cíšç(,lŒzœ¾cŽh±‹Ú/¯#·¸euÔr½/½ŽP¿«|øì#ÑQŽÝ¡aŒq®šìvqdPôë¤Êñç‡+†ôÛ4)ªÏþBþÁI4AÃ¥ßÀ2rÿóµîdÿýT¦¿ ÎÊ}8ÍÂ5q2!öoÙóÓÆC1INXÿ‹I0Š`ÂQ@ݶäoÙ…GHÆY“ˆu%=²{aÒyq×” \Ò±ÅB¸L\-iuÍ2l•yx€¦òøž¥gÖh,› °y]áƒ.!©ï0‚ƒ €wm5kž§°°¡MÙHž:ÃöÇ8v#™ í˜7ö|²g_Op¨Ñ´ª ¯Q¸§°Ù~’1ʯ~¤ž_ô¯NÚ%Ç„DÿÒ…c1VRWn&*3‘’:Ѭ•E„Ëï.ó•R¶øÊ}ž–vn¥ÑÖƒˆ³Gn¢ºÉúdâ‡ôA>KîÚÕ¸ÔU¸ š}=Ýû$Q½6_ ã »ûYuô/OWÄIýü’í D-‚Èñ÷Ñ3K£æÛû8p ÕÝÎdîʺdlÑö’ñC™vÉÆ‰‰M×þäïoý÷6¬®>DOM&$DOÃÓucuÙ~Ñ%2w‘Ï[ú‘Œcý‹ç”"€¦Z7Á³o%¡o2•?çÉÅ–®ŽQ¿„Ì'Ø7:Lеà~Äõ{Þ!Mn—ÍŽ®¶Jz;Ü“°°J¿~[ÚŸéÙÛNÙÒ‡qdü™´“Ï£¦øu¬žÂOšGf/5kŸ£¨V#¸×L§ÌÃøåä7ÉÉc_KîûûÐ뢈žtÝ;¸:ó¨^ÿoªšêðjá„d_LÊØ[ñUßLA¹ pc[w[Ö 0¤“<ú®žh,=ú`q}Åþ6ãÑÇÞï$ž9ãçwQPÚ²Ù¹“âŸ7uêU¤†XˆÖ~&gÞCƒzOEŸÞNyìtz6€†eÿ ´Æ |¶*ž†FˆŽÅ 7á˜Cô¸jæ 4bµ{O€m7bɃɵ‰ªÊ°uÚÒ¸D#Ž ‹©wÇ*´cÕ•–<Óš<¾æaD¼ oÉ&œ^Y_ õ¼úHŒ&î#·xë±[†ÄQ„˜sht tá}µØh*­:\ýû¡‰ÐQ·‘’QFÙÊG¨«³9K˜§[^¢é'|—Mß3®#£üÿØ»ËEôø?íø‚Ýkv4$ƒüéYÃ7” )(ª=Ôÿ}5Ôï+„“†bþ‡]ø÷U}"1™1Ø·­ÁQ«§ªv YÉU朰3¬¾uë_¤¨¢B†rÊÂ#ƒÐ x°oyˆí{ÍYc&=¦Ì%ʽœÊ*硺œÙÿþßÐk€CÌäÛù(Ãñ#ëä"·?”˜Õö”­ÀêHDF"ºò–É"]Qñˆ²E4:Å z£†¾Û RÒ5K>¤ñà ¡#î%»¿›ª5ÏPTiÃÐc©#þF¦ó6öìªìº-öZQ§ÜCZZÕkŸ¥¦Þ€%i"‰Ñ­HËÅÕöÿÖçõÖªàfŸïÕ×BÃÖ7É)ªÀgHÊiÓ´ 6´$uQDŸrQU¯²sSæñµÏIÓöW(©÷bɸ€¤ñ÷`pÞFîz¹%£Ùç—Ô²[çí’Šc2ýËŽÑh§n×.‚‡žDpž‡(ýJËRIMD§!¿Åó`rÐâÓ!±è©Âfs·ì„È$<lëö¡ï{ýG˜(ýìYj«!"±'-—oÈÚ½3——’§+b‹œ~~ñvÉÈ '"9M£ù¿G&ª22wU]2¶è{Iú¡¿vIŽ\“GÖ—ø½Ñ¾§¾Á˜Ì]å?]"sù¼>½^›ý=\…4ÔCT|"zòðIè§KcÔ/$ó‰ö ?Û§]Øs¿§¦Øq£Fl{iyøz‡a+ßE½g)™)˜M–Ñ$ö‰Æ±áò¶4ŸC¬/.D‹þ;=†¢´dY‡ìDŸ W tNÜÅoõû+þ³©"2o!¬[4Zyë¹Æ{ºñ(l{¨/Úh(>€˜1Ÿî#FR¶ø‡–¶ûpç½CéÇHJ…¦U¸p×—à5Yxð4”`¯u6u×ÖAï : cÚM ˜Dá»÷PÔ 5Øî]  í†b{FãÉÿ‘&W׫EœŒ ¶ ™‰˜>dÎy»Í¿÷ûÖƒÔ:QOÃÞ\7†È°Ï)«÷¢…ö#<Ø5¯/ —ðU«G ™Bñ5y›ði ¬»¨\÷E9¥Í_TSýã넟y%Ù³úPw Sú`|[#¿Ð€0„ƒ³ˆÆ¢Xí^ k mGà)z‡œ™ô=éVÒ£­D&WPüñ‡X[’kÿzÖc‹_9ÎÃö¹zñ4Ô è†Ù¢»GÂWA5–èBÊ j>¨Ë)%©ßX‚ÖæÒä-d$‰}cpn¾‹ý›ZfiMf\§Li°ÂQÃÑ2Û~ÊL¢Œ»)\üÎá«è«®¸¥bw'±¡3vQH¬óS–??”š,ÚIe©—Œ´ÑXÖæ5Ÿ¯ŒCL„‹úµ;ŽZ™íºŽKÌÈS1V¿KIQc›ÕÀÑ$ ˆ¡áÇ›Éß×2ùR^ÝŸ¥gß¡˜ö,Áéë:[tOÁ¾fZγחډìû×vŠGúF…ïÝCyƒ'€¸zø 68å’’¸vmÀá-dI}cqn¹‡œµ-&.1 c›~hÊœKjÜö¸—Ï„¹£V~AѶ–REùûICFb*ø—ÏŒ H?~Ÿ_þú—L»üÇ1™þå6Ecмx+~¤Nû3‰Ã}è Ÿ§Éq1š) ƒîcð{]ÄÒÆõǵc>•õ­[ã0àÀjw£Go4b6º°5¹ 6ƒ\^™g®¼Ý5C:}ËD‹ð!Üv|‚€ä‘-Õ%£Ÿ€ü¹ÓµY=û“§u‘a?%ËàMÒhضÿˆx¸ÌÇ^—œ-ºäYp ãÞvÛ%;þ‘%h,½/¾–P ðæRòùGXÝÇ.sWùϱËÜ5>/ì¹44B·g^ü M^ô¡Ý1· MkU袶¿ž»Jæí¿Ü™â惉-ÿëE´,Aè"úDÕEm¶áyË©/®£Gf̆e¸ºðÅÉZP_F]H\r*f‹†×nG§—áWr¼ÚSB]QÝ3ûa6üp°íZø0¢#Aø 8kæÝKšW<%ƒ·±±fS8Ƭ À@tb$5®E­> ŠÑ'l¥nÏþÃVuq—Òÿ¼)˜Ú|Öëò–‘m»ß{ «Tu¾vÜÚHðȇè¾=. é`’s€ÂÏ_¥±ÕW„ §ëPòæÎÿ–Ʊ$&5Žò­†añí£¤¼IÚWDýö.\èÐ…f=ôjÒN½ý675’€ÙXKýÎåXu½ˆ&B2O%b÷>ª=’~h£aõ[Ôžq%Y— Ç–·Šê½?PUXÜÎJFgmpbÛô/ ’%¥wŽ wP^í @Ï ;ŸÜ©¯±ô‰±úsêšš½Æ™ÿ3ŽˆŽ\HS•-¢?A4PS óP×cξ–Œ,¨^ú uÇ,üé° rÁ.ŒuþýP¦vnÅ7y41Qb«eŒÙ¹Žüù´Hõ÷6“ZÔi$Ä»©ÿvÅa1L‹èOfD?á†M82ñêÞ¼X]ÊÞ uT•ÕH<:8+œ¸­Í¾P\ívƒçÞp°Ûö¾Ê¾59ø]d‚¨§:¿¸cŸJòèLWÞFC ;g|Õ4–ÖAV6fý7¸|þcT`úñÿüê´I·«ó8&Ó¿<¦(tšŸûÕùЧ¿žŠõùx½` G§ƒÀ2 }ÌTzžu1AÅ/±{Íîv޹hZ{'[·ëp[=„ 41Õ™ÐqO‘ÕzˆÌJÕâ›8Pæ H¹Ø"[W'ú9VîdÇ¿žeìåÅ]²„¢’ãíƒÇY—¤-ºäY@Wù¼ÜøGÇFò>š‡)<È~Òãì»àÓ)©rž€vg?•‘¹«|Þ›OéwÿÁ2i6½.švЗDaÍ1¼,±‹ÚþKÊ|‚|ãÌ}Ÿ¯ÃNÖuÉwg#¡â§ÜIRø6J~ú'õµMÜŸäÓgµ™ÿ• i‡­¬ÄŽ›ApÍ"v®Ð“~ÞLR²Ö³oOµô€E4æà} ŠDPL!e[õÄõJpi4XW6ÖòP ΉѱžªªÃWî}µ‹Ùûáh€¾Û²Çø(ø|Aó,ޝ§Ð „M§ëÐú>[1nLXâ¢ÑŠZϱkÍ3Ô&ÓgÇY‡ÍÕÑ,Õf* ]ôì=ËŽo±ôLET¼Fc»©3_=tϺ—ªŸ^&$eÑÙ©ïÄgìMòiÓÐm½ƒœME–P¶y©3î$uÌÏÔ-Ý„WÒ}uËÈ}o=Á©c‰É<™SÎ ±òsr¾^DÃa3"·½y®‘Q:`ÉOðö…_Œæ_Ï^<  ‹ÂlÖ·™6Õ£F£gë[´üùª>È´X´ðËxÕå‡Ë˜Ú¢ªB4Í€†!18Õ"§1¶?îíó)ȯ?ŽF)¸ IDATùLÿ:ìªEWÇÕöü°u2G;¢:M§ãÐêž’%Ô:ï :;•âz=ñ½bpí[ŠÕu( úí§2ýý &‚³Çavm"¿¸áˆ§¡Ñ@õwRvÄOÈ ¯—'к:×hGé§Cßèà¶ ±s8«âC:-°¾¬O˜N¯içcÈ}†]+Öàj³„£LAfðÕã²Z$¦8+ñøäê× Ûæ²g_˳Q¸pÕ¸ŽCžžq-ƒèÎêò¯ŸÀìÞéØFº]Û«kmq¼ub‹@îé‚„¸³vÉŒ[^ÄY“‹³&—Æâô³î"a@eßïê²vuM?•‘y7º.òyx+¿$gáô!1t.¼†qd_0 QP,­›.oû/ ó‰ö_,)öÿ‹M¯¶Î%µéÆõ;±3а¤x´Š¢ƒçˆÄH¨ÛÀ §7^/`ŒhÞ¿ÞöyièNxŒ†sËBJs ›ëjÂåáÄ%Å‹ÏÇÁ®ßÙ] aÝ#¡~OËY5 I3IìÞDåâ¥Ø*5 vO"{ôEDä?{Ôí:vþ"l®Âûœ‰±ösì4Ú{ñæhÜÅÅÏÒü?{wGY?pü3»›Ín6ÙÍ4G“6iÓû¾8¥å*”‚-E9-  þEDðBðQ9”CÎRA -=è•ÞmÒ¤¹ïÍÞ÷>¿?’¶i›4“4ÅV¾ï×k^}5;;óœ³ÏwŽgŠÉ,¶­^ÁáÉí$ØÑÙ6Ùü¨xŒPG žëÅ}DB`päc2l%Ö[+í¤½YQ4îR¶?yØäR­®ÍY8¬üfÌ9àý°¼×[åúj«½ÿFº†–˜Õ%ÔÑãÙÛP5.gŒ¬äLŒˆ ¤ÆÝø«ÞÂ_õ6õi2fÉ ó¶mjÔ&Œ`ØyבÜþ Û> SøÙë)9e;ÛVlêºE¶ßrVD[×àrÒóÓhížh C:©£ Áù<¾ÒÕVµäi¤§´Ó²ìç´xþÃŒuÚ·9r ‰k y+ 3ƒäÜT´Ö–¾ói, wîØÜ¯²cÝN>É7 jX3äǺ¾Û!¡6¢X°fØÑ‚Ýõ•JRjâ¡?vá]4ïj#cÌ…¤w˜I·ÔP¿½ÇûÝõôS=ýý@å‘V”F¼áƒ#¹ˆwn%Àl’³Œ„ööñŽùìë¨u±³±ÏÃÐ<ø÷Ùë:®î´"­Úk{3îÞA™¤äe¢µô6‘¥"Vû[¶¾”Ø#ì3“4ó.Fd~HÅÛoàñ÷‘ cnWsn#ÍÖÿ1*2Øò9â÷KÇ@Io¾ú9Žéé_ZB -F<®Pá&ümÝE)y@A±f;•ó“Pù;>XwÄ«µT ·²KÇ`ª\Óu¬µ”‘–á­•:OH½+b»ñtö5†dz4Cïé:ʾú/ŸchσÌWõÕ£Ãw9î-ïâîñh™Þ4û¾RƒXg°?3ýäK×ø'>ȼï? “¿¾÷5°~q,iº6ßc´JÌ×BÌ”Göy‹°†?¦²Jÿ¼OCsŒâMóзÿRPÜg¥xWS·ãʦßÎÈø‹´; XG_Fž£ƒÖ7× üwå'ÐÜ7ÎMgÀ†Ù¸›¶= Ä£Íx:ÁQ¶˜œöex¼!4KI×̾‡´{‡Í8Œ#h–\¬éAb¡f‚¾^šW>‚ín(›Ï°Ñ^Ü‘d̆=´U4hd- `’Wg KÉ¥¤ùq¾»¶ë œ±ì9§`lú-]Wd½ÿŽwôõNü'îu:,±f<.™EÙt¾»™°×@KëRFæk¸?n9¸ y7fžEª¥ç®A(• wÅ^8å2Šgh®oGYËH ÇÅ’x;í«^!kÑ"F-L ~ÓGø|l©½Mbo%1m8ÖÈ¡eêl?ðœS¼åmšó(8ëZ`'{ë\L´ÛÄK°Gªð{|(sö²ÅdYÝ´íê~ö5°·ÛDî©×’ ·Waο€Â#Á»º~DtµC+ÉÓ¯"-¼w[3јsn) Ä ùCÈ{)3o%/y={_\FÀU+¦0aÞ—^ý-öîsë*gåþ€úÊ…”žöu yŽNI£.§0ËGÇ»+ºnƒí·­Öb*˜…%ZAMþŒF¤jjälì¶7iñ¬¢©nųn£H½‚Óc$1o.IôœØHâ˜/’— óƒÍ(ûðîWĉû{öYþÛO¿K–$ ¦dK×Ï]úp¬‘Îf¢q¥ûX×ßvôµÃ-´5F)šñòƒ/ÑéÖH±„¼´(žz>/!°ý |—R|:Äk¥ÃX?È *i4öd¬ßwÄI å[CÝÖ…”Mº‹1–—iÞ·H<³#“hÕ2:½úëTw]Lù¥†hihE%Žx¾ôWuü6ì½”Ò™·3Bý—Äüy$k˜±[…Ûr"!S817!Wk×`sÿ˜À6†ÔÂcöqKÈu´ÓúáÚ®6¦ã5 ò9Úï—žþ¥'_ôë¿i$˜-hqß‘yˆGÁ`ÅhÐt¶€DlS¯$• TïlÆ”:üà`*ÒFÐãGÅjiÝ´ƒœÓo¤d†™æfHž´;Ø·£N÷o®®z×ÕVõ¤GDZEåó‰æKGzŒŠG’7ﲬ™XIù{N©+ÍC³/}u1Tõ¥gì§#_zÆ?zònHÅ1él,Þj š9‡ä²ÅdZ:iÛY=àñêQ÷¥·ŸEš‡ªÍ£a°`udaÍšHú¸s°Ûji~ëtö|ËBå3DǨO4ÍCÝ6N´ |xVÝGEð: &ÿ¥fˆun¢ñ§hÔ󛞠1ãFrO½•LåÅ¿ã·tT47Ò²ìL§-!wî]»¯,ûªét¼Øv£]pð¹µ¢›[±Ê¯%Ñ-ŒoýhN»žì3o#[yºÒSÙ#(VV’'ÞHV’åßCëŠG¨­vu]y¾„\G'm+Vd(ïGÔïYBÙ„%8¶þ g@éuhlÇ6šë= 4\åëˆåáîð0ïV’ʦaò¯¢­ãè÷›Æ;–Q³RõòÚ¡íP‘t…ãn¢trW]DÝ»époû»^qR0kÃæžŽP¡¼Õ»;KYLáŶóMìùËOqíOb¼‘¶ukvÞ,¨|W`€Ãz-“µˆôI瓟d"DÚ6Ó¸ü9÷·ÕØ>ÞzN»Œ¼ù?  Ô€«üWÔl¬éú1ÔÓµ šûäɱ&tŸÕ«Åµéj*ί¯¼ÿ oÚbFŒ·ÒñîŸpvŸ…ŒT=MmÃO)>ýRZÿ„'¬£œ•›Î÷±7p-ùs¾EvÄÝÛhyÿê«ÝúÚê¶?bYÎw9tR^E¬½œ —“ž›BËžvÚÞ{ã©×2lÎ-dj1"ΦîÛôö×…û¨Qh@ê÷ÚckþoeÇŽöm:ÚO?g¢Ëngü¬¼É¿ðGäÓ@ý ߥÑÕy¬Ó±=í0ÞFÛ¿Âxê•äœy'¹Pjœë¢f÷¡ge•g%õ—2zT€–õ»{BO?ÕÓß»«-¹„DÜt¸z;¶ûñ¬¾—ž+(˜p #F[€8Qךê—ÃaatßûÒS~<«¾ÏßÈ¿”ÒIFº&ŽÛE‡kKê<®ö¿7+~Huèzòfü醑öúŸxPA‚»•žËˆùóÙÿš¤ú·ž¡©Á¯ÿ5òéó÷k¨ú—†1GÏq¬¿þeÄh†xçaï¸TE"&“Π؊-׿i_<íÐÏZgó«+ˆ¨¡°+á:Ц~‰Ò)s®¥îÍ'iëñîÓ¡oý M¿éÑslÑuÇ€žòùó5ôÄZpÕ¶’9JÃU;ˆï‡j_zêb¨êKO;Ô“/]Ç=ål&!¹Œ¬ ±XM@ˆp[9ïš/Ý}ç¨ûÒ×O‡*ÍC#ëä;;ÞNÔ]§úiv•ÿ/:°:å“£&2RN²2×R/Vã¿ø Ui–öw2Õ›ý5þƧÕèɃߎ±@å}þ5íœ 'W“åÓ¹˜§«²ŸQã'f+M~¿d‘EYd‘å¸.'È”ËâdbÌ™‹ÃÜNÛžÚ!žÄá81çvÝ œXJö©—’Põ«Ãf_' IcÎÆ®'¢%æ“:i ÖÈfšò>l#æ‘—‘coÂëô`Ì>Ÿ{ïúº“£Ý !„BˆO„Åb€l$—MÆèýíÎÈI‘bCúJÎŬ<ø+žf×Ê Cxë–ú ³av:ù# 1èz}KÓJö½ñ7œ„³&LöaØ'œGŽÕ ‘V<å¿¢jo'RýB!„b?½³J!„B!„ÿs RB!„B!$(B!„B!$(>IiIØÆ_CÑ”é q4Æ\2f.%¯ÀÑã%òâ¤:Ö»’á“åX'}Yú²Bñé ŠMÙ$MÇfé%ÙZ2ÉcÎ'« ãhó¯eâŸd܌⾠òhi>™tùÒY_ŸŠt>™SÎ%--ñdOÎ:=Ö¾£%“<öB² û>Öi¶³{ã3ÌØ¿\4ãÿÎY“ªÞõ×Å òõ?Ó—…Bˆÿòð쓤“yÑ#çjÖ|“íåMƒšÝËv%çÍÄùÊ|Áÿö+u4ŒÉ…$ÌÄÓRûœ~2i6bÿC&:üÈêÆÆ77â=k¾ 9×3éâit¼ò jZ÷ߌíÔŸ1¶d;Ÿû#Þ(`Ê!múRòË&bIÔ æ"дšÆ¥ÃËtF^òÒíâ¾}¸÷¾CÆð‡Õ€ëë˜YÏ`ìÕ_"©á ¶¼õÂq )ó¥Ìþ—®ÜŸŒSÛ%Neäâ[IOî>dĽ›ÖÒ¼îyZ[|'tü䎦ý´ÕOð˜ ëØûÒ^ Æ42æÝAîqËt2©ó¥4ã?ìxþOø¢=j'm1ã—\BxùÍì®òcÊžKþÌ H–‹I‹un¢eõS4ÖuÏ~Bõe½ùòa]œ`íY!„ xˆ‡®ö9äd»p7±=˶—ÄNö¢‹ÞýS¶väwVsbd§šÚ×ÇÝóMI‘NÞ¢6“4ý;”Lçº_SÓØŽ²æ“’k'Üm¢SH´[¬˜} sæt²§ÝĸáÃÙõê³xBê¿R_ZÞ•l`oçãHaH&1ÙDpãÃTíócHNÚÔ«)Z˜/ü˜VOìSÞûo«ŸlÑø9}`ðŽÏùñí­†Â1$'ñ¹cã òηúÛƒ´ûâ'X_Ö™¯!­‹ñ7E!„ø´ÅædŸ²”Ü‘¥˜M€ éøª7žÂRÚ…eÔÙX\o³wµ‰’Åg“•þÚÁ«ƒÆáä_öÙ-°ù½íÄÌÓ)[z¦Õß`û–”©ŒWÞMF÷bÙŸ}’ìýȪÙ¼|ëÁݘxý×1!îÞJËš'¨¯n?xeÚAêԥ䟆5Qun eíŸi¬é±Nâhrf, -¿kŠ£¡kä]ó}v•7€í,Æ\y¶ýë7þ’¯|è FOš­§QvÕWHÜv7[?ªêÊ;I8Î}ŒQYÿbûóÏâÐÈ(@ÈYC ‹OZÒlF\ôEÒIh@ÜWAǦ?Q»£š˜ÒYï©‹cÄ$çgAã¯Ø·i-]ãÉ=xª\5æÚ‹·Ñå8kšsÙUO\ÁÖkôÕ—Žz×ÝêU„@Sˆ´S/ÆÖðì!W™ôÖ…!ã³”ž{ö qïn:‚ØFN"1º—–¿ vŸ³+=;)®¢`âllI&T°†Î-aßæD÷'8¡€ÌÙדW6³!F¤£0˜k”1O ¾V'°o‡‰ä˯!3ßAÛΔž¾¬Ùq̹™‚âX’»òso¥mí©«jíÊ“Žu4=uªg_†tS¿@Á¸éX-¨ áÎ œk~Mm­gèڪŸd.¦ìŠ›IJN@ùöжþIjwÕ2 \OûéçÄD´q5~®&-'…fwg÷ßmØFƒóEÜ8Äiúç-4Ç£Ýå^ŽÇŸ‡cá,v3í¾à Ö—uæk õu´“hzó5„}Y!„ýÅf’gßÁð‘M4}ø:;ý˜%%Fh ÷~óÉ(Í °e A§‘6ç¥äŒ*¤®µRÿà-ZEݫߢ9s£çMÄýÞƒ4vt]U¡ÖCÞ 4¬YK0šBÊ„kvî­„Ÿ¿w °a?õ^JÇÆèXûkêœI£?Oþù÷’ðæì«÷urÆ“5n:ìz–}kꈄch‰v ζ®ÁT`-•/îÁhH#ýœï0l°iî ½Š 'a^SE0˜†áÈ6kØHhˆ/¨Píÿž6_'1ÍŽ­ì*†ŸöMâíß ¦9¬¯ÞRÇ*î%Ðá…óHO/§¥#¨/Ÿ®ij¸œ’’YX6ÖÐS_zê]·­ÆwúÍ ó.;·º\ZR ))4¾ýüÅ_¥dL€¦eùUŠÏø,õOáZHžye"´­y”ºV?¦¼Íü6¥¡;ص£¥9HûÌÝ»i_û.–‚³ÉO‚öõŒ¦<­ªY°äÇ_Fõ;›kiØ'\Mî9_'ò½4¹¢ºÖQzêTϾH"å”{5N£óãßQ×âÛT†æ|ì©V´Z¾º×ÓVuöþûéþü…ðmý ®–‘K(8ónL¡;¨¬vé¬ íGO;ðm¦Ãy y%%˜ö¬ï:!`.&='`ù&\(?hm™iÃïœ}Yo¾t××Ñö¥«=¿¾,„BHPÜÇŸM¶$Õá©ÛŽ7*ñb†´ÓH·ÕÒTÓŠCgE#ãOú¶²×+h½ q53{QD‰º8ûlx6оw1ÀãL"õòkÈf§ÅíDKžCþØt‚ë¿CÕæ:યEKÿ1y3fÓØð] ¨|ŸŽú^·q?áN?BD¢Çfå½»N?…Ô”×irÅÐ’ÇcOŠà­ªD€9–Ò¥Ïôø µÏßMóþ[ÿb-¸ö¶øÔ׎ÒÛIÉMGknBéª÷ÔE¿R¹ZvÀ"àYõ0µ _eø¥¿&{ßû´l[F[}K?'T‚„Ú;!'Ÿ"zêKG½èÄvÖïeÂŒE¤ì~úÈx?uÑݘñ·ìÆ­ªˆIÁß¼WtÃK‡“˜ áKœCÁÄ Üÿùûöt_9n®ƒaQ2næ]ï¶ÍaØ5÷RÝý,¿«1@ê¸ÛŽáÙ ƒu8i3“¬öR[ëø¾í8kÊ»úi‡ûåKIæ ÙÕ㎣­@e;Øf‘?.ƒÐ¦»Ø»q_÷ÕíDŸ9€å£§­êì;ýöÓn­oP·¥ûjbÝ>È|˜‚©³0×¼‹ž;¶5[ÿí'¤çÌe¼ÎÊF &Í!ɼw i³±››iÙ×ÒkÛ08΢øô „·ÝO«+vböe½ùÒ[_GÝWÿùÒ’G_B!ÄQ‚b?îÕÆyÁõŒºzþª•´ïþ7mµõºoë’€¥d í¯Óéëø„ö}DpæY¤§>‡¯-r\3§‚„¢`±ÙÐpbpŒÃJ'íu=4͸ê;É+K¢é=‘O²øcDö-ÇsÚ—È(Ê¢¹¼…„œéXâ{hhÌäE‡=S¬BDzLð£YÇ‘3û2² ‹H´hÄ ›LC\ïzyqþçg4vD4GëäÛ‘×s\[Ió»·Óæ˜@ÆØsÉžÿsò[_¥bÙßñã'p׊ÞómSî"ôÛÔ>Àí·.z6dÝÓî(CuÏK«9&`Õ0žõ(ÓÏ:¼ Ãd€¨} :ikê`(ªÐvæ£Ì8sÝì ñíÇhqE‡¤Ÿ&٬ǴÎ`ö¥9&`ÅMGM#ÇÜš†¨­¨mhníx;aT‰FA±Žö£+(&J¨j%ÁóIϰànŒc-™‚ɽçmCØ1Ÿ’‹®ÂZÿ8;×ì<ŸÕ—¯AÕ×`N0q_B!D¿A1Ä;ߣòùI*:ŒÒ3È;ÿò[_§âípëàsH-ÎD³_ˤ/^{èШ(—º¶Z ¥@3ŽÃl›±®mk‡ʆ.ê‚M6ÑR¦dÌ)X¶-ÇRR„jyOp0?Ê3ņ²Ï¿“ûVý —ÓI(<ïr†ºÞ0èŒ8÷áo;8û´ˆô`Æ\å´¬.§uÛY”.¹‘Ó7°eeeU`!1#üõDâC[_Ë^M÷2aÚ|lí¯‹žùWñ#Ë^Ó44Ü´ÿë!šœ‡–›Šy GA#h‡õÁ |ü{«X&|’‘^ü=o/l_V:ê¦uÔ :­êY†&4â¨!kÚ}·U]»pÛèíŠÎà[GûÑ]ªîµ´»–SZˆ¡%JzQ¡ÝŒç,bô‚Ř*eÇktïÿݾÜo¾Žµ¾Ôž‡¶/ !„BGPÜõìÆ_õþª·©O»1K®`ø˜ÿ°mS£®1‰–<ô”vZ–ýœVwô@àcömFŽœBâÆZ‚q‘ù˜ [‰m'“ypo¦Œ»¶`6)Ùh-]·OcÌÁ‘Ÿ ; ø‚W„X Hp`ÔèýjjiV\›?$²pYù͘sÀûaùп¶Ç4 {†Fhós4VÔvåÝm%åÈÁ›žz?ƺô Õ»W'82²1PÙëU&Í~ ¹yFB›×ö\¶Žúâ“2áÊiŸ~'¹yFp¢.€Xý¯ØøÇî1ø!'0¶`6ÉYFB{«{ º4×6ÌÆ><Csõ1_ û 8V?FSÞ}Í™Šçýõ]“2 ¤/™c«Ó¸·’03HÎMEkmÒXëð¶×ÓwØ60ævÇœÛ=Ž©ñ8`²a8¬|ô´ýÙ‚swùÎÀ¶'@š­ÖÊCoÖl§2bþb*aÇë rûú ùo÷åþò5ú:J]èÉW|ˆû²B!ú Š­$O¿Š´ðvÜmÍDcf̹¥$'äéÜ´‘„‚YX¢Ô4ìãà@HÕ>ÔÈÙØmoô¸pWì…S.£xF€æúv”µŒŽy™X·ï€Øè-'JBú²g\ˆÍó.»ËkM‹Žúú˜mÍ[êÉš=|€u¡£ùùÖP·u!e“îbŒåeš÷í#OÄìÈ$ZµŒNoì`›ŸòJ /ÐÒЊJÓkÿX¾öÒ¸ò2/XJÞ¶mÔ4»ž‘×Ù—‡.ò<¶:UžU4Õ-¢xÖm©WpzŒ$æÍ%‰Îè;€¶zÔ¾3¶aCja€ˆ1û¸%ä:Úiýpí¡Ç1å#Øî†²ù íÅIÆlØC[EqígB{ß'0ãR gGIèx…wÏè<ÛÔ+IeÕ;›1¥?øãi#èñŸ }¹Ÿ| ¤¾ŽVzòu¼ú²B!úе šûäɱvïVZ\›¡¦RçóLZ )#‹Àù.C®À*bí幜ôÜZ<„¶?BEÒ Ž»‰ÒÉ¢îÝt¸ ÀC›©]±Óœs(>ÿˆ»ñíüí{ôb><«î£"x“ÿR3Ä:7ÑøÎS4ÔæÞMOИq#¹§ÞJ¦òâßñ[:*ˆ+i>ðÚÍFÚÖ­eØy³ òM\ã0ĉ7Ò²ìL§-!wî]»ÒóUÓé¼Þõäë˜!fÃ>é‹ä¦ìÝÉ^\?DÍþתÄ<„Ü!Ò§‹±Ó!î¯Á]ñvlø¾#^¦£¾†\Œàî—éœ~+©© ]üxVßËNÏL¸„£-@œ¨k MõËX×:«¾ÏßÈ¿”ÒIF FÔ½‹×±L&¦ˆ5¼LCëé ?å,š_{›P<¦¿/ÝY‡¾ëTW¿h§í½0žz-ÃæÜB¦#âlêºý[ q[ÕÓwô´ $ظ‹P鹌˜?ˆiû˜ú·ž¡©áðwç†ñ­ÿÍiד}æmd+OWùT6WzÚÏZ„÷cZÛ®bx¶ÂûÁºCo6¤bËu€yÅO;ô‹­³ùÕDNо|Ô| ¨/­.ôäëxõe!„BhÈIæ£"R/fÜ¥sq½úmêÚä­“Bü×ú¢ýÆ}þr"Ëofw•W D!„✼Éá¿Éœ‹-Õ ‰¥dŸz) U¿¢¹]b!>9’Æœ-\O0DKÌ'uÒ¬‘Í44ù¥x„B!$(Ç“!}% çbVüO³k冡Ÿ`Kq”NhzÌ IDATÃ:ìtòGb2ÊO¨i%ûÞø΀Le$„Bñi ·O !„B!„øÔ2H!„B!„ X!„B!„ øˆ1—Œ™KÉ+pt½båDÛ—–„mü5M!g'„B!„B‚â¡TóÉœr.ii‰ü¢†1ÿZ&~ñIÆÍ(ÖWH}íË”MrÑtl–^¶¢%“<æ|² 2ŽÐ.„B!„âÇwöiëLJÝLš­{7*@¸m3­ëŸ¥©ÖyÏð¥aL.$Ñ`&ž–zL«!íJΛ‰ó•-ø‚ÇëuKLÙsÉŸyiÃr1i1¢ÎM´¬~ŠÆºÎƒå¬%“<ñ:Ц̚юµ4­|Šæ&¯Ì¶&„B!„ xÈCKƒ ³ÍD`ݨª a°‘6åjòçgþ>šÝ±´Xâ„wÿ”­¹ÄÕÄNôZ4äyÊR|ïQ·|Cé3® ï|+¡¿=H»/1—ÝJÙìøÊŸ ¢ ’'}‚ ¿FìÅŸÐê‰IoB!„BHP ìçþ†Ñ¶?³ùÕúÞÜÄY”]}Ñ·¿Je}P÷Nbž:üíhߋϛAꥒœ’p (Ö’f3â¢/’æHBâ¾ :6ý‰ÚÕÄ Ùq̹™‚âX’»Ö‰¹·Ò¶öÔUµ¼Ê™P@æìëÉ+Ù#ÒÑ€ _{;ç0æÊ°íÿ¬ñ—l|ýã#ã£î 0•1âÊ»Éè¾›:û³O’½?ä®zÍË·Üæ°˜xý×1!îÞJËš'¨¯n×õ6ÞHÓ?o¡9íþN9Ž…³pØÍ´û‚`,${êXTícT®]MDAgKë73llík÷!oeB!„BHPLŒ¨Û陘 ÁN¢ÍHÄíD%f`ƒ7Ä®Œ]WŠ'œJbp=µí¡Ÿ¨Píÿž6_'1ÍŽ­ì*†ŸöMâíß ¦9 šKÞx¬ñeT¿³‰°–†}ÂÕäžóu"/ÜK“+ šƒ´ÏÜMq±›öµÑá2a)8›üôåKÖRù⌆4ÒÏùÃzËJ¿û¢UÔ½ú-š31zÞDÜï=HcG¤;¿­‡ÙÞ 4¬YK0šBÊ„kvî­„Ÿ¿–\I?hm™iÃïïÚ§f-Åž þu{0Ž»‹ 3Í4¾öÎvpä—`Òö–{¨…B!„G‰8;aL&ƒFBñ­L<ËJíßî¦Õš‹‰Ýj›<ï·Ì˜·ÿm´-W°GkÁµ·åÀ}à(½”Üt´æ¦ƒÁžo;Κrb€§ÃŒýò¥¤sÐìj‡ä9 a#°æ^ªË»¾ãj :î¶îLêÌWÜO¸Ó†‘>b­ß}„‰¸ˆ™½(¢DÝ œ}40óTVã°¦OÆšQKS¹‘¬ÑÓHjLï¾¢óÖw=SL5¾Æ b™2bÒLÌ{ß!DÙçßI} «~†Ë郤 žwyïWG{¹‡F¤q@ë=xL¾Žíö¿¯Á‹¡·í$èt÷‘¡8Jõˆs1zÁbL•²ãƒ5„ã=ƒíV¢X0[!î"ì´TÌ63„Z‰ÊÅB!„B Š÷PuøÃìc/$Áù:ÕÛH³€ìÄt"õõ]“_ š†¦i@w@—0 {†Fhós4VÔvÅ¢n+á(ýŇ…©®m˜}x†æê^'X¾"Äb@‚£Æ!ŸéÙ×Á•ƒÄIÄdÜ+¡ Y_Ðuû´f;•ó“Pù;>XGä°D©@n/d—ŽÁT¹†¨,e¤e@xke×ÿ…B!„B‚b ÖŒÇe"³(›Îw7öhi]ÊÈ| ÷Ç-ž¥Ø˜< ‹ÃÁ’Eré" ²cxWmîš:ÚŒ§e‹Éi_†ÇB³”`àË¢”w5u;.¡lÊw(5¼@KC+*q ô¸è;|)?æv˜¸€¼qn:6ÌÆÝ´íi ®g_ûcboèBÒf^J¦q Cs­»ëu•£¾Û§±M½’T6P½³Sêðƒi#èñ£bµ´nÚAÎé7R2ÃLs3$OZŠƒìÛQ'3O !„B!$(îahlÇ6šë= 4\åëˆåáîðëTã>Â~EÚ¬{˜0 LĹ‹¶@ýΖ®2ÞH˲G0¶„ܹwQ`ˆóUÓé +~<«¾ÏßÈ¿”ÒIFºfœÞE‡+8ˆ|Elz‚ÆŒÉ=õV2•ÿŽßÒQÑ@\éØ×~¡ÍÔ®XŽiÎ9ŸÄÝøvþŽö=ú‚b¢NíΣ¯cHÅ–ëó4Š/žvèg­³ùÕDTŒÐÎGØ•pES¿Déˆ9×R÷æ“´É;Š…B!„ŸR 7Î !„B!„øT2H!„B!„ X!„B!„ X!„B!„ X!„B!„ X!„B!„ X!„B!„ X!„B!„ X!„B!„ X!„B!„ X!„B!„ X!„B!„ X!„B!„ X!„B!„ X!„B!„8ñƒb# yçS0k>v«QJK!„B!ÄÿÓÑ?IÞ¼kȲBfb%åì!.e&„B!„âÄѯÇZpÕ¶¢T[׿R^B!„B!þ‡h ±®B!„BˆO'™hK!„B!„ÅB!„B!„ÅB!„B!„ÅB!„B!„ÅB!„B!„ÅB!„B!„ÅB!„B!ÄÿS_±²){.ù3/ mX.&-FÔ¹‰–ÕOÑX×yðÅÆÆBò—ü˜aöC¿í}ï+ì¬ôtýGK&yâuM™…5¢kiZùÍMÞ½ Ù”CÚô¥ä™„Å 1W9­ÿ™†½MÄL£(ºâ^R+ïa˪½]KœHÑâo“øÛ_@T*\!„B!DA±!‡ÌS–â{ºå»ˆ HŸqyç[ ýíAÚ}ñî€7“ ‚›fo…³;È÷úöG͘Ën¥lö|åOPÑÉ“¾@Á…_#öâOhõÄô¥RK!õŒ{)ÙAËʇ©vH*ý<…gß‹9ö-öîóùc.ÙgßFVÂÇT½ö–ÄB!„B!tÅñFšþy Íñhw [ŽÇŸ‡cá,v3í¾`w°jÁdŽi­Äßáí%0-${êXTícT®]MDAgKë73llík÷×ÛÏ$¿4ï‡÷P»³ x›ë ãç Ÿy& µo<ä RO»“áy4¾ö{Ú}1©i!„B!„Gèû™â1€†Ñ–‰‘6üþHÚA‚1JܘJ‚ùÈøZ³–bOÅŒãîbêµ÷‘k­ÀÙæüLšž$j˜²¦a¥–Ž:çÁ4Å;pí©…´éØ{lHKÁ>ëNJËb´.{ˆ†–€Ô²B!„Bˆ^™tEÎŽ³(>}ám÷Óê:xÕU3'÷EI9ëA&k ¼;h]÷$uÄÍ’…‰ Þ@cf6Æ„Âø}aÈÌÂd€p¿q˜Ro&ê¹rŒ¨»E.‰#tÇê £n¡4Á„çƒ;¨©q ì¹e!„B!„¤a̘OÉEWa­œkvÒ3,U®wØýÜ;€Cr)éÓn xîÝwP]ïë±fßÚ;)ßj â’2ñøe(Þ±Ÿc6)3¯!³ù1Za©e!„B!„½25 ÎYÄèK®"±úQv¼·‚PŸWuãĽ»i[õ­;ieEl%г5â~Â^/J³`¶™!ÔJTÏÅĈzÜ`H#1ÑØãïFŒöt4Ü„‚k{“Š—¢90•¢‹¿FVªYjY!„B!ÄÀ‚bÍv*#æ/&¡òv~°†°®±Ýœ TàöBR阃Ï[ÊHË€p}%Q]÷6+¢­ë PHz~ž6¤“:ªœð…Ô!ë«@9µ¯?Lkx E.Åa•×1 !„B!„8R·O'b›z%©l zg3¦ÔáWŒ´ôøQX°M¼{¤ ¿Ç‡2ç`/[L–ÕMÛ®îY¥cµ´nÚAÎé7R2ÃLs3$OZŠƒìÛQ§kæiåþ€úÊ…”žöu yŽNI£.§0ËGÇ»+Æ{ ïƒåÔ¾ýI‹¯`ä[ÙúîGDäc!„B!„ýņTl¹0O£øâi‡~Öú8›_]A„DLÖ"Ò'O~’ˆiÛLãòçh<ðý¦ùduR¹Õ &gøú:`&sdÖ-ßãÜë߯eΠlþmüü§ï3Ý>™÷–ý§¹«> ÕE?xUmëPJ©¸jßòŠºoA¡2ïÿÜ­.øÅrµ¥Æ©‚ª‹»b™úé¥Å*qÿ:¶3ÔŸÚU¯¼/£Rº×3¤Ÿ¦nýõ+jÕî&åï_é>¼cìÁýõ—že[¤nÞ¨”ú÷"•zDÞ ÔM+¥>øœÊкÿ¦eª%Úû€šœ¨_ý¦YgÞû_ú¯wSáÕêÕN¥Zÿz©fìú›1÷Rõ|»Rµ¿;G¥PÆüÔºž‰è­|ô¤y˰¿úÒ•fP¨ çGýùÃJÕïZ5æ®RïÞ5YY@r¯RÿŽ*Uû‹Êzà;uÁË>¥j®¦[†®.tçÝ\ |ÿeUÞÛŸ`U»e™úÙü,eàú·,²È"‹,²È"‹,Ç{ée@>&_}§f†z¨f†zhïDuãrÔ¸2ã!»¡ZGÏbȽF}Wj÷½ã€qPÜÿ¾ *窔R›Ô-ŦCö?â–MJ©Õ5¹†î Ø©ž]´H=ÕTk¾V¢ŽSP¬«|´4uöok•RUêùo_®.\p¥úîKû”Rµêwg§) ¦‘êëåJ©Š_©ëž¯Î¿äzõã÷\J©êŽ2s÷v¬*wÔX5íòçT›jSÏ]>M7N7NÎK:P·æq÷¨ÝJ©Ý¸M]yñyjîgæ©ó?ûyuÑè$ýélPLªZðÏ€RÕ?QS,ú÷Õšõå}h1ƒÊ8ï÷ªVÔ¿o)S‰¦Bõ…×Ý*¾û!uJŠÖ].U4fœ7ñ\õ£]}”ž4aö[_zÒŒI\õÕ¡”j}ÿ1õÍk/Už7_}öê/©¥³Ó¤ù†ÕJ©w©±æîïYg«Ç”ê|vÞž Ð•w-UÍýM×ß^¾ûjµàœsÕ‚¥¨ ¥Ô–o”¨ù¡‘EYd‘EYd9¹‚bŒF•uF–ºà7cÕ=ûƒÚšêûoŒTç/²©$㮣#‘–©«}ʯ^>/EÇàöp+Ô’týA±eZû2«qwïR*ü¦ºÐ~ègö ßP!µ[Ý;Þ| (þËgRUñ—>Pþ–§Õ¹©)}Ň۬¾Qš »ûO3Ê8üËjRjç=ã^õMœ¨¾¿K)õÑMªÐØ#(î¨˜Š¿ª6*¥>¾©P{lÏ:ëQÕ Ô£³¬½î¯+Àô©œ›2øô "(6XsÔäÏ=¢¶Ä”ª{ìeÀ¾úK³Þ¼ëÄúi«šMMÿþfS{Ô__­üÑMêîÉIGnïhå£'ÍCX†zÓsÔul§«'Z”Š®üª*1÷]†E_^£”Ú¢¾9ª«¯˜Ç|WíPAõ梌Cƒôc ŠõäÝXxƒZWªòGS”eÿ:ŽKÔûË"‹,²È"‹,²œðKïS0Åb´~ÐÊ[ÿ·ƒŽÙÂï¿ÕÌ^$MLçìŸ £À:„ëèºÁ;F¼+€ïÁ´ŸìÀSñ³“zþ}#ß5Ón;}2“'w//åéšÈ¦9iÔ<ÆÑÄ{˪íÿc¨’·–7Á¸¹Œê£.¢í»¨òƒ#ÏÎPÎ[<Øôôéôçi‹+bþ&6=¿”ÈŸobþ·Wã;û2ý´UåcýK¸mõ®¸q65?¼š‡7û_rN2LÈ?Ó²`ýþNU¸ï~U÷ÚoX›ÀÒKŠIÀHöiS]Å_V9‡°ÿêË»uÔ9LÐZXþÆîøv!„BÑ›£N´e.LaÒç2™}yEÝ3³ªºØÐ¯s4á¦mÔ«$ÆÎ,À¼l]ãd £ÕN²ÝzX°æ¢bÓzÖ»W áæ4’Ęiy$,ÛE¤—Áx{U+$äQ’nwô@Q¦—äc¦…½íÑC¿âû˜Ÿý`-7|ÿ6fnìm¯nª¶–S~ÜÒ¼Ÿ†vø_´~#n¢qÐ G~÷Ø &=}ØümÎZú­~'ûêq†ÕñÛ×é¿­&œÅ‚ FT Ê®º–鿸ƒ•îÃò¦zæò|’ex´4«®S`ñØÑCÛXÓ›üê-?/Ýx£û-ã/ŸJ|õ—YÑv“nè5HìXû*[™Èåçå<«`*dÁÕ“`Û?YÓ?"®yþ{<£]É·æÙ‡<¸ì?ÍàßóÛÉaÞy#¾'±„ùgçÂö÷ÙØ>UÈKY)ƒ›À|@é‰GD€¤4’úª~O5[Ë·°}OÝÁ܉–wÝaXò ¾÷òo9sÓmL™ôe–çßÎK¿¼€Là ÂRrH1Cš‡ª õÔ×QÒi\Íš6˜vý%%µáóÎCÏÐ<úKÜ|ι|áøðñ·iŒ m=èÉ{°f-ûÆ§å‘ ¿+B!„'•^GÈ1œ´‰ ÐæcãŸ[Xù×jZÔqYG—h ÏÜr?_Ywo®°pσϱ¦ÞÄŒ±ö^V¶3bÂ$&õ|ŸQ´“½;kðê¹€­æé¯ÞÏkîæÕiÜÿ“¿²ª6BjÉlÎÌ_Á½÷¼K[ÅÓ|ï¹oóÊ£ÿàñ»øÛN#“—>È#³œ<¿è)*z»TëùˆŸþb7=ð}®»M¦|FÛWóøÓÛÑcÆô¤ç@ðÓÉÎ-pÃ×¹óºv–¹3ž°Š?þu§®[U´¯O ïºÚªrpæ/qÏðW¹|ü£”7Àµ7\ÈŽ¿þ™_½:Ž«_m9øŠ¯x'ÛVÕÂ7îྯ´òrs*Å–U<þ—Êç„«¯£¥Ù»š~÷.{üw¬}w?yò]¶519ò)JXÉzlÇ»æürëMüøÏ¿Ã¸bY3ƒ»N|”ºÐ‘wUù,-»‡§z™ßÄ~È+Õ ”̽‘i@üÎ!„Bœðz™mÕ ÒÆ%*ËÑ&ªut/•6ó&õÛ÷ö(W÷´D‘ŽJµòKÕHóÑ&/RJ…ÞPØu¾’©ûsÇÔëÕ¯–íTíÑ®M„›7©—ï_¨òM]ëhIeêÊ_.Wž®Ï=ËÕ/¯,SIÚþ¡÷O´•|ðî¬ÅêU¯Rj¨_ɤ3͘ ÕÂûßP;» °sÇëêþ…ÃÎXÝËD[¤œ­^ð(Uñƒ 'êžplÄå¿V+ë»_ÞiQë;_e0iUéé9“yÞÅê—+UT)¥¢­jýoæ«LC_3'n_z'Úê/ï z¢­ýmUS)§üBU«õü¢œƒœ™†«ëß *Uÿ[u¦];t2¨¬sÔýÿªQ!¥”е© ¿¹ «|ô¤y˰ßúÒ›fͪF.¼[ýõ£jå9ð©ZõÑcª,áí>óâ•K)Õù·ù*UªIÏ;nèÈ»!mŽúú³TKL)¥ÂªaË6åUJm¾uäÁW·É"‹,²È"‹,²ÈrÂ- Á !NZæ±ßecù¼9gw¬œ0é2•ÜÆ†Š‡hY’˹o—­B!Ä Ê$E „8Ù죘1Ö!}6_ùÕ}dÿý2~ºé¿'3õƯ0ǽ]^ ãYøÍ2ÑûŸ_Ù)±B!„ÅB1t’&ßÁ‹+ndx¼ Ï|•³o~•æØ1A¦tÆæ~pÙD2Í@ÜEåÏò•¹ß楦˜T˜B!Ä LnŸB!„Bñ©e"B!„B!A±B!„B!A±B!„Bñé mõY2Ù$碚7â ÆË.4ÛYŒ¹òlûÿÐøK6¾þ1±OAÞ…B!„⊠˜²ç’?óÒ†åbÒbD›hYýu=^/b,$Éf?ôÛÞ÷¾ÂÎJOwä—LòÄë(š2 k"D;ÖÒ´ò)š›¼œáKÃ2•ÜYŸ%«h$ ÆQ÷nœ[þFÝŽJbC<]˜!íJΛ‰ó•-ø‚áãRø*°Ž½/íÅ`L#cÞäöšm;ió~Àˆ‘™.ëÇ<{èÜþu[w91ëä=a8™s®#oÔ(ÌÆ8Ñöiúè)š=ë]OÛÐÓÆö·Ô3(¾ð&ìu? |Ån$œB!„B .(6äyÊR|ïQ·|Cé3® ï|+¡¿=H»¯;ÜÐ1™ ¸ùaöV8»™8q¯oDƒ¹ìVÊfÀWþM<é \ø5b/þ„Vþk¢šc¥‹¯Ãø˜ÆU¯áõHÈOŠÕxòΟ÷rúÀà'í»ŠLöL /²{E91C2–‚ (œ}I ßeÇúš/øÓì¤~æ{o¤iÅpz“±O¾Ž‚ßD½øCš]Qým£ß6še$é“.%òdÌ@TúµB!„☂âx#Mÿ¼…æx´;)ÇãÏñp»™v_p4‚É#ÒZ‰¿Ã{ävŒ…dO‹ª}ŒÊµ«‰(èl‰`½âf†- }í>}–Jú©Wc®¤â•ßÑ쎂kÖÒvH0ŸAêԥ䟆5Qun eíŸi¬iïʇfÇ1çf ŠG`INBbî­´­ý#uU­]ë˜ÊqåÝd$vm2û³O’½¿Xªdóò­]·7'Ž&gÆÒòK±¦80üx×|Ÿ]å ]Ûê/=nK§]Ú IDATÂßZEð5WÏyŒ’Qs°lªÁÓ¹¯þÒ¬7ïý±Œ'§8‰àÇ¿£¾¢øœ’®ø&9ã iý¨Š¸Þ¶Ñ_#ëÄ/QPPGË¿Ã|ÊWI“~-„B!„8¦ à@@  a´eb¤ ¿?ÒãÛŒQbÆTÌA"‡]îÔ¬¥Ø“Á¿nÆqw1a¦™Æ×ÃÙŽüLÚ>Âz¢C˲ ®ÿ'®`__°a?õ^JÇÆèXûkêœI£?Oþù÷’ðæì«÷fÁ’7k|Õïl"¬¥aŸp5¹ç|È ÷ÒäŠB´ŠºW¿Esæ"FÏ›ˆû½iìèʳ µ µ¤ñd›»žeßš:"áZ¢ƒ³­»Üt¤gÐbÄcqÐ úó®'Í:óÞï9 cF bþÀÁ6®Åí‚´ì|ŒT¡ô¶~ÚDð¯û›×)0 pŽtj!„B!ÄPÅ=þ¿½; «ºó<þ½·vUI¥½¬ÝF²eÉ–Á6f³ÙlC @È$@“ÉBÒÉ4 t†žÐ Ù¦!'y !éŒÓ!Ét<1¦Íb,;Ë’-K–-k/I%Õ^uëÞ;/$[²-É%°Ãâÿçyêá‘êÖ¹çœ{å‡_sÏñ®föE I¾ûþ‘ñh¤Ø=‘™«æ\Ìp3þOÓÙÚƒ(Î¬Ä Ç4,ù…Xl6¶$ÑHò °ª<:KÖêBµŒ…<ÓÀÔbc‰Ju—a'I´`ÊVų’’š\â»î£½¡é:‚’û}Š—­ §{ ÇžŽ4èØƒ„†ìd}v¹E^úF1I¢t£ÛؤH»‰¦z®6I¬íU†ºâï­>ïeÚ·ÕKFùu”–ÙH6ï"®Ïô\S×™4Ú®l îú+±MV·ø«ìÛøáXÁÌZ´ž¬®ßŒèXFº†)®ªÁaÝr,€OdÆ{H¤ Ãí:­›V}´8ëλûž±¢D[žâ@}+`9Ý皆x–?¼†¢Lò¦$®æaz^ù?8¯¸™y·\sôÍÑþ>2t¢hÓßéßcB!„BqZC±‚Åwó®¹kÛc4¿^OrÊ€ Œp ÛžÄ]þ ¹Õtt5aÆý¤pbw9À!”lìn;$ü¤Œñ`Ýýö°£˜I’Cã#”F¬ ;®ü”Ξi±òºÀ<ƒÊé+jð7ìßÚ@*!  æ™;×tRÃÄÁ)ºÒÀ4GûT÷¿LëÆMXÜyXÕ$ºõ"ªoú,fG×èoÚ÷Æô÷˜¬0-„B!„8#¡Xq¯bκ±µ=Jóë;ÓÛúçØ3®c)ÖJ0 …Uó±¶Õ“2g59yllýy,˜êÃ-„†§(7ÞÌߤ|ÁÕd6?M0qrŠ5Fšˆ±‚ÌÒB”þÑ)ÄX|xK²a¸™Dj†¹ÑˆcàÀjWßSǦUŸcÍ×1 ÀêFU˜|{)ÍOlðȤ++Ïè\ï³íjÁm§ž>}ì|:z¤ÝZLáU7àJþ•¶ö±)ðißÓßcB!„BqB±÷â[ÈæmíëÚ]>~ 6@<Åĉ»î“diíDCL»¬ê)pØ?¶r°~ÿîf|ÝMå2;}}àY´/ÍnîL”Ï`àÍçÉ¿þzæ}ÒMwÃ6ÂkV%žŒ}tïj$ÞNgó'©^úß9ÇxŽÁ€ŠkÞ§)öá¹~ô™Ú„b#ÜJ,u-9Ë?E¾e/ššƒÓÞŠ¿¥+­z›éÔçØÁâƒA¨^GѼ0A̓]=À@k÷é?×ûm{:Ó§QPÝ¥¸¼¸ êÈ­½‚,÷úþý)†cc•IëÞHã°xqz½(–"lPœ³påÆÑ}Ä# ù+B!„BÌ0«Ù¸gyÁ¾„Ù×-9þ=ÿ4<ÿ¬® r­¥$Ãhh ôlÞHϱg=uûe¿í*žªó@ì ó姘ÁÅ`bøÏþ?ø)Yñ /þ;Š0cŒìk hf„ж¤5~¥ç~‘*;èûéÙô ÝïåÙÓDG^ÛŒuåÌ^»Œ ‘}¿`ð@FZ!s&õIÙõ/ôåÜIá%_£Ð mþ9CmÝi~qð7l{*@l0pŠl¸Î½—šY¤‚‡z–ý{þƒPdâu÷†’Î=jÎ'˜wÃzìGQñ_©©½í{4l‘)ÖB!„Bˆ©)ÈÒ½B!„B!ÎRò€¦B!„B ÅB!„B!„„b!„B!„BB±B!„B!¡X!„B!„P,„B!„B|œX€ïœ]MV°”ÜÎÂÿôò- vO¾'•µOÙ|l‰>´Ô™ÙµJq¯¦æö‡˜½ôFŠ—ÞHqq}-Ý“Ô'Í:d9q¯xˆEë®ÂÚóÁpêÌœæopM…B!„-ÖÉ­b-\CÉòõäͪ褻éßþ =™¥Œ’›¾OQÖñŸoùûÚBcy΃§î*Î;—RC;è}óúzÃ3vì ¾Ë¢Uå'½£·}†-M3 Åž2ª#'eŠ£ÔœõT^µœÀ÷‰'O("‹œËþ'sÎÉ?6Ô®‡0Üô[:›ÑÒ¬ŒÛÉÁßDµäwÙ½ÌzŸuþè²aÏñ¡¨*.·ˆ‘³L{MgøÅŠ­êÛœ»ÆÆá߯6>àr„B!„§7«>ò/¸‰ÌÈ:7ïGSKÉ]v3Åk]$~ó0ƒ‘±ÿyWX­oø[c!×ÀGÆÃlõW©^1‡Èž'iíÏ¢Û(½ú+èÏýHŸauqä…'j‚e¢™E ƒdËiš…8„þ»Íš•:ô-¯íAW=8K×S¶â[dØþæ]éÕɈD@’Lé:˜…¼ò š³â#ê?{ɬƒ$¢¤4ɤ‚5w!®Ä>B‘Ô߸!„B!Ä™ ÅF½º‡>#5t÷Šã½ö|¼Yv#ñ±PìÄj×ÑümD‡Â'—c)£pq æ‘Çi۱̈́á~ ×Í_¢¨¦”Á‡ghc$Ä&äSÜRyÓðy”w_݉f‚âZΜOÏÁ‡iz³=c5óo¹ ÷Ñõ<Â;/þõøi­fÎ-çý±ðú§)<Ú-íÓ°¹qüød/Q;) ÒwÃ÷8•sWâÜÝATÔ<²o dÁ\“Tàmúwü’žŽÁ´GÉwu>´ÊÖS²x Ù¾B,šŸ`Ã?ÓúN†ëBªoýŽw ñ­ö±~ÏÀ{åãÌ-x…¦ûõhÓᘇoÙ5ä”TáÊôbQ¢„ë¿Ãþ=cÓ¿Õ,2ÞJiÝ ÜVÌxÃ{Åá†fŽÍ\v®bþþ"ž‰ewý„w^~g¼}é”sª¶ÏäšNû×RŽïÒ{ñ¹ƒ„wcêV Ö=Æ\_ÉÆ‰ý (^²/ù•s†6‡C‡&̰˜I9B!„Bˆ  Ä w>ˆF' ÓZ½Ø,)tK66{í„áNÅUE–¢;`©ý —Ûéyáqƒà-©Äª&yší4#Û8ôJ5µë¿È9}ÿ@Ks’ÜK>Onü%öÕ¿; b;h{î5‡Ü+î£h²‚Rít>ÿ úòo`Þeu·„dÅËVÐÓ½%½/Ò©³µŠâ –aé{–Æ—ÿBb²TeŽliƒ‹. ;óEzGtϲ24Âíè€Z°ºë¯Ä6Ù9⯲oãSŒ¯•$Öö*C]ñ“C³{%¥uy·~ÃƦÕ÷uBÑãTÖ.Á¾ÓhÍ8Éá®±›L;©}i•£¦Ñö÷rM§ú’"Gu…¹mtí4(ZržCï4NÐÝ[~…^ªÜ{𤠛v9B!„Bˆ2+XòÖQù‰[qu=Á¾ú}Ǫ™#›hÙ¸ PQ=Uä.¹‹Ùk@ÝË¡ãFB“DvÜÏžF-œ"³îÄó8ð\ôÕsN3ð§¯r¨7qÂq‡8òâS„ŽV›QÇe›Ñw~JGé)Ÿï#¾ë>ú“g®÷fÝÃywß3öC”hËS¨oÅ,ÞZ\ 3ØÙ?>B¨÷1Ò5LqU ë’Úé©†âž‹Ç ÑúS„BíðfB~ž¼Šúöôcó-Åi »oôZhùÃk(“­ä¥‰§9¤ªxâRlXV?ÆÒÕ'¼-ª2M=gVN2­¶ŸFöÙäU•’lü'úu”ªo“[9›¾¾¦Fœu´îMtv¿ßr„B!„P(V°øn`Þ57bm{Œæ×ëIN: Œp ÛžÄ]þ ¹Õtt5aÆý¤pbw9À!”lìn;$ü¤ŒñÐÝýö°®¬l&IMfc$Û‰&§ ˆ5dç¨`‚³ê27>qHötíÆ3øöom •Š ÐOÚ>ëD›Ó¿i˜Ó7ÌŒí¦ÿH’Êùà|w3ÎÊ Ìþ§ ÅÇ>—&NñaãTÅ·ZQP2øÊé ŸüM=|ŠEÅfZNzm?m’Ítüþ˨Ä1 …žçï¡G‹Íü–:]å!„B!ÎL(VÜ«˜³îFlmÒüúÎô¶:ö<íÑÖJ0 …Uó±¶Õ>×ë¬&'’mJ2ч[ ¿ÏÖØæPtÕxÿ•wßHRvýT^ÐÄ»¯íæømi5t°y±( O–DŒ8¬vuêói~bƒG˜,ã#MÄXAfi!Jÿèôi,>¼%Ù0ÜL"u\ÂÃ0«uªúLSg3ÚJ$yÕKq´m™zÄÔ 1ÒðÚµ—QPÒ‡Ýá7öptv¹ZpÛ ¦OOÍn$Æ <½çgdÓ*'ݶ§{MÓªX|¬.&¦6ÕöQlÅWà+Uîý Á˜þËB!„BœIà;'ÿÚgÅßSšÛÄ‘í;Ñí^l®±—UCOj€wݧÈÏucqdãȯ£`ùíøò’ mŽ@H3DBŸ¯îr@çÖ—‰¤½Ê–Š¥ð2|eV"­Ž õqZ11L2È\ù-æ5ÑþâFB¡CCø–­Å9ð‘‰S± ”œ‹)˜S…%>™óÈÊO ©3 'Y .&;׆U°åÌ'»0El0„©¸pÏ_O¶±ƒÞ–®ÉÃZ²ŸDÆ…ÌZ´—ÂtT³ìnJfÅño}–¡‰ûJa ¬!¿¼ 52ŒâGVžv\}¦­³1L,YIÁ‚uäeiÁ’Q€+¿†¬¼ÚíC™sEsàTеíbcA×Lvl‹}¯â?ñµ¿Xlt$SqÕPX[MêÀKB“¤d­Ÿ„c¾º«ðfŠ[V9™åçb¶Ÿìº+n<5kñ¦Þ¢÷@ïh}Ó)g&mŸîšžö¯›ª(»ö+øJáµï¡¿cHF…B!„øÈ„b5Ÿœå×áõ‘]}9…µ^¾üûc(n2*.Ç·p¾ÚÕ䳇ÖLÿ¶Çéê8ºg±‰>ø!­ˆÜEŸÄW½ Wêmº_ùþ¡Ä ªy4Wà=±>ó‹7¾E*ÿ3Ì»¸’‘-?¢ÇLŒ‘R³®¦hž›Ðþ†c‹zAj ¥`…µkÈ›3[¬‰¡Î {ë~"!îs.£°æòæÌÅk"ÐÙ‡A¡dç¢J%yu×R8onZèÛú'îÅ«£ ô`ñ­¤pÁõ™¶Î&úÀN†4Å+)Xp9ùs/$·|6ÖD ÎÞñrÌ0ñH)Õ³1Ûÿ7úÆÃš'F‹NòŠOí=e(F#Ùµ`"‡ÌÊËñÕ\J^Õùx2!~¸žpÌH/§UÎ Ú>í5=ÍL%ç|rrc ï~™áá¸ük#„B!ć2€uÖ]ôìë¨ýÔFžÿ&ÉG¥,¥ßô0³g°o°B!„B¼OV邳„}îl8ª(\õ)lí?=³+sŸ:c?çÓø²z BX ×âËÒïê”}z…B!„ŠÅ饿^Cåµk°›!¢­Ï²ÿÍ·-°õAÝzÖ¬"²^…ÏeÍOhÏOi?8,S„B!„32}Z!„B!ÄYK•.B!„B!¡X!„B!„P,ÄÄ2‹¼å(.õ¢Ho!„B!$Ÿ%¬…x*–âvNu9,%·S÷_ž¦vÙìÎE;e»N Å%äŸw%99ŽG}„B!„ÿ86UV¶®¡dùzrŠfaUtRÝôo†žÎ «[Ê(¹éûeÿéð–/°¯-4–çûO '?^AÍYOåUË üq/‘xròPì)áÚ1r²?2£¨§n×Ù]!„B!ć5«>ò/¸‰ÌÈ:7ïGSKÉ]v3Åk]$~ó0ƒ‘±dV+Ä~ÄÁÖÀXÈ50‘ñ0[ýUªWÌ!²çIZ{Á³è6J¯þ ús?ÀÒå ¤Å Ùòc‡fa!½&„B!„g2=ôþéúŒÔXÐÝC(ZŒ÷ÚóñfÙŒÄÇB±«]Gó· Ÿ\Ž¥ŒÂÅ5˜G§mÇv4†û5\7‰¢šRwÆ8­QóÈ^¼’Kp9LR·éßñKz:ÇG¥Õ\¼‹o£´v).§fœäp+úŸqäH(½ó(YxW~‰ÒÙspz2P=ØÈÀާèl÷O8×)êc­fÎ-76[¸ðú§);ºªÈò@tç,µßbár;=/ˆíåû9Ü2ȼàAæÖ* ÿõtö€{1å—®%+Û…r$”Þ”nʼn³x.ãÿqhÓn’JY ?Ǭ+þí·Ò;’J¯>©v:Ÿÿ}ù70ï²:‚[¦gh´Í„4¨ÅvÐöÜ,j¹WÜGѤ²`¯ú2µk–AÏ_èÙÚD,š@qæc }ñàijüÛT/Ô¨ŒNkñ5T,ÿ&U‰{ÙßìOs:»ÏŠ{)?§—Þ7~Àðpy83uÚX é´Kñ’séÌždpÇã Xq–^NIîL¯i:·yõB!„BœF¬@Ǥ¡xÕ»šÙ-$ùîCøGÆ#„b÷`DRd®~˜s0ÃÍøw>Mgk 8 °'Ó°äb±ÙpØ’D#IÈ/ÀªBò4%ų’’š\â»î£½¡é:‚’û}Š—­ §{ ZÆù”Ôæ‘Øý-¾36Jmw¼tí±!sµ`u×_‰m²“Ä_e߯§ÞŽ4èØƒ„†ìd}v¹E^úF!ú$Í$ÚH7º=ŒIŠT°›Xà„g](Éá(¨ ´Ô·VQ|Á2,}ÏÒøò_HL2ü®¸WRZ—Gpë×9|`lª{_'=Neíìû7Mú¹IN†Õ‰NBM„c:ÐÆñóNÝ.ų’¢9nbõrhOïhÿôÄÈ®ýÚ±k‘Î5MïÉà4úY!„Bq6ê°{ÅSDM,yë¨üÄ­¸ºž`_ý¾ãFÕÌ‘M´lܨ¨ž*r—ÜÅì5 ÆîåÐq£xI";îgO£ŠN‘Ywú[¢zkq1Ì`gÿøˆ§ÞÇH×0ÅU58¬[Hyâ"ÈPGϔӶÀ ´üá5”ÉV³ÒƒÄu˜l¥+3ÞC"nWÚõIj§é ÷\ƒQ5k>N†èšr„:­>4ä¯X!„Bñžíµo·Mˆ}70ïš±¶=FóëõÓ#ÜÂÀ¶'q—?Hnu]M˜q?)œØ]0FH†%»Û ?©Óh¦_—YQ¬(˜Ó75L<œü=ÓÀ4§:ÉÉéî4®mNÿ¦ ŒVnª¶+(|å‡ôŽOã¦&™J¿*ÆðÚþí¯dT\H^Õů]O‰ÿEZÿü[‚ñt/ª(“ù0£>41MPTUö6B!„BÌÔVà¥I£ˆ{sÖ݈­íQš_߉–NÖQŽßÿÕŒµ CaÕ|¬mõ£‹99«ÉɃdcÛÌw:UÄi"Æ 2K Qú;Çaòá-Ɇáf)0Âm$Y†gV6Š¿Òœ©Ü–þôé÷YŸñƒã8°Ú§Û?WC×›‹Âq£²f´•Hòª—âhÛ2鈯1ÜHŒx ,$zÿ œA¢íÿN´ýÏtå\Íü›n¦|þVÞÝÝ3Þ¯Ó´Ëy—+È*/F훼>éõa-ª·«Úˆ>]ÃÒêg!„B!ÄYä% btúôüñß;ð¬ø{Js›8²}'ºÝ‹Í5ö²jèI pâ®ûù¹n,Žlùu,¿_^’¡íÏi`†HèóñÕ]ŽG  [+È¿àNòÝèÜú2‘´WÙR±^†¯ÌJ¤£Ã1¡>N+F"†™ì'‘q!³­Äe„0ä,»›’Yqü[Ÿe(¨6ˆQx9óë°kaLWÞê+É+,@ïÜ„¿?‚™ì Øþû^Åâk±X Sqã©Y‹WßNoK÷XX+$wÑÅØú7ÓßL¯>GC­á$kÁÅdçÚТ ¶œùd¦ˆ N\øË@ɹ˜‚9UXâC9¬ü$±¡¦1L,YIÁ‚uäeiÁ’Q€+¿†¬¼±c´~Žøê®Â›i`(NlYåd–Ÿ‹=ÚN<íká³ôv|ùN‹k†wÉrrK‹ÐZ_bp0–^»’}$2Vá«[ÛEW=8ò3g.»éôaÝz.¾y+ɰ £ãÁ‘|93ëg!„B!ÄYâyàÉ£3N×Ï >|7þ„²œI>悆ç_CËwùç);W†ÐÐؽ‘žö¾ñ‘?ѧî*¯Àe=°ƒž7ž¦¯7<ƒ bÁ¾à»,ZU~ò[ÆnüêÇŒ$ݾgÉ”.8§ôáÝô×?C÷Ä-™UøVÝNQål¬ŠŽèÅ’SBâ­¯ÓÔØŸ^ÔB|7ü/ʶG²- òÖûÉØ{»ÆF5Ó©V•ŸcÎÊKñdØÀÙ÷ lÛsÜhºâ\Hñåw3«8Å mþ9-ÛÆŽ±ã(¿š’Å«É.ÌGH iyšÛv£dâYp3¥ ÏÇ“é R#{éÝü½Ci>à¬d‘µônÊæ/ÄåO7cGÙÿ;:ÞÞuÂÂi§h—šƒ÷ÜÛ(Y°„ —ÐI[zëQŽtÓïC5ìewQV[‡Ã ‘ ¶•32¡¯Óëg!„B!ÄYa°iâc˜>y¶õ‚’µžÚÏ|mó—hiËm!„B!„Ï×Çv¿¸¸æ„ß}Ì8ɘ9îdñXÅQBö¢›pi t÷Få¶B!„Bˆ¿ÔXþåÄPÜ |xâcÛtÕ«è"JÎ)êf”Dï›~é7b²·B!„Bœ¾8–É÷»ù.ð?¤Ÿ„B!„B|Ì<<0ñ–Iz•ÑäK¤¿„B!„B|\ñT¡øh0îÖ²©«B!„Bˆªð߀Oö¦eš¾ ü(å¸=Œ…B!„Bˆ„盀MS ¤YÐZà œ…[6 !„B!„øH†áŸO†gŠ*ftÛ¦‹€Á\[T$IDAT: È“þB!„Bñ:€½ÀÀKŒ>œ–ÿ~ç”37Z ŠIEND®B`‚stem-1.7.1/docs/_static/prompt/events_variable.png0000664000175000017500000004214713157571677023023 0ustar atagaratagar00000000000000‰PNG  IHDRÕ†6vsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÞ;f£>Ÿ IDATxÚìwT”×öþŸ)tP:VTTMÔȵPƒhìÆKŒF¯½]ï/&7jŒD£±ë׫IÌ7–4£IlñÚ hE,TA"e(óüþápÖzÖbÍΜ³÷>ïì÷STx:v†è 9€šAA„—‹(ì°@bQ…TOùçEf0; ‚ ‚  ÀRÿ,)©nàK¯‰ÍAA¡HÎàJQIu#û Ó<AA¡$¢øæ%Ö“êß!O¨AAA)g´Mî ‹ »‚ ‚ ‚bܳñ9»|Ì›¼„˜5ÀðE«ð¾ŸÓ£»+AAÁ f°S#gÛ¼ ±Ë‡ÊÊí{ÂÛAóBëѸÅÌÓá¾°­ˆ!`î‰Ñó&¡“*P‹¿žw4ÃÎg-®e¤"xA X”¢ïƲ³ ‚ Ï„)€ájäìC]1rÀ&Ó°ý‡uV×ô…Ö“³ ƒ½š£yËžøøšD’øëYPê¶ÜM,àÑÔf¥è»±ì\®PWC»™ßàB‚¤ ·cVûêeó‹Êóü,A¡²Ò]‹œƒ]CÈJDxh" }€)bñ×3¥ú¸ýE/4 i€ŒËÁH/@‹:cwáà'­pfé:ÌZ‰ ;ÔÈÿw+«‚~– ‚P‰i|B¦æl·¼.ýV¡­yﳌYuàç ,’‡;»ÑúÑçÕäëþÀK÷IRÏ„ïù¯^5ij`=×Ü–ÄÌÜ÷ÒnŸäæ -XUýX»´µ9ñÉÃ}iûŒ}SWkÇ)k¾ç‰°h&gäµ&‘Çf5Îo·Ö‘flåé;:’dfìynŸÛ™šüz”´YU¥ G­?ÆÛ:’ÌàÝ ™L2dz=š þy)üeMßïRÈ3céöx½Õúópæ_ÜÑÍZ‘O5ncy¦`gŠj’¾+µsIñ£vdå™ÈôÜÿO¾¾KûÕ¡™1ãB©Ì_å'dêÞAtʵµÚy0I#o-y…æõ³D"‘HT™•QdR­m䯹‘­ÙŠA7¼øö"'z6ÔP]eIeAçÙbð6Æ3žÛ· §§'===éáj™SŸÊŽ>ë¢HÞä7s³g¯¡œ·3‚d×ûØQ¥´€0¯ÇžƒÙ­7½;¼ÎI[ÂHÞåš6–FOªM=ç3ŒdئiÚÛ—]:u¥_ŸA|Ý#÷³TÖl»ô*©»ÈM“Ù±Mg|oc©ã‘ñu©UÚfߨqŸÌ¾Â/gb¯Àᜱö–ER])ýeÎWƒ"¨¿þ!›š*sGÖ«ïJKhRo:C2opQ33e>ÕÚ°v#Ozzu碫Oi"*)£ ~´îœz‘äõ•àG¿ÀÑ\|èÉsœÕÐô¹_˜4µße0ÉãÃjÒãï¿1é¯SœëU—o"yöÖÔTÌωD"Q¥W/j4tèàÀks~^RÙŠìq§__+ZjŒXÆ€ÆZ´^Å»¼ËU­-žür¬5ž§I^™ß$ÿéš™?¸Jòä¸B_ŽÅÕS¤l¸WG^šãQ8ù4ZRÂo»[ý¥_c g¥óÀpWj%\ö°?ƒ¼0…uµÊÚ¬uŸÌs$/Îlß›@þVIu¥ô—š.#O1;ékv©¢¦Ëð#ÌæyNq×Ò²Í:FëŽrˆ£J‘O i’¾kg%ñ“—Th‡¶Î$ž#yv\ÍüÿSäï§»‘m-•ÕcÞâF0™ßø8²Õ§$c¸±3»ïJ!o.fssãÅèóü,‘H$Un½éCv6âŽÆáçwÿÄ‚F!Ø0;7–^Õà³Ä5,ŒXÆHX6è ODãо›Ð彨 ÇÏ¢Ï.h`ÀgiºböÖãOE¶>‰Wþ™•i™ì’QÝá¥1ƒÏ—w•·{…>Û»™Žp4QÖf ÷Žh€h=z™å`âQÅó—É7¯ ÉÚµmÑqÄkPà C|\a]£1lï‡âæC–» ^Jãçq²®âf*`ãZUñ‚½ôÐѽE+´jõ¤Zv]€ 醶>gg7Gí:1éxYO†žŸ%‚ TF´Å½iZÓÍÚÃ{puÔ¶Éy·uHË6~ã *tD$¨TVaR“vïÇ’zû±`r~ºt*_,ûþc8¿©Tj¨‡¯ùcqhᬄ ¸•®°ÍÔƒPA­V•£ð«XþJ¿uú.hÖ¬š6Å’¥ZŒ+-þW¸õ9" MYÐ/0~4EßDdé•Z¥¸mL½‡+!1E—gN}JÈL¸‰X£†‹ÔY1ˆŒ v››%pÿîñ®ðy~– ‚ð&ÕššÕÑge x·4yô{0'¶ÄácéÐéWÆ D÷:XÁÁúÉf§^;„Ë€®¾î0;šóôÓ¬ü}œË¿áZš²z`áßæj„Í¢ÿ„äÔsÝix2IÓg"-€¥,Õ@’ÞøJ ÛP@ûÖ&ˆÜŒ"†*hs굸„ð h‹“ÁH{ÁUÙü•ŠóIÎð›0—‚0v:¼=·sCüÁˆûŸ:ü•ÀÚ Ö 1Û0*²³’ø1­?CøéIp)ê͸ÿC»:ãp"UcNá`$0qHGؽ±z@íЃš+O#Έ7ãÏó³A„ÊÏ“óBªÛqìõV nÌ!S«³Vî\Ñ2)c€TÕûpw*™~zGø±GßÑœ2Ò“¹ ߺ®ÏYø¶}ÞPôÎ÷¾,¼ðMI=¦ 9çÉ;;9»_gz·zmüg󈎼þaÓÇvC°dÛ 1döE®È€£9qh#ƒv (qþ­Ê†W„“LáÙÍs9²?ýzõã¨iÓXË$w mVÙ²ëºH’ñ<4Ž}ý}ÙãÍe +rNµŠUÛ.apŠž±{dzž‰ø ¡váˆã$™ÂÝ}í©R;sè~ÉLèoÿ¨ÍŠçTÜ-—E’ ç–IýØ{ÀNÞ¸P{Ší»";+ˆŸ"æTÃÚ‡Ûÿ*Ê†ÅøÛÒM^mÉ–-ŸT‹¦5i¥V;&¬ûÎoLg2/É×_ÉŇ“Éôß8®Žö±²¥UC>K$‰D"C*ªÔ´ó4£yq UÆ ™²îà5<~'wã¯ÌXžYíÇêêü-Úîá•9o'ýùÔÊߢMa=æîý´÷cóöÓ§11*˜_ ¯¿ÛFÞ‚.×Þ\qü³H2+ެõ§½ÚˆI5@hØaêf¹‘œÛ ,ÞÛ˹ÍÌó\)i³©ýßÛÉs1y›Ïe0!ü(Wõr|l1š Ì Í-sŠ#Õâ/€€›tƒŒÝÄNÖ9 ­ß6&ò2ç641̧y ºqáÁHêH2;žÁk{<Öžl¨¤LIñc¤¤Ú¨ÒTgûYÛ’˜»!aÈÎîP½ˆE“FˆUÅŸ%‰D"‘¡IµHV°Ú´æ¼“ä½µü›¥ØC$±*‰D"QqÒÊì—2@eׯàbñ´½'ôH¾ŠËwRÁrØ|‹úý0íÓ1½u<¾´gRÅ_åÙ_/3/]¬ ‚ åIªËó&˜½ï ¦¸=½ÈÝU­Qò™ç²`Ð`ª4€§Ù1Ìnˆ/OÇ#[üU¾ýõ2ó²Åª ‚PnQòðMAAJƒZL ‚ ‚ ’T ‚ ‚ ‚$Õ‚P©YÕ–˜ºó86õu.px¡®Ý†¢‹«‰HA$©~Þ˜Àµçì¾ f=@TðNLoj.ž ²rGûÞðvД¦Øù¬ÅµŒT/h ±a)ë{s~9ŽåÝârdÝCÌaô²ÿàÐÅ×ÐB‚WA*g?Zç!Ü—N&ZÄá~ÙѧŽÎöŽÙ EëU¼Ë»\ÕÚ¢õhXcôQf“|ø]¯üÃ@ƆKeË.ë¢HÝ ÎjfYè”HÔ8öàêk$£6ÐÏ^-1,‰D"‘þòœžV+x›1ÜÐÖRW– ¡¦*¼Ö’µ­TbÃRȬé¼BL¨ûØ1ðNÔ¬?‡ÒÈ»ë;ÓF%1,‰D"QåJªMÍÙny]ú¬B[ó§ü£±Ê(‘U~žÀ"¹<Ç#?a1­É×?ü—ž !ßó_½j:öZ]­§¬ùž'¢™œ‘WK"Íj\ÄñØÅHëÈN3¶òô]îÉÐç¹}ng:hrޝvèÿ uŒáÆB7fôZN¦ÿÌ7ìU ê¡vdå™È¼S¸“¯ïãÒ~uò.Æ>wv£µÂ>iÜÆòLÁ.xl5 hO%¶¡Ú¦%'n9ÉÈ”Ü7³S}~ýª=~bÅvcÈ{ëØ®JñG¹7œ}žÌ<Â15‹øÅEãÌ>[n03ë¿|ÃEŽÎ‰D"‘¨"%ÕÚFnœÙŠA‘­tËo/r¢gC ÕePFÙÏètnИ-oc<ã¹mp zzzÒÓ³ëV3Í-cGŸuQ$oò›9ƒÙ³×PÎÛA2Šë}ìýônê9Ÿa$Ã6MãÐÞ¾ìÒ©+ýú âë<ýVY³íÒ«¤î"7MdÇ69ð½=Œ¥ŽGÆ×¥ Úif’QË[ÑâQÒïÉùa¤nß :ª•Õ­;§^$y}%GøÑ/p4z@òg54-Á>žôpµTno­ k7ò¤§Ww.ºú”¤ZI{*­ -ÙvC ™zŒKFø²mko¶÷íÏ1ãû°®écý3•Adì¦v´*iZ“Ë0þ/+›'F»=™4[¶á†˜œü=vc[ZÊK$‰D¢ ô¤Z£¡CöXÛ˜óó’âÈVü`;ýúZÑRcÄ2Fúi^Ska‹Ü§ôf^ò:Søc{ª”Ö“—Hpµu&ñɳãjJÂŒ6uA[›Ï•T+hO峡-öêÈÛëÙÓY[|mûð`6ùû·’ojLñŸWÈį:³ÊïkéÜu —,™JŸ’>S$‰D"Ñ‹[ûWäÒÅìlÄÃÏïþ‰B°av n<,½ªÁg‰ jX±Œ‘°lОˆÆ¡}7¡Ë{QŽŸDž]ÐÀˆŸeáÑ^3ø|yY$H‚ú8lïf8zÀÑ€>ûÖüŠ´Zƒðf æh2b$ê%~‡•¿ÅƒJë)‚¬„«¸™ ظV…/žgiOÅ´a̘Œ]úw°çÞ]œÝõ)¦x¦ˆ T&0S)%Yš™ˆˆû€›žln¢}†9sVà`t–,«A„rж¸7MkZ£Ù@{x®ŽÚ69¯ñ¶iÙÆ/cTP=þŠÊøFS©ÔP!_ òÇâÐôBï1#·Òs~H8ô¾MÜ¡c^Áü0¼;²îl]‰ ¨§ÈŒO,= R?Ù_£À‚U‚áí©¨6Lûsú×ÿ-†aø°øàÇiX|&½{ÎÃøü€fz+kÀ»¥É£$ö`Nl‰ÃÇÒ¡Ó¯Œ±H½v—1]}Ýav*4çiµY=øû8—õ4#~VØ~„rÚ·6AäŽ`<|Ê£H>8†O7EàÍwf`àK ±¿€ù«Ï!ÕÀz纇ÐÁ ÖÚÒV„¿ÒX;ÁZ$–A¦W¡m˜‹?v}Š?v-Ǽ¦3p4ä¬z{3š-¾šŸ<§…áàŸ@oÿV¨tÑÅźyx×¢öFåÿÊR`ˆ:uyÓüÕØ¿|µ<­A„Š”Tg§êaçeħàÜ—±8þõ}DƲLÊ‹ì¨oð ÿÄÁíÆÖ¬bk¨¯¼µï{ÜÆ†n;pÛˆ‰aöí혳r.þ7ãW[€U?žGt¦\=jáþ®Õø!2/µJÇÅuŸàôôÕØ¼HÙ3_…g>C=ÊÐÝ>д¹èóѵp¢µnð¨z ¿¸ ƒî)ôI¸t" ˜> ÿš‡ïblQÇü6nýé/µ «¢ý‡Ÿ¢oâ!ø#ñ: ÔìØnÈÆµèÊ›³îàç-g°zõ uߎO¯?½U^}=«ßÃÎ=7žLª-_ÿþûÞqFÛýŽ:ãN<º¡A¡|QÄÎ jÚyšÑ¼¸…„Æ*cÌ=„Mk2`á^y³[BÒŸ?qa@­B[åc¡"BãÀS7óÈäܽղx?l/ç63âß­ $o2¨¥…áõ±ÈÖ>Üþyýæmcgʺƒ×ðøÜã2cyfµ««Ÿa1¦C7.<IIfÇ3xmÚ« mO%³¡Æ‘¾ wóbLú£íöÒ£/r÷â>¬mödÿTv¾ü<ŽLÙ7–uLž¶(´.ÇÿOG†üƒMQô–zŸË–z"‘H$U‰D¢²‘†Ž_ðõ¼´¬ë“77*KzÍ:A#¸ªCÕ'N\‰D"‘H$IµH$ÊMœ›þý&1‹¿Ïl˜ÿ«‰Ú†­füÊ$¦óøœæ´’ÓE"‘H$ªÐ*åŠ6AŠŸ\•ŠÐUh~m\GFÞëjk4hi‡CÓÚâ­Ï. …b*AA¨È¨È×¹ ‚ ‚ ”µ˜@AA$©AAIª… ŽY _´ ïû9•‹cÓñ» ‚ HRýPY¹£}ï@x;h^h=·±8C‚y:ܶѠæž=oú7©"wi/ Åï‚ ‚ Iõ‹ÉšLÃöÖaX]ÓZOvÌ. öjŽæ-{âãkŒ‡‚ ‚ TTdK½IV"ÂCítHs‚ ‚ TT^®'ÕVðy‘zz\à‚I§SM½x¸³¬óÊ™ÖÄëþ€K÷ R„ïñ¯^5aj`=ר–„ÌÜ÷ÒnŸÄæ -Pµ ¬®®ÖSÖ|aÑHÎÈ›R’ˆc³ç·[ëˆN3¶âôH"3ö<¶Ï팂³”´YU¥ F­?†Û:‚ÌÀÝ# вm¯ê¿©¿ƒ¯uYÞ>×wúÿc°±­e2ƒ×‚p0ýg¼a¯RfCµ#z,?€ÈD¤çÚ0ùú>,íWf†Æa%÷» ‚ T6^¢Óí,èÜ 1[ ÞÆxÆsÛàôôô¤§§'=\-©•}ÖE‘¼Éoæ fÏ^C9ogÉ(®÷±Ë9JZI=a^=²[;ozwx“¶„‘¼Ë5m, ·K[›Ï‘<Ü—¶ÏØ7SÏù #¶i‡ööe—N]é×g_÷Èý,•5Û.½Jê.rÓä@vlÓ™ßÛÃXêxd|]j•¶YãÄ7vÜ'³¯ðË™ƒØ+p8g¬=Á‡$C¦×£É3´½ªÿn¦>ü޾Öeå÷’û®vƒ™dÔòV´Èû?SOÎ#uûÑQ­Ð†ZwN½HòúJŽ ð£_àh.>ô€ä9Îjhª<_¿‹D"‘HTÉôòuÚ¢õ*Þå]®jmñÄ{šZãyšä•ùMh–÷º™?¸Jòä8ÖÔ(«§HÙp¯Ž¼4Ç£pb´¤:…ßv·.ò}M1<ž•ÎÃ]©y”lÚsÀþ òÂÖÕ*k³Ö}2Ï‘¼8³A~lù[$Õ9ö} ±ÙÖRYýŠú®væÐdÄ'lažSÆÌëC^g ìcO•Òzò’ê¾ÔÖ™Äs$ÏŽ«™ÿÏ?•Ìï"‘H$U&ÉœêǰlОˆÆÖ}7¡Ë{QŽŸDãýa]ÐÀb#¢*œqàÔÓ—.À;=^Ejj$Ç&£Š)aeúÜçÝXxt‡—Æ Ö_ÞAÖ—½íGàfVÉm6uÆGo#³4íiýÂNOF¯ýšœ{¸gô´«7'C?F÷ŸÃ¼cQ‹«éFì{Z ö­ùiß›Mæ#ø¢Éˆ‘¨—øÆÿ*­§£d%\ÅÍTÀ˵*4²_b¿ ‚ BeE’ê"QAõø+*«0©I»÷cI½ýX09?]º•‹/–}ÿ1œ_DTj¨‡¯ùcqhál” ¸•®°ÍÔƒPA­V•ª=é!£[³ÃLTi¿‡—ë1¥Ëd0#áiyWBbPä'Q,½û"áÐgø6q?†ŽyóÃLðîÈZ¸³u%N<0 ž"wÇËi«J­‚ê%÷» ‚ ¼¤IµN]ÞÅ45ö/_ƒÑYeXæùAÝCè`ë'»Ÿzí.cºúºÃìThÎÓj³zð÷q.ÿ†kiÊê…|›«4 ‹þ’SÏuD¤áɤZŸ‰´L–v°TIzã÷95l?B9í[› rG0ÏÔæÔkp àÐ'ƒ‘ö¬>H»‡«!÷U] +3 á!qñ¯ÍiýÂOO‚KQÄýÚÕ‡©Fê;>8†O7EàÍwf`àK ±¿€ù«Ï!ÕÀzŒ‡Æ;åÍï‚ ‚P™yúüË6\“7…µ--˲Ìs”ªzîN%ÓO/ã¨?öè;šSFzæ,PSÙ±ëúœ…ŠÛç e@ïá|ïÛÈ •ÔcÚs.¼³“³ûu¦w«×ØÆ6èÈë6ÍŸ¯ °dÛ 1döE®È€£9qh#šqn-T6ì¸"œd ÏnžË‘}üé׫GM›ÆÀZ&¹ ó´YeË®ë"IÆó@Ð8öõ÷e7—1¬ æT«,ÝØäÕ–lÙòIµhZ“Vj¥ ô=o>T݉<••«@'µõ1§Ö>Üþד~/6~ŽŠìw‘H$‰*™ŠySãÌ>Ÿß`fÖ-~ù†K¡EVF/ó\eʺƒ×ðøôœl%3–gVû±z^eZ“ ÷ðʃœ·“þü‰ jÑÔÀzÌÝû1hï%Ææ¾M}£‚ùÕðÚù».ä%s®½¹âø=f‘dVÿXëO{µ“j€Ð8°ÃÔÍü®×SÛ£¤ïƲ³¨üļĘH$‰DEKö©~‘d%"<4Ð>@‡”òÒ¨lÜþ¢…4@Æå`$‰—‰1AA'Õ…dÕŸ'°HîìFkäSþú‡?ðÒ}’Ô3!ä{þ«WÍücÊÖ£qÈmaIÌ;Ô9íöInžÐ‚U?~\[›Ï=ë“jkú~—BžK·Çë­ÖŸ‡3ÿâŽn9GX««µã”5ßóDX4“3òZœÈc³Ó Æm,ÏìLQíQÒw¥vÖ:²ÓŒ­<}G—{J÷ynŸÛ™šÜ÷ÕŽì±üC"™wzvòõ}\Ú¯ÎcÇ}+WUÿÝL}ø}­Ë0Ί헊ý¡Ž1ÜØÖ²Àÿ™ÑkA8™þ3ß°WÏ>J}!1f´‰D"ÑK«—¨³* :7h̃·1žñÜ6¸===éééIWKªBeGŸuQ$oò›9ƒÙ³×PÎÛA2Šë}ì¨RZ@˜×cÏAìÖΛÞ^ç¤-a$ïrMK#&Õæ|5(‚ú벩¨2wd½ú®´T&õ¦3$ó53#šzÎgɰMÓ8´·/»têJ¿>ƒøºGn{´6¬ÝÈ“ž^ݹèêSڣȆJÊX³íÒ«¤î"7MdÇ69ð½=Œ¥ŽGÆ×¥ ´îœz‘äõ•àG¿ÀÑ\|èÉsœÕд|&Õ ú¥vƒ™dÔòV´xt#çÉùa¤nß :ªh¥±*1f´‰D"‘$Õ2¿ ¦Öxž&ye~“ü'Uf^üà*É“ãXSSŠùœ¶Ü«#/Íñ ‰Ñ’j5]FžbvÒ×ìREM—áG˜Íóœâ®¥e›uŒÖåGU„'…ßv·.áIkÉí)í|WM1<ž•ÎÃ]©y”LÙsÀþ òÂÖÕHx ´C[gÏ‘<;®fþÿ!©ÎiëSˆÝȶ–ÊêWÔ/µ3‡È #>a óœ2f^ò:Søc{ªÊÀ>¥›{,1&‰D"QI’9ÕaÙ +<­ûnB—÷¢.?ˆÆûú ÅFD=TV—Ö©+¦/]€wz¼Š:ÕÔHŽMFS ÂÊÔˆÛ®è‘|ó ’¬¡¶#G¼5L1ÄÇÿMj Ûû¡¸ù°üšiáÑ^3XyY_>öf´M€›™Oþ_VÂUÜL¼\«B [Égµþ a§'£F×~MεIô´«7'C?F÷ŸÃ¼ÇP‹«éFìWZ ö­ùiß›Mæ#ø¢Éˆ‘¨—øÆÿ>gûHŒ= ‚ •Iª‹DÕ㯨 ¬Â¤>&íÞ%õöcÁäœ-îÅ IDATüté>T.¾XöýÇp6rkÓoF„¾ š5ë¦ÍC±d©ãß @‹ÿÕn}Žˆt+dAK”‘…Uj¨‡¯ùcqhá2#·ÒhŠNð²ô€J­RܶôÑ­Ù¿a¦ª´_ÃËõ˜Òe2Ž?˜ð4€¼‡+!1E×ÉœÏ4Z¿@$ú ß&îÇÐ1¯`~˜ ÞY w¶®Ä‰Ïß>cÏdž‚ ÂKTkáÔå]LóWcÿòÕ8U†ežÔ=„Vp°~²û©×á2 «¯;ÌN…æ<­6«gàòo¸–¦¬XxÀ·¹áA³°è?!9õ\·ADžLªõ™HË`iK5¤7¬?Ù ¡8Ÿä ¿ 3àp)cט¡ÃÛ3ñw;7ļlp} ¥°v‚µHÌ6̆Šì¶¡€ö­M¹#eù “i÷p5ä ªëdef!<ä".þUÀ]­?CøéIp)ª‚¸ÿC»:ãp"µäÏRÚ/>8†O7EàÍwf`àK ±¿€ù«Ï!µŒì£Ä_ÅS‰1AAPðõöTY¶áú˜¼i¥miY–ež£TÕûpw*™~zGø±GßÑœ2Ò3gјʎ]×ç,TÜ>o(zç{ßF^¨¨¤Ó†œsäœÝ¯3½[½Æ6þ³yDG^ÿ°éc; X²í†2û"W dÀ€Ñœ8´Í•öIíÂÇI2…»ûÚS¥væÐý:’™<ÐßþQ›Ïw…9[.‹$Î-“ú±÷€1œ<¼q¡öÛwEv¶aÇá$Sxvó\ŽìãO¿^ý8jÚ4Ö2Éwûä|WXûpû_EÙ°tsªU–nlòjK¶lù¤Z4­I+µÒ…Š ú•7÷ªîDžÊÊݱâ§tRXöQâ¯bǩĘH$‰D¥X¨¨qfŸÏo03ë¿|Ã¥èE;Æ*ó\eʺƒ×ðøÜM´2cyfµ««ó·Ô X¸‡Wä¼ôçO\P+K=…õ˜»÷cÐÞKŒÍÛ«KŸÆÄ¨`~5¼vÎÎ,×Þ\qü³H2+ެõ§½ÒDflþÑ 2v;YçlÛfë·‰¼Ì¹ ó9å ¨qèÆ…#©#Éìx¯íñX{J°¡’2v˜º™Gn$ç(‹÷Ãörn3ó2KxLjøò­‘ÝèfR†ñUR¿%ζôÝš@ò&ƒZZ^AöQà¯bǩĘH$‰DÅ>´E¡Ù‚ ‚ ‚ Š,T,Ϩ,àÚ¸\,ž¶WˆéÑWqùNªÜ ‚ ‚ ¼È´ ò¤ºübÑ +®Á·§¹»ª5êO>ƒ4±– ‚ ‚$Õ‚ ‚ ‚PQQ‹ AAA’jAAA¤ZAA$©AAIªAAA¤ZAA$©AAIªAAA’jAAA$©AAIªAA¡’%ÕZ8u™Œ—L…³¶ŒË‚ ‚ BÅ…O•e®!I2vc[Z–e‘H$‰D"‘¨‚ªø'Õº›øåç›ÈÊŽÀ/¿Ü„®,Ë‚ ‚ BE•›] ‚ ‚ ‚ðŒÈBEAAA¤ZAA$©AAIªAAA’jAAA$©Ê³¾hÞ÷s‚¦ÂF¹ ^›°«g·„¥xTX}¹LZµ%¦î<ŽM}+î5L¾/„J‰®Ý†¢‹«I¥êÕK¶9·Šv>ky-#•Á ZТu©¬ÜÙ¾w ½4ÏÞ­;§^Ô3nS;ZZuà–=Ïÿ½µåÅ^6üdÈôz4©¨þÒºsêE’‡ûÒÖm2Šß+ñØQbŸÊi×8VËéuLeõ*ÿq"Lú•Ó[V¥ºŒìSÚz4ncy†0’ÿ+Û÷…ø«’]ŸÍšòÿ] ÿÇ5´x ©¤ç­j{ÁÝÄM]`VŠšÌ›LÃöÖaX]ÓRÜÒdA—©GfZ&XðïÊþ@£þÛøæüEü~>?Mo–ûTN×!? öæZt¶UÝ_ÆÂ(~¯ÄcG‰}*’ %VŸÏuL¹¢²Eç¥?⣖Á˜Ý±/–ÿ‘ }Ù§´õdÇìÂ`¯æhÞ²'>¾&Ï/Ë:ž+§¿*àõYŠÅÝ{bMbol8°~ö?%Õ¾|Ã2·¿è…F! q9I/¼9ó î%#;Kƒ{ÉiHŠMAv¥ö^›7¯ìé…–[ºãøÉ…è²¹7~±è‡Õ+šãÛ¡oáI,Ÿþz©y}!±ú|®c†ØYa’Þd*ÖwÄÑw;bÅÅÔòý "+ᡉ€ö:¤È•¦ÜS.ýU1¯?Ù±?czwá²[nCã ‡ñ ‚?U|ò¶©9Û-¯KÿUhkþ”ÇÜÆ*£DjGöXq˜WcRskÉ`ôßp^w—B?1©«µã”5ßóDX4“3ò~—Iä±Yiªô'µ#{,?ÀÈD¦çK¾¾KûÕ¡Y^«üë¢HÞä7s³g¯¡œ·3‚d×ûØå|ï(ý.(éÚkĤº\~_”V•Ò_r}.t3è2ŒÿËÊæ‰Ñn>ø¨I54:tp`µ9?/)ŽlÅö¸Ó¯¯-5F,ó¬‹w,Zð£pR| kh ^LRømwëê+f ñYÚ:“xŽäÙq5 9Û¢õ*Þå]®j]¶ìKê—¦ÆÏJçá®ùíSÙsÀþ òÂÖÕ>¥nÛîÕ‘—æxРÖ}2Ï‘¼8³Aþñ© O´tî:…K–L¥³Öà>™ÔÌMçbø þ2·ÿs6¿½w›Ÿ÷¨^ô Ii¿hŠŠ“†œJòìDÖÑæô§öøÓ$C8³IŽÝÍãŸLçÞ¾Õݸ•äwe¾°eÀ^y{={>ƒí”KM—‘§˜ô5»TQÓeøfó<§¸kiÙf£uG9ÄQe¼±cÀ¸(µ §«!V ´sI²íÃÙäïcÜŠýÿbíSkÙút$^ù7º›fV¦P°pÆÑ£·‘Y²U}è3Ì™³£³ nsfä1öU'Ø8v—§Àûè2\u±bðÇÆ¨YÖ;ìdFâðá{€G¸›çôçökq$»)FÖ 4pl× ³N`ë‰DÅó1•ù" fLÆ.ý;Øsï.ÎîúSÎÀåßp-MaÌ+¸öæç™HË`iK5 ŸåöûÂ8T6Éõ¹àu®¼ëQ{£òi¨ <9/¤ºÇ^oÅ àÆ2µ:k9ªÊ®Œ!ó SNpíŒáì0˜³¾ #™Èo8=š3§xÞÌÙrY$Épn™Ô½Œáäáiþ´9Ö>Üþyýæ…V®ªª÷áîT2ýô2Ž ðc¾£9e¤g©”Á3Ì‘ƒÊ†W„“LáÙÍs9²?ýzõã¨iÓXË$w¾RCι@òÎNÎî×™Þ­^cÿÙ<¢+Ð/•-»®‹$ÏAãØ×ß—=Þ\ư§,T\ÿÌ‹¿@¨«±û¦HÞû¦/4 ÿwŒ=?ƒõ«4㢫·¹¹½•2?×–s˜¿}û¾Ã }1$#¸¶‹m¡9¨0mĹ!$ï'‘©û8ØéÉERÅú]‰/P•í?ÜÄeÓ†²GGo¾æÝ™oÌÚÅhfñè¨Í7S±jÛ% NÑ3vïxÖ31ÔÎ.qœ$S¸»¯=Ujgݯ#™Éýí[ä[ʱcÀ¸(µ §«Ï+VK)ƒì\’´¬;ñwêÌéõMž~ÈE±ö±c×õ9 ß¶ÏÊ€ÞÃùÞ·‘…¾)©Gɵ·Ð.*1döE®È€£9qh#åñS^¿/J{«¬þ’ëó#Ui¿žÑ¼ËÕÞ–•o÷¨Ô´ó4£yq UÆ m¦Br/g“›Œ;' m3eXà‡n\x0’:’ÌŽgðÚ´W ¦¬;x ßÉÝ4&3–gVû±ºú9'Õ¡q`‡©›yäFrî6Y¼¶—s›™?*cîÞA{/16o}£‚ùÕðÚù+¾MÝèÿÞNž‹É|´}aBøQ®êåXø TãÌ>Ÿ?ë6e*Úùlà­èì眻}Že3ÎØÊó¿_äùoƲ¾©B)Ü’±çÊ£ OÈÛ‹(“ÑÁÛùO?·"Ó¨iß{Lú¯?mUEoÿS¬ßKò…Æ‘¾ wóbLú£íŠÒ£/r÷â>¬möøg™°Á¬ÐÜR§8ÒÙÐÌØü£dì&v²Î±½­ß6&ò2ç641îØ1h\”Ò††ŒS‰Õç«¥= Î0;—˜€Ùùòó82eßXÖyjW‚}Lk2`á^yóvÒŸ?qa@­ü-ÚÖ£èÚ›· Ëµ7W¿Ç,’ÌŠãký•ÇOyý¾(õu¬²úK®Ï9åërüÿtdÈ?òw4ªTIuy“‘ýRj<—2oò“–åãØTµMkÎ;™AÞ[Ë¿YŠDå7VË—4t ø‚÷¨ç¥e]þ°C$×1‘1¶K´¤×¬Ô1‚«:T-ük\ÔKx¢¢ 1—³j´jlu5oLXù/8çÓ^x»,ê÷ôLÇôÖñøzÐBœI_I¬–ÏX-d#ö§ è>Ù ÇVîÃÏ÷š ýҫȨˆ]QYÀµq#¸X©€—ûFIAAJýð]L ‚ ‚ ’T ‚ ‚ ‚$ÕO`ÖíÂû~NåòXðòçE¼6a)VÏn K±† ȸA$©˜{bô¼IèߤŠðs)â¼v,½…m·‰ØMí`Uð-«ø< ‹PìF´µTXAíyŽ÷4M¦aûë0¬®éK7¬j{ÁÝÄM]`V ûT,*ŒCu5´›ù .$èAê‘pq;fµ¯^à×$3Ôí·;ÏÞA R‡{ÁÛñ.Eü⤆uã@ÌÙø3ÎEý…ìôßñnmí3Ô#ãBA¤úùcZ£?[€.IÛ1»¿?z ž‹½&½ñþ_a¨[þ×µ‰Ãk±dþüs »ªÇëI;~íо}ûGêôÆG8“ Äü²á:…õ(lð¼ÈÆí/z¡QëVh2l/’d\ˆC-êŒÝ…ƒŸôDòæ1 ƒÍz èÀŒ®£}d¿,mÜÿe!FöòÃëCÿ~5{ýôoô¶/ý*K4™°¯COõI¬›ÖÚÄ®èlÃêA„rFѧUkÇ)k¾ç‰°h&ç˜ËD›Õ8ÿÈO­#;ÍØÊÓwt¹'Yžçö¹éPàXrë@n KbÞ!¦i·Oró„¬Zàt+U•&µþoërŽ9½{á"“I†L¯Wøh^3ûlyÖã†s?KkZèÿ¬Úob“øŸÎUr_3ç+]bôùoøÿâÆ;dܦv´*®^3ìJ"£Ö°³­Ê zJn!ǸŸgpdIRwûx¡cÜÕÎoòpµ¼U½1mØã»2êS¶4aÕŸ'½§æÃÝhm€ßÕ6-9qËIF¦äVÂèóèW͘{êZÓ÷»òÌXº=~ZZµþ<œùwt³VÏ·±Æ²¡Ú‘=–`Hd"óNÊM¾¾KûÕyòˆ×ç1.Ì_å'dêÞAtRçÅÔ`þ’FÞZò ÍŸRoÕž?17øQs³GÇQ[·]Áð¤ãœõJŧg=YŒ ‘H$UcÊsΚ'Ã6MãÐÞ¾ìÒ©+ýú âë–¹GKZ³íÒ«¤î"7MdÇ69ð½=Œ¥ŽGÆ×Íßàݼ{ d·vÞôîð:'m #y—kÚäÖ£qâ;î“ÙWøåÌAì8œ3Öžàâ’jË6Ü“ó]»±--KÝy5‡ìc:/pf“Çfªr¾ìs7p/>©VѦóÞã}n °§ºÐñ›†ÔSL{”&OpíôaìÝkgn½J=¹½¯SN›458öÉ+ÿdcÓ¼ ê½¹ú.™ôŸ®9‰Ê‚Î ³ÅàmŒg<· nAOOOzzzÒÃÕ2§E~·dÛ 1dê1.á˶­½ÙÞ·?ÇŒïú¦Æ ^s¾AýõÙÔ T™;²^}WZª@“zÓ’yƒ‹š™)‹g­ k7ò¤§Ww.ºú”¤Z‘}ŒdÃ<Ÿ^_ÉQ~ô ÍŇ<ÇY M ·ë9Œ MíwLòø°šôøûoLúëçzÕå[§Hž}‡55OmíÞÿ8˜LýõOÙ¦JÞÍ‚íK'\fhÔf2‹Eœàæw[ÑF]ôQÓEÖ#ãB$‰D+©Ná·Ý­‹|_Sc g¥óÀp×ü'\*{ØŸA^˜ÂºÚ§| m÷êÈKs™çH^œÙ ?¶ äoE%ÕÐÒ¹ë.Y2•>Î¥?ËÜãmþ”HÞXÙ‰¶ª§ŸŠTl2¬­ËwOe“çfÒäøÓ•JJªKl!'Nš4äœP’g'²Ž6ÇvµÇŸ&ò(Q2m42{ûV/ôÄТõ*Þå]®jmñŒ~·eÀ^y{={:—å)fjºŒ<Åì¤¯Ù¥Šš.Ã0›ç9Å]KË6ë­;Ê!Ž*EñœoËÚœx®øÓ;‹³ÑlX„Oµu&ñɳãj>ö4ºìÇ…y‹OÁd~ããÈVŸFŒáÆvÎì¾+…¼¹˜ÍÍ _ÞAVÞ"=}¶w3=àh’;Ó©+fo=ŽðøTdëÓ‘xåßèn ˜Y™B À½# GÞFf‰Ÿš…èCŸaΜ8UŠ/*X¿: ?œÞˆVF¡û¬ÿ!éÏ•4k23½uØ»èK\Ï|ñíyDf$¾xt€»yŽínÿ¸G²›bd`˜@Çv½Ñ0ë¶žHT|¬¦2¿'áÀŒÉØ¥{îÝÅÙ]ŸbJ€'lŒ>M\ä›WdíŽÚ6Žè8â5¨á…!>®°®Ñ¶÷Cqóaù;0TéØy"ú®âf*`ãZõ±{Ïs\¤âììæ¨]§1&O)Ú+q?bD‹¿¡kß X~¢>>8öÞo‘³DW]Å 5«×wmÀ×ûÇùà£Ø6ÿm||Í:¢šJY=2.A„òÆ3o2¡R©¡B¾äÅ¡é…'ig$àV:“ú˜´{?–ÔÛ“ðÓ¥ûP¹øbÙ÷ÃùQa=ÔêçµI Û¶óñËÁ÷áôßhýÎDfJ ²£÷båÏ©Øùö4X½M¿ ý©ñ8¯7®ß¤ý¹ý뇖Ã0|Ø|ðã4,>„Þ=çá@|¶Ñ¼™~ë4"ô]ЬY4mŠ%KµÿVZü¯pësD¤X! Y°LPdCMÑ7Yz@¥V•AÛŠÃÌ„›H€5j¸XAƒÈj¸¹Y÷oá~ÁÊìdܼx7/žÆo¯ÀöÆo˜:ã5,}ó0R²tÈPÍ%çÆ 2cp%ÐØ»¢ªˆÏ*¹ž‡2.A„Ê’T§†íG( }kDîF‘-<àÛ\ð YXôŸèຠ"Òð(©N½v—0¾`q2i%4ש˻˜æ¯Æþ嫟驜¶Æ|±÷}¸þ·þöö·¸[š{æ0 Щ‡¾ÀéÏèc¶§PÛê£gwgðÒA\Ï3ª>¿}…˜#ï`b·ë¨Õ86áÜ{컜º‡ÐÁ ÖÚgó{±øc×§øc×rÌk:GC>Áª·7£Ùâ«È4R7³Bq>É~fÀáRÆ®1C‡·gâïvnˆ?xI†ÞéP‡¿ÒX;ÁZ$fUäéö1º ã²Ù1§p0˜8¤#ì¿ÞX= vè€A͈•§÷´|ÙÐPksîøðNGÓüÚÀiÑeDe0¯‹¿ÕRÎ^EB–²zd\‚ åŒLˆÄ3Ì©†Ê†W„“LáÙÍs9²?ýzõã¨iÓX+w‘iCι@òÎNÎî×™Þ­^cÿÙ<¢#¯Ø4g•-»®‹$ÏAãØ×ß—=Þ\ư§,T\_ªYVl».š|ð#ǶmÎfÍš=RSwÛG‹+UæÎlèÕŒÍZå×qäƒïߢw³fl\êМOm¿óÉS£\ /PT\²ö@éÜÑkË9Ì߇¾}ßaо’ûÏIDAT’\ÛŶðƲaQó­sæ#?;Ïu\˜°î;¿1É<¼x$_}$N&Óã¸:¹óƒµ.ì9ï_œ2,~>>ôï7Ží¹KòÿÝÍ.צl8ë,õü‹ßï˶­:qäšPfóW´­b@=•}\ˆD"‘¨‚)v?SR v˜º™Gn$ç®&Êâý°½œÛÌ<Ñ“{?í½Äؼ}ÁôiLŒ æWÃkç'¦nôo'ÏÅäm¼—Á„ð£\Õ˱ðÆ™}>/ÅÖa&õ9#¤è­±xz]rw°hù)£Š(ò`[V)P_•N[™ÈXnlkYôbµ’êQØž’KGö\y”á y{Åe2:x;ÿéçöØBÏœÅ}ö½wðɤÿú?eA¤)ë^Ããwr–Ë3«ýX]­ÐïGú.ÜÍ‹1麓}‘»÷am³Ç?Ë„ f…æ–:Å‘ÎjƒØŒÍ?ºAÆnb'ëœ$ÝÖoy™sšÏy‹ÎºqáÁHêH2;žÁk{Ð^m€}ŒaCC’êç4. ©Îö³¶3$1wCœݡzþç™Öã[ëñrŒ.oÃ9FÝÉ}Ýi^0δÎì>ÿ;†&ès¶ÙŒ8ÄO¸ç÷Ii=•z\ˆD"‘¨‚i7LC¼\2m<—2oò“–åcµ¬MkÎ;™AÞ[Ë¿YŠD2.D"‘HTá4ìèÄ•|›—ª ØÚ»ÿÖc"¿¸–ɸÿö¡“æÅ·Ë¢~?Îû÷qÆgßåú»ÊOà""‘H$ªhÒåæÓ€EbÊ­*62‚$³ãøÇï°Y•òq‚›Å+sùÕWK8ÚÛ^ùr‘¨’ ‘H$U(- ïö;€×dñ¦ ‚ ‚ (â €ÖPðð—¢Ä6‚ ‚ ‚P"Q¹ù3Oª¯ðÍ͸AAA(š3¹yó•¼?I!Àÿ0à§œë&‚ ‚ /!–’›7?¢¸ÓŽí Ð@s5ÅŽ…QY¹£2Oþ„Óqáˆa Ã-ÿ¿]9(60¢ˆ!€è.·ï%I’Ÿ…‰óJ9íXµ‘P,²IEND®B`‚stem-1.7.1/docs/_static/prompt/help.png0000664000175000017500000012165413157571677020603 0ustar atagaratagar00000000000000‰PNG  IHDRøäí©P*sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÞ ¬˜, IDATxÚìÝy|õýøñ×ìn6›ksß„„î-*­H+Ö¶Ö¶Vë]E{X[µj«ýêϪ­Ö*ÖzŸˆ(H¹ W Üw²IöÞýüþØÌ‚}?y< ™Ì|îyÏg?3«¼`&0(²€„B!„Ç«¨¶_;‚9€ľ EÀT)w!„B!úÌgÀÓÀ?CàÏ#¥l…B!„8i6÷¯O€ÿð#)K!„B!ú'à§/#Ëq„B!„è>.êôøiÀûÈ’!„B!ú³ Ày‡ù†Ãìøò)Üâ˜xý#†0$0ùÚ_ð£™Ù„Çq™×ð•R¨}Û'sˆ“Æ#„B!ú§©Ý1üaü9œ2Ô†S8oƒ;ßç©ÏÛP!<²¯þ¿Ì>’‘cÏçþ}•ˆ|.}ð}¶µø7Ž:¶,}”yöݦ„QpkéŽýÛVn/4÷8FDÞ~ûê:êÜ}º*Wóï›&kCÚBV)…ó£«É1íû›h¦¿ØŽ¿ä¤÷l Æ,®þ,ž¿|È “‰?[RsQ¬ô(!„Bˆ~àGݱü7üŧL‡pÙ•yØÞû;+ÛThíme׿lÜXJU× îû›YrS!¸œ§Oá¬Ë~Í’MuT·{»÷ñPñô… 9š³ïÚ láîsF3rÄ…¯¾“l8ìßÒªU>‡Ú¸¢R¹Ëÿ¬&E¡ ZM±]ùK~ Ò ûö WÃ[¦Ü›nQÃFþZmóW©GÇGô8–I üÙz¥ÔÇê¢ØÐÕ©l²É&›l²É&›lǽ-ì9ƒ¿¨g´o”ÈÔï%rÖƒC¸£t8?ü}*E…ƃf}CµOð,/¸Œmoó÷’öoþºòMî¹ê;œ7ûûž_ý÷~œ×½ÈD‹á´û?ã“ûF²é—ræiÓ¹â¯ÕLûÃü÷‡¹˜ô&ÁMáYgRÐþ\qÞ9œ{Ñuü£y:¿_º’?Ÿ§ÿë½-lÞÐŒ6îZ.Ô× ”œä³ùñ9áì|ì~–6ú²§“Müœ"¯ãÑEy‡VÁ2”+¯ÌfÓ“ÿa[éžÞ’Î% †!wÅB!„ýÝþ˜¾àѿѨ’§&«YªîÞ;Ný©{»çAjæœ(i á>ÁÞ™DLP©Vªù¹é*æ Ùðîü3î¦Ü_¨ J©’«3””1k‘úÂëTËd(㾿ӒÔÜÝJmø…Ê5éœÁ?̹ˆ£îÛ¥”ÿ‹E*+ˆ|â&¨_+W>Õ©Jß|X]7#OEiÁÍà[F? ö(»zíܘ#Ÿ'm¡ZåkUÏŸ§þè3eoø§šó|˘Õ×uÝ@“‚0Ux{©òWÿEMˆ|Ùd“M6Ùd“M¶S`+03¿ûû|4~ÖÈ{×må·C6ñä-õìn‡Èá œýÇt²"B¸O"G.ä’ŒfÞ|ú+:z› oÚF¹â³ã13n çìçªñî{XÕßÈËç„AJ)ÇóúÇ6Þü mØÙ "_þ¶ÕüyN>ñC.áñ²|nx§ŒšÏÏYIFýQ>üßxÔØÂ˜?n¥£ìQ&FT*TüëfžrÎã¾…y˜ù›¡—]BÚÆgx§Ê x(ã%v¦_̼"‹Ü !„Bô3MÀä#ýÖœÈK“˜8?‘ÝoLQU.¾Ðï£O£p é¯óÌ×:ö÷âöÁ¨¡šf@£‘Í;?lv#»›©pOY*”_f8†¥6>lÛßçñßç©ÇñÆÆ¿ó½o’÷Óì:þÚ]·…jÉÐñY˜—nÅ €†1ÂJ´5‚oÜ*t­á¡ß¬æš{~Éøu=~žÏœ90ç=N…çñƒþ䢋sÇ×›pI§B!„èÏ&›€âCjÌNäâ¿d1qì¾)m? 5²òÙF¾þ܉˺}‚=†ÌI¡áµgYÛ|ní;>d³šËéÂØûŸµtí<~O¤ÚzKkXÓ§¥ÃŽÏØ}7 î=Ëxkœ72—H­»Ž—ù›>åùU~ž¸þ—œñ·³¬µ·ÄzÙ»ä×üëÞ¸å,Úæî±³™›[Éß.ºÇËÜÝûF0jñR^¸äþvÛ=Òk„B!ú±buèO}v?ñÃà©‹uÏ5ðÅ¿[ØÛ NÈ>Áˆ·ˆ‹“ëxùÙuË,}U/së_ncÅMËù$á·üõÍõÔy¢È(È¡å¿ñÆÞÑ«¿mëàš¸ýÍ,µ%’¶’§ÿ½ýñûø›¹ï¦h–îð0xÞoøCq¯|ïözu&È”ÅÜïaôÎ¥|²amþX fÞÀ=£aã°u•9)Ÿ‚ŒhRD9Å#‘ÜEÍö2šÜ ¼{ù×Ï~ÇO¾º›w?µp÷ý/RRmbÜPë‘ÏÝñ%>¼…kØ÷¥Å&2fÌeH×—üìãõ”î_ÿ¤ÑðÊ:¼—ÎåœÌÙ^±ïçVr‡`DÏuRÞ6voÛK§_z–B!ÄI’‡[œ¯T|Q¸²íaÑPí£{³ª³žoQªú¯jbäá^9y˜_cÎV/w(Uö›a*|ÿÄÉjê ϨOwÛº_qéU-;ÞU·°|㘦Œ Õ#_Ô*¯RJyÕ×;O%zœË¶Imªõ^”Y½Rý¿EÃU´DžÌ¹êÒûÿ«JÊÛçPJÙ«¾R/ßužÊ Û·_˜*¸µT}ÓVu{¡ù ‡pãÇ_«þoùNÕÞ½‡§e—úâé…j¹çC¶Ñ¼Mþ®z£S)Uò•nJW >õ)µêj•a88aƒoV[”O}vUº2ìÈö0\ï¨YVy¸E6Ùd“M6Ùd“í$n^­ûý_ì ^ܳ”©ÿ˜Àà¾Âq2ÓbÄ kwñpËw‰Ÿömr§(„B!ú é’иÉ?äüØJ–<¿éä÷B!„BH€œ´xNûá,¬{_â_[œRkB!„B)tæTY¢#„B!„è•AŠ@!„B ð…B!„à !„B!$ÀB!„Bèb:bäoÀØù?eԘĄޚ·/gÝ’GØXÙ…?‡Ëÿ|7©‡ûã½÷ó÷{—`ó„3ìrN›} ƒ ²0ÞÖR*V>Ë'¯/Þs+‹îšOTÝÓ¼°ø1êÝ8vë¿yᶨww7j*>ôòÃAí¸‹§î›Î}²sï[L˂ڧÎᥕÍÇüôp_åÝæ•(„B!ú"À7å1á–'9-ð6д»T6ÉʼnÁØÇSKÕú\æ0b Æoêšœx«ªñªÀá­§?À•‹ÎÄài¢½ "“‹È•ɧ¯õ8gÚ"Îñ.ÿ~g7þÃ&J#<ï"„wÿoðrbߥ´Íâ9 yB!„âDø†¤©flcùíW²¾Éh#­hŽÀtºê\ÅŠGW–Dñ¯?dæ hþð^]V³?@׬gqÖ‚3±à§áíŸðê뫱ûc,Ö8/>0ö8oòÅ·2äËë(=ìÔ{4éS'F»6›É6Šáʼnlý¢1¤ïùì˼ !„Bj‡]ƒ¯œM8À@ NŸH¬9ðº|Ÿ½½{vZß¡#Š.%× ´¾Ä²·º\_;¶æ®ƒso3^ÓΘ3Žpí0‡‹(¦¸8 Z>äë÷VàÀ@ú”±Dh¡-“’w!„B!Nh€ß¶Œ^ø;².zœEO,å²ÿ”¢±A<•k"*;#ðMZõ_Ó¶o}XI¹ÃI˜CxσUý‹k:ˆ8ýWŒJ7ãhæÜ ®ŸÑPñ15n0 žMVth#ü“’w!„B!Nd€Nš?º¿ßøÞý *[HŸx ç-~¦?Ðõw/XQjÿŒµ1ù»Ì¾û9.»ëv2Ã{îÛJù+£Vå3~Îd":PÉ“&ŽŸÆ »p;˨¨L£’â"9 yB!„âÄø oëzJ߸‡ÿÜ2—ÞØŠ"ŽüK®$Ù¬çÐ^ìuMhIÅXM½ÿ…¯ñMV|TOXÞ™X{þœGáð8À@Ö>âÆ§ßåìÀ?kBa!/–¾Ï»B!„'.À×"°fgXFâï ¥¢:ð™ˆäï‘ÿ?ŽïQ<Ó&ç`êíï”ÚwÿFå!¯4¦N#7 º­%ì--¡rO;–¢³H0‡°DNVÞ…B!„ÃÎ-k±çpÞ=¿!ËÛ@sMn-‘¤™„îÍïÓè-zg,ú>Éæ0br—8ã>¾;Ú‰·ê_,}ésìMoóñÛs¹ì;yä]ý?ýn%6ñG‹ñ[?äó×sÙÙÉû“St±€Úþ0¯?ð>v†”\ùÇIŠŸÌ€õ Ž‘2ûO|oЧÇ}Ã×|öÔS4¸uÄ÷'1ïB!„Bœ˜ß_Ï®/¾"jô¦à³í¢¢äŸ|úê'8haédšxЗ=RF’“D˜±öwQûêÕü»ågL=ï<²R²‰”£–ÆÒUtö‹žÔð ugÝJ€OƸ|Ú·íÄÕ½ Ýß¶‘ÚHŠÉ%op_õðicÈIëqH¯‡µF}rró.„B!Äñ ¼R!„Bñ­ /kB!„B|!„B!„øB!„B ð…B!„à !„B!¾§-’¨â •+YêBˆoc‰ã’‘‹|O¢Ô©Á2I|k¢+Œ™ ):ï |~ö5øOVJ¢¦1äòkˆÚ÷ƒÚGX÷ö|ÇÜJSˆÎÌFÕ¯£ËyH®´h¢‡Ì$Ùµ•ªõå!èG9WGO†¼œû[]ôe} ©¯=Ž f’4j&ç{ÔV€kA_Ö…ôÓã¬Ó~KHþ¯øF,#ÿÀ° ‡ü¼†ê—ï ¶]¾í)¤2:›pƒ|ÜIPޝØýÊn ÆxϺ™´ã<ž!~y玧õõMt9Ý'4í¡:×ñGO†ºœû[]œŠéßžú:ý«/¯§â¸*þ7Ûè—¾×ö‡ØRiÁ4à'Žƒêwÿ6‡ O‡OJ?¤ü¸w<Èæ–4ü­œÔÒõwájíƒ·Üø2”rBƱþ|-Kˆok€ÊYé–è4Ü-{q8ùò\s.)“’6(³ Pn<-ŸSþγØ\Jß>Æ2çÞGJÃ}lX^øHÉ<–Â…¿Ä´êFJ75¾²×`%fØd ŸHT¤ åÜKÛ¦çÙ³a+^DzôÜGN$÷;‹ˆDü]e´¬ÿ•[+ðóýÁ½¤G÷GɆbG_EVÑX",('î¶2ZK§²²4+±“~JÖÀ\,Ñ4ûl›iZý4Uåû¿ò8dùêµu’{ù]$†þ›rñ3¤ì‚ÊïgòÍò˜~ モü¶Í4”X[‹Ç:ìJÒιÏË‹©ë^Rš|éà-§ê[¨OšCÁYñ-¿ŸÚOwt:×RS²§7†˜a HŸñ ÜKî¥ÁæÓ—æ`ÎuÜiÖÓû²õe]„(ïºÒ…õ´ÅäõѲúqªZ5" æ‘9s1aïÞΞê®î૘䢱°ýö”TáqûЭZ›ô׃fÁ’1‹û=v²¯1kñ¥dž¿˜°·ïdo­]ç¹ô¤Ùˆ9ÿzЦƒÚ©]QŠÃîB³$a´µt(¡ëú²ýè«/}“+½•s¨ú ¾4÷:þh±ÄŸyÚh^ý-í&,Yg“™䄚žk®ºèõ®§Ÿö¾ž¾"!ªS-2˜˜jßÿ;öד7ÄAÝÒûpºžS/¦¥úY:ýúÆŸS®ýˆS=À7aŠŠWU¥t:|À.:ƒÞGÏÝé$²†'b[q#{v¶:|}¤?F^ÑÌÛ?Àå͹ð5о»aÿ»Z 6ÿ&bÒÐêët^@t¤ÇoÇÝfƒ ÷HyŸ@fQ"®õw²{ݞpÜgÎüf#è*¥uïF|@G‹ëü…$¤ÇRßÞ=›’|éáÆÓ^ƒÏ܉‹×Vƒ£õ7kiÞ½>æÖHâæ/ 1ÝJƒ­Ug]q®ãL³¾vØ—ý«ïê"ty×QÎѓȚ€óëÛ(ßP…Ú«+Ñþ@Ƹ‰ÔÖ,Ç­ϱëcZªÇWÜöí´WmÁت+Pßûéã'P÷Ö'ºÎ¥+ÍÆ|2&ÃXÿO6¿ûáaË+tc]ßµŸàêKß9XÎ!j‡ºÓÜËøCô$Òs£p”,¦bc` m¯uWôËà.Ò:®úúr­w=ýô(û˜zï;!‹ïCU§A{Ãlªÿìõ[i÷n''?‡ð0NW0ãÏ©Ô~Ä)àÛ±­zŽÖYW3øÊqØË¿ yÇ'4UV÷Xî¡g=7ÔÈÐÂ0Nû+c§šŒtLpùCs.-¢ˆÔ‰sIÎ@¸EÃçp`0€Ûd qùèÌ;6ZöÖ5K¡œµ¸¼â|8ûÒl‰ŠB#pñîOiÖ×û²õ]]ôeÞ ±EDÐFsUÛN_=íÕmdä%Ü´·çfÞ[C[UéùÅ„›>Ñu.=iöD&Úö’¯ŽXV¡ëú®ýôe}…ªêMsoãÁ: m4ÕµÐ?æ7¿¥õÕ{ß Y¾ND*ݽ*åCí…ÄÇ0þœŠíGôëümËÙµd ‘¦˜?•Œ™³Èl|›²÷_ÆÖýú¥Þ÷Q(šÁpħ¾5MCÃFóG¢®õàÖ®|û¤Ò“žÞ{w*)3o'˺‰š•ÑÞÚ‘ÃÈ>w>a' |™8ÊÀ¦™Ðð£‚ÔÔÁÇ a¾N_ -hý3ÍzÛa_ö¯¾ª‹¾Î;ýámÓšâ4«@—Tê¸ÛXhÆÞS¯¾BÛµ\ ü€|S9ʰ}j}ÕO{ï;!yuÔiïqË¡ÇT~ÿ NÅö#;ôô›”ømØËߣòÃ;ÙðÊ‹8“¿CÎÔƒýÑöñwáq!6“áH n3¬D'qµVãè±9míÏlëIÏQoÒ±&j¸J_¤¶l ]ÍtÕí:öFWz<ø|@X,ÆCêïÜ…›8¢ÓŽóšÁäKùðûS†ã9©ß‰ŸpLfÉOóñžKÇq‚j‡zÊPÏ>ÇÛžCT>Aåýx˹½±Äd¥ȧ1•ØÌ8hÛŠëD¿ÅHLz´oÇ¥ó!=iVö2ºœY8–ð¾ëú ýôe}…ªêJ³ŽñÇß¾±Xs2BtQ>òµ ¨¾ü-«w=}'dmLOêˆ[š.©þ ëžþ--NuBÆŸ~Û~ı…>'|¦Ä’Š%Ò‚)Ú€9!‡‡ O[=^¿"ˆ{ñîRlMõx}fÌiù„áÇeß·°LÇ>ª[Ùn˜<—ãÔW7£" ëq3ªºJ¨Ú<›Âw2Äòõ{öàñ‡cŽMÂ[¾”¶NŸÎôèà­§£ b ¿KjóR::]h–¼ÀÓäA "=ÊŽ£¾†_@F‘6GfãšvÖàïXI]ÕNø%Ôë´v ϘN$Á½¥!¨|©.œÍ6(<ô‚Nlžh̆4•ÕÈù;Ëpxg?þ{$7á1Äc1—Ѹ£Zßq‚HóqŸKÏqtµÃ Êð¨û„¨=‡¨|T0y?Þôt®¢jëE޽‰AþÿÐÜj ¢`.±-4¾[äzn’/ k„…ö6–¼ï‘o§õÃÕ¸u6¥'Íž2j¿ÚHÂÔ«z~uÛ7ápxÐÌ ˜ ;õ²±®ÛOÖ— UÔ“fãÏþzuù†—i¨iD…9èúd${äk®¾üí¬w]}§Ç§ ÆÔyžæÚ°uéGA-ëÑU§:â–¾úkûý2À7^xÅ=¾è*óüß“Ùó‹®´0 Z,Ö‘?$5"ð¥rTÒ¾þQöîê^»¦g|¸J¥,ò²‹®%dà.ÔkÛAKûþ'PèXµ˜m—‘5ì"r ,€oû&ꪗ>çÒ3¢ÕÒ°ôQLS.!múd»ïŠ»*h³ñ _PéñàXÿµ‰?$í´_¤:±oý?ZÊjðû›iZ~ÆÓ¾Oú¤Ÿ‘¤ùð´ÖI‚Ê—›®¯ÿN}üÕ¤œñKRTG =»jðsN×*?]†iÒ9 œ9 ü6º¶=AóNAw0i>Ú¹B•f¥£U†GÙ‡µçPÕÁäýx˹‹Ž•÷RæüY#¯#ß ¾¶õÔ~ð,5A¼‘%¸ cÑÃHr¤eßIã§RYÑÄô¤Ù‡kÛ#l±ŸOæèidL;'0Cèm¡kÇ3Ým#DcÖ‡í§Oë+T}PGšu?v:VÞÃή«È,^Hþ#àÃkÛNKû±<ø}”kÒÓ—¿­õ®§ïìŸ',u‘& ²Ï :|9.‡ ®õZ§zâ–¾úiûÇ6ÁRÖÿ³•oEѼùx–ý”åò|»ÇÌBêœ?“í:ÂwP!N=æ<ÒgÝMfôÇl]òºúëžÉø#Ã$Eð¿ÂB䳉rWãt8ÑÂ3‰q ž ÔÔÙ¥x„Bˆ}1³u<©£Î'5¹ƒ–ÞÀ.ß.$Àýs´Š""ýt2eæQv\u_°ç—huÈíB!Ä~aiXŒÛ©zóÏ47tÈRqÊ‘%:B!„B|‹¤„B!„_!„B!þÿ-’¨â •+…,„B!úLÿyÈÖ”Btf6ª~]Çó5Æ¡:ÎqøÑD™I²k+UëËý0QÓrù5DíûAíQ^ƒÕ_òÞ_Ó#„Bñ? ßL.âg‘wîHŒ1õ‹ãôÊñ»_¹ƒ-¯=@]û©•÷o[]!„Bœ $òêïü]¸Z»À`Ç-ïáB!„½8ñ¯É4ç’2y!iƒò1›åÆÓò9åï<‹Í¥ÀTHîåw‘~˜Ø¶ü~6,ÛŒÐ"'’ûEÄÇF¢þ®2ZÖÿƒÊ­øºÓkzBeß7Ë%tâõEc2‚ß¶™†’§¨®hÞ_è½ækÿñ’H¹ør܇Y¢£7ï!Ë›•˜aW5|"Q‘&”s/m›žgφ­xƒ© L˜³g‘9z:q©)¾Á½Û†‡)[·YÔ#„BÑï|3ÑSaH~uŸ¿F[›Â±ÄøèØþ5.`Ÿ°Ø$Â’æPpÖplËï§¶Å€r5â´»‡2¦; ÕÕ†O³Ux9Þ¼‘½õnÇÑ“žøæOÙ[²§7†˜a HϬcï’{i°ùtæKG€¯· CÂBôÄß1d˜‡¦’Whn´cʸ€ã†áüüf¶omDéJsþÏ(š>j?¤nG)» Í’„Ѷšæ†NéB!„ÇÀt¢oŠŠWU¥t:|À.ÝÜxÚkð™;QxñÚjp´& õ5о»aÿ»Z 6ÿ&bÒÐêëPºŽ£'=!Ö±–æÝëñ­‘ÄÍ_@bº•[«Î|顳 CqG5‰¬á‰ØVÜÈž­ôÕWAúcäÁ¼ý\~é1å“1yÆú²ùÝC{s%„B!þ‰bǶê9Zg]Íà+Ça/ÿ‚æŸÐTY}ðò=eD©ç’œ=€p‹†ÏáÀ`·ÉtRÒs,”³—,QQh‚ãÐä«ïh±ÃˆÐÂ0Nû+c§Z¼é˜ è Öµ¨ÁD[À^ò•÷B!„§N€þ¶åìZ²†ÈSHÌŸJÆÌYd6¾MÙû/cÓûêDC*)3o'˺‰š•ÑÞÚ‘ÃÈ>w>a'#=Ç̇R i¡ÏWŸøe5‰2 IDATš††æþD]«çà_g«Àì¿RÒ …B!N¥?UÛ°—¿‡½ü}ªãÏgÈ%—‘3d[Ö×X‚âwâ'“ù0oî4¥cMÔpmx‘Ú²ÊÀߨ"p{ùf |´ã“ž>)ý ò¥|øý€) ƒÆá?qГ÷ã¾aÛŒƒ‰D'qí®8úƒ°GI²—Ñå„ı„ïZÞË,¾‘°ŒsHÍÒ°mú›Ã'=W!„∑ÜsâAôØï“šdA3š1E¦•9ž„¬t¤t+(#ÆÈd"’†bMt”/LùdÏþ9©Y#ˆ5o¤ao 2ï/„Bq2|-KÆi¤ ›EjñÙ$9ƒøD?[ž¥¢t÷Á¥¯‘®Žh¢EÊÐ3HÌŒÉQJkU=~Õ‰½ª-i")#. µh:Iù…í•ØÊ?§­Å®ï8Á¤#áyW™‹!ÖŠ½tŽ`ÞC¯+À"_øð4ÕbLDJñts s”ÒRU`ýhyU¾ðà®^‰ÍOLÞÙ¤=“Äü DÇ€sO ¿¾º@ákúŠ–&á“H.>›¤ÁSHȈɵƒÖªºiV>´ø Ä'8h[ÿ.mmNé¹B!„G CA&CÈœGú¬»ÉŒþ˜­KþA—Wò%„B!ú7ù&Û#0XÇ“:ê|R“;hùè ì^É—B!„ÿÔ–†Å¸ª7ÿLsCÇ·çcŽok¾„B! Kt„B!„øV1H!„B!¾B!„B|!„B!„øB!„B ð…B!„_!„B!¾B!„B|!„B!„øB!„B ð…B!„_!„B!¾B!„B|!„B!„øB!„B ð…B!„_!„B!¾B!„B|!„B!„øB!„BH€/„B!„_qÆ4Ç/$#+MJC!„'˜IŠ 7f’ç¾Æ‚ó3ðm¹§ú»’R9•hQÓrù5DíûAí#¬{{ ¾> ð3I5“ó=j«Nõ#…èÌlTý:ºœ~i\B!Ä©àkÖ³™ýÛÉ·îû‰ƒŽŠUl{ÿ¯¬Z]ŽGᣙùÐ3G}óïÝ%×òä_á1d1æÞ·˜–µOÃK+›9lllÈÐKngòÔ ÄYÀÓø5¥oÞÏg_”áîùQS¹ð¡¿jÇ]ìOVb¬ŠŽÊRš[Ä œÎø¿À“R¾±ÌÀQñ{KKº·•ì.oÕP’)¼ö9f͘@œ¥ƒŽæÂ’Ç2rÑ?¹`rjj„ç]Ä€ðîÿ žCNlä›âIèî•t‘DòÈ+˜yϳœ6(êØï€²fS˜¸Kظ­­ïkÈCt̾ºØBCM aIÃ)˜ýW^w>1²Èªwþ.\­{q´TãöJq!„âÛ­—%:[Yõð6µE“óýW¹äŒDMOĪw°ïß§…ÿú9Ëv9-~͸„)cc@maÅWóu-$Ì|–…ó‹È3ÄÕ¡Ñ MúÔI„QÇ®Ífò†bxq"[¿h<äf¢”Ïÿ°€M™ÿäßÌÏIJùw/Òôš É§Ï ð–¾JU×Éœ-ßʪ‡¯bS+X†ÞÎU·\BôˆËÉ{-ßâ¥á¤Ž»€øÌ|"bb1ìt–ÜÃö5º7X‰vYÃ'iB9÷Ò¶éyölØŠ7˜*3$7z!™ÅcˆWx[×Ò°ú9j÷øäI‹œHîw‰ø»ÊhYÿ*·VàÛ·SXI¯&£°³Á‡§¥ô|woé1æ9÷>RîcÃòRüæ±.ü%¦U7Rº©!°Ÿž2ìu¤($÷ò»Hì¾ÁN¹øRöÝ?•ßφe›Kžt”¡®ôèJ³ sö,2GO'.5#€§Û†‡)[·Y@$„Bü£òáóv_. †>(h 2ÿtâö¾ÎŽú@Ôºæuç‘’4™ŒØÇhlöCD1ÅÅQÐò*_¿Mư9¤OKÄÊ÷¿lÆSɶז0iô"b^@Žu ›Zƒ¼ä‡¡x\à â“µ8ûÅj?Ϊ5ظ„hbˆŽ0KèxÊÐ"‹I. Û_`OI·-ÜŠ¡µ©;ȳ=þn ‡yh*ù+UvL0`ü­ä»nfûÖFŸ&Ea=m1ùC}´¬~œªVÈ‚ydÎ\LØ»·³§º å*§yÍ“4uµáÓ¬D^AΔ_áo¾‘½õnÐb‰?ó.´Ñ¼ú1ZÚMX²Î&3!ØœëKOhÊPo9UoÜB}Ò ÎŽmùýÔ¶xºË¤±ûy}iÖ“žÞ÷1bοž¢éã öCjW”â°»Ð,Im-Ü !„ÿÈ ÷“ÿǰ˜ÒÓb'åËWã8(*H`į¿dÄþÿ¯åíë±£Kßé-Éñ ÁÞ„»ûª¬ `Z‹#6ÚÍn̹20\>£¡ÂB{yƒg“ý;:¦øš·Ð® VK$Áj‚Öàá°1Ø 8W²igDZ•pÔlæ=1;Tá.†ˆL²Ï¾"°ŽÜWC“ÍÓƒsSc÷"åGyøé&Éc×Ç´TóS"-jYñ­¸‘=;»—†ÕWAúcäÁ¼ý\:¢=-z™Cp~}åªP@{u%ZÂÈ7‘ÚšåçA| ´ïnØÿw]-›1i hõu=‰ôÜ(%‹©ØX8N­ƒ¸¢_õD»®ô„¨ õþ½§½Ÿ¹…¯­Ç!ýIwêNÏQö1å“1yÆú²ùÝuÕ±B!~÷¯ãíþ·—šðö—õߘsT|E£½û§®-tËëIÔÑ"¿’'M&?Uváv†SQ yF3$7š|k>k>®Œ"íŒéDî¯Rs̯Îi£aëvœ ´¨!dˆ=Æã1ãÏk˜±ÿÿ~ß}ŒòÎþúm8ѧ?Báà}Ï?tÒôÖ/¨¨s…ö&"vZÆieì´C~iOÇd@Wðgˆ-"‚6š«´_=íÕmdä%Ü´·´ˆ"R'Î%9{á ŸÃÁnS +¬C°ÐFS] ÇS3ºÒÓÏ‚Z½e’zL´ì%_Ip/„Bà—òáM?¦yÖ˜N*icF±¬,ðýŽg ¾gSŽ™Œ¹;Ó"R°h­´wzÁ\@áð8²~ô7þè@àŸ5¡€°_s¸g'MI#ˆ×hnòéʈa  t²ûÓsXÚõ?zÈ[töÇè^ ™,º'º5SD`-q÷ï:TÍv:í6:ë6S±ê¶”ַƼO¹±¯ˆí;Í%]Ê»%ôK‰4MCÃFóG¢®õàèQù:ƒ|¨¶—Åg†TRfÞN–u5+¢½µ "‡‘}î|ÂzÜxÖóÞòxr×Û]1JÒes':Í¡¢ýCÉ[¤„Bˆo„,½_G»¨}ëOìt€¡ðgœ>,”_ÖãÇQ¶ À€‹œbÌÄ»˜d€Æ/©i÷cLFn\ P¯Ûx[Oåžv,Eg‘`>̡à 1o1€Úù•¶à¦ùÂó¿Ç H k›vužÂ÷uTâˆ+&%ÚˆÈA4@G%ßÁ7[+¼œ~-o<ý6léÏÁ} óµí £z3¶êÍØjvàt‡>Áþ¶Í8°lÄÕZ£Çæ´µüi“òá÷¦( ‡4b{)b‰Éêñ–(c*±™qж—0¥cMÔp•¾HmÙºš+èªÛuÐM„¿} b±æd×·ÈéJ¿ ±™˜úêmJ~'~Â1™ Ç–æPµ.{]Nˆ,K¸¼IJ!„8ˆ®eÁÊö)Ÿ½±•Áó‡2äÒ¹””þæý¿M`ð•!ÎîïqñýšÏžzІô”Ùâ{S<ßܧz _nºŒ™Ã‡1í2¦YÚØÙýúË4{MX‹Î PÛæõÕRpåo$)~2L4ìŸb/bÊ­¯szr6À»ÏŸ› â{ÍJÆ™S0Žõ¯Sï<1…ï­~‡íÍó“8Šú€ñÍ`MIÂØJÞ¡É DI#=úýg U›gS8âN†X^£~Ï<þp̱IxË—ÒÖs½˜êÂÙlƒÂóH/èÄæ‰ÆlØISY þÎUTm½ˆÂ±71Èÿš[ DÌ%#¶…ÆwKkǽõt´AláwIm^JG§ Í’‡¹G/RûŽ3ê6ò /ÓPÓˆ BÁ-SzÒC;¶²Ý0y.Ç9¨¯nFE}® âûÎ2ÞÙÄÿIÆMx ñXÌe4î¨ÖW†¡â)£ö«$L½š¡ççP·}‡Íœ€Ù°#P§Ò=„BH€ÔP”¶/þ»æ_ìîC2…×>Ǭ±1@Í“<–‘‹þ‰Õÿ]ÞXÙŽÏH»òõ0ü(àÆíéq‡ž¶ˆsg¼Ë¿ßÙ’™(SÖl w ·µéÿCO-UëKp™Ãˆ)C¼ ü ¨jrâ­ªÆÛsÜ9bšu–³]pÅh£eÍ4Ë¡¿ Wk츽DZGoh¸w<Èæ–4ü­Ç1 ªã„(0Ó,x+_§|M~s £ç‘93 Ç‹ÓæT€sá/(œ˜Kׯ§(«ƒèW‘uþÏñýç4vÈxØ×mì¸ÇÌn¿Óʇ×+¾\w¾%¾!i*…™ÛX~û•¬oòîÂ#­hŽPv<7-ÝÅ«†tF-~—³r éýÛøïÇõûgQ´ø}û—òù°©3“âŸü›™£ó™¸àB6ÿîE:Ó/aÊØP[XqçÕ|] 3Ÿeáü"rçÌ#qõø\@á÷ö•Bù\¸< Âü*ùâ[òåu”wß¶|ú ¢oé«Tué? ê\ÅŠGW–Dñ¯?dæ hþð^]V³?ˆïY‰‡O³¾rr±£¯"«h, ”w[­%SYÙØ'¼€ÔqŸ™ODL,F€Î’{ؾ±h‘ÉýÎ"âc#ÑW-ëÿAåÖ |ê@w0gÏ"sôtâRS0x±mx˜²u{åm°3ì ²†O$*Ò„rî¥mÓóìÙ°5p³e*$÷ò»H ï® Ÿ!¹ûèÎÕ¿bˆ:”1‡Ì¹÷‘Òp–—ŽkKáÂ_bZu#¥›BW'S(¼â'„o¹‹Í_–w·™Hbg<Æàä(]òv½±Œ9—”É I”Ù(7ž–Ï)çYl®)N¿†áW߀É~ÛfJž¢º¢9'=y?¤ S.~†”}×–òûÙ°l³þ2,‹¤‰W“QX€ÙàÃÓRƒ8h3$7z!™ÅcˆWx[×Ò°ú9j÷6£°`ñ7 ¢žcßàéY1á(¼òZ¼ï_Ï®3±“~JÖÀ\,Ñ6æ³m¦iõÓT•7†°éLOµ³×6¯ë£vuá×sͪ¯|ôôwGîÝϳg÷¾ÿo¢Ó=”„󲉊2Òæô‚1›”ÑCQ•±kõ*< Ú‘òw¿¤Ý­ðÙÛûGª=•l{m “F/"vàäX_¡"ÿtâö¾ÎŽî»ÿÖ5¯Ó8¿ˆ”¤ÉdÄ>I¥Ãøñù D™ËðÁ5Ÿ.ÅçWßí?à{›ñš&pÆœqìzí8Ó>„âqI€ƒŠOÖâÍJTáäLùþæÙ[ïÌèå_OÑôqPû!µ+JqØ]h–$Œ¶–îÁÇBôø»)æ¡©ä¯T5Ú1e\À€ñ·’ﺙí[QÞrªÞ¸…ú¤9œ5Ûòû©mé¾±´7õýÍ”s+Í00{æ’rœ~À”NlŠ_Í:\ºP3Ño&gPuŸÿ‘¶6;„'b‰ñnŒ{ê\KMÉjœÞb†- }Æ/p/¹—›Î“± A¹õ÷Z,ñgÞÅÀ6šW?FK» KÖÙd&ôÜ) ëi‹Éê£eõãTµjDÌ#sæbÂÞ½=Õn¼¶HHÂdV£Œxl­¨ðDLtÐéð‚fÅ’QL„)¬Ç­Åcv%içÜ€çåÅÔµ‡jªË§/=:Ú¼r¬f×vb4Ä“pÎm¤k]è9ŽfÑQ>úú{3cŠH1Íö1í¶@ÙhùX£ÁþÕNŒEw2l¼™Ú7£µb3ó0i{p«Põ ㆮñ§·¶Ú¥¯œuõ‹ úûÑ&¨Ž«3fêízê¢GúÛVP³ÖÇáV õ~Ý î\G-Ç^¯_zƒî~”æ]›Dp~Û2>zas¯<ƒ¬‹gÑ…MÔ®~ ïÿ‹míÏlDÍfÞ³û<á¾æ-´+ˆÕI°Z¨KLó+{nÿ¾Á¥!LkqÄF)·»/>’È›{SA]ÇZVûü€3àï›j¨ú+š®æìÓŨU¯WZÃ^Ä`+à\ɦ'®PB˜æPÐLŒÝïSQ~”ÇA0Kµ¨ d%âZ'»×uϨ™ÃqŸ9ó0 ×c×Ç´T;Ð`hßݰÿ¿]-›1i hõu(S>“Ça¬ÿ'›ßý—ÿpé™DÖðDl+ndÏÎÖÀ@W_é‘W4óöpùÝxÚkð™;QxñÚjp´žÄ›U;¶»àôÉÄżM]»-ºk¤‡Îò½A,¥0aŠŠWU¥t:|À.:·kÇZšw¯Çt´F7‰éVl­º?Ù EjÑ“HÏÂQ²˜ŠYÀöZqE¿Üß~´èIdMÀùõm”o¨ ìS]‰–ð2ÆM¤¶æc<­m0$“A#là/>-‚Ê—î¢1" -8=J±«”Ö½yo1c¿„ôXêÛ›CtsçÕŸžÞڼߎ»ÍïqÔ…®ãô^>Õßõ}z5䊟­¾]Ô¼ý*ž}÷ɘpÒéð`LJÁFx˜{—’’1Àí M¿Ð5ntŒ?½¶ÕåfàVÎ:úEPýýhBÕÆBÔ/´¨ÓuŒá=oPJiØzô±êH×}× ½O/}9¨²ê'iÙµIàƒ“ænàïkGRpÆÅOMöÄkHŸx ùO]ÆÛ+ëzìÛFÃÖí8hQCÈÛGÑãGujÜJñßÓa|¨èq 凔ӯaqøøû¦VÊ_ùµcoeüœÉûã§Q¤1À½ñUjNä«sB–æP'úôG(¼ïŽ©“¦·~AEKÇ#-{kû9-¢ˆÔ‰sIÎ@¸EÃçp`0€ÛdêØm{ÉWGÀ´ØaDha§ý•±Óù¥=“ýƒ_ßÝ ãÙ³ŒŽ)?"q@2õK‹Å¿“šú® ŽcǶê9Zg]Íà+Ça/ÿ‚æŸÐTY}Ôˆ•³—,QQh´öé'ë,´ÑT×rÄób‹ˆ æªË¢|õ´W·‘‘?”pÓrº:jð†en¶6x`"!3Žw&gÕg4÷å=2*"”wløt¦§·6²Z>¡ìïËØZÊ_]ŒÙ:¸â¹d̾Þø-5M®ƒ‚®Õ·³q³O§—˜áÁž¤÷~¡gÜpëô´ÕÃÝ”ZÎzúűö÷“Øštõ -¥ïÆðP^/úª/÷mšCumAøãm]Oéë)}ëÏd\øó.Jþ%W’¼æAš÷ß–}ÆÇòý§7°„ÂdÁ`80«kìñ»cNxÒâ5€šÛ8›Ú€t´ÈdÌÝP‹HÁ¢´ÒÞéÁ×Õ†<›4µ–/:9}þl2÷îÖo|$äk|“}ŸùçœÙsi~³HÃ>*èd÷§qà IšCÂ}ýClßi¼5A¹q·7+£i&4üÝÏHO¤—JÊÌÛɲn¢fåC´·vAä0²ÏߣŒT =*u”ôhhØhþèOÔòÚ6åë â#…R  }ò¶åXOC¥›¼!“±lY†%oªá:‚\+æo[ή%kˆ0…Äü©dÌœEfãÛ”½ÿ2¶#¾ÆÒÈ«v2òî´žsGªÙ£—_GnUDDÂH"+©Ûh$¹` ‘µ ÐùY ¨Ò_Ï'âŽFWztµùÃÍWŒü¨Ðß4|\-»pµì¢£ºãü;I>ˆº·¢œx±`Ž;îN@‹ÃeWãá×\c¿Ð7nô>þèi«zÊYo¿8¶þª¶qbúEèÆp=ׯ+˜¾|Š¥9T×&q„j8­ÖìlÂ÷ýÖßAKEuàý9É„ëc|•Yä¸bR¢ €ˆœDtTâ8ÖÏ` 1o1€Úù•6/޲UØ\Äà3`&~ÜŇu¿¤¦Ýßш‹HÒ§£¶.aÛêÿ°×WÄfp¶â>tÌúÿìw|•Õýøß³0ök IDATÏsoîLîÍÞ „ÂÞ(¨ R\8¡Nĺ¾µÚZµ¶ZÛÚi[«µŽþjëúZÛ¯«E¬¸©¡Ù Ùã&wäîñüþ¸ Dxn¸ ày¿^÷õb<ãs>ãœÏ9ÏЇö·þÍGôú’ËeÜRQ× j¹#—9n#*öj\­;p¶îÀÙV/cBÙ_G€d³pÛ=m–4 å‹´×îÄmkÄÝQ·_e¥xjqûÀT6mŸß¡ÁÛ ‰ü}­x‡ü|N‡úQLj› dkÚÃ¥„‰D­Yæ5Š Ç¶µ­g’‘7´,èß½àpêЈOÃÛ4¿wÛþõ"¾Œ (“¥Þ>±”=â#‚­nxÇfE;ñbÅR˜û¥oE•x±’”Ÿ¹¯ š,¬yÉ`ß…?НOÀŠeìy˜úVÑU¹oÊB2‹R vûMUò¨ðù} ‡+éHl¡â9Ç"Þ¿´³ƒ#MŠ·g?˜JÆ |™¡Œ”4´Öó¦)‡ˆ 5õ†ªúG…¯Æ+.âïqòxÅEÜêpU¿8½+¦X>†2ªÝQ+s<Û&º|Éz6çüü—䇺°µuÒH‘GØñÝ*bC­oRe»œ©i“Yðà»Ì°%3pn|“ž˜§Õ–3çG+˜›Q€QBÛXûÂJœ õe>©¸’…Æ3ï·ï1Õ&aIK<Ô¯x[èoص~>Ø„§_aûN/£¦ÁÝqÐOOJß{¬ýð6®<+cÝa ¹gÌAx·® Ó7ŒG$Îæô®#C—@RaôßÒ<À¥S|„ZþÁª—Öˆ§ÌÇŠk=-—P4óF(+èsiÐçÎÇÄä:¡N\v°–]J–m®~?’¡8º3ÄÞö§–öÍÛI=ízÆžWHGU^oI—ŠN®¦§¶ˆ{#-;Q6ñ>Æ^£³©‰`DΚN¨aö~•=Vų¶NYBÑt/­6c èRÜølN(;‡œÒ~œÁDtrMTž®‰t½Cgß™äÏ»ØM}K¬ æ$N»š”@%ΞNBaºìˆà÷Äð]*†²Gúkñ†‘2ã2Ò5å ºZº«[U5ŽJÿZv]DÙä{(‘_¡«­E?f¿wí½fÚ]ŒŠ¼Š­OÆXº„\k/ÝomŒ.´ wârhI‘‰ý½múeºº—1*OÂùi×0’ MÖå”w>ºöÿeת÷c› F5>?dPÀÛiƒ ç“[îÄî5£ÓTÓS3ÄÔØBÅsŽI¼ËÉX'ž…¡¿¯×‡¤Ë"±ìRÒ vzv²n¦{ë.²æÞDñt8qVvÑ´«%›>.5õ†šúG¯Jñ‰‹¸Å{œ|#nq¯:\M‘ãõ®XbùXÊ|¨v'™¼mÄ–àG:©[·󔩤E7E ;ëhÜø<-ÿ¯¢ò\ÿÖ>t/\{+Ææ“œ Š·‰ÆŸ`Íò¨î€†úèëò’•iÄ”U€ân¦­b%›_{žº®Ê&ÒIå_®Cþæ™uêT,iêÙÂÎÿü–?éŒw Ò‚›¨¨r€­®#0õltîv~ž†—ÎwŸ¥ãÌÅ~ ƒi '˜;uW2¬¥– 9äOžµßAWræ$ 3Äÿ¢•ÖøÌÇ=k@sêuäÌþ.éR˜`_ÇÀ”ŸXžÓNתGÑÎYLöüûÈ× Œ(¹±;{]aü»ÿÄNÏyäM™Gî¼³££[¡^ÜÕÏÒ[×FDñàÚp?»]W’?þ"F–€!G­«Aõ² 0þÊG©5ÝHAùÍ”LŠÊrVÓë8°ñ àþìi:S®'óô;ÈT\xvýe@ž®‰´Ó³y9ߘ uoáðÆ8D"% KV,“n"˘00 ÚŒcë£ì©ëÁ1”Ý¿æV£}6E Ï…ˆ÷î'±Õ´ª\¬íÁµþçÔ¸¯%oÜ2J&jˆî¶QE¯cÐîn\ëA­ï[äOú%:Û·Òþîs´µº3"¼íÝ`ÝIg«  ÇöÍ„óFàìõ ñe²&cÒJPp:‰ú5øc±‡yTùü¾ÑUïÖ§hO»‰ìSo']éúOíÿQe‹C<çXÆ;:ËÈ¿ƒQ ø ôl§ý½i´)aü»¥*á[Œ˜ò?”L†pß&ZÞz–žXöÀWjê 5õ _%Nq·xÁÇŽ8;U§ñªÃUê9ïŠ)–¥Ì‡hwb‘ùHÛ&Á¡ÃBüŽÆORŒÓW¾÷ÜçÊþDÉÕ Äã'YÎUÆÝô¼R:2Qè#VÝ%_¨Œ»á%?]'ôñUÿtÅJÎEÏ+Ó¯¾N1k…>D¼‹Ÿø‰¶I´MñýiEÿæ(!¥P0o&ZÀýÙèò •ÄŽÓ˜³0Zñy}Hú<’'.ÆÜF[‡G¨GÕ`f6æd#èKÈ<õ2£Ózù ‘-3Èš|Y.zß8 RÄ»@ Ú&Ñ6Å‘à­ü>i&Çê€njÖV#ÚðádBfŒ9sÉU]©xðw¬£éÍ—èóF„~Ô¨0õ|ŠÍG§¸ðÔ>OÕº-bÓWMB6M-ÿù#¶.Â"ÞÑ6‰¶)îy(ˆöE @ 8i:QB@ Hð@ HðàC2a.¿ŠÂI#E…) 4Ù¤ÍXFn¾õ˜œö-ˆÿ„BGÆ’7¹ó¹Ï¹ý 1‰ZâÄË«Ìó{Ó?˜>ø»`:šCr4y×1á†g)Ÿ^t„A¦!¡`1%‹ÿ´›þÁôŸbâ%·“•’pü_›Iâˆi˜ ò1Ðϱ0g"‰cÏ#³ íØ%‡Õ¡à„ãd‹‹£šàç‘>y))úã¼~>†òˆ:Ak•sPwKšÇ9?þ%eÙIQg öÐ]ù.[^{’ʦ~@?å¯|ç{3‘ºŸá…?Aw4¹7síon!%²·ÝB½ö®xì·äú?`Å]wRïãôǸéÖ¹hvÝÅ_\ƒßr6þú' ¾=‚¿g'MŸüuo¾OŸ˜k€Š)Ÿ hþ`•QU./È–™L»âV&OH’õb«ZÃç/ÿ‰íÍn$ËY,úÕC”XŸìÅÕ¸Ýï<ΆM û¯—ô$O¿ƒ ¿}9é¶}ïýº£x7Sÿ¯zdM igÞ}Ú%¡I,@/눤$YRhœÉÈcî|Æ Zs"A_ø¸-½œr.ÅߘAߊ ܾÀÑÕÏÉ:òrX N>›Š¸8áêçc(¨qIðѦ:Ü{»›‰$1éjNšEò¯®c]½ºSó4æ\ úÙLm¡~›–Âù³¢/MÌF/ƒ_“Db€‚«¹¯&‹ôÜ ”.ú#Gü„ÿ}ôM\ÃØ!M›¿ˆ²T °‘í»íqÖZ13øWNÍB]ôÔw11nI o!É2X®]KH+šÏŒoÏ&M¾˜×?éB!ó¨s˜vÉ­LŸ%¼ñ@"nü}n=N¨O„@õCìèÍ&Ò×xDg#ʉ%4Nz?}[çÉR©ÇO?ÁITቸøZêYØ]p,ü½T²ö·K©èÏcÜ-ÿÇÂ)%ÌZz!;~ý"jH–ÌÙèpÈ@áé“16%2©4p4æl pî½z¹–Š>0Œ½—k¸˜Ä‰W12ùm¶÷ÆšáȘ»€D T¹œw|w•ÓO£,`7k­=áh/ÜdAò˜„íbÃ#K©°'RxÝrŸžÆ¨ù30nxù4üè—ŒÒ G<2ƒ¤‘‡Så—$É<1W݈yðÚÿÄç+?ݿҖ,XgßJ~ÑH ‰&$ ìÜAϦghièŽÊ¬-cäU?%mà uÆ…Ï’1p»oÓع­#zš²ëKÉš~>)y%“¬hdýNÕö6¤´‹)Yp–$‘þjìm>Ì£&¢ÕÓõÑ#47õ¡’i#/¸kT戻–Þ­ÿKó®FÂÊeμøY2›°†ß±mõ"jô£¦\jt¨vüìpå$ýRÊ®¼SbŠ»†žÏž¥¹ª™ˆZ™5…ä-y€Ì®ض¦2zŸneËî@»áN*+ºPTè0¯¸,Xg—‚âb F&Øó)]›^ £Õ>$v,$¿šü ³0›´(¾=Ø+^ iÛ.BJ|mZtç’7e>ÉY™Ñ)yÁnœÛ¡öó=QÅÃ7ÔÊ|¸²«‘ùxŒ‹8ÔuªbG­< ù¤ÏºžÜ²Rtr˜`o2FJs([(jõ|˜:SQcwñŽyÔÖ q²©àk“àlf÷k/3{Ê X‹Î§Ðò2ÕjÚ}*:ütn¬'kúe”β'ídg} ãó3ÑÉïÍúZ>ÅÉbI"Ѩ=Ìõc7=ðÒøÁ|qömÅ׃W¤"Jç΢á­OpÂÇ!î  ¤²ý ×ÿ ëÿýºÜï±Û÷m®½í±ˆ/fÌXN½Ÿ’±az7ý™–> Séåä-¼Ÿ„·î¥©Õ ˜H:å~F—KØ?}’–.˜§PxÆB,ÉF¤f :gÝMá¨:Öþ»Ýú4 Iaü1œ¾¡x7Q÷j 9…Ô³ï!ç ­¢Cî8Œ‘U4¾»•€”‚eü5dŸý}‚¯ÜO‡#¡Z^ÿ!é—Pzæœk~G{oPˆxz5eÉ4ŽŒòiPõOš6¶ „‘ôä¾èsdS1II½´¿ó4ž¢Û(ã¥cÕøFÝFÑiÓÛúý!Pü Ø>ý+=n;aÉ‚¹ìj çü€ˆíNöt!3(þîh#¤F?jÊ¥F‡jmv¸ríµ›÷ާis„1ŒZLþé?Eë¿›ºF‡j[5:ŒW\H ¹c1Þ¦þƒ­„4XÆ}“¼óî'aå}ìi÷güŒ²ñAz6>NK·mîùŒ˜ñ#JüwSµ«%n¶Ð +¹òùÓ¡ý=Ú?¬Äëñ#ÒÑ8{:Rqò U2«(»™»¸ˆO]§*vTÙÂJÊ?¥¨È‰mÓô:´òÏ"/5Ö¶@…-Téùðu¦:_S{¡ªNˆŸM_·ÛvâPÀ*¥‘jQw›l´¢ü5oÓuêÌ¿¨ù=­žï3ÞŽá ‘yœuut¾u¸g0æB%]Äh à[OE+îJSì«yÿŸ XrÍéä_ôgn¸°‡öM+ØöÎ?ØÝè8 ¸K™~ËߟTJNvà£aͦh/]«¦ ÐO:ù‚PÒ‘5]%‚ô‰s1¥ÄÙäMÅ÷Ù=4lkA­ÍH©¿%wú,ÚÛÖ4Í$¯< ÿÖû¨ÿ¼i`$EOàŒ…C@‹Öl ®–Jú½a ŽþXŠxØ= û .¯qWÒ·g;aÀÕ«ÃrÅ2Rs¬t:l(:ÚëúQr¶áí Ä\öÀ^}ðÖý—ÞÖ/ûöæÂÓUSi 2& Oç.¡* K Ñ'Hô‡wá¨ïÚ'~/XKî");©³C•Ìjô£ª\ªt¨¶r;\¹è~“–ŠÑµ–&HÿùSf¢ÛóAS 2:ŒS\ì}ª§ GËN€³µå²_“3c&o|@Ð4›ü i8?¼“¦šè—:[ ç ŠË§¢«z¼l¡-!÷”éh:ŸgÇ[ïáß8Ä5˜U”]>¼Ìwq§º.–Ø9”žg“3ÒŒwãý4nÞãh÷’\~‡úE¥ÿÄT?ªÎT󮸵jê„8ÚTðõKð‘ö-ýP×pÊhÍF$dpn¦ªr  }Ýf¼S$Lõò‡•³àŸ²`ÈH~÷[OÐÐkFh&ûôùÀöå´yŽFâìÃöþ÷yzË$JO¿˜q§-¢`ÖäÌZLÉSW²rýŠ -)£§ vÅi{q)+?éää?x]OâÜ?Q6zðãc?=oÜNc‡?®o‘­å±ckéÚ§óp'ŽV;¹%cÑkײŽÇˆ“Þ=í‡Ð»熿ÓwîõŒ¾f:ž†uت? §¹uÿiG Å׎?&³1®eÄÚ?VXæ¥(a”!ß”$c9Y³–Q0½A"ìõ"ËÐj¹MáøèpØåŠØpµÛatzÍ{„ÕÈ| ƒ~¸:$Ô†½ÅNNÉ8ôÚ¢±#% ™÷8Óæ29hešÜ Ç’y4‰ðlÜü¥ ÓÑô¯‘T”= Bæã/.âW× 'v”G¶ŒÁ€žŽ^ޤª•Ž¡-Žå»ÔñÕ¶_‚<ÁצO$EèÂæAr(:/Wk@–÷Øj"!d´&= AŽ´SýòïI¢õó¦k#†ä{î¶*ú=Nú;vиá_ì¬l2ÏQ%ÆñL˜lú©ÿh;1§“‘Õk_7'Ô·•Ê×·RùÆɽðI.¿h,%‹¯!ãÓ‡Ø7¦QÉ{w}Û¹¯rÅÙYdOŒqu-'ÿW³ž­SU£‹¦‹J€@ïÑZ$*¦oªE"‚r˜Š8b_CÝËŸb1‡´’ÓÈ]x.yÝ+©}眾kñ˜í«0¼Ö-Þ{@DP")«œEæÂ{É·Tжþa}n0§àW0¬ ;•£Q®aèðHË¥(1Ȭ ( NÑ;êÁ[t$IB‰íýéèÛ¿·¨„û£‹ßåxù³½EQ¾"ߨÿUeW-óñq©ë†;ʤ¡cˆÃVžj[(Çâ]1Ä{Ü'®í—à¤@Ý”o})/¿œ$@©yƒfg„°«/@ò82e@ÆX8‘DW3Þ°ŒÖ¨®¦çKl|ã_´8ÃȲ0臺}%뺊þæf^æ1¶íFrèK.c” pHE]ì¨_.@2b)(@?¨½ˆ‹ÞÆÖèþ9Æ ôF³â¦ý©ñ‚\ö]æŽÿ:Þ¡¶Wãjݳuζj|aÖbJ˜HК‘P\ÄQ‰+Iù™ûtªÉš— ö]øCé¯#@2‰Ù*¶D‹8ñ4¼Mó{÷±í_/â˸€Â1YðWpH°¢9JÆVSö˜ý¿õ1>æWô¸pE›ƒ%MÂ_ù"íµ;qÛqwÔ|w£ˆz´:yXú9åúò‘‹Ê5MvTž¾QS#sÄMв5íáj^U:< ¾!§‘”“ Ž*üaˆØwàÅBb†_+Þ!?ŸÓ×/‘Ч·LeÓöÕ­|u¾¡¦ìjd>nãâHëºáÆÎlº/V,…¹G´-&[aý¬ê]±Ä»yÔøOÜÚ/ÁÉÀaFðË™ó£ÌÍ(À(¡m¬}a%ÎÐú&U¶Ë™š6™¾Ë X2Ó‘çÆ7é H¤ €„,Éû@H² $ ó’RÉBîsÐÞ­+èôÅþˆÐaËRòÙœóó_’êÂÖÖA@J#}D @`Ç;tÓ‚ó#>~}£¯˘o.acåÓØB:RÏú)ó¦f ±LŒVn‹Xpçxü®M|ô̳Ñg}ÝQÜølN(;‡œÒ~œÁDtr =µmDú7вë"ʦÝŨȫØúdŒ¥KȵöÒýÖÆèt×z:Z.¡hæŒPVÐçҠω¡Ë·$N»š”@%ΞNBaºìˆà÷ cZ‘âÁÛiƒ ç“[îÄî5£ÓTÓSÓ·¤HQSöxêÄekÙ¥dÙVáê÷#Š£»5ØÆô×â -"eÆe¤k*Ê)tµtW·î+û¡ô£¦\Ò±/æ1$x j²°”/&Ûj£{í¦¨<ªláÀY[§,¡hº—ÎVбŒ„ƒ à©Òá‘úÆ 3Î'¢‡=Œ¡ø2òS<ô½·):¥È½‘–‹(›xc ¯ÑÙÔD0¢GgM'Ô° {7õ ÖÒ¾y;©§]ÏØó 騪Àë "éRÑÉÕêã]ŠWµ£¢ìjd>îâ"Nu],±£ÆW'ßC‰ü ]mÝ(ú1‹#öŸxÕÏjÞ¥¨w5òÚâÜ~ Nâ?ÔG_——¬L#¦¬w3m+ÙüÚóÔu 8‹kº®½• cóIÎÅÛDã‡O°fùNBј¢û?JZi¿Ñ©/ $hãܯ4Maâ`§îãJ†•¶\ G:©[·󔩤E7¬ ;ëhÜø<-ÿ¯r°z6„}Ýߨ»äŠó–2³ì%ÞÞÆP8—¢òä!×e’=6LbK¸?{šÎ”ëÉ<ý2ž]¡·®ˆâƵþÔú¾Eþ¤ïP¢ƒ°}+íï>GÛàÎ%=k@sêuäÌþ.éR˜`_ÇÀÔ¡ÁÎa²dÅ2é&²ŒÑÌŠ·ÇÖGÙS7œ¹¡A¼[Ÿ¢=í&²O½t¥?*sm[G=U”=nÙít­zíœÅdÏ¿|ÍÀ¨“»»ó€ž´Í­F;ûlŠž 'îÝOb«i²ÈúúQ޳r)>|íUøK0òœsÜN²õíÐÑæ‰Áaü•Rkº‘‚ò›)™}WÈYM¯Ã? ÆÉ7#‰n"äAñÔÐýÑ£47îæÁµá~v»®$üEŒ,5BŽ :ZWC\wíãßý'vzÎ#oÊñ%¾~ ¾”4s~üKʲ“¢£ZÁº+ßeËkORÙÔ]•«ŸÂ‡Ÿeœù‹÷6ÞÌ_ŸÜL(içÜ{?£³’ŽjãëØBÍûæã5ÛðE@?å¯|ç{3‘ºŸá…?Aw4¹7síon!%²·ÝB½ ¤ñWqê¢ÅŒ.ÍG„ú*i\ÿ¬Xs8Ûæ$S>;ÐüÁ&ÕɽZ™eËL¦]q+“§N$I„z±U­áó—ÿÄöf7’å,ýê!J,ƒOöâjÜÀîwgæ‚ €SébNYt9¥å#1Ê\MŸ°ãµ?°i[§hH‡Dñn¦þ_õÈšÒμ›ìHv9å\Š¿1ƒ¾¸}¯ü9GŒa£.º…T‹€ˆ» gý»´mùÏÞc‡5èÆýЉ§~áöpÝl[SIÄ8ƒâKn%Ŭ42žmtöO:šûP9í Æ_z&®•ߣ¡}ð° Ig>NYæ*v¾ú*Þ0€„l™FάKH/A‚ w=öÏÓTQGXþ|²Æ—@ ø&øhSHHî½ÝÍD’ Șt5 'Í"ùW×±®~ÿSó¼›éö ŽŒ…ñ4D´)¤æ$£|]x²HÉžÁ„«ÿ†Õ{!ÿ^שZLËÜ?pÍ g`èp8ì`Ê(§dr½6ÌÂç/¢,ldûn{œ5[ÌÌþ•Só€P=õDÌdŒ›EÁ¶ÜB’@ÁÕ¼‹@b iEó™ñíÙ¤Éóú']¼sp#@ñtÒ/g‘4â,Nù~)ÚŸ/áã&±á¿àDÜøûÜ {ˆ½c¿R$Mz‹ïg ©]A—>Ì©7S^XHÕëÿÄåšM7ÒüŸ¿á I&ýDI6£3kñnþ Í~dóR&_CÞ9™D^þNõÝ~Éz6£/]F’g#­¾ˆË­E—VN"~Eø³ˆ/@pr%ø{©dío—RџǸ[þ…SJ˜µôBvüúE{¯é¥æßcuÝ”–†<çãß-¥Ân$oé .ŸŸNöÄhU&ø’åLÎ\z"t­¼…å+6á +–ä®a cȘ»€D T¹œw|[39ý4Êòv³æÞkØÚ$4& ’÷ÀQÄ]lxd)öD ¯[ÎâÓÓ5Æ oⱿÇê§séxíU6" %Ìúù«ÌÉ-`ô”|Ö7Õ´£ørÚÅ”,¸K’H5ö6æQчêéúèš›¢IÉ4‹‘Ü@ŠÕ„Dܵôný_šw5~ɤ„6çrÊÎ;*`÷æÝÑëd Iã¯&Â,Ì&-ŠoöŠhÚ¶‹Ðàst#ɇӯ҇4…ä-y€Ì®YÝ4Ê–ÝvÃTVtE;Èñx—ze“z}æÅÏ’9˜O5üŽm«w¨óùXž“s#®ÿ>Z Dœ;èÚø­CË®Â7TvÔÓßî‚öíôÝã»ÿ IDATíé`Ì’«)šð;>Ý3dÏb/þ¾=xñÁ!ìjÁcs­wÉ—GbR‚ú_J!uÎU$…ÖQûú“Ø}ooßJo¬þ£/%kúù¤ä•`L²¢‘<ôoü9UÛÛPÔø¼dÁ:ûVò‹FbHŒúFعƒžMÏÐÒÐÛ~·´—„väÝL:»ˆžÿ|Ÿ¦ÎÀÞæÐ8ýAÆMì îÿþ@ŸO‰«Ýà8Jð6³ûµ—™=å¬EçShy™Š˜•ИG’“g"تÛ£f•¯Œ±ü›ŒÔ}/±úä>ÚRâ´ ³äú1Œ›žxiü` ¾8WÖŠ¯¯HE”ÎEÃ[Ÿà(„=ŽC5ý„C_Bdy ƒıéi¶î}pd@iÜ=.Næcš$S1II½´¿ó4ž¢Û(ã¥cÕøFÝFÑiÓÛúý!Pü Ø>ý+=n;aÉ‚¹ìj çü€ˆíNöt˜!iH(¸’Òoœ…²ýwT:Üc qÆÏ(¤gãã´t{ÐæžÏˆ?¢Ä7U»ºQБ8ën Guбö÷ØíЧaH ãÆ»µ?–ï2c9õ~JƆéÝôgZú$L¥—“·ð~Þº—¦V7`"é”û].aÿôIZº`žBá ±$‘š]ª°ÃÚ+Ô@Ëë?¤3ýJÏœ€sÍïhï ÜÛ­¾CËsú·Ð¶q¾PIã—’³àv/ÿ‚.gX¥o ³žp¬¥£í Š‹gbø|ÏÀ´™XÐDGðÇŸŠÞ÷Ͷ¾èÆ‘‘—€ï³7pa(™Æ‘Q> ªþIÓÆ‚0’Þ‚Ü×£^7’Cî8Œ‘U4¾»•€”‚eü5dŸý}‚¯ÜO‡Cíùáíêø˜þÈD¬£ò;¢õ¨œEʨL”ŽW¾¦=» Áñ‘àaÛN X¥4R-ZØ›à§2ñ'Ÿ0qï•[XyÛ Tï7‹§œü” Tüš·?lQ™œj1äFOäêü û`¾–Nz~ ŠƒÞ={ðǘé&]Äh à[OE+îŠUì«yÿŸ XrÍéä_ôgn¸°‡öM+ØöÎ?ØÝè8 ì¥L¿åoŒO*%'; ðѰfS´ƒ°_[žÅè¥3'èx>=¾IkDÖÈ{;&JÐK$f]xºªq* DÆ$áéÜ…#TEaI!ú‰þá.õ]{ïp÷‚µä.’²S‘:;†èHqìmÏ‹gÃ/¨ßѸ7ɓ̳ɟ†óÃ;iª˜bÖÙ9OP\>]Õ»ø#Z´fø[pµTÒï uô¥Ð#ؾœ¶£²uŽÛûßçé-“(=ýbƶˆ‚Y7’3k1%O]ÉÊõCO-)£§íÕUÛ‹KYùIçþºÑ—0ù–§8sR2t¯`åž Ýw<§÷zçþ‰²Ñƒ«°ûéyãv;†¹f@Qœô¥(a”!ß~$c9Y³–Q0½A"ìõ"ËÐàÞ972&G‹gã¨ÝѶŸKÖñ¥4ógÚ¼ÞíÉA+ƒ?âÁ¹áïô{=£¯™Ž§a¶êèin= ‹Ý»dk9FìØZºöé$܉£ÕNnÉXôÚ5„¬ã1â¤wOû5Rm¯¯Å׎?³‰>•¾o)i^ù ®Á9øŠÿ}ï¦_ÓÐâCÒ§c.:Ÿü³æ¿?¡¾Ví›ÈAæL3Ø‘TýûÜ¡ãÃ&³Q½©±Wȉ³r;‘³IKù7žãèÓÐû7ÓÔæŠ¡NI„@ 8Á|múDR$€.lû}*ýò9øû¨æÓ¿ÜBE_9ó*®úýÝdο…’76P EçQk È9›¤5F÷+„PáéèòÒÇaÑþ—î#mtŒã™0Ù ôSÿÑvbN9+ó¾®P¨o+•¯o¥ò?’{á“\~ÑXJ_CƧ±o ³’÷îú6¶s_劳³Èž:ãêZöÎÄЕ0íö¿sÆX#áúgXþ§ÿG³ëxoYx¶>LU.š–+½G²ƒI%r2ËYd.¼—|KmëÆÑçÓx ¾q ^ëXG·ÿT2f|‡<ÛïimÝ7­D’$$œØÞ޾àþIF¸ïºˆ} u/ŠiÄÒJN#wá¹äu¯¤öWpªÞÊQAQ@Ú; ëKJ—w©N‹Ó¿×"A9Òׯb¯¯ŒpÔ>Rl¾1< èÓ’ÁÓJp?ÝzñÛðj~kt>¸Ûk §?Îȉ3ÐÕ¿K` ,`VI–\=ñ´D‡!#©e°Ã+E¿¼ét‡ñˆ˜SuU>°ûbý¼ Î^ ¡¶wéóßCjÙZ2KÓÔ¬¢?p,ì.Gug»èK™xùå$JÍ4;‡ÛÊKhL)è†$aW3^€äqd&Ê€Œ±p"‰®f¼áÞê·éȸœSO)D{„-¾ä2F™÷‡TÔÅ>éáð2’KAúA G\ô6¶F÷Ï1f ?° Š›ö7¤Æ rÙw™;Þ: !Yý‘3Æ¡õi^yèÏ'@rm@Ãöj\­;p¶îÀÙV/0ü¡çpëc|þ̯è=ð«…6Kš„¿òEÚkwâ¶5âî¨;xãëÙJË›?¦¡ÁBöy?¥ ?io²±ïÀ‹…Ä þ¾V¼C~>çSª"N< oÓüÞ}lû׋ø2. pL–úÄ%â&èÙš7°}ì¡®=ÂwíËH¢´fänŽ8*ñb%)?sßs5YXó’Á¾ "ýuH&1;ùÈ¿XìñAVw„GPásbòXkDË)dçjð×oÆD«å%$IŠv„ÀßCÆ4Ë>{Éɘ’õàï&ü»±u*ÊÏ%I/Ýê Ÿ?RVk¯@U=$”œGjÉ"R {è¬lÜûÿ1ÙýòÁWÁaFðË™ó£ÌÍ(À(¡m¬}a%ûç÷©Œ¾æ1’=ûþQñ|ÆÇO=E÷çœvÏ¿˜&%“œ‘‚ „w/§É!äy“*ÛåLM›Ì‚ße† ,™éÈ€sã›ô Ò³’ÿ®\•S|ýëÜzi3ÎH:)ÃkQÉ=c:À»uØ.j=¼ÌRòÙœóó_’êÂÖÖA@J#}D @`Ç;tÓm–ó#>~}£¯˘o.acåÓØ4ã˜rFA´ÁI˜ÁœÛþ²ïëþúgÚ¿Î;e†:qÙÁZv)Y¶U¸úýH†âè®3½¾Û¿@Q~Á¨…?"ôÆohëò¢¸7Ò²ceïcŒá5:›šFôè¬é„VaïF§]MJ gO'¡°]v Dð{b0‚âÀY[§,¡hº—ÎVбŒ†VÆé]C:>›ÊÎ!§´g0\COm‘þ ´ìºˆ²iw1*ò*¶>cér­½t¿µ‘€¸ÖÓÑr E3ï`„²‚>—}î|L@à(Ù+Ò_‹7´ˆ”—‘®© (§`ÐÕÒ]ÝSR}¤ÏQçêÑXGbÎ ‘:™Ìéçav½Gõö=ÈbDŸRˆ1¸¿ ýö}óÐ5‰9¬VdC‰%—Ÿ¦ý6‚ (Þ zÚCŒ˜~ y¾awJèG.&7%„ëãès¶õ+ȸäF/J uë'¸Ý2ædcüãT•ÏÇÉŸUÛ+ˆ·òMÜ–Q4"{§wÈD1ÙýPòˆ›¢…çBĉ{÷“ØjZc[¬}¨ç¨z€ ßP5èìÂïô“:퇌ÏœµO³kˇ¸¿°íi>p€î¶RóÂC8"n…”™?cų̈mƒ}Uô¬ý%­»ÖQDzèyÿA4§^EÖé÷’-ƒâm¤oóƒì©\T«éYNÕŠ>ògžOÎü¹hÅßEcõS†Ž>7Vo/ŵŽÖÚË(í¥ë³ÏÙƒªXì~(yD¢!Ž=ÒpPNÔâ§=ÆM·ÍEëü7/ýð×´‰s¢‚áE“å\Ê/¿‚àê[©nè à8Aûµ*­”BÁ¼™h÷gÿ¡K$÷J ˜Æœ…9ЊÏëCÒç‘@ àdA*@ D‚/@ D‚/œdh²I›±ŒÜ|+â|H&Ìã–2bòÈã·ò6HðWtd,y“;ŸûœÛ°“h©OÔŒMÞuL¸áYʧ«É#}òRRôGGfm&‰#¦a6 ï)’ycoúÓLGó•š3‘Ä1 ÉÈO‹Oò|„úQoS@ Nº‹Ž¶ø'Üø“Ë0¹ßàå»~F«Ê~ÍÍ÷œÞµœ—~ð+ÚOˆ2ŸÆ…?F‰”êŸòÔïVÒ?¸lWÎgê/Þ`^>´?u6/­·°¢×Hî·ÞâŠÓ“¿D<;;8wk¼±—,¡˜òÙ¹@€æ6áQµ”X¥<{ưðággþâ7ó×'7²œÅ¢_=D‰eð¼¸7°ûÇÙ°©!z JÒ9\ñØoÉõÀŠ»î¤Þ ÆéqÓ­sÑ캋¿<¸ß×ÞE%4‰èe‘”ädD5~2Ë)çRüô­¨Àí‹ýX6Å»™úÕ#kRH;ón²O¶Š#Ô@ _›?–DF_|#º¤Ñ—Ph}‹J»ÚmóÂøö¬¥±2=–1“I–!Òµ•–?„»ét‡‡W°üE”¥lßm?jòx7Óí‰ì½ßÓÐíÄh,$Y\Í»$–V4ŸßžMš|1¯Ò…lÎÅ ŸÍ„Ñê·i)œ?+j”Älô2ø¾ö;FT?ÄŽÞl"}„…Ì1ŠâÆßçÙC@ì +HðO"9§Í&êvè(?™ ãÒØµ®[åÞ›zßÿ)Ëßä&ßÿgBÏ;÷ðïÿvÁþ2æ. U.§Å­öI*åÙûå¾—š|Õu¾ƒt}ÙņG–RaO¤ðºå,>=Qóg`Üð&s6z 2PxúdŒM‰L*M 9ƒ_ã_2ÏcÌU7²÷CIûŸø|å§û%ÌrÚÅ”,¸K’H5ö6æQчêéúèš›úT\£È’Æ_Mþ„Y˜MZßì/дm¡Aã'ä“>ëzrËJÑÉa‚½mÈ@ ™$Ó,F^p)Vq×Ò»õiÞÕHX´eŒ¼ê§¤ øZæÅÏ’9˜³7üŽm«wDŸ©FæÃaœCÙÕ· ßùSv|Ò@ÔåLX<ÁèŒ÷©|ùŸxÔöRt#ɇÓ?D œ™pý÷Ñj âÜAׯ§hmøÂ§)$oÉdv=À¶5•QytÓ([vÚ wRYÑ…¢V?j8ŒMä)ËÈ7£^!Ô·…®M§} –ÿRóßÙöúѯs{늙”]s3¡wn£®M‡uö­äĵ{عƒžMÏÐÒÐ-ö+Áq’àÇ1nœz—óÙۉ䎿„œ9Ó0®G唘£„~ 㦧^?Ø‚ï¸h9ÄCÙº,#²>~:7Ö“5ý2JgYÈ“v²³¾„ñù™è¾æK ï&ê^­A#§zö=ä¬`*&)©—öwžÆStÅc¼t¬zߨÛ(:íbz[ŸÃ«âšþÄ?£l|žÓÒíA›{>#füˆÿÝTíêF‘¬¤œñSŠŠœØ6=A¯C‹!ÿ,òRc“@ñ7`ûô¯ô¸í„% 沫)œó"¶;ÙÓ€P-¯ÿÎôK(=sÎ5¿£½78po÷@òªBf5ŠöíÂÖ EÑmlˆ~5Òæ`ÍÔnû¿êLYG⬻)ÕAÇÚßc·{@Ÿ†!)Œ?x€$ý[hÛ¸ _(‰¤ñKÉYp;—A—SåËTéGM/òð63–Sï§dl˜ÞM¦¥OÂTz9y ï'á­{ij rº 5­ A,èÍ‚Î>}Z\ô{C Y0äŽÃYEã»[ H)XÆ_CöÙß'øÊýt8Ä'@ ‹ß¼ˆËŸ\ôåÍùÈ )2‚ÛÇt5h \BñèEä'¾Kµë«ËªŠ.b´ð­§¢Æuß”ÊÄŸ|ÂĽßÂÊÛn Ú=ôšR¦ßò7Æ'•’“øhX³ ¯:£-à¯y›®Sïdþå@Íïiõ|Ÿñ†t ZÀâ:—¤5"kz)J%è%‹[D<ìý™û¸ðtUãTˆŒIÂÓ¹ G¨ŠÂ’Bô ^׸õ³ÉŸ†óÃ;iªÑïlœ'(.ŸŠ®ê]æÙäŒ4ãÝx?Û;PG»—äò;ö’Z™Ã]8ê»öþÕÝ Ö’»HÊNEêì@!@ÐÑFX×Bˆ³ oßþsÌ%óáeö«ù¤8pV×ÁÜSHNZI‡#Œ”8‹)HÞ¦iÑšMàoÁÕRI¿7 ÔÑP“mÁV¿•0àê3‘|ÅRÒr,t9ûT¾ëðúQ壉‡·©”8›¼±©ø>»‡†m-ÑkZ›‘RKîôY´·ý—`ŸÆd¡•%ŠngÂ<#Í/ý”nc6Zzñz‡hÑ]IßžíѲ÷ê°\±ŒÔ+›ÅÁ1Hð±Óµ« Ÿ’y #¬CþÏHÆìSСe[ŸžÆv(1…1#©ÞîúŠŠd&ûôùÀöå´åO ûÍÁ÷ï¤?üE§Œž6ðçm/.eå'DÑšHÈàÜLU ä@ûºÍx§H ™0êepŸ¨stô$Îýe£'«ôÓóÆí4vÅ‹¢089JQÂ(Û¿æK®‘¬ã1J hæ=δyÜãÉA+CÈ2vz:z8“ŒådÍZBFÁô‰°×‹,C@«þ£š™U%ø„ 6­Æ5çH‘Açö.²¦aˆÔÐÖ鎡TœþNß¹×3úšéxÖa«þ€žæÖè´£/3›¯ f3}Ç4É•UØT¶–cÄŽ­¥kß5áN­vrKÆ¢×®Áíj#”‹^g!aô(@Kj^2½\´¾–/~Á8 ì&³Q´F@ 8F ¾ûcþûè»è þŸ®˜² ÑÝfòÿç}îüŸ}‰þÌR¶Fð«(‘q<&[~ê?Ú~”À¿|þ>*yï®oc;÷U®8;‹ì©“1®®%¨ÈhMz@ƒi§úåß“0*Dëç=$L×F : p¢&ø<[¦ªFM§•Þaîr¢:ã‹ D"úF’$$œØÞ޾ý=W ÷D¤#”YÎ"sá½ä[*h[ÿ0Ž>7˜ÆSð+Hˆ¥“ BfÕ*ön¥«9@ñ˜S0ì\¡xJ׳¸bœß±¯¡îåO1˜CZÉiä.<—¼î•Ô¾ó Î/]1FQ¢W%ú÷©lGµ6=ôŠ«–€RŽ1uÆ´f:¶kÈ(Š©=ú?&þ²G(ˆa{@ Ûÿh²æ12 ‹Ž] †ŒòÊÏ$U÷_Á”R}ÉeŒ2ë?>´¬¸iãAjæ<Ìè²ï2wü{¼½Ý‹Ö¨&r˜þ/±q'@"Ų0èOäÍûÂöj\öx<+H8 $XÑH|éhp¸õ1>f ‡&¶k"öx™Eb†}ãA»U’c'^fa)ÌEîl¤~Ô¼J…M÷^3í.FE^ÅÖ'c,]B®µ—î·6P€p'.‡–ô™ØßÛF _¦«{£ò$œŸvQ,‚ã>Á—RÈ^€cw ƒ»ßEìÛiwAzÒHŠG§²yH‚¯ÉžJáÐSvBA¶ÄûHMÓ&N0vê>®äX{c,šA!_,W÷® a_÷7ê.y„â¼¥Ì,{ “.ªNíС=Yf ÁC~Q‚x·>E{ÚMdŸz;éJ?ž]¡·¶-޳<¸6ÜÏnו俈‘¥ BÈQAGëj ½fýÏ©q_KÞ¸e”LÔaBÎ*z>Õ2G"ít­zíœÅdÏ¿|Môú°»»ó€çø·ÑüÑj´³Ï¦há¹qâÞý$¶šV"Š™ àþìi:S®'óô;ÈT\QyêÚö-|Ž´Ó³y9ߘ uoáðƨ])Y²b™tYÆè·ÅÛŒcë£ì©‹eÝBå£Ôšn¤ üfJ&EõrVÓëðÇ •v?¬MݸÖÿ‚Zß·ÈŸôJt¶o¥ýÝçhkuöð¶wƒu'­.P$Û7γ×#BX lj“f¨„qÚcÜtÛ\´ÎóÒM›_X ˆ)Š’/¤ü²ù8^ÿ-=âdX@ ND´'MI¤ æÍD ¸?û]"¹Ô¡ËÆœl} ™§^FBÃctÚDr/Hð¿êü>i&Çê€njÖV#ŽŒÔ!§žOñ¢ùèžÚç©Z·ex‹k@ y1b“6@ à¤AlÓ"@ ˆ_ @ ˆ_ ‡dÂ{^~„òÃnuúñÞ.5çqNü ·üäjbÝoòòÝ?¥Å1ùÿÍ­÷^†Áõþöƒ_ÒTkX IDAT*E ç¯Šw'u¯Õ¡Ñ&’¼ô‡dˆ˜Dc1S¯üI#!w#κM´îþ¿?˜Mç3óÆÛˆm]OÅ;Ûð‡ŒÄ/}œ|Ë_)ÛðQxg"]:‰ÅkÉÎŸÑ ìÀÛ¾¶^ÄÞ+åcP“x Ó.žO÷¸ûÄV¬@0ξ–¸’_pýí—G¸ÀutøÐ'ç1eÞ >}õ­ˆ/ämØI§gàŽŒ§¾{Ѐ@Â0íJ&úÿ›¾ŠÜ„·©êé?^k!Þ à:¼\É“/dþ¿/$Ys>ï]"IýŽ·ó0¡ I=ëVœµ€ ¿üŸÖ¹ “±Ž‹—¿Í‹oÕÿ yÝ4ÎùÑÓœ› ;誳2O$uÖâ”Éjõ3J»Æ]Ï_ABn|ÝnÐxð‹½Q§IÁbÄûÅC4¶)èSŠI›w+…¹¹Üð.ß L–u=99»©kr s&=±Å÷2mtï|’¦6Š)›ø ~HÄ @ Nm/Å¥ë.%Žÿ¿¿¾OИ±$kpˆpö¾CÏÿ'[kûNð}™ç/$†vj+õL+šËìYÉìÿ´sHqºŸí¿¿‰Šž8r¿õ®¹ ™©ÎÇ´ý-¼GŽ©â“ÿ¹‰ŠÞlf}çEVœÇ‚›® ò¿_bP‰OêU÷Pðùw©RýjRÎ'?àïÿøFövÉ€„6Ö‚äõ«×Šv©9–hêùÌtQýÄKÈ>ûB&¤§…õèÄYö{jö4¡º,ÒXˆ/ºœÙ 0ÇêPúšè©ø+eû <)Š]À”¯¯#1! ¹k°ïý3‡÷7 ø‰aé%—‘˜‡)>­ÀCoéÏ8XÞöWýÒ­%cjz ø Ø?¡þ­?áô©n*d!aáíäLž‚1.|Œì¬¤kÇi®ïÓbòoø†}÷Sùy}¿¾bIXþÓSߣêåðÈѳ…*ªµiæ-̾ù{è´rVÒQºž–†AO UØ”˜RÜLVþ ô™€½ 0–{Dz£ŽÞ6´•ÓÝÔNÁê˜<û#*w5…eRxÛ}$ž{æÖp-v5 Äe§BÛc4îÝÑÿ®ŽC¸Æ Œ?T£ŸÑ|U›Köê_‘Öñ+ÊÞ¯ ÛF_LþÚï£Û~Uên èò™rýý$÷ßìH»êYÒÆõ¿¦lkexJO”bG D|Y©ð:¦ÇßyocÑÙ§ÆÙy ¤0ÍbÖ,3ØÿÁïÄ‘U´ŠÌÅŘ>{ϰ9]Fö ¥Ñ ¿X.p˜¯¿Ì³ב0ù2r-/³à»  î.XUBíëÇþLéë«Òdfœ·€ú·?ÇáW=ŽÈõ3b»¾=ŸqhÑçÝAá…%ж…¶mUx=>$c Z§]}q‘¸ù?%¿(@Wéã4wzÐe]Ƥù÷çû!÷‡‹aÅWm×Ót¹{% æüÈ]üB¶»h²öîbg‘ZX _ ±´™€_F2XÐtwõ:zâüÜ©í´òzz<`HÆ/ã‹ðíQ£Ê#1fÍÂÚLæ½ø¥D,E7’±ì{^y€vGúöcë„Éç /­§/è2IHÓ#·îÁ'G×£ë0›öt}Áxâ‹n"sùø_þ9NYM¥¿v?“';±íx»C‡1ç"²“NÞ3Ç'´·®aÚ´s0îiê¿ÁÀ[ùÜçÝNnÁT:ýQ¨¯½¦,%)©œûØâ£û¡Ÿž¯ŽJ°žæ ?š²ŠKgã|ÿ×´Ùý>ÓÙ?_傽?snvø Xí¥Ø}ѸLs~ò9sŽü¿›w¬£Ú=pé &›ÀWö1 FZý«˜6ýrrâ6QíœØgPòÿ£(~™ñ@õïïäà lûp( %“dÔÔæçÙÖu3÷æníØŽ»g+ï½°œÕ7^@ΕO²îŠ.Úv¼AÙ»Ïs ÁA(ýŒÜ®õl¾œkŸºü¤ô<ÞH:mÿ£%„ðФŸÖ呵¨­õ9*ßÞ‚oŒ³$óBrf'ãÜv‡ú§,Y›!ó ¦ÎCpSøÜrŽºŽ#¿sÛ!!ïnâ3’¬íƒîTúñÖ~€½¥oØÒ™cÁ׌«¹Š^¯ ÔÒ;ÁÕÊ㮢»©pÙõXÖ¬%)3«Ã†¢8pV×Ây‹˜¿‘v‡Œ7 Kl€Þú&õ‹‘ÕÚb4™#±©k7¶º½ávuÇ2aÍM$gZèpv«²©ß¼Ì)f¼¥ÐPÖ—£ÍË„ÂïGaw>|¶HÏ&FÑ'ˆŠ¯ŠÖ/ê(*YE|õsCîn{q}ö‡cî ÷ê'Ikü€Ž}›éjé`l®}b?TçóQôU²­Èú^‚­x»ý§.v@øÃÝžŠþÝ’cæ†ûöqt=™‰Ô…‹0¢¹¬Ÿ†6˜6él ¦ÄQ]î:FÜÄéÅ·„h}é&6~n O ¶²;úé1- uSÿÚh+¾‡ù« šÞî¸mï}gvŸÅŒ ®bÖù—3qÁ-d.¸†¼õ×±ñ3»JýŒÖ._„zî¡cÿAúÌLœ”¡žÇqç=Bþô•¿½t½y' íêGŒ’y:qFð”îsq %a’bÐ.yœâ%C¾ôd¢Ó€/’©ô«I8 ƒQBözÑhÀ¯‹¤ôàÜþº/¹™é7–à©ÿ[õ‡tn4EE¥ÜcGékÄX³i â&и×âÛHž”е¼ƒ˜ôbŒ¡C´ZÝQ·Åh2Õ¦í2šÍHt«²iÐR€‘ºÚíã¸%„ÿÐKtͽìïÒr\[‹uËÝt%‘µ/ï"vÒb’óÎ'kÅ%dwn¤æÝWpª-âÆ,ÂÐjVñî¥ã°Ÿi‹0îÛŠqÚ$”Žgqõ)ѵ…*™ÇjSE9:fWcS©è/’ ï’'€§…ÀP“ëißSGѼ•˜mÃdG9ÛËéÜ·„¼knajñn*>­%Z%¾*ŸWå«JXï'š íáQ4bG Ã-• á=ø6m x K–ÍÂ0Ù%=¦DsT½6} S&„‹ðöý¥4U•r¸1<ßÝX¸”$ýÐ:ÃMÛ›rÈ šüÿ༢¼°Æ0ƒ9×^K< z“ÃÎ!ƒâ¡íí?pxèB8É„eâD š ¹°7´„÷Ï1¥bÔégôv¯žÇ¹§WK%ΖJœ­Õôù#œƒî©ÁݱùÅGíqƒeB!@gF# -*ñb!.U‹¯»ï ¿>§#\Té2±$Køª^¢­fn[îöÚ±ï r⩇Ã[î£ìµ—èKý:¹éêmMy޲O$,%5{6ÉéÐ{ œH¦5«²… ™#²éˆ…àè6 9öá%KnVÔ_˜%Y‘‘¥ÅW·s˜u 2þÚW±Iç’‘eY¯½•8z &9-ª2ªòy5¾rð&!ÝIÄàÑkõ€N¯9u±#‚á§è„loòþ?Wqý•d­~žÛ¿ÞN·#€>q"f÷ó¼ðㇱê´Ó.«uâ_ðñúõ‰›Äôc‚'4ä˜?á/¼€@9ø{Þx(¼¨V“v7þæ.R1)IGÇYŠó#>Þ°ŸékfRðÍÕ”V=ƒýÈ·…,¾ç ÎKˆIËøä¯q†Žo¬Ò½…O¶ÝÁu¥í¸–±òg¿ 'Ø­µ¿”Lʤlbå»túÕèçQ|*ÚeµŽ®g[Dæ<‘ž×Óq&n9¨¡mg9IçßÌÌKsi?X×@Ò'¡×TÓUÓz´PQÜôÙœ¿’̽8qè5‡ÂǸKi®¼œü9÷Q`|kc#}B ÁúÍôôÊ´âê„üonÛŒ«×‡dœÞÉ#"LÄß@¢¿ g—• ¬GŸ‘G !|ž´DMžþ˜îxk÷Rr–| 8@]³#ú¶P#s$6©–TaS¥w;Íû¯$î½äi^¡£µÅP@ ŒiÊŽ6a æô 1IsI+¹³k Õå'ØÉ)pkE © rÝNI"qÁ7ˆuTà²w!+±sV’•ÞQ}9›ý¨òUų¦­fr‰k‹ Å”?¼GŠÁ?ì­Á¼œÄùW“¢­  IĨ¯¡³º…P´bG 'šƒïźážï¸Å+/aÒÄ M ;kiÜ[‹<ä™·6c¹ƒßn °[ ƒ{>Óäùä2ä]")%y8b`´PO9m.H‰ŸÂ´éI|Qy\õCϧÿGíªß3-û&ÎÉÿï6uÓÝá%=ÍDlúD÷aZ+6²óõç¨í8QçàźéYÚ—Þsäå,RÈJí§;1Ÿ=äÉáÜdg- ¥ÏñÑ?>ì_Ð;Š~4Id©h×ÎöŽˆô¬ª¼NÏÚ3Õ=e|aŸçR²Ï^BÖ’eỜA;îêg±×¶Z´ëÇýÅ3Xo&í‚¸ðìÿßþc<¸¶?À×uä]É”F DÐQA{ËV@†P›E·ø2.¼œðÞÈîzœLy’bÐH XÎú6馘þp:Œcï£4ÕF0„U:›?Ë,óñ¿÷—ÞÊÓOU’~Ë»|s±…Ö§/âoÛûß5+%Qð_ïqiž“ª_¯dkà?G¹Ö“è®û'×.I&tà'¬ð-Ü `ZÀ¥¿}Š‚Øöýæëlj9Ÿ5ýY¾yãsƒ©ä1¾}ûyh÷ßÍÿ>ø>}Âu¿r(ÞÔ½V‡F›HòÒ’ñkŸ&ñ¦]<Ÿî7*p÷}‰Û[‹™zåwH²¹qÖm¢u÷ÇxüýëôMç3óÆÛˆm]OÅ;Ûð‡ŒÄ/}œ|Ë_)ÛðQx]:‰ÅkÉÎŸÑ ìÀÛ¾¶^ÄÞ+ §üëøq1hô„'œOYÔÉ3®9ÊtS–_…Ùº†íø#:s¾/)oDIžÓ&Ï TØât‹Ó ü#d¬ãâåoóâ[u#ŽP¼ ;éô !ã©ïFAAö‡G°Š<ØÙC( € ¤âZÚ7¿ˆmÉœÿM¦&¾C…]Á˜ÿM¦Å]o°§Ö69 #€a!³§[¨+Ó‘{á‚pã20h@ Œ¿‚„ÜøºÝ ñà uœ²®^ÁbÄûÅC4¶)èSŠI›w+…¹¹Üð®Aot•²®''g7uM®aΤ'¶ø^¦ÍîOÒÔfC1eŸaÁï*ø—Nfø«K¥=ƒPwÃiðòt“4qyµNì»6`³ú…<c.ðÔ«î¡àóïRuÂÍ4ízþ?ÙZÛw\G.û€B(8¨ãV”€_@˜Ñ¯%·o ´ò6.-šÃ¼E¹T½íbòòó‰!Dë[¯Ð9 ä^0Scg͈A‚ÖœQ Q?œèÐO¼„ì³/dBzZ€@'βßS³§Iý£1…ø¢È™½s¬¥¯‰žŠ¿ÒX¶Ÿ`¿¿I± ˜òõu$&Ä"!w ö½æðþäŸ4Ì ½ä2³ó0Å' Õ„¡½¥?ã`ykxÏYýÒ­%cjz ø Ø?¡þ­?áô©Ü•V—Ï”ëï'Ùþ7íªgIH/õ¿¦lkåÑÄ’y ³oþ:-„œ•t”®§¥Ávtÿ[mW‹ì¨£·Ímåt7µS°ú&ÏþˆÊ]Máë)¼í>Ͻsë ¸‡º4 Äe§BÛc4îÝAøëC¸No¨²©Z'=*³d!aáíäLž‚1.|Œì¬¤kÇi®ï<*OL) n&+zLÀÞŠˆ¨ Ñæ’½úW¤uüв÷«ÂºÐ“¿öûè¶ßEUE‡zŸW£ŸhÄŽZýŒ(Ëò?0ÃüÊ6|xì»# çã­ß½ƒÚ–¾¨øª¢vª¡šü3š?«°)jäQ›£NA>L½âYRû¿êÛñö•µ‡Û®IfÂÙkÉž5“A!ؽ›Ž¡­iPœªÒaäQ;jt¨6Õ´+j}Šœ9š-ÔÄiTbY¥Ì*lR§Ñh{bgä?h#¨;‡ V•Pûz¤¯BÐëBÈ! ±«™=]¢õ£ÍÈ!%\àûCG ü‘®¥Ø¨Ýðz‹Ö¼b-9ûj))Œ×>-m'è Ièña-­#½äjf,°-íc_]E9ièÅ*Ä3-ú¼;(¼°ڶж­ ¯Ç‡dLAë´G0ïÍHÜüŸ’_ «ôqš;=è².cÒü{ÈóýƒûÃ¥øê±ízš.w²dÁœ¹‹@ÈvMýwg¤ØY¤ÃÁh,m&à—‘ 4Ý]ýA©'nÁÉÚNû'¿¡§Ç†dŒñrx@«–`=Í~„5e3–ÎÆùþ¯i³÷?óu›PzwÓZºƒ¾`<ñE7‘¹üNü/ÿœ§¬ºícAq|B{ë¦M;ãž&¼ðVþ÷y·“[°…•Î!7?zñÚ{aÊR’’Êé°÷RßݦøØ8éyT™%#ƬY˜B›iØ´¿”ˆ¥èF2–}À+Ðî‚”@â×îgòd'¶O`wè0æ\DvÒ©ˆS5>¯F?QŠ5úUž‚N$¥ Ó@ ³–€³ÅŒ½Þ`ô|Õ»ƒÚW¡Õ$’´ì^2O8ø-ÿD'g*jäQ•£Nu>TyÚnÆrîäÍ”±ïx’æn‰Ø×’½âbÞþ1-n•:Œ–6^zVë‡î*º›ÊÃòØõXÖ¬%)3«Ãq ÉœbÆ[ú åáß8Ú¼L(üþ)ØYatŸW§ŸhÅŽ ýŒ*ÏfÝ=PŽN#3ùNf/1qøo÷ÓiÊ@‡¯WŽž¯†<ø{< ñŽžN˜¢”3ÕÉ£&G_>”â’=3‰¾/¬9ìó-‡‘’þ‡¬’´µ¾_Q“㜟Çå<£·+j9J…©²…Š8U¢Ë›ðiÔÄ… [¨ˆ‹èµý¤cGÖv`øû:¡nê_ûmÅ÷0Õ¢#øPŽ™ƒïÛGx\ˆ€ËÈ(q%N%iç–`ôÊG |µ× Y9øâ3”ü÷wII6@û3|ðYkQ Ag6!¡çN6CæDhût'Þ³%b14àstÆqç=Bþô\/]oÞIC»úQ–džNœ<¥;O¢)¡“ƒvÉã/ò¥'|!L…¤/XMêÄIŒ²×‹F~]$%‘çö¿Ð}ÉÍL¿±Oý§Øª?¤ëpË )!§¥¯ _Œf3ݪÛ]Bø½D×ÜûÈžñ.-ÇåÑZ¬[î¦+¡ˆä™ËI[ù;²;7P³ùï¸T.”Që£Ùt¬>v*õ<?'Ölêb]€‘ºÚíãðªòÑ}^~N]ì ÕÏèò(x]­c²0è-ÄLŸ èHÊž€ÝŸ…®¯Yõ]´hå±ÓíZ§[>Ô$b¢[sÇQŸ—­8ZzÈÊ›‰A÷>þÿ²D+G©ñ1U¶GÓèÄ2øÇ1.¢×ö“އh>aÈÿdÛ{ßbͲ¯ ž.?ˆÍÁWÝ=ÃôËÉPv³í¥>Î[s9Ù€¿ŸÙµä¶²§á»,Ÿ ]l ëÈ0Hƒ.Öhфڨ~ù7ÄL Ò²§‹˜-`¨×¢À?üxö>ÌÁCúð*sÅßé ¥^÷Éõ’$!áÄöÞƒ´ÙºL‘{Ës5餭ø19– Z?{G·b‹˜xñšøýåmÏûÔ¾¼‹ØI‹IÎ;Ÿ¬—ݹ‘šw_ÁyÊWzË( HRm3F ÉÀÓB`h³‚õ´ï©£hÞJ̶á²£œŽíåtî[BÞ5·0µx7ŸÖªŒR¾¡Ê¦cõ±S¤ç1û¡Â±•|ŽÈw¥q¸͈»EŒæójõsêbçXý¨‘GqÕàW 1%…)ù0íåZRgÌ#¶- z?¶“>é<¦DÁ^£^KM£#ÏxçÃÓiO“ô<ç‰^_ ÖŸ¥“ŽÓhÅr´j õq¶Ÿdì4k€}#_ÓCÛÛàð ·±d.ž…²ÿeìx•&¹‚Izèëæ¸M3F»–"êÿüc :“!Ü¡idz÷ýÒ7_£Ù)£ÑH€1¼Ÿ`\“›ÜS«¥gK%ÎÖjúü‘—â©ÁݱùÅF[C1à:3ihTâÅB\ª_w ÞA}NG¸ ÔebI–ðU½D[Í>ܶÜíµc/€CN<õïpxË}”½ö}©_'· =ò°õ€nŒ‹HTµ}¬†eYZ|u;¬ƒŒ¿öUlÒ¹dd™F6]o%ŽˆINSý")U¾¡Â¦ùØxè9J~rìÃK–ܬ“{9WÈMÀš„ltš±û|Dú‰V윤½”¾f<þ,3/%¶{3U[ñ&® mrNõw #ó±² Ä$ CƒU]+›ª‘GMŽ›:ªð’@|NÚÑójÓIÈž=ûñ÷.kÅÎ:ŒÈ^§>G©ñ±ñ´…ªXŽ$Uõ¹'Ž‹¨·}ì±³O|\7¢A»·ðɶ;¸î¢Ôa¾Mbú1Áä_ðñúõtõ¶Ð˜u>ê?ܧW¡|Ÿ—©óLànöQÉÈ×:ñhIg2IsÌç’FÄ£«lÏ85´í,'éü›™yi.í+ðzHú$ôšjºjZ&%ÅMŸÍ ù+ɜы3‡^s(|Œ»”æÊËÉŸsÆ×±66Ð'¤¬ßLO¯ A+®HÈÿé¶Í¸z}HÆiá•ëa"®øýU8»¬e=úŒ{ YK–…ïFí¸«ŸÅ^Û:hÑ®÷Ï`M¼™´ ¾Ošâ³ÿûñàÚþ\בSt%SfAGí-[Bmtl~Ýâkȸð>r´ý£tw=ÎbI1h¤,g}›tSxR…â=Œcï£4ÕŽa>´¯ŒÃmE·p“W\!'îOa;Ô¢²ÀPÑv5ITvásúH*þ3‹!äiÂYó ûwoÃ}Âíºdúª_§§øN&"€lÆ2gñÛ@ÖáØõ Mj·¨Sëªlªâ<ã¨ç¨ù!\ŸýŒCî#{ÖZòæh™ ó vG_d1Xõ(5±·0±ðVòÎ ËtVcwø"ðyú‰v윬½”^¼m°k‹  GùNäìI8ížS”Çx÷®§-ùÛdœ{')Jo8Õ´ªÜ @͵TØ”ä1G§Mݸ>û95}ÿœ³¾Kžäž½´mú­ý;èŒ{ÿ¥VÏ#é0"{CŽRåcãi 5íŠ G´…š¸ˆRÛO>n¨z?Î¥@ @pÆò1pÁÀ¼•? }@ g4„cgíÎz@ Î8Ê€¹À1,ü\èE @ 8#9RËk}xÈJ„~@ ‚3†§ßü3ÜÖ2bÁ­@ @pfð1pÁà†Ûþ›„çð@ ‚Ó—²þÚÑ üv`eÿh@ @ œ~|Ü_³·«)ðŠü Ïç@ §O÷×êíÃ}©åÇr "x±¬@ @ ˆ6eÀw´ v8¤N¸X‡X€+@ Œ'~‰Õsj–ÆpÀ `0 È’„Þ@ ‚“Æ4û€ÏM@u$'øÿ ZÀ;¿»ÇXIEND®B`‚stem-1.7.1/docs/_static/prompt/python.png0000664000175000017500000017431613157571677021177 0ustar atagaratagar00000000000000‰PNG  IHDRÅM)NÍðsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÞ%Eÿ% IDATxÚìyXUU÷Ç¿w`PœqÊ¡,§PPsÊJ3œRË_N9dof©™–CN©¯ieæ›i6i…ˆš‚SN †( 2*ƒÌÜ{¿¿?Aî¹pAÐõyžõ?$— •U)õ˜çŸò;÷18N‚y²0KÐFì,¹Ee×3ÿ Ä2ïœH ~iÕ£–lA@ðv¼ÙÄ‚ ‚ÑÂxlQEq3äü ñ#Žvu[ÂÓÂ[ÔBiæ”Öͧ`Û/_bD}Ë’„:dfž üwÎŒž“Ï€©?¡—ý½?«êû+Òy ëIù\YãÇ\˜%Å_eŽUñøát0Ž>‹ß§¶‚mN9·—Aì•5èæ¨t3€$Ù°Iõ‡cx3ëÒ)Ulþ)ï~=šcG³ÃZ¶Fëv}ñéÅ’·©Ì<š9ªœs‹ÊÝ>ÿŸ´;‰]cÙ‰d ~Ÿy {õÅê„Xç¿>5ä¯ßAŒ°&·þÍ­ºòYˆÇbQ-=®ÓMC!ëüI$>tuR“”ޤ¨dèuD%§#16z€é é€Ö ÷Í+UZ+h‘ŽÄt½„ôã?B%ñ—žœ=Oìê‡v›z!ðð|tß8Ú Áªå­ñÓð7p Qy)štô+ìJ†—_i†¹§O!£LòOù÷ë‘D—€ð³ €6 ]RKÑFx¬s‹UóÉør¼ ¾ÕËƒÓ ½q¥ýSû¼¯5Ø4+šMØ$ЧAŠ@›[ÿ*ø¡ÞKkvZVŸ¾/U¡£uÏË¢Q»°Ïòý¼“Ʋ}âÎîU‹Ú©«uâ¤Õ?3(,šÉY¹M™ÀCӛѠÆ} ³ûÓ±°s-ógHD3r›%_òãçCêÑ*¯]~}‹…’²Ý›ö&õÏ–×…ò¯!ÕU õåÚglï~ï8(€zý^p¸÷wŽƒ÷Ó ÷çÇÜÏ´.|vÚf½‘I’ÌŽ=Ím³ºÑYcš­5n/qkX"³sû“~ý07Nh˪jåv6§>FÏeÕŠ .“I[»³JÞïrÉ© râC‰O´1[ü„emö›»“ÁñúœFúdF†øq‰¯3ÕJí£4-=øÜÇ¿ðÜm’4ðVÈÏü¨ŸG¾¯”ú´XQÑù…?™É®ïh[às+¶œNfüÁçk¨dž}Ôíøö¦ÃŒHÍýZŸÊèÓëèSM¥Ü_Jì£Ô§ÅŠŸßŸÌãcÜ©qÌ}É'9Á³6_Ø͈ÿzÓ©àø2Ò¯±goo“‘KÙκˆœ©Hçâó9û¥L¬èá;‹ß g¢!oh\áž÷[ÓÚœþR8v ã+'îëòíSÅÄ¡’6f;ŠDIŽ2¦Y®•’[;vZCF}ÉNUŒÙË’Mfœ&³ÿæhMÉç]""""ø,Š.ø¥¶©;gE´çâˆö\|¹%Ç.p¥WÍ=“usµQ$ZON&¶„Ã}z²×€1üÔ/–ä®|Ö‘ªÜv–^sF2lÃЛݟíAŸACù\ãÜ ©Öu›zÑ«e/.¸PÄ…,ï\—Vpdú Å…I$OqzËœ6*ÖlÔŒm‡me<ã¹uX[zyyÑËË‹ÝlM쟊6µ³®½š€šöõš°–Mþä×ÞûGÞÑýͪÇ&l×¶!Ô*Övˆº¤­ìQ„Êž?¿@fsÃ;Ùõ™n|éƒ]Œe&ÿ_ŸZSô±nÀ¾CÒ»Svèò'n #y“« L”ÚÙŒú=—’¢X‰Oµ1Wü8²ûšk$#¹óƒìçÝ‹ý^ÿ‚— ê¬D”ġʉ=¿Œ$y…?Ìƾý†sööœs¯íé¤|ì(¹áú2÷f“‘ËÚÓæî¤Ð‹sÂÈL¿¡tQ+ ãúزãº2í½Ö›ŸêÀν_àèñƒXßÊý¥Ä>J|ªàæ×3_F2j³/ët^Ák·~æë#·1:r#}ª©ï+Rô+/7tûšñ¼Î/ž´):gÕ¹øüc¾~)-k¿òo“ŒÛ·Šï¾1„}{ûrЈq|½C5åñlÆn<×)_f)ŠÍ6v”ä9J‰>fºV>ö¹Åº _#c7t¢{ÕÁ:=ƒF¹S#“]còs^AìöÀ— »8³Ïšfœ“WÔF´çÜ]žôlG[Û˜R¼ðØ´å'á¤!p4kk ^ìRùS/{#Ç+fâQȹ´õ&òÉÞô¸çcóÔJÞäM®|ʦÌeûôFeq„kv\M2‚Ÿ·µc­7Ž0+rÛÛ€šÚ£¨Ë ÿ«nùú©jðÅ=Yä™I¬¯-…Žý¹;“<7³ñÝbͩ͘QŸšRçSü^ÚøÑxŒa _ðDþÓ¯ûu6AŠ‹CMñ½´jù1/1•¿ªA• ±a\GößI^_˾5µ%ïŠìcJl#u†qé&ÅŸç¶÷gð§¨ëüºOõû úU¥+¿Š#o®ê@ÛRä±Òв~)yó¡3ÿKê'²eo²˜Ù_Ær¸Ñ\§p|™£(6ߨQðÆ‚eJž/õµòqÏ-Žƒ¸WOí®l\Y6åû¡dÂwÝò¯‹"""""ʼn›@¿ÿ0E¸ƒqøã­1¯iÖ͈Áå$À¶e5ô\T µmÌØ¦¤¤‡â׿¢¡jÑÊx¡EÝ­ ¸’8¸UEy¯©»ƒ;z-¬ÛadŸLøí×àù×[¡ª• ÉQHÒ6{¡¥Æ =¿½]Þꥆ8ló¶\ÃÅ„´®=0cs ÂãÓ 7d !ô+ô²¬ì,oZmN}¦OÍå÷ûcÓÈ-T±ðßVò¿Uˆm£ðB4ü® 3ïÃÌpüá xu7ïØ1ÄÀoõ_H¯3¯4·`毽Ž ;±b_¼<¦¬_Ʊpï„NÎÀ‰ ;p%ëáû«¢¯òÌ«JrT¹æùÇ<·¨,l`¥²R³”-‚—€k·w'ÈM‚ Šè§й¨o-=ìÑê¥è0¬:ê:ä|Æë™(¸¶“¹Ú˜A•*Óze¿5@gTjÊ{U}â $,P½Ãhø¦oÆÿØbë–Qh£…îö5$è•J âðÝP_,<{ï†Y·pUiåeÑÛƒE ö`Þ;ýñû¹ÛPÕê%?Šš&èl6}:So4–Z}£Ä§E´)eü¨4–Ð@,]y­€ò`UeÈÄ­€/ðS ýæ„Yà­×ëàÆæJ2l¤ÿ»/4܉výGàÕ¯aî¯S°ðøb è;þñzüUû”4'¨QÃ÷s¬í±3Þí„å 0¸ÕnŒ?ºÿÙô;ÆNSÞ/¤âÔ¦Ÿ3æyŒló.¦>ÄÁ)E¦] Ày¼ˆ½=auälŽO­À·gMàü>\L7³i’aé†kxeÜ4¼tÆ/×8ƒ9«N!­¬b#+'v,ʼnË0»Å4 ù +ÇnD«…òíZŒ¿ÙÇŒŽºzo,^× Oh‡ƒ5~Õ•ïqöúDTÅknV@ž¥”ô @êé¯ñSô8¼8ª-¦DÊCº’(îW1dGÁÑxà•QQwë:\)d`˜Û_¥Íá&/C6Ò³Ø:ÁV $vý+¦ùóª®ÝßÂ_5ö,[…½Ñ:“r”)ú˜ãZùXç–ô0ìýàÛÕ_@´±¹“u=t¨DîŽÌJ-‚ GK-€:bi8µ´âSqêÛX~±,“6&ñät|2­ ü²ÑhèÇXØ<Û‡lG„©…!ç‚"©ÓñÑ„8ìŒqD=ë ¬ßü¯I¯³f^?гé³0蓹9ßÑZw4®zë¿9³ÕYq¸”Zow Ç‚ñaÈÌPaËŽtL›^—æçÜ1Ö_߆™+fáÀ´ì¯6+=èl;¸5®ƒÛ;Vá—…eWF8„}F}ˆI§WáÀµT¨k<_4›>ŠNƒ€ïŽƒ_ÌÃWó“°Ä?:—.pUVæ”ñ“¾‹ýæ`ÓâX£Ÿ‡Ÿ¯Z A÷±h ¢ê‡‘?à½uïcïG¿a³î}l>«Áo,À‡¯c÷¸nöÇþò3º ש»^ÂwáÙeUÑù㥜ÿáˆÏ´G×gà=.F§Þ»gqþRbsÝóRWCÏEëÑ'èm<ñ{2zÝ@†c}T·¹O‡d„Çd™Ö/H Æ7;¢0aØ(´›tFU¬¨_ H9‚y³ÿ‹ë×âØžVX´qÎEg@ëàŽºØð}¨ÙýUÚ®7e|z*3_äê¨c„¯¾ÍÏŵ1w^µ}ýï ŒsF9C½7ƒî˜Jr”)cÙ<×ÊÇ8·ènàMDZjÕ4 ÷܆¥—ŠïK•6¯ oõ(lßuYŠbAeÔ ]yRM'/+Z·–¹Ú˜²ÐVrC¢r6 ʺÄõ£[²ŠÊ„E™ .‚áìÍù{#˜I’úxž\Ó‡5ÔE,êeß“Ûî—>nqß6 –¬?l5oän¦Ëã«|X]mÆ?üÖä.ä>Ÿ-­r>³~âS^!4Â5uS3»LÞÈ¿/'çnì ãí°ÝœÕÊÚ¤óY{áâÝç›·?„! ‘'ùÝ«uï[½ÓˆÍ¤¢sYzpÀ§ñÒ¼ý12éW?çZä"ZøÔ$¿—>~ÔNOsò–“ŒÕçl1v3äSHž™äiÚjáJâÐÒƒýçïbhRÎ׉ÿþÎùýëܳ=‹YÚ*°rmïÍ·H^áâv6%Š £úh\Ø{þo ŽÉ¸»+JFt0[8ˆu­LïJìcbl ˆUæz®ãÕè9¤fî6)¶­8m×Yž>ÌÓ?ŒaCKÓû€6O~Áë¼Ío{Ø¿8¡É:›±_&¬¨îÙÿ~ø*ïç”H^Õ—Îeâ¯âÇŽÒücl|å‰Öm—FQG’º8žX㛇JÚ˜cìÜC59èëËÌÖ]å·Ï×z`ñ5E9Jqž7Óµò1Î-*§Þü:ŽLõÃzÅÍ—êsüL2ä=6³”ÅsDDDDJ6*…¢…]8DD!Ñ6˜Â`fÓHõ{·q1ºZ;.$¶x³ªØCDrÔ#*ºôÿ†Q4ðÜ’…ßPPÙ²åô fòWv©*~1å:'OË¡¼©‚6c'àéäs¸•uõæèÿî<´LùC•­.*ydœÃwÿ‹À”±£ñ´ƒ?ü’Ä$B%ÉQ*¸5kŠZ6Eím`@Fôœ¿‘&yzÄþ>½ÞqÅ¡~ø#ª9:~!ÿÏ„Ôh?eü·Å?³:`Ö¡d±™ ‚‰È“b‘rç:ñ]0ã2sßÍÓ'òÒþußÞÑô½]EDZ?±ˆW™Äm¾Žb‘Ê“£lÚsùuËOÒF|R@¬X×÷5z׺oemm¾üý1þ4¹-«ªÄN""""¦Š ›‰‚ ‚ ‚ Âã‰ZL ‚ ‚ ‚ HQ,‚ ‚ ‚ R ‚ æÏ¶Žè0q9Ö¾×vãüVðê‚•øÐÇš‡mŠªí0y{ 6 ®ùÐu„²C 7ïáèîf!¦A¢X(=*8õ\ƒ‹Yi89¯-l*‚Fvžè<` :8Ë”¶2øK(9÷18N‚y²0K”m«á™7'aœÊÙÚ £fOÄ Í«<Ôį²kƒ™b™w ÎG”dUaeãëñÎQpë;¿‹C& ê’yr;¦¶°.ƒ6B‘X5Ũ%[¼o6‘+ B%+еðœ|Lý ½ìïý¦ªï¯Hç)L¬';9•·›ìê¶„§… ·¨«  ‘uó)ØöË—QßRÜSÑý¥®†Nïþ€3· ¸¼ Ó;W7ñ Õ:ŒÇ—{Ãp[GÙˆ ùs}jÁäl`Õóà ™¹rhX ¨JP Ù6}[¯±:•ÉX}Ì kÙ­Ûõŧ%ºKW;¢Ûç¿â“v'1£ë`,;‘ C¯Òç(Sc^…*­§bï‚碹UYż Õ|_ÿô<³c|ŸÅ³>Ã1må/8›mÆ6V¨?d>¶ÿsé$ÈLD܆÷º;’[Ô°o63×ÿS‘w Ï8†·êjB+g2Ïba¯¾X0ëü—ç†<‡A¨ÈÜ·$µšµ^?Bfîbߪ÷~çðÜ_ÌfG¸ªdéîòMU6z²ëÚU ÛÛ<µ’7y“+Ÿ²ßThiYïÍ}Ìàül$ ÉÏÞ!38¶žVùq,›ðÝ#q Ý1Ÿcù°ïÐiü&Ô@fîåkîÓt²}šk¢È°Oû°m«VlÕª[µjÁú¦ÇÂùI¾¶h7¯ånÝ·¡íÊt›šº|ûT)¶†{Ø[Ë9 ä>’!SÐâ!Å£U‹¹ e&ÿžP¿t:(_¥ÎQ&Ƽu³‰ôKÈä­;$/Îes+óǼâüÜ~9¯3†ë:Ú–a-=†.çúùøRßÞì÷òt~}NG¦þÊÁ5 øEeËæ~âõô›<°aß|¡7;·oFW+Uù籇$– '0 ¼¹¶d»$‘Š*~è8(€zý^p¸ïóÁûiÐûs€cÞ$Ï…ÏNÛÌ£7r63ÌŽ=Ím³ºÑYcš·—¸5,‘Ù¹“Ûô뇹qB[VUç·QWëÄI«fPX4“³òv0Là¡éÍh óêcô\V­¸à2™´µ;«5áT»°Ï2†D$0#÷É—üøùz´Êû‚6÷1<^pÓÆÂ&ÔJΖµÙoîNÇës÷žLfdˆ—ø:+ß{Ò® ¿¾Uø~’)Û½i÷\|îã_xî6Ix+äg~ÔÏ#ßWJ}Z¬¨èüŸÌd ×ß3i³bËyádÆ|>or¦ 6”è£vhÇ·7fDjÞþ©Œ>½Ž>ÕTÊý¥Ä>J}jL¬Ûð³kdÚî¡tÍOêšÃøg:yuÑ´6eÿ6­%5þo×yã˜È-ݪ˜–tì{qGJ6÷©VŠÄeÍ'>9ÇèÓ?ð?/ åú%/Š•ä£E±Ú…}–ïç…˜´Ü£d1úĜݫV~ñ—W⟞;fÂ÷ð³Áuî‰wÅúóW•æ¹ö¯gæèsóL0“ï/Š‹&Œ/EbÇNëcȨ/Ù©JQ…hñ9JÑøRš£Ìóêê½ùåå;<ñQOöß|ûÁ¢XIÌ+º~YÑÃw¿=ÎDCž‰®pÏû­sÆr1}??³qŽßÍÕ¦©Ú÷wfð2?imu7GÛw\ÎðÄ@N¢ UÅì½[l¿ç1#Ç1—·ÉK6™qšÌþ›£=42ñ©,E±½÷¼£û›/T5ŽMØ®mC:¨U¬1ìuI[Ù£ •=;~~Ì æ†w²ë3ÝøÒ»ËLþ=¾>µ&MܰïÐôîÔº<lj›ÂHÞäêgò'b–^sF2lÃЛݟíAŸACù\ãÜ6fÔÇè¹”ÅyàK+8²¿}Žâ€$’§8½‰å½“äbÛ8°nS/zµìÅŠ˜*9ŽÊ‘Ý×\#ÉŒ`?ï^ì÷ú¼dê“#• k6jƶö2žñÜ:¬-½¼¼èååÅÆn¶9ŵʉ=¿Œ$y…?Ìƾý†sööœs¯íétwbdÔÎJn`¸¾Ì½Ùdä²ö´¹;±öâœ02Óo(]ÔÊcø>¶ì¸.†L;ÄE¯õfǧ:°sï8zü Ö·„r)±Ÿ*)øê¾Å“$Gx°ñÿícâ#œÕ²>ß8BòŸqôД4q¨Yóe?fð ßmdaZ±æò ƒô)ü}DsÖr´,f¢l,U9¿µiÏå×Kñ¤XAþ1Zçù+l ‡ûôd¯cø©_,É+\ù¬ã½>½¶‘_ìGŸç^çÿDÒpŒï4°0]ŸbŸ¤ºòùo“úP~ûîPöø*§­ bJÁñ®`\(_&Ü Y|Œ-ÊOJr”¢ñ¥ G™3æµîþscw¼ÌÚZ;výæÁ¢ØhÌ+ÊQZÖ~å'Þ&·oß}cûööå ãøz‡j¹¹·¨¾7eýj–Fìcb›{DC{Oo¾·7™†KKùLÞMµ+‡úeIçy62‰ÙÔñε n|«=ÔùOõKYSb3ÙYQ›û®UµFð€NÏ Qî÷Üh©ÀE±íÓk•Ä®UØqm4É~ÞÖŽµÞ8¬Èelojjf .ƒþ¯ºå'xU ¾¸'‹<3‰õµ¥Pʱ?wg’ç Ü‘Î)XRùS/ûÂ'ÿfÔÇØ¹L*Š LÚ´õ&òÉÞôÈÑQIS&äÅGã1†A2|A»ê¥x²¸W5uÆó(ÉÐ9ÍóŸjZµäÜ $¿y·3jg%¢®ÉáþYäµÏØÖ:÷Í–óSùë T™ÆõqdÿÝ™äõµì[S[âWmÙÇ”Ø(F¬Û~ÆkLæ=]Ø~é5’1\ß©&{íH%¯,dkë’ÙݺñXþž@^^ñ,M|вÑ;ô¸Í]ÎÓ•ìˆý\ñJÚ–ôµB#E±Æ¦*œèääD'Ǫ´Ñ˜žJ2aÓ–Ÿ„“†ÀѬ]”OëOâ’GG¹]¬¡OqýÒz¾ÃS$ƒßm”ÿ›ûÆ»¢q¡`|)Ï냸WOí^h_MÊQ ^eWòú´)±QxÌkYgäŸL¸ù-û9« ^‹yE¾°ëÌÿÆ’ºÀ‰l`Yú?o1WuÍ<˜Û/fᇪæÇE•žÜv‡Løs_íõŸhÛ…/È4&sç ®9q  _Šò˜‚ã˜ÍÎ&ø"ÿ-ˆ¦|?”Lø®[þ¼ADDDD¤ÂH¡«>èîÄàŽ^ kÇvÙ'~û5xþõV¨jeCr’t€Mã^h©±BÏoo@—·pˆ!Û¼-—Æp1ayU­kÌØˆðø4è Hý ½,+;KÅ«¤šSŸ²Bw뮤nU‹\DI›’œË¦‘7Z¨bá¿+ eÜOÛF=à…hø]AfÞ‡™áøÃ?ðêŽFæ\„Ó¿Õ!½ÎP¼ÒÜ€5š¿ö:$ìÄŠ}ñ Yc#þÓÞÁÃ8슺‰v,Ťþ^pД}JiøgFkÔ­× SKapìÛLÁ/G×£½ÿHôš~‰&.œuq¼ëTC­öõ:c‚Ÿ+&~÷7V{;•Á¢Cvè´ö*n߯íÛ·q;á2V?cgöüS(顸õ¯h¨Zô,Ú§ñ¡¸’8y8Ý]¼I™>Å÷ËÆ³+!^Gvir¦‚ñ¥8r,l`¥²R³ ý]yæ(¥±a,æÕ®°ìóø{ò üg(qÌ+ñ……{'trNlØ+YgQCܯx­íÓè1x–5ÄÜCûðaÛ;ª«¸Ã£ piÇ:|¿çNŸ<ˆ­sÆâÓ‹öè?¡+ª©LíWÑyLÉqÌeçù";×nîN šA*….ÿ¨O¼$ƒªw ßôÍò[lÝ2 íc´Ðݾ† R©¡B¾ê‹…gïÂ0ë®*ÕX4ÄÄßö`Qƒ=˜÷Nü~î6TµzcÉÏŸ¢¦).sé£Bo4–Z'ñè €J­*æwE´aÁ)šéçRi,¡Y:–Sh=ØGUY,³ âVÀø)a†~sÂ,ðÖëupcó %™?6Òÿ]‡îD»þ#ðêˆ×0÷×)Xx|1ô ÿx½ þ*‰}”ÄÏ}ó°[Wp ö¨]Ëj] "®Pׂ»»-pû*ng›bk5;ÎÁŸ{?„ëÿ^ÂSã~DD©&çz¤\ ĆI£ñdÿ@ Ýÿ·')ftœYØ=7Û䔆tD†¤›=ü~Ÿ IDATÿ›4P©‹ñ—Yz@­Éõ©b}Œô‹*¨ÕªRæLããK±52â“4«W ZÄ=P¬›”£L·%ˆ £1¯BõSð|5Gà‡(è~(ø»q6ÅãtÂú½Ñ˜Wä @}yåp¥Ã8W‚âJðQìÛ ÇËû0yÚ“øü•ýHÕeB Z­œyzÈŽAh  ©á†ª IA¿å1Ç1›Kâ µ%ì,ì„ èeî)‚PIŠâ”hÜÊrDçq>HÝî3',°S¿ãžICÊ8dHÛƒ³|Ÿ²@Ä'‘RÒë´Mcôn­FøâéX°%$çÉÙ%\K‡I“Ò4sé£]"ov ½à¬Ýƒ;ºrð3q'€½+ì5@‚‰WÕŒˆc¸†ÁèÒÉ Ç‘]juR ;8Û?Bip/¢GoOX9›ãS«ðíY8¿ÓÍlš¤CXºá^7 /±ÅË5Î`ΪSH+«ØÈŠÅ‰KqbÇ2Ìn1 C>ÃʱÑjá…|»ã/Eö1Ó }ÌìÞ~¹+j|ÿ#b €Ú¹ †¶®­8Š8ý½éÀµû[˜â«Æže«°7úÞÀÖÖ~ßìþnÿ‚§Çþ„›º¢ÓJqÇyp¦ZTÑhâqЏ‘ˆ€P3äC6Ò³Ø:ÁV $ÛKÈ¢ºw«„Äå sçÃâû•vÑçð"z÷o ›Ã'‘^Šœil|)¯Að÷_`€o{T_|цRä(ù°¸¥(6ŒÆÊ* |wüb¾šŸ„%þ‘йt€2{«ÍˆsA‘ÀÔéøhBvÆ8¢žuÖoþWÑ«†Ùá[°Øo6-Þ‰5úyøùªt‹¶"J Næõ£8›> ƒ>™‹‘óý­uGãªG°þ›óHüï­{{?ú ›uïcóY žxc>l|ë¼Äu³ß&Ï@ð—ŸáèÔUظHÝõ¾ Ï.ƒØ¨ŠÎ/Åà„øŸG|¦ <º>wèq1:õÞýV‹ó—û˜k+ðŒ¬ùd?þoíWضÀŸÞ] _Õ~Œûòì½±cû$>úßçŒr:†zo(|ìðÔûK0@õÆþ75¼Z¡F^WS"z9:EÇ©‚öSÞGï;'pêj  Ñ}ô‡ë‹¯¿:…TÅú*ëšhÜÈV6ábXÖh„­î ùv8.\OU¶ÿ­)ùLjÐS±À˜Éxoä-ø%WG‹ |õ}h¾ŸœŽO¦U_X6 ý ›'bûíˆÐ)ô©¹òaä6Ì^ûì}Ï¿igcuÀUdTï wàî„\ù¸(~|)¿™xl:ŽU«¦a¸ç6,½”]ò¥ ›£)¬ 擯!ôü½¿©‘ dÄâÒ…«HÔ)‹y*ñEÊÌ›ý^\¿Çö´Â¢{p.:ZwԵƂqX.³‡Zè;c<EœDhT TŽ ÐuÔ\ŒvŽÆÆÿžÌËgñß•'0uñr|ýŸÛø`×m4¹“<®aå°CH”õKISrsÙ¹¾¨Òæô­…í».KQ,‚PA)dåÒÜELÂç³eîb!ÖO|Ê+$ƒF¸æ/¢¡qf—Éù÷åäÜU6t¼¶›³ZY›¶hç.Þ}ޱy{ÏÒ™y’ß½Z÷¾•,Êd&}ËÒƒ>ý‹—îämT‘ÁøK‡¸ú9×"Ñ‚}΢#—>n‘³À’’6 qöæü½Ì$I}ýçïbhRÎ׉ÿþÎùýïÝzÆ, mX¹¶÷æ[$¯pq;›ņQ}4.ì=ÿ7ÇdÜÝž$#:˜¿-ĺV…,êR”¿”ØÇÄØ(V4ÕÙyú6†$än2ò#gt©þàb]ššôõefë®òÛçkÝû½ECN )|‹ÉZj…ÇѸÒwÑ<•·uQ:ožÜÉCÒFe‚>mÚ-ed!êܳž™òOžhÝpy`u$©‹ã‰5¾÷ŽÁä†Dål¦”u#ˆëG·d•i>5EŸbÅÒ¾l穘ì»ÛDÝ ?È•ý\òm©4g_JWwêͯãÈT¿1¬gQÈ"&ä¨bÇ—’eLL‰ùÛN=°Ð–Ò˜Wâ • =ûÀï_åÝKOJ$¯êKgu9/´eÙ€o¬ àù˜Ìe&6O­äMÞäʧlÊî5ÔLŒ‰ˆˆˆˆˆˆˆ”·h+SõnU»¼¬b±õ? °9(­h¬Çõoú¡iH#d?‰Dѧr£K@øÙ@›„.©¥h#ÈØ1–ëšOÆ—ã]pð­®X|ßSâoÁ+d 6Íߊfö#‰9‚ ‚ %áÁjÙÒš–Õ§ïKUèh]DEm®6JÄ® ¿¾ÅB9?³1-îžÏƒÏ}ü ÏÝ&Io…üÌúyвàÓæj8iõÏ ‹frVÞQxhz³{Ú+zøÎ⷇™hÈ9Š>ù ÷¼ßšÖ5îcx¼ ¢E<1T¦OñçR¢¯"}Ô.ì³ÌŸ! ÌÈm–|ÉŸ©G+“ý¦@gcþR¢O1±‘²Ý›ö¦ØYAü ´uùö)#OµÑºðÙi›yôF&I2;ö4·ÍêFgMĪemö›»“Áñú½Ž>ÕTŽgÇNëcȨ/Ù©Š1[Z²ÉŒÓdößíQÈ3šš´é2³uWùí󵨑;Á""""""""…I!›ºsVD{.ŽhÏÅ—[rìWz5ÑäO ÍØF‘¨lX³Q3¶¶•ñŒçÖaméååE/¯¦¬_Í2·{~Iò ˜9Œ}û çìí×HFrmO§»¯ZzÍaɰ S8|@ov¶} åsmMÐIËÚ¯üÄÛ$ãö­â»o aßÞ¾4b_ïP-§ZÖmêE¯–½¸àBÑ{ãú(8—¢Wè£õää`’—Vpdú Å…I$OqzKóÚG‰¿”èSdlx±±›í]ûµ³Âø1KQ¬²gÇÏ/™ÁÜðÎ@v}¦_ú`c™É¿Ç×§Öœ±ªrd÷59ýØùÁöóîÅ~¯ÁKŠ>Eú(´s¥; ŠbEú(²-;®‹!ÓqÑk½Ùñ©ìÜûŽ?ˆõ- ˺ _#c7t¢’?+©5‚tzr°èµ}†ëbrêïØõi+<eE14:wqfŸ5Í8'¯¨hϹ»<é3ØŽ¶3¶1Óß3jêŒçQ’¡sšç?E´jɹH~“š‚éTþÔ˾O®;󿱤.p"X+F‹/ ŒêcʹÇÅè“W„øN[o"O‘üçMåO™è¬È_&ècìo9ÙYiü˜£(ÖÔÍ@]ý_uË_Ü“Ež™ÄúZóŪÆc ƒ dø‚'òŸÐßÿ$T¡>Jì\éÆŽ’¢Ø¿oGößI^_˾5µE÷Ûq÷êÉc£Ý•Ýl°lÊ÷CÉ„ïºå÷¡ÀMˆš=&qÑ¢ÉìYÜ9EDDDDDDDc)|õi½qãðÇ[ÿb^Ó¬›ƒËI€mËj蹨jÛ˜±™°mÔ^ˆF€ßdæ}˜Ž?ü£¯îhdÆsY¸wB'gàƸ’U¶ï¶—ç¹ Cw뮤nU¡1£Î%õWIô©hñcÓ¸Zj¬ÐóÛÐå­RmˆÃ6o À¥1\̸ˎM#o´PÅÂW2*€>ÓØyDøO{; ã°+ê&þÙ±“ú{Áá¾@VYØÀJ d¥fAÑŸg'àÚmÀÁÝ ºJ‡è€/0særìÖÉ ‚ ‚ B± mYzØ£ÕK5ÐaXuÔuÈùŒ×3‘®7ó ‚êþOTe`5@½‚)+ jWÆçRt_þ½ƒt“ïháÚý|ºh2zÖ¼·ÿÇp µÐ¥“Š Sô)­+ÜØÑ% ò6`×Ð ÎÚÒë£È>Y±8±c)&n÷–Óñï“3°rlÃ|ÿ¤‡aï¿@#ßö¨®d'yëzèPˆ<™ÿ–ƒ‚ØAAòfL… O3À©¥ŸŠS߯"ðûÛˆˆe™´1úÈðÞº÷±÷£ß°Y÷>6ŸÕà‰7àÃÆ×±ÎûG\7ç#””#˜7û/¼¸~-Žíi…E÷à\t´î¨kˆ ߇濪jHĹ H`êt|4!;cQÏ:ë7ÿ‹ sŸK ¥ÕÇ\:+ñ— søÌëGq6}}2#çû!ZëŽÆU`ý7ç‘nîø1$"ôT,0f2Þy ~ÉÕQÇ"_Ýç÷"Û\߆™+fáÀ´ì¯6+=èl;¸5®ƒÛ;Vá—ˆlÓìmû$>úßçŒr:†zo!oòìð-Xì7›ïÄý<ü|Õ ºE[y}7AŸÒÚ¹Â} ¾;~1_ÍOÂÿHè\ºÀ @V ÆNñö©ŠÎ/Åà„øŸG|¦ <º>wèq1:†»…ú ü±é8V­š†ážÛ°ôRññP¥Í+è[= Ûw]~°(.&6AA„| Y±VM'/+Z·–¹Ú˜i¡-än©Óþ.†&嬶šøïïœß¿Î=Ûטe¡­ÜÕf=ûÀï_å»{¯Dòðª¾tVß·Ø‘³7çï`&IêãyrMÖP›  çR"EêSÈÂV°ïÉmwÈK·0m[&%:ó—IúX²þ°Õ ¼‘»ySv,¯òauSì¬ ~òDë6€Ë£¨#I]O¬ñ½ëSEm4Îì2y#ÿ¾œœko‡íæ¬V֦Ǫ¦&}]ô¶;j§§9yËIÆêI2‹7CÎ1…ä™IžwWºV¢;WʱcéÁŸþÅKwd0þÒ!®~Îõ[§Qûh\Ø{þo ŽÉ¸»]SFt0[8ˆu­î=Ê©7¿Ž#SýưžEq‹‘Õçø™dÈ{lfizlˆˆˆˆˆˆˆˆˆµú´ˆˆÈ#+ÚSÌlú©~ïVS"H4téÿ £hà¹%= ¿é ²eËéAÌä5®ìRU|)"""""""RÒù±<(„G™*h3vžN>‡ Q)PWoŽþïÎCË”?040QÙêÆJPÙÀ­YSÔ²)ò¬‘}ço¤™ïœ4zÄþ>½ÞqÅ¡~ø#ª9:~!ÿ•nµÚOÙÿÅmñϬ˜u(Yì*‚ ‚P äȣ*Ú:ñ]0ã2sß×Õ'òÒþußÞQÙ¸JŦ=—_g±ÜXñ$mÄ'&Šëú¾FïZ÷í1¬­Í—¿?ÆŸ&·eU•ØIDDDDDDD¤4¢äƒ ‚ ‚ ‚ðx¢‚ ‚ ‚ R ‚ ‚ ‚ ‚Å‚ B…HÐUÛaòö@l\šÇÑVðê‚•øÐÇõñìÿcƒnÞÃÑÝÍBL!‚ HQ\¹PÁ©ç\ÌJÃÉymaSš#Ùy¢ó€èà\ŠiŸÖ“ƒ ˆÛÐ ¶v]°é–§ÿ¯´±_åig³Ø°²F¢™úþØÚÐlcÇÜ~mƒ™b™w ÎG”dÕîÊ9–ïÁÚ £fOÄ Í«<¤‹UE³á#š¬šbÔ’-ÞŽ7›Ø@A¤(®D¦³«Ûž6hÜ¢¬Jq$ëæS°í—/1¢¾eÉB2³ ÈNÏ þû¾ žuýøpÛqÜH'È,ܺ¸ëÞî'µùûUžv.­ ­ŽÅ§ƒqìôYü>µl¸½ü b¯¬A7GU…D³ÄS˜Õ_ŠÆN9ÇÊÝ>ÿŸ´;‰]cÙ‰dbŽªh9St~ÄrBæY,ìÕ«`ÿrøÔ©‰ ‚P¾È>Å%FëßôCÓFÈ:‰]Ä$¥#)*zQÉéHŒM…¾@ËFãñë©5èû3üß'8¥Aí'zâYW-t† Ú¯rÑÇOΞƒ'võC»M½xx>ºo€?m†`ÕòÖøiø8(‹´WÌì/c§¼ãǪùd|9ÞßêŠåÁ%ÝÛùqË¢s¥½¢Æþ©}Þ‚WÈlš¿Í&ìG’¤]A¡y|ö R»°Ïòý¼“–»sj£OüÀÙ½jÑ¢@;uµNœ´úg…E39+o—ÕšÞŒ–5îcx¼à¬ûÓ±°s-ógHD3r›%_òãçCêÑ*¯]~}«ð=]S¶{ÓÞ¤þÙ²ãºPþ5¤¡ªÁ¡þ¡\ûŒmþ÷šZ|å¯t2n3ŸsVz EýR`äî¯êá;‹ß g¢!w‹Üä+Üó~kZ„U+.¸L&míÎ*y¿qÈ}$C¦6 …R}ÌbC'>¿?™ÇǸSã4˜û’Or‚gm¾°=šÿõ¦“º@ßÚñíM‡‘š·ïo*£O¯£O5•ÙãÕè¹ö]ãö·†%2;÷»ô뇹qB[VU›`Cþ2É>šš´é2³uWùíóµ¨1É6æö—‘±cF}”‰;­!£¾d§*Eï_\Üø*×±¬@”꣪Ҝ#×âõÌœü|óL0“ï‹1˜qèÊdÃG>',ÙdÆi2ûoŽöÐȾ™"""""å&דbu4éñ,'-Å+¯íFœU}ôœø ø¡V·6xç@"@[³'Þ~k ðÕTŒ÷¢’t°tr†ÅùkÈ€˜ñB³ ØY¸ã•í~˜]Ô¹zöD‹¬•5`nªÝÑmÒ2ÌÚ¾1M;à³ Y@Ú?˜õ´V´›¿­½°çåÞ˜œÐ%^EªIKÇ©¹ðfJ"@`÷˜ø;&=_goŒïe‹} ¿¸Â_ÄÔ+é—û@‹Ú¯lÅ™ïC¿5æÚ‡ó7SaéR#sÛ(xr D³Ø0Qÿ&¡ö³-áÚžÙH{v)VuØ×[ ᮹lñôâÝX5ô"÷Á/¡IP;z ‰§a)æ~¤¡à\ û®¿}›?x_]Ƶ3žµ+×üŽôÓ ñöá43Æ¡ ö±ª>}ëC«|}ëÃê§(¤)>¹ýUüØ1Ÿ> ±nŒ>.ˆÛõN§:Ž/CeËW ÞtŸÅæ™ÃðÃEK4õ™€Z•ÅÅ òÙð‘Ï €,\Üü9þþäŒîU_o¼a‚ ‚ OŠ•‰Ö““ƒï»ãoÓ–Ÿ„“†ÀѬ­ÉùÌÒkØʟzÙ9^]¾}ªˆ'…œK[o"O‘üçM{žŒÙ<µ’7y“+Ÿ²)³¾[·ýŒ×˜Æ½íØ©˜~)±]gþ7–ÔNdË"Ρð)ƒ}ÌaC‹:øáT “âÏsÛû3øSÔu~ݧ:Õ÷´sdÿÝ™äõµì[S[Æñªü\&÷ݱ?wg’çf6¾ÇÎÅG‘¿L±–5{Lâ¢E“Ù³¶¬hþR¦BqĽzòØh÷¯d|•çX6)­Öóž"ün£ü¸,*'”V*¥ õœ+–Mù~(™ð]·ü㊈ˆˆˆˆ”±Èj顸õ¯h¨ZôD£2^ôRw뮤nUË{ƒ,‡SY¸wB'gàƸ’U9 ;âÓÆ.ÏâÛf“Ðáà\y±I18±þ%xX@"ü§½ƒ†qØuÿìXŠIý½àP&Î4ß¹´®=0cs ÂãÓ 7d !ô+ô²¬ì,ͼҞ):ëðfÎ\Ž½ÑºJï/eú(Cea+5•šUèx-ÏñUžç²ñìŠFˆÆÁƒ×‘ýå(óëQÏ yƒ)×nîN šA„òBŠb4P©¡2ý§ùYe•)t@¥V¡¼×2Ί ElÑ´­›ñ‰†Éýºÿ÷€AÏbO¢7K­ñs”V†C ßϱ¶Ç~Ìø¹¦vÀàV#:`)þÓ>g=áô×á…†®hÿ§8¤î¹¿žCÔáEð®aþJË,ç²hˆ‰¿íÁ¢¾w°eR<ÓöøŽ\‚£Y¦»•§}*š¿”è£ÈÒñˆIªÕ«VøJˆŠÆWyŽe3åL@¨ V—Cv¬¤6|,r‚Úv–@vZ†¼:-‚ T”¢X ×îïàÓE“ѳ¦¶ŒÛ<$,ê {·Z@ØA\Î0uN‰;ì]a_Š963S ;8Û—m q°åÑìix¶šºLû•uGã¶£¢nQ¸.‘·»†^pÖ–ÞÎæ°¡ºzo,^× OxmêÀêJÎ^?ƒ€ˆªhêV`3–¬XœØ±“·{Ëéø÷ÉX9¶aÙ<ÕPp®bûnÓ½[«¾f:lÙ‹c§OáèÁ£¸–n¢ Mñ—"û”>'T4)ÖÇh冽ÿ|Û£ºº„ã«<Dz)>-FŸ´‹þ8Wôîß´Ì÷®Ô6|dsB.ÖõСy"™2GAʉâ/e¶Oâ£ÿ}q.À(§c¨÷fЃ‹á˜«Myòät|2­ ü²ÑhèÇXØ<Û‡lG„©oqq.(˜:MˆÃÎGÔ³ÂúÍÿ”ú:óúQœMŸ…AŸÌÅÈù~ˆÖº£qÕ#XÿÍy¤›«Ïº«øfâ|Œ=úþ:â„ù‹¾GPd6t@W÷¿ñáœ=ˆ7˜©_)G0oö_xqýZÛÓ ‹6îÁ¹è hÜQ×"¾E†>ß¿˜‡¯æ'a‰$t.]à<¸ðŒ}JmCu5ô\´}‚ÞÆ¿G!£× d8ÖGu›KðtHFxL€ªèüñR N€ÿ‰pÄgÚÀ£ë3p‡£SïÛGV…ª?Åþ=ÓQûÀ[xfàZ„›ôN¨òsÛ÷ŒpúŒú“N¯Âk©P×x 6&Æ¡"™`ŸÒæ³û«´±}”ŽÕøcÓq¬Z5 Ã=·aé¥lÓÇÊq,›âÓâô‰Ü†Ùkÿƒ½ïùá7íl¬¸ŠŒê]ái˜ IDATR•r|UJ>â9!—*m^AßêQؾë²Å‚ B¹RôkjrÐ×F¶M1W›ò\h+9„!Q9›QdÝâúÑ-YEeÂÂ)·qöæü½Ì$I}ÇØ¼CÒ™y’ß½Z—ZSâИ¿LѹT9¡,üUQ¨ ÇT9õæ×qdªßÖ³(áø*ϱl‚O‹Ë–îôý`;OÅdßÝ6ïVøA®ìçrßñJ9¾*£ õœÚú “ yÍ,eÑ‘r•Ç|õi‘²ZÅÎá)Î>œEF­áÓ¶bSDC—þß0Šž[Ò£ nÉø©`¢²eËéAÌä5®ìR•*±‰ˆˆˆˆˆÅR‹Tn±i8„³¿ d¼þ&·¼àöðÞŽ©ÔEB‹ÿû“‰ÔñØ»Mh)6‘ñõ¨ŠÚí§ýÅDf0pfkÚ©Ä&"""""å+lÕ+AxD¨Ò^V‡0£ã@|{4^VQJð‡-i8»r Z_ŠFg‘%‘ñõ¨¢¶G£vN˜Òo|q©“‚ å‹ €\~AAA„ÇÙ§XAAA¢XAAA¤(ÇWm‡ÉÛ±apMhÄ‚9и ß{qh}T­TŠkáæ=ÝÝ,ć’%*6š#:L\Žµïµ‡Œ/AAŠâʈÜúÎÃoçâI‚º$DžÜŽ©-¬‚.*8õ\ƒ‹Yi89¯-lÊãŒvm0óÏ@,óNÁùˆ´Bþ¨Ü˜}Ê_犃ùú®²óDçÑÁYóhôKUº÷@§Æ•+±X5Ũ%[¼o6±©TcùqÅœcÇx>||ý^¬ÕÕðÌ›“0ÎÇå2¾A¡lyüö·¬ù2ý2Èä€|Õ§+»öìÇ—F¾ÊÎ.š‡²iíQ©'™²³_Ùo¥rd÷/#ÉÌ Noe[è^ÆíSÎ:W°ýcÍÕw›§Vò&oråS6F¿*ñ–g—>\u‘dä:úÔPWޱü8oÉd®±£ >Î~/ÖÎ&ŒwóŒ/٧ؼúöËy1\×Ѷb褩ÊFO¶c];U™ŸËªÅ\†2“O¨O‹Òاu®pb¦¾W¬¢Ø ýªäû€[6œÀ€tòæÚntPUü±,EqéÇŽ’|ø8ûÝ\E±ÙÆ—ˆˆˆˆˆˆÅf».üú åüÌÆù“"K>÷ñ/§‘>™‘!~\âëLõ݉— Ÿ¶™God’$³cOsÛ¬ntÖ˜à µ û,ßÏ 1i¹ße1úĜݫÖ=acÇ1[ß‹±sÊvoÚ›Óç ôQ‡VôðÅo…3Ñç²+Üó~kZ:IV³Ú³‹œ­cð¢®tR+ ÛKÜ–ÈìÜ6é×sã„¶¬ªÎ¬?ñ÷\¹“ó]Ä!nÙø'/¦úøã\9ÐZâ'_,ÙdÆi2ûoŽö0í­³Ž E7 ŒôKɹ¬ZqÁe2ikwVÉûÌa ÷‘ ™Ú€f¶³’œiÌïŠÇŽ"¿ɇ b^éØQv½02¾”Žw¹Î,vÎï†xƧç~¾‡Ÿ ®SÄ5ÐÈøÒÔä M—™­»ÊoŸ¯ELÎDDDDD¤(.«W‡mX³Q3¶¶•ñŒçÖaméåõÿìw|Í×Ç?wd/!‰#FbïUbEÄêP³tÙUZJNjm©EµÕªR£ZJí„"6!H‚L²“{ïç÷G† ã{“› ž÷ëõ¼^âžœóœç<çÉ÷ùžsÏ©ÅZµj°rIóŒ2Žôþ.”ä þ>©?»¾<€m&Ê¥ÞŽYÛëÌk}Æ@’+Þç€îéÕ¶=;õèÇÿy±ú¬u`¥µX«®g^)†¤Ø²!ç“‘+Ï¥&óä^,¥6B€°¬Ê®ý|ÙÁ³9›·þGÿHò·H ûÎ[˜Ì‹œÞÕ“}—…’¼À/|Ûsðê2ü;¶°Vî?$/e_ãžG»÷Pn*ßPÇôKI[ ’bSÚYQÌÌgÜÍ¥ãž_øn7nK!/dìX°ï¼…Ɇƒì]´ëô' ‡ÙßIE»o8Â×J«ûÏ#b^ƒ_&c~m÷0Q4Õ\.hßQJú¥¤-¥I±‰ì\ ˜ùظ+ŠáJÇ=¿x¨ÄçÆð|ûnL[Æ~…!‡Xg ;çèc•Çð IÿÁår¶ižóKË2íÇpΜ±ô.£•‡3‘â=sJÎ{k÷ö¨…pìÝy)™ÿ™„v‡µ¼àþž©2³‚…HMH-À «…Cw÷ n$åì¡`åÞuT‘ؽ5ɹüŽ•‡êj,àýËmèH QX×Á pñ€KanøHºŒÍ;¡ªã]äcúxߟ6ÑÇÌÕžÎÀÉq#5ŸÂmVàÐÒž¸3¹5z.88¯¶t{L\几èDè Ɉ¹ü|Ì ó'O¶6@¨ V4è`€•ª`þ“ƒà{€ƒ«#̞ѱ(è¼(´šÒι`Ô¸Ò>ùÅC£|¾i[9Ä:SØ9G‹¾ŒI€cGhaìüÒ!|ïLšô ö„ëäaDA(V´b‚ÓG¨ÿU6Çì-a3ÉшHjº•„QH+V Е:ݶ*94Ð#U—{ƤR©¡B~í×_œ4ufê]ÜL.\h  RoóBöýé“‹>yõ‹€A¯àuJà*|3Ãf­ÆôSñážhèÑǬFoÙ…9Uwaú{Ýð÷…{P•툯ÿœ29އzSøÚ6æ@ZLr>:?=ßPÔ/’¶½Иk•µmJ;ç˜9î…ŒùÆCc|¾°1ܘ¶ ëLdç\Òb¤êµ&.ìüA„§“kQÚë¼ßY]óåòöÖTež ¯îÅEôAûŽU`qì|új±EUtö.\܇«IEñÌ’‚¸dv¥a§bŠêi!){.Ý;7A©¹Wnxz:'‡G0z¢µg9˜Ê1AO Ü…óìƒVÍ̲þâMù¼hV^íʇp=ùéŒSâ‘8Û=#ï¦òèWZØ1øGû¢Òše¸‘ו°m˜Ôe.ü~Ø‹•»Á¢KŒÛ¥ü!ØÊë«4wf®>—>¯9 8 9>´Çíî{óôÛÖ,ÝÐÜ Ýúp§È36—M6/t1½ØT«gí.Äå–MjçBŽ{^sG±>ùÄC£|¾ãnT[Æþ=}<ÖY›ÆÎ"Ïùõü<'‚ /ZRlÝŸ¯]€.À`Çãp~‰EUæAú;>\ö1ö|¾«tcÕy ¼5S¾Þ Kk”ú4ô1bÜóœ;JõÉ/ãó…wcÚRò÷4¯Xg*;Àwóœ_ÏÑs‚ ‚ðß$»˰ÇÊ|®H0U™géŽKó ì6c+/ßO? 3öÒßœÑíÑk&LzÐ@sÎØÂ’ÔGóÔ’.tRg/cF÷ ç3.Å8Æ7˨ Ԏʱ#WF‘ ;‡Òͬpw€æªsN‡½Øys]ymZ¬ÌÔŽ/qìêSŒÔ§_rçÜÆ“<3¦ÊÃb5Îl=öG¼þ £ï:Þ ÜÆÉõ,•E¦>Îñ\Xú%$©·pùº´UlL Ûwd\QR¹ÿbúÝθ4'-’'uzxR³)ÆÝ(}òñC•«tû”¿½É¸¬ûYBytQW:çÖw«ºœ|BOF®b7gµb},«ôâÜm™yŸ!‰1¡§øë땨}ì¨ìúÛ¶_ˆlvRà?mU™oH!Ï}ÈšæE0—‹¼cs>ýRÚ–yvŸ½ƒ×²4™Ñ×sñÿJScb;+™_ù»â¹£pÜó‡ùù¼Â¹£(¶(m+¯¿§ cIìl¬?ç7¿ž±ç9}ZäY=Í¡?:šJ†-áKÖ­GC—n?3Œ^øºýc ØÓmÕ÷y–iÜÝ«ÔëCŠèæoÜEò•5ëN8Âsak{ÓúŸÈ3,Ïn<üOÅ:™_"""""’‹˜du»Z/~ôƒ£õw¸ºw¹Â½EWY³Î»ÛKPý‘ðâ[66#ûueû6mØ¡çH.ð‹'ã6³oÍ‹ñ XÜã.’³¨ØdüÆ2™~“êÓF%6yÑ^ˆ<ýxøŽu2¿DDDDDž‘Ó§ŸlÝQËâ0&¶ôÅ/þÑ…;¹“‰8¿Ðõ¯öƒû™ ¤>þhK¢vÛ×1­O]8™0ÜGСÕé5 Âå\Ò"w!gÔvpo숽ï·Ä[ Î b’Šg!ÊüA„§Š €ü‰AAA^HÔbAAAA’bAAAA¤X„b„ö1vƒVô,M‘´ E¹àUÎLì#/:¼¼`/oûçJñç;Ž ‚ ’ y¢‚£÷\MMÄ©é`U˜šlª Uw_4w.Dê ­‚±g ˆZá k›Öøé®ïºAû°Ï39ú6 1i»æwˆÇÅÄ¢ù‚¿E þz5öžÝ€áÕ­ž“qWbŸÿ¶oäÊuŽ-¢B‚ºû=µãêXŠ}žµ¸ú,õKe w¯öðôpx¾”Ä1AA¤øù›JuQÅÌ uÊ¢5YÖ~ëþú¯U6/x%Ô!%Í€´¤40û¿Mý|Sm~8‹ãçñ÷¸z°hPîÕ¿yc Ú•P™Ü>¦ÑǔϷ%Ðî«Í˜Õø&¶é‰ù'ÀPú¤œÇ>]±8¦;–íþœÔE2î&·aö)Nß06i±®ñÖÜ""Wx¦(#G™ÞXùÇ'h±C;·EÛN0~á_8™ö Ûç«Ï`¿ž;”Ä1AA(r7ÕÓ=Ý›6f%Uáî´m¶wx‡ ›Y¢ž’|eo/}Tƒææµ9%0Ž»º—0qŸmØêÇP^™Y¶ÕÆóLÔf¾\Ô”íË?"nr©·#UE`“éc"±¨3•—™Âƒ#+Ó¬ô1¯6’{“È;KÛÑAeêq7½Î¹Û§8}C¹˜97ås¶1˜éD­ð¤MQÞaÝäÞb—µ´.òØ"qµ°qõê×s|o{þqLDDDDD¤À"F0ZÔ.ìòÍ~^‰HÌxüMeøÉßù‘OÙGÞÕ%=9fñŸ<ΩEÃÃjÒ Æu(O09=¤¨]Øeþnž ‰arF±×vò«^n´È,cÓš+ï2Gâ7t Qý³fËe—¹£WIBåÄ~»/si kÛБ¯ìÀC]©qìÉ}Nqd•òì½!œ!ßw £:½œ"û£>¨vhÌQ?eHB†Nú†,c§’*£qÏådØwô´-.}ÌY}b™vC*hL<îÊu.¼}ŠÆ7ì;oabü&v´+Èï[²Á¬ øŸôíÇå·‹0)Îc¾_œäA3SÆ€0/Ï—§nâÙh}†=`è¹üº³3ÕY‰– ÛŽ_EÿÛ)$É´È®›ÜŽÎåñð¿WüMÉGå>oÁ 'ó—ÃAŒ5dÙ îú¸>-sLŠÕ,ÙvϦéxvN›ô¹ªÐ74åúrM`,Ó2Ê$Ý:ÊG6¢}Æ|·jð)w݈Kÿ,ä0Wÿ¸WãI}ô .ô-G­þ£,މˆˆˆˆˆHR\|’ùPø5tò¦O÷¡œ½3’ä .l["kE̼Ög $¸â}èÞ‘^mÛ³S~üŸGF²¡u`¥µX«®g^Éå!'³­kßrP·Nìä;˜_ì½Oò4'T7O/£²b÷šlÔ £Í5ý±V­Z¬U«=ÊY?|pU$*Z•õ`%;55íܪ³¬•©W™¬Ùâ»P†­êÌŠ­¾eðÝ?ùæ u ý‘Jª³õ]}ŠSX³å²2ñ0ç¼Ñ‘-›5g«Ž½9äí¬lnd›– 97˜ŒÌ1q*:}Ôe_ãžG»RcÒqWª³)ìS4¾Q¸¤„J•>÷­šð›[E˜ç:ßk°rIsÇ–ôZL2”›>}/wðáËo.à5’çÆUMOVUvlùÕ2å,W¼çË6-Ú±ï§[É|»rVâ“<ü/ÇU…SòÒG‘ÏkY~à¼G2jß"~ðV/víØ™=^Á7›—L×ù‘¤XË2]æó\j2O~áÅRj#ô˪ìÚÏ—<›³yëÿqôO$ïpqÆ 5ûÎ[˜Ì‹œÞÕ“}—…’¼À/|Ûsðê2ü;¶°Vî?Ê☈ˆˆˆˆˆ$ÅÅŸg(±jÄYA¤ÁoËk²?¼%ð»|ê«ÄQ§óyxËö™Öm4O“üwx…Gž¹m~ym5­ØŸ+NGð~ôE®ûx"ÿ»Å•]Jåü ™—}ŠUŸì¶-…¼µ”]Ëh ×f‰Ü£'qͱÏE¦y ~|™ŒùµmŸæ˜Ò>Eá…NгbA'ÅÆÌ÷BÆM…¡ÌÛnÜ–B^ÈØ±`ßy “ Ù»$h×éO&³¿“Šv60Þp„¯•V)öŸâŠc"""""/¦ÈI¦"é26Ž7Ü‹ø`LÝÝ+¸‘8”³n¯¨I Y‹¡ KÃÁ¥-~©9Í}+ƒ!ò~N.ï‹ fÏ¢>±Ø=þ=l4ŒÀÖ°;øwã<ŒéV •™,Ô@jBjއY™>i1¾8¸:ÂìÓüìc*¬š-@( ’¸ÿÏÿ`eÓ;¤ÿ̰¥hiýb…±Çc‹•{ÔQEb÷Ö@$çfCÔÕXÀû—ÛÐeØ’†(¬ë`¸xÀÅLâjqécæê Ogà䊸‘šOá6+phiOÜ™Ü=œF×G[º=&®òCPt"ô†dÄ\þ>怅ù“§x TP«t0@ JU0ÿ)Â8&‚ ¼˜HRl2¨ÔPÿ«“E¿`€Î¨Ô*¨žs÷sêü–¶ß‰zb\ó½èYo.wŸ‡OšXÂ>E§OÒ¥eè]­4šôžÃêö˜ºùÂŽÎA'㣙ˆD ¤[É<®=*}Ôæ°1Ò“¡šcjûÞ7’ÏÍF‡zõQ¿~}xŽ:„´ÔxÇ3ýçz^Óô܇¥BÅ•Æ葪Ë=cR©ÔP! ¿ökŒÚµk?"µZOÃÙd‰«#}òê ƒ^Á«¤ÀUøÞ?g­Æto'‰÷cú˜UÃè-»0§kVé†Z ó ¯áŸ[2N=ô:ýc'ÈЊ<Ž ‚ ’?‚¥½ÞÃì9cá]F[ÄežsÌ*«]Y ð®ûÈÄ%°+ »B,Q0%)°³Ýóacu©Ž˜»ÌG~€CVaqc/Îß:ƒ½!ö¨QÎÂHûÞÇ듉“çalφp­;—šNÄÂaÕŒ[±H ÄžK€{ç&(¥.F},ÝÐÜ =Š”§9¦&°)æ“ÂpåÜYœ={ç¯ß‡.-A?Ÿ»|‰|ÎãR!í“rÁ(‹ÖžårõïÄÀ]8Og´jf†KqñâC¹t-I”¸Z\cšv þÑ@£Á¾¨”_@ Û†I^õñÖzgLØuó:9·BnåŽõÕZ23WïÁñ€Óð?äà\^$Åíî{ó6XÅÂûOÇ1AáÅ#ï¿òÖMñùÚá v<·áGXTežGšNÀ¬ñ¶Ø˜÷~ÓðEíXlèµ!:#ë1Äâ‘P`Ü|>2 ›"JÀÍò–¯ºcžSnùã|Òdô˜5ƒfìD¸Ööǰüç‹xæ¼Ô%á=g9º…‡!Ùç6’KTF)«k¨âðA©ÆÙ§°>¦H{´š6=cöb÷É D§X¡B›p…WÞXÉÝmüóÓ ,Z4ª¬Ã¼kiÅ¢mÃèZ* ¶^7ýä1cZXû˜xex¸»ÀÂÊ.€¹“;êԋÃ{A¸r+ûx¨`ßr6öòÞA ߥJ+"¥ iŸ´ Õ˜»ó3ü4w–è§ãÏ›f¨ê5 „d”ÑßZ‡IßNÆñ{±¿ät,Ü€ð4”ó¨ˆ{᯴ ®>#c Ó?Ú>Ë—âø®z˜óã.\O†ÖÁ•Ìü°â·ËôIWñó›-‘L¬ý{;bZyásÿʾ²„—.ƒ§`LÀ"N€Ú©*¹Í½ þS¤qLAxaÉã>Ä2ì±ò:Ót7ùË+es>\ÃTežÇƒ¶œã¹°ôË(Roáò!ui›í°ÅÂÔ8wàŒ=!L!I}4O-éB'u.‡ÏØys]ymZG¯N9+÷_L¿Û—h¤EòÄ¢NO}fDEGïe¼¾ž½Êd\©a]ã·žgÀñ³ ø}(«™+´I|L¡>vœ±…g#’³nEI?Ë-_ô`% ãí rìÈ•QdÂΡt3+}´•ùöò܇¬iþôÇ´àö1Ò7”V¾#ßz³]Í xðUãy Íáúžûk¼; ÈŒîÎg|zŒo–QÝA[&ˆ-jÇ—8võ)FêÓ¯IºsîãIžSåáÉÀg¶û#^Ñ/ïnãäz–ÊãásW 9¦Fé“Ï«¬X¥Û§üíèMÆeÝ!Ê£‹ºÒ9·¾[Õåäz2r»9«ëcY¥çn»ÀÈÌdHbLè)þúz%j;h+»þ¶í×ò!›øOñÄ1‘XÄNŠ‹ð4d‘A4téö3Ãhà…¯ÛíË •5ëN8Âsakû¬ëmÄ>Oé„C‡füèh*¶„/Y?_ºk«¾Ï³Lãî^¥LëGÏy\}žÇô¹‘ç2މˆˆˆˆHR,I±ˆH¾yuÞÝÎXêxüƒê4/Š6Ôl2~c™L¿Iõi£û³P"Îÿ¾¿íŠ{ò÷u÷|ù> MÀÄ|Úºµ›¶ì@,€=g¬ÑùÆBôk[ó®„BÏ$„_½„ûŽÑHE*¢¯_ÂÅ‹Iâ•‚ ‚ ‚ Å„´•t›w„CUÇîVEÛ”îîÜHÊÙCΙAAA¤ø€ €J •ñ¿š…²ß5@gTj•ñm ‚ ‚ ‚ ÅkQÚë=Ìž3Þe´E\æ)aV^íʇp=ÙØ¤8qÉìJîK¿L‰G làl'‡ ‚ ‚ ‚ 'ygaÖMñùÚá v<·áGXTeŠ“¦0k¼-v¦Á½ß4|Q;zm@ˆÎÈz ±¸p$7ŸŒÂ¦ˆp³<‚å«.Á˜ü:å–?Î'MFYS1hÆN„k]áa ˾ù†± ‚ ‚ BÑ‘÷JqÊ lÿçtú`lß~)EY¦8ÑÛ¡õ?bÓæ5˜éÁ M0]Q2fÆÌ½f°pþZ;oµpƒ­‘›ÒywÞ¼'Ë›·cÛºÙx­iXËævAAA„"E…G¾ûG[cOaþ½WàØnbeüAAA^hd-RAAA¤XAAA^4^¬íÓ‚ ‚ ‚ ‚ Y)AAA$)AAAIŠAAAA’bAAAA¤XAAA$)AAAIŠAAAA’bAAAA¤XAAA$)AAAIŠAAAáùNе(íõfÏ ï2Ú".#‚ ‚ ‚ Åsë\A’däò–´.Ê2""""""""""""""Å,y¯§ÜÀön@§Æöí7R”eAAA¡˜QedÇ‚ ‚ ‚ ‚ðÂ!m ‚ ‚ ‚ ’ ‚ ‚ ‚ ‚$Å‚ ‚ ‚ ‚ I± ‚ ‚ ‚ HR,‚ ‚ ‚ ’ ‚ ‚ ‚ ‚$ÅY¨àè½WSqjz#X=õî(ÓGeS­ºû¢¹³æ…pSõýE¶¡ ‚ ‚ /DR¬‚eåîn'd*î^݇e£šÃQýð×m*ÕE3+xÔ) ‹g ;Jô±¬ý>Öýõ^«l^Àv4(Ùüm|·'÷t™†¨sbj§²Ðf/fQ3‚òQ9Üß ª§d¡Â÷Ý´õ‹W¸¼‚õ¡)Ç@7ý×â“ή0ËìOƒ9¸É¬jk›í7máµæ>x}&êY€<&]|b<ÉKø°z¦´p{7ä>ø:ä¬C÷=09ÔCP·ÿsÀ$‚ ‚ Å…6·ÌÝ߯æÓKàù'f¾; ‡Ã4(ßÀmKk¡3d–ÒãÖÏ/£Æ9w¤^<…اÞbÒǼ/˜¯ÛË0±÷!ܱ¨ƒ~Ÿ‰)›íp½JGür[Ÿ‘;Û ¤5puNWôÿí6tâ‚c@ñ½bCeVnåÍqî#/¼ñOì\à•æcú¶ªˆóh‰×ÒÖ”†›?tGÝláÒ}öLWᳯá¯Èܹ‘¦XŸ¸}CP·¾=4PÃ){=Q@7âdÌAA¡8á¢)Ë;’ȨUüŸ³š9•Ѹå fcO–È¡œº¤'Ç,þ“GÃù 5³p O¨Ió¬r¬Ðy29ÄXCz ýƒÜõq}Z„E=μNÞ_ãEÛÌßqðå>’çÆU¥™R}lZså]æHü†´ËɹˆJkNM¶ŸmZ­`c¹ºíÃrv>ÜŸÆý½J*®· ¢vhÌQ?eHBF‡ô XÆN%UFõ]S®/ׯ2-㳤[GùãÈF´WaCã¥Hç,,Ã?]gšî&y¥ì#vW"™¾q¸¿UÿgQw:ƒ˜À?|쀖 æð&c¸ªm¶ñƒ-½ÖÜ'¯Ïd=‹ìuªYúõ£$ñÍ2Ï-ÝÞ ¹¾ùé–W="""""""""""Å!9®«;àmK\ý|6vFr̤õëÑ»æؘ¹bà†ø(—Œ[[Æ£Þñ~‡·?¸€°û:˜;:Ãìb0RÓK üÀ58ókOè÷/ÆŒÁûpñNÌ]*ÁájhF™üQ¤O⿘üR-|Ûø3ì\ãƒ]¯vÄô³É]ìM$ó&A— ýC‹Á®BEØ!§o§<\¡´rAY«ܳ*‹²%â›ZD+ÄÖxiî6,êwsßî„¿.߇ºDT¯¢C`<ê»þÞI¬úôMüp+qjg4< —ü¤€ju4Ñ„6T s&•Ñ¥keh5@çΕañG j*•¶å¢×˜p‹ÞŒ÷ ‚ ‚ ‹KŽI±y¹z¨¨J©£!¹'¥ºû¾|Ð&àN¾J"Îÿ¾¿íÊa_¨ÍK˜2¿'켋ê!(µ€=Q¢“~õî;F#©ˆ¾~ /&Úˆ–C°b‰î,l‡Ù¶âš9”BâíT´[yw4€.ô¾ûp&ÿv‰&ÍŽÍQªB àÞyعGÂuüq¸ }O¶߃²~ô?§BכѮMy˜ DšÉl¨@ç,÷9)¯ŽEl'vÎ?^à„ØsM k2 ÆÊ>ðO./}AAAx1Èù -ƒ°X¾÷jæê Ogà䊸‘ú¼™O»†ïã/ÿåh²{|&@l6£¥^ý*–„­V ;·V¹³4Fÿz‹;8šø ­Xìÿ6F`kØü»qÆt«‡ ­-ÝWù!(:zC2b.ÿsÀÂÆÜÄ÷w£³á{`Ò¤o°'\WàÏNn‡ £…÷+µðú¬?…5ÊçþÅzAAA^̤85â2Â`ÊeΛ+Ìž"@=ólDo4æÚüÛ(¬>F˜®DË)Øud<þì‹fW"(%·²zÄûaŘ!ø>Ò¯ ik“tizW+&½gã°º=¦n¾€°£sÐÁÉˆÌØ¬FoÙ…9]ã°zL7´hÔ} £_V(/“èlqÁpöÌ)Û» KÆöÂ;~Nè5ñTÐ4è`€fšG_zhÍ4/‰AAAxa’bCÔ¬>NÔ|o<Ú–Ìg})ˆK`WvÈeÒÂŽÁ?h4Ø•rËÀu1½ØT«çü–õèÔx¤ÀÎv_#Ô–?o›‚rk{ÁsØz„(IUê¢MÔS#qrã<ŒíÙ®u'àRÓ‰X8¬Ú#/6ò컕:ÖW#hÉÌ\½ÇNÃÿ?‚“Œ´¡1ã¥@g@‹Ò^ïaöœ±ð.£5™ëk5*€zèîÝD4ìP«~é‡+ÇfeР¦ p÷&bÒ$X‚ ‚ ‘œ3 ÝMüþÝU[0ìû 8Õª§ÌæãCpùz,t°E“÷?FǸ“8}3‡jð2Ã\"±ò‡ÓH¥‚}ËÙØ¿kÊx-|—"Ȩ$Ì­¦ÍCϘ½Ø}2Ñ)V¨Ð¦\¡ÇÕð„GV9óì{r\º ž‚1‹p 8j§f¨`õd‹yÖ£h¼”ë ë¦ø|íŒp;‡Ûð#ú^±]Åê¨^½4¬œ*£Å€ÏðõK:ø½»wô€>|'¾?Šå3Á¬èϰéš½§aZ­T¶ ™;UƒG9[¸T² BÅÚõPÏ9w®\Ct*“Êuê¡^ö¯ÑëbqýrâeÙYAAž)r½.Æ¡á`~»ó2ïêÒoÌIà¦Ýèª}ìÊ眱'„)$©æ©%]è”q…y­Ï˜íê›EeÅ*Ý>åoGo2.ë~ŸP]ԕΙW™W`÷Ù;x-«@2£¯æâÿ•~⊞¼ôIsV~·“Ó«J‹ä‰EXJ­ðØn³j.çk‰è?ˆeÕ 4¥ÙyÎ?<–˜y¹ïœÚÄ™½ªÑJõxftŸp>£\®çѸ°ãŒ-<‘œ¥FrøYnù¢+Y<^>ï¾[VéŹÛ.02³*CcBOñ××+QkD=ùŽ—1:kʰÇÊ‚_ɤvy…ïè³ R"ÃÎíàâÍè˜m̵.^œüû)†g\–~Š¿Oö¢‹öá8yLº˜Ã _â‡ÕÍ»’)R¶²‹½\É$"""""""""ò,‰ (–ó´„|P;4Ãäí‡1ÓmZT}ÇÅ&‚ ‚ ‚ E¼û `U­ÞÿpÆ5‹Æoýfà„$Ä‚ ‚ ‚ ’¿0غ£–ÅaLlé‹_ü£¡‹‚ ‚ ‚  ²}ZAAAxaQ‹ AAAIŠAAAA’bAAxÊœìcì?¬èY1Ç3Šå: €W931… ‚ I± ‚ ˜ •MCLÚî‡ùâq1$Q¾xV±¨Á_¯ÆÞ³0¼º•ØCA¤8ŸGX×x kn‘+4åágúû¸é¿ŸtvEöwá*kôŸ· WãÒË%†øáû a¯Î¹ÿ¶õÇaOÁ«SQÛâ±5å1ø$qöw˜Ćê’ðüàwœ¹kiÀݳë0¡U©¬%öQlÃ|uÖÂíÝ€'lL÷×xÁlZcå]æX†‘ËÑÒ,P¹× lø÷6’H);µz9ç²r”›è@eWC—ûáV2Aê°“Û=Þ– –•»cʺ¸D©¸{u–jGµþ£¤­|ÆTI¿”Ž©²¾§‡ »š¾˜´üœƒ>ù8Þ©¤5ÊòŸ;¹÷K¿»—Qâ«”lþ6¾Ûˆ{:‚LCÔ¹?1µSÙlGóÑVaýPѼPâ b }C¹ÿ(ùsQí¾ÚŒYOab›ž˜ò Ù?·ª†¾_mÇå{écʤp\عý*=««•™ã¾¾ÿ±'ˆ”óøÂ§+ÇtDzÝß ““¼gAž_X”bæÜ”oÌÙÆ`¦µÂ“6EÐŽÆu(O»•èãžëcɤcür`;6oý ?ÚAêü9ÎÃ<« s÷‘ÜOòú&ÎÚ“_îÍ¡ÇUÓ^ŠÊ(ðUóêüàX/oœÁ¡=:±k¿ñüù²LÙÃ7\5ùÚùñ¶ ï‡ÊæEþ¾¡<ÖÚ7”úB±¨3•—™Âƒ#+Óì‰Ï­ØøË$op݇ýØÁ³%½z åg_ÈV%T,ê¿g“ÌqßG_<£:NÌ«äÞ$òÎÒvtPý7û(""""òŸ—¢¬Ü’ f]`xÀïü¤o?.¿]ôIñáþNYI©Eõ÷é¯#¯Î¨G‹Ì²v>ÜŸÆý½J*¯§ît1øØ¥—³jʷɈe-iõÚ‚Ë"È›sÒ2[}êRùÝõ8žüÜ›ÝVÝË!)¶`Ýéטzn"ëÔÿ„— ·¸ ©•q6´lÈ/ƒÉÄmýXZÑn™þÜžDޜӀ– í£Ø†ùê\€‡@MöÙK†.f»<ní»þÍd^ç¬úüÞvÎ_•Kîד—>¬žõ ®r|™·¾iB+€Ð”åÀIdÔ*þÏY]`ÿQÔ–‚1UÒ/%cªH¨h×òÅúqBÛ'^ü(žƒŠæŽÿQêcùù*¨ÒšS“íg›V+ÅX®ngk´?ÖÍ E¾QÀXWßPæ?JņžË#Ȱïèi›ÃçZ7¾@ö÷fɼêѺ°íøUô¿B’L‹ àºÉíè¬I÷eçÞÛ™Â.oiý˜¯‘Éÿð•Ì—nyÖ“þB ËüÝ<Ã䌗–®íäW½Ü²ÅKeã®)×—kc™–QOÒ­£üqd#Úgñ@îב¡ó³ÛÔ]6%¡óØØÊt¨.éÉ1‹ÿä‘Àp>HÍh1<<¡&Í3Ë84樟Ž2$!ãc}Ö±SÉœâ³9«O ÓrH¨-a¯„=€>s ŃsØspm^ö*@íÜoûXâê¢ÙØ¥ ‘\üGI[Ó‚Ì %ú@í‚®SßF•#ÞÜr©Ô!.ø~|§ ÔFÌA¥sÇT(ðUêR³ú ¨aW¡"ìŒÓ·ÔÆ~¨d^(õ £b]!|C‘ÿ(/øvrAÔÖ_ŸÃçº{8æ.TM†c@]Ûœû¤²CËÙ‡°V}œ›Óm[zaàÂÛh÷ÅlVZwýŒÃ:téSë¡/˜WEÏ~Uzp%ߣ‚z¨mQÝÛuRWad÷ÎèÜc‡4Çø ›ð^us£F[ï$V}ú&º´z /µé† »JaÐ’¿ñEóô=󆍸õ_ |—Npˬڪ^nnûÿF`2”é @[Æ£Þñ…ÓÁ9x»w'´oçÎ=ßÆì¿‚‘ °ÆKs·aQ?=ÖŒìÏæ/¡u—7ññÒŸS|NÅÕU_á ÊC|ä`4AA¶Oç.VMøÍ­â]),Ùè«`2~#}ì2·¿¾ÇÝ!÷¯Kù²Ÿß¬NkÕ£õ<ÊMþÔ»ü#[ù¬j çú[$cNóÏ•ë—À³Ú±”úáê@ÅAÛsç¾ì¬&`Ã6??¹RlÙè+§üËwÜ´ÌXýË4Üþ–ͬ”Ûвї æþîíÂ&ó‚IFp¹gúlL o|Áú–Êì£Ô†ù뜹2ò8Ù»dN«:•ùÎ1=yúz˜åðæ¦Ìk<”1^L>Æ)Íí³é§ÄÎ ô±lȹ7HžŸËN,©‚†vn>œHòßá,¯É´s"7u´Ë×óôÅmå=¦Jú¥hLè[o®‹#c¶Oçë>ÍØ Qk¾:Û‰|ÀM½K?²U;?ÿQ2wrî׎ËÜ‚®¨Œ‘ó  ¥Ç0þC^ÿ¶-K¨ŒÓÇ$~¨`^(ó 屮о¡¤ŒÒX^¢÷èÉãC\ŸØ–žJ4ã¸M7¨gh×MšdHÃÁØuÿÉÚ-jÇÍS°mæ/¸–öä熨Íx£ÑKhßs$橆©‡÷aJ##ì¬@ŸäÌèû¶Ø}€í!I0P‡7¶b’;qqz=  ¢“póô%m5¦Êìœë˜*ÐGmëŠ ¶ÀµËðÛ®ã8uk>†ÙWíÐmd”T)õŸüçÎCNáýVõQ¿~†Ôí…ŸCÒŒ(cŒ¯ª`×ð}üå¿Mv‚Ï„xrÃBîm™Ì˜ùù†ÒXWXß0ΟóñJ3+X¨Ô„Ô\ç™!ö8æõ¬Ç½±øZ5ŒÝz wÏD{§ôõI+ÔÕXÀû—ÛÐe0fˆÂºf€‹\Ì"°sñ$U쇵­X¢öo¢jÌ&|»/TZON‹Ùw¯àF"àPÎÞ¨Sméö˜¸ÊAщÐ’sùø˜6æ'bêpkóÔ×Á›¾n0ƒ.žÝQ]w«ŽÄJç'‰Åîñïa£a¶†ÝÁ¿çaL·ZpÈ«Ci1¾8¸:B.hAd¥øYZ)V9±×Îԯʛ–\AÞ_Ûž¶¹Õ£.Ë7È€÷Òß´Ûyqe4yé“ÚYßS—ôæ’[dŸÝè¨RÑùÕCÌ•´c^QCXÔá´k9¹6­n¶ï¤åmCM¥wxФßk¥®®¨Ëò­c$OŽ`2û(²¡"Y±bÓoo“÷g'%«(víøc»ºm¡ÐÎFécÆ®UYÍ­,jOâ9’ÿŽr£ ºì[î? ÚR2¦ýNqîó"w}TNýxˆä•Ïje}çªRì{ˆä™1¬¢UØV¾sÇ„ß)V<¿Ô,Ñr*%‘7~êÃŠæÆ¶U~˜û¼PæŒuð ãÊä7¿}¸1!ï9ö¸˜WÂâɰÅÍi ÐÎ{ãÉU}±V­ZHÍj¥i•±ª¬rèÀ_ï‘aKZÐÆ® WD’·4Ëú®»¢zrX)†]ú®ŠkÓê(‡fÕ8ö¸ž¼»Óz³Yƒ†lÞe§d¯„Ú™½¶$W>c-KgöÙ•BÝ¡AtÕ¡³¢•âÌÕ_6î5Žßl ` ÉÄãsØÁ)—ï k*pÄ¿dÊÖ.´—Y).(Z”öz³çŒ…w­Ij4¯ú*>ho†ëë6âjn_T©¬•ª¡Õ¨êa  -Y õK¥âÆÙ;Yß4Ü;…t°®T âÞÖ×P³vmÔÎ’¦xkK”K×"”1yÿ0æ­F™ãÑwÀd¼êtóFbæ:¼ÂzL‚•:ÖW#hÉÌ\½ÇNÃÿ?‚“žØ6ƒsE„ÇŒêàƒ7Z‡—oG˜¾ˆtNÄÉó0¶gC¸Ö€KM'bá°j9¯[º¡¹z2Ôôg‚ B‘g¢EŒÊ² <Ü]`aå ÀÜÉuêÅáÁ½ \¹•ððþIë¦ø|íŒp;‡Ûð#Y'ÆP¢z4k‘‚²õ_ƨiàpÝ IDATãñÒÍEèðÕY$lÑäýÑ1î$NߌÁ¡¼†LÁ0—H¬üá4ððâf»ŠÕQ½ziX9UF‹Ÿáë—tð{w;îè]„¶_3ÇäocŒn>ö„Ú¿ùµœya:@ÿ —/f×ÌN1i@r$®]¹‰Xn>}P#á(ÞÝ€‹qYCä†ÓÐõ탮_áÊM]þ6L>‡%³öãÝ¥?`ÝLk|åx~°Uû1â»óH²¶ñåeŸüË(Õ9óÿíQ¹N=Ô‹Ëf],®_A|ÆÀkË´‚OEàÜÔsÇT¡­œ"_µ@³¿FwÕ û>NµêÁ)3ÿˆÁå뱊’:½ÉüPÁ¼PäÊc]¡}CQ…èn㟟N`Ñ¢ñPeæ=¾o\[}¾šŠ†Wwbÿ™`ÄàÑi,¦6Î~tèo­Ã¤o'ãÀø½Ø_r:n@xš ÊyTĽ‹ðWÖöúdœýîKø[„— [ûâ× ‡í)¯G)yŒ{r\º ž‚1‹p 8j§f¨Ãé…ñþóñÍùáøâ—%€ú^Ý‘õwÔt:Û£Õ´yè³»O!:Å Ú´€+ô¸ž€œFÕ¶á@t-† [¯KR,‚ <—éR´Uãy ÍaGáý5^Æ¡)Ã+¯3Mw“¿¼Rö‘+R”ˆÚÙ—¿]‹§!£þÄÛÜ2›d¿_WSšçüÃóa‰™—^ðΩMœÙ«ZÖ¶2µË+ÜxGŸMÓD†ÛÁÅ#šÑQí°›ª}øåö+¼Ÿy[ÅÝKüçËÞ¬b‘ûU#¼£.Ë×êÉcƒYNýø½Åxzz£,ÕJm¨)ÅVÖñ\LÆåçÖsbëRYvTbŸ|Ë(Ö9·…H¦leû‡¿gÛvcùØÕ(™[÷ªò­¥{y1"%ã—ãúïNïY…–*…vÎó€£ìúX±ÙÂP’)Œ¾z”ç¿C¯ò9Ô¯¦CÃÁüvçeÞÍ8À(5"€›ft£«V©ÿ(l+Ÿ1UÒ/EóB©>Ú2ôùlÏßM¯-)x/çõ©òp´¢¶”ÌlŸVê«fÕ8þ\.Ûžý±¬º %ÔÌ %¾¡$Ö™Ì7”Îe¢rìÈ•QdÂΡt{üà=óÊì;{#ýoÄ2óì½Ä['¸îÓÎtÍ^VãÌÖcäÁë2Jéx/p'׳|´>U v\u—ä Îml•ƒó©Ç¨íÓy»e•^œ»í#3ïv2$1&ô}½Òc[ÐÕt꾞÷IÆ®íœí@8å}Ïwû´Æ…gláÙˆä,U“ÃÏrË=XÉ"çCáÞ>Bžû5Íe žˆˆˆˆˆÜS,"""""RÑÐ¥ÛÏ £¾nŸíTr‘¬¤¶æG¼vƒ_æ”È·¨¬Yw¦0˜ [Ûçx‡¹ˆˆˆˆˆˆ$Å""""""F&ZuÞÝÎXêxüƒêw{‘±wg³æMøR—Qüùj£Öö`iÍSÖKíÀ&ãw0–Éô›Tÿ‘«±DDDDDDž')òï ‚ ‚Q0çú¢þÕ~p?„T±¬ëOÀúƒÃPÑS¿Ž†÷¨¿¡ÊJ©íàÞØ{ßo‰·œAeœA„çUFv,‚ ‚ ‚ /j1 ‚ ‚ ‚ I± ‚ ‚ ‚ HR,‚ Où“}cŒÝà‡=ËdÝmºÊK ùèo°ôÃ&°yždáŽ×g.Ä”N¥Mo£bE‹rÀ«œ™8¾ ‚ I± ‚ ¨lbÒv?Ìï‹!‰¦?øB]-†ÁˆNð\§a–µ0ø£Ñè]ÛöùþcnQƒ¿^½g7`xu+™‚ Â-)Ö dó·ñÝž@ÜÓd¢Îý‰©Ê¢è޽VÁºÆ[Xs‹ˆ\áùÈ*€ÚÙ«¯ÆAO‚$nÆ–yƒÐÈA£iìjúbÒòp:4úäãx§R¦Ö¨Ük6ü{I$È„Z‡½œ³ÞÖ«]^ÁúÐ0£-êïã¦ÿZ|ÒÙ5ë!LIPY{ ÿ¼]¸—^.1Äßh{µ1:§?z~ð;ÎÜ5€4àîÙu˜ÐªÔÛÖXy—õÉ.‘ËÑÒú¡-+wÇ”u'p;‰ Sq÷ê>,ÕŽjÐÂíÝ€ëÑïî(­çÑqµ­?{â^ŠÚÆõ]eWC—ûáV2Aê°“Û9?¹º¢)Á‡ô ‰³¸?ñÀœo=Šm¨°_yê£ÔΦ²Oþã•¿¯æL7w”ØGI…q,¿ùe2š*Ö)é{þ±Nyß•†ðh÷ÕfÌj| ÛôÄü“`Èú¬4ú¼9 ,3¢qÝi¸Fâäˆ &^-5f~½°¯/`Uµ'¦ÿq᩾z¿ocbxÊy|áÓ‹cºcÙîoÐÉIÞ× ‚ ÅOÑÝùd^‹âå38´G'ví7ž?_6){ø†«Æäí™97ås¶1˜éD­ð¤M¶Ï5®Cy‚äù)]زMg¾:î;úÅ’¼2Ÿ^ŽêGîȬ=òÞJºÃ+>ãðÞÙªIM–¶Pe”ѲB¿o¸|ÆHöíÚ‘/¿:+/èÈ„Íìé¤z¤­³¶cƒMÙúåaœïONpL53Åe ²g»åadâQ~9°-7iÏ·üËÞ審2Bg·áû˜Ì8úr»wÄ/Å‘É{9ÌM›q礫6iIOOÏ,iÓs&§’á¿øf݉iî>’;ãI^ßÄC{²ó˽9ôãï¸jš'í2Ûz7€äIŽõ¬ÇzõJm7;ª¡´ž‡bYs4wƤðnÉ«SYÛÊÇKížëcɤcür`;6oý ?ÚAêü9ÎÃüQrÏ3©w¸coym:ëfoGI= m¨¨_ùé£ÐΦ²O¾ã¥ÄWÄ“ÍEöQPFQS0¿LeC“Å:eöÉ/Ö)í»R±¨3•—™Âƒ#+ÓìñÏ-êqÆ5’¼Á¹ - X°nú0ô›¦´RÚŽ¶ Çž%¹¿'KäZNáüzšâàË}$Ï«ú¤­ŠA,7BûkßÏÇãýx{îù¼Ç9ç~Îç}ÎùX¶âúH2xiã¬:›7æ²2yïP:©3ÿ¦vÆ})dð’FOÜÀ 4μ3– [ËŽå³n€5.ùG µ‰/8¨K¸™<¾¶EøLQ=YzVìÊuwxáCöÞ]à†ªdÛUŽÃxTOÞ|§VΣʮwÄ“áŸz繑6cƒ·™~uë7|Ÿ†p~ÖÌ¢õ”àCEv•¬"?—•”ÄKQ[-yL(³¾£È?JÊ(Ç”ô¯2óaYuÊl/i¬+ÕØR¤X±Í†Hòþ:¶±.äs›.Üy‡»OFòö²Æ47ó⢀<¾û.cïEÛ¬‰ó¢;dÜ–N´.jò˜=)6<⣔Ì ‰A¸¬šÙ6ÔÚpÊÚŸyúÖƧg=¥` Oά“[—Ö‘¦o¢_DI2ã¡?·ÍîH‡¼É”QY×ã¨/N2<$ÓyïòÆœ›ºñ…ù¿ðz4IøøêÏü°—[Ž.>à» $ɔГÜüÍ>&’úG縺o%j³í²mÊIßþÉФ,“ôI|࿞Ý*dÿTâÈý©e0†çSÖšåOfç7Ü ‰ˆˆˆˆ<7yæk”¨K‡>ïN·*°A.E¤•ñ•Ráÿ^}¸4Š…»ƒ¬pZÚ­MXz85† ‚§µ#zÎj*;¼²;éÔ!!ä4¾™èBWYC›j]0iz{˜ýŒÝA…Ø¥ÒÂÚµ†M÷G¿b£’ò2鑸J8úF³¬õ•Õ;¡•}ÎE”é¬qjŸ*À¥OÃvÒÄ&œÁ,?l½ TõiÍ“KÝlÛ}ˆU Ø:q.ŽÇ2kYfŒ÷5GàšÅØe(u´×£uŰ¯7cà¥qè»à â U`»ÚÜåÔ@üýøœ¶Èø«8¸¶¨ƒrª¬?š×Á‹/ºáêúí¸ñ¾¾î‚A/5@ö7Åõ”àCEv)ÐG™£ËÆ?Šâ¥¤­;&,£±Îh ëŒ[ŠÁ¼&úvsDÔžàŸXH¨-QÉ*§Öï…iÿ‘hÒhYìÅú±0©è kcÑÂ~ż—_@÷ޯ⳻Í0c猯nÜ.c­³&Mì ûãK0~P7tîèƒîýÇcñ/!H• Z/>£5ÄÕ%CСu'Œ\Žÿc=2—à+)£qBÿoOà›±ö8üÞ0¼Ðo >9•˜”Ê>ŸÆî¼pmÉpôzáE|òWcÌùí4VùØAÀĹ9Ú¹‡aa¯¶xå÷ª1Ê ;Fú`ìUðÆúÐÌ,Ñré^¬ªÇ– ÝЦEK´ëñ ÞûâwÜJÌþ-ðÁø.fO?†çïÜ´ÇUm0Æ×ùÿùáa‚ ‚,Ÿ.BÌkŽåo1äUXþY.²ðæ§áʲ'€9›,!wÒׄµ·%1ûð%ßælÔ¤‡/>ÅdÆs× §|KæÔÎ/ò„.ë)zêÎmQ.§Þìkå'˜ßªœóD_I´¨=ŽÛÃIÆ\âÏ·Ó?!‰ç>êÈŠYY%:›7YÆÆó'Gz¯!É mœé»3‰¼û1š\^èÁ‰gô䥬i’'†M–1„ÉÜÕÕ¦˜dgX r™Ó²–¶*­§Ê¨}Œ¹÷={9¨ X±ýw² JâeÞ˜Kï’¼¶”ÝÜÌ©‚†6î¾\|‹äùq¬¬É¶m9CÒÎs¢»–€ k½sƒ†ˆUln‘›mWROI>Td—}ø¹¬ü£,^ Úª‚1¡ìúŽÿ(*S²ÎJú×3ñáÓŒuFØ^ÜXgôØRœ”ïÇCzòì×B—'›Ô|›7RÏs\­¶\{7œ‡ö‡2ø‹vôs–©·æ°®©‘™â<˧µSx™¤ßèJ–ÖïÓºsx+ß …ü¢©<†§t©<øR¥ÜÕ*{>N^žB­²2Új“y‰ä•ž¹m¼€]š*ãéG2`N½¬Õ ÌpÞ_$ÿG7 X®ûn¦ŽsPЦÛÏL6œä0{mºì`¢á4_tR(ÏÞ{ÓÈð/ØÓ¹ð%ðæËh bÛUm¾@ÆüÐ17~""""""ÿß3ÅÙ3›Æoá¿ ð>8 ¾3!–ÿ¤ç¹)>µµ+ܬÛ;×ãÇgáñ¶Ì‹Å6è=¡=*äÉ¢~ÅËMZ¢sÿ Xyºæ<‚¹Mò¿àãÊìŽhÔ¨)Zù À¤Õ÷0xûElQ9ß=Å—ÑÀª²'ªYGà÷uq*ʽÎÞ#Æ¢gUS£u’q~VCTu¯ƒ7NQ3«73Z¤aï¢ïq;#Ï=  ÂÓ`/â­¶ Ѱa–4ˆïB3×£vꃕË[àøÔYØWD&B‘í©þX8dvÛÌÀ¾Ð¨CüÝ=xÛHŒ@‚ÌQgø 8_ù{Âu2p÷—­t釡u³NôQTOÉ>Tb—"}ø¹Ìü£(î%·UcÆ„§ï; Ú¡Qe”ŒcÅô¯2÷áÓuÆØ®d¬S:¶«‰ÌÔ@zRz¡~ÒÚVB9µiñ—°ñ ³¯{6^B\jÔÖ°~ŠÔ¢îQî¦vnv¥h?EcQÓ 4fðù>ºìú QØÖÅp¬ G…eªµ‡'àĉpuuKÏΨ‹8¼ÿnÎÊ ¤á÷ƒ€ºàYp™‰ÁBµ  AÔШTbqpúdì4¼Ž=÷ïáüΘһ.lóú—™í¹à¸ÕdÉM$Üþ -,•ŽuȈAH4`ëjyA“ ‚ð/Ê«Y¾õ<žI!ï~;˜ULŸÃlߘì‰Êž÷§çb¤²Ê$ÿšS7w?˜ª"‡œ yy «i‹¸¦MG~EÆnÎ|º]èµÔ.|ù¤ôŸœ™PP6¸ñyóýÜ'ÿê >ü<œLú¹7íTÊtÖTÈ‹$O½˜'Û­vá«gH^xnù²œl¶*‚Œû‰Ý ì¥S»¼ÊÓ$oÌ®UÌÁ.%ïÅ+¹†Ÿ`‘dœá¸*#ãeÂò®ÕYÃÝ…öõÞæU’ç'¹gî¡3«Ïù· ¿Ôíù r³.%ÕS¢•Ù¥LŸ’ý\VþQwmUɘPf}§ ÷—¨³‚þU¶>|ú±®´{ŠŸëŒ[JªÛ—;“Šö‘u§§;Á¡ö*jl=Ù´iM–×€v1#v3;ZgfFçß&wúæا S ›ÌU·ç×7jÏuI™bŸmLàCnÒ„uëÖÍ'uj8ÑBeL™\×ʲȃ¶rÊ´ÌS–lùù}2n ;[ÈwÙÎøôãæ ¢uç­Œ7œá+Îyö›:²éÀiüt—?cH&Ÿ]Â.öš¬Õ/ñ¤ x/ÏÞéìqïá¶¶T8Ö=qƒ_?O¦íéÁr’¹ù·dе•‡ã»½sQië@´»¡éE–„S§ÉX¼d*|œµÏ퉀iõá˜ÑÙw¶íD`ÀÄ@ø…5ºµ‚SöSqs´¬ $ý…Ǻ¢-èa  Ö—ªPC«Qå”URF[¡.VLÇÝ+÷ržü¢/bÿu,«V…­F™ÎúÈ38 4ÞÙo»P;´ÃІ@ÈA?DåÍrš×Æà¾•|ø;øÅH,DÃæ³DÉÓÑ¡Bé›OÉõÑ{^DzõP/GšáÕ݉@ø:ôk: ÛîéŒWb#‚YCV~€úñ»ðñŽP蘺÷Æ`0|Þ·qžëycä¶hTÔ î&Êê)Ù‡Êì2NŸbžx•‘”Ä]I[5nLxº¾ó<Ç1%ý«,}Xc]飿ëŒ[J"åÝ<»{£b!.ÒØ8ÀJ4¡ Ä… ·« PYV€•€.aÑ€Uºpx~?%E’|ë®Ñm›› ôæ ܸ‘+7oG"… ËÄu8¡kïÚEž+x7à„Î]«!gÛ¸Yut÷qnA`Jþò £œi{l*¢Ã¤?Ä…+0µc¸6˜‰›ÍfaõØ0`xt›ÎPë·ÐÞ®ôcø“‹dÜÑ»†4‚ ¿"SlÅÖëq¿òµÖ ó½Ò¢~µòù3k–­øEdæä‡òœ¼jÌI×æÎ¬ÕÀ‹^ÍGðÇ(2îçWÙÂË‹u*[Qï5%ÝÙ¢U'ö¿œ’¼½š>Ô¹§_ÎJü\þQ/Emµä1¡ÌúN™eŠ•ŒcJúWYù°¬Æ:¶+ëŒ[J-=&¥ ÙÓ­¦óË’é{Ù³\Á±÷2'9ÜAEÀ„Õ'Ÿ¥ñ<²øU¾ÐŇÝG,ç_S¦*[¶ÿ4ˆdÏ3›¯ôëÎn½rÔ[o±o#Ê”gçu¡$ñàÒqìß½+{Œü„·òÚ¥²cç/ÂHÞå¶wG°wŸ—øÁÿBI†ñ ŸÌxåÍçËÂçË—cÛù_ñ“·F°GûlÖ¢#ÌÜÉÔñĨÊYりVM?¤¿L¿ú=gìÁN{s愬L±Ò1¼€m¿àÞãš–’¹ù—¼’ɤ§_-bé”ß(º¨ó¿º¦ßÆ;ÌÐóû.OL2”ˆEÓ +äRÙ®¨úòÇÛ‰4dý=9Ÿ»WŽ¡·]×Ihé;g¯=Î,™r˜+WË]BkZ¯~q˜7"Ó²jJdØù\пͳ–7ªpç=}-’yÿê\ûzsÚ©•—@óꃹlß_ŒË~3Æã›ü}Ù V33Bg€ÐTdÛ™Ûx5&ë¥!W·sV»ŠOøÚºÃ&Æð!7´¶,r)©mãÑ\µ?€³ßIôç®…½éªU~3Yr= o¨J´Ý‚ÍW‡‘Lã£À?¹såDvªl–çýÃ.|鸞<3š•Ôß<“ש牗]¨.©£|XŒ]ŠõQèç§õñ*±­*Ê®ï”ѤXé8¦¨•Ël¬S`»‚±Î˜±EÑÃM»®ÜE&íî¨ó˜r™Lú»ÚX¢Üíg&ó'UÕä¼–¨Ïâ?x;!Û3©|tû$×¾à”©Óóœ„Æí¦~Ããwâ³ôÑ1úÖ^Îö27®Œ©+»°ƒ—"3²Ê¤óqÐ ®îå˜ëkS7ö^¸‡Y (öæo\Ø;÷USŠ&ÅGv]¸›W"SsÚVêƒ+Üýq?V5ËßžíšãºÃ9í5#:ˆ§¾~…ÕLK1)Özpü±4òê;¬c*7h"""""ÏOTÙ3cAAøûÑÀ±÷7¸üëKˆ^ÑígÆcƒxå_Ê fÄù¥®ØÐ¾&Ÿˆ—›Aṡ‚ ÿôxøÛøNÞ×iûñû´Z0§üËïDlá=mN,m‚ó³û`öI™ ‚ Ï­¸@AøGÁd\[Ý ‡ÂórÒÅ#ÿòI± <›Úáð[­ñêg—‘$3bAá9#˧AAA„ÿ,²|ZAAAI± ‚ ‚ ‚ ȤXAþî§rM1uÇ)|Õßš¿EòhñƧøâoXý'# E¥.#Щ’‰4FAA&Å‚ ‚ðŽÁ~[ù~wWšä”ÓÒýM†þ`oÚæ­SS™£OèI’Wfxæ©#KÔØfÆO¼üØ@ÒÀÇW¶qfÛŠyì*úZq[:Ñ:ûEÑ6^|mÃ)†§’¤Žý·svGEõäê¬ÄÏÊôÉ5mêôåÛ~祰êSÏrbU­ñ>¨hÝp% œÇzf…ů¤2Eë£$îÊÚ³\ô¤]'‡ÙSeD{VYÖä°˜ùýäÐSüòõÆ,§6¢ŒU;n|ÌÂy¸­-••Q;ôåæÀê³þœ~‰»WŒb[uþ–+ѹĶšKs>œ»í#RH2pý¤´S+×§ÄX”‘íŠÛF–m–µ_å–pòáWmhUê±®¸þ¥a…ã¹îÐ-FëH2ƒQWæ¼n.ÔÓ—•´…1-‹¸5ž«Ê³Óº02í4gzYfõ½L1o´„ÁŒá¦Öy¾cÍN[âÈ;‹è•gì°h¾š÷x«›[”îwE[S¯<ÚŸå‹+gQƒC–ïc@tVKKyÀëû?ãЪ&ùÊ=µ>eYO‰¿_™¢qìÁ5$ÃÖ³›½šÏö~ADDDDDäo•gY¹–nC?内8¤gWö>“¯ëȤ_Ùß^U¦×Ò¸¾Æs$¯¼Ó‘5c»^c¹òT"i8Ç)5L ÜL^àÔ6^ôòÊ•zî6Tç©ÏÄs:/§ß㇣ÈÛ ØÀ,¿]îãŽ0• <±lûôÅe'ÈÔÃë®-ñZu*[e^KíÈþÛcÉ”3\6²#[´ÀwwG’:?N«ij„ÎJü¬@€PY²Þ„ÿ1<å}5‡ãue[ï:t2SíC4¯ó÷Ǥñq1“âbË” ’¸+k ,[òóûä­Å=Ø$Ç®úô°Õ(oϪrì¸á>™ü'—ìÀ¦Þùêgç™ÆÇü¡›]æ ¾’2jV÷nÍ6mÚäHûþ‹x6|ð}_:i”•ɶýÚÜlݾ;‡O[ÇS±$ÿZÉNvjå:+j« ©çîO$yg¾ÖŸÝ{ âkï­ã¦ùmh…ú(‰EÙ®´m˜84ãËKö2$k^õĤXáXWRÿ2­Åg¢°s!_ë×=‡Nçw2í_vÕ1¶(i? bZFq7f,7«?Lãñ O<˜øçMŠ-ØtÙ]’w¹í¡ìÒ¦5;õ{s>y‡mË«þ¡“b%¿_¹bZc§ÕW× IDAT÷¾èH[•Ü4‰ˆˆˆˆÈ¤¸L¤\ÏߘÊ;ü¨¡Ù3™çfõ@³ Ä$þÏצÀÍäöµ->ÃÝ`Ám¦_Åú ßg€!œŸ5ËsbÞ˜ËBÈä½C锕Q;ã¾2xI#š+¼–ÊqêÉ›ïÔʹùSÙõâŽx2üSoZ¥sI~VRŠ6­?ePì)Îld/Cƒ'²T%룮ؕëî$ð‡>ì½)ºÐIqñeJÖGIÜ•µ 6¾Ü™˜Á£+”ÞÏÍøY¹¾5-s&x­¸>’ ^Ú8³m()SP4μ3– [ËŽå‹x TH™Bm¯õýtdàB/š)ÔGQ[Õ¸pä)dÔ&¾à VÞO êSšX”ÒvemÜ>ºÎþ?ñý!C¹!¢°I±’>¨¤*­i¾ŒUÛ¯ÅXnîhmt,Î?JbZVqW.Vl³!’¼¿Žm¬ y€¦dR\L–FÇâ)lWÔ6Ráÿ^}¸4Š…»ƒÌRöA…홺ôjظU Bp)¢´cfáþQÓg÷ÂÇÞšèÛÍQ{~€b)ëH>Ù-ë¢éð­xŒÇØ:¼)êÕ«‡zõê¡ÉäÓÈŽª>ú6}ð z´m‰–í{cæŠõùoø¸…eþúÂ~ż—_@÷ޯ⳻Í0c猯žµËXk—Cå=#XÞNËJ%õ¨lÐzñ ý¨!®.‚­;aäêtüøìëm©~¿Ò¸i9Ž«Ú`Œïßtè™ ‚ <žýÌÛùEžÐe=ÒN=ù-Ê™%yÚLq~‚ùí Ê ö_æ´ÆÜûž½Ô¬Øþ»‚Y`eè£$îÊÚhê9™C£™˜åÌУ\5²-UƵg‹Úã¸=œdÌ%þ¼q;ý’x¬¨6®Lî2NN<£'/Í`M“¢–z^¦°L(`Î&ËCÈÄôµQ¨‚¶šÙ/’¹««Q+: ÓGi,žÖv¥m#G,¼ùixÑ™âbÛ†¢þU 3Zs,‹!ï¬êÀò*#ú²’ö£dü)£¸+–òýxHOžãZ¸?žåòéò½¹7¼þvÍÌØ²|Zë1…—Iú®”£Ÿº|sNÛu—z&òƯ+9Ñ·:­Te°ì¹ > êÑTÃSºT|©Rîj•=H'/O¡‡VéïW1­Í÷Ș:8BDDDDDD2ÅŠ1DýŠ—›´Dçþ°òt Ì;ys›<›—\\™Ý5E+Ÿ˜´úo¿ˆ-#*C›¯ÔE¼Õ¶!6Ì’ñ]hFvªu†‚ó•o°'\ wÙŠ@—~Z×¼` çg5DU÷:xãTQÙèK˜ÑÑÞÞYÒx4Äe' ü±pÈ ì¶™}¡)0P‡ø»{ð¶'½RñsÑú¨­]áf ÜÞ¹?8 ÿ‹'°eÎX,´Aï íQA¥LµS¬\Þǧξ"2GŠÊ¡’¸—T&=pºT©k­6îm1a¿Þøá8Öv±Ë—*ÞÏXUöD5ëü¾n#NE ×YÂ{ÄXô¬jjD™\ÌêÃŒiØ»è{ÜÎ(¼•))S0{˜7³Y¢>JÚªAXª“‚Q Ǧ4Oo»1ãÆÓuÆõ/l¿…_ü6Àûà(øÎ<†'àÅŒ-Jü£$¦Ï<î"cb35ž”^&õ»˜Å©3fm:… GÉÐRð5|M3+Ó"_Ë {€»)€›]NÛ0ĞŊþ5`W{ÖÞ®©{nãÞÉEèl¯yæúÄ¢¦/hÌàó}t$H‚†(lëb8Ö„£‰±¿_YdÄ $°uµƒ¼ IALqYˆMG~EÆn.Û'Î…f…Ô.|ù¤ôŸL­Â½xfõ9ÿváû¶nÏo¹±êD^$yêÅ<Ùµ _=CòÂëtÓ»ïÏ„å]«³†» íë½Í«$ÏOrÏ:m¶t{ŠŸô³‚=ÎöCy‚ä_sêæî™SUä$/Oa5E>TÑaø IÆŽ«¢UPF£H%qWÖ6 Û Øšë#ɸ­‹n«ýlÓ‰‘7߯—³?V]Á‡Ÿ‡“I?÷¦Ja™<ù4[AÆýÄn¶EöST™BmWÙsàþôÜäŒÒ§è¶ªvy•§IÞ˜]«ð,«R}ŒŠÅÓÙntÛ(!S\\ÛPÖ¿2O§.ßzϤw¿Ì*¦¥ßׯ¬ý7þ”MÜ•[¾Ü™Tt]f^‹x‡ñÜÚ9o¦Ø†¾;ÉÛóY_i¦Ø¤§žÕ“÷qþH6oÔ˜-z¼Í“iäíùõ3ûAamÙdfûsÊ"¦ÕÆð÷DòþÚ¹{ôËBõØølcrÓ&¬[·n>©SÉ*¥¿_÷¤»ñõódÚž,'ÙÉ—Å\µ¶àSt-œ:MÆâ%Sáã¬-£‹©¡Õ¨r®©S÷Þì†Ïû6ÎÙ¯U¯ž7Fn‹FõA½ànè#ÏàP(Ðxx{ØgyPíÐC!ý¥7VÏ ÄF!(²<†¬üõãwáã¡Ð=?ó•Ä@ø…5ºµ‚Sö×Ì=в*ô+RˆˆÞó"êäø®êÕk†Ww'áëЯé0l»§SPFÿú(‰»‚2*5TFúY[¡.VLÇÝ+÷rö¢/bÿu,«V…­FY™ÌkcpßJH>üüâŠÐAI™¼m¼úpÌèl‚;Ûv"0ÍH}Ši«†¨cØ|–¨3y::TP>´ÔǨX<¥íe5n(iJÛ³¶òp|·w.*mˆ6c·#4ý)tPä%ãOÙǽPRnáÐMÀ³»7*R•.:`ƒº r³ø&ÎhTÇ xŒ˜<™p¦%" Vp°Ñ–RE׆j}>‹6ÂYÿKð;ᇔ§ÿÕI9ˆÝ·ç†°T•½>ÅÕ“|ë®Ñm›› ôæ ܸ‘+7oG"…¥üý2wG w ìBžái ‚ ‚ð·¡}¶µ» ç¬ñ𠽈€û‰P•¯Žö£çaŒÃ|óåEä[°eÙ ný ¯;£íÎÂ}Üi$—â’6Uj¡V-'XØ{ Õˆ9ø¤¥§Þ܇{zeî¨ä;µ“þÄ›Güq#!çŽw\‚nÈ`tq]Ž¿‚¯âóŽâÍ/¾Æ¶E–X~ h3c5º«Žâõuך¯Îrð¨ï¯„¼wv±¸ŠDƒ –•ëÃËÓµ›wÅð ѵòU¬èñ:~Ž4<?§Oê5|¹ú¦-ý߯{¢á9j-¦¸…`õ°“ˆS¨Ž>>7òþÅ ö1@êCÜþ+±:JÊèJÖGcDÜ‹/c ï·ÞCׄ ¸ƒm t3cbã×—2}¨ÀÏŒ<…}·M1{ÕZLÑ­Ä¡P­ó[XÙU‹[‹Žã¾Ð)(“Zç¶ð­\çø¢Â¯ LùZÞhÞ* . {aÒüéh¼]–_Él«ŠôQÐVuÁøî…ë÷þ8c‡…K~Äé° ”¯Þí]cQ¢’X”‘íJÛÊÜ5=afQŽf€©½'ê{% >:…'Á ¤*ê_VhþÞ'è£Ú±_Á¾®ì³T$†"àNlžÉjqc‹ÿ(Ê&î”gºüþí9¬Y3#ªmÊëáõöãËc騰è{|ôhvÝV£æ ù˜_7ÇÆBÞa3-Ü×Rf£ßGó0já~<к¢f¹3ØðÝ ¤¤áXÐcô\Lñ_ƒc!IPÛ7‡›…±¿q•1xù<4Ü£—Ck°EÍnS1¯1påÝˈgÙëSl=áÛðöªÙ86ý0ŽVX€Õ¿úãA†*Õ¬‚èkðKhjÌïW&ÖG¢gÅûرçŽLŠA„-Ï.mZ¯~q˜7"Ó²_Á°ó;¸ 5š«ž|eH¿w˜¡ æ÷\ò½’D‰¨pç=}ž5¸É¼õ®}½9íÔ —ª]øÒq=yf4+8ðÈÄs&¯SÏ/»d.9ÓTdÛ™Ûx5&ój1W·sV»Šyô.ê0’i{Ø£\æÒÆæ«ÃH¦ñQàŸÜ¹r";U63~©¤"?+ф֙¾svñÚcCækABsÅàjy–ï•f9wam),S‚>J⮨mhœØ}Éï¼v?9û…(¼wq ¬A •qíÙ¼ú`.Û÷ã²Jéßäï˱š™qeкÃ&Æð!7´¶,Ò¿Å•Q;ôå·iȶ<Ÿ»WŽ¡·]þW甬’¶š¹ô×¶ñh®ÚÀÇYN¥Gús×ÂÞtÕ*ÔGI,ÊÈveãhÑtà é:q[:e.çV:Ö•Ô¿LjpúÕ"¶ø¢‹Úˆ¾\bûQÓ²‰»1c¹Ê®+7F‘Iû_£{!Ëi;qöOù =ë:.ò§Ùè¨}òUBÃÖòTDjÖ¶Œ‡<·¦[ÎáqæÕréÞë|˜õ1 )Œ »È^ªš¹t\ÉòiSY¼“~wc™}¾Zrø9nû ;]MÊX…õ@ãÀvS¿áñ;ñYé}k/g{™çéc%ý~å?¨mü±4òê;¬c*ËëDDDDDþ¢Êú‡ ‚ üÐÀ±÷7¸üëKˆ^ÑígÆcƒxåoAe‰3âüRWlhß“OÄË ƒ ‚ð¯D-.Aþ9èñð· ð¼®Óöã÷iµ`*Nùîlá=mN,m‚ó³û`öI™ ‚ ÿ^´âAá“qmu_4  ÏËAHü “bx6µÃá·ZãÕÏ.#IfÄ‚ ¿Y>-‚ ‚ ‚ üg‘åÓ‚ ‚ ‚ ‚LŠAAAA&Å‚ ‚ ‚ ‚ “bAAAAI± ‚ ‚ ‚ ȤXAAAdR,‚ ‚ ‚ 2)AAA™ ‚ ‚ ‚ ‚LŠAAAA&Å‚ ‚ ‚ ‚ “bAAAAI± ‚ ‚ ‚ ȤXAAAdR,‚ ‚ ‚ 2)AAA™ ‚ ‚ ‚ ‚LŠAAAA&Å‚ ‚ ‚ ‚ “bAAAAI± ‚ ‚ ‚ ü&Å*Øù|ŽÀôd\\л9ÊôQYUCÛ>}ÑÂAóŸ xYÙþ_ö¡ ‚ ‚ ÿ‰I± æ}0wÛ9D¤d:ÁúI-`§ÎýºUÕ¨fbšõ]`ö0G‰>æõÞ¶_ÖáEÓR^Gƒ -ÆcÝ¡[ˆÖd¢®þŒyÝ\ -Â—Ö §áPÁÀy¨÷7:êém/ÛzžK«p€íai ™)ú8ûmÅûÝ]a’mO£%f 6u°ÎóMktÚÞY/30AÍ·oäÖ“#7ñN­l?háþ¦?È#èk[¸>¶}ÁðDY¢Ûle`AA„ç…¶¨L=Çã×KŸÃ÷áÏXôæG8y_ƒÊ|ÐÁI !»”áßõBí«žH¿q±»9ÏIÓýÙtŠXYƒNàžY} ýpæþjƒ;Õºâû}þ dIøßÑÑHÚÛ߂ʤÜ+›âê»ðòïI°qm„ï®Ä‚½Õ‘P³5>»¡°¦ Ý ~·†cŸM8´@…9]^Ä/“pïn†b}ŽŒAƒ†å öyë‰2ú8ÜM˜ ‚ ‚ Âó„OˆÆ…#ÿH!£6ñ5 +£q}瘇£ýY¾rê m8eíÏ<}ëãÓ³ ÇðäÌ:4Í)gF·î³ùýÉ Æ2KèãïòÀ{ if^\t‡ŒÛÒ‰ÖÙß±íË#$¯N«N¥úXµãÆÇ,”Ä]hS˜/Е֔š<ÿ·jû£ËÍ­óÛ_±+×ÝIà…}Ø{S48õÌ”_G©¨m›rÒ·24)Ë }ø¯g· *£l×TÂ-·b™‘õYJøŸüfB–SáCñR¤sN{tf¿oï0CÌï¸äó»Én'‡ÙS•õ7³ Ä$þÏ׆hÞh ƒÃMòÆÏš¶Ä‘wÑ+_ÌÔtzéO’gøŠsÁþ¡¥û›þ$°¯mIºWˆˆˆˆˆˆˆˆˆˆÈóB3Åj‡.ïkŽÀc”¡Ð™´>r;Õ9 +WŒÜ±ï1ãÖ:û`ÒľÀ×Ó0~ÆuÜÓÁÔÎ&7BžY•GnÁåúCt-Ž>‚÷’`êX¶aYeJF‘>Éç1»e]¬j:û·øâÀð®Xp% ‹ F’1OtéÈÍ«aãV6Á¥ˆ´<Æ»bØ×›1ðÒ84YpÕ¾~VÏ5,Ñré^¬ˆ¥ã»á—€8¨Ë»¡V5n%Ò(ÛõѰéƒWðuø$¨Ðlô ¬þü7¤ø×À¤?“ËЇ tÎÆÌ=zz@«ºw÷€Ùÿî#¹´®Ria]©1N÷G¿â-ÿ$‚ ‚ ‚ðߥÐI±i%/TQ¥à⟡EOJuq ˆ´I¸Wâ %×~ú ?(d]¨UKÌ]ÙåN¿‰ZÝÖ (½”–(ч)xxqvŽt<ºs7n¤<µÍkŽÁWŸûâÞêŽø*g)®U^úk›ÿŽþ„pª=³0š¢¢[y úŽí?ŒÓtüp²4¶§aïOA9ÿõ»ªBÏ¿¢cûÊ0ùó2Ê̇ tÎi>ç0wøTÄvSaÿʳ¥ž·ÙÖìÿ…`ãà™ø½ˆ‡>‚ ‚ ‚ ü7(ü -ƒ| ˜¸¶AàÂW;q7ýÿ›ûT°iü~ñÛà;ób³œ¦vꃕË[àøÔYØ÷Ì'^±88}2v^Çžû÷p~ç Lé]¶¥8ZëÔ³6BУdè ©ˆ ø¾¦€™•i¿¿Ëuxpø3¼ýö§8ô@Wê+^™Ý5E+Ÿ˜´úo¿ˆ-#*½±^AA„ÿæ¤8=2÷a‰ÚM*åœÎ[$Ì;E,4€ z{½ИjK¾ÆÓêc„ëÊ·ž‹§W æÏCÐ|äF¥å^¹bç·0 Byôùé>t$ÈD{Ù¨1×Ï`\•²}•QÊÍõTà ރ㤺3æýz÷ÿ\‚.öF\ǤÞØ}Kz&`ó”ÞhÕ¤ºú~F?¬P¯2ÑÙB®ãÊå‹8sx>Ÿ:OÙcà¬pÓ4è`€&šü=´&š¬‡D‚ ‚ ‚ üg&ņ¨cØ|–¨3y::T(!?È4$¤°q‚M)æ2÷ÏÀïÐdt_T-j®‹AX4`U£.JJë)Їi‰HƒlJŸ#ÔVŽïöÎE¥­Ñfìv„¦çŸFïyuêÕC½i†Ww'áëЯé0l»§/ûh¦?Ä…+0µc¸6˜‰›ÍfaõØùlk»EMtm¨FÐç3±hó!œõ¿¿~I1Ò‡ÆÄK΀N&cñ’©ðqÖ–YÓ×jTõ0ÐEãlP·¡SnæØÄêXƒ“!ƒ… ‚ ‚ ü)|†¡ Æwo,ÄX¿ðÇ;,\ò#N‡e |õhïzsçÀ£ìÔ™!×O‡Ófâà QØYîæ§±aÓM¤*Ñ ñ ¼ûoøgxaÉ7pýA*´¶®¨jr _ý€T}$ÿpül¾^‡O†AçØ•€'÷<+Ð'-Ü×Rf£ßGó0já~<к¢f¹3ØðÝ (Ûk…æï}‚>ªÝûeìëzÁ>ûò‰¡¸ ]|näÿŽ}Lú·ÿ Fl¾UÀ*”k½GÌDåcѪï2jVmç¯@ÿ˜Ã8x!Ò,àÖ¾\¡Gàƒ¤|YÎbmO ± Ç蹘â¿ÇB’ ¶o7‹'¯Xl=Šâ¥\gX6Ç[?ÃëŽÀh»³pwºTûŠmªÔB­ZN°°÷@«sðIKN½¹÷ô€þÁ~|y,}ÍÁ®ÛjÔ4óë¦ãØØCˆÌRÈÔ¾jV²†cUk*T©ç/‡$Üûë6¥3_L<ê{Á+ï6z],î„"QÒ΂ ‚ ‚ð¢È×ÅØ6ÍUûøX—ùÆœôHîZØ›®Ú¯¼qèÂ…‡B™F’úG¼øyÚg½ÂÇ´îÞÊóê›BEeÁj½?à3!çý>aüsMO:d¿ ÈÔ}ÿÁÛ9RùèöI®}Áé‰Wô§O¦˜ÒcØZžŠHͬ*ã!Ï­éÆŠj…Çv›Ôàô«…¿–ˆ~£èRh=Vlÿ]Q¯d2¡çÌkY”âõ<Gv]¸›W"SsÔH}p…»?îǪO\«xÛÍ« äÒ½×ù0»*C cÂ.ò‡—ªRkD=%ÆË5Îì·±ô¯dR;àÎ{úÈzuXúƒ‹üiv':jsãTóí…ý&ß©eZà•L…¶‡=ÊÉ+™DDDDDDDDDDþI¢žËyZB ¨m›cö¾“XäþZUŸˆ3ÉâAAA„g¼ûÀ¢Æ@¼õÎ4Lkþ?]ˆs2!AAAIñkOÔ5;‰Y­ûâ{¿GЋGAAAž ²|ZAAAøÏ¢‚ ‚ ‚ 2)AAA™ ‚ ÂßüãT®)¦î8…¯ú;Có_t€™'^Z´s»9å±_‹J]F S%i ‚ ‚ “bAáߊʪ1ÞÞw +»$âFhòóà óºýîTÏ:÷‡Ú¬6F²‡¯ìÀ¸ZÒPAáÿפXËÚ¯bK8ñð«6°z—°j‡ ²y¸­-•êc ±ã|RHi¸qÞéäðd¶BS£OèAWfx"ï³{µC_lL€>K‡¤ðKؽbšØp¹Y, zRç“Ãì¡háþ¦¡vÅméël‹l¼ðÚ†SO%HúoÇìŽyuÖ B‹ñXwè¢u™¨«?c^7—îoú“¼À©m²?Ï”:•­¨µ#ûo%SÎpÙÈŽlÑnßÝIêü8­¦if=¦µ8ãLv.äkýº±çÐéü.À@¦âË®Ŷ+²K>eU ¥û¸#LeO,Å>}FqÙ‰2õ0Ǻkˆ…ò¸ y7¸?&HÎc=3#Ú¡ÂX”d—¢z”ÉöÏ•w:²Q£fl×k,WžJ$ ç8¥†I®Ý*KÖ›ð?†§Ü㱯æpÜ ®lë]‡NfªÛj=wªË2îªrì¸á>™ü'—ìÀ¦Þùêgç™ÆÇü¡›U c¡Ìv±PäÐÔs÷'’¼³‹ _ëÏî½ñµ÷ÖqÓü6´12^%µç’b¡È‡Jê1²ï”$fõç1€i<>Áƒ&û]£% f 7u°ÎówkvÚGÞYD/³gû{ö\Ŷ/¼:­ú~0­1‡SÈ{_t¤­ê_d³ˆˆˆˆˆÈß'ϲrs6úè:ünD% IDATøÿÄ÷‡ 冈g8).(gÞK†­eÇòª§Ò§\ÏߘÊ;ü¨¡Yž¿›±Á‚ÛL¿:‹õ¾ÏC8?kfñĤøä0û¬›KЬÖ[ôÓ‘ ½h–]/w&fðèÀ E\?û¦ôûÚ®ŸÊqêÉ›ïÔʹyRÙõâŽx2üSoZdÿMkJMžïYµýŠQŒåæŽÖŠmWb—}ʪ˜7æ²2yïP:©3˨‡q_ ¼¤͉…¢¸ƒêŠ]¹îN/|èÃÞ›¢óOеC±P`—Ò˜–T¦Pÿ4XÀ &ñ¾6YßSѦõ§ Š=Å™¬sÊÛVË,îÍøY¹¾5-s0µâúH2xiãÿ” E¶+Š…ÿh\8ò2j_pPÙçJ¯'ÚsɱPæCõÑwJ+¶ÙIÞ_Ç6ÖO~®hR¬vd•y54†©Y?ãoïçòî¹}]I€šJC¸åV,3²Ê¤„ÿÉo&4a¹¬v`Ñ踛ùYèInþfIý£s\Ý·µÙuiÙaú&úE¤‘$3úsÛìŽtÐ䉻u=Žúâ$ÃÓH2÷._a|“bÀ”µfù“Ç9ÆM#72""""""O)ÏxíU*üß«—FC±pw’ŸÛÆ0lÛ}ˆU Ø:q.ŽÇ²”úh`S­ &MoÓ Ÿ±;(-÷#ó:xñE7\]¿7~Â××]0è¥(n—WÚ­MXz85† ‚gÖ2?•…#\,Òhá—ò¦YK¦Cmn‡rj þ~<ôÙéÿø«8¸¶¨ƒrY•R—žó9 †[Ø —"ÒŒ³½»”êSõhœZÁ§ péÇÓ°t± g0ËÁ[/U}ZÀA£<Šl׺bØ×›1ðÒ8ô]pq†Ò´Ã’c¡Ô.%15*î*-¬]›aØ”pô+6ú'e¯±FÏyãQMe‡WvG :$„œÆ7½aû”£H©ÚOz$®‡޾ƒÑ,sÝ1,ªwB+û8œ;Š4#bQ’íŠb¡À?j‡.ïkŽÀ5‹±?ªè†c\?UÒž‹Àh*Aù¸Q(æ5Ñ·›#¢öüÿÄR6(µ5jùø ~ú&LèÓÝûÁÚИ¾c&×2U^€>ú6}ð z´m‰–í{cæŠõùoø¸Eæ~çæh熅½Úâ•ß«bÄ(7ì郱TÁë?@3K*´^|G?jˆ«K† CëN¹:?þ;Çzd.‹×8¡ÿ·'ðÍX{~o^è7ŸœJ,fS:7-ÇqUŒñýD&‚ ÿŸ–Oçf%¼ùiøsÊk=8ñŒž¼4ƒ5MJ§ÚùEžÐe¥RÏpn‹rù²?æM–3$í<'ºk ˜°Ö;7hˆXÅæEgÄs6YB&MörÊÉ<ÍĬke„媑µh©*˜}+Èqª€œLÖÒ»$¯-e77sª ¡»/ß"y~+k ɸÔËßbÈ;«:°¼J¹íŠìR OYÕcÞdCÏŸ|é½"„d$7´q¦ïÎ$òîÇlh®<%Ç]Ë*£ö1æÞ÷ìå &`Åöß“)VÒ‹ˆ…»Œ‰iqe²ý“Ÿ`~;¨rn†ÊÚ‡ÛȘ} ø’os6jҎßb2ã¹kSÎ2ÚÂÛêeNËZŠ\Vq@‹Úã¸=œdÌ%þ¼q;ý’x¬¨V %¶+Š…ÿdÖ“Ì]]meÅÅ«øö\r,”ùPY=JÆLER¾éɳc\³ÚT)2ÅÚjœz…äÑþ,ŸUFëþ/‘ùxÖ\9ˆ/VnÅoýw#†ÊÇ„âlU *ðOtdîõ›T‚Éþ¿Š™ü(ì§ŠÆ–bba”Ä´¸1SaS`ê#D&uÜ+@‹¨'|”9ÙÔÀD“ÿa€ÖDôÅŒ÷è €J­*f‹J2&5ðÆîXRýLîß®GCåÒŸü¼Î…*¯‡^÷¤*•*DᇡÝññµüL™þÁ©€–YjµhÔ¦°22bR¡—{AAx*þAïsЩÓd,^2>ÎO1W7¯Á}+!ùðwð‹+#Õ¨‡€Z›y'fêÞƒ=Âðy߯¨W¯^–xcä¶hTÔ îE<¶7­>3:›àζ,j«J]ª}ÅYS)ÄF!(²<†¬üõãwáã¡9tmåáønï\TÚ:mÆ*¸Ñ.Ävãì*^Ÿ²¨Gy‡BÆÃÛÃ>gïf; m„ôC”þ)b‘Ïv"zÏ‹¨“ïz¨W¯^Ý„¯C¿¦Ã°íž^q;,)JíRÓRÅjh5ª01~a@n­à”ÝÌ=в*ôëJß½Jwm…ºhX1w¯ÜËÙûjˆ¾ˆý×u°¬Z¶š§òÛ®$Jücˆ:†Íg‰:“§£C…¢‡ÞÒÄKQ{.xc|ø”c¦bRnáÐMÀ³»7*â"]t0Áu:å>Ñ5qF£:VÀã`Äd”áO’EMtm¨FÐç3±hó!œõ¿¿~I)¼xÂÁÁ(gÚ[£ò縓oÀ5: ms„Þ¼7råæíH¤H<ˆëpB×Þµ¡øíÃæîhá„]+åþoAArg¢Ï•¹3jz:ÂÌ¢&ÍS{OÔ÷J@|tþ OÊ}ªnÙ ný ¯;£íÎÂ}Üi$—Æ ç¶ð­\çøÒè£uAÏYãáz÷¡*_íGÏÇøæË‹H‚U}£vÒŸxóˆ?n$äÔŒ‡;.A7d0º¸.ÏY¢Y¾–7š·JƒKÃ^˜4:Z¯A—åW™/°†÷[ï¡kÂ\ ŽÁ¶:™‹±Ž±ñëK2ªåàQß ^ yïcq' ‰,+ׇ—§j7ïŠá&¢kå«XÑãuü™ía+4ïôQíÆØ/ƒ`_× öÙ7‰¡¸ ]‰¶ç>E)Þ.%ú”Q=©WñùGGñæ_cÛ"K,?´™±ÝUGñúºkHr¡)öZ lg|näÕÞ ö1@êCÜþ+±:¥íPA,Ø¥¨e²oámªÔB­ZN°°÷@«sðIKN½¹÷ôô×ðåê ˜¶ôSl|?쉆稵˜â‚ÕÃNÂØçOOw]ä)ì»mŠÙ«ÖbŠn%…nßÂÊ®ZÜZt÷uÊÇ„’mW‹TþÑã»7b¬ßøãŒ.ù§Ã2P¾z ´w=޹sà‘Ay¼Š÷aÉãÃâÝ’ûŽbtøýÛsX³f:FTÛ†ÖºëìÇ—ÇÒ±aÑ÷øèÑ캭FÍAó1¿n:Ž=„HC>êM ± Ç蹘â¿ÇB’ ¶o7 ãªÑ‡oÃÛ«fãØôÃ8ZaVÿêV¨T³ ¢w®Á/¡Їmû_¼CïìÇní»X{8©ÛÃ(rÂkÝx$zV¼{îȤXAÊ€gºiÙ¢é †rLKÜ–NùÑ8³ßÆ;ÌÐóû.EtR‚XwØÄ>ä†Ö–¥ÓÇ´:_ýâ0oD¦e}’Ȱó;¸ 5š«@¨]øÒq=yf4+8ÐÇÄs&¯SÏ/»PëЗ?ÞN¤!«–äî^9†ÞyßQ¬qb÷%¿óÚýäì~ðÞÅ]\4°-Jö¨ÑKü¥7 Ñ'&¶ØbIÔ(¢ØQ²|ß?è¸ËÎ $ú¼×çœëeg§\evæž¹gÊ‚€-[®Œ"™Ê»a1hÙDúU-tŠemN 5œ  «V¡íµ*íR¨OI哥NJl=}#Cã³òŠÝÄm*æúRY m‡ëcŒ´U¤ªØB¡]Jù(¤Ñ:÷aÐM}¾’y+tWkÉòù}\ç€Y[x6.K“)û¸´Í|Wؘ¾¾§$ínS«?ï¼ÄÙyéã.pÇâ~¬i†-”ÛnÊJú-›ŽäŠÝ—}(UZL·ÌíA7¢½”t¨v•’i*äóD±c\4å;ò«X2i÷hº8 NçìÇ™‚y;-[·ƒ¹a¦u9vxü-8d„vå£FYöPIЦf_.Ú~ŽwrîmÊLa|T0¿ZƒºBmð¹bBæQ¾â’m '¶yã ¼šQï]ÞΙ^6ùôèÆÎïo橘œ  Ò~ˆ+»9?þ{¨óàø?RÉзYßJG)®h²ÿ!‚ OpîñNÿ2÷–v@Ûéû—)ZÉEcÏi{pb‘ÖµõÄäC ò#.‚ ÅD+*Ažô¸óëLÞ ·)»±cJ]X‰R²±á=e -j†3{bæa™ ‚ BI ‚ OLÆÙ•h6uN‡#M4’=)v@æå±ïM ÿä4’dF,‚ %‚lŸAAAþ¿E¶O ‚ ‚ ‚ 2)AAA™ ‚ ¿ýãT¶9ÞØ|ë{»äÞ5þôUÒ-&,Á§3šÃî©©”U:¼ ¿*–âD‚ ‚ “bAáYDS¦)ÞÚyË:<ÄùÈä?øÂÂm4þ&Á9Ðåžè´"|'LŤ®ÕŸž²­ëaäÇßcß™Í[×VœIAþýI±*´Õ{/ã^A¦#6t+>èäZ:Ç^[{bnx¾N¶X šÜW€ï´ 8— 2qg6bzëŠùV"tp-ä±®)ÊjÍÉG­,@ž˜½ñoD§dâÂöcí¤V(¯Um—¢-LæS<>øÑöªö*Ó_ÅÑ`>¼³>vjeiû`STjÞgú¸~ì'¼×Ù –fÔYëˆïáÏþ{ÒSضtš9 #Ó¾‘~õñÖº8•ý£ã˜XC§œF©>J:Ìó3»zÃñã âÎz_”1ÒU1ò$qfZ\‹R´»É¶[ãï\l>d*noÄÛ~NV ‹Ð‚ÝÕ|CѦ ±£qðÂèuGpãAfàNÈ&Ìl_¸]¦â½dô£Ögšî£TãB}F\í—ü‚y̓1£mo,;™€’¾¦X„žÑ¸yW,ûûUO=‹ù]±*¾'ÖîYŽN•äÙ· ‚ ¨ÀR«ºœv4–ƒært¯Nì:`*¿¾˜I¦îå07‹’/Ïîy~v‹¼¼  ›yyÑËË‹^^èá˜S–Žîc÷óyhñöì9‚‹%’öqŒ»./Ík!$Oò ßœ<²¤¡»µ¡)Ëöën‘Éqñàvlîý"‡r‚©ŒãwÊS£šRЪÎî~HòêÎÝ›»õãèwWóÛ|é Ú.%[(ê§:¬_µLn»LÚKëÀZÞ>ôõõÍ•¶½ÿÃãiäíoYÙB­, ·Ñü›ä™·Û³I“lÓm —yHfþÍ×k[*×9'Ÿ³³»Ð§mgš²šG´Œ~åµYù(ùNø™7Rnòõ³8¶_G¶ö®ÏÊÖš<6‘F©>J:-ZpØÂíŒ`±ë}YÆ@ŒYÖ™ÊÓi7¹k_,ye=­ó®hw“m×±Ú€å\7w_êÚ‘ÝMçWç2Ȥ_Ø»’ùú)ÊîJ¾¡ï¦âBëÌÞ›î“)G¹xp{¶jÓ‡ïl‹!3ŽqÊsV¹íR‰÷’ÐrŸi¢RòC3ĺѼÈTœàAËÒü}] N:Eò@o–{¢ï×ägŠñýR«Ú¸/…¼¹¦=5OWÝDDDDDDžB)Ý4:+Zäû™ÖëËûü¾½}É—çÀ ‡é<з‚áÏmšrq™¼}+k³þ¦uÈ)äõ…MhS`¸ŸŽFʱmÁO¢É˜µ>´Ë\¾Àµ1äõEMÕóQIcáÊÁ»RÈØoÙÝI[Œv)ØB%Ÿ’Ò¡Š½Ó… ûÝ'£V±}9²sí‡VÊ”Z{Îa8“øs€Cñò©û&eas½h­ì:ø,gøý#œÞÄ>o¢\@L§Qª’mØdÞ9ÞÙÀ÷^ÀuÑÆ&ÅÖôœs…i¡3بñ{¼˜yƒŸ´°5ÏŸ•Úþ¸”íú+ñ*ç5¶.ž~ Ù]É7Tlªç< '/¼]7w²§)ß›È˽i«ï%¤µ,¡¸P–2ô]CÞZM_{ci¬Y­óL~s8œ÷3³âè®ñ÷wçöuÐ9³ÝÔoy,:•$™~'„g¶§“…™“bSùäLŠB™B’L½q„ëFyÒ>ÿDÔª»ô_ž»G’™Œ ÝÊ»U£U¾²´|ùúª­üóòm&¤e?b<O¯Ÿ•NëÌ.Ëö042ž²?M¸²›KúºѱëÎ!ÓrT5 숈ˆˆˆˆ!¥¾¯ŠiÐçßÊW­:SÑ©%^–ÆÖ®¶©xhë ×rVy[¦sv~V~þÕS?ü ÇIûq?ñ(f8ÃO§þ­à¤zšKZ ÎEÎýÑ"{ÿ²m-?¼Péþ>‰’l™Ö©ÆØ ìÓØkx¡j»LÙB%ŸÓ¡‚½ ¥†c›±¢O&~š8ï?á[†ìÝZ`àë/Ãýî/ø*$©x;/‹EûÒQ{`?Ô±Vô ­3º~055åñʶh¤1‰⋉ÞÈÝqª’F¥>J:|„wÁµÉÌÝŽdcªµ©!Cª!tí&\<¿ÿwÎý†z¬·Ín—jvÀ¤©ma¾ÛÂSŸ,»K£`S•¸ÐÚ”GY-p+!7™нa€[«ú(«Q‹÷’Ôy1XŒ¸PÅæ9vrFìoß!ä¡¡:Tü#Nï˜.é;0wd?tëÔ}'.Àw{¢ø,8„ó#táKhçã‡Á+£Ñ~þ.ñPuÇœ|´É8º| »Ä»û+aôúƒø¢Wå¬÷“4åáÿÉŸØö¾Î.„n݇àãKM1ë×?±Â¿|®Îu.þ˜41•.Äø~ðb{tî= þ‘Õ.­=êúû£QÚ·˜Ð³3:÷…U‘­0uóL®kèæ4„}»5¾ðV&‚ ÿóÛ§ ‰ÍscøkÌÈzŠžy€+×¥]vY6Í3‚ ÜàïLï¥$c¸Î×…AIäµùll“e¤0§9%w«-h[o,7Ý Š[¿ÚÄÄ$þ=¯=+j ¯°•é4YuNæ–ŽÆõªÔ.Ó¶Pɧx:<È~ÔíUpÅÆƒêÉSÓøœ¥¡•,ãeå¬dä:¿ìW5ßöLõ|ò¯ˆ6l¶$‚|ÄEß°÷çÆD2~ç hÉ&ÍÚpЂ#Lf·ô«œµÍX!j}Lë0ÿ.o.¿ax¥Ø¦ÙF¤žàDwKÖ}û<3£W°¥­º•ÚžóÄÎeeûåìVeóÚi†~в»šo˜¶©R\Ø4å¢k$Ï.b§j6ÔÀ‚î\p™ä‰±¬j¡ï%¥µ4ÝG™í‡EI¹^Ü«'r+à ¹R¦5?¿Cfy•µ¬Œ¬\WÅ#¸gh•¼1šJìÿ{yúuzèÔVŠ•ò1´}Ú².ß:KòÄ$ºë@‹êãyŒäÅY óVt­=ùÁ%’eµìUg«³x¹ÀîÓ[µuî¯òÉc«Ø”·B]ï^$ã¿kO{Y1*ºfÞ­CÓ7°yßR4Þ3¾ÓÿÀ“.ô¹€¶ª¯`ûÏcàûë±î»ƒp¸S#Ï—2'f4FO´¸‘ŽvS åŒ7[À¾Äìÿf&#:2=wu¦LÕ:¨iŸ}…#–>¨–aï—Ç ëçâÛkiŠù(¤ÉÔ#T<}U¥]*¶PÉG%Í)Lk?rV|ôp庽òW˺áXLk•Šíý¿Á•tóË€33ÛcØÎDØV¬f½¦cѦ`8 n†?Ü@†ùÒiþ•;S¾¡µwC5{àJÐZüðû 脜ƒ:}ÎaÖ„¶¨´ ÷ÒÄ+Õǹ„‡úƒúÁåÌ"üv#K[×þûÂþ3ÌÀñ“”l¡Òö»Ù†ÏŒýÚ=÷šMÑcò\|px?4­Úâƒà$¥|âìN%ß0'Þ‹ˆ‹G!˜ûÒ4ÔÛ¼;#§gÿ1ËiÛ£‘¨7/Þ‹«Ÿ»4'Uú15?,ò–¶°ÖiIiu`éæ _'àä[A( ö|Ø>O k8|Œo }xû98[×2L×E)C*HÄ·€amPÓfâ꼈¸ow_ËÛE”Ž{ncö?Ô±]‡¨‡Oö›—w ×’Ï*eaäÛ ”S—xDÜÝÊC.hAãü“b-ÊùÌÂν³Qù§—ÐrÜ&D¦•v™z<Œ8‚õ¯B‹G0pTS¼öû>¤Ä]CPÕµ ´1ˆŒ u…››pï:îà$àÚÙ38chBäÐK~š»%Ð{î9¤â|<>=³k–ý„_{oC<òQ(+-æ"nÁõšUåîK08SnWѶPÉ'Ý,>À•“8ùàÉì•7N´…רaðH؆ ¿ß1r­é²#ÎáÌé» ‚qôÀQ ¬ƒwN†æ{mÀ¸©Ð®»9¶Ð'àÚ™c¸væöhrW÷ã©-°dð$™¡Ÿ¢ì©â¶¦mš DÂߣg(çV•,“q¿Ì0ì?»©ÛÏ! @¦B¼ç…Mñôs7ÜTéÇTüÐĶ¥Gw“ Ôw¯bo?3A™zã 4-4ˆÅw:cþÙG¿ž‡ë› ’…‘‡ Àü74="ДÈ^õLdd­Æð#­ÊXéñŸ0 ‚ ‚oÆZڳðõöÙ¨òS_øŽ)jB¬Ce¿ÉX°ð ø»”Ð\]£-0PÐÇÅÞH é ¶È¹¥BëÔ{Ž!VqÔ «Ð+¦áÚ™›¹Ì{ÁØ}.v5jÀ±_ÞÊŒýß'êOžŠv ›Kµ]¦l¡’OIéPÅ^¹ØÔCÿÀ*HÞ÷5Ž=(9××Yhê‘YŒ] VµaÚ‹–¸º1a©j¾Á‡a8Ôîô*çøŠž¯$…_B\†Z•ú””­Ü{ ¿G> lІ f‹7o¼‡ZýºÁ]qêIÛ•c'­Î¢xù(Ù½`›šé¸Žð˜rxiÙûh”°ó7G"C1ÞKU?Æb°˜q¡LÊeì½Ôé슚Ÿ~ë(ŽÝš D #>—|ùwœ¥Z·´Dä…ó8>O.\‰A`wMæúIDATJ~»g¦#%€]yØi‹‘Oþª6º¸€çöâJ ¶çQ/v¬‰Ü׫­k¡³¿ p~?ÂRJñØÆ­Ü¨“QH… ‚ E§JOÊÐgõmòÁ/íÓ¸Àuj–£®ÀuJ/pMLÖÛjwÖå;åUYìéýæ|¾3º»tðg§¾ã¸`ûM’1ü2 çÚKzŒÛÏGLàù¯°{÷W8ÿ@ùh?Ç>vP'èÚ4áü0’×àë][°Q#ov™ü=¯‘¼”{Új > í[|ÄLRy?Õ›:vç€ s¸jn+iUÛ¥b •|ÌÑáã׸x5¨N{­ª½rÞ›{§HQÅÀ{†¦ËÊyçñô _Ö«ÛM}»sâªãLa:¿Z+ûÝQõ|ÎÎîÌV/ø±×ø%üýÉ++é_Ak†oX±îôÌd"÷ÎîMïv|eÕYêyË}ìóNŽ5‘F©>J:56.¬ëéE¯–/ó‡XòÁÖál•{•’Žî¯“ ØÁ¡ oV꿇é<ÉIî:E»+´]çÊ®ï|Èׇ²“¿?;÷Ëy¿Ý$y‹ÿ×!Ç7ÔõS”Ý•|Cɦ*q¡¡]UO>ïדÃßú”»®g’§ùq€S¾÷A⽄ô£ƒê§O«ø¡iÑÑcÒqf2¸ÀybI1;™H2öÀ*NÖ‹]:vfþ£øêËõ²NŸÖ8²íòp’I<ñÅL¾Ò«3;uëËo¾ÉÀê…ó´£ÏÚR†+G²Gÿ‘œdN>9ïù†-ãÎþìØ{íŽ!ÁÏüÊeéPSž/®‰"yßy™=zåû?G’Œâÿ¼¾îIÞ)†CÖ»ãW>jdðjûÖkx›7ùi+;y_LDDDDDä_»’ɲ6§†Ò0ÇFÐU[ðª˜^_]ezÆu~ÓÇÕð¡!E^×S™îàÙ[ÉÙ¤ðfðþ§omÚæ?¸É¢"[OßÈÐøì /B7qF›ŠùÊS»NȦV.Þy‰²KÓÇ]àŽÅýXÓÚœ|¯.‚–ŽMGrÅË>'-&„[æö ›N±]ª¶0©sth€Ôߨ¥¬öhßî[Æó×ùØ¡Cãeiû0è¦>ßɼº‹«Æµdy­ù8ò‡+™™“Kt·-EïBw±šö :ÌÚ³qY¹¥DìãÒþ5 lM¤Q­i‚¶Í—2Ê@ÓüèG{­+‡Ô“GG²Š¶ð½ÅÓyŽzæš5y6ew•¶[Õâð5ûx>&5ûËub3çô®IúQ°»šo(ÚÔd\زåÊ(’©¼öƒ–M¤_Ukó㽄ô£ƒ¦û(süPE4å;ò«X2i÷hº:NcËš=Þç]gbŽÙFñ¯O»Ò)·sb›7¾àÁ« Ù 2xïòvÎô²yü`*=¹üÈ-fdF,O~Ö9ûa£B>Zgv]qˆáq9w(¥óvðF¾ÛÉ­àËVÕØcîo¼˜í@÷/üʹ=ª¸’©Ä'Å:Žÿ#• }›õ­d°#"""""Räø#gf,‚ ÿ>pîñNÿ2÷–v@Ûéû—)Z1 <§íÁ‰EnX×Ö“%Ƚ ‚ VT ‚ <=èqç× ˜¼nSvcÇ”º°¥˜ñ«îï)[phQ3œ˜Ù3Ë„XAL¡‚ OLÆÙ•h6uN‡#M4bƤØuš—Ǿ7}0ü“ÓH’± ‚ ˜D¶O ‚ ‚ ‚ ÿß"Û§AAA™ ‚ ‚ ‚ ‚LŠAáßþq*Ûol>‚õ½]`QÜ̬ë`èVbv§ÊÅÏë1t¨ÒáeøU±£ ‚ ‚LŠA¡øhÊ4Å[;`Y‡‡8™\üƒ/l`ä;¯¢_Cû’ÿѳ®‡‘}g6cl][1ž ‚ Ȥø±Ñ<úÎÅæÑH!A¦âVðF¼íçTòOëË´ÁWqi@Z­slŠJÍû»þ®û ïuvCÎ:@I¥ÉR‘'æ†?^ŸÃ+A£Ú®¬a$lú==àh–½L•U0­}ã)Ø›H0ì4´Î÷‰Ýs¸ôw„%fÕ#9ò>×esó0^ç?úÁÞ=+×Y ‡úxkÝœŠJ„þÑqL¬‘sH»*´Õ{/ã^A¦#6t+>èäjàw ìê Ç7ˆ;ë}QÆÀçOj¯œ¶«ØKëˆïáÏþnÒSضtš9jͬ qðÂèuGpãAfàNÈ&Ìlo(–‹Ò¡¶°¨Š‘‡ô ‰3Óê´g‰Å…éTö1møNÛ€Óq™ 3wf#¦·®˜§¥:«Ä©ªžMÅ BYªz6Õ™5#.‡öK~Á¼æÁ˜Ñ¶7–L@©\SlÊ^ŠýRÏb~@W¬Šï‰µ{–£S%yÖ,‚ Ï¥|%“:{ÜÛ9¯Ì G’ccôo>æýjƒ‹5±ån |‚9|ñ¹uÞ̹+–lxÕwþ†ðT4FS¾Ü«Z!ô? Û‘·&èóÎ2ÌÙ^ ‰Ïùà“+éÐX–L𬠔A; laW ü!€L$FÄg­Ž¨´ €UñøåÔg¸³ÿymß²@Õ&þhWY‡Œ#Ê`¼Ùzö%æ³RÂ5$ša/õ²›ú“ðóùhòس,Ú-ÿ?¹Ž%cÚã§Kðºk×ìíõÚº+>ßêÐãuN¿Žd@YÏJuÖØ¡áøï°kéóÿ~ V¿¹ ç¯G!ì¶>[ɵ1ò“9ð‹^‹ýá¦u# øp1fÿ‫5;â›è¬t–N-0hÚ‡˜3£ ª¸kÀ]‹c¯œ¶«ØKcå„çjÛãÂ]1v?QÃ;¯Îú'»yáÅç§b|¦Z}´ÎèõÅA|Þý"–ŒòÃæÈ ðŸ±ó÷üŠ´m°ôrššÍh»eÍx½U vï·DÇñÃPoåûM5#ÞUË2ƒZ%ÓÁ}tö.öÆßKF!ðÐfú ,Ú³ ÷ëuÄç×3”ël:NÕôl2UÊR­³©~ÌœG© ßÀêñÎ84±-–ŸI.¥ëìe†õwv`J—‰hú¾œû#êO8€r¯ƒ ‚ ç< '/¼]—–9+ß›È˽i«ªCeÿ±¦çœ+L ÁFßãÅÌü¤…m)Ä…éTò1›¦\A&oÀÊÚlÿwÈ)äõ…M²ýY¥R±»š¯šŒÁ'ñ1cýª¹ý˜Q)Cßu1ä­Õôµ7Ò&Çæœôå_ŒLbú$ÞYËNò꣱oÈkóF*I¦ñæé3L :¥V–ÿša¯¢u˜_¬XwF™~£ªYðŸþm)–üSYСf¾½7™W–òûÒ,KCÇöky‹÷øcJÔš‘¦ÀX££½[ ¾²>œúØÙ3{`]Ri²&ƒù§þ!Ү嬊૳Öe(e’—g7¤•Ñïš;6l/µ²@èÜøòÖXÞ Īº2lûu¡Á¤EuŽý+“¼ºŒíÊgéÃÖóžÑßç¦î³õ`æ¤Øˆž•ꬭÌ»‘ÎólÔ¦3ƒ‰ò‹‰ÞtÔk§–.ƒvóOsZ˼¿k4Yõ·õæòOŠÿI{šÐAS‰}w§‘W>b#kµúXTŸÀ`’dž»æÅ“EuN8Iò¯¡¬¬QÓ¡²ÿØ4áÂk©<ùªu–u8=TÏè-³'ß%¦cP)ÞkLd0É#Cªñ¹×öó~âQÎôôàð£$OŒc5 Õ>JÁj*Íö1ãýªyýXQvoÊEäÂ’rÅŽ>kcÈäÃ\8¬#}Z¶bëŽý8j|/zXåøeeöÙtÔ_ä7Ó°[àPNýìO>Ì7)V¶—Iš°»ázþ9Ò­ÀÃ3‘§ZÒ‘½»³T Òº ᡌì§úŽrv«²O>hR'Õ“§¦ñ9KóÒä € r_ö«š»BVRiЪÎdLJÙúI<ÀƒëÒN£^g›f‹ÁdnéèP„^rÀ…9Í)µ-•í¥ZVõ;óvsÒ0<˜´­7–›nŒ?Å­_mbHbÿž×žµ¦ê|ý*¨ëY©ÎöþܘHÆïœÃ¡-Ù¤YZp„ÉLà–~• >X±yn '¯®hÇr†ìedR\<{åµ]Å^'Űa³%äà 8(ÖǦ)]#yv;U³¡tpà‚Ë$OŒeU 5ªµ´i¶„©'8Ñ]GÀ’uß>ÏÌèli[Òqa:Õ},üé½4‚d ×ùº0 (‰¼6ŸmTû(…8UòU•TïLõ«fõcEI¹^Ü«'r3ò0³{lO%o¬aWÁïuN_¼'ãI^ÿžC=¬ Õ9˜SÛ5góæÙÒ¤6-Ôí¥Tg—aü‹äßcªæ­ðX5à¬ËdÆÞþ¬¤)´}µé›ÜOÞÞ4œµŒ MŠÍ²—ñ¶«ØËø¤82oR¬T ˶˜Ê_"2óMžÒH’©¿u££¢ÕʲaÓÅ×™ú÷DÖÐeOºÌâ¥ÌH~ÜÜF9–ÕÊ2ƒJ>–;ɲ'tåX½FZÁÁè¤Øxe:NUô¬ƒfô ŠýªJ?V”hœñ0ÉÃŒ~϶þ8nŽ$É;<´”¯÷hP &:læCÞâªVù¶Û·—𠉦2‡üIfîïÍò2ÀyV$¾þG uhÏ/bÉûß—Ö“t[¶XM>ØÀNŽæ§18‰ÐºrØáL2d2=t%—Æ`ÝÊøpm ùà§ éÇxµ®Ãù'Éó3ëX….‰wT ÛËtY: :D£¤åØê„ƒ¿ºK^x¯aÖ{­µüùÙ 2ik–×<ù;Å…õ¬¢M¥ðh yíËþ¬nU„îŒmŸþíUôöé9ô´V­OŽX²œ[-Övwe¥†o1”ä‰IîÔ)êP©,ëFüèŠa÷¹ò‘g®¿”L\˜ŽA¥xÏÝŽ›oWÖ5k;îÉÂÛ§‹ê£LÛÝ´žcÐ,SéWUú1SþÀ $›Y9³yß)\¾%„ñ$“/d‡JYïñ:øod"osõ vF'Å¦í¥ªÃ¨ªqÜ 2õ·.,+ ‘gE¾Ö8üÏë¥G&­®ðÅ:Tö›Œ ߀¿K1Ŷ©‡þU¼ïk{PŒ4ÐBg¡É­{©¦Ñh _aRD3cÿÀ÷ljú“§¢]m©ÚËtYĽ߆ ~Æh˜+-0|ÛCàÆjôj>oê¡«Ð+¦áÚ™›È9À6ó^0vŸË€]p,Ö]õ¬¢> ñ( v§P9§l<_H ¿„¸ìÃhuUáëí³Q姾𳠑iæ×—!¬j ´-qucÂRÍ­O:îG‡#<¦^Zö>%lÁüÍ‘ÈPÔ¡JYVî=Ðß# Ÿ6ÍçCÞ¼ñjõëwËRŽ c1X„écŽbo$ÐtP[äÜÈ£ujƒˆ=Ç«/Nÿc®¯ªÅ`‰÷«fëÐ)—±÷P§³7*e²´;8´oôn 7Ïé¸ÐbVŽ© KÉa{p•ѱG=»5Ø´½žP‡6îhåDŒB*AAxF8 UJmÖ­se×w>äëCÙÉߟûŽå¼ßn’¼ÅÿëPh[Ý \“õþκ|'›):÷×xŠäÑUŒnñ+*MîVɾ¬W·!›úvçÄUÇ™Ât~5{•¡„Òöô~s>ßÝ]:ø³Sßq\°ý&i`ÛaÑíÒоÅG É$õ—7ñÃQ½Ù©cw˜0‡«æ°’VqåQÉ^*e=~¢ìcÛmšp~Éë?ðõ®-ب‘7»Lþž×H^Ê9ÙØöN//z5¨N{­ªžUêlźÓO0“‰Ü;»7}¼Ûñ•Ug©çu.÷±Ïm‡ÏêÛäƒ_8Ú§qú4ªY.wK¼ÆÆ…u=½èÕòeþK>Ø:œ­¼¼X¿j™lÛ™c/ãmW±WŽ~ÎÎîÌV/ø±×ø%üýÉ++é_Ak†ÿhhWÕ“Ïûõäð·>å®ë™dÆi~à”ï@!š*KG÷WƒÉ„ ìàPÐÇ+õßÃtžä$w] Æ…éTó1KzŒÛÏGLàù¯°{÷W8ÿ@ùh?ǺëÌè£TVoUô¬ƒf¬]gõ~Ì´èè1é83lø½f”eëÖóã7_f—¶­Ø¢U{ö™ÄÛÌà¡ÙÛÉ5åøâêH’w¹gÑXöîÜ‘]ÌËùOŸ6Ã^Eë° Ø·^ÃÛ¼ÉO[ÙÉSw‘gGªäÌŽ·–JVµ8|Í>žIÍÞsöQ'6sNïš´Ñ<~ÕG¯¯®2=ã:¿éãúÄ'wÚ·û–ñ¼Ãu>vO”Fë܇A7õùöÉ%óVè.®×’åµ%›•Ùyáž½•œ&…7ƒ·ð?}kÓVcn»´tl:’+v_d\öa7i1!Ü2·ÝtŠ`e{™*Km0iS«?ï¼Ä97«Ä]àŽÅýXÓäA@$Sc—²ŠzV­³Î…³¶ðl\Ö{³)û¸´Í¼íº–µ95ÔÈvÊc#èš]žmó¥Œ2äÁ~ù¶’ªÚËxÛUì¥u äW2çMàäèn[6ŠÞåµfú-[®Œ"™Ê»a1hÙDúU5p­š)š*ËÊ•CêÉ£#Y¥ÐË:ÓyŽz–wv±ãB!•}Ì¢"[OßÈÐø¬Tñ¡›8£MÅÇú²¢ë¬8QUÒsÉMŠ‹¬³ý˜ŠhÊwäW±dÒîÑt/|P¢…3;ÎÝÆ31r­ñèön›ß‹5òOT­ÜØùýÍ<“žûþ{\ø!®ìæœgE{)OŠuÿG*ú6ë[ÉCDDDDDä‘­rw¸u°SVÎA„ 8÷ø§Š{K; íô}ˆË|Ê«¬±ƒç´=8±È ëÚzbò¡P )‚ ÏìÊÿ‡ÒY-1G4vlôÚNÞgO«[ôÖÿ¶hé=uïó¼Õ˜e4b?ÕªµµUkíïéfŸ¶nT­+ZÜP5@€„%!Ù÷Ü;óýýqƒ [27Ü„ß÷ë5¯Üœ;sÎ÷œ9ó¹sç"3¸8˜ 2QJ)¥”RêèVìÖï/»ý¾Ùø,w.pp±Æ[)¥”RJ'^~¼~¸Iu6p¯&ÓJ)¥”Rê8O®lìNRýà1ÀÑ8*¥”RJ©ã\¸øÃÁþhâM?,ŸRJ)¥”RXÀ…„/8¿å'©þ)p§ÆM)¥”RJ©œ~°Äzÿ¤ú+„¯PG•IÅ© Og`åVŠE»Bc¨”RJ)u´'Ö»U{_èx{G6á{¨‰óžZ½–«×óÒ·¦Ð–úü ”<Æi&¢­ÆM¼§_ø׎ŒÑ.è&¡RJ)¥TŸòX[þ|@R}/à@"3xÓ^¾–ù—ý‰¡?øg¦=ðs<òë©,ºáÞ©Ö+¥J)¥”Rê¸æ´åÏû8ð’.Ÿ}»V>ºa°Øé—Ê[µ«ä¦QCä²gKdçÎ’tko9Kâiòç 9¨úgÏ’ä½åb†ÊgîyA6TŠˆxR±îyùÉC%¦Ãº¬Œ¹rë£ÏËÒ¼©mÝ»–*yÿöì}ÊuºXY²ð×oËæÒÆ¶÷·JÉʧä‡g”@¤Ûê¢ÎñÓ~$oÔ‰ˆHÓÎ÷åÿþøšl©q÷|$¿½x8~ëã7†ºè¢‹.ºè¢‹.º‰åÜŽIõóíHS~·KŠŸÎ(ùæZÉû¥\}î9û¢ä¾Åe"R ¿—æ[>êœrÞ¿¥Yrå§çÏ•+~¿KD6ȽÏ—ëÿ¯T¤äwrJ‚Ïúø‰¡.ºè¢‹.ºè¢‹.Gjy~oB=hÿ?†]%ÿï“R©Ù“+Oßñ]YT\(^˜Ùí.þäßÊnÙ-¿=9þ€¿ÙÃn”å"²é®‰»÷õØÉòãÍ"òáWe¨Ý1ÑmEg'wº-;>EÒÒÓ%==]ÒÓR$Þ>HRýö¥’¶÷µøéòóm"Þ_–!>·å§Î)çý[š½wå² $ùÜç¥Ñ{_®êg$ù¬g¥Þ[*×0¾ëÓU uÑE]tÑE]t9¢Ë ¸`ÿ{A‚;ÿÉ ' 5k;•Yïý’Í_z²šRV>qCÑ»%aì|r(aÉâZö¾Ø²Wß,œ3ÉÚ™ûøvª*+©¬¬¤²*ŸGOIìü-M›xñõ̤¾·q=Á`/„‡…mLÔ꣔RJ)¥Ž¨ àÔƒÿÍ¢ßyòøü·ùîwæòë{—pé”W¸qùÜù§—øÚ‡Q¬‡9à§éÎzšXsï…,x2>ü L¯‰]뚺x ž€±0=UgqqC.ž¯õv·>J)¥”Rê9Õ&4¥Î<‡û6ïÞtïõ{Ø‚¿³¾p Kv¦ðÅA±€ÿ¤ZZêi!‘þÉþâyã–%är9óÏEì²õá+¿±£9oÁ û[š"iGͦX²)‚·†qæ!ï=ò›ý½%Ò:×½y9)mOÂKêf}:‹¡RJ)¥”:¢&;À°3ê üâ .½…i/Ó|vÍi#ÉŒßʨÔZ¶•¶F´•–Âå¬oú>—üüÇ|ég‹)q3.eOü%—¦]OñƒßßÁ~òož ÝÁ“ëm¦ý×ÿp÷¸B~Ö3º=Ðì™·óóo'±8/ÈØ+ïáÞ‰Õ<û¹gÙò÷v×G“£\ŸNc¨Y)¥”RêHÜhm$}Áïe{É3ò¹ìðk SäÛ/¯—Õ+ÖÊê§n11‘Þ¼##¯zT>(j? .X&=r®dZí§»ðg/˦šðŸ«7¾$?»pØ>ÊóûEEü<ý£v¬+†bW´TžøòdI2n«‹:wü¢bÇ÷%Íÿ§ÔzËäº,ßõñC]tÑE]tÑE]ŽÔ4mÿ8>8£øæªmüªò³¤Ÿñ/ªµ>J)¥”R* , RJ)¥”RšT+¥”RJ)uD_·(¥”RJ)ÕôJµRJ)¥”RšT+¥”RJ)¥IµRJ)¥”RG5øñÑRÙÀ›3`˜ãQ¸¹çoO<;ÀÂïÛ´|àQ}°_X‰5dL²ˆkš[AÑÛqî5½Ù_>¶¥qVÇ’^ÏÇð‹›lsÒ-'^í0á›aÓ f›GUޱ¨±cuüôµv‡Ç‚ƒþæu`ªÃÂ[qÛóX~[ˆÒ#ð3~N¦E‚ Þ`ƒ…àöðö¼¶AàbCö ‹·Xß{lMx½çßi ƒ.¶™pªERê¶xä=éRTqdúËÏ¶Žº8G±íê0†»ÎÏÇì3)'Þd“¾ÍeõÓM®!6škuÜGsŒ«ã§¯µëx<4©mvyëÄLu˜s1lz(DI=àAcó‘©lÓ‡A–¼b!Ø Û Õ xÐzœ]mëí8®´‹fœ»ÿbÝA’ ™c MMguìÑùùØe¥’¡èy—Âm çÒ1¦Ž²ã®öÚØÙν>ùN]ûŸ-;†Øäœi‘œ­E‹\¶¬¼½H4Œ¼ØfpŽ!9ÓàØá×+Ÿ ²ôõörV2Íâ´ûÒö¾âÕ½v*oq¥Ã˜†ø˜pËZŠ<>ùeˆ²†pk³.w˜8Ý"1#|Cy¨ÜcÇs.WXg¼ÃY7ÀŠ;BTvL¬c 'Þ`hâuuW…xýqßè*>Ž!ûž# ‚,þƒ„×o1ça‡Øg‚¼ý† ~Ú壌¯8û¡c°Ð&{¾EJb¸/šv{ì~6Dî†(*,ÃÈ;Ln<ø˜ˆ¤¿LšÅôï8 Ê ï^µPørˆõï !ñÙ_>¶åöÁ8ûi{—üîd.pÈ9Û"= ¤N(~#ÄÚÅB«öP›“o¶éŸ ^¥°{£>Ã"!$lÿKˆõ«ÛÆü“N¶HJo£e§Gþ"—­¹ÒÞî(ÍQÑ’b1ç~‡„%A–<Ý~•-ëæfwy÷N—ê3…£f~ö9ž»œÃ£µ/Gp,ˆŸh3á‹F¤YØóZˆå¯´•ëb<î¾S·(ÈÛ¯µé^êS_ãÇϱ©¯±(ÍQ¾âìsŽòŸ®êÓ›íŠæ±ÀÇx>&®TûMÇû]é0kì^"·RæÚdÃ!î¡ k6µK±y†ﻬ]#47 V‚ÁûšÔz|tWÇ6 ¹Ñaì!Ê¥ÎaòLØú·%%ñ†¤þPß²·Î†¤l‹d×eõ£B³ °±7Zî ²µd¿Î/vÙôÔïŸ!· ¹÷ÉnsÊW,Êÿ$¯°­®M‘}$øøj—2¾âìk[íc£ø…ó4ä/Ùd 2änˆâÕO¨ÛL·2Ø£ è e|ö—4…χØY-„Œ!m®Íäk¼]AÖæûì/Ûê‹qöÓö.ù‰³ŒÏ˜;v>"w»›m3å³f6YúŽ`R ™™BÞoCÔNu˜qºaËcAf8L»Ö¦07DUÈ4Á"©ÉeÕ…úŸi“ýM‡¸ƒ¬Ë‹î•±Q/“,¹Ô…€€aÀHnö¨æ¥·¾6?ûœ{»œÃ£µ/û¬Oü,‡3¾l!›]òþ"ÔWƒI@i[Räc<Ëaî;nmû¶z«Oýn«·ŽqQcQš£ÄO»Œ9Ê×z|Ô§7ÛÅcA´ÆØ1‘T›t‹ìy†úƒ¬z-ìÒ‚uw€ñ—XäÝïÑÔ¡j?v)Ìýt‰0q‚¦‹NovÉ0ÐàQ±Á£²6¼Êƒ¬Š×„ÏrËw…Ⱥ×aÐ8ö’}'@©¶¿s°=ZÊ„P¢à!´îꊯ#+>‘´«³2>ãÜÕzH³È>ÝÐøJ•/·íˆñ£ØÄOÙï0éîF¬u)Xâ±k£àJ„ýJ?nSU 8Ù!sœÁäï;6Ù_~¶ÕãAÛ}äëºí&Í"ç,CùŸƒ¬YÖ¶Þ‚Œ‹aÆ<‹ø÷\ZÛÖU›/”y‚{š¡v«PÚ"LžiHŒƒªú¶V ¥Úâ“+ÈŒ½ÔbëÍiQœ£¢16<¡l©À5Y.ue`eZôO…ª•âûÓ­£u~ö3Gu9‡G{_î¬>±†qWX8ÛB,yØ£!tð+¨]çF/JûN/ö©¯mõæ1.Zc,JsTc$qîdŽòÓ_~ëÓëíêåñ|Ì'Õv–E2Ban‡³—P¶Q?Û"1àÑÔÒ»)&Dñ­³ P½Ê£ðC]ë„ ×Ù:hl…”Ôcëç%ý´+Zmß=Ö‹d#õÒG8Ò(l{,ÈŽ,†žn1úr¶»¬xÔeO}$WT £/s1ÙŸ¡:Áq 1¶oŒžŒsoµÝ`‘bs}€ ¯ßï5kCë~“sÛEðM''%¹ÂØYáù'Å9*Zñi^ãRñy‡aÓ ù‹…Ø1IžÇæmÑ+}q~ö3ÿtgVí_Ò,2’¡z‘Ðêþxnô޾>õµ­£à›ÕÝ9ÆõhŸî7Gùé¯hÕ§7Çê±2GõjRÝÙÇFGŠ[ìñÑ­¤M±2Ûbü-6ÙÛ]VüÆ¥¼“äJ„>ýÄn0v䩟vE«íû¬Çj»±—Ï2C%O{ìXbqòÝ']äñæß}ÞŽcF~=@N¼º”ìLªÅÄ›í¹ºÞ§âÜëm Ÿ±eÿ[uÜpòböKªÅ‹`ä{=0GE1>Rã‘¿fžf‘ô–KòLƒä»TÔ÷Ò2}onë8ÿtwVíSñ;¦:ÏÇTŸšè›Žä‹ÆuXº5_G«>Gx¬…sT¯%Õn™Gýr V~û²&ØíÒÐ_Í8p,~õ"Õ«\ªW¹llsêÝ6“OóxëU‰ún/Að0ÄôdÖåASØY† B½ré×Gœ;•B#™£ ¦ ë¸ÇŽ·= ÊÞpÙ…GGy•BI)d 1ئý6Nû+`È ¯»ä-oÏeÁî%–¾ÆF/Çùz±ín©G8dŒ€¦•ÿdÇI)´1Ä+7ùœ¬lC¿ñJ]ƒQœ£¢ò×=Zn·™-Ä‚ÊÿZ¢¼_÷ÙùÙ×Ùq×sxoìËRãQUo3d®!~…Ðèvo<}êw[GÛ±)ZsÔá\Àè8Gùê‹êsÄÚÕú‰9ª/'ÕRå±ñ]aÎEÓ=—Â"H™c3~€°ã¡ºF„ºmgÛL˜ŵ¶/ wHÆÅ<Êw­!ˆgˆzèŸ^•P„—Ú {Eh¶ )NØñaŸÑê {– \e3íaÛFäp»zlŸè"Î]¾½Ìck®Í‰—9Lñ\J* q¼Ex^ŒaÂWm†'ð7žŒ0v–aÐå6©e{v A1$M´˜0 jÿµïÄÑi…„=%5×fÔ.—Š É">Ѓc£7ãÜiÓ‹m¯öÈ]"Ì='ÀœD—‚5B‹ q ­«\J*#ÜØ›ì³¡¬ ’fØd‚Ý¿ Ï?Q›£¢ŸPK~Q€ìë°O Ÿ¸ÚaÜ•à 4Iøž6ïÀ«R¥ë…a³ t}7>³€ ô;ÇaLfø“#·Z(}!ÄúÅûM´õWHÈ,DÌÕ6cnã„Çx°Z(-íÆAÂçØèµ8w‘4öfÛ+ž òA…Äù6'Î ¿%Xæ±u‘Oìdžã0"5üØ´ ²au[£5GE;>!aÇóco±<ÊzâGúÚüìs_ö=‡÷Ò¾Üø~ˆ·km²ZŒÿ’ 0[„ª¥.E ­ÑÏ}¥O}në¨;6õµ9Êg_ø®Oo¶+ q>sTO;–¾›§úò@ëo3ïlZoåÃUóa² £~`RC'Ï'ïËÕh3ïn‹Ò{ƒäîÐq«”ÎQêXàhTOH=Í&½I¨¯L’aÀ96)-oÕØhœÓž8CêÀð+Œ¸Ê&veˆm»4.J)¥IµRœ¡'³˜p’!¦í£×†-k Q\«áÑ8Ÿì¡63o·ˆ¡fYˆ¥÷¢þE¥”RGŽÞþ¡”RJ)¥Ôa²4J)¥”RJiR­”RJ)¥”&Õê0H?ÓfêBƒ­õÑ>UJ)¥ºâ†\b3~b?dh mžÍäsõØtÐvöÇÀ›Óoµ ½äýãMb  ’ïQUw”D¦ëì+ÎÕÇÒO·Þ ä¾ÅžévBè¿>Qc½Ð&Íâ´ûÒö¾w࣒ü”‰v gÑ?½1£66ŽÕóÈ#Ÿ¾6ÿô¶¸É6S/³è?Ð`yÐTè‘ÿ§ÛŠŽâøø8vïýÞðómbŸñÈÛàóëuÆq†ÍÈaÓëzlŠ(©v2-lð,º<{ÅŒ[,Šï=z’êÞ¬³Ÿ8÷•¦:,¼åpxËo QÚݶ÷êÑI}¤ÖcåO‚ضaðWÆäý~ʨÞÝwúÊ8Ô±Ñ÷âÓ׿Ÿ^=‰I±8ñ&›ôm.«Ÿöhr ±™Ð\{tÇÇϱòxîwu“ꦃ,)2xÅ¢WSzÐÑçÐf—·îq1@ÌT‡9æ‡B”Ô46ÁçH}¯íÖǃ†" 2uâà§ŒêsûN¯ŒC}.>Çó1ÎJ7$;BÑó.…Ûà`;V㣹êÕ¤Ú×Çp².w˜8Ý"1#|sv¨ÜcÇs.WµýØé•¦¡6'ßlÓ?¼Ja÷F!}†EBHØþ—ëW DiŽò3ýÔG¢ÔvAö1÷8†Øäœi‘œ­E‹\¶¬k+ãw=~ªäc~î­1fR,æÜï°$È’§Û¯BfÝÃìá.ïÞéR“¥cÜÞ8/´Éžo‘’ž£šv{ì~6Dî†ÈžYÛé±)Z}ºß1eø÷bÞ¶ýºEAÞ~Íçþå§íŽ!ûž# ‚,þƒ„Uñsvˆ}&ÈÛo´í;Ñ8¾û8Vº‘´«—ö¨Ì«~ëkv¹Ã„9†8š hêN¥†Ù̹Ï!5#\Ÿ]/†ØðA‡¹.Jûû1‘TK­ÇGwqlÃñ1œ1$e[$».«šM8€co4´Üdk Ð*äÞ$¸Í)_±(ÿC¼¶„LšÚ&;Ÿ 0w>ì|6Dîv!6ÛfÊgÌl ²ô¶.Åbä¼ï²vÐÜ$X SÜ>`¤A(|>ÄÎj!d ism&_ãàí ²6¿mÒšåpÆ—-d³KÞ_„új0)( oÇW}h-lØÐl 1ÝÐ\.x †„Ê:Ÿqޤ>U›ŸñhBæYá¾h¾3H~ù]ÔÇWÛôÏ9Lž [ÿ¢¤D ÞÔê#¸’µ¾èc1ô3æƒ[<*=‡¬“ ö¶¶ñâÎ4xy.• þ÷A_']>öÁ. )†ÌL!ï·!j§:Ì8Ý°å± 3¦]kS˜¢*Js”Ÿ~÷UŸÖè´Ý_€|̽ú]é0kì^"·RæÚdÃ!î¡ k6ù\ß*u5?÷â“z¡pLd‘°È¥. FBp³G}0ŠÇ¸q.~!ÄÆ| Í0éK6Yƒ ¹ü§Ô]›¢Õ§SÜÚ¶mùŠOôÚ•ã»c¥DØ®ÞØw¢2¯ú©ÿ+À´é®çBì.ƒ¤‰6†tÿä¾ê?!6—@âL›‰_ hheå' QÜ߉¤šJÂÃ5·vuЊׄÏôÊw…Ⱥ×aÐ8öAZÊ„P¢à!´îêŠ<Ë9ËPþç k–µº ãb˜1Ï"þ=—Æg5µ»æ~:Ôö]YP(ýX>ý[U 8Ù!sœÁä kw……³-Ä’‡=vÉÙGýhÙ rº!Ö†à‰æ_~dG²!ƃÚŸqޤ>{< W¶õÅn—?·<ÎPP~„pgõñ9Æb2 4xTl𨬠¤òHõE_‹¡Ÿ1_'ì̃éÓ-’þåRk€Å,({Ö£EÀ¤G¶vª«úø>Š@m¾Pæ îi†Ú­Bi‹0y¦!1ªj£4Gùí÷®êÓŶû>á:t»H·Èžg¨1Ȫ׉IéFÁº;ÀøK,òî÷Ú¯NuŸ½ótœ@‡CD3¸‡šŸ#çkŒyBÙRk,²2\êÊÀÊ´èŸ U+Û®–FéGšEö醯W‚¬|¹-Œ· ÄFÒ—>ŽM&Z}êç˜â#>&Zm'JÇ÷hµ+ÊûNTø[:«6ãN‚ÚgC¬^~Oéf0Ïé^ípÙøFÛUþ\Á s¾Eî¦Ô(îïÇDRÝí³)hl…”Tÿ?Õh°H±À¹>À…×ï÷Ljµñ|“b}™ÃˆÉ†øÕ ޱmw$¤Yd$Cõ"¡1Ô³ î‚q†øxCì) Î65B Ahìá{¥^h BrFßøÙÌîÖ§ü™Å·:Ìz0@õ*Â=v­‚ÞÑÓ=îƼˆPö–‡{“ÅA.5; ù‹ÄFµ›{Œxʧ AÚÚÜËs”ßúD½í‡Ñ.+Ë"¡0·ÃG¿!¡l£0~¶EbÀ£)è?>ׯ0÷”ör;ïoeõVÿõëí1ּƥâóæò ±c,’<ÍÛ¢çÉF(ZwxùÇ&;Ê}z¸ì(µÝÿÕìÞÙ¿úZœ»ÛöÆjC®-=p‚ï ›N±Hx´Fq?®“jºñôk¡ð‰[Šì(ßɯmùõ9ý=òþéR²[0©o¶ÛϤýlµ§yMb“2Ä2Dغ†Ï1¤æ¨pºSF½}êIäÝ©[ìñÑ­¤M±2Ûbü-6ÙÛ]VüÆ¥¼þè鋉¡Ÿ1´nò(ntrªaS)Œ<Åм,DeÓØ»‘ÄŠÝT÷æ¨.êÓmï‰v™î­§öÕ K—…OH¡©¨{Áë­1&5ùëaæiIo¹$Ï4H¾KE}”ãlµÝãz¸Ç”Ã96™ó‡â³í"`ìÃL3ûÀþuÄâ|mß§>mëªDDñ‰Âþ~Ì%Õ¡ ŽEDW÷YM< 1n©G8dŒ€¦•‡ñ…ž€!k4¼î’·¼í ³Ì£1Ø>ð¤Æ£ªÞfÈ\Cü ¡Ñí^ý]Ñj YgØÄîvYýdœf3*ÁкIJdq>Üút;Þfô$({ÃeO푾üêcŒ… z•Kõ*—ƒmN½Ûfòio½êïŒ;Ú}€ë1`ö}$e—1@“Ƕ÷„!ólï‚ÁI¦%í÷ã÷æ>©ÐƯÜÔÉd¥9ÊïzYŸHÚÞ cÃ-ó¨Ã¡_ŽÁÊoÿ’[Ö»]"<‘ –{Jº_шÆXgññgò×=Zn·™-Ä‚ÊÿZ¼èŽ·RhÄ"s´Átÿ  ŸcS´ûôp÷ _m÷ ©ì,CŒ!¯çç_ÇÊÎÚu$âÜ óêÞveM5ØùQ~Œ`À•ÓŸ¨S޽¤Z¨Û&p¶Í„yP\ aû²È>îñª„º ¼ÔfØ+B³IqÂŽ·Ú#w‰0÷œs] Ö-.Ä 0´®r)ñ{mHØSYsmFír©¨’,â;ÜH‹÷/A_p8ý6—-u5`ÅC¼-ìXÑÞ®Nëì§>­PQ æJçÑTiؾÝ0=Ê_Üo>â|ØõÙ+Æ0á«6ÓaX‚ÇOágtvÑöŒ‹6x”ïZC?Î4Dr2å¾@„ú§ÙŒ åMŽ_e—Ÿ1¿÷Jã;.Ug;L»Üu! ;|yUzsìåñõD½í½06¤Êcã»Âœ‹¦{.…E2ÇfüaÇCM½ü)VDc¬³øDçPK~Q€ìë°žÛî—e1j¡Íè‘BáÕšPkR­”RJIÌP›™·[Ä‹P³,ÄÒ¿{~A1Z,Cò8‹ 'bÚ>–oØâ±öÁŵÇx ç¶G"ÖìxäÞ粫@o 8æOêÑ>VJ)¥”RêðÎ55J)¥”RJiR­”RJ)¥ÔQšTH?ÓfêBƒÝW[ç†\b3~bÏýˆP;â|<;ƘRJ)¥ŽdRmH?ÝføDËݱ†Œ©éÉQl]À0ì|›AƒŽât'Úq>J%žà¢'ŒÈèc;ƘRJ)¥Ž`Reö ‹·Ø é§¢äµ=†Ès5J)¥”ê{ô‘zꨪð UŸñ©”RJ©£)©6ñ†W:Œ™aˆZŠ<>ùeˆ²†Ç:,xbà–{<ë²é“¶Ÿöu Ù÷Ydñ„@¼Åœ‡bŸ òö‚ÄN¼/ÀÐÄðêFþ †‘m«vW…xýq/ü>?b Ã.w˜0Çç@s¡àMû´Ø0à›œ3-’ µÈ£`‘Ë–uá:÷¿9†SÒC,þ¹GsLJ &ZÌý¥CËí|¼ ².w˜8Ý"1#|¹?Tî±ã9—«Ä÷OûÚÖfq° sCÎÙéi uBñ!Ö.Z=ÀD§Î&ÅbÎý K‚,yºý'Ò³nŽaöp—wït©vg_c£Ãv¥Zë õ WªM¢aäÅ6ƒs É™§íæóÊç‚,}½m{]ŧǘネV•RJ)uä’êôÏ9Lž [ÿ¢¤D ÞÔê[ö+Xå±ù† džå0öFCóAòË}Ö UȽ7Hþp›S¾bQþ‡ y…m‰TS{ÒÖ% þW€iÓ…]Ï…Ø]Im& é˜}A¿+f̓݋BäAÊ\›ìo8Ä=dÍ&h-lØÐl 1ÝÐ\.x †„Ê:À’²-’]—Õ Í&œüŒ½ÑÐrW­%>›îg[~âl ã³æÎ‡Ï†ÈÝ.ÄfÛLùl€™MA–¾#H”ê,õBá˜:É"a‘K]Œ„àfú ¿8GÊ-vÙôÔ‡žè<Â÷]Ö®š›+Á`ŠÛ“Ø.ãÓ‹cÌ×ø‰V•RJ)Õ+yOuL†¡bƒGeP™ë±óÆý“š=…+=ÊÖzlú«K­1 gü? A ¥L¨ß#x­{„ºâðR_íÿ—iL†Í¸“ ö¹«{”®öضȥªc™t‹ìy†úC¬zÍ£tÇ–ÿbs©aø%ñ´ìI2ÄÚwR€ù?sž V²!ÆƒÚšŽ‰®P¼Æ£lµÇ¦?‡¨Á0(‚¶G´­NâlÒ,rÎ2”ÿ5Äš%ùÂîWB¬Ý™óÂíŠVñ„²¥'Xdµ}iÐÊ´èŸ U+ÃWœýÄ9RR+l§ó+´µ»®ñØ“'”­ö(-më÷HâÓ cÌO_D«ÎJ)¥”ꇼR]þLˆâ[f= z•Gá‡»Ö ÁN’©ƒœÑû?Õh÷7$!ìÚrè+xv–E2Ban‡ØCBÙFaül‹Ä€GÕ!gˆ7ÄžNpgŠ!Ð 4¶¢í ÐØ )©þÛìî¶ö‹³5À"Åçú^¿_ስ¡ÑNš×¸T|ÞaØ4Cþb!vŒE’ç±y›ÿ87õâm?ññzoŒ5»î +JuVJ)¥ÔNªÝbîl%mŠÍÙão±ÉÞî²â7.åõ‡^¡ç±Ïõo0v/¤ØÒ¶…î<Ù¬Ã{¼ &±IbH"l] ÃçRó T¸á„èÛ!¢ç©ζö3…O„ØR´GJøÓ…(Õ@j<ò×ÃÌÓ,’ÞrIži|—ŠzÿqîÕ±á'>½8ƹz‰°O•RJ)ÕgtžN… z•ËúÇ‚,þ‰Ký›É§Er«45€eˆé"q“ xbb»×·Ì£CÖÔCÿHÊÞ2ýr:<óÙ1dM0°;|¿²45†¬3lRw»¼åR7ÈfÔ4Cë!Åü/ZÛrK=êÄ1šJÚoŸ©+êÊÀvÎ*PþºGË‹‘ÙCGAå»B‹ç?ΑŒÃ­øDkŒõDcÇÛä|Φ_ŠNjJ)¥Ô‘pÈ+Õ; lð(ß!´† ~œ!h¨`íž°g™ÀU6Ó.¶mI¯gÿ<Æ«ê‚0ðR›a¯Í$Å ;>ô÷eE©òØøŽ0ga€“­Û7›dˆçoíeÞæ\ä0Ýs),‚”96ã;òhò€V¨(…aS ¥¿óhª4lßn˜ž å/FðÅI?¢´-©öÈ]"Ì='ÀœD—‚5B‹ q ­«\J*£?pB.ùE²¯wÀòX™Û~K„¯8ãlö9@”âµ1fE¹Î1† _µž Ã<Þx2ÊãT)¥”RÝLª-° ô_è0ºí½Z¡üÕk—GöÔ†wC¬H³™x¦Ã¬óÚrÉrawé~kiðX÷g—é—ÛL»%œW¿ãR¸Lü]IØóTˆeÕ6ÙófžÛ¾­¢i/óÏ+êmrÎs89‚%yºäí}"…5yYÂÖáÿ—.öföE;Û‹Ò¶*ž òA…Äù6'Î ¿,óØº‰Iª ;ž÷{‹…|äQV·__tçHÆÆaÇ9Jñ‰Ö‹vCPº^6 J׃Þj­”RJõ¾Þþ>¡:†XmæÝmQzoÜ¥”RJ¿ôUdgaq†Ôá\q•MìÊÛvi\”RJ)¥IµR¾ÙCmfÞn/BͲKÿî}úE¥”RJ©ã•Þþ¡”RJ)¥ÔaÒßeSJ)¥”RJ“j¥”RJ)¥4©VJ)¥”RJ“j¥”RJ)¥4©VJ)¥”RJiR­”RJ)¥”&ÕJ)¥”RJiR­”RJ)¥”&ÕJ)¥”RJ)Mª•RJ)¥”Ò¤Z)¥”RJ)Mª•RJ)¥”Ò¤Z)¥”RJ)¥IµRJ)¥”RšT+¥”RJ)¥IµRJ)¥”RšT+¥”RJ)¥4©VJ)¥”RJ“j¥”RJ)¥4©VJ)¥”RJ“j¥”RJ)¥”&ÕJ)¥”RJiR­”RJ)¥”&ÕJ)¥”RJiR­”RJ)¥”Ò¤Z)¥”RJ©žãtöG'Ðþ¯\OËh-£e´Œ–Ñ2ZFËh-Ó±L§IuƵ1Ì=¥ýÿ;ïoeõV-£e´Œ–Ñ2ZFËh-£e´LÇ2C%Õ ©é BÓ¡¾IËh-£e´Œ–Ñ2ZFËh-Ó±L§IµRJ)¥”RªkúEE¥”RJ)¥4©VJ)¥”RJ“j¥”RJ)¥4©VJ)¥”RJ“j¥”RJ)¥”&ÕJ)¥”RJiR­”RJ)¥”&ÕJ)¥”RJiR­”RJ)¥”Ò¤Z)¥”RJ)Mª•RJ)¥”Ò¤Z)¥”RJ)Mª•RJ)¥”RšT+¥”RJ)¥IµRJ)¥”RšT+¥”RJ)¥IµRJ)¥”RJ“j¥”RJ)¥4©VJ)¥”RJ“j¥”RJ)¥4©VJ)¥”RJiR­”RJ)¥”&ÕJ)¥”RJiR­”RJ)¥”&ÕJ)¥”RJ)Mª•RJ)¥”Ò¤Z)¥”RJ)Mª•RJ)¥”Ò¤Z©ˆÒ<Æ–ÖFVýt:ñ¥”RJiRÝ7’´øÑ—òÓEŸPÒ*ˆ »Vð÷oÏ"ÕpñÕˆÈKÍ?Î$ H½è?xù»ˆ ¡Å|& À¸ïå¤ÌF~0>&´®c™Íÿ¹žaÎÞú%qæ?jð–‰]ÔÇ}óBR÷¶*~ W<ð›k«Þü*\1–xsô­ÄᓈgܤÄ꾦”RJ©c˜s´T4vÜͼôÉ#œ¹ûîú¯ïòvQ€¡'ÎçT¯¯cÉUÜvê—XR×þJ°ro}™ÉSS°±èwÑ“ü秆»Îº–Ê=pk(¨²ý/bò«Idu,SÖÀî‚à¾ušÿ ¿8ïE®yiÞ!k~`}ÜÚê¬þ|æKyêòBûÆùܰÉaÊ~ÎÃO-ePs_x±¼“õöu.…¹€ ëÆÒš»ŠjÝ×”RJ)uŒ“–˜8™û«‘rÞI’w¿G³ŒŸÅ$×,n)R>Óß:D9GF|cµˆ¼%§vµNK|áCY&×`E\Æ:á:Yæ6ÉÚwvIkÁC2;$9ó5â-ÿ’ ´üÕ'0ö;²V\ùàkÃÅÙûº3RnY»]ÆüÄÇHÿË^“)•'æ$tx=V&ÿt›Hó«òÙ~¦mÝY2ïÛOÊò¢ –­–§¿†ô·;´-c®Üúèó²4¯Dj[¥M•¼{¶Äì-“z’Üò§egCÛŸÝ)Yý{97#¼{ð ò‘tðö¥’vÐñ1T>sÏ ²¡RDÄ“ŠuÏËO.úév°²dá¯Þ”u;«¤¹mUµ[˃Ÿ!±ÆxÒE]tÑE]t‰òrÐÛ?œQ™œö¹Læ?8æNæ+ÿ3€œñö>÷ŠD«ŒVÿÜxV,[¹Åå}åÚm3ë~ýßü_ÂÍ<üåÑ"~¿EÆÉ3™uüóõ"B{_íâ•¿­…I3+ÓòuNTñÞ_x?”ÅÂËsÚï]ŽÍ¥WŽ¢õÝ?ó~¥€IfÎ}ïñöϧ²îW0oΙ\óÛ"θ÷užûÊÈO?²pNXÀ-7_L¿wÁ—Ëü3pÞ¥7rß ;h Ù÷¿Â#Wºüã¦s™;k6§-¼Ž;•¼z _£.}†Ë²'2qÊ9ü<ïÕ6é,xx)ÿþÑÖÿâó\ð™kùåæ¹ë¥¥üfA:ÀJbü‚Lj}’›.:ó.ù2îœÅ·ŸýÿÝv+ŽRJ)¥Tß½RmÛÒÿ´þ²ð±l¹kç ¹¿mùñË£äÜK%ÁŽb™܉Èi”“ÜI¹½W†÷÷®\–ÑWª«äÉyi2âkïIcÙ_äì´äC\©ÞßùÖ˜€@Œäüh³Hë+r~ʾÛN9ÿei‘<¹{bŒ¿³#ë¹úÍV‘Èô¶Ob'ß#[¥A^¼¤Ÿ{È—åƒP³¼ù…Abï}Ÿé'—¿Ñ*²æVé„_‹É¹Kò¤A}¨X§É…¯´ˆ>.çŸàt^/g¸ÜòÉÁ¯TÛÃn”å"²é®‰íWc'Ë7‹È‡_•¡6‚3J¾¹vß÷;#¾.ŸˆÈÇ_ÚÞ]tÑE]tÑE—¾x¥×¥ü½r^½y#?°Žß·”üH˜œÁ‚_ dH|ËøJû]~î!n½0‡T;²*'ŒO%,Y\@ËÞ[¶ñê›%s&c16B›)h„ÔA)Ø(¥”RJõ ~Q1fh2S®èǬ«2Þö¸ )l¡É~™Î´–l HÈž9„˜ÅÛnC0Øñ)$¥Äï—\Õ°uõJVÖôR>æ—÷¬à†߯ÌOV –‚õkY[s`B^QPAŒÎp 6ôi—dŒL eäW„|ØP±äaU½ÁÕ_žÆ]yn¾nEOþ†¥mÛ5ÆÂPÎß®<{×7ïûîÖ ¶7ûorÓÆßsÙ˜qÒ…×ò…k¿È_¼{?ºŸ‹Îÿ!oîq÷ý ¤ÍÁfbxÝtùÔÆ2Ý•RJ)Õ—“j{h&—üf³N |šÈ”ý§œ¥*gåûÍ´xÑ+ㇷç]ž\æñø×oãôÇnäͪ¾ôLŒ;Ÿº“¿ýä?|w¾ƒYï÷}•+^`=÷qÕ9ƒùÝ;Â÷U;C¹àÚ)°á,¯ðßN©yŸ‡þß®ùÚ·¹bMŸï·†»ù$üÔ 1ï ÖËåœzr€Ï¬¢^³Ù­e¬|î!V>÷+~8éÛ¼·î~û•?2åÞÍ|z^Z¨k’lCU‡|»qËr¹œùçŒ"vÙúðÕêØÑœ·àÈ}‹-M‡ÌÄ•RJ)¥ŽŽ¤ÚmôHŸ€= |ò×2>ø{%;ˤGÊøË[wò·oüŒ›>º‹WÞã®ûþÁò"‡Ù))œÂÈIS˜R×ñýÕäoÚI½Ï5¦ßÆ J"kx`6q Sú7°{óVö´¤þuòà¯6ðÕ¦FÔ¬àÖ¿pç?¾Çó¿]į¼;øç&›©×ÝÇÃ'WñÔ¥bkDw‰4³öw°ü[ðÇÇ¡áå+øÛ¶ö¸…Oó½ß|Ÿw¾½„·3~Êo_\MI0‘Aã†QùÜ#¼àû–”N½ç!.­Z›+·±§%ž¡§ŸÂ`\¶”4ìû@¯š KwÁ·nç'7•ó¯Ò4FÄ-å‰'7Ò¼ë)~ðû;øÏOþÍ“¡;xr½Í´ÿúîWÈïÏz†B—£èJ)¥”R»ÙÚX’ž+q}‘0Ze|/–¤ÏüªünÉ©iûÊ_°r›|ð¿×ɨ˜Î¾("-/Ë¿_T ȸïåd%åãcöû¢bRûÍéý?+/Ô‹HÔÄ$Œ—«ý¦l­ o¥në›òë«ÇK‚éFŒLšœód…ˆÈý'Åä ¨ýå´oþQÞͯmkSH*ó^‘ïO‰û´L—_T´³äœŸý[Ö–6™æ’µòï{/‘á±–·ûŸ%?ûÏNiq÷ȪÇJ?«ý‘zþìeÙÔÖ¡Õ_’Ÿ]8¬ý‘zù¢"É äé:‘­÷LÒÇê颋.ºè¢‹.}f1€èy…RJ)¥”RÝgi”RJ)¥”Ò¤Z)¥”RJ)Mª•RJ)¥”Ò¤Z)¥”RJ)Mª•RJ)¥”RšT+Õ˜'~áÓF™Ë>Ì™×1hHê‘ÿ휘‘ 8ënFŒHÕßñQÇ0›Àà9$'Ø ¥ŽsúóÝÏž°_GÎy§ã®¹‡MoÇÓ ½½™x®¾Ä½/ÿšO^ú7â%‘4á\ú·l¤puÁ8¾¦ß´³qš_¥¸ðHÎ,#xÞ] NßĮխÝxn§ÏýËÉ"iðP¤ôš·=Ð&0ôR†ÏZ@jz2Fšh­XOéÛQZŒruènH¿Ù738a6;^|„òšV‰RšTwdádÉà™ IxŽq U­¦lÙŸ(.¬n?@ÚC|Ù½ Üï‡ ë—ÜĦmuíIÆä/1|ÚÉÄÇB¨r%ü‰Ò’ú£üÙ;i(±V ^zÚ‘¿•8ûìw_c#‚X[i§1âü¯’RxkßÍ‹ú Œ4}Dþ³ùXv:™óoçCɳ¿ÅàþÛ)üׯ(­lí±ýËJ_ÈèsfRõü:š»³HǼÁÊ<±^CrÓ"6<»ˆ&·'Ƽñ'3òìKH,}íËÖÑ*q8‰I›Ý(–qˆy)C¦Nj¿t,B÷¬¤lùŸ)Ù]·_| vÚtúO^@ÆÐq$ÄífçÓ?¡¬Þíåy¬—¹…”¼ò‹ngø×Ò²èOÔ6ëÏ?(¥Iõ§Ç™ô;å2’–Pøæf‚Ö2f|žAçÆÓòÏû¨hhKiL,ŽÍk kUÛ¤çáÕ7|z$fü­ŒŸ5’†µ`k $Mù"CÎÿoÜg~Ay{‡Î£5ïAÖWž€Wµ#Û’(ÅÙo¿û:8v56|®&nS>Çà©S‰B=Ö ´T5€ÕHkH'†Ã:¿K?áÙ)ÔðÓn&Ô½¸E8æ­´³ó™+‰ïÁ1ï»êIcˆ³k©üø*J[{¨ŒAL¡]ÏSðq^Ì02N¼’Áçhúǯ¨þ4yŒ!>çfÆÎCËÖÿPþá«4ÕWÐÒäõþôâgÜÏÄ)%lûûT5 X)$Oº†!“g‘˜à Í;©^÷$;Öl$´wîÇ€>x ñÉ©Ø@#õËÌæµ»ÃíIÖ)×q¨1Ä8€´¬|Ÿ‚—ÿDm‹ø¿UÀÊ$íÄëö/h%X³7¦!D¨v7MU­Ý]Žy›˜1_axÿ5ä?·ŒV/†ØnŒy_}aaÐ)3°KÿÂúWÞè0gEÚöh•i?— ×ÜD’Ümì~iÿ¿½;Ž£ºó>þ­îV/ÚWËÚ,/²%,lð&`ç@L0f3g‚C8Ož0Y&É!‡'aÈž0ã!f I2g $–Á@LŒƒm0Þ%Ë’7íjmÝêE½ÖóB2–dK*9‚ÀñïsN½PõíÛU÷Þªú×Õ­[÷ŽRr¦¤hßNÛžwG¸gÞÄôKîÆþ:õG|à¿,]/ ùLV9;¬ÔÅÈsòü~ƒ©ÅS1T‹(¨qzžw%³®¹OóÃÔn«Ödú6Q·q`Ö^AîÂÏ1ý²oa ßÁÑæà°“wpû]ìÙg#ˆ“1oäï¸H_ú/TÎ>ñß¿ÿ GÛ"ƒ?äÇ`É_D^Îÿê4ñÌ^†+²ƒc-}ƒvçâ1R°_ú ‹.á°aí¤Hÿ›¿¢gåg™ýéń޼AWÝŸèllžÐ¿åmYsñÐKWSÇÉk¢_s/Åçàrl>m kö·‰CjÚÀ¨ÍdϳÔýî5ŒÓ=©•ðÓŸ`ål9$³Þ-…Â–ÛÆd§ý†g.…K>AAY9.·A"Æfƒ¨ã/œ'ÞBoS/EÕ¸³NÝii \h­mÏØûeˬÂM/mÝ£^¼-ññ/ë ߉a€¾=øé>Þú>Í–3~Û·Í{RvQ}[îó´ñÚ¼•ºˆ¦Í&Ý ¡m;,ž¯Þ'ý;9ò»{pfN'»ú_{7d¬ºN Ô“1Ñíï¸HƘ?mí¸ÿø²,ÑG,žŒt úN9D ÃA3iíPxÏÛÆ¸mÞÀQ|%9®TXþ3-ú½ÕTßvÇž¸o 9n›·Z&€ùëã4ÃDºˆt7Ð×Ü‚ý¦»)œ7“¶WkHšÃg©CßLú‡Ápgc·AÂÂ~Y»^ŒŸÏä•óÔ…áÀf3ª©ET»K¿˜W®&¥a5¯ï få"hØFœ‡ëñ`JEކmÿFvW’“Ñ} Cþ­l’è­£¯w¬kãAÚv’Wu¹ÝNrÝÇi>prîÚdï>Â,!½ÀNäð$Ìô:òBG^¤9ç*ªÖ¬eZÕÿ²Wëk}ŒDHÉÂn0¬';é;@˜%d”NÁèþ½¬’lè­!·sÛ >3îð€år°“R|9…¥þ½/ã'ΰÞÇÎg¼¶qÆùŒrñ³ý8ŠÈÌ3ˆìÞHk}ã@]ø=DãœZ®f‚dp¤aQ§§¯ <2вÁwˆÕM·¼=cïWÒ·Ÿ0KÈœVŒ­ýômÞòq1Îñe=¨n£¯²KgâØÝJlDù% DYLúÔl oÇ8qóèÇ×É ûIâÂá´YÛ·Í›$bßo]CW'©ÜÍŒü-Ô¿ø<}¡¤¥6o©.Bõû!¯r®†Í¬Þêa7s€mpÿbmPX:›”wšžßpžÉÎVâI0-ì—•ë…•|&«œÍ3© {>ié=Þ¥÷ˆ(¨>ÁEÚ‚O‘ÍNŽÖ¶ãÈžv2a¬“þ¾&nÒæ­"3v„P_ÓYHfåj <~:Ž•L4âÝUCáÒõÌZ줽ÒçßJ5«išàI'FøÀóçÝÊô¥<þ Ýþ“QŒÜFÓ¾k©œ7Uî§h?vŒXÒ…3+Ÿø‘—èµAqV7Þ¶ \x,Õ–†˜(gÇLŠ?v Èw5°çõCC>·RïVò±Ð6,åسpgeaØ‹H±ƒážŠ'·ŸD¤þ`ÄZ•ÆÛéë…¬ÊÕv½D_ ‚áž50³Ë)WÒ ý]~¨¼’¢9ü±tœ¶CtÖ·œÜ®‚«)ïÆ×›À=ëFJsBô¼¼} wÓ6ÉÛ3֭ĉ6vþTØž¤£Å‹éª"eH'¯õãbìãËz¼Õƒïàa¦]²’ÜŒ7i‘‡Ù·•¶¦˜~áW)7Ÿ¦§ÏŽ«ø2R1cÉxÇ×»Az=áøµä\p#ùö½Äl9¸õxëš-ž_,´ùh'çÀváˆ& á'âó’HZlóVê"VOëŽ=ä.û,ç\5¶ƒ{ ‡cÎ\œ¶ºáíðý`Ë&kþrÜ£„ÃýÎBÒ+W“ïv0`M4áÝ„Â%ŸfÆ‚Í\sn£0½“öÍuÃh¬ì—•ë…•|&«œÏ .lù—å±Cã©ETŸ<‘¦MÍçB¦_·pøgÞ‡ÙýÌkÄpáð”“;%©N F¬s7­¯l¤õÝ1³ "µ8˜²ŽòŸ§â|Hôl§é…Gé<ƒ9G;7h®¿‘9³Ãt¼ýΈ^°}oÞCmßZJÏ]ÅŒ9n IÜ·—¶æWÀê¨`#›‘Eæyë)ô¤ ö 4âÛµã #Ç®Æïz„Ö¼õL½ø+ä›B5Ñ]ßBÒ Ò·õ^êû×QzÞíT8!Ñ»‹ÖMÑ2‘1ÅñÂ]=ãuZ/çD¾F/ù³ |#¦<³R礪| +mÃB>€-çæÜ°ç‰åÇ9åhø.»7°|(ÙEçæïb¿ø6Š.úùF‚XOÛàÐŒÓÜHz| &‰ì¦ñµWp\t9ÓW¬„¤Ÿ`í¿Óu¨yÔ‡9Ó6?æyÃJ›·R "µÿÂþÐU”,¸”âK/¸O‹w¬{t ¾¯Ñš“”ôJ ν·ÇDˆvî¡õå¡û§ß©s¬£ìܯPµÈ 8@û ©½È9j¼ý²r³’Ïd•óëÂV@Þâ’Òó;::õVE‘³‘º¡±Ök7… ,r†¯0?{ Ç´õT¯XJ|ï÷8¸íÀ˜3ˆ™+™ûÉ›ˆ½ò÷Ô ¨øäCȉgþ]Ì]’‹÷÷wr¼-¬"9 9T"2¹’Ä?FÝÖ,ª.¾“Ù¡oR»çijnR«–“m¦?Üá*!{þ<±Ý´´…Ttòác¤’6ïKÌY2àö{hR@-¢ ZDdòD ï€ýþ‹pw _jKÃS´”’™e8l€"ÒöÇžœž°í’cPíÆ•Ÿ†ÿÏ÷rtßq= (r6ŸÐ𑿈ME """"¢ ZDDDDDAµˆˆˆˆˆ‚j‘³˜c´XÛ1å2J.XINÑTF‚xÏ.:Þ|ŒÖ¦Þ“O6ÚË(Yó=Š2‡;°ù Ô6ô üa¤“>oåç_ˆÇñîí´½ñím‰=!é($gÑ­”TÍÇí„„oÞ·~EËá¶§­³)_{Ù ßfïÖÃë\ó(_ýMòÃsà¹çÇUá""""ò~Õ¶Bò?²†Œàfš^9HÌVJîⵯðyüût' 2\8пûG®ï ’“$'Þ´eÇYù*—Ì ¸çêÛ }þg(½êË$~ó¼Vߪhd½ìfÍì¦ãqÔg#µâ“”-¿gâ>ÖwêwìS™²ü«¤¼Å‘gÿ €ZDDDDÞç :ÙJÛï¿D{2>(ï¡/TLÖµ’•é¤+8øêYÃÙ æm Ô}š7¡Ù˘²àÌÆŸÒ°ýMb&ôvÄð¬ý{ŠÎ)¥kû1Ksz™¥¤"ƒÀ–oÓXÛ‰ Ú› ï¦]ðQZŸgØË,²/¹‹iÅ­´>ûtõî;yïŒ>¦úÝ€ÀÀž–NB¡Ø<‹{œ¤=›ç©ñ¹á© 3Bõ‡°Ï½›·ÝËTO==]à,™…𲉎‚…xh¤»©çä6%»ñj„œE¤¹†dddyá]TT&ð¾ôCZ:ôv+yoYz£¢-ëR¦/=—èþûñúNöúÎt’Á8—~Ÿó 05xwd½{f.~"ý'7,Ñùõ¿ý!íá”_÷e ²ªeùëÕFÚÅ̸r5) ¨}}QKOÏÎ ×ã@jEÕÉñÓîJrò ÚÜ@ÜÒØ “¸÷m”‘[’û£§m¹dÏ.ƒž#æ°ôfxÏýoô|ʯº•,¦ã‘÷Î(Ã?\¤-øÙìähm;Žìi'Æ:éï aâ&mÞ*2cGõ1…dV®¦Àã§óàଉF¼»j(\ºžY‹´·Cúü[É¢†c5M–fþ0ý¯ÓÜp-—üeêõkÉžMÙv!Õù ¥Å»9ÒR‹ˆˆˆÈ¤3@dˆˆˆˆˆü%4ØXDDDDDAµˆˆˆˆˆ‚jÕ""""" ªEDDDDDAµˆˆˆˆˆ‚jÕ""""" ªEDDDDDAµˆˆˆˆˆ‚jÕ""""" ªEDDDDDAµˆˆˆˆˆ‚jÕ""""" ªEDDDDDAµˆˆˆˆˆ‚jÕ""""" ªEDDDDDAµˆˆˆˆˆ‚jÕ""""" ª?œÕ÷PgxꚌIÏÝ gù¿q(bç} ñŒ–*m&K¯[Å’»Z’ˆˆˆˆ‚ꕟ¼…ÙydK/æ{P,iåó˜™âaιE¸FIå®þ*O>óŸžáTK9‹9>œ1uk?= ÿ¾ÈÖ^ó=øM¿¼šª½³‰ØI¯Ú‰ˆˆˆˆŒ.nºNYítsÉ?ÏàÊ¿I'Û=ÊW'+ÍpϽ™OÍðñÂ#ð¦sÅÝOðvkÓ41Í>š÷½ÌOVNè’wÍç;‡M|/#ýÄw²Vñªi²÷k³Hì%Ÿc‡ibÆ}Ôm‹£Ï_OöÈ H[Æv™„¶}‘"Šøâ¶Ðàï™~{9jX""""gŸ 8>r­cfËnÌãc?®âÿ˜Çúï2·Ò>l¬Èd¥9ƒšê[ÖRÞû?ßæ;¹ÚÈæÒÞʦû—Óóë/rý—så§ÂW}9Wœ“ÕQωöß°æœjªç_ÁwëFIz‹;/šË¢µÓE¯]Duu5ÕÕÕ,üòV‚jX""""g“ã`/°`èÚø¡6~qs”Åkó¹àš4fßRÆì[ÊííæÏ?oçõgƒ„&+Mb‚›ì™Ï­Ÿ,¥û÷¿`»ÿäj{é'øÞíåùÁb®»ómBYšwP4‘üã>ŽÕúÀ¤%4J3LÛ¡|9D‰Òy¸†ÂjN""""g§½6`Ë)« ¼¯{ùÃí5ÜWµ—ÿøF;‡}:/—å?(¢Ô3‰i&(õ¼[YSÜų¿ØAßÐX{ÎÇ9×hç¥gj©bEDDDäý³ÅKnÊ£†ŠˆˆˆˆŒîyÐ<¬:±Ö^–ÇõÿZÊ’E)ƒk’tüÑËÖǼ¼½¥ŸHròÒLHúBÖÝ0…ާcçð˜špÃÿRÇ\ú±i8߬%zºïÇ{hì†´Š¹8^¦/>VP¡¯È($Ã=‰Ó% !‚ ‡š’ˆˆˆÈÙé åD4øÐР:J’3/:ƒ¼ó«ÞøïnŽw 4‘±øo¹¾ '{甇ãÇžàŸž¼—§¾ó¿L|›íT\þy>b‡£ïnP;›ÿkæ†ûøÅý>~òJ#ñ)Ë(†Sƒðd/û·6Â×îàÞ/xyª=›éî­<üëú“Dš¶±/|'×÷YwÿK´9J˜“ù&ÿòa-"""rVxh䊧ô`bØÌœ¹.ÓmüûtËd¥±¼dšûu·i6?h.I=}#½Ú\÷г1bš¦5›ßÙeúLÓÜûµYfʉtÎ2óºïo2ëûÌAýfgýógךöùÙ .7ïÿãq3bš¦™è4wþÛJ3ß64ÓœqÓÏÌ7šû²Šu˜;~ºÂ̳MÆþjÑ¢E‹-Z´hù€/OŸ¤‡>ØÃõ…0Ygã±—XöŸ2ûvXë ÎZÅ«½O“ÿõ >Ð@LwR""""29âÀ| †¿¦¼¸ýƒºÕÙYÏUY<ñë½Z!""""m·Ÿ¨GÕ÷à6ÙÈáâõ+É<þ8ÿµ¿_U(""""M÷ÆÍ'ÃÕQÞü?•—ˆˆˆˆÈ)õ·F®ííݯ20ÕÞJø ß*.""""òáþðãÓ}hã‹;ߥ@•ÊQDDDDÎRÏk€M£%°ú²ÀÀ2—µˆˆˆˆÈYL?4V0=Ñ ú„bàj`)0˜䩼EDDDäC® 8ì¶Ï30Ú’ÿUœá)Hó>½IEND®B`‚stem-1.7.1/docs/_static/prompt/run.png0000664000175000017500000002330113157571677020445 0ustar atagaratagar00000000000000‰PNG  IHDRÕ@Õ‡‹²sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEá:+Ôg IDATxÚíÝyxTÕùÀñï¬Éd_IÈF!@€°‹ *«€*¢ VѪUëϺRµÔ­j±ÚZ­¶®ÅV¬[Õªu©¨(‘%„°'$d!²Î$™™Ìv~$!¹j}?ÏsŸîܹ÷½çžsî;'wÑÑ9…B!„¢3ºîfH2-„B!D€ÉµNj!„B!N,±ÖIB-„B!ĉ%Öz)!„B!N0«FF©…B!„8!§d¤ZÚ—ñ³/bl¼AJ\Êð¤éwçV”ÚÄÍiRFÿ ¢'ÿ…=n›)õG!Ä3©ʼ·óòÉÍ+àã;sÍOºâCÿ… Qº€6<øÞùðy~’a–?NR†Ýó8Ü€—§ó?¾Xú]Â#ïoÆêV(¥h.Ë廯ú<ýÖ<”RGM¶7'9{%þN>WJ¡¼Ë¹0²u=Y÷lïd™Ü7 õØé²N)\+Jš±=¾‰oÚ𯿖Þú®ãñ­˜ÕþcË’ÉåOþ‡]¶ÖÏv}Æ“—÷ÿŸ8ž¡}†Ò×d!kHïSòë¿»ú#„BtÅØÙÌ1¿z€áŸÌdÔ«SYóÝ£Ì\:›ÿX.ç¹§‡ñþ‚køªAN:â¿OSM#Êç¦Öá?ú‡bÖ-|¼ù9&îÿ'\óK¾ª0‘:bãýÍG,¹‰;Æ_˪ÆÉV]_^ÇÐaÐ7{+ÑñÀ”Ÿðaµ|6òm­Ë—üu6C? £WÇe4S\ä><¦I¿çwÓ?âŠkºØ«£ãñÙ‹Û2ê(.|y-o_VÎ_n½€ëwɹê·<óöZ’\Ù\ùQõúx–/=‡[GáÞ¾ ÿi®?B!„êðɨæ|eWß_Ÿ¬ Ñ—¨/í›ÔÍ}SÔÜw­ªôå)ÊxÔò]L¡ç¨¿ÕªN5½;¥}9sªºð7ªmuJ)åWµ[?PÏL=l]ú˜qê¶? Öî¶*»ûàZêÕ·‹iG§f<ý•ÚUåhû¾[Y7¾­~5µwàÛê&fËðûÕÅJ)¥œ¥ßª,ýÚÓ¤”¯æ{õìEIÚãÑZ†§pê¶|‚rÔc{•²½9±ý{‘©/•R[ïì×¾ï\¡¶–Ö+WÛì…ËÕï/M?î¸Â&¼®ìIrÄg†$uår—RÕËÔ…ñúc~?ýÖ<¥Ô—ê¢Èî·•pÕwJ©uja¢>àeô‰ Õ:ŸSå]¦ÜÅO©3C[çO|Ó¦üë¯U½õÚâ1õ¿[å+ŸZscŸöviÌP·¬÷+µu‘Ê2i+·ø¹ÿQ-ªJ½tvÈaó‡>R¤”ë35'N×VŽqê¼»–©õ-J)¥<òÔ;÷NPQúÀÚŽ>r”ºåÕïTisÛǾfeÍ{QM‹iÝŽ!ùzõ}ÇŠþÕ%JßYìÝõÖ±cÖ™d’I&™dÒ6=ó¬çËTå²é*müŸÔ¾ÚÔÂkßQÖ²¥jZŒ>à $ö¤FÎSÕ¨õæü‘*;;[egg«¬¤CIüäçË”RÅêí{æ« f.P¿zwŸRªL½09úÐzÌÙ¨ÝJ©Ý¯Ü¡Ì>_M‘¥Ý¤Ö+¥v>0Xœ4T=´K)õÝÏTª¡ãɺY½?5¼ÛíƶÉÐyRýÕ%*êà<ËHõÛ"¥ük®S)·¥%æˆéÿV.ÿj57>íåð«æÇéTø”wU“­úI‚Ns<Ý•a Ó1ËGã2Ý‹@’ê “1ýÿÔf¥Ô†Ÿ¥öh%ñ¤Ú§ê_ç‡kHªÔz OFR½ì¼(•~ã7ÊqàïjjTø1’ê#mQwfš ²ïߥ”ûSuAÄáÛ¸àÕ¢v«küq¢OT V¸•Ú÷¤Ü:/hèoT¡jV]×ZçS®Sk¼.µâª$eè0|Ùn¥¶Ü¦2ŒZÛ©^Íú´E©òÔ‰Æn~÷Q·lî<©ÖÔoœÂ:&“L2É$“LÞÿã)}‹ëG$6¯ º±ßü]×~C­Š/]Nª©ç®= é?‰l¬¬Z^LËÁ™-E|¶Â Ùéo l}çþ½ÇÓ6U±t|h×_pîä£Ï­è†LÖ¼­€cöûQèÐë@ù½øÑcÐéz,žž.Ÿ€Ë°‡xkwQì€È¤ˆ¾Àɇ¿“'GŽüÝ ŸalHǹ›¹{ÂhFn›Fü”wëNÚSòú"^vÍã· ûÑù-¨›¸cü0† k›†^Ê Åžž ÃoeùŸ?Ç™6+·VºÁW/¤_ý¿øÓ—­×{[²¦2ÔÄä×*ð¼iÒ_Í;SLÐ+‹^šû?+îúïùoä“Êýlxï)n›•}Êú“VÇ„Büè»ú0nÆ3¼0é+~y÷8ž^²ŠKr>å¦õ/ñëW?æÆï=†Ž#SLîøÖ´eÉ,&/³´>-Àï¤l«³»Œ åW Ó£;Y1+>¯OãÍVÇOÏ•Oàexô>øü`0ÍîðúA§ïÙ=w[·Q¡B4&–ï84ß`‰ ,ÂÂáP³Q˜·‘¶SÔ›×ñ‡ßärýCw0fsg Ø).È?tdGµÅÕ`J¢_ŒìÞCM:¦_2f°·Ö«9ŒÚUÏð~ý,¸n8ì6ñó…iT,û+lë¶Õ¼>o:K \‡mw-;¨"Î/2·ß{Œš}5Wýäjúè–|ÿ³/ø+j|«Ñ!zè¤ýO¿qrê˜Bq̬G;'^œÊê›GñM܇¿AAùV•FpuR =©V-M´J|øÑ›sìYÅv.cÒù} ZWÐ:êÔé“aû—ì 0Ÿ³í\ê|Á”ÆÄ ½a÷7ìuiûJ 17®¸Œˆ¶aȰ㌧«2ìéò ¸ ä­§¬B3³ékü‚½ÞÓ[Éý5«Y¶ÎÏ ÿwSþr+êÿ»žîPúö¯yýá•ür’]öïÕå~H3ÿüdži^c*3’Ûîc}­öýT¶<õÊ>®¼ñ..ßÂq[xà¹ö,ß±û ÔeŒ?ÃÄöw6øN{jØøÞSl|ï)~5än¾Ùú$ÏÞ°”AKvu¬ô4º€ð’ Pê ° JÞ,„âô'ÕALþÝKÌX{ Ã?®Ä5µWT±–BúFÚ)ªr´‘–òõ8ïåâß>ĵ.ÇjL&+bÏü};¾ÒW¸ïÅŬ|øß,ó.fYá×<ƃYå¼8埔ùNÂ^YÄoï cùnýçý†%ƒx÷Òw)јüi‰9¢‡ãéª ÿëøÊYõú÷¨gá¯ÚøÃŠ2¼½Î! pŸŽx¼ûxýÖG¹ùûøtu0<þ&ë+ŒŒÔÙQŠ cH9¿ß@þöRÍ›3Çe’•F¯>a€Ž´Á9äÄ7S¼cÕ±ÆÕüþÛøÙ“ÃËK÷¼Ê¯ß¼‡ž}Ÿ?úóÖNÃ>Î3gÔóö%¯²;À«DòŸ’õw>ÇÒ ù“Ëy½¨}¾²—¹çO÷òõ]«ØóÏ~”‡ÕJRVuï=LJ¥Ú76þ7¯pIý*Vl,¢¦ÅBê¹g‘Œ=Ö#oè·²mmܹˆ‡o®æ_UQ¤¯åOËvhë7ŒÒÁ !„8µŽºÐ:zò‹ªÄúOuibÛMj!9ê®O T^n¾Ê{ûz•iüâíŒùVk*Úlå9 ¾nš ѵ?kÖ£Ÿ¨¶Öv|¬•ØÍq<ýþUm­ô´>Ä®b­z麡o«›˜;Þ¨Øñ{a“ÞRvÛÍkãÑT†§üéÝ—ÏìÇ?W…o°s©šÂoÕŸ/L8抄OVï4*Uø›!'%îè1?SϯڣÚ™òÔ©5]¨úš»º1P)Õò‰š¡ýFŬ{¶w²’ê¾¶'N´ß¨Ö~sCüõa“R*€§J2@-xzÅ¡rn,\¡ž^0à8ËH¯Î_V«”*VOŒêä†X}”:çö¥jõ^{Û>yUÝîOÕ½9ÁÚë†>Nÿè¿U~•ëPɸ¬ùêßK.V}‚:¹)8~Šzte©jQJ)_Úô—*\k¿qê˜L2É$“L?ÞIüxÞäbìË훊øcÝ þ…_âB!„=@/E „B!„$ÕB!„BœV?®Ë?„B!„8 d¤Z!„BIª…B!„¤Zˆÿ9¡ƒ¯¢ÏðŒÓ³qC"±c’”yú œA”IOüß;ÈÇYΡ٠H–ñ£Ü÷|}î‚)ùléø„¤ZœPŸ| C¯[Jöèt)Œ8]èÝð:£NŽ>ÎÅ6pñ)±§«R7|*ÑÑÁ§·@éôžþ©É.œMî“×¾ q„õõÃ(g]aƒ. Wjì»±œÊ:ö_RŸM©sé?÷yFÝð:£¯™œ9·‘mj‹1…¸3Îè«î$*LÞ:$ÄU—­ßØk2ÉcfÓ;ƒÎ‡·>ë^eyC‡/•äË–Ð;üðï6­º™Eí¯¥ ˹•>ÃÏÀÞº\¬k^Åjmúá'Õa©éÍø££þ+âé‰rʸŒ”áç/žÚX÷w*÷Ûï—[Ô¹¤_ð3"ÊCÞêݧm¿º£š¿bï»{Ñ¢‰´ˆDéNHø™w’_Bù¿þHUû¤µ/}ÌLú?†ú¶RZ}âïìÔÇΠÿ¬+ w¾Ï†·ß0`mýaOÆcˆEüÐÉĤf¼Ÿ’·¢¦ù4<õÞ”FÜ™×’Ô¿?fƒoí¬ßý k¥ý¤ô §TÈYdL½˜Ðª(Y—[c £®¾íM¢¾r¬Ÿ>‰iö"2g_͆7–J „$Õ{½ÞÄ5—pÇ*ÊVì£O!fô$M³ÐðÚž¶‡†è‚0ÀµåIöÖ·=Jij®ý4p1ÆfМÿ2…V˹š” ~ë­Çipü°_yâÞõu¸ª‹O{,=UÎJŒ·ìCJ6Tá3§3bÉÓLTÿý)¼.]p_br.%yØ0Ì€÷4ï—-õ¥ «Çí•ÎáDè¢çÐgPMkÁZçþÁ´/}ÔT2/œ‡å¸w¼ûþ°'ã±dßNÿ33i)\IõwŸálª¥©ùôô©Ñçýšô´J¬«£¾)Œˆa×’2ó.Ô?¡ÊæíÑ>áTÓ‡fl°S·áj«:¯Ïʹ…²Ïþ†eî5 ÿ[¾Ý!’T·ñWbýðf¬‡fäÓèH"rÖ$Ʊ·Òu0sÂhöá©.ÂQ×ÉÈ¡!øƒPeÏQ”»‚†j!óo!mH* ¹û´šñK†MI§æ£ÛÙסS³Œ~ŠÁ9VòþöÄ¡„/<çfR†Ž%4Ĉr•Ò°uEy:¸ ,FÏ$:9Kx$=€ƒ¦õ±3ë2æ zµÄ¾™˜€rã©û–-ï·Ž@èB'0pÁõ„\gåÓløxC''Ù"GÞDÊà‘X‚ÞúMÈ}ý¥µ‡‰<ë>R22 AøìÔäþ•²âêFÈz¦œÜ{—±oïÁÿm¥É=ˆ˜é©$D›¨¨õh^e褤”s`ås˜Ïú?¢§†öà~éBÆ’qáuDG¶–³¿¹º¼¿Q²½$ "ÏZLj¿~[Ì€OÍä.£²¢áð{_ÏðŸÞŽÑþƬ{™ò’ÚS qcJÒ€,Ìzžºýè#Oý]µ‹@Ú—¡C¦ìøš ÛU‡ƒˆõsR²Gb Örán(¤~ý_(+³kk_Æd,¸ŸØ Öÿöºx)½v_ųiEA`å<”Ôéó0™è¾½PÖwðÃÆþžC<Ô¬–òj¦ä™¤¹‡-‹Ø¹£º­#L|ö(Øõö­/Çãö¡ ŠÀ^²ÿÐöÂÆ."­¯ë·¿£¡ÁA±‡ûÚ;Ïæ¯(úç úhb¦ÜKïcÄ1îqúòQ—ûgÊëu„dÍ#yÚƒ˜>½}Í ‹#8i0ßrJ>Ïí‹&bÈOHœr;žwÄjÓ6–ÓSå|Ô1B¯œèì_”P8¾¿‡-߯ RÏ<οÜ/ÕRB톩inÀ§‹ tÀ•¤»í”ViMÕÅœ4ˆ`÷gìý*¯!žˆÁ—“|Áƒ˜>^Li¥£}Ù¦Mì_Ÿ‹ËNø«è=õ6\o=DM£¿çâ¢Ï»Ÿôt;µ¹ÏQg3œ2™ä˜Ã—é®]hm_ZE¥Dà-[sÌEÂÇ=Aÿl _ ¼Ê¡#H;oQ(³kk_Þ]”øKªâ.!kÒPì«§²®µŽ:ë+î cÎý9ѵeûæB‚Î=¾rî®?l¯G-4o}…ý6Áýæ’rîý[QTbÓOä¨IQMì´gI B5Q·å5J¶Tçµ,ÓÝ¾ë ¡tàs8Û_|à.Ãnƒè^É@±æ>AK9k‰Y˹ Ûõ³Ž)œõÖNãwíù„Æ17‘œÅÎ]õ’e!IõÑô‘I?÷¶Ç°ÚÚ“K9 ¿ÃKø„Ç=Tóªs—RZXÙ6pMN†¸^L&‚Ln7ÄÆkÔùÕ•7Ñ7ýLhõÐEEl¤[î¶C£Ç)Cc±}'ûö´ý鵪•øý²GÂŽÏ;ŽÇâ,ú’ºŠÎGxŒ¡!ÐRNùž­msŠŽ:Eº*@gÇsŒ¼W6™äA1¸6ÞKñ–r`«(C³„¤ÑcÙW±ª}áæíÔ”æÐXg&bþBbzGbµÕ¢_ÈЋ§bê´ÿ’ ËþÚså|PÈ8.¸™0à+bÿÇ Ú£ûå«Â¶·ª½ÈëtDfÞIxb TY[—c¶òmø{E jî£ôs¥}Õ¾Lã&ìÍkýg}Qó¯">)’šƒ'ÚˆG>Þ¡8×?HI¾µµŽU:‰Ê¾ãPãÖÔ.4´/íIu,¡¡ÐRÕù(µ.tÉÙ±´ä-fï¦}øÌA¸Ï›vX‡Ô]ûðØöã37¡ðâµïÇY|—š˜³î¤Oüö¾··ßLÐq”³–þðêO(ߺ@ù>ˆ}’”g@ÉšâÁ4˜è^&|U¹Xó7ãl1Üw>éãctÞEa±M{ëf-û®œ…Ø!1gïboöaëM 𘵷wåÜmÌZÏÊ'à:æ*Ænב˜”’T !IõÑçÈô»ðJ,/±eíá׉)Ûçì~£µƒÒ‡e3òzÒ'ÞÞ¹ˆ’ŠæÃ’ØæÜûÈ/ÐãiòÞÙèÕ„Ðÿà|›¨ù÷m”X[}nßžꙤƽGYKÿsjùž­%­×+ê"‡`Ñ™0Lx–QŽL‚zT0öu¯QÁO}Ãh%k¨ÝõU¥~é#³±`£¶ü@ûè¯ […¤ÌAÀªÎGT]•´x!$´õJJÍ?ØýþjtºN’Šæª#SýnËY[Ò¸†â÷­˜#Ò‰|I³ǰ¿¦å4UÕ¯?:K6 g^F|J‚‚uøœNôzpOðn}ï~ÊlôÎ |Õå1  êЧ«ýÒG $5Öºc¾Uk»è®}i¯øft:P^ß±ãÁN]i%§êêß.ë†e ©gfÒøí"ì®ÎKQK9Öv௥±²ú¾Ð¦hÌ&p¯¢®¢5&GÝ+§ÿŽÞÙ¡x½æ:ÖÝ2šöÝWBåÊ7žrY fœÙZ&euÚ«ŽÆrî.f­uþ¤ô þý¸]` • CIªH¨æ5sÆ¢gÙòõú®û’¦ÝÔ¬}™Ð´‰؇’Ší(W5^‚1[‚ÀoÃÝè¢0‡˜¡åð‘,GÞصnj@¹±[[ŽÈ]>§¾å^bô¡Âf WV,î=ËÛ;HvjW>µþðKýs°¿aEo¬"$c±™ç4mÉճ郷Ž8‹žŒÃ¢_¯òâ¬íúF­@ÊY«–º"ZêŠh¬Øaþb†öeÿ—§ö曫?úzM»”ˆ­T®ý õÍ2”Ôóçuþ€ã9fýêiÏ:P ž®Û…¿­îw‘€hlݵ/Í|x¼` ìÄcD‡å×V¬=¡«24&M':(&ÿ™Q“;~k£¯FáѨ¡œµô‡]%PJs< ~/ 0†t¸…ÑoÃå]p”ö:¦©jÛw_õ§¾ù)†ÐŒú|Æs0w* Á ÛÒ³¦:Òú„ôPnBIªÛ»ùÐqdLŸƒ©èò¿þ^Ûu‡?úZ9 ±7A¯Ì‹ÖãU@ð¢cÁ]Ptx§Ü°›Æ†®+ ¨ÚUCìÀ ˆ©3\JE‡Sü 8KX¼çÞ’ž9†£ø3*¢g2pî þ5yÿ”ۈϘŽ~1ß¶'c Oé…î@ëåˆLŽ„íÉ©–Ë?)gSÒ4Rt”çþGó‰½þ×slÇZOÕco"bu´ly“ý…e­ÇÂnÁíåèrUNü~À¨q¤IKxï(°í  åi§«ýòÛ¶ád,iIè«J:ùÕÜ.ºi_šy÷ÑØQ)}!¯²“d³7£ KŒFW]ÕMÞ|ìöÕ¾B~‚0šýØý®Êлïi Þ =3rÆb2b¿eçÇÐäTè4”³–þ°ó‘‹ÄÖ>¡~›æx0Xin†„”þ˜6WàV€1žÐpðWWj¯c–ñ¸ï¾æ*|Æ$z1÷òvjÿQ¯i[ZbÖRçé:«¦î7£ !$©&tÄ¢ØDÉÎ*,1ií¿ôëJÛ—:O1ŽÆf”9ˆsˆ·Ø©ÙÙv™¯„ê¼$Œ¿~£ÍX« •+Þ ¢Ãõƒ-;c—éVúŒ¸‘þÃÁWŸKù§Këêñ *Š.%+ÓÉ›×úîNv6þŒ”!‘‘ øñÙ¶b¬XµNûŸãôºH"†Ý@‚ÅÔ6xY†=ïöì>úú@gÞËTÆÞ@âÙ·§špìxþÐI¿qͽº~NʰŸ“i_C•Ÿ¿zXùt¿ÓÝ_þP9{÷`+«&®¿[Yõ‘Ãâ˜Â?dÁ#Ђ»&ŸÊ/Þ<:æ®Öèã®$ë’ºM©ÏÏÔ|E¿eóªíš×Ó#õÇ_ÉåÏ`7—ĉ‹I1xð5—Ð`?úfÕæ¯P}½Î½ƒ^ª±õ˜vLª•…°¡7b@9öP½úözrCÏÇÓåXî·w±Çq ÉÙ é—c|xwQgsÜ.ºk_Zµý“ÚQ÷<þª>ýêˆúì fÕo1œ} ½Ï¼•8O½µíÒ PûÀµ‘ÒÕ+È8s éÓf€ßNóδ'Õ=XÎÝö‡ªWå.Z2§’1}:àÃS»ŠÏ^§r¿# x\ù÷³Ûx©Cn©ö}D5IDATcà(þ¦íT­|в*—ö:¦±jÙw˰E ×^BcÉßÙðÝŠãêºÝ–Ö˜»«ó=ØÛÿ2Eìès1Õ¿Oé7Bˆ'éª`!þ7[L sž&µåÏ%í fÚM ž6ïÖ%l[·½ëb˜Aö¼ùxVÜÂîâ&)<ñƒdÉyì±1Tÿû^J­N)!~lç=)!ÄÉà-}Ýk#xö½ rÜÃŽüöë«CÎ$Ô]ËéB”BTÎ\,ž-–IB-~˜Bsî!kl:͹JB-„$ÕBѳœÛž`›}<î²7,êB°ôOrßTŒz@9h±®¡ðƒ7h‘×ˤ ‚âB±÷0E¥RBüHÉåB!„Bœ ½B!„’T !„B!IµB!„’T !„Bñ#ÖåÓ?Œ½&“ÃÏÀÞº\¬k^Åj ðñYÆbF-$i`ÁfðÙò©Þðå{­mŸ÷§ÏUô[Öîm<”>—ÜCœó-6~ð±q!„Bq “j}oâΚK¸ce+váѧ3ú ’¦Yhxm OÛCCtA àÚò${ ëÛ%âÇYמP \Ì€±4ç¿L¡Âr®&å‚_àzëñ€ÞŠu΃ôí[Ç5ORb3’y9©“Ä컇½ûìGÁH¯IwoÚÀöw?‘£-„B!NqRí¯ÄúáÍXÍȧёDä¬3HŒ boeÛk\uÁÍ><ÕE8ê:y6¤?bªì9Šr×áQÐPí!dþ-¤ I¥!wŸ¦@u‘3IÎ §éÛ(ÛYƒšªÊ ö)ÒÆœÃÞ}G'ÍQãî#-©’Ê^lÿ „B!D èšjChjp8<ÒòHL/~CTçɰ%“ˆ0pîÁ½˜×NæÕËŸ â€¼ÝJ!„Bœ<šß¨¨œHúø!¸·=†ÕækÏ_Íaø^Â'<Î艠šwP»”ÒÂÖ7¨é‚ã1â¢ÉéÁ× ƒÉDÉÃá†ØxíFD‚¿Š–_‡¹>¼ö:‰D…q´]qbê+ýMF¿YľR›e!„Bqú“jCì ú]x%–Š—Ø²vÇaŸ)Ûçì~ãóÖÄ;,‹˜‘ד>ñ~ôÎE”T4wXÒMsî}äèñ4y ?‰;å¯ÛBsäXÂÇ\ETÅŸhh”w !„Bˆ“§ÛË? sȺèJ‚JžeËŠÕ]'³M»©Yû2Õ΢öiMº]Õx Æl ¿wSJŒ9Ä -ÕšõÚí &(ÈÐ1:Œ1è°ÓÐÔž8ûj>¥ðÝ'¨rŽ sÎíD…åH !„BˆÓ“TëBÇ‘1}¦¢gØúõzmkÔ¾Jå,ÄÞ!™1êÚf :ÜEÚ“êê8I%&9Ý¡ècˆìŸ õ›éx™7(|Î|Ê>~’j÷p2g_+GZ!„Bœ4]ᆎX@›(ÙY…%&íÐ|g]iû2Cçá)ÆÑØŒ2'1`ñ;5;Ûžêá+¡:o ão ßh3Ö*ÏYH$;(,(Ó¨²}BEÑ,2ÇÝN*ïP× '¤ÿ|R㛩ûâëοäʧì?o2ç Fœ_ÀæåßÉB!„§0©Ö'š 摤ÏyøgÕ/±áƒÖKAŒ–>ÄäL#9Ä xðÔæS¹â *:\Oݲã1v™n¥Ïˆé?|õ¹”º4 gT4¬~˜½ÎkH>ó—ô2ß¾_>CY‰ý˜ßñ×Bñú3|ÖÕd$o¡¸Â!G]!„Bô( pB!„â襄B!„¤Z!„BIª…B!„¤Z!„BIª…B!„Çëà{Tä B!„BgN-#ÕB!„BœhVÝáß2Z-„B!ÄqäÓº#fJb-„B!D ugIµ$×B!„BhL¦ú!,2 ú£„IEND®B`‚stem-1.7.1/docs/_static/prompt/run_events_pipe.png0000664000175000017500000005211113157571677023047 0ustar atagaratagar00000000000000‰PNG  IHDRÕªbX³VsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEá1.“â IDATxÚìÝwX•åÿð÷Yì) "ÊroT”-”ÈUÎT_•œ©mµ2KûŠ+KK3‹¬Ì‘»Lsdr.P²\$2”!ÊÞç¼0eœƒø­«ßçu]ïëªó<çyîû9püœ›û<·úë /€^šp€B!„ÿ.)¢°À ¶~¯îIŠj¶õà ÀÀdõå !„BˆÿgòðAI¡­wQý9€)²˜ËµB!„ð€©5ÕV~à'×K!„BˆJ… £ª¢ú¨ÔB!„BèUX÷,ýe¹ ŸKA-„ÿRÆÍ🅫0¯·#Tr5„¢.ø•ÔÏŠê¾(žCýX(Ì=Ð}À@x;È[¹\ÃÇE&¯G<]äÉkúxµ™‡«ÌÂÏÚVøsßßõ{ZU{*0iæÌÀóm,*Œ¦!„x$SJêè²÷ÖPÉ¥[›NÂÖÈ‹8ù;~z½}Ù³ŽüÉ7>ƒŸÂ ³™´y Û~\ƒ1îFrékI®aMˆÂœ…È+äÛM›bø‡pù®$ÁÜD\:ø F¸jÊ 8·—"‹·=ôÍ=aÀzÀaè*ÙN,:ˆg­õ8Ž¢íËo¯†·ie…QµƒBö(ŒC‰¼Ã/ÀE]z ôÜœ]xœ”ú¶YŸëS3eý!Ø—ÿøÚtÄ„oÁÜ>ÎД\cW/€Ùß#À²âs­úìF.#0ÃM­ÿkú·1F‹ÿA³¬øòDø·ÿžVÝ!„ÿ³‹ÿ•+6ån™×eÎ{ðÜÛ¿ ÀÉß‚Ñÿë8`:Ÿ~ÜßÐ4yÛÿ4ZdÝɵHÍÑ=XQ£óÁÖ7€ísFaƱ8hZ£G$¤=°ïy¼Ö=G2ï?Rx79ptÚu°‚ JØ؀à xïé1ø1EhÓq#Sã0g¶Ÿú>‰î΄_/,-Iaßµ7š!žNËÆ«iOiIÕëC,í³£ºƒ{ž©W› ¹>UShêÁ­‘¢æôÄØýÙ°töÄ9+°`_d6÷Á'׵Ƚ— ¨¡yàs¹Bm 5r‘–«Õó5ý;kê–9¦ 2öÏÀ©Â{á?­=Bñÿ€.¥ÿ“€ÅQsHhÏLt¦Êv0fœç‹øüŽDÆ~ù4Õeûéó\—ÊJeíxš–¥û5æ³ÿý‘—î’¤Ž©Q»ø~ÿÆ4*w,e=_¾²zO]MdFAéQîñĬVö«6Êúìûq(¯$å”<¿€‰ç¶rN€5†ž«†6›z¾Ë_nd’$scOpÓ×x-‹ÔÞ9ÃU_G}Ú£ï5ü¦ÆëcÜž ÿ"Ó7÷¤Eéó¬ò(ɨכ÷MYŸ}WbTì=æ•!ãúA~8ÔÆµl—…ßF&ß ¡ÙÛÔn|)’Ô…>ÏzU>_M·—"Iå@ëšÎ¥¤ã~#Æq ”Gíñ #©å±ÿ8QYú¸¢îÍ%£Þ`S~ÇQ6Ç0m./þÇ‚Ëù„9X°çætêƒè¤Ô³Íz]Ÿš£ržÈ3$OÚSQò˜q»Œf6¿°$Ú :B­ö0<Ð'›Á¡Ôiq€ž¯©>ѸqÈk“ùLS‹û×¹bÒñÆ0›¬ z¯«³÷}ÚPaцAŸŸ`|~ñqn]¸ÈŒò¿ƒzüž>®6K$É¿0Á@ñJ‰6t[ÇÛúÐ¥ûJÞLÝÅqAÛ˜÷5{×Sv…)4kÅN›y‡w¸9°[·nÍÖ­[³yC³âè¶ô_Gò·¾È~ýGqÎŽ›$ãø¹¿mÙ?ÎF­ßãU’W×¾ÆQžaϧz±÷ |¶¹™þíQ{ðÕ‹$¯~ÄQ½ý0`"—L&yƒ«ž²Ñÿ\z´ÙªÏæñ.èçËá_Ä‘¼ÄÅ{ñ…MIdâv3Ó³=ú\Ãÿqj¼>úÕ¥}¿¾’AÏõfï/pñ‘t’œÕ¨vEc/N›Úƒöª·Y±ç·wȬƒœÑ΢ìuþ»ŠjhšóÍKdîÞ¬§(yÌêinN'¯¼[úÁMߢú7 Ìo’òþrjjSTëu} ,ªjZ8wḵÑÔ¦læ‡âsZ>½™EÇø|=PeÓ‚;5¥µRAûÀ,JßÌ^ú¾¦5GaÛ‹+Φ“Ô2.4„³¶¥­úQþMØyyyo#ý­ {¯«³÷}Ú£räíwIíe®Ÿ9‚ýþ‡o|vŠYէ͉Dò¯ÌQXøàK ×F$1ýÎÜöÎl~;žëúÚÕúD¦]WñoqUWÓ‡ÿ!v™Êp’—ßks„Ò¸ç_!ùÛd6V•/äîxUù»©mlmikkK[+šª*)ªCÓ¦ô1ÓN\MêNN`#=Ï¥O›­úìaž®¸x°ì½‹9º ´WÐòéÌÒâG…Þí©éTøTw}ôܧÆ×¢º\ßÕn3AòìäÆTÕõèºMW¾þà j™Å?v¯à´€&4WTV ?¨ø54¼¨®î8Fl5÷2™¶™O—Bæ¾!Lâuþ·±ÞÇ)-ª75»ø–<=;£›ÿL_u öŸÇæQ P”™„L­&6Ô7CU2®=¬Œ5Ðe܆S¸õTˆ”ˆX2Ñ®Öð¾ï÷¿ÃéË_ÃÏ¢ïWÆáù†©ØýÕd>Òdݼ'TÕS'Ñ ‰8~<…uöKôOyBˆ${5€&Uníû >ïŠÙ3}ññâ#Ü~¦†‡`î7?aÊo9uØÅC·R(jsœ\\Xüü7˜ßÖD—‹¸¨ÜžCPG@¡„âqµ™Zh‹´Ðï«VµmO]]ŸÚ\Çû Õ*#µ}СH(”ŠÇÐwÐ"ãʬ~ý¾üt~¼¸›Þß&ÓÃË}ñ/×#Ïá\ú£ž«úãDïÄÆ+ ðÒ¨ö0 ÏLj ½n ®ävœ2ÙgñÑOcâü×Ð%âq^ŸšeÞ¼„‹î€8°Ð0duJÀ·³‡ ñ¶•ˆMK@ºN;ï è“»Cçšaó¦à•¤FÑÝ›¸Wô8^w5lÛöCÐô—0cÂÓpO¿€í+¾ÃÕ<Ã?”v zN)»ðõ¹¬GkR¼'TÓ–ÀJEÝýžþcÞÇ„âI£àPÙ¥]|ðE޽ØÇí„ñïð{ü‰µÂ؆ƀÿÌ2? ù0‡ƒ¥ú¡m9׎à C¯g<`ö{ñȯqôñoüq× ªçtH¿|G.r \ÐÓÏ ¸zéù¬¡mÎ<4 V%ǵlOu×°n¯O-®áƒŠî!î.`Þ´5Ô¿ ³èŸ÷“_póö\útp‡™"9ÿë›&DcÇ·⿯ŒÅ3ñ¼óe„l¾ŠüÚ_tÄn‹ïÆì^j(~ÿ§\%Ô*@-t´Y‰H-°A÷)½‘½ãi\8§ÁÚ}˜Ò-Y )È«Ë×ÁÈ >£¦ãåS1¢³’Ã6`Õ¼òý9$×føÖ¢‚×Gòßà|–áïuuýžP]{r®Â% Ã3ϵ„éoç‘[¿§uÒf!„ø«âßþKCÐ÷Ôtxþty ȳq‡éuxXg :©À “äLJã÷Ü·0hÑ|D¢ÚÍ­ÂòíÈÛŠ·¿x‡ß߃ Eï`Ãï*xŽ_ˆyÍãñÅÓÛ¯} ½î2 ‹Þ°ÀÁ«…h6â¿XÜ& ;†î@¬žÅŸV6[Öq{ª½†ÿ´Ÿ*mŽl<~²_§ã£Cq(ªß ü-?å0ìÃùèxí B/ÜDšÎÍ{¿Šù‹s. £B!g÷¶íѾüßÒ‹Òð×åXdtW·šŽS€èík<.+„ÓÅØr­À ã<ô±6ó7|¸â&/ëð¯OÍ,]Z E G˜Ú»£Û¨÷ðÑE8ùÒÜÒ(HÁõl7L÷‰ÆÂ©W‘Ÿ§À¦¹xc–;®§ÔÝT 3O¼4$êXŒc¿ÂÞ?Òð(o'–^0È!Û¾‰@v-Þëêú=ªºöhã¶aÎçsqøíƒØ£žƒÕGbg÷$œûÜêú÷ôßW…âßà¡ÉÖ¶þ_0&q;‡6P?fÖžoìý‘§/2rëD652tò¶ÝWódBÉÍÓ “yæÓÞ´SÞ¿=ÝsÁ{y9½xsÚŸ?1ø9— ·ÊÓ÷‹ŠÐçîQŒº]X|ó§„S ™ÐŽ ÏUC›ËÁ§üó,zma†®äËbz¶G¯kø?¿ûGÍ×gÀ’Ÿy=³ô ky¼sýW?ëXü%ÄʾÜdéÏm™äõÿ¶­õmõ*o‹;‡/ÙÉði,*iMNün{·55}Ádþ^öµzÔ/*Vrµ§Ÿ)¾%ã©I~9³æãÜÿ¢¢Åý/: áY$ ù¢¢^×G/ƒÖ·´åšÃÛQ?sõ”®´-m‹Ê•Ó#HF³qÉ-á<—ðÉScëøN *uu,+öÚp—LXEo³Ú½×Õí{‚í1rfŸww0"©°ìVw©Ñǹªýû?k5üžÖýû˜D"‘ü«óÿ¨³•rÒ‰DRS¬¸9Œÿ¸ Mÿ ï ÿ«öÈû˜D"‘è?¸$õBQ=›n“ÐÏ:[7Dý#¦[ýÓÚ#„¢Z!ª£°…Ϥ¾°ŠÝ‚—ò¤=B!*{FÉ!„B!DíÈHµB!„RT !„B!EµB!„ÿ¾¢Ú¸é$l¼ˆÓ‘¿ã§×Û—=ÞpäH¾ñülþž…gæè>` ¼TuvL£6óp•YøáYÛ Ëé>Žs=J{*°ˆ£$¢^oü !„Bü#íëMïÏrÆ7WIÞâênfÅÛ¦lЬ;næÞáæÀNlݺ5[·nÍæ ÍîÇ ˜°óò8òÞFú[•{\sYõÙÃ<þÁý|9ü‹8’—¸x`/¾°)‰L\Ãnfå–î½úGõögÀ€‰\r0™ä ®zʆ }Û£räíwIíe®Ÿ9‚ýþ‡o|vŠYէ͉D"‘H$’*‹êû¦ ŸÝ˜À„m¯ñímðNzÏ… gcž7ïÎ/“É¢“3ØÄÈ€FÙ<Ç}ùä¥7›W!­ÓyΦ]¹2L]ß³Ò‘îêÎeÕgótÇø|=в÷.æèN0Ð^A˧w0KwŠc÷ ÔÐÁ´);g'.Š&u''°‘J¿ö¨=^fÉ‹3›Ý¿Ωַ¨®ë6K$‰D"‘HªšS}Ÿ}ßOðy¯PÌÞå‹×½`pû \°s½ÌôšW¢qö…¯pníNÜ(¨z?µc/ÌÞpÑwr ÕåáÞå¯`›=¶{þ™u‡ç¦b÷Wgù(Òé@( TÔA%TŠ*îÛ‘{»N„¢­?š™ê×S'Ñ ‰8~<…uÕù:j³B!„(Veͪ´ëƒ¾À±g⸩ ŒoÁïñp$Ö -ëwtê@:m5_ºÓ4ÅŒ=¿`i¿Llzå9tëÔ }‚>BxÁãì¶9:=§”]øú\Ö£ŠZh‹´Ðé·3¨# P>p»¼jÚÃ’X©¨ö¸Z 2RCñ?k³B!„(¥®üacø/ AßSÓáùÓmä$ ÏÆv¦×áaè$ý*ÞÂÛa¿Œ~a \7• µš6Ç3”ˆþ`nŠB>\·ÆÍ\ Áƒå]~òaKõ£õÚ¢‚×Gòßà|5µ¾çÊ<4 VF%‡­é¼ôôs®Ç_yúµ'çÚ!\Â0<ó\K˜þv¹•·èâîæM[ÃAý 2‹ðøÛ,„B!ª/ªmýWâËgÃ1Ãs7’´ŽÍÃÒ„ï°ãÈ8 r>ž?­ßѳ°`ÎÏò9NÿÒK¿þ—ó ¶v†«æ$Ö~wyyÑøõ2Ð÷…yx%òSüz3Jû®h\ÉTƒüøpüžû-š àƒHT;£¹UB¾ý£òb³ –^0È!Û¾‰@U=©î\é2 ‹Þ°ÀÁ«…h6â¿XÜ& ;†î@l‘~íÑÆmÜÏçâðÛ±G=«Ä ÏîI8Å@@›„#Ï€Ÿ,ÀWÁéøèPŠê÷@Cµð×£ÍB!„¢¢Ç;q[aJçÞåw¿Å0³ìÞtqüíÓ~t(¹ež‰ÇP~°ï“óJ¶ëry/î<7þǵøVoe1¢{àjžL(Ù±0™g>íM;¥!m²b¯ wÉ„Uô6«n¿ªÏUþKåŸcÑk 3ta×@yÿKQŒº]|³À‚„S ™ÐŽ ÛcäÌ>ïî`DRaÙ­îR£sUÿúT•íÓ˜–üÌëe9w®Ÿàêg©B]·Y"‘H$‰D½ïþñoŒu7§‘ñw¡éãÎÐÔðxõ˜ý=,+>ÕªÏnä23Ü ]N\³–ã±9žH^ë ó7·Cp4ï·©$'í¡óX—úðv’`r|ÌJÎbÙCN"> ‹¹où9@uÿDpŒgK‚ÌÇíóÛðvÏòûèÃãÌî w*ÛIeŽzfÀµ¥ýø]ŠWÍÖ!óæ½â[˜äFbAo_|i|¿AªúýðáÖ9p9°Ñù”õ1èëcøòÙËøpBO숭ÿÙk°øÐO(hÝ˯ТHm»‚1î½hd[wÀ°¹‹±è'\vˆîè{ÃýŽS'}׫_j¸M܉Ã˼pæÃ xè1k%>8´i-ŸÁ—1²¹B!DmU±4v}ž!y"ÐžŠ’ÇŒÛ-`4³ù}€%ÐfÐjµ‡9Àºâsm‡R§=Ä6ú®BcBÏE—˜¹•s‡`H™²Ö—æîgÀY… ZO¿ãªpØÎ42n5ýl@Eý@†jÉ?ßnAMÉ~ ÛþÜ‘AÆìU媆Vý~bÿâ¢Æ´ÚÎÃÇ©›¾ëÕ/“Ž\v“ÌÙ7‚Ž%K»+ò@.³Ô“&²’D"‘H$I¯¨¨4.?ô ç.|eÜîìÆºÈìâqجTäP# ²iΚÂZ©€ÚX ]V ²ôøÌCä;máä9Á{¢‘SÅ@°Â´>œLó‘eê'#(ª=¦Ö=ÞÇÊ!:l™6ÇÒX2o +%q;¥ãè̈Âák€³w+X=tP,=žÆô7ž„Qô.ì‰Î¯åg—ªŽS7}×§_*Çnðw"¾;ëéG‘–†ÙáØrpõ÷†ƒÌB!„¨•ª‹j]Àws tºBdƟƺ *¬qö§èJŠêdQ ¼—üгçŽà]O3hLÔÐe$"Ck@KÈW¡ÑXÛ!'¡~ë~Ç­{ù(ˆ ÅÊÑ-`VYu­vÃè%Ñ ræ¸]ÉÃÚä0ŠºÎ| M € –[ÀՀƚrWDÙ` Ž!#ú,òýïž°¬Z\䚎S}×§_;wØ!ñ·óaåîk wxXå"!!°sC=üB!„BÔVåÃØ&.¥7²wlÅ…sñƒö9Léf‰¬„äé{“ŒÚR(+ŸWmÒÃ6DΑož^Õ“ ‘–è$ _ñ.Úfü€Å;bQå4ð’>+Õ8ñ¸®ŽSUß«é—6) ‡cŽ#Ÿ„}É+¯t耛‡Â‘¢…B!„¨uuÅXº´@‹Ž0µwG·Qïá£'Špò¥¸¥P‚ëÙn˜î…S¯"?OM;sñÆ,w\NA¡!5¢I4oVƦÍQß0²o†¶í3‘q7Wⳡƒ¼^{ÏdžCDÌ=講¢ç„y˜T?뾊@vùN5èŽ j~$2>̵EûfîhÙõŒ|qži…å}§`WRÉÌkµúÍžŠf±çqùv6Mðä ó1Á!_y¾Â¹ª¿ºú§nú®G¿ò¢ðÙ¢P¼ôùWضРž|g®BE(¦¬ùyòû „BQk•ck¸ó–¶ÜüÜÞŽú™«§t¥­²t®°+§GŒf;ãâÇL<—ðÉScšç\]L;/g–¾¹gñô•#û,ÝÏßoç”lÉå­ó?páЦ4}`š‰ÅSxÉ ñ1«ä\¦ìº*Žd>ï\û;WLcÏFÜ&Ϩ Ç~„$å—œ+‹qgwpÁ`š2¥EÏãÔMßõè@¨ìØ}Ö6FÝ+>Ò½¨íœÝÃŽ*ù³D"‘H$I­£(ù!„B!D-)å!„B!EµB!„RT !„B!EµB!„RT !„B!¤¨B!„BŠj!„B!þmEµ‘#¶Çåƒdq´éˆ ß‚¹}œ¡¨áñê0û{XV|ªUŸÝÈef¸©õk…y¬Kåýs•Or|Ì@…zÞS±æðUÜ-"ÈB¤DíÂüÞN•, ©€YËñØO$¯õ…ùC½®ß™[q!UR‡Ô‹Û0«»Ê/®0kŽÀå¿àZfq;rbOâË)aeÐÇ=Û¬G{Ê÷Í¢Ãë8œIðÚ|´1.}ÜîCƒ±ãlrIù¸}~ÞîéP±_–í11ä$âó²É‘Ûñ–ŸƒçB!„ªb5@'ž!yñm?zzvaþ“¸âd©;ÃWšj(é4.ŒÌßË~VŸkýìÏ,ä)ŽqTè· Ò’M¼|èëë[–'/äé2qý@:ª@µà̰^Þ̉ƒz³ßˆ7øíe™˜cUeÇÒ8táØ¥ûx³díÁ”µ¾4¯p>5Ý&e3y|Y â²ã™dÞNrS¢_Èm2ç7.ý;{õâøOÎ2Ÿ©ÜØÛVÿ•"õj³í)“V3xð^>S3I¸ŒÄ˜ IDAT^›Ï6Æ÷ûÕxÄÇ ~‘Ãû=Ãþ#gqÝ¥"2{7Û—¼Êú¼=Ì ã²Ñ~ôî1„sö$‘Eá|½¹‘ç’H$‰D"‘<ê‹êöeE¤q»Œf6¿°$Ú :B­ö0XW|®ÍàPê´‡8À¦–R5à°idÜjúÙÜ/Ìj£ Ëi›w_˦q“ŸEÉc&ô\t‰‰‘[9wø†$TRT›tä²›dξt,Yn]Ù rɘ¥ž4Ó.ü$Lú‡f¥Ï3ëÆ/’Ș:ï£ï’•5µYŸö”Di÷ ×ü•Ésïûó¹ wk,t­úýÄ<þÅEŠ—+WÔd¨–üóíÔ”¶Ï¶?wdñ{ÑôÎ%‘H$‰Dòÿ9UOfP”› Pù _·;»±.2 ÍJE50R*›èÜ©)¬• ¨ÕÐe¥ «¨6ç X÷x+‡è°eÚ<K»¿Š:‹  -7sŲ± ,q ù%å!ò¶pòà=ÑÈ©dv•c7ø»ß‚õô£HË Ãl‡pl¹¸ú{ÃA  —b‰úÃÐŶø™6é‰nöé8s,ù†ü †6ëÕP;#ð«M1„!]Wý´K§1ý'a½ {¢‹Ï¥4±…•ȸQÖ&fDáð5ÀÙ»¬µ9—B!„¨º¨fqÙå»9:]!2ãOcÝÖ¿8 ûSt%Eu ²¨†‰ÆÞK~ÅÙsGð®§4&jè2‘¡­E‹Ôn½d"D.¼wPU=gÒ|Ö~€[«^ÆÚë…åÚM°šÃkìÜa‡LÄß·•»¬-Üáa•‹„„ÀÎ õ4´±Ø4;Œ^Eè_ç°kÝvüvêä/„©ûR«=~u*k³^í.ÿù «»îGÐÔ­ˆ¯æÃвÁ/*BFô/XäûÞ=aYÅÛ´Éa8tù›@,·€«%)4JÃÎ%„B!j*ª•Å_G¼ø–<=;£›ÿL_u öŸÇæQ P”™„L­&6Ô7CU2®=¬Œ5ÐeÜFz- 2ã6“1Ó;û®GùZù>,;¾†ÃCàu(³~EZ­ªÜœÝ®n­0ãdöÛT0oÔ  Ø¿fN¦è -2ƒ×¨IèçjT‹séÓæªÛ£t€zãØ«³q ¥úac]ÊnŒíôz ~+N5ÅüG1¯SÉW5ó"<|&öXÎÄØ\èX„Œ{ñf3  )™ZÃÎ%„B!î«bNµãCsª¡tâØ:2òeº«A•óDžÉ‰à›c×3îr0»ú.gtÌ—=糎 ½ÂÐù(¦ì²2LßÊÞÖ•mWÒÆg>ÃrÉß £‹Q5Ç2õâÇñÏ©V¹Nãy’'Ç8RY®_ãÃHž›ÂÆ*–=¹îùçÜ64.'SÏŸŸÅ“Ù»ž£­Aýª¾Í5·GA‡‘ÇY¥Â0NvQU~nK?~B¦mò£E…mÚ87aS7'Ú·y“Q$ÏNw£p.‰D"‘H$™S]ÙHµQ¥Ûj• :Ú¬D¤Ø û”ÞÈÞ±ÎmÄÚç0¥›%²Rgè²IK Ø9G¾ExúÛÕFâÛ}óÐpËPøNÚŽØÃ?Ah“Âp8è8òIØ—ô^éÐ#:7…#E ¨ëµF»ܸx«lþ´îîy¼T3WWX«ô?_Mm®¹=ÄݽcЪM´)KŒß“įÁ ÎØv«Šy6%¯“Rý`ƒ ‘–è$ _ñ.Úfü€Å;bQ„G8—B!„ŒTW=R}a¶/[¶hÃŽ¾ÏrÚêÓÌe!OÌhR|÷So~š@’×ÜΘ€ ;~pƒ$ymA»²Q^}£v{‰$ÂÞµ-‹9}Ö$’é»9ѧÛ·o_–¶6T—Þͤ[´kÏö]Gñ»2}×xz·oÏVÌKŽ©¡û”£ÌcCã³ÏŽãâÐ 2ï('—ÞÂÎÄ“‹¯‘Œùޝôë¶m½Ø÷åM¼AòJp{ú¥O›õhO%Ç}òÛîÈ¡vb¿9ïó•1ÙÛߟ}†N梽·HÞæWO—ÞPA³FíøDÏÿæ§ü9FG]àGîPRã¹$‰D"‘H$úßRoç-m¹¿ýçðvÔÏ\=¥+m•¥·¾såô’ÑÁlWRp™x.á ’§Æ8ê?ç’X<µ÷˜Ì³‡·kšò¨*¦%„Ñ©¤M¦—3®’]Ò7÷¼?BeÇî³¶1ê^ñ¶{QÛ9»‡]…ÂÒ¤É0.;p…é%ÏצþÉýËž§‡!…¥žmÖ§=5ºFM8þó#ü#)¿äYŒ;»ƒ {ÐDqzM×Uq$óyçÚoܹb{62®ñƒÕ‰D"‘H$5ÜF¹´²B!„BÔŽR.B!„RT !„B!EµB!„RT !„B!EµB!„BŠj!„B!¤¨B!„âßVT5Àö¸|,Ž61á[0·345<^½fËŠOµê³¹ŒÀ 7µžÍP¡ž÷T¬9|w‹²)Q»0¿·ÊŽ`ÞëRy¿=哳òÇSÀ¬åxlŽ'’×úÂüÁÓ·CpôÃÇ9hE­.£^ÇáL‚׿£q¹-f͸ü\Ë,>GNìI|9¥#¬”ô”õà;s+.¤ê@êzqfu·ƒê±öK!„Bè«ÚeÊ/¾íGOÏ.ìÑWœÌ"ugøJS %Æ…‘ù{ÙϪâs­Ÿý™…<Å1Ž ýV¡1jÁ™a)¼¼3˜õf¿oðÛË:2ÿ0Ç:«Š÷QZ²‰—}}}Ëòäà…<]@&®HGUñ±4]8vé>Þ,YW0e­/Í<ŸÙüì6yuI_v*[:¼-Ý­UµZAÇ¤Õ ¼—ÏÔLV\yPaE¿ÛdÎo\6ú)vöêÅñŸœe>S¹±wÉÒáúôjºM>Ê‚! UÕ–Ü™UÈСõù*ížáš¿2yî}>·áå¼M»ð“2é š•¾ÝøEóAGšèÛw“Ž\v“ÌÙ7‚Ž%K›+ò@.³Ô³ì8uÙ/‰D"‘H$‰5a•ã׺ÂrsÔ°pî‚ÀWFÁíÎn¬‹Ìh³R‘C ŒT€Ê¦:wj k¥jc5tY)È*2`¸¼¨Úr³R,»À7‘_ét ëïcå¶L›‡ci¥+­ç!ò¶pòà=ÑÈ©bv…i}8™æ#ËÔ N6FµŸ¡vFàW›04b2.CºîíI¸KÔ†.¶Å—Ú´IOt³OÇ™c±È׳ï*Çnðw"¾;ëéG‘–†ÙáØrpõ÷†ƒªŽû%„B!êhú‡q#žáƒbøÍó¨)ÙÇì‰Ïx»ðÇ8ZÐçóD’±ü°“9Ƈ± n½LkWé›4ŸÄŸî‘­|Š6ŠJöQ»sZ˜–Œ˜Éæš*ŽcêÅã+©6jö2ÅÞeVQq¯ cC¹rt š) i§š.AxïÖzöwP0ç“ß>0R дådn'y/‚»Ömgdf6Ï,ò£Rÿ¾›tZÆ›ÌàVÿúôZ~“dC|0`g6yc1;˜Ôe¿$‰D"‘H$u7RÍâ±Ó‹oùÁÓ³3ºùÁôU·0lûylÕjE™IÈÔªabÓA}óq0T…!ãÚÃÊX]Æm¤Zß+`Ùñ5ü¯CA˜õ+Ò*m6n33½ó±oáz\/4üSDÁµ•xÚ¥,ÔjXºuÇ‹1cã1¬~ÚVïÑ]¥ã¬øÐÇ^)º*öRÁ¼Q3xX$`ÿšu8™¢ƒ¶È ^£&¡Ÿ«Q-úžƒ³³;ÀÕ­fœÌ~,ýB!„u9RmäôМj(8ö„ŽŒ|™îjPå<‘gr"øæØõŒ»Ì®¾Ëó%GϹÀ¬ã#hoЩ’6>ó–KÞøf]ŒªÚÏ”]V&é[ÙÛºšãU3RýPÌ}øE™¾¥-ôj«‚#³J…aœì¢",{rÝòϹmh\ú)¦ž??‹'³w=G[…~}W¹Nãy’'Ç8RYîµFòÜ6VÕU¿$‰D"‘H$u;R­PU6> µJP mV"R lÐ}JodïØŠ ç6âís˜ÒÍY )È£þ•½ºÑH|»on ßIÛ[PÅŽ&-1l`Cäùáéuô±B¡4p$—¸»w Zµiƒ6eé‚ñ{²€ø5Ô9Ûni¡®×ì pãâ­²ùÓº»çqðRÌ\]a­Ò¯ïÚ¤0Ž:Ž|ö%¯˜Ò¡Ftn Gж®ú%„B!j£êI—Lÿ°ti-ajïŽn£ÞÃGOáäKpK   ׳Ý0Ý' §^E~ž›væâYýgf˜£ë;a€b&} ûÖía_Z„fÅâò_i(I¢nÐ.@ÔüHdTVGš4@ófõalÚõ#ûfhÛ>w£q%>:XÀëµwðLæ9DÄ܃κ)zN˜‡Iõ“±î«dëÙbmÆM\þ£bìïyɸ~%iE’NâÀu#¼µr5^)ZñDã^¯aÅ3j\]x ·‹ôì{^>[Š—>ÿ ÛšáÓ€ïÌUè£Å”5¿#ê¨_B!„¢vªœþ±ó–¶Üœ†ÞŽú™«§t¥mé—ìT®œA2:˜íJ¾œg⹄7HžãxÚHMÑ4åQUL¥¢S¹/õY<µ÷˜Ì³JeÚy9ã*9LúæžÅS TŽì³t?¿S²%—·ÎÿÀ…C›Òô‘¾ÐWùMš ã²W˜^r6mêŸÜ¿ìyzØw•»ÏÚÆ¨{Å›îEmçìv÷oÅ÷Øú%‘H$‰D"©)Š’ÿB!„BÔ’R.B!„RT !„B!EµB!„RT !„B!EµB!„BŠj!„B!¤¨B!„âßVT9b{\>HG›Ž˜ð-˜ÛÇ€¯^³¿G€eŧZõÙ\F`†›Zï†(,ÛcbÈIÄçd’#·ã-?¨*i²e«x3d?"â2¡Í;i®%ç1ïu©¼ßæòIYɹ̚#pù/¸–Y¼-'ö$¾œÒVeWC…zÞS±æðUÜ-"ÈB¤DíÂüÞNP×ê2+`Ör<6ÇÉk}anð>z¶GY¾3·âBª¤©·aVw»r×°®û%„B!JU¹¢â’ßö£§göè?‰+Nf‘º3|¥©†€’NãÂÈü½ìgUñ¹ÖÏþÌBžâG…~«Ð(ësðö427ŒËFûÑ»ÇÎÙ“D…óõæF÷÷S˜±Í‹ß3>÷]û'?ÿ »{µ¢£qÉy”–lâåC__ß²<9x!O‰ëÒQBaE¿ÛdÎo\6ú)vöêÅñŸœe>S¹±·mñ*F-83,…—wsâ Þì7â ~{YGææXg•A«ëhºpìÒ}¼Y²ÎaÊZ_šº^íQÓmòQæ1“Ç—qÀ€ .;žIæá$7µÇ‘H$‰D"‘Ô"Ul0qá’'íË–7n·€ÑÌæ÷–@›AG¨ÕæëŠÏµJöØè¹¬cý@†jÉ?ßnAMéc¶ý¹#ƒŒÿØ‹¦-}>ftÚIÎò´Ðo tUÛ™FÆ­¦ŸMIámÚ…Ÿ$I_øÐ¬t?³nü"‰Œù #MJϯ6º¿8@óîk™Â4nò³0àâšÐsÑ%&FnåÜá#’PYQ­Ï>z´Ç¤#—Ý$sö cÉÒæÊVÑaË´y8–V²{A.Åõ†¡‹mñM›ôD7ûtœ9‹Ò^³¨ ¬-€–]`‰›ˆHÈ7àyˆ|§-œk? À­U/cíõB'׬‹}jhÆÎvÈDüí|X¹{ÀÚÂV¹HHÈìÜPOSÇýB!„zÕºÀÅ·üàéÙÝü‡`úª[¶ý<6j5€¢Ì$djÕ0±éŒ ¾ù8ªÂqíae¬.ã6Òõ©F^$‚‡ÏÄË™8› ‹qc/Þl$% S (-œÑظ¾ó |÷ËiDž?ŽÍïMÂ’k–xîÅ'QOQñÆm&c¦w>ö-\Šõ¢ æšÁÃ"û׬ÃÉ´Efð5 ý\h˜–_Ãá!ð:„€Y¿"çË¥O{rpvv¸ºµÂŒ“Ùp!„Ba½çTCéı'tdäËtWƒ*ç‰<“Á7Ç®gÜå`võ]Îè˜/9zÎfA{…¡óQ4´qn¦nN´oó&£HžîF5@…ý'yå½Ö4*û⢇'yáz¨ËÇ”]V&é[ÙûùÞ°ìÉuwÈ?ç¶¡qé˜zþü,žÌÞõmËÚ¬¤Ï|†å’7¾F£GœkcêÅã+Ÿ/­ß>Õ·Gå:çIžãHe¹×k|ÉsSØXõ˜ú%‘H$‰D"©nNua¥Ûj• :Ú¬D¤Ø û”ÞÈÞ±ÎmÄÚç0¥›%²Rgðèg!Ò¢dƒá+ÞEÛŒ°xG,Š0ëÂ〦½»Á±ôq&îxÂÈŽ¾‚Ôò£â&-1l`CäùáéÏ ®×ì pãâ­²ùÓº»çqðRÌ\]a]rlu£‘øvß<4Ü2¾“¶#¶àïýäSS{´Ia8 tù$ìK^U¥CŒèÜ<Ží?³_B!„ÿî‘jãF^OqÜêß©e ?ö©xç µÛKŒ Ôðþ¨mÙ¼'_#ó_é×…mÛz±ïË›xƒä•àö%m6§ÏšD2}7'út`ûöíËÒÖÆj>µ(L°E»ölßu¿K!Ów§wûölÕȼ¬m5ï£O{4tŸr”yÌ`èâq|öÙq\šAæåäÒ[êÕa¿$‰D"‘H$úÜROãÀ·´¼/‡·£~æê)]i«,½e+§GŒf;ãâÇL<—ðÉScõ»í]Ét®«âHæóε߸sÅ4öldüð~ê xïþžª#IæÞ<ÂåÃ<*Þ-žÚÀ{LfˆY¥ç3i2ŒË\azIÏ´©rÿ²çéa\Ú÷¦|#Š• ¢“Rÿ lÚy9ã*9Lúæž´Ðw}Û£²c÷YÛu¯xÓ½¨íœÝÃîþ“:ì—D"‘H$‰¤Ü@jie-„B!„¨¥\!„B!¤¨B!„BŠj!„B!¤¨B!„BŠj!„B!„ÕB!„BHQ-„B!Ä¿­¨Ö8`{\>HG›Ž˜ð-˜ÛÇ€¯^³¿G€eŧZõÙ\F`†›Zÿ–·Cp4$'í¡xhg,:¼ŽÃ™¯ÍGãò=ªß™[q!UR‡Ô‹Û0«»TåŸmÙCN"> ‹¹où9¶y¬K}¸½$Áäø˜úR(`Ör<6ÇÉk}anð>*ÔóžŠ5‡¯ânA"%jæ÷v‚ÚÀë¬0kŽÀå¿àZfñ¶œØ“ørJGXÉG0!„Bˆ*U»LùÅ·ýèéÙ…=úO⊓Y¤î _iª! ¤Ó¸02/ûYU|®õ³?³§8ÆQ¡ÿJ4fOð³ÛäÕ%}Ù©lùì¶t·V=¼"b«ôõõ-Ë“ƒòt™¸~ Uú¯À£qè±K÷ñfÉâ†)k}inè>F-83,…—wsâ Þì7â ~{YGææXg•þ×YaE¿ÛdÎo\6ú)vöêÅñŸœe>S¹±·­«dJ$‰D"‘È2å„‘Ï<h_VH·[ÀhfóûK Í #Ôjs€uÅçÚ ¥N{ˆl hˆewf2th½j÷SÚ=Ã5eòÜûþ|nÃÝŠEµIG.»IæìAÇ’%·• y —ŒYêI€Šú Õ’¾Ý‚šÒe%mûsGÿ±MõÜç¡¶©pØÎ42n5ýl ø0z.ºÄÄÈ­œ;|C*+ªõÙT¨î/IмûZ¦0›ü,ô¿Î¦]øI™ô…ÍÊ ñnü"‰Œù #MäF"‘H$‰äáU¿™ jX8wAà+£àvg7ÖEf´Y©È¡F*@eÓ;5…µRµ±º¬d0ùÁ´>œLó‘eê'£J¦|P;#ð«M1„!]Wq³Ê±ü]€ˆïNÁzúQ¤e†a¶C8¶\\ý½á ”&¶°R·3 -ªÏˆÂák€³w+X)ôÛçÁiÖ=ÞÇÊ!:l™6ÇÒ Yù=‘ï´…“çï‰Fk»À¢‚²öJX6v%n""!_ÿë\„K±Dý€aèb[üãaÚ¤'ºÙ§ã̱XäË_v„B!RuQ­(ž=ì»9:]!2ãOcÝÖ¿8 ûSt%Eu ²¨†‰ÆÞK~ÅÙsGð®§4&jè2‘¡Õ¿!k;ä$ÀoÝï¸u/±¡X9ºÌʪ>5\þóVwÝ ©[_IÁ®±s‡2;Vî°¶p‡‡U.r;7ÔÓÚä0ŠºÎ| M € –[ÀՀƥ~ûT,öÝ0zÉD4ˆ\„yî@gð‚u±O9&Í'`íg¸µêe¬½^¨ÿuÖÆbCÐTì0z¡îuÛñÛ©w¿t¦îK5¨ B!„RT³¸"¾ø–<=;£›ÿL_u öŸÇæQ P”™„L­&6Ô7CU2®=¬Œ5ÐeÜFº#Õ×Vâi—z°P«aéÖ/tČǰúi[((`ŇÞ8öêlH©©lÍÁÙÙàêÖ 3NfWÜ”‰àá3±Çr&ÄæBÇ"dÜØ‹7›I ÈÔê¹O9Æm&c¦w>ö-\rõëßDËŽ¯áÇðx BÀ¬_Q~à¼¦ë ¨`Þ¨<,°Í:œLÑA[d¯Q“ÐÏÕH~c„B!ª*Ÿ+‰ËCsª¡tâØ:2òeº«A•óDžÉ‰à›c×3îr0»ú.gtÌ—=糎 ½â榘ûð‹$2}K/Z@A‡‘ÇY¥Â0NvQQå:çIžãHe¹6#yn Wøò †6ÎMØÔ͉ömÞdɳÓݨ†¡û˜²ËÊ2}+{[?â|S/~_ù|iýöQÒÆg>ÃrÉß £‹‘¡×„eO®»Cþ9· KçÕóçgñdö®çh«9S‰D"‘H$¦ê{Þéò+ØV«µÐÐf%"µÀݧôFöާqáœ?h÷aJ·d%¤ ïQæ (”åæûw÷ŽA«6æå†ÖÍÐeÉQ¬ë¸ƒú€_oi¡U‡áp,0}ä“°ÿn;’u€Ò¡Ftn® GJ…æB¤%D#Ý´^üñ]´ÍøÏïˆEÅÁu=ö1i‰a"çÈ·Oÿ{?©Ä·ûæ¡á–¡xbÒ÷¸UdèuÔõZ£ƒ]n\¼U6Zw÷<^*‹®®°V÷Š „B!Ê×PUnQÿ©ßÒ¥Z´p„©½;ºz=Q„“/À--€‚\ÏvÃtŸh,œzùy lÚ™‹7f¹ãzp ôŸ a¯×ÞÁ3™çs:ë¦è9a&ÕOƺ¯" €7qùòÏ1‡ý½B /×¯Ä ­@Q>[Š—>ÿ ÛšáÓ€ïÌUè£Å”5¿#¯¸Š„Y£¶hßÌ-»>ƒ‘/NÃ3¢°¼ïìJ*V¢Ï>%°Aw¸Qó#‘QÛÏ&ÿ×Þ½GUYå}ÿž p¸ƒ¢H^P4­TDÅhbH™fÀd°±IDATjj9^ÖòRÚ›ÓkÚÔôª-IMfÔœ±Ò𲦋×t¬¼4y™¼„¢"‘Sf$ ¹_äð}ÿ8}p毙ïg­ïZzÎsö~ööŸ}¶¿óì6èzwk¸¹wEk7À5ànô-Bᯩ8©Õ†®ñDÿßÿ£MŸaÖÛ©¸/5‹ââ üðó5T™çœcØ÷“+~·n=æW­Á ¢ýÏa̓Vüøê×ÈÖ‚ZDDD¤Qoc»´àŽËö:5¥ÌNÙÏõsúÓß\ó¹`ÎK"™ÇžÎÇÚÙÂVò"ÉãS?ÓØÈ‘¯íåw٥ξÊxùÌN¾:® Ý›,7ðäýï7x¤@XZrð­LÉw´”Ÿ²‹†´¬ó¨9wöÿS&É ^½ð w¬™ËaíÜ´mäG¼†þ•ùü…#<îø¿ Üû®ff#U-Ÿ s”d¹Æ¥ ¤4QsbƒÌÆçÙÖyã÷gó*{Þ÷Ü?ž!nú¯EQEQ”ÆbrþADDDDDîžÑ¢ZDDDDD‹j-ªEDDDD´¨-ªEDDDD´¨ù[T»´À¶Ì tÄ^€´›ñòȶpXòÛd°äSÄx×ÿ¨ÏÈÝ(cžéhmöíxß;/lÜ‹¤Ì"ØËObnpÃ6Lð¸g:>¹DüòN$<¾ëÑ“VÿŠ÷]šq oÏé Ÿš‘zÁ¦<ÞWÝü²à†Nãâ°ýTÊHÈ>³/kK½ÛmÈç· 9¯d5ò¾ÝŠ…ƒ[Ö¿æ¶,h1à)¼yàGüZEב›² KGÕ?îò¶}lÇ­'âRoûÑIŽãÊ Íˆˆˆˆ4ÔøÉ0¶öL$ùí‹Q ëÇ!ÏâšcÅdu"çwq!`fд²â ÆúÔÿ¬ï¨ý¼Îãœh2~Ƀݟþ”—Ê.óï,æìñrpø½ t»Ñ†K«~œúÚ¦;OúË}'’žõÚðaÔÆl²ôÆ?9”}Ãàô×O±‚yüp„¿ã„G³7;‡G022²6÷}•'+É+Œa ¬l?q-7Æ=ÍÇcäÓrÓ¹*²d7ÇÔÜ•gb9‹x$~GžÁø#EdùAÎêh5>n×n|>!—?ìˆãÌGG0vâ¾ÿC5Yq€SÛZŒ÷e¨ùF6ùãʇØ'4”¡¡¡ íÁN¾Îk Í¢(Š¢(ŠÒ M-ö™Hò褀ÚãÆÝz.c*KøiŒ7Ðïу´Ûp´oýÏú=ÌjûWígô&LôŽXËÔkǸ0Ì«‰ãÍm [~ŽWÎnáËO䯬FÕîýøz™³!‚µ‹ÈAÜC¦­êM[£G¤·á„×ÈÌõŒòkúK€Oìç,çÏ\ÞËy\¹­7ãÓÉÒ=è<¶ÝÜf÷•‘i¯…5ÞWSÇZZ]ë£z~‡¹¼Æ¢¼šÕ×mÛïî(¾ÎÃãZµ»è¶>ñLg!·D·føêt’9ÜÙ†1;JÈ‹+ØËvgßrl]gñó|òçuCégºó¾k]ï~–_eüÊb縮gæº'»ÑÃÔüùQEQEQn·Smrl~û»(„…õÅ èÇ0ïO—1aÛ|òD;XTå Èn…ͯ/fY< +/xã‘§ïG “Ñïx¶»!^YØûæ&Ë­†½ÊáOÌBl°ëMW»uŸçT`Ï«à§ë7·V»Sû ÄcŸÆšã]°ôè!,éÓð§‘¥8µ¨‚;Þ‹gŽ•ü ßmLðîýþvb#¿š˜…ÿÀÍÃFúºu;•Öax‡ð²ZáÝq0žþ2Ï|ø5Ö÷¿i×úvó#""""wªëÖTÃÄ©G«É³Ï²“´´ÉÄÒ$¾0õfþÇþ‘«™šö6Ÿ|)™ÅG&2Àd°¦8`"<¿ø>ºÖþè°%?B2y>C¬wª½‡qÓUòû—»Ó­æ[C‹h¾q‰,ÙõýëÝ;û­Ë" ¶p„¯ûôŽâ»¹äµ¢èÐ<—gH›Rg'ÝÄé $OÏaûfý ÏL¿ˆ¥L(#/¾7\ë¿o¼¯[·Óh<#¸!‡,Øü½ð/Ì¢(Š¢(Švª2Ãj1´£š€½ø ò*ý0xΔlß‚äÓb§ýÌäâ¬\”,ÁeñœÈºŒ„ÀšZd[' JRÏ#ÏàŽ·µÅ}èÕ²¿½\[?]ýë|y® ÁÁð­[çl»ÆÜ…ÒƒïãD‘›tŒÙlu4bÏIÀ  ÷äûàœEs«!˜Ø HÿêríÆgÕÚn2Þß³wm‡ÈYÛQYÿ}£}Ý®Æ7¶Í×U7w~DDDD´SÝHÜÚ1‘dò¢HÞÓ­;{GŽâÜõ'YÆë<úLgG]µûþ9‹$b\O76ö^u‘$yaYÏÚÝâÛǕݞb5‹x`ÉXF„å´õßÑÎ4®¸ñä “­ »õ ehÿ'øq.Y°k:„†òÞvžŽ\[W\ ™ö1çÇöcá|èÙx‘äù¸Ðz÷cíø?L"™0ã®›k¶­AŒ}éΟ2†#¢£9rÜl.ÿâ2Élþe¸óÑ|pa§9‡XÎB^1£FMãŠÃ…dù!ÎnÎ#õàɈ7¯»93¢—ówŽôñ£Õp_FÚñbøs+øÒÌñ|hx4GŒ›Ã•{.“Ìá{1þõžºrËùQEQEQ >RÏ¥w\¶×ù‘b)³Sösýœþô¯ùÑŸ%˜ó’H¦Æ±§›óra+y‘äñ)M<¯‰XÛ0fñN~—WM’,K?ÈÕBê-„Ýû®f&oVðɰÚÒ[ç ŒßwžÎ÷ìyßsoüx†¸ÕïÏkè_™Ï_¸1£‘җΜþÖAþ3§ÂÙJ13Omç²±!´Õ-!±´äà…[™’ï¸*?e iYï±v·K.HaãNÌ`Ù`_FÚ±räk{ù]v©ó2^>³“¯ŽëBwS3æGQEQE©_Î\³²‘;cÖˆˆˆˆˆhQ-""""¢EµˆˆˆˆˆÕ"""""ZT‹ˆˆˆˆˆÕ"""""ZT‹ˆˆˆˆü§-ª]Za[fH:b/@Ú‰Íxyd[¸¬ùm2Xò)b¼ëÔgän”1 Ït´¼ Z x oø¿Väuä¦ìÂÒA¸Ñ‚:‹ÃöSY(#AV ûÌV¼8¬, ËûÞ1xaã^$eÁ^~sƒo´dòÅÌÇp©œ «ðËÙmø]TÝvŒõeòèŠI«ÿŽ EŽ9*Í8†·çô†O3¿ªjÇÜ‘ÏoAr^5Èjä}» ·¬s?FæÐÈØEDDDäNÜò˜òo_ŒbXX?yx×+&«9¿‹ 3ƒ¦%_0Ö§þg}Gíçuç”@“±Sh\»ñù„\þ°#Ž3Á؉ øþÕdÅNmkq^geû‰k¹1îi>û ž¼›ÎU‘%»96 N?&vúS^*»Ì¼³˜³Ç?ÈÁá÷2ÐÍy¹5Çn»F–%0þÉ(ò_ú,‡¬:Áÿíêj¼/“£6f“¥ß0þÉ¡ìþ§¿~ŠÌã‡#üŸ&i¨+;Î>ÄrñHü Ž=ƒñGŠÈòƒœUsL¹‘944vEQEQåÒÔB7ˆ‰$N ¨] ºõ\ÆT–ðÓo ß£i·àhßúŸõ{˜Õö¯8Ú¯G;Z]ëïí9øæò?Šòjò3>±Ÿ³œ?sy/7çk&zG¬eêµc\æÕèÂÖÔzÛÉï_ìF—š×üæöBòÒÚpºí˽_Ï"s6DУæ:AÜC¦­êM›Ñ#íØz3>,Ý3‘ÎcËÍm&q_™öZXm_·›Ã;»¢(Š¢(Šrë4]¨`v©S3`…WÛ~˜4ÿ t¼º›Î–ìÅy(¥ \-€Å¯úöé_³ V7+ª‹sQ\ÕŒíòªJØë–o´ïo¤#)«¢Ñrïᘷà~¸¦îÂg©ÎkÌ­»ô)„˜ü1í³,T² EéÇñîÜpø:Gj¶ùÃÇ fÖöǸ´p/|LûªÌÁ¹ ¢uÌôów4îÞy ñë T¸v,ƒÝHúø8|çµ¢,ju›“àèhe16‡Í»ˆˆˆˆükå®LdCi|o|»Ú]No0ûúqN ôbÄ[WHfð}<4=•™kî~g+}[×Yü<ŸüyÝPú™| h3…Gªœ·SžÀ%|nìH{Esk™¿oÓŸa}†pòÊc,e!wŽ¤Ù¹ë»ê"ÉïVqD{M°Ð»c WþHòÔl¶³ì  û=³¹íÉü$îÚ´g‹J˜¸<Š-ÍÍïíÚ±õ‰g: ¹%º5ÃW§“ÌáÆÈ6ŒÙQB^\Á^6ƒsØŒ±+Š¢(Š¢(ÿŽò[{&’L~a({õêÃŒåÜuÇYÌ_¸ý‰v´tí¾„?–ŸäÌnCùvz:÷Êâϯb·9§Y~nïviî͘èÝû9îÏ'¯l›ÎÎn\cña§ÐöèS\}ð*yý4—öñt.‚§ò’‰³ÚÝ(ƒp½‹$«L`€ÉчO¿Ü^]çËB%I²â‹‡ék°/À€áñ<}í÷,ŸÏ…ñ[x:ŸdÚGüM§æÔ'ß¾‹j/ÂêÇÁ-è ï&Õ·šÃfŒ]QEQEùwÔTÞTS s§­&Ï>ËNVÐÒv&K“øÂÔ˜ùCûG®fjÚÛ|ò¥d™è\Ä™~K™PF^|o;¸øŒwßÍ%¯}E/€¦€‰ôìG¼Hò|\¨ñ±jÇ…æb9 yxÅ4Ž5+’å‡8»æ‘zFæÐÈØEQEQ”ææÄ5Uþ±ã²½Ním)³Sösýœþô¯ù!ž%˜ó’H¦Æ±§³v×¶’IŸhüYÍ.]¸ …;1ƒAf®9ý­ƒügN…óbfžÚÎecCh«[jamØÅ;ù]ž£n¸,ý WO©³Èugÿ?e’¬àÕ ßpÇš¹ÖέÁØõeë<ñûγÀy•=ï{îÏ·fþ0ÓH;––¼p+Sò×ä§lã¢!-o,†Ì¡‘±+Š¢(Š¢(ÍMœ @?'µk/""""rGú›$8¬¹i¶ÃkY¥ùi¶UP󌊟×¼ˆˆˆˆˆ²ÀZhx0õ!Qš‘[: `XÍ_Ì ÞÕW‹ˆˆˆˆÜnA=¦î Õ…Î÷Í•ˆˆˆˆÈM68×Ë…u_lêÜ¿ÏáxÌ^[5w""""ò_î0€¹pÖP7d2Ð@?8¶·#tƒã"""""ÿɲœp Àßàx u“þ!·pÕáñIEND®B`‚stem-1.7.1/docs/_static/prompt/run_events.png0000664000175000017500000005327413157571677022045 0ustar atagaratagar00000000000000‰PNG  IHDRÕ¾úóÛsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEḇ¥_ IDATxÚìÝy|TÕýÿñ×5“™,“HB„M ì(îVܵâò«Z÷¥«µ_[—ºÑjí¢UÛ~mëR°¢­­VÑ*²#$$}›}½s~$°æÔo?ÏÇã>0sçÜsÎ;óž“sïÕ0î`0ä"„B!Äÿ--@°xø‡‘i}<ïþ¸È“>B!„ÿe𧀇ÿá„꫇$L !„BA3pðÌž4äEOó§ôŸB!„8óéšýÖ¾Oh¤úEà2é7!„B!è%àòÞì;Rýpô“B!„5Ž}F¬M½ž¼¸åHlUsåÄóÎçØ\³ìéÃ#İn@©O¹i°ô‘ìS!„∻¥;?ïª]t”€½ô:^þ¬œUŸmä–í~å K_§¹ú÷œš©%µÅ”1?ào¯ÿ+†Ø¤û“ôa_±`ˆŽ©ýŸv”òÍ_½CE»ŽR jäówã’bëîWòϺžÛgñ,8 qÞû$ð¼R —s2 ”£eqÁ[aTÓëØ»Š¶1?c«Šòî…Ùhêcp%+”"üþ·la÷¡|Ú‰•W3Ðd´ÎFú§o¦¼¹¼RÙS¾î¡fåBîš]€µ»‡~=*ð§§íýÚôÙÿ$¤Öqk‰Åø>B!¾|uçhz¾Áþ‡^Wù˜úÓ{˜ðæÙL~æt>Yþ g?}ï8¾ÉŽçµË®âÃNù‚_5:þVJÒL웨™|ÿ¿yù6xå§—qëGµè¹ÇpÒI¹ìòÄ÷Y÷S~pâÕ,ñíy$Ö^Eàƒk7>3&rÎ{ž÷иgÖ¼Þ’ÝCµÏ@9*ÌêW>…3OæÄ+++c»ßæL;ƒá¬ãW«:Q»Ow8D}z~ÏøÏþ'—¿Ñʾ-÷ªs2ýspš5‹’B~zßz;@ZÁæþô·<ðÖ0|#Žç±JPG,v¬ûü.×,v,„è é÷©Bñ•×£ïîy  P]‹EÍýЫV_[ Ìî9êï§ê¦¡…ê¢EjçŸf)Ëîõ ,ΓԳmê€ü‹f©´žõlEêœû_WŸ·+¥TBµmø‡ºïì"eëU–)ëõ½'ÿ¡–mmTÞhO)jéí£÷Zï‹)Oùè‡jKS°ûõQÕ¸öeõÓÓ*k²Ûê£ÎŽ w«Wû”RJ…v.U/>ýŽÚæWJo]­?PW?©Ñ><ŠKŸýc/Só·+åYpšrõ¼.ã|õRjÇuµÍ”§Îüí{jÃÎî.Á[ù®úÕ…%Ê~˜õrú‚j®JŸºÏs–õÏ”J|x‘Ê:èë-ªä;Ÿ)¥>Pçgôµ-“ÊÿË•R+Ô•LI—cú=õ™ÒÕGÿo 2õ<®e©óß )µá6Uj5VŽiÀ•j…Råÿ©UÑêߨãœ(p©ÓxTbåÕj É` õOß‹¹àZµZ)µt^ŽÒº³{@U©€zíô4¨Ì –(]_·O›2ç|¨ú{ê¼LƒûTYd‘EY¾:KS×ðX×{]‹:NÃf…§Œ£`Ìi í$xÊoxâØ·¸î–O&»×pÇqÇ0ùÒ…´ÑÆÂK'3fÌÆŒäï.# ¹™ùØ2þuw¾”³Ï¹‚_o™È=o,ãw3Ý»Çë,frËÍç“óÑÃÜxÑÌ8u&³çÜÈC¯ï j´>&#gœÂϸ|ö,¾qþÍ<Ûvóß]ÆoNÉ4¾-u¶˜ÆI%µ@Û-%·ªuJ©5×)s®gNS?ü{µÒ•_múçoÕͧSNí@#ÌûêÚ‡ÉTª›}W…R Ô¬ô®Çœ'<¥šT¥ºœÝp9]#ÕêùS2UÉ «`ósêôÌ´äGª õñ‘ê½Õ¨g.*Üý——Ôã~¯bËÔù.uü•R;Õ¯&9ÕÀ«V¨híoÕ‡ŒxÈ"‹,²Èòµ\ž0“÷Û± ¹vb>¹Çó×ÑßãØÍ–«?¦ÕÓÄÚ§¾I‘µÿ¢}êðC#KÞ­f÷`T¤Š·ßk„cNc¸#™ÒœœðÇ:ÚÛioo§½c;ONïãþ5¡ þ¹¸mìLÃÛJºÎ‰ “*' ³¦õ[}ú·£ûk·m ÕAÈ”N_ë!ѹŠßÌ)Å=ê"ž¬,åûoVR¿t>3röÝÒ:~tê¦Lé^&~›{g‹‡*'JÕ«/°%ãt.ŸèŒ™w6yÛ²h¿!Y#õ‰SóÂíü)| ?¿r¶#Ú?}+¿ãT&L˜Ìô™s¹åñz.~åS\VˆˆûšðéR2'sõ™ÞýÐÌÜ+ËH·[IxðÄB!¾Ž&[€a{6çÌÇøãŒùñNàÑ_,aNÙ[ܸò)îzæ nXìÇzhûýÉY;¬¿A‡Xÿ‹s™ù¼£ë²&‰µB}¼F¡ 4S’öN¢ÎJGë;ÕêpëÓ_ýs8}¸ô˜m–$Û žÍ¤¡):Þ-ïðäßáOO\ÃëåæÅûþɰ[Vö:ñÏCågkYëù¢Û:t9ѪWyaË|ç²2RWF¸äüAT=»-‘äÊÙ-°†_ß¿ŠkïýS×Éþé›oÇ甯oEñ)+>\Ò.žûñ\Šþö;vvî“°’}ì5Ì=Ï…w¥²àÅo3¥ÉB¼}ª…B|= ³Ðuáêý˜²góËÿ=nšÌÇ9¯c¯~‰uëY²3o ²C_³*â'‚“Ü4Ë~Ï·-a3ãC±¯ØØ5òkÆì™`ÓlK*Ï%ðT|Â’Š$^bÌi§„­³=lì%ÉÖÙ÷ÞŤwº³>‡êÃþíŸÃèÃ}Å;¨mgé1äZþï+”¢;Þã_[aöø!¤j+ í ÚD«XôÜfîÿÞ·8îTðÔ‚­þÔá8;_¾‹î{Ÿϰ müªô ‹Y¥“P ûi‹frâ gX4‹õk­ü]‹¦ñïj!,Bñõä>HB³3óá§8sÙ-Lx£ðé»g!ÛQÉÐ /UMѤ¶©[ÉÆÐ\ðó{¹úÁwi´0"}O=·‰PíËüäïäýûþÅóñ;y~£™ WÍçg#êøßY¯P§fO½ŸßæâÝ­1†_r?¿ÓÉ¢ ±Ó`øÓ Ô9­ŸësÈ>üª½­ô&–¼°õØüåA¿~¯–xÞI ¢_F},…\ü«{™¸í]>\¿ƒÎD#Îø>÷N„òŸ®Ç»WKgÈØ2Êz_/ÞÉöŠø“ºª[_åD©zåÏlxð^~õHŒå°p[4©röûYë[ί~û9×?2þöOßÒdäÈ|9C˜~Ù=üú¸8Ÿ|çêu ÚBe „[ޝbþ[‰„5^|5Äm·¡òÁbò¡,„âëɘlížù¿ª¦ñuás×c©eê¶77ªÏV•«Ï^¾V•Ú’¼mSCæ=©>ÙÕ}ñ´X³ZýÄ*Û´çòtç>ø¦ªðt=ݹù õใ÷ºTžÑ¹ôœçÝ 64ĺ.b·k™zêšqÊ¥%¹­>êÜûDÅÞ¯sÍX¨¼‰î“Å ÖÇPÅÅhÿœ÷ÐbUéë9a-¬Z+—ª'ÏÉï: ñ@'i¦ÍTó)UyÿØÃ¾¬Þë2D}ó¡WÕÊêNï®M°nµúÛݳUµ¯ •R‘7Õ™é_ôDÅ”c)Q·¬îº$ã²ëö=9³ïröœ¨èÚsÂaî\õº_)•Ì‰Š†úÇÀÉ ysÕ«õz¯ŠUÆÅêɦ)wO]ÌÅê–uJ©ªÕ8{×c)RÕJ©eWä゚,²È"‹,²|Ý­ûÿ%¿!†òýO«ømû\ܧþN©B!„è&é!„B!$T !„Bñ¥úïšþ!„B!Ä #ÕB!„BH¨B!„BBµB+îÄy3½T“þBñUÕ&Ü4’ûvNæGeà2¢4” †™pÚïÇ:÷—£ÖöÿrÒÏÿ]lv¦üx'^â¦È­ÉûðHfÊñ%„P};'½;…_îœÂ­s­ôëÈdað™i8ÐÈ;=ƒ,ÛáW¥à'ã¸ånºÝ‰õˆ¶º¿êÜ»áh´]ËÎdÞ˜_ݵ_¹s2÷~8’‹®v‘jîªÇÐßNä—;§pË–=û\³0ñïSøåΉ\r¬ékýv?jï±>÷…›+×õ쇮}qÿ²Ñ\ñ#7¹©òÁôýc÷«ò>ìßÏ̯a»„¢Y¾p ‰(åwT“}E*·©û"÷Ì>Zy­?ë|äÞô_³ZÈfÁ w„ Úmä McÚ}#ÉòmàÏ‹âè¡`&Ûû²0‰@‚HäÿìÏÈ£ª­f2²»þíÙÀo³1°ÔIÙw‡1jl5\Û†'.Pÿ…Ã_MF?3exZ!¡úð¸æŽæžG{¸"•¶1[øÜ·O€Èp2ýÎ"N>ÇE–«+œù*<¼Óv–U©ýʱ5‚vöüÏÏóelèìvÆ~¯ˆo\žÉ7$:Bly©ž×í =ØR8î‘!œt¢ƒœ\ 7XÿÄþñ× á„Á:(@s9˜øýBN½0Ù¨š [Ÿ®á•çÂÄ£ÖvÍé`⊘ùÍtrÓ ºÓÇšÇkyç•=õ1.À[W°ªÉÄùc¹é +E3R°,òvEéD¬W¤V{Bu8’Ĺ¿Ì”>VÆõsÌDßÚʃ7z 8\ÌýdÇåè|:¯œ…Ëô#²ßÚÏ}¼Wû_€_UÁªF…ãøbn[˜KúŒúÙÀ{õH oñÑÞý[7=­k'¥8€SÎO#w î:lÓSℌFÚÕmz"4¬P»-Žu€“‰wà›gtO)2°¿b[ÛÙælNÆŽê:šì£ÓÉØÜNuûá¼çM ¼q(gO¶6ò—»µ>ì¯úÕãÝbgú3£¹øªtrÓâ4o Ò4áìdÄ$K’ŸQ‡þÌ4Ô®£ (O&!¾¦#Õ¡åu<»ÌÃòƒ È;à¬éú¨{xøKˆ˜“ÃŒ)¬z•c¢à®±|ïzÑëxöF/½gXÆàœ³-àëäo爐,¥ù\÷B>î‹óüK?•»?ñ㬽i¯®33é¥2æoaô¹)XWŒÕ™¾Ë¡,Ÿ™Çj ûùûŒ-,ß¹g„'ù>kc«?‹²œ ʆ›ØQƒ¾é&¾ÛJ­¿¿÷û¡û[ßïÕ#B“Ëΰ+ó)ˆGhjU]Oô(ßÁöÐÍbÆ•¡ð' öOÌ@»,ý×öèªüö$0;-¤¦šÈ½i7^kcèlÖ·|D _±@uŸ$˜x¦…ág:°®‘wj*f åmïa„4Ô ¹ê©hõ­Góx·ŽÀ¬c5 ÈÛß¨àƒ üóqÜz…µß?ç _Gã -= šÛå›]ñõ ÕÆ¾a#”/ rÚR)¼g ÷_ã§üm¬z¡í»Œ!¦MN# -“o¾“¹÷Ó.;©@`Ÿ—%tšÊcp¼ Ç fà°PŽ­4À¶¶Öï€ú9qeLuáØØÊÆ]§óýVêIcp†“’|*2ÁGѺÚG§²;)•ŒS‹¹ö¾(OÜå!ÚÞõ·å„;Ie t(¸0 §¿k¤:Rý¶¿T‹Ÿå‹ã”]h£lŽƒw¶›8î+eͳ"h¸æ~ï—÷j²öþÐðû]lÞ7DtBÝiTÅu|mI-ÚÕom×È>¿ˆy÷æQœ½OÈË0xtô@ûKéìx©“ð™Y¤Ÿ‘EÞ¯Z>ÝDùüý(zÒýlæ˜äQ>¹y'Ÿ7«$?[ú»>Gúx×HïêúŒÚÔÊg• þ&<75øBˆ¯w¨Vj¯Q·}¾1©´‚‡×æ0ý›YŒ;ÃÅÄ[\L¼%Ÿ.ÞÌ›+uC÷I×,Ý7·ñ{:ðôþ‹Ç©í„ýO7WèÝs€5S2u6PNÏöÍÚ‘ÿªR‡®sòc¨A>¼e«æâ|¾óqƒ®Ęǽ¬ïŒS³¬|¼qŸböÝÙ”lBqÂGä í/tv>ߎ÷Â<2ÎË¡t•qn`K3++€Öÿûýпžú彚,_eGÇ»=À–´°fi„˜êÏ~6Ò®þi»© ‡K—Ç`-ζ?Ö³¶_Üɦÿø©]ÀëÇ:ÚêÇ0<‡c³buÙÈÎ;ÜîÞþ~»º¿LT{€-Û¡hh ³—1¥2\>ž>q;U*•Ó_ÅÔ,OUoÈ„{l×f;+b½þlªð¬ ÁŽ}b1?^9€Ž°‰Ìœ §oeç ¼ýajgúÓeLmŽà‰›Éd¡éž üîÙÉŒºÎ}¿>¶©™”ËE'§pòKã9ù MõÕöw—g1gz}2ž™õî3 ¨y´š@²ÛsrÖ+c8Y³3¸ë‹4¾¼•m-ŠDJ„ fKPñ¢—@;¬\šà˜3Là‰vg@ÔèþŠEXó{³~“†Ó4µòï÷b»Gã¢ýºßûèçˆÑ÷*X†fsâL;v`ô59ä?·“ÚðÑ?€ õÃ@»ÆÛ~(ñ>ê#¹ŒÌÈæÛoÛ©ÚÇ<Äq¸?×i|¡‘ºS˜i¢¬[â°ÏEY÷ãí Ÿ<œÉÓó­ïxüW$ÞcýUŸ£s¼GÖ5±¶ÉÍôüt.YZÆÌzpïó‘±þƒ8Ç^d¡ø—cùÉÍ1,E–ä?3ÚÕñÕ:v„âK©¶ s1üÄôÝˈÓ]¤õþ܆øÏ-;Y·)6+9EíëBÄ4@Sýº‡]ÃR)›‚½9È翯âé߇öºì\xi-/?íÇKžÜ"3¡ÊʪA<Âêë>çÙ_·³£NÇœg'{…Dc€ÆÐaü5òPu6”"¬¾ösþrokÞèà³…Í¬ÚØ}9ºHò#Ç}µ}Å5›ùÛ_}´‡,¸ ÌÄvùYù“Í<ýlØpàQÑõŸÇˆèZœBÞ` zKˆŠgjxòÚ:â wDð+ ìcÕÊ8JÅ©yÉÓ5BÕ%O¢ í/…çí]¬j¦;44R8œrú¡Ÿ“x¯êÕí¬\tj¶Ñòe]¿ÛHÿiWm?ä{¬µƒ—¯ÞÅÆÍqL%.F}#“áÃ!ÔbûúXÒsõÚvÞ{»ûU›šX¹å‹MµPíÞ¸½ÿ!œvŒ)©÷XÕç¨ï~?o^VÃÊOc$¬Vr²´µí»’NÕ϶ñÏ è&2Jì8M ¼Û||¾<¶÷VŸ™‡l×WíØBˆ~¦Jºáp~Ž˜peB =ÑÕ6§¾1†³FAãƒxì©H?ž¼$ÄéTj*§ÿëf O°ù– <û¯Ø—úõU«O²c(=Wÿè¹µÌ@Bˆþc‘.8Ì/×7W®B~Cˆ–æöb'yÙ@ÔÇ'oF%P ñ¤ÍÎÍß³‘p;ÈuCâ³zÞ\üåدZ}„BH¨þ?ÃdUÔ¯ “=ÁAQ! ë´,kgéÃu¬Ú%_µB|£‹ôáVÒ‡:°’ ýÃ&^ûaÍQ©Bˆ¯.™þ!„B!Äd’.B!„BBµB!„ª…B!„P-„B!„„j!„B!„„j!„B!$T !„B!¡Z!„B ÕB!„B ÕB!„BH¨B!„BBµB!„ª…B!„ª…B!„P-„B!„„j!„B!$T !„B!$T !„B!¡Z!„B ÕB!„BH¨B!„BH¨B!„â³ôÇT†Í¹·³{"Úºž–µ/ÒXÛÂŒ}쌛ÚÌÖÅÛóRsÑ?;›º…÷ÐìÓ TÊ}ÈN8™Œ7&âÄÚÖÒ¼â9뽨ݵ@Ö”«(5»m´¯{ŽÚŠtµo™¦ìÙ ?÷rÒB¯ñù¢×éI¬cLÎqW3høplæñ¶54.–¦†^õé¯vi.\㮦xÂ4vˆ·¯¢ñ“ghjô`[«³Ám !„Bˆ£ª5“›ÓBhõ|ªk#˜œÅ¸'\AÁì|/ßK“7A"“MÛ÷ÅV4¢èñ„Áj$PZ ñÚשYÓ„nLÖÄK(8ÃJxÁoé+ÀAÚô»ZÚBãÇói÷h¤–^Jñ‰w ùn£º.°W‰¦ÌY”žs ŽClõ ëhé¸O¹‹’Á 4~4Ÿ¿‹ôñWSxöm¨W ÉïÇv™±ü#B üOT6‚«ì[žõ]ôW¦eŸ%o—‘m !„Bˆ£ª{è¾:‚m>hÛNÀŸMæ…gáJ³Òä “ˆF@³¡í—V-h*Š® r:Ñíϳc{Ïÿ7àŽ&kv©N áXâœA¼òQê+·‘‚Å9ìgdäbª °;§Œ£hö%X6>BMúw)Í;À&µNÊòJR ¯ù#»*P@ #Fê¥?"ÿ˜"Z–W“è¯v™‹È8UûU«VSÐÙ#uÞ- ]HÛªÛe`[B!„âˆ08§ÚŒÉ9”¬±Çc¯¥­-ÒõpÌO3ššm ©9ù˜5 ÍlFżèêðªdNK^Ù(4ï<=óJt!¿ÂRp,N{WŒ7¥Æ•$Ðк'xšÜd|3î¶¿P¹®òÀuècÍìĬ í™6­Åë[^fú¯]š£”t+·a>æN&^uR*io[Á0,Zíê«…B!ÄÑçHµkƘ2£ç­´¾·O÷T‚®àìÆdJÁ9ù.FŽÓô÷Óh6CÌC"ÙPz£.» —èUÔ¿ñþž<¨ÚhûÏ34§È` IDAT¤ŸõmFÎMgM¶!H¬„µþÝáßVzŹëÙþê ¢ öü@èkªÄëƒeg’¾kÞ€ŽÙ5»ˆÙº¦»¨þi—–’‹…0þP sNf«»5J0…ì\,&ˆêFÚe …B!Ä—ªC«æS]B³çà,9›ÂYbþà.¶W¶w‡j3šm9Eq¼ &2‡¦¥Ó ÑNôD’µ }Jõk?Ö^B昋tîðúÔ·F&g>vkžMá7 KÙp–žFFÅ6Ú|qpL¢è¸R|KoÇ{°9ÄFÖÑwÐðþK¤Ìº”—Ýó`Wà®mO~þíê%°ê'”o4óÇIK¶ÎImK!„BÕP­û»çTSC ¡=çq†”MŶ}1Ñh;º2cÉ;…t})U«m q ÎÍ&T¤•x²¡Z…ˆ´Wi¯Â·«ó¼;É7”Æ6“°Ž¢hÆÙ˜Êï r]ŠÅ4~¶„â Bñôt¾»mÐlÜöT˜ù$“gö.x.c®ÏŽ—ï§#¿¯uî£ÅŸ@oy‹Ê‹1;s°˜"è–“yÑ%¨»H¶Y‡j— ·'›Ã Q? ebKµA¤…xBÃ2ÈXûìCy¿ !„B|9¡zo𦠔ó 'RI]Fbû/¶šéT·“›Ez¿`ˆë~µ©kÚ·f/À‘'ÒÞ±gæE¤O‡N®+‹I­ýÙ{8i#uÚ É^Jå;oâ ê$ú\§w­uô@ºey߸Gt UÕ­_ðòt{·K…*ñú!¯t–ª•Ä2w6D7VW •T¾-!„Bñ%…j³k )˜Rrq•Ρ0OÇ¿¬œ˜^Âñ\òò›hXÚˆÒ¡­:J~Y.‘u>ãáÓ”IFÙLRü5„Ba4[>®‘sÉIñÐZQÓ C[ñz- 8þ*òoãõ+lgRTh&¼n Ѩh+áhï‚íX":è^"ž–®é(FÖAÃä,Ä‘‘‹#wYÇÌ"ÝYKÓÛOÓJ"Ri—^KËg›É?ñ:†M±ÑØieW’Áfvl®ëZÇHlK!„BÝP­¢A…{Ú=Œ%Ö±…Ö¥÷³«¢©+0ëÂ!@_A»§ël¸på "eçëLæ†#v¬®‘äŽ=—‡ˆm-§áß hØÕ}ýi}õo?'\Ì Ù÷S©ÇSþ;v®ÛÙÏ77±â;£Ç¤÷Öà«yŽ-åÿÁHöŒ?íB'Rñ[¬WS<ñ†O½cuo=M«¡ç$³-!„Bq$${ !„B!Ä>d²­B!„ª…B!„P-„B!„„j!„B!$T !„B!$T !„B!¡Z!„Bˆ¯©ƒßQÑ1•asnÁíì^E…ˆ¶®§eí‹4Öv 0cûã¦6³õ…Gñöº/Š¹è‡ŒŸMÝÂ{h6zsÿ‚i{?ì_rU¾®ÿh.\㮦xÂ4vˆ·¯¢ñ“ghjôï¹Ø¶eYS®¢`ÔXìVH¶Ñ¾î9j+jЀû (œp29nLĉµ­¥yÅs4Ö÷ܰƄ%ï4 ¦žIÖÀ˜5xÇg4¯x††ºÎ=Û2RÃ4L™'QrÖõ¤×ÝOùG[÷¾ ¢‘þé]Völ†Ÿ{9i¡×ø|Ñk„tƒåXF2䲻ɶ Šá¨Xðüq9p„B! …jÍäÄæ´Z=ŸêÚ&g1î WP0;ŸÄË÷ÒäMˆÆÀdAÓö}±(z<‰›ckv,f¯„í•Ý¡4AÂßs7@3ö‘ßcä±C”ÿ‰ÊFp•}‹Â³¾‹þÊôøtÀAÚô»ZÚBãÇói÷h¤–^Jñ‰w ùn£º.$PZ ñÚשYÓ„nLÖÄK(8ÃJxÁoé+0å“3ý"Ò‚K¨}o 1S!YS.eÐ" ¢-0XƒMOJVÙ…Œ ˆVÿìaÊœEé9—à8œrôÔ¿}-¦=;UsL pæyØj?#¢ËA#„Ba8T÷Ð}uÛ|ж€?›Ì Ï•f¥É&€fCÛ/ÕYÐT]Ob¼VKÁbÓ‰µTl÷ïÿ¼¹ˆÜ‰£QµOPµj1-1RçÝÂÀÑ…´­ÚAÂ2÷à â•R_¹ìø+Îa?#£ S]€:Ñíϳc{OÁðGG“5»ˆT§…Žp  4þë;4%âÝ¡³_pçN##ÝF[ l¬>†nÅ1î ëh~ÿ lÓoÅ}8ýÓ#eE³/Á²ñjÒ¿Ki^’å¨0‘–mDv¯Ÿ{Ö,œ¡÷زìSbrÿM!„BˆýœSmÆäJÖØã±‡×ÒÖÖ¹b~˜Ñ4ÐlIÍÉǬihf3*æ%™L%«9Nœ‰Õ¶Ö×¥¤» X¹ ó1w2ñªûRI{Ø †aÑÝCȯ°‹ÓÞõMé£q¥ 4´ äš0§%¯lšw žÞsXvj ³33­ƒ1ãõ1$Fpõ¬íqv6‘P‡×?]Íq“uò͸ÛþBåºÊ÷¿‘rz·{À… .Q´/}_TµB!Ä£Z_+¸fü)3zþ×Jë{ ð„»ÂUWpvc2¥àœ|£FÇiúûi4›!æ9x@-ž®ùÆêc´õê ÷˜±•^Gqîz¶¿º‚h†ý°ÊéÝ𲧆µm!õu>9Z„B!7T‡Vͧº.„fÏÁYr6…³ÄüÁ]l¯lïÕf4ÛrŠâxLdLK§¢èIL©VžÅl}i1`Âä*%kÒµ”œv7¦ÐíÔìê=o8J`ÕO(ßh"æ³÷ùv&LÎ|ìÖ<›>ÂoA–²á,=ŒŠm´ùzÍV}Jõk?Ö^B昋tîðúÔ·FzGPÌÙ³vÎå8v=EÅÊÍ쟓UŸþÓgÿ8&Qt\)¾¥·ã «~ègÐÜ3ÈÏ‹áyïc 9X„B!¦Ï麿Ž`[ ú54/ŒMi¸Ë¦b3ÑvteÆ’w éúRv­^%§à´›P‘Vâ‡Ä$ü[i]ö'ZBé¸GcT¸…8)ØvH‰úý(-[ª "-]Û²Ž¢hÆÙ˜Ê¦rõbW>Φ…¿ E;žâée˜÷J—!"íUøjÞ§öÝÇh–?nh¯Ñ0çÏaÄù—c¯yœÍK>Úë$=Cõ9"Ô?–A³qÛSÉœù$“¯{)×ý…‘Ã>—1WÝG®Ëd¨Ÿ÷°‘:òDìÑu4íòÊ‘"„Bq–äV×Ð4 H ¨˜=‘JÚè2ÛA°ÕL§ºÜü(zÐËÊ•ÚÞO…*ñú!¯t–ª•Ä2w6D7VW Ù p¤Ä‰´wì™P©ÁÓ¡“ëÊÆbâ £çÝšzEjçñ ™=kÕclþx5±}^g¤>GÔ^ý£ÐkÿÀÆEö^'ÚHv'C²—RùΛø‚ Cý¼›yîb7‰ú Då@B!„øB¡ÚìHJF¦”\\¥s(ÌÓñ/+ïº DÂK8žK^~ KQ:´UGÉ/Ë%²Î—ĵšSpŽ;ŸôX5A_eË'}ä\r^Z+º¯¢¡×ÒòÙfòO¼ŽaSl46AZÙ•d°™›ëºÖ mÅëµ0àø«ÈO¼×¯°œIQ¡™ðº-D€)“Œ²™¤øk…Âh¶|\#璓⡵¢¦;^ÛqN¼ŒL>¥¦¢ Kæà=k%ì ¢ŒÔÇ(s)hæXÍ ¥ À‘F4DŒõO´•ð^á׎%¢ƒî%âiéþ1a œž¬:‚t„Öî@®¢'„Bq˜¡Z%Dƒ ÷´{; J¬c ­KïgWESW`Ö=„C€¾‚vO×Y~áÊDÊÎ%Öé5ª5;G1YegPjbÄÚÊixï%vÏóÕ‰T<ÆëÕO¼á@ïXEÝ[OÓÚsMh}õo?'\Ì Ù÷S©ÇSþ;v®ÛÙ];V×HrÇžKŠÃDˆ¶–Óðï{¶eÊÄ9 l“(9oÒÞumyŠõ¯DL¨A&÷9Œ˜s&¶žНgt1èU?gý’M$ õOõs÷ª®aØñÒî ÈQ"„BÑWÌä:iB!„B|&é!„B!$T !„B!¡Z!„B ÕB!„BH¨B!„BH¨B!„BBµB!„_O¿£¢c*ÃæÜ‚ÛÙ½Š m]OËÚi¬í@aÆ>öÆMmfë âíy©¹è‡ŒŸMÝÂ{hNêF(¦Ì“(9ëzÒëî§ü£­{ß™Ð\DÁÅ¿``ÚÞ¯ò/¹‰Š*ß^å˜3'‘;n&YE#HM©gçßî£Ù¯ï¿½ìÙ ?÷rÒB¯ñù¢×õ¬bLÎqW3høplæñ¶54.–¦†^7µ1²Nm?d-Èšr£Æb·B"°öuÏQ[QƒÞ³1#ëîC!„Bñ…CµfrbsZ­žOum“³÷„+(˜Oâå{iò&HDc`² iû¾ØŠF=nüfÝZÊP²Ê.¤`üxl@ü€+Ù±˜!¼þ¶Wvt× ï»þÙps3Ã+%Rù>-Ëß&äo#Ú¿.¦ÌY”žs Žý¶“Žû”»(Ü@ãGóéð»H5…g߆zåš&7Y'ߌ»í/lZW‰ýä}Š1;1k C{¦qDkñzÀW€™j”u …j#uÖ=„ü KÁ±8í•ø" Súh\)A ­]Û1²Ž‘>B!„ýª]3þÀ”=ÿk¥õ½xÂ]1RżèÊÉ”‚sò]Œ§éï?¦Ñl†˜‡DR‹û^Y³¹Hã¤úã5PÍ´¬zšºÊ†®Ðh)ÄgEoZEcù:B )CçQrÂXB·QYíÌØJ¯£8w=Û_]A4aþoMB•x}0 ìLÒw-ÂÐ1»b·1šflC«ÔYµÑöŸgH?ëÛŒœ7šÎš&lC&Xÿ;j»G›¬c¤…B!Dÿ‡êЪùT×…Ðì98KΦpÖƒ˜?¸‹í•íݡڌfBNQoƒ‰Ìáƒié4C´½ŸSšò,fëK‹&W)Y“®¥ä´»1…n§fW¬nlVW/¡}W; ¶ÿ™”’‡xÌ(,Õ+‰;&Qt\)¾¥·ã $õê;hxÿ%Rf]ʈËÎîy°«µíÝ£ÇÖ1ÂH1aræc·vàÙô~Ó²” géidTl£Íïê“>×1ЇB!„¢ÿCµîïžSM †JôœÇR6ÛöÅD£íèÊŒ%ïÒõ¥T­¶1tÆ)87›P‘VâGlè3A¿•ÖeÂ9øgd*fç®M$q`IíuêaÂC8ZJ&f“ƒfã¶§ÂÌ'™<³w™ssÕxv¼|-þzË[T.XŒÙ™ƒÅA·œÄÈ‹.AíÜÕ=¢« ¬c¤)}ÕâæQÍ8SùT®«C±˜ÆÏ–P|áO(ž¾‚Îw?E·XÇHÊ1!„BÑÿ¡zo𦠔ó 'RI]Fbû/¶šéT·“›Ez|@Óö¹Ìv¬‘@ò ‡c]·‹¨,¹8Ó ÑÒ@<¡HÔþ‹ì½N®´‘:íN†d/¥ò7ñ{×ZG4¡[‘÷ pD×PUݺϬ#ëBŸu-µGJœH{Çžr#5x:tr]ÙXL°÷½Îÿr É¥Ê…B!Žx¨6»’’‘)%Wé ótüËʉ) á%Ï%/¿‰†¥(Úª£ä—åYçKîZÍæ R22Ð̱šAK€#+Œi"ˆ)8ÇOz¬š /€²å“>r.¹/­;ºOÖ«£ec5ùÇ^Á‰~vÕ°¸’|g+Mïoí©¶ŽöÞ°KDÝKÄÓÒ<5LÎB¹8rÇ‘uÌ,Òµ4½ý4!µûFßë`¤Î¡­x½ù‰·ñú¶‚3)*4^·…h”u õ¡B!„HÚÁO§sLeØÜïâNíÓëØBÇç‹ØUQÕ5gXË!oΣ ¶½Î篼BHSö%Œ™{.±n¡¢Òc¸"¦œË;çLlûfΪŸ³~É&ZSo pø(©6 F¬­œÖu/ÑPÝ´'š2HŸðmŠÆNÂa×Hø7ѲòÏÔmo>HCí¤ú;Fæ/îuóÎãÅè1éĽ5øv.¥¹ü?ø½îpch£ï»Î¦ôctÂÅäÀ ©Ç³e;׬"¢\Çh !„Bˆ~ ÕB!„BCdB­B!„ª…B!„P-„B!„„j!„B!$T !„B!$T !„B!¡Z!„Bˆ¯©ƒßQÑ1•asnÁíì^E…ˆ¶®§eí‹4Öv 0cûã¦6³õ…Gñöºç‰¹è‡ŒŸMÝÂ{hö醲½%ï4 ¦žIÖÀ˜5xÇg4¯x††ºÎ=Ò6Qpñ/˜¶÷«ýKn¢¢Êg°+ö!P8ád2rܘˆk[KóŠçh¬÷îÙ–u09Ç]Í áñ™ÄÛÖиüYš¼‡qao SæI”œu=éu÷SþÑÖ^7Z9Šm·ŒdÈew“m?@ÃP±à/øãûG!„Bôª5“›ÓBhõ|ªk#˜œÅ¸'\AÁì|/ßK“7A"“MÛ÷ÅV4¢èqƒ÷è3å“3ý"Ò‚K¨}o 1S!YS.eÐ" ¢-Ð]ŽfÇb†ðúGØ^ÙÑð$ü$ÊI ´ⵯS³¦ Ý6˜¬‰—Pp†•ð‚ßÒV ¥ã>å.J7ÐøÑ|:ü.ÒÇ_MáÙ·¡^y€&OÜxœNJVÙ…Œ ˆ™m×wPÿö}´˜öì0Í1™ça«ý¬ûÎŒúG!„B Õ=t_Á6´m'àÏ&ó³p¥Yiò†ID# ÙÐö Š4E× °DÿúM‰xwX,ÇDƹÓÈH·Ñ÷$T,6XKÁvÿa–£Ýþ<;¶÷¼hþèh²f‘ê´ÐŽAÊòJR ¯ù#»*P@ #Fê¥?"ÿ˜"Z–W¼¥·Ǹ(,¬£ùý'°M¿÷—Ùv&Ò²ÈîD{Ö,œ¡÷زìSb cý#„B!öŽ¿ÆV3cr%kìñØÃkikëŽe1? Ìhh¶¤æäcÖ44³ó¢'3¨¹; h˜9˜i%ìâ,XÍqæL¬6Ëá—Ó«ùæ´±ä•Bó®ÁÓ=‡E3;1k C{ÊŠÖâõ€-¯³áFÅ®¾ƒõ¯=NÃÎ&ê«Ôv ó€ \¢h_ú*¾¨2Ü?B!„bo}ŽT»fü)3zþ×Jë{ ðtOè ÎnL¦œ“ïbÔè8Mÿ1f3Ä<‘}%ýŒS)9q,ÑÏçÓâÙ3'[³¹Hã¤úã5PÍ´¬zšºÊ†Ž¬RO`Ôe7áÒ½Šú7^ÃßU¨¯”Iú®Ex:f×@ìV fëšîb¸mê«×vSÙÓNÃÚ¶ú:ßþÏ¢„B!D’¡:´j>Õu!4{Î’³)œõ æîb{e{w¨6£Ù†SÇÛ`"sø`Z:ÍíDO$[ söl†s9Ž]OQ±r3½ã ò,fëK‹&W)Y“®¥ä´»1…n§fWÀp9] û”ê×~†-½„Ì13èÜ;áõ¨o€¾ƒ†÷_"eÖ¥Œ¸ììît• jÛ“ÿ*¶ÐÜ3ÈÏ‹áyïcÂÚO‡ê!„B±—>§èþ:‚m5ê×мü1v4¥á.›ŠÍDÛÑ•KÞ)¤ëKÙµz”œ‚ÓnBEZ‰'ª5ÌùsqþåØkgó’ºOœ; ÿVZ—ý‰–P:îQŽb°"Ò^…¯æ}jß}ŒÖh ùã†v—£Ð[Þ¢rÁU¬{é66,¼•Ï-"„vî"Ñï»á(·©#OÄ]GÓ.ï7sÈþB!„I…ê}ߦi@¥@Å<è‰TÒF—‘ؾ‚`ë'tª‰äæ;Ѓޤ§æ<ž!³çb­zŒŠW5òbÍÔ?åôÔÔ´oy:z ‰H(•¬éàˆ®¡¡ºµß/+wÔÛn„»ØM¢þcÑ/Ò?B!„ Lÿ0»’’‘)%Wé ótüËÊ»®‘ðŽç’—ßDÃÒF”mÕQòËr‰¬ó%>í8'^F&ŸRSÑ„%sðžŠÅZ û‚(RpŽ;ŸôX5A_eË'}ä\r^Z+vtÇ>å˜2É(›IŠ¿†P(ŒfËÇ5r.9)Z+jºËÑ09 qdäâÈGÖ1³HwÖÒôöÓt†’ŒÔæ R22Ð̱šAK€#+Œi"ˆݶ÷„ïÔ¤» ´vÇþSC õB!„0ªU"@4¨pO»‡±Ó¢Ä:¶Ðºô~vU4u4ÝC8è+h÷tÅ®\A¤ì\bIÜ(Ä”‰s@Ø&QrÞ¤½ŸkyŠõ¯D ;G1YegPjbÄÚÊixï%zæ,ÇêIîØsIqX€ÑÖrþ½`O9XqŒ¿ÑcÒ‰{kðÕ<Ç–òÿà $¦žÉ}#有­çâë] zÕÏY¿d‰£Ùö†aÇK»'pÀ8}÷B!„è-©ëX!„B!ö'“d…B!„P-„B!„„j!„B!$T !„B!¡Z!„B!¡Z!„B ÕB!„B|MüŽŠŽ© ›s ng÷**D´u=-k_¤±¶…ûØ7µ™­/<Š·×}QÌE?düìlêÞC³OO¢:¦Ì“(9ëzÒëî§ü£­¸ƒŸ†9s¹ãf’U4‚Ô”zvþí>šýúþeeÏfø¹—“zϽFHß]A .þÓö~…ÉMTTùº_îÂ5îjŠ'LÃa‡xû*?y†¦Frö¶ kÊUŒ‹Ý ‰À6Ú×=GmE ºJ¢>FÚÞg­Ø‡\@á„“ÉÈqc"N¬m-Í+ž£±Þ+,B!„èïP­™œØœB«çS]Áä,Æ=á fçÿÿöî58ŽêÎûø·»gzf4#F·±-É–lÙ’-|Áæú0Ta N°Y¡ˆ¥€ ©ZBŠ”![XHñ× Éb²!äñ³É²$¶©/c¬[6º¢ëhf$Ïhî3Ýý¼„ïV[µ›ÿçF§ûüÏQ©ê7§NŸÆüÕ ÅMÌ\TŠrüÅNrû/µVÜs©h½–Ú³ÏF 'm¥ãYt'óÏk"Û±•ðûo’NDɦOìG-¿œ¦¯nÀsÒÎ\84Èì}‚®Ž±É0ib&¦Þ¨ájþÍç6’l{žŽaðµ~“º«îÆøõã„mQðPzþÌm 3üî#ŒÆJšn`ÎE÷¡ŒßCwÒf=vÆn§fKqSèÛLχ! }6Ë6P{…“̦Ÿ2–‘X-„Bñ…†ê)Æx?©è8D»H&*)¿ö*|¥NBñ f. ŠŽrB¢u X9 ÃnHsâYr;uuýŒl}ýü¿#pbF n i¥Ÿ‘Íße8š9õíÜK¨_³Ǿ'è)»›¦š<Ý î$5š8ñz­žêe ±úž¡sçòç)¹þ.f.¬#º³[_3 ÌöSèx’ÁŽO1ÔØ+xç=ˆ¿¶µ?9qŸéê±3v[5äº~Ao×ÔE"‘[HÅšzJ¼Æ2yùB!„ø2Bõdb›X©^|®Ìnú¢Ù‰ó Lü( (úLöî²ÀÑHýy'Ë•eøW¬ÆE˜Ê+ž¦ÖëÂJt2º÷útéK Pñ•; D_dÿž\_9Ù¨ý8µ†VŽSÏÏ».®xš(óAj×§h‹6²x¥ÎÐÿ{†Ñ(4ÔÎáô’³36#F:aá¨=¯«ƒñ¬…Z¶Ÿ;Er(r$˜OS±_³ŠVºˆšÖ”øÛÄ⨅B!¾´Pí[ý,笞ú)BdË&b“Û¬|à  ªn¼+î§eaÐo¿Ç°¦A>†YÔn‚i;êÔ81B;nÛC:ëÀ=÷z.܈#}364£$IDATÝ1@Coº9Õ{éúÍr¦Žëdù\÷a¦ ”^òg+`%ÞùýC˜€â®ÆA†D:VUƒætâræH¥rPYC…œ V”è¼LÙU·Ò|ýB÷„Зbî}‚Þ¾„íz쌽¨šK.¤åÆ;ð)€ÑÉàïÞ !™Z!„âË ÕéÐÝŸFqUám¸šºËŒööýtuŒN†j Eo¤ª¾@|H¥|þl‡5ÈÆ0¿ÀJt'dº·1:0ФF_ÀÝð83µàèþ€‚g9õç51¾ý^â§ÙlÅÞâЫo*ª¯‰ŠåߢáÒPÓ÷Ò3pô>æÉß§mŸJ>Q ´è¢UTo—sŒØþwH¨ ¨°t¼M—âoÿ”èxÁ^=6ÆnSsú#ºßx½¬ò³®cÖÚ°ùG F²ò!„Bq¦=RÏHô“Šöü‘÷Ÿ¢7TJ u%º äF1, GÍÅ”Ûص.ÆëR±² _d¨6 X€VrÔ£‡fŒLw9šªà˜µ†€«„òË~ÆŠÛ~É9·½Hó|/”­ç¬[¢ÚwüpMÌÄ!"ï=O8]F e*`eÂp£{\`¦È%XнD‡lØþ¸œ-Ô¯¾µíq:v½ÅðO³ÿµG +0çüV´yÒz¦{‘5[i²£Œ÷l¥ïOÉ5\2WÎWB!„8CŽâš+(Š˜XXù†YBéÂVÌ®GIE4[÷RÌa¤â|‘™šü0É$ëæãÜ30±?ØQ·ÌðÓÂì{–}¯»ŽzpR§dÕF+·Óñï¿gº›‘?gx0~ÜaÛ Zùrª—\FEýJ܃|ö/1’0ÀÑLãPé:I÷™·ißô"‰‚¾T5—R»òJ*fÎ@S c3²ãe†úÛ?üÛV=€VOíu2³ôØ&‰mwÐÞ9nï>Øìkº9B!„öBµ¢zѽÒ»¡»/‹êC`éMÔ® bþꇄâ&f.ªE9þb' 9Œ‚ýwô)î¹T´^KíÙg£…Z˜XŠ›Bßfz> a賩X¶Ú+œd6ý”±ÌTŒÕñ,º“ùç5‘íØJøý7I'¢dÓ“µ½ ¾ùaõHÑŠg)u—} ½ï㉷ÚéK Ruþ_QšÚFß–ƒäÕ:*ιYWxȾöѤͱ۪P\84Èì}‚®Ž±ÉÐnb&’EÜÇf_ÓÍ¡B!„°ª?Ï|ãý¤¢ãí"™¨¤üÚ«ð•: Å3˜¹,(:ÇgjTŠ•Ã0ì®×:ñ,¹ºº~F¶>ƒ~þß8±r]¿ ·kêç?‘È-¤bM=%^c™<  7дÒÏÈæï2ؕ͜•!þ”ìç©ÒOàòËñ¦·pð½È[6û2‡þ×o2 “·ñÔ,ükWá/Ó‰&3ö†n«@qãÐ òáNR£‰3¼66æP!„Bª'h+Õ‹/À•ÙM_t2–å˜øQPô™xÊL²ÑMÃÊÆv¦&Oj×}ìÝe£‘úó¦k¯¢•.¢¦µ%þ6±©½'Jþ«q¦òЧ©õº°Œî}…¾Ý'©GA›q-³,Fßú ã9Ë~_ŸêÉ{y«ÐˆJåÏðÏqšz~œZC+Ç©gÈç gvŸéÚ=‡B!„bÚPí[ý,笞ú)BdË&b“[-¬|à  ªn¼+î§eaÐo¿Ç°¦A>†YT³Ù¸äBZn¼Ÿ þî SÖQG Æ‰ÚÉpÛÒYî¹×ÓpáFé{è莗—«¨\u)Îèk ö××ñÑÛ -&÷É#„cg¸ïø4õ(º3U ô’Ç8[+y€ðΗèïÂ,â>Ó¶)v…B!Äô§¤w>Âþ7îçÀïŸä³Oƨ¸üÇÌmª@ù§iSÔ !„B[¡úX Š¢&–V>†a–Pº°³k©ÈrØZFuЃ‘ŠóåŸ1Ùƒ:9Œü0É$¸ëæãœzzÒQ·ÌøÐ±!_›E`Nsð]’¹3è P¼иf=ÎΧh÷r΀‹­GQÏü>§kSÌ !„Bˆ‰¸4mÖóÍÄí÷£º«ñ5­£®Æ ñ^ÛÄIfœL¡šš`ˆ¡íÃXD»s[«É-Õš·ß¢Íĩ➧"ƒ‘ ‘IfA-ÇßzîDétEâk^O•;F¤½g"òý„÷u<÷&—%èKâZp3Ao„ÐÖCÇlËPJPæƒôîÞ·kØé Þe7RÎGô´‡p”Ï>2™ù™ñTQã?m=¸ñ.ù:eùnRãI,=HYózª=q"í½Ç|y9ý}l´)b…B!Ä4¡Ú2“äRU?`ñ*€ù±ƒD¶?Ì@{h"0Û0v0›x‚/Ó±ƒlëZò‡ãE…J5ðU¬»}êƒ9ËÂ9`tþ„½ÛöcâÂék¦zñZÜ%ic蛘<«™™}ÿÀ!Ç­Ô/þ-+ÌÄ~B[ÿ‘þбGÃ)¾y¸ˆ3Kž¤}©åxgøA_NÃ×–{yø9ön~çÈqxvBõéêQ\8fdÇË õ>r¶â÷䯙³tFw2üŸ/Nœä°mµr ó×~ƒÒô|òú¤c¯•/§zÉeTÔ/ Ä=Ègÿò#‰ÉFŽTœs µ-‹q9ÁL~Ê螟Ó×Þƒa8q5^CÝү௠ R ÝÍÈŽŸ3M›¢úB!„§ ÕŠêE÷:Hïz„î¾,ªw¥7Q»&ˆù«Š›˜¹<¨åø‹(ä0 ¦½*Ô Uçÿ¥©môm9H^­£âœ˜u…‡ìkMš€†«ù;4ŸÛH²íy:†Á×úMꮺã×>.¼«å—ÓôÕ xNÚ¡ŽgÑÌ?¯‰lÇVÂï¿I:%›žª×Céù0·)Ìð»0S(iº9݇2~ÝýIÀÄRÜú6ÓóaCŸMŲ Ô^á$³é§ŒelÆj£—Á7"¬™Dų”ºË¾†Þ÷1Ù©a).dö>AWÇØdh71'¾ñôc·Ñ¦ˆ¾„B!ÄéVª§2ßx?©è8D»H&*)¿ö*|¥NBñ f. ŠŽrBbs X9 Ãf°4‡þ×o2 “®ñÔ,ükWá/Ó‰&3 ÕS½l!Vß3tîÜAÞ‚Ãá<%×ßÅÌ…uDwöòy„w/¡~Íûž §ìnšjŽIŒhÁ 4­ô3²ù» GOòêmÇL³ý:žd°ãSL 5ö Þy⯭FíObbëú½]Sý‰Dn!kê)ñ:ËäíÝÊ Jöóòü.¿oz ßûèÈ«Î7Ý î$5š8õýN;v›mìö%„B!&⯽fªw.‹/À•ÙM4:ó L4}&%UA4EAÑ4¬|£˜ ¨'ƒ¯· ©ÔD8UÍw? wÔõV&L7ºÇfŒ\PÊÑKtȆ)˜ ŽYk¸Jಟ±â²£ï½ž³n9›Þ_=D¸0±ÍÄQrÔ#zfŒLw9š ­…úÕW£¶ÝGÇž~,Þbøãm̹öûÌ9‡ÿðÑ‘°o¥ÉŽv’íd|`íú—ÌeøíE®êê”4_„+·‡ÞøiÚ™˜‰CDÞ{ïì©h™ÃgP§ûÃŒmÌOœ¦¯ý²Z-„Bq¬‚Õvƒ¯¢(€‰e•a˜%”.lÅìz”TDã°u/ÕÁF*^TøR¼иf=ÎΧ8ðî.òǯԦ;ˆ' ¦©Gç,ÀÝL rû:)XVß³ì{ÝuÔƒ“:%«6ÒX¹Žÿ=ã)”a’IÖÍǹg€œ8ªñ–‚¢`‚RR‹Ç] ;:vdŸw¶‡Ø˜Aµ¯‡Ê)Vá'?TÏàøom9ÌÁwIæìLØÑ}XÓŽÝÀ´3?Óö%„B!Ž3æ:Oª5ßLÜ~?ª»_Ó:êj ïµMœJaÆÉª© †Ú>Œe@´;G°µšìžqûg5ã»ìFÊùˆžöŽòÙG–Ðó2ã),£ðÇ^tóÎÑAiëÍø9@ïþ‰8›‹É{_GÖ#N6ž Âý„÷u<÷&—%èKâZp3Ao„ÐÖC+ÐéCÄãf\p AóMâ ½öJêë42{N¬ «åø[/Ãè!ΠèA|Íë©rLj´÷½š«”, Ìéݽ'ÙòâÆ»äë”å»I'±ô eÍë©öĉ´÷Ú»­ù±Ñ—B!„8Z§Ø œwüo,3I.eXõ¯È‘;Hdûà ´‡&³1±mc£±‰§ó2;ȶ®%¸ˆ ¨åxgøA_NÃ×–û»ðsìÝüyË ÛþÍœe·3)c;éÿ·—ˆØzÁÌ”™}ÿÀ!Ç­Ô/þ-+ÌÄ~B[ÿ‘þÐäñzF/ƒo> ^Ǭ5S$ÖöO|¶ç³Éq¹púš©^¼·ÇdÉEÚúã&†Î`߱⛇‹8£±“\«¸pxæPÑzµ%:'mchË«gÔ×é ù/ìK!„â†Ý p ð[™ !„B!ÎȺ©íµ! FæC!„Bˆ¢ŒÁ©'О“ùB!„¢hÏŸácâEY­B!„ž`˜Z©N÷ɼ!„BaÛ}“9í¨?fâh½U2?B!„BœÖÏ€ŸLý ÷ËKdž„B!„8©Woýv’Fo +ÖB!„BœÌÏŽÔ§ Õ0±býp>à•¹B!„áF€osÔ–;¡&öXÿÀZ$\ !„Bˆ¿Ð0ýSà;OÕH)â†×—+˜8:¤ZæX!„Büfâ¨éÝÀàÿÚ¹èÿˆ§ü»=iIEND®B`‚stem-1.7.1/docs/_static/prompt/info.png0000664000175000017500000005567313157571677020615 0ustar atagaratagar00000000000000‰PNG  IHDRøu;“•ÌsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÞ7+¿à± IDATxÚìwX××Ç¿³»,Kï"‚(Š€ŠX°#Š]cÃhb‹±&*Q“ü’¨‰šÄšØ¢b¢Æþj4–Øc¯ bWTšR‘^v÷¼ì‚€”Y$Qãù<Ïy½Ü{î¹gîœ9s玀Òé €æê€a†a†a˜×…{ÎØ `wÉ…ÿ÷°@[¶Ã0 Ã0 üö ¼´¿»ö.@ŸíÄ0 Ã0 Ã0o ¹Ð¬¾Ù]4À÷&ÍÏÁ=Ã0 Ã0 ü™A~sáíÜ3 Ã0 Ã0Ì‹¾6¦‡ÍÒœ]l†a†a†yãé!f½Ã0 Ã0 Ã0o>ý$ЬÕyã{LÇÊÀŽnEÞ`°wó²6³ ^ª=Tï2»¯'!—¤|†˜°mñT¼Áã]•öa†a†a^CšËðFîs¯zÞƒkÆ~L<™ *<.‘S¸è ÛÓú²+Ù‚Ä®/Öþß—hvú[|ò¢”&°«i‰G‰ùoðxW}†nC°úP(ö·D­N!“O(†a†a˜WMM 7Nô½èÛûD϶‘yÉߤ¦äÚ¤19 /Õ†ïK ´¢…!½‘6*KªÀ>z6Mèý9{)Š4$­ò'£ÿ’XXXXXXXXÞl)å \Aþ kQPc2W”ñ‡UU¦¢ð™K)•6š“:|@¨Çz¿üKl©óÂCý”r´ÅÒî ù}œI¿ ŒQ+Z›L¥rãÓº¤WØ7GêöÍt=…ˆHMÉ;é뮎$×å&Âû+:ø ˆˆ²£OÒ†5ûén‘êÉZÒ³:ÉthKbéO~ÞI§ïÄSZ^ÆOéä”ú$k€¤ÕûÓÆ;©”¯-–{†ÖŒiD¦’‚2 òþö:Å_ÞL_ö@+ã8Àgaaaaaaayí|™›}íKs£}iîý4rv5r¯'%É?PFwQPã1DO×S€i‘ã23rrs'÷4ûv¬Ì…&^%¢{‹iX÷NÔ©çpúîÈ3" §)õäš2‚Ù¹Ö§FÁé =¡ÁÈÝÝÜÝݨ–eA XCDhó§ÁÔ¥ë»ô¿mQDCË,HÙÓ Ý”C7hfê¿"†ˆ®Ów=ÛÓð Dñ˨¹¡ø¶äîÓèÝY5‰ÞíёڵiOz  nu ÅÛ (jS—=©ƒSjÚª½CDèçæEžd‚¦]_ú1–|–×?ƒ/•’M+ê¼´>M+У}iÆêÔÛˆ ¥UXFW… ühqQòoíȤ´ßeN4.¼‚¿Èo2çñND?t$iÑìºßzDh‰ŸÁ‹YéÝšæñ<ó¯ß€fÜ&¢3’£T‡_}œúZ‚L:í¤,õI ¶ȤÃ6ÊPŸ¦ÁÕÑmiüLú¿@“òÛ-Ï>¥‰ywÚ›Kt½èÓ‹Â±àŸ…………………åuI©KóU*$H¾±71Ó-+¦&àþ3À°%æØ£†A–ÑC¯!è[=»V_@z¼… L¾Y€YuSHÅêàÚîˆÇ‘[p07ûÅîíàZ™íiÔjH€ÔJ¨!Tþ™¶ÊAV­=¦®;…È'YP©sðôÖjÊ}#9$üÒ Ã0 Ã0Ìk¬¼åŽ&hØßMƒ­àd¦9F±¹ÈVU}qÁgX_Ø'íÄšK¥y¾¥N‘í3ˬ¡T‚DYþyí%Ë ÂKŒ© Rª þ§Û*Ï>zu0~÷AÌ©}3?îŽ?¯§@°ïˆv~;>W†a†aÞÜ_êh…^‹k ic½Â 8ñpN‡&áÒÉ䪫®ŒN7°޶HÜаŒ²Ø\¤ç0©)ðTUõF˺{7Ðí;º@ÿì5Mf]¿6‚ì€Gq·{O¦êS¹¶›ÿd[åÙÇ .:zI9w foˆÐ´uÏ QÙàŸa†aæMðUYjX4Оd"ü·Dœú=щô”Ñßèe-¡áeï¹®NÅõÓ1@È|=& ;Ìá¬8•ën"§ŠŒ¦ŠÙŒÏW|Ã_ïÆ:åXwM 1½n,VtØŠØ*¼©¨ò¶Ê³ON$þ¾t>.ÿ„¿£2!±öƒc‰e@‚Âu]m¡oP¶ú€ÜÚž Ó‘–‰Û±™PóyÅ0 Ã0 óJyqq¾ ! w}R”÷²hU•-¦Ô~] QÜjjX~Y©Mšu8šr‰ˆTO(lig²–”þ’-LhK:ѽo<Ÿ¿ÄZÁK¶Ðn]Ù}ÖºõL³dêÍ?iV÷š:m“Yô%Û¢ÇÛo¢4õYb'Ý–è—l˳@ —>4wïuJ,ØGTMOcÂhý{N…Ûv4^@1¥l#úlc;2æ[XXXXXXXX^©(¶*û5Æ,£ ÕZ?¸N¼ð_`e†a†a˜ÿ.oÌÆ(æÍG¢‹Y 6¯‹ààža†a†aÞè_°@‹‘a½ ë¯çð¨1 Ã0 Ã0LY¡3Þ”%: Ã0 Ã0 ÃT»ˆa†a†a8Àg†a†a†ü7Ñ@¦1qÛ)¬êm)›ƒaæ @†êÞE»êzl †a8Àu°XŠ»yY›Ù¯‰q#|ºÿvÈÀè,~YaæM@ß ÃØ€#W·áÃzl†aÞJ^ƒ ù¥Tcø RQÆŽ®Ï?BU)ÈÐm(mŒ%J\åOF•­G0§vËbˆrOÓ”††$”ü€€ICú`å)ŠÍ!"RRâå­ôY[’¾P—„Lê÷¤OWî£ð˜tR圧±N2ÝêÑo@³"_ü°ÔÉ`k’Øô¤ wÓI¥=žN» £Ff’"zÈÈù£ËTªCÝɬˆýµzÐô-(.›ˆ(’ï¥ãš’…èS­>³hÛÅ8Ê&"¢\z¶…>o§›Îâôy¹2ޒؾC[cr‹üñ3zxn}ä@zEÇÔ°./8HwÓ5Ų¢OÑ/£|ÈT¢Û˜Vì‡bl(%˦£iÙá;”¢$"ʧ¤ˆ4£“}áÇÄøè¾Wè‡býGä9(­AÃOh<öêd×bºˆÕKòŸ¼™®$«‰HMÉW·Ð”–V¥œƒŒ½Bèp:ÝAúÅ+ßçÅÖS‘oˆ;w* £V´6™J'q%µ0kq>&ÎÎÙ°âóTôÜ"ÒǤ¶é§»D³‚:YKøÃ7,,,o›¼&ŠHMɵIcr2*]‡žMzÎ^ŠÒ^8’^"À×÷œA·(—Ž©U<¨[ê½5•(û,ÍÔ–š¶z‡þ·;HyŽBêÊ‹Ü$’ǘÿ£ØìGô÷ªiôaߎÔÒ·>UÓt«Ç°-}LtçûÎÔ¨aCjذ!5lèIµÌ¤š ™Ãtˆ®MïL-ZÑÀet*•ˆn/¤v’Ú%šè_P‡F<œMHRðE\×1t ƒˆîï Yô¦ ®}éƒ/–ѺoüÉD[ã€iå¬1Ô¿KGê:p ­½®$ÊÜE½­Ñ:‹ÓçåÊÔ¯aD’"ö¹úy[òönB­ºŽ¤…§2ˆÔhB=íX™RÛ•‰²ÎмAm¨±o{ºè"åR2­ïdñü¯¢1å‡"l(¯G“Ï&Ñ­í³èƒ^¨Ë€Oè×[j¢ÜÃô¾ƒT´ÿˆê»(?ç?bÏA=×OèJÞ#úëHѽ™Ô H ,JgÈÈùã”CétbÞ0êÑcÍ;‘N”s„F:Ë^hOQ<xšKÉ¥æû¼¸z*ö ã.f,$&TÛ·ùûûJëÞ³é|Qüo=©šT¤}Äø˜H;‹™7*:OÅÎ-ºÌóò:cèH6Ñ£åmÉLà > Ë[àxEhÒ˜ÙÑ'iÚýt7ƒHõä-éYýyvGîHݾùƒ®§&³±“¾îêHò¢Ù8KšðóN:}'žÒò r6Oéä”ú$/r1/äXïR3øÒêýiãTÊ×ËŽ=CkÆ4*’]U÷·×)þòfú²ÿZ÷2¾ù¯L z¼ŒüKùü¯m0SÝü¼^að/Xt¥miD±?ú’6ÃdÒâGŠL=ES¼_x ¾Li{F>ëcYª¾6|žé×›Dç”Dwg5$ýbØ£ÔÓ¬¬›,{ôW6QÒ:êf#>ãeÚåOÊ¡ûô­—þóãè,JŸ**Sª}̤Hʤÿ 4Ñ”3hB‹âˆV´ Û”æ´"èá\RˆÓÊúai6dòb™K£–«(‰RiC[cÑþ#¦ïâüPÌXˆí»>5˜yò"¦’§×—tKK‹šè6^ šE”µwUÓλ`ÚŸMôpŽ·v¼´Ç­:Ò²ûétéëê¾.¥x`®ƒÏ—[(ߨxÜEÏ ÅÎ[;ê·=•(ægjk.èdŸŠ|LT=¢l(ÆÄœºž_rª7õ2Qþqá(å > Ë[#¥®Á׳óC+çÌêÚCö9áÝaŽØ6(#ÿª‰ñ+¾BC‚Æî¯âÚœèÚm0~¸íƒižÆâ Úºdv7¶'¬ÏÁè¾Ð¾m‚zÆ÷D!€*a+úÖ÷€GÃŽøöNÙëˆT)—°î«!èܲšµîŽ)­0léŸø®©¡¶D.á {;Y/³`^Q=;Ù"iÏz\Îxñg‰Â¦ íqTëœÒ"pø.àд>L[t™1.‚†ìŽC)‘ukÆúÂL¢C=[Øä"ÃÀöæòBÛ–Gîu˜{$u‚ûÂU_\·%60:P»?}Ij!…‰KŒû¤5ä‘;±;2·ð—Êèü¯ È`ìÐÁÞ…ó“]X{9Ss&¦Ýç ¼ÄÜ¢ëù•‡»ëæã¸à¼QÃ0où|Ó Ý”£>N}-A&vR–ú$[ dÒae¨OÓàjIkަsDtkš‡6C¬Yw=ã6ù¥ÚG¤îÓèNÑÌ[Y"s¢qáegð_óî´7—èú§u_\BcàK?ƾDß¼VáP¸ô ˜(|hî"º6—:9*H€”Lœéû;DtñCª!Á8€¶¤=Ý?“Þ ô#ïF­hà÷§(‹ÒhGßjšzÅÔÜõc:BJÍÓ‹üèc´xP=2ÊÎx j4?Š(c;š”·ö …h—=(Í£(Ê¢M*¾3´L'´úPÎYšÞÔ´XÖ²"Åèóre4þ‹ÒžÑC í[£˜ï¸}H[c‰èi8í\»•.§gÒ…oÛ’UÁS"1cªƒVdÃbKCꎤ?ŸÝ_܆Ìñ~(ªï¢üPÌXˆë»¢Ñ|ŠÊ½HceèQ½Ïo:n1ùˆ/¯¦Ñæ[ò]ED ´Òߎ·g=øŽ¼kÛOOýF]m$Që_‹gÞÅù|Åõèâ去È9áù¼Y‹ÆžU…O¦ºzEm,Æ>û˜˜zÄÚ°¢óTçóBì:• Çä¶#q¬ÀçTÏpïYñW?k‹÷÷§ÃÀÊ zMÁÜ­a0ÔÁ¿ÇB )Œj¸ÂÅ8û–®Å)½pTÂ÷Ý‘èòËi¬{'nLuxrT‘ ÆÐÄg"¶Y¯CÃà?åo¤’x?Õwê7å>Cý}awu.öÄ*þØ„»³?À÷©8)G”ÎÏÉÂÅ©^pZ$A|T>Ú„IªWë…ó›âø˜úØ_VfY„Ï‹©Gß(wÜu @ßãCLnš‹½ý~ýR‡¡lûˆò11õè0oˆ9OÅ:ÿQ)€™ƒxÓL†a8ƒ_Áï°•ÒòŽS°@Æí7Qšú, ±“IÀJ§xZÖ̰ÈßR³¥‰žm¤öÆ:fð¥Ï3ø%Ó«CÏ«ˆ’÷Ó7ƒÈÏÛ‡švþ”NæÝûÆóù„ªÊà›ÒöL¢ŸÕ{ñé@1Ñ#s‡ÚTÇÙž¬=>¥"º8Ιd ÖèÝžæþüÁŠúŸ ¢+ÈE&®žRÛ5jA+ˆžmjOÆeeðkês ¯È Œ¯•Ø¥Ó$¦ß%íÕ–Ö$¥n('CVBçW½{zÿ¤šèòÇTK‚I;Zû„èæ—ÏŸHI,hi,QæÎîd!è:¦:úa©6”y‹t6›èAh?ª)×ÝEõ]”긆º¬¾ë{Ò7÷JßæÞ7 H_¤ÎR§±FD§ÉŽKìièY"º4Š¥Ù ¬)áóâêÑÙ7*&¦qóFåÖà—;·ˆ=¿¤Ž4ê"QîžÎdÊY=–·y ~QÒõƒ©¼56%ÏÏdÝ=‚¨†ö]P¸Ä[¿6‚ì€Gq7[×ÛŒ\¤ç0©“’ % ꢣ—‘K§`ö†Ã89çNœCTö?tË“}‡o®A¾°*×BùH‹Dd‚9ú/ü ži;ðݶh(PÆ]œ‹êtjŽjýQÔB3' 3ò6’•âê)=1/©pM»¼ö@Ln¯‡û[¶ãn®ØŒòߨpžPÿãOÐÆR‡ç"¤‚š‰¬œ®"tþw‘@& u—YºÃË*®>*|"¥N ÃëJ:9ÁLªë˜êêÿ/ÚPVc ~Ý;Õ7õÿÈ­ˆÎÓÝÅô½òõèŽÜ¹;úÕŠÁÒž>ðððЊ/mIAí¾]á¬'NgUÂYŽ|¶†uÁ;-6­0À ˆ:tI*BÊžÁ¨_؆<<š`èî vz5Æ–G*>/®žJûF™çŽˆ±P¸¡_ÏêÈ:ò+ΕȂWlq>&¦žJÏU5·TøÐÈM˜K1ÈÃ0ÌÛ¬²¨ŠÙŒÏW|Ã_ïÆ:åXwM 1½n,VtØŠX•ŽªSqýt 2_IÂŽs8+Nc庛ÈɉÄß·€ÎçcÂåŸðwT&$Ö~p,ñVž °C]W[èÔ…­> ·v…gÃt¤¥Dâvl&D¿þ¥ŒÃ¾Ð øé§Oð®Ë,xáٷÞhèZ n~1pÌXt¬Gag‚¶•œkøeÉ%„Ìýk¿LÁW{Rà:ìgLpŒÂ’à“x&¶ÃwÒè˜~ áŸBmVíFLÇHÛD¬]ŽL<ÿZ™y=_ø5Ï…½WWŒûæ4{ø:Ì¿ŠÑý~ˆ_ÇÏÂÈs_᯳˜5çwœŽÉ‡yí¦hípӧĉ=ºL ×è0ÜzœÁ¼6ZŸ6ñXóK2Eê\õ˜¢–gC4L/ÚŸTÜ¿‚û@“šõP¯^5X×Bów§á‡fJœúh?©eÂ)ì¿'Çg‹ÆåBŽ&8¶Ÿ„…e¸3û8+(ÅŒ©?”‰±¡ü¾ø=„ÝùK$¬ÝºàTɈƭû©PŠòŸŠûꩈòûž‹êýà–y½ŒéÏϧÄmáPöï‡ó —𔫳*K¿=†–¯Æ–Ù†˜ ðŸ¼AÂ1ŒZvMãóiQ¸u£¨vF°~šä$âÞí‡HU€ŸSß5îâÇBf×5ˆ—‘Vr rDØGŒ‰©G̼¡®ø<Í5·è>Ïû B«Çضç>ø üU”»D§èñ¢Kt Ý&³û¬=të™æiuêÍ?iV÷šÅ¶É½D ©Mšu8šr‰ˆTO(lig²Ö¾à¨péCs÷^§Äí£qu6= £õï9>¶6h¼€bÊýŠx,:ÒÚ$¢Ì³^Éß ÈoI åÒ“»ghû±Ԯ†~)/ÛQà´t-Y­ÙÚ3ê-èçRdI‘ˆz¤Õ(hÎ>ºö8«`ƒPz¶ƒf÷©CÚá$6=é÷{¤Ö–ÈŠ»L»Ž _ I%‘KÈÌg8->p‹’µ/ºå%\¦³º“ƒ ymºüÝH(øQÅ\ÜF3{»B¯sÕ/Ñ)…Ü=ÔÙTóá¤íTE~È¢ÇÑÏ£üŠ}ÈHQ»ÍÛ›ž|_)ù&í›×—\ôuS~(Ɔzu蓈2–…œFöqþ#®ïbüYœÿ”Ûw‰=½w\Etv8U—”Ü ]'xßžd"Ç R+j9e E<Õn¾±•¦¶*ëCW(ýåX1>/¶žŠ|C̸‹[2n³ŽžR"­laXÆÒ” ì#ÊÇÄÚ¹"V|žŠ³Žó¼¬þ;—(âsª/çGö,,,ü¡+Hɶû¯ô˜Ôtý‡öÏwRaaaaayýE0¤SNS.EÑ’V¦¢¿MÀÂÂÂÂþ[pðüh?¥’’ÎO®WìÉ Ëk*3òýä/J¥:õ©ñWlYXXx›Læùâ¥,\[Ò^wÀõJ$òØ" Ã0¯?¸6¶À‘I-0tÑd›„a˜· ¡ Ï0 Ã0 Ã0Ì›„MÀ0 Ã0 Ã0à3 Ã0 Ã0 óßð¥0pj÷€¡ðªk^ÆGÄ”a†a†aæÕø‚1-FÐà ð©cVzð.¦ Ã0 Ã0 Ã0¯A€Ï”uçC·¡ØKH\å£b¿IaÙt4–¾ƒ%(I;1£“}±O †u¼à YѧðË(˜ê4zú¨Õg¶]ŒC6ˆrñ8l >og©N:‹õ,KøOÞŒ+Éj©‘|u ¦´´‚nœ×EgÞÆ^!8œN »3࡯ãH™4Ä+O!6‡@¤Dâå­ø¬m%ì#ºïU`g†a†aðÿ=ôlšàý9{póf(‚ðâ y _4íR·`jß t þ {õz`ú®õx×A ¦hóãߨ8Ú;G·…o“ŒÝ¡÷—ÂÒ@ ž‚¨ ”#eÿ, éÚ ÝÞý鿃oÿ\Ö‚xE!ƒóÛqx^¤­ž=G`ͳΘ{h+†;ë²3«8 PÔ‡ÿ;ö¼+u&آךãøå=)6Žh‡f­ûãÇ˜ÖøîП˜PW®ƒ}Äõ½jìÌ0 Ã0 S:¥l/!CïôÞ¢S414œBBÃéãë©K) ¿è*Ü©?Í8B“BÃ)dùAµZSvh'’ˆ.#!}çÞÔzÔJ²ð”¦\h8…„ž¥QS‡’UÁ§âõjP>?ÒûK.QHh8MZ²zõiOfzÏõŒ<É{Øj±¬ Ž34jæ<ò¶“ëTA¿>ùM9L“Ö¥þ==I®ó‡RäýíuŠ¿¼™¾ì?€VÆ%­ò'£å™¼Ø'ßZ®¢$J¥ m5Ç šÐ¢8¢„-Ȱ œasZ‘@ôp®)^â#¦]þ¤ºOßzéë¤s…¢ð¡yQDY{P5­¿Hì‚i6ÑÃ9ÞU¬³¶~«Ž´ì~:]ú:€º¯K!º;ƒ<ôKü½ÔŽz…Þ§|åCúíûbvlƒé˜ŠèæçõH¯à˜EWÚ–Fû£/ˆµ¨¾W‘YXXXXXXXJ‘22øjägå9ñxòà*â¥@fá·?#¨‘¥&ÛhÔí'w' Ù1HIWÀ¨dmbÊ@C÷÷àÛ¬ ¬Ì ‹d2õa$OA® €ÄuG®Gnm`-CâƒHdÕ†K·пŸô@0‡Ë°åhߺ̤‘x?‰ 90t¨ ‰J¥Í†‹(S‡µëˆ†î–sÔhÓ–zºÞ7åàòž°÷€Y»#‘UÆ×H™U[˜8Ö„ ¢—«9”—€ëÑÛÀ~hb¡1žAívhný ŽG#·R÷tR˜¸tÀ¸OZC¹»#suÒ¹ÂÚ«5G@M ü÷Ó0w©ég1Õæ6]œšÂFZ•:9 xõô ÿ=gžÅ3uUè×Bç.µ “:!(¨Š®à‘(,`*Ò§Ž¥Eàð]À¡i}˜ âì#®ïUcg†a†a˜Ò(s½DþÙX÷©‰¾)  Xt^‹þìàÐØ²‹O!­7õŒdîÃŽO¿Àƒ,3Ôûü(ººÔ @Qa™<œ5ßnGj>Rc)‘E€¬æûhÓÄ È>Š¿¾›‡èL‚´ú`ôýdL[ÃnûĨl`WS³Š9aÛxl>xJ¹$ùÚM*¢Œåã=»Üþõ%ˆ;´Éù•y6B:}ELQwV- Ä£%m±êž¶AU4Ö ÀC+pì~[üñÇ=5~dï IDAT8÷é‚Ü9]1zo²Î_)“Ø Æß±ëÐR ÷f´™³•×¹4ô¬jÁ é8û8¦\`f¬€‹i6.Åeœa©ĨªJgj¾·?ûíÃ`¯ÍˆUÀ¥¬Š².`úÀ‰Hí$àÀÂóÈ*ò“*ñ,=¦Lž„ÀÃÓp &ÆŽõàd ÍzªŠí#ºïU`g†a†a|9Ì›~‚ wû£ºi‰ÆPz0vrÔ¼4w 3 J,bÊ”¼«HCŽR[B•Ì4À°ŽLÀ :}Ó®øß8ÀD!žEãΩÛðëUÕnÇøŽ—qçÌnDÛƒ˜ä‚¨]D™òî!lQW„ý+à ÀÄg"¶Y¯CÃà?åo¤J £®p1ŽÃ¾¥kqJ¯•†ð}w$ºürëäéÔ’:iÞoÔ Î.>èþñ,Ì8yBÓÖ˜–ùô+ §zÁi‘ñQùhR¹ZÊÓYR­ÎoŠãcêc’º‚š”ˆ?²Ÿ)姜˘Õ2ܶÍÃþè)©q…½qHW½š¾3 Ã0 ÃTI€/±êΣúÃ^x†¨}Ëpãá3(¼CЮ¹ÍóB¨T’²ÞSFDð+HµëzR÷àȆÃÈ(Ç©RŸ©‹¤]C±&²'¼Zv‚k#¸uó†[·Á¸ôýü};]d™ Ì[LÃþÃÓQmSøÚŠè¢1»IkÌß4†ó=Ñ{Öuäb~øn%~ºzËnŸ½wã©.©`U\=‡WÏáèá[0¿?i‚ùƒŽ!£Šz”ŸüÉ0A {#H” ˆŽ ±‡ƒƒ!ò)º> )Sç¿aÐ~Þ±46?†rsÑ?šŽkAUÛ+£ÅDç„´ ? ‡Ób˜;Ô„µ^RÞÇÑkß#wïud¾ª¾3 Ã0 Ãè]–vм®fÍqæ œÿc3nž?€{wŸ cñð>”àÔu¬K»OSFTt‡¬‡×‘ æÞ°R^ǃ°£¸v÷®]Aüíd( ˜Ô°CîÍÍ8¾|8V ®3©jÁ+Ðrˆ,S€Ü&îÁøe{Ð+È zÿÐ6'²ñëÞ騾©üG–îÈ,Ýáe•‡W®·W§„áÀu% œ`&-~¿V­ÝÇø~ÎD؉°7© &@"«Ì¢ø²ÛR%œÅáhÀg`kXk=LbÓ ¼€¨C礪* ){£¾‡< ¥ †îÎb—¡Wã`ly¤Ò±­|¤ÆE"2Áý~Ï´øn[´ÆÅx«N}g†a†ùâËRƒ”¤KHÊï#£nèýbâžAR­vÑ( 97WãrbøÚ6F‡9ÐøQô cqäG®ÂɈŽl௠Á#5jS˜ZšáÉú®øýð#¨åõÑ|Êxšd"ýq 2ó0u2¤Ç&i^œS¦À0ö]ÐÈ«:ä\:ö€Õ‘[ˆ×m5 …êºÚBß .lõ¹µ+<¦#-%·c3¡†ü¾ø=„ÝùK$¬Ýº ˆÏˆÆ­û©P&œÂþ{r|¶øgLP.Äáh‚cûIXØQ†;³ãqÑÈÓ° ¾Þ´£láçáüáéçëÌeöè2u4\£ÃpëqóÚh=|FØÄcÍ/a…êŠuÑVN–~{ -_-³ 1ÿà?y ‚„cµìrPu:SZnÝ(Z¡¬Ÿæ9‰¸wû!RÅÚ kx¢¡k-¸ùuÄÀ1cѱFt… jñc*²ï¢íÌ0 Ã0 S JÙ^GJ†î#©Ç7G ·É =Oãl§>½ê“¬` óÔtìFõ‹¶ÌêS4ú»ÕÔÎÛŠÑeddÑåÿ4¿ý¯#)ÊÚŽRÏ\z|KÁóNn¥ùñ‚ Ôª†f»C=gòxw1 ^pF«o8}¼põìÛÌå‚¶eŠl“ÙôÓ£ú7 èÕ Ûd‚ / z‘gÛ‘1@ЫCŸDPéœFöÚmµûѼý·é™ö'UòMÚ7¯/¹”¶ äÚÒ·„¼6 ]~„n$äjkÉ ˜‹Ûhfo—b6¯Pg1m©µœ²…"žjþþiÄVšÚʪ”r/¯sq1¢Ö¿–³Mf™:ß’"Ê¥'wÏÐö…c©] }ÝÇTdßEÛ™…………………EGÞ̃a†a†aþ+ð—l†a†a†|†a†a†a8Àg†a†a†|†a†a†a8Àg†a†að«ÁVîÐ0è]¸XÊ^}o#X¸wBàA¨mU•úHaàÔ îCáU×ûÃ0 Ã0 óŸ ðånh:þ{t0 ÎæÒR›7lñ+BBËÈ/¨mPZeú°î² cCÏaèV0¬Œæòºðû=: ŽZæUà Æp´Aƒ'À§Žøoré¸CØÑÍâ÷³-†a†a8À¯$UJ"oœCtäãò7äÌ`׸1ÃÒ§%ÌdoÓ(YÂòf\IVƒHä«[0¥¥žß2IaÙt4–¾ƒ%(I;1£“=*o&Æ^!8œN »3à¡ÿ´¥ß³" DÅåd°õóVL™ ÑUç²úþâMg½ïÁ5c?~9™úÜ+¯Êô«´¶DöKŒ>Ú~º ÅÆXBâ*éì Ã0 ü¼â0™{kþ¸Hí†ã½ï>‚e™EŸàÎÚi0oç†ìK¡HÈ{{†Èùƒí8<Ïæ@Ï@«)‹1÷ÐV¤ºuÄ/•€¼†/š‰vq+0µï <Ò÷Ä€¯çaú.ÜwéˆßâT:·ª¨?ÿwì;x—ü¡*Û’ÁÒ¸;§ ‚ƒ FzÔÓçÁ²˜2¡£Îeöý…˜Û ×FÚ¾ñ8JâÇ«2ý*­-Qý§žM œü5fN팚žTÆ7†a†ymxñ·2gò³>Xr†&…†SHh8}4w5¶ó }A[Æ 5õYN!¡»É¿†œª>ì(…„†ÓøÑMH èûR—¥š¿;ÿ }N!«ÒÀ¡=ÈR.kSj7œ†††SHè/TÛ ¨>2lñ+…hõ)µŒö³¼Fžä=l5XVPî š9¼íäš2ú>Ôé'Ío—¥Ðpš´d u j@ ¡H]z5¨NŸéý%—´e¶Q¯>íÉL¯ Œ@r§þ4ãˆÆ>ËÒ¨Õšz‡vq"IQ½ôë“ß”Ã4iÍQêßӓ䂎ŸVøÐ¼(¢¬½¨šDsLbLû³‰Îñ&EAßer’ù;£–«(‰RiC[ãâõIí¨Wè}ÊW>¤ßÞ±/ö7"±êHËî§Ó¥¯¨ûº¢»3ÈC¿ˆ«ª-“@Úž‘OÇúX–Ý1eÄ|²Y¤Îõ½¨(|æÒCJ¥f:—®ý*µ-1ý¥‚¼¿½Nñ—7Ó—ýÐÊ8¢¤UþdT ß`aaaaaayõRú©ì<Üaj¬€*é.?…žM#4xÿWôt‚´w éâ¡”XþÍ×èì¹ îþCÔ2Á.Ö£}ëF0“>Fâý$&äÀС&$ª³Ê¤"59‚±+êX„Öõ´ $Ö¨;r=ztkkiD"Û¨6\ºý€þý¼ FÍÑ~òçpw²€ƒ”tŒÊXì$³ëˆ†î–sÔhÓ–zºÙMZ­9j῟†Ù¸£HM?‹©6ç°é àÐ6ÚÁ eTEzgâX&ˆBx\n‰Lp-tîR 2©‚‚já…Õ2¯Þ€>á¢ç̳x¦.eDª¨-ÁÀö¹È0°‡½¹¼Ô¥)bʈò"1:‹è{†Ç{á”ú'V{¦óxéÖ¯ÒÛÓ/qúäàòž°÷€Y»#‘UÖI¦“}†a†yUT°?7V¼õÿëŒß¶Ý EõnCQMç5·OpevW„~Ñ«—G>ãƒP]!.ÀϽµÌ«¶ái™‘° ìjj‚ô„mã±iÖûXÿY;ü8z8®ì˜Òk§vÇž»¥«¥|¼a—!?7íFr¾n–Ó³ª+¤#öq.Lk¹À̸\L³—X9—zà¨;«–âÑ’±ê^‰³.`úÀ‰˜;wN;¬âj¾·?ûíðћ«qãVé¶=3+dÅå¡íÚkxô4yÑǰxP= º•Ñùf³Tuì»AC P)»Wã|šîã¥S¿ÊhKL¿DûQKžt÷ †a†a^ "×àç"åü.<é;Ö&õak"Å£LÝÒjdÝ>„'h {}'X›Èð0»Š"e4 ¿^õPmàvŒïxwÎìFı=ˆI.K©4$?LêÛAai $PÔñƒ ´C§oÚ•´`¢#ÛÉQó#îg ”åÝCØ¢®{éfáâT/8-’ >*mBJ+#ÀÄg"¶Y¯CÃà?åo¤¾ ˜ñGáÓ#¥ÜíUë…ó›âø˜úØŸTQzöåÚ€¼»‹Ñ¡æbR;5CðW«°rýq˜$ºaøAÍZt1eÄS¶Îºõ0ô‚¾Õ“±kõ¤Wb¼téWÅm‰ 1þSN&@Gû0 Ã0 óÚø©ó¡¹¬K š`]Mš*dº¼ª+‘i¨¡.ƈ ÔÏ Axñ&$i×P¬‰ì ¯–àÚÈnݼáÖm0.}?ß.=4Rççkë¤Ú‡©{pdÃadeT)ˆÏ$( ”•êAòïW˜ŸüÉ0A {#H” ˆŽ ±‡ƒƒ!ò)…Is Ì[LÃþÃÓQmSøÚŠh^D`Õ~Þ±46?†rsÑߦãZFFÕöÇÊhU´U2¢NaÕ„hÒý‚Gøà£ƒG¡s™r¯ué;ÁgX_Ø'íÄšK•/±ý*»-1ã®»>/ë Ã0 üj*Ü&SHK`ìÖV‰'é*@•ŽŒ,°…}M±ûrËaáÛ 6~ Ïž”Ÿ¡ÝIÄ Vfšu‚ž~±šrS¡‰]¬_,#(`Rù77ãøòáX=6»Î¤¨¯@OÈEšY¯#̽a¥¼ŽaGq/ì(î]»‚øÛÈPæ#ãá}®N½QǺ‚»¹+M܃ñËö Wôt¼!P%œÅáhÀg`kXkGKbÓ ¼€¨Cç¤5¡¬Æ@üºw:ªoêÿ‘åÜ2Tk÷1¾Ÿ3v²b·O){£¾‡< ¥ †îÎb—¡Wã`ly¤ª¢¶Êr6IÅ~$¦Li𔫳ø¾ŒaXo[$îEXFåÆKt¿ÊiKÌXTZ¼„}†a†y¥TuY¢ÁgÂ1I;[H¤ŸÜˆøB$n_MEsTöFv}©µyõX£ÁøMpRÛÂÂÊ€ñ{×"¾Èû”vQO[ëZh9{$Fúç°cêˆÑ–£ôkxØÙ9Ãÿ›=pO‘ÀDq;¦þ1¨æSÖÀÓ$éc™§€©“FŸôØ$ˆ ?ò#WádDG6p€×„¿à‘ƒ µ)L-Íðd}Wü~ørn®ÆåÄ6ðµmŒs ñ£4è;”a`û.häUr.{ÀêÈ-Äë’íΉÀÒoá£å«±e¶!æŸü'/Ap £–]CÀ~_ü€ÂnŒü%Öî a­ýsuF4nÝOEáB(Ã&øzÓ"Œ²†[œ‡ó‡§ ׯ«Ò¢pëFÑÆ`ý4ÈIĽÛ‘ª¬º¶cøNúÓ/!üáS¨Íê Ýˆéi›ˆµ«Ã‘)ºŒDè,ªïL|G —M<¶„–¢ƒ¨ñ߯rÛÓ/Qú‚Âu]m¡oP¶ú€ÜÚž Ó‘–‰Û±™"}ƒa†a˜7 À²“ò`hg©: ŽýˆýÛ®"(1Æã¨ôK4ósƒ±­@YÈ|t o%iÓ¨’ñ8âª{Ô†‰…3,ä']ÂÍ} qâØÃâAwþœ_öÌGŒ†ku+˜Ùd"íf<Ô… x”‘¸¸ì{˜0nŽ6°°IEò•PJ@ùqgOÀÖ· líÝ`@™z‘§Váq¢|¨â±¤?2;ƒ_«Ö°·v„9åÓx’§Í²æFàäwãûîGðöqƒ…ƒ ÎBVâ-D=Ê(¶ÜH·zÁßM‚¸ãûD.‰(fSÂúæh:þG,ÿÜFl †y=ÐwÅ{³—`z§j²5ÞâùÙ MÆÌÇOSíÁðÜÂü§|‰ªwœ‰óObRh8BBÏcìÜP´÷¶q‹_^D~Am6hI#´ìÑMmJ9%–hþáŒêä½GX,Åݼ,„ÍlƒÊèü6×›Û+QãÎhQ¸cøÿÆ£¯‡ñ[ùïúÆKŸË+øùãºÔ,óKèR‡pT ÇzÃüíš1ÿsþ#~L+Ñ÷·jna^ã_#ßYè;°ì­Œ ‰±¡4´‡B™ü”0DÞ8‡èÈÇÿÍ·t¥50ü„ D„«“]+€+<&aËË0¸–üµn#§pÑ3@]O{è¿ö:ËàüÑåçmQê³"¶ûúnØ|è–ø½$ Éâ8PâJ´(HÔAÿùûq+E㇔ëa€“Æ%6=±án:TZ›dƆc÷‚ahd&©Ô¸ÿ+h7g‰sx8j~fÏí6>ƒúÜ0Øÿ‡¯z‚UwlŠÊ}îÇùɸ}dÆ4µx…û×Ç7DSÁyñožËª„ínà¯Æ]ðýÝWí`–èµ7ôøg4-mÊ=¦ãåá@+²éh,;|)JQ>’"vbF'ûÂ/_¾qs‹è¾W嘾çóVQΗlõaÞ dò/}„ПO"§X$¿Ü¤vÃñÞwÁò?f=—˜Ð4Žê¡ãè÷á¶ä+Dä¾é½R!ö×®p‹pEÞ0¤¾1z‡aRËa8’^¤'iþŸ>5 Ðø›ƒØü °õïbüñ¨lÜѪ• âži¾@+ÈmP·Ž1nÎ肜|{bü´5¸Ôµ!Ú7ûGŸª_Ûq×o?s‚vaПO ÆÛ g çšrÜžÝïíL…±ƒ7Þùß,=îu½¬(òeaž*^ü«(Ÿ"òÚS@ö ­2_±iè.l :·FK=œ»—_ˆZûu‚+Â1ÿ|*H^ÃÍD»¸˜Ú÷é{bÀ×ó0}— î»tÄoqª7onÛ÷*Ó7õzʼMPq‘a‹_)$4¼tùérÐ^^j7œ†††SHè/TÛ ”º¼gÐ{‹NÑDíß¼`=u ò!…¤H9Eª?`1½¿è¼¦5giÌ÷k©s€3Iµe#Oò¶šF,+Ðå š9¼íäÅÛÔ¯O~SÓ¤5G©OO’ %u#úÔ`æ=Ê‹˜Jž^_Ò-u,-jbP¤†4û>ѳíȸà˜YO:JD!µI µ¢µÉT*Û: @¹ÐÄ«D¤~BO²µ¿E¤y½k’¼¨>rGêöÍt=…ˆHMÉ;é뮎ÅÊH,ýiÂÏ;éôxJË+hé)œRŸäI>  E•8Ö›ÌKö[„λAtLI³Ð— ÿÖŒ:ïÈ$ŠY@•±wY"#ç.ÑQêiVv9iõþ´ñN*åkuÍŽ=CkÆ4"Ó">&1kLãBÏPt¦¶*“â/¯ N–‚è¾WU¿ ›¯ zDKüŠø ¨Éâ8¢Ä•Ô™3}t™H}¬/Y–Õo혞 ¶&A{L¿Þ$:§$º;«!é‹wþSU}—Ø ¡³ªlºúw å=X@ÍŒ@€1µÛøŒÔ熑½DܘxE¤k~‹>IÖì§»Dª'hIÏê$+hSfKm>YGçâr‰ˆ(?ñ2mù¬-ÙHŸë${аå')6—ˆ(]¹JiEÏåªì;^$Úc²ZÓe"º0²†f®3·Hl©óÂCý”r´öI»w€æ÷q&ý‚¿QF”oˆi ÈkP×;èê•öüJ£˜ˆôCMa_«DDœbÏå ç‚ù9í2…Ek&èÜØS´rD2.y]‘9Ѹð²Ï/1~X"s™@—IEÇß³nwÁ’zîÉ&Šø„êèi}^&/¼¶ £–«(‰RiC[ã7vnÛw1׋ЯTlßÿ­¹……¥ÔkNiñ¾*% ‘7. ±àî5ý&bnœCôsxxõ&rTbïÔÈÏÊrâñäÁUÄ?JÌÂn~FP#KÍã2YMøLÜ€ÎA­`m˜€G×Î!1KÕ¼PÛÕFóèZ0‡Ë°åhߺ̤‘x?‰ 90t¨ ‰ª¸22»Žhèn A0G6]`Y™µ5Šú<Ø+¶âÖÍX}Ý}ßk Ûú¬‹ø¬™;Ü„d$cÓÀÆððð€‡‡}|Å1»0ãýnê>‹4ÁäíÛ0º¶VqÁ‹Nc÷W qmÎ@tí6?ÜöÁ´?Ocq€Eá#G™]Æí ëãs0ºo'´o€ Þ£ñýQÈ JØŠ¾õ=àѰ#¾½SyÕIcýE FçNp.xòmà†®M ñìøŸ¸ó ¾É¤J¹„u_ Aç–ÍЬuwL9h…aKÿÄwM Öº¢Ùܽøi€ Çt‚ÓfhÕy¾X¾w2H÷ñúW2ƒ)¸v%‚ï‡x·±¨GË{gæÉGà¾pÕ9î"ü§jÉAÄcƒáX,Q»Ôåo©žZ9Ç`V×–²Ï ïsĶAùWMŒ_ñšLÐâû8ö­"æôG›í0hIÚ~÷¶¬¥y|)­†Þ¡'°f¤5Ž|Œn½Fà‡SÿÚ’uÖSdè‰cHŒQ/ žyë0¦G‚zÀÏÑMñɶø¸ž\tQ¾!¦-Áí~<…?§û"rÑt ìˆnÃC‘눎î¦Uû2¡˜óBä¹\ñ¼Q`ƒ,œýq$zv ÆG­ñÁªãXÓ«šxã‡Uež˜}ØxC‚&Á~0/0ŽI#·TàΖ½ˆÖ&¶I™‡çWN LkÂQË}cç±}=îå]sÄôýÏ- ƒ²£Cr}’BBÃiÌ0ï2ï6ËÏàˆ@}322«F5‚÷QHh8åKzÉjA£CÃ)dõZò²‘`@Õ‡¥Ðp?º‰¦]™+ùÏÕdîut!™6{"ÈHZ2“"¯C&ì¡–ï£wºÔ'½JdðæSTîEë,#@ê}~ƒÔq‹ÉÏ@‡ ¾V ü–У²µ%2DEîþeµ&Ð":§ÍòIkަsDtkšÇóŒ™~šq›ˆÎ|HŽÚ Ü}Ý¡Lú¿@“ 2`dš*Ò2r}Žˆ"h²«ž¦m·ÿÑMÊ¡½½­ ³=U›Á/É ©£Wöß™w§½¹D×?­« sê¾7—(v9u±“•Ûfù}¯Ê ~dð’˜ûQÈŽ¤¢ º±k! ¬MFBù|@AæGel§@ñã.Úª$ƒÿ”Öµ1'çQ'(+ñW 47y!ƒ_јší¦õqêk 2é´“²Ô')ØZ “Û(C}šWHZcRæÐ¡÷ª?ÏV ÖÔï`Ñ• TK’¹|LáDtu²ëóó¶Œs¹j3øRØzÓà_"‰”ç)¤®\üÜRÚ¼á<žÂ‰è⇎š¾Š)#Æ7DÔ#uü€N«‰"g{“â¶¡˜ó¢ÒçrÉy£”¾C¯}zˆ.Ž#g™Èl¯?¬:ûÈ©þ—·ˆR7RSmvÞ%%Ð=ú¦~é×»º#éϧD÷·!sáÍ[*Ó÷Ò¯⯕å•ù7ç‘üªDó¦Ÿ#xQ&.?†Q?îGÿNvš œ¡$PT¯¯Ù‚ìÑ!D%—±†R;§nƒT¸ãç…¢KŸwPÃD UÉEuy÷¶¨+–ŒîŒÿÛ{ù:¿¬@ý}awu öÄ*äãÁ›p×¾¸+þùÄí“[x X8Z@Àе=Ü# 0·’‰}‡â÷vpý×·-P"v×RWybHOgèA [ÿ¨§Ævõ(ìyü·/À„îî0{¥å¤`ëPøúújÅC¶¼°f#IDAT¤ÏǂÞu`áÖ?ß«ƒ‰{îáÑÉÙho]‘â^”x¸~ ~É€o‡Ô~a—’ŠÇ´¨¡Ô ©•PC© À n Hõð[”/¶ª“°¥ƒ`[¶z€Kk¸"'NÄ"ÿ_êy“ÕqP‘ Ù áX×/³»ôÀâ;/—ËT&߯ƒ,À¬zÙs1e*Ó–kx ‰8´çþx•?/^ÂÇ ÈÆ±cº­à"òr Æ«Ž¯jǽÊɼˆ¾9÷)“ÐĸÈq‘cú¼o*¨”ª^Ö $aý€çK4 ĽÕ7¸š€´7’Ï*7¦µGO_ô[ù d\H‚²È@UnnQC©‰PÎß•QFgß(^ •C ò”ÿæ~j:ž%ÑÕÇŠZH"ÑÉ Q~X•anäv¬¿m….ï6„¡ÂzVGä†M¸[üÒoÞb:ž^€º;ûÃoÐZDV´‰Ä0·TØ÷J{%®§¯`na˜ª ðó3´'+X™iR‚ž>$ 1¯ S@æ œÿc3nž?€{wŸ»PäÆ]Õì†R½Ö³†Las³N ˜Ô°CîÍÍ8¾|8V ®3©jÁ+гxöOîŠF÷`ü²=èä†ÿoïÌÃk¼¶þ;'ÉÉ™"†.b(EÅÔšgª¥hK•æÞš‰Ò^\\´ÔÔŠÛjS-ªÊ§†#Ô*1FHR$†™d89Yß9‘D‘¢¦ý{žýxœ³³Þ½öô®½Ï^k[slé*t¡gÅXu«[`"®Ï;«©Ô£,€ì›Ä&‚må¸q€R2SÉÄ7û‡;iy;2˜pFÈÞ.Þ«^²®stí\Fv¯‹W­1œi0–þ• Ôöz¬/¯‹Al<žu*bsŸ~­«Ô‡ZZðçêµDf¯Ýÿ~²‰ùyË5o3¶¥Cþ ²8m ¤õÄAלUñ…M®ÛçvpJÜhÚЂ˜3ᄇç§3Q×H¸ÄiÓÆÅÇr1ûج*Ó±'rz'QóæèI×6NØÜõV5¥–°•ËšegpëÖF zÓÃ+‚ÀŸÎQp:0/Û‡e›'QfÕ›4ñÿ… Ügbn)J÷â´ûÚÔÝŸÄÜ¢Pä‘_!’|‚‹ àîZ‘¦Ÿn¡Ö °µ aÝØñ\Š?J¼¾'¶¶é>Å‹ØËIh=*~ÅÇ®äЩ7hS³ɿ߿ÁödÊYàÛ•d˜ÐK¶eýËRNN›ÌìYzJŸ˜ÊªÈ‚½Ç–†ãçÐU³ÿo¢q­Q×<5Rcˆø3?œä³7·¡{qÚýAmjŠîÅš[ŠÇ´Ã#8Ù‚V,}Þ•.Ÿî3†¯Ü'Œ&^Ö3±©á/]§ß “xX†Ì]+o¾^=?”ÎK*´ vƒfK§÷ÇJÛɹá2 ¬›û\‹ âûö|ywîÁ;á:‡±Jºõh-Ž:Í_Âd¾òñ. ü]z½^«xa2µ¥¥ïƒÈ¡Ræ.g?‹*cä´do?c.·t±M¢Rò¼#3$!jŸ|ÕÙ£°:©Øû+ÙÙdN]Ž,l'.Úû8qÙ·’Õ)"QSjæ;Õ꼥˴ß$")WÄ­3›dZ—¡4‹ãÈdæÖZ¦íŒ‘LC‚„.ê ®ZË\ Ý]»þ"I"rkUû;ÎY…“…TsÊX?‡ä=Oíc “iåó¦ÌÜ|Z®çÅñËI—›±¡²¼oùÜ>fæ.m§m”×2îø²fÄÓ_—ò–uÔ*Z÷GÓˤ0™ºŠòÖŒµrþ–dŸtûÒYýŸöâe ÷¦uë&+£R%'ïûËÇd㥾“¶Øínzÿy4Ýólíò?s{CÖ§ŠH'Û¢Ú´ “mAùv-WIrNr™¹I³‘ßÉž?“‚²%ñÜfù¤¶UÇ|/iÿŸ5v-/p^–܈Þ+ :¹ß5–K@÷»Âdbá#ÃÄpdä0~EÎ-¦Ì¦Î-Eõ åhÉÈ¡rÝ` xò´¤ŠÈñ>ùó|IÌ &Œ SÇr‘ó†Ö]:Îß+Ñ7òb;ê%.tµŒoçuÏ÷¡y™®òåþ«¹åÊŽ—£‹ÚçÏ«¦ôÙ3óÉ9’Vù€ÿ]NÕ•eôÉû8ùÇà³8·˜¤»)ínj›šò>5ynQI¥Ç’žp4Vbcg™ï©oî# ¦æñýÚ{—l e•J4骓Óúó2ëåûG©Ð–j(ãf‰\]$lž#ïôçT/¥»Ò½$’y¥QrBôôæ_#k©:T}Lé®’J/€¯qì"½¿ “¡³VËÛ–KÿùÆþo¾–Z.fªž¶ Ø¡Š4|¥¾4ê0D–Eê%~ÕëâqŸËZ¬+¿)ã¾Ý/ †+²¢G™çfÇâyÕKé®t¸d'uýÇÈ ^¥eóæÒºû ™·?U$eƒ¼åi¦êPõ1¥»J*=‰–'}>Hc¦'þìy}*á骅œdnžÙAèšùœºa@ñtaSg ¿ìñ§\N¡Ë‡ÒjÈz®Ý¯™ìªPÃrcw㇞›Ö|^õRº+Ýsg|_íË”žµpÕ9IDï]Á ³&ΠêPõ1¥»Bñ$ìkxL¡Ë …B¡P( Åߎº5Y¡P( …B¡P¾B¡P( …B¡P¾B¡P( …B¡xÖ |K\;.ep`ýßkvÿá4X:ùà^Úá ^w­Å¦ñ2à ¤o¨dýz=רÑhæI22ÏðeÓÇ×n[švíÆ+nfjÄ* …B¡PØûØ$½žs4ÖxÕª‚¥®5½m›oå;ŠÕëónEÝ£›jýùé’p}ilaØØWïÆÇ_o!,6CÆa—/Ð,k1-Z)œöõvͯ£"óXRñÍi¬ùã2é"ˆdr5t5ÿnáF¡eŽ)ÏR( …BñBñøÍRIàÜ÷qlQô£\˺¯íõ dFÌc}˜y ïôa8?ª^Ï3ϺžÕiP]ËÙ£qä<ÅEµpk@ŸþËÔ±($<ôÁß—³mn#¢W,añ¨/¿KdÁp€f¶8Û@äçé½ò2Ùärñfþ¢±È<²ÍíHÜ:÷&F“Vª='Lç³MVD”ïÆº1ýY …B¡P(”Ÿk•¥r×hüZ3\í´Hj4çw/b׆`’ôZlêN¡ßðNؤneÃøñD%ƒuÿÒdg¬o®á— Ó¹ñR ú×Η٢*·ûž÷›Æ…óXÔ_ÂÐÀ¼ÿ…²iè@Î¥™¢IêøJƒ>ØÛY¡ôñ¡Dl™ËžÝ§É̳v,+QýÑ4j懓5èãpzãlöí;G–IÑ_ËüW½òÐa_³7;÷ rUo,5€>k‡ç±)piÆóÁ„ØdïgÃÈaD¥ Z÷~ôý|.ÊÖÂoÍfËê4¾&Õµ\^?Œ_7œ2±¼JîÜ„aSÇЫM#jVðÀÞàûÇ6¦å¬3d˜»óêˆ9Ì x‹†etdÇgÝÜ‘ ™µ›x£ «q{›}×Wи€ìœ]qn½‘¤;íQ´°Ä»ý(>àOׯ>”Ò@NÊ‚?.Ÿ'ößÇìá=ã*khÈm†ÿ2mmJ÷"Å$Í­ðõ=3Ûba¯Þ”ûbÝκÇÞï36L÷`ž_UfK½·mf‡}6WŽ„z"ñÞ¢ŠÌ“MìÏ#ùçÏyÿßÎÞ¤Wéý[MxéX—iú³ …B¡P¼PÜûˆŽÖ•ªþËéÚùU\Í.sý|4é¶•ðé<‡·zÖÁ‚nûœM;.]{: ì„C©Æ¼:°3Ö\!lÉÕ}ñõõÅ·N{fFÝm›"Çœ²ïüÄñ-Óé ß´=èÔ®ožÁò ØÜòÜþƒOÕàå>«¸Á Võy9÷™¾¾Ô~€4“5ÏàØøš”~©Ó6Fsûa·¶µîtœü!>'ÞÛx™,É&åâ¾\ŸRF’ÆÚÒÖ™¤Z—¦´£îž?N™’§@çÆÞ§5CF7Gý+£3RŽB¡P(Š…¿^o[>@üÃ$`Ñ\ñõ.-öΞâXó#ù 0LMoKc^]5i4%TCå_3J@`˜ èU[tšÂòÌ<HÿÀ0 üF*YßëJ]¸÷Ú"a2lÈ+¢{˜ky-ëJ»…a¸SZW²°×N?K@`˜ÌŸ$e,‹ª“eP`˜|(/yèÌÅ¡ùÿdD`˜,œ&ÞVÅ)sylšHçÅaxTÞ}£¾Øh |§ÑÿuŠC÷K@`˜üóm_1ÇJʼ,aò~—Š…¯êÖU–z#~“aK¶È«‹…¦øu¤«1QÎIšü_û{ëSv ìÏΠ¾® ׸JÏY"ÇGHEó{È5÷‘‘'D A]¤TqäØ6•o®‹dï*•tE\aÞp\‘+² ¡õ£_ßl]_¾¼$¿´‰ØÞ«¬ÄÑÉIœœœÄÉÑA¬Í |o×JV§ˆÜÜ:Uú¶i(/Õk&}fì—Û’,ëzxˆ6¯ž« — ˜DIÍÑÇì–ùïüCl ´™)yÑz¾+{y$ãLzÅA4_ŽJ*©¤’J*©ôâ$í½6õm*7ÄÀºí¦lÆÎŒ~k/ì­Œ–Á‘¯fqÅ ÁÖÍ â—±ùדÅ>:òxÈ$ñð†Ü³ÖöÕq··Ä®J¬.¬#òzMÊñ\°õ¥ŒSɹ÷š»7¢´`8Ä¡mp»àu1V$se÷>²»—ÛálíEùjNÀU¢Ž_.|UwV¡ó:±àÃüßæ3èC[WmC-3KZýp™ì<‡ÍœxV·¶÷ª¸[”œ ¯&4qƒ£K×rþ©ñ_°¥É’ ÜLL$11‘Ä›ò•_¾+®ÖÎ o;ˆZû?Vî8̱нü4ÑŸ‘ötÔgãöyVä|Z—sÆÎÜû M´Ýƒ¡Ë÷ðUk§;;ì¦äȉß@¿zhÙ}_¨Ìä}»˜T/¿L¦ÊQ( …Bñâp3ø4fFþÖo¯ØIjAãÔH\ZÎŀγ¥òζ¸Ô¥¬«Ž¸Ë™wýD/@ó7Z’£7>Yk|®øÑâÁ2Å~~°^Ú\Kä²2£Ö™Ú_çöÔª•@iwàÖn"ãþ~«W£Ñ¢!žå½Ú3ýTFa]³np!£åHäž&WÐtŽOïB«­sÏ®å¤{2ß±B²3ÉœK;`¹ 0ý5"®™kÌ !» <©÷³tÄ@tÙOïu¶#˜TŠ‘ÇÌù!œ?®8þ¹‹‘£0ûÝÅ“£P( …â…á;øn_8M:€ãK¸dŸæ|è.¢Bwuê8qgO’j4b´.h7¨+¶9g ?r ´µi>x –w™·rÏTãŠK©Üm`…%ZM¾©lÈÔ`áì…¥±TZK[ÌbAklk±«Ö€ôhR2I<‘«W¹.ø¸˜:뿉@Ú)®$êóˬO5F$q¹O™¬WvüáÜÈ:æ~øµ©‹Õý’f'lïUÀÚýã¤ÞDÂÝö½® õFþÆÐÅ¿ñzûjX<†…Òís;8%n4mhAÌ™pÂÃóÓ™¨k¤KÉÉÑ_=DHÔÐòEü2 ™©db‹›ýãú”CRÄ~‚ƒ‚ "(x?g“òq’IH,Tnç‡GÞ¢Öª"ÊCZôYnd߯Cj‹ÞM7%ÈК›=š…B¡P(Ï5÷´˜ôÑKÙw²-mjyQgÄ6|oÅ’šã€ƒs)–wbåÎ+䘕¥æð±4peÅvì±âVéÕ4.ëOûöÛY±>Š<{GRNq!<=+ÐdÊoÔHÔbou˜ucÇ›  '5ú,Yx£óùæô'Yo½C4[>Ddjqvy©õÉ&¼ã Ø{ºc¤ìû‰¸Œ\½D´§Uµ´™¹ƒWµ8¸8Ù\Y¿”+~xä\Lw׊4ýt µn€­eëÆŽ7–¹½Ò²ïÿ¨л.îݾcp§D’’‹RXgoaíÄYänÒg‘°ëG®u‹‡­%p•ˆýùuw§¡Jw¤^2蟶]q Ž ¤7ù —VóñüOø}t0»§²`Ã1âô¶”©ZŽÄµ Y£/99©‡˜:n=¿^Âáµùü»œŽËÀ¼”å-ö³tey{ÿ™—B8•þ ¯6™÷§m'ÎÜ‹ª‡øzY8é¦.ú¬<©ZÅK몸[‚ε 5k§œÍÙKi¦…øÌ8Å7 Ž0óK¾ŸÈ~K¤Êû_1Âû" zï3F²£þ¨ñ´M9JØ…›ä”ªL‹“ðw¿Î÷߆ƒMÈc^šŽc?¤JL(WSÑ8V¢ù€É t‹ã»oBM—£P( …â…ãÞûʆ˜\ð¿®Û•„4̽qt.EÎÍp²´h0ÃÞo<¯UÓÁ•¥ìü=CV$G¿_N2àÒu5 Þ:šÍ‹g›æn8¹™‘ôçy² l‡g†ÏfÛŽPRô`æè“«-W/!æÅßLÏÂÆÓ³œx®ç—5'ÐçZžŸ×—mÁ”刃‹Ù7Â8¹¬ë‚.>ó®?ÇáÅsˆ¼’ZJ¹Yqûr9·ð¨W7¶âûy_~6† ­3¥<+àèb>-³Õ““°™ƒGæXìJN^þ«åž·“·€d.ïÙB¢þ1ôIbÏèF4õ3·_Ç÷ë¶°uÓÏÌÔ†êŽEÄ’âÊÑs~iwêtÈËNLZ¶ŽÍÛ¶°!p2ï4öÁ¾@Ï”›>`GËá» [Ù¼zï6ð.ÖíÁV¾c :qœã!+èã Ý9tü8‡f5ÄÆd)Yœý¢3í&á1|-ûìfIçëÌ{«%0†1³ÅÕó%Þžú›w±uÍ—ôó á³MdŒMoJ­ îåšñ¯9«ÙÄ–5séëq€io4aÈÎbÈQ( …Bñ¡çݬK»9ßák›È‰iŠÎx†Ê^ÆWÒ¨L.îÌúÃ7žF±¬É”Ó' 8Vœ¸ô …B¡P(ŠÇD–9TVuñw£ÅÖo>½ºº#vUp²ùs1{BŸvãÞ‚ò½¦1Ü'’Ó Øù cx¥LL<ÍmÕ¨ …B¡P(Ošsà 2🌡l[Æ;Ï*˜“AÒÉ ZºœÄì§½Ü:\*þƒ¶#†àa ©žÕ“÷W_Å U¡P( …âIsPt6¨ºP( …B¡P(žyºæyŒî^Sõ¡P( …B¡P<³ìZäøuÉ=ªc©êE¡P( …B¡xæÈü€°¼@ƒa@Oã …B¡P( …âÙ2î{múBqð7­þݪŽ …B¡P(Šg‚ÝF~cÞ÷»Eª‹qà‡Š°£P( …B¡PFÄc¿Q/IEND®B`‚stem-1.7.1/docs/_static/prompt/events_command.png0000664000175000017500000003313213157571677022646 0ustar atagaratagar00000000000000‰PNG  IHDRÕ–àt€sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÞ ±aì IDATxÚíÝy|TÕáÿÿ×;™I2ÙÉ$!¦,²Z«¢­¸Ôº¶Õ¶j[»[ûõÓºT¥ÕÖ~Ú"ö×ÏGÛÚÅ~ÀVmµ‹U+P!¸ @²M–™Ìdö{~$ÈbÄ„bÅú~>çñ ÷ž{æÌ™áñxÏ}œ{ŽÅá.NŽJù`h^žþìx»ŠÖaÂômÀK~Ü>P¸(Tø)àѸ‰ˆˆˆˆ$\üüÀƒö!•¾üd€ã"""""Ò—“ÏÀšBõgûµˆˆˆˆˆÞéô͹~öOÿ¼†¦|ˆˆˆˆˆ V˜ ìØw§ú^`ºÆEDDDDdÐl xÌEß]êc•Œ*>þÿSәƒ‰´ðúÓK¹¤"­¿‚›Ê/mî;wH ,?, ÷ügq8oŒÁ$ŸæÜÜA´cð±¿E1Í?åÄŒƒ»è9þ6¶›8O_8 kýq ÿëŒ!úì§åÞ×J§-ିš®Áöy0ãóÎ\Å‹ùCClû©õëWpóÂRÒúÇxÌW«1áÇøHöÁ׿,|‚ˆÙÄ+Ýúï%"""$WãÜô­C}¬'jfÞñ ßøÖå|qu©¢ã8ùä"šÉCê¾Â׿_ͪžýGuô<÷¦LËÁÆEáù¿åÙ;-n=ãJow `WÏ Ú1Q6üá8ëÃÌ/Mc}mb_$¥pΙŒc?|©óæÌšÃô§ŸwÁùþÂ'¸â/~œCÞMÏ ú<”ñy{VZ•e^ýÖi|òÉ0Ù¥'°ø[?æÎ¿¥gü<–Ö¦ˆtEÀí%íuc,·7º#)ýבš‹Ýômìr0O:'}Ù/¶³î‰ÝÑ.=ZuÃ]¼Tbž¿˜ÏÝõ¼Às¨r]¯maK`€S=õ¼¾¥/—L {^ß–gHí´>ÿ0Õüˆ æòãÚæ¾ lå1û¢éðÚͬjIîwlÇàDyum˜ —}‹¥Ï}uáƒë8ƒéóÆçw½Fõf?fó^Ú3Šó·|SF§³´¶‡H ÇŽûÐPæÅvz ÆŒþ[‰ˆˆÈÍ).úvJ<8ÃŽÆÉcÁ'ò­7¦pÍwK8n‚ÝrAIvòZuÖ¬k¹|JÖÛîXóï’lx’åo¸˜}éòöu&{—ÎOgûïÿÆžÄPZ‹òêO¾Ìï2¿ÀÒÏŒ%íˆ:ô.Œå&«t6—~år*ýOð«Í}i?ê ×¤á±ÁΛÀÌUäº,Ü^7N¨PRÿ«DDDäçxl=žÜÑÂ/®ØÍs r{÷‰r®zf:·þu g.ò‘i½:ƒäù¯œÍ ÏŒcé–^âÇ|á#cñ ˜OåOÝÎ=^ÍEG26‡i'QÏË·‘~Ò¥ÌèŸ[ì›òqäÔñðŸvbœÎç¸ýÖ L¹ùVNÍ;’H<”ñyg'-oÇqô4¾Ä¯>có›ÏßÈ“íN¨n'dܤ§eqâÝÏóòÆUÜrB&iénœ` AÍþ‘žâo§R´¯içÉ/låΉ¯ò¿ßleg2§pú÷GP–që ’Óý?ZTEþÄ‹øim_ýk-{×~—…‡&óM|ãÔYÌšÕ_¦šgG26‡k'NÝ£±-÷#\1= ÈàøKÏ¡xç Ù;‚þ$©èFˆ^Â÷>5öˆÖ5üø¼³-7Ê 'Ìdî鋹~Ù^.þÃ+,¿¼ 7ìi¥'å&=o&WŸãéØ,þÔTr¼i8ÁfºS-"""f|ÞYÏî×ÙRíÇð ëþ±ŽÐŒ&~ýÍÅ”ÿþ^öt7pÒvâgXù-ÞœÉòß}šY­n’»éR¨‘ Cµ]>ŒÝ[Ɖ3÷Íðuh{¶lgãÚ(1çèÕ9RñÝ+ùóvX8m4™ÖzzÿÝÏÇÅëxä×[¹ã+ŸäCõpQi ÷/ßNìˆL²çá›yèögùæ7Ökÿb÷ŽÚø¸pÛ˜ŽT¨…Žxó¯;“ð#gP½1?¦þÆus{ 5µÕsŠ"""¢PÝ'Õë?% üa6ý¦þ_'{ÚÌ»Rgp½,ãâ~‡é;žæÕ»évræWùÎtØò­j‚5™ÃèÉS™zàòxÉnvÖì!4¤ÿNíÄ©ûÃÏyuÉwøá= Fl¹“;âCjç-w{^ä‡?~kï™ö.ŽÏ;Ë5 JÈ(ÍÜËoå¿?”äŸ_ú;{S@¼Úp%×ϫ㻟ÛN,jñ»G#Üpãhj—´“Ðÿ)ù€2o)–Ëäç5éöçŽvÁÏhóñ»5ëwu›¤éÓÛ¸Áüþ–…¦4m_=·©üÒf3 Ø_ÍY9¶é2%ŸxѳÎ|j¸ë×B;îJsýcŒqÌ ×”{ˆí¸†ʬKu™ßž’õæu®¢Åæñ1fýÕf„k}Ôø¼sq/6îMÐÑ^ÓüêSæ§×Í1ùûúbW˜ë7cê–˜)Þ¾cé'Ümvc^¸²ÄXü‹ŸµŠŠŠŠŠŠŠÊû°Xýÿ‘#äÒˆˆˆˆˆ(T‹ˆˆˆˆ(T‹ˆˆˆˆ(T‹ˆˆˆˆ(T‹ˆˆˆˆˆBµˆˆˆˆˆBµˆˆˆˆÈû“ûí²¶»ø4JgŸEþˆá¸­ɮʹ­{æÆîý [Ûå”^t#r¾:´êóÔÔõo!he‘5åj*N˜C†’/ÑòÏim mlw ù3?EéÄ©¤{ ØBûË¿aïÎ÷8*.»¼º[yõ…}ǼS¨Xüÿ(Œ¬à¿ü…HR¸ˆˆˆˆü»Bµ«„¹‘^EãÊm$\e̺Œ‘gf[q7áþý¾-/n7D«ïagmWHvpBá}©Ï„¯0áÄÑ„·<@m dMý$eg™Ô¾O{Ojp½´²É;ù6ÆŽé¤íŸ÷Pp‘Yu å§ß†'õMvîîyë5öpŠOÿEi/³ë‰'¨EDDDäߪfZþü%ZdPÞBOïHrÏ›CnއŽp´?ì¦ãö¤H´×ÑÛ Ø–S<}¦á>ê^ZGÂ@w[‚ŒË®gĤ2:^Ú3˜LóaJ«² ­½•†?µ6°1jö‡ÙÛðW¢]KÞIÿŨ‘Í4?ñ¿t„Sú¤EDDDä]óösªß Ô¶¯?½½‰"y.ivÇÎ#ÍóÖ|neT‘“½µ;°û6Ó¯ºáµtu€§t,nk0]´pÍ ƒ:»ö÷Éé$°£ògâóЕMΜÿ¢jBŠö§ÀÞ¶ˆ>eyW¹•¼sO¥rþdâ¯/¡=°ÿ®¯åÉ 'É>õn¦Y`B[ißðKk›q+½7QB‘va1vZÞ´8½á8ávAüo"Û¸³sÁi%;°rŠd°Ãp¼é6ôgý´q_¢*ÍMÏšÙ³'0´yÛ"""""G?T[ØÃ2öÜ+ÈhºŸšõ5kMà)¶/ páʪ¢`Æg©<í\‘©o P3Nø¥ÿbËk.¡$ÙSÞ½7ätVÎ=‘ìÙŸ °õ>Ú»âú”EDDDä]å:l .YÄø ®À[¿Œ­«V{Û»ÊNh;þ =’Cþ„ \€‰¶“$O†œ^â¡ÆJÇãó@¬ä`&T“"ÙW>^¯}Àq;§‹ ±èþŽ¥ü£ö‘ЙNÅù_¦(Ï£OYDDDDÞ›Pmùæ1zábÒê–R³f=ñA=Qxps&RK0™U÷ÏŸNŸ@þ0ˆ7Õ‘ÔÜ C²}#Ê)(ÍçÍÙÓ®òÆ•C×+„cæ ú&²…†¿ÜC{ü*Îþ¹ZŽ[DDDDÞ=o3ýËoúåäñ õ5­¸óFí¯˜ðíéÅŽoÊä$vÑÛÆxJÈ™°˜¢Œ þmý«z¤hß¼•’ù×0v–‡ÖVÈšú)rÙÊî­ƒZùÀ×ÐTwU'}•r~Og·‹Ìq—R^¦ó™ÕD~D·Ðð÷åd.¾Œ1'¿ÆkϼHB¬EDDDäߪ]yø†ç‚g•çÏ8ø\ûýT?¾š^ÜL=“ÒL ᯦yåršßœO"V³”miWS1ý:ªN€T×K4þí—ø{†°Ì Ò½úvvF®¢ôCߤ8 œàë´=·”¦úàÛ^æt=Å®õs8~î')YÍ®¦^}â""""rÔY 2DDDDDþšl,""""¢P-""""¢P-""""¢P-""""¢P-""""" Õ""""" ÕCä9þ6¶›<÷€]A–o óÏ¿€‹l}ÛDDDDª%^&\ò Æ…þÎk»é…¶Óÿ¿üg\9Ú£o›ˆˆˆˆBõ±”©'rÙ•c >ùs^èÖÞ5""""r,†jO:'ýx4 ?žE^úÛ\y´êôã®àòÑþöÀ‹txÂ]Ì)7ü–õM1Œ1$Ú6óû›N¥oæ…EÑE'fZ¹^æ )wÖa¢O²¸ÐD;€«˜³~¼’W÷t5c ÁÚ§ùá…•x÷5ë;™_uzבŒà‹ë{1ýuCœAö¾¦rgrýƒ/²'ÜwΤ´lþ_Î,°ôíy1‡÷ÄRsÓžYæ{f™ìœb®ùn‰9n‚m\ïB¡—t3óG Æt=dNÏ9ตmæýp›1±-æç_¾À|xî©æã·üÕ´™˜Yý¹ÑÆ ÆUr™y6aLÃg™Œ}×yŽ3·n7&öô%¦Ø5¸vp1_ÝbŒ©½×\}Þ™æÌ >mîZ0Æl27Nðô÷'à 7É̸t¹ñ¿Y~é sÜqÇ™ãŽ;ÎŒ™Ù?™fÞÿ¶Ó»Ö|ÿ“5óæœhæô"ó™Ï}ÌŒöü+c¤¢¢¢¢¢¢¢¢òo.´mStr‘9ëÿ›dnÝŠ÷Ì2ßùësæ"ŸÉ´b¡v8c޹·É˜Žßœf²8n—}Æü35+?1ÒØoíBsñ3qcª¿bF»1¸†›ËWÆÙ}™‘ÞWÇ;åSkÂæ‰k°íì ÕÿXdòöý€¨ü¢ÙdŒyùÚòý×ɘ³Ìì5{Ͳ9¼ŸÚ÷û¡cÕRëz†Ë?s·nOã ŸEÓoïå…ÀÚpu<‡¤–ËÒ‘­ÿËEUdæyWò‰+?ÉwžøwmøçŸý-Vú‡<@""""ò0TÛåÃøØ½eœ83íÍÀØöl;/<ØÎƵQbÎÑ«3$Y3¸zQ1m|WÎÔôn†×ÌÅÌŸ“Æž?¼Bèm1µüè绹âºøxu&—Vsë}›èb;ƒeb!bø(Ê>Ìï—xýý1ßš|k^½‡e×ü’©wm#¡ï¨ˆˆˆÈû3T§zò§¤?̦ߴñÏÿëdO›yWê Eö¬Ïð±¢~ÿà&‡ö¹ñ÷ü¿{oâùVñ‚;YöÄfZ>FŽEç£÷ñøž}ñ4Ê–ŸÝÃú¯ßÇ/ÿÂý8Õ%Ž Á‰5®çµÈM|ì{ßáê%OÓâ.e|Î:îÿõDÈaþ?bQ×*Vn¬ÃË üÃs)%ÅŽ–0޾Ÿ""""ïob¹Lþq^“~¸¹½G«Î KŽYðÛNcš–™3ߦŽ]dNþê/ÍêûfE'Mçö¿™›¦¦Ò¯<óÑßvcv™ÌÌz;Ω>Ýü¾Ç˜Ú;&ïAíyÌèKjþÙík*Ñf6Üw¦æÂ`›.ù³ÙÒ}sÚv´e‹ùó]3^ÍMRQQQQQQQy¿«ÿǾܰ|÷Óœü«9Œûê"ú1$""""Lj÷ÍŽŠys¯áìÜþí« Ô""""¢P=dV>ó®9‹œ=+xèõ¨>59¶â*ï—é"""""Ç(—†@DDDDD¡ZDDDDD¡ZDDDDD¡ZDDDDälཱི3f3vÑõäûúO›q5íGKCïä;™2»íý„à› Úå_gÚÂa4®¸•¶žÔ ºà½ˆ²>Lna>.’$üi[ÿ+ZööìŠÒ.§ô¢»‘sðÕ¡UŸ§¦®ç6-\Ã2î¼+ÈŽ<Æë""""rl…jËåÃãsÙð]v5Äpù*È?áJJã<|;­A'ž—Ë:ôâ4,⤒ƒÝdÛ`¬t’ b×Ëm8žQL¿„Ò3Óˆ,ÿ1ÝÑþØhyq»!Z};k»úäƒ ¿5òæAÕ¹—1àëyÈ8î ŒûP±ÚgiñI"¡b‘!l î*¡pîEd‡WѸr W³.cä™ÄVÜMGØÔnö>y;í®ýdeL£ìô ð4l&–È {îÍŒ©òÓ²f ™U—Q1ÿ&¬žØÕüøˆˆˆˆÈ±ª÷Iõ4ÒÛÑ; ‡†‘wáÙde§ÑŒâÄc`y°Þ8ÝX&N*5ذ—"¾ó·ìÞ¹ïïW Å'Q°°ŸÏ¦;šìO¤é¸=)íuôv†Þ¾9ïÊ^‚ûµ{¨Ïþ2U%%~ì’K¨šKÛãß ¥ã×¼všiùó—hu’ýá~ =½#É=o¹9:ÂQ0Qbí;ˆ½ùÒ¹äŸþ|‘•l{áp TÉÚ¥ì­ÝôvýߨÛÈ--ÂÕÆìøˆˆˆˆÈ±ªûØ}wª'ÏÃÝHCGLL„pÈŲÀòŒ #Ç!ÖцeÛ˜D7©#ºêÂÎ>Žâ©±‚Ïݹ¤ÙIRviž(‰øaÒ•OÁ)_ ßÿ ÞØT‹÷Çœ·rȹ/í ;s¥>/&TGgõohغkh}~3P÷‡u_!6~z{T¶°‡_ȨцΧ¥'Þe*@$dp—žˆÏ[KOÌàÊ™DVz/áf?ÎPÆGDDDDŽÍPµàgÌZ°ï/?þ•Ë ôO70‰ )“Ë•ŽoæÍLœ”¤õߤŶ!Àj¨Î8‰‰W|ž, HÕ±÷/: ŸZž,œp’ìSïfš&´•ö ¿¤±¶¹?|Úxª®¡¢¨š®#îxxËtfwùÅi¤Z_¢eË&"17éc.¥ò¤oãŽÜ@í®À ¢+÷T*çO&þúÚÌËv2lÎi¤u¬`oãó¿MÏ?HÎÙŸfÂ¥“è®oÅ3úœê{ØÝÒøˆˆˆˆÈ{ç°«D^ZÂÝÌÖ¿þ„=¯wQpÆÆTômØ’26–§’Âò$ÁfyãFaÛ6Ä»I9CìIôv=vÛžyÖÖFž÷mFîÅ&ðÛ—_Ç+?ÿ$¯,¿ƒÝM¹Ÿv £J}ý¡s媢çÅåßnž±;ODw­¢³©Ž^ÿ6:_þ9-tr›8˜Ûö‡°°‡EÕÇ>CfÓýl__Ã@:Zù ()NØ´†¨sðð»|%xÓº¼±šPÔ€ñà«:Ü,÷ÆGDDDDŽÑP 5ÑÛQOxïË´½¸”Ý­ÙäOÇÄ;Iwñ©ä¤ÖÒ´aTž‚ÏëÂÄü$‡ªM„Xg=õÏÒðôRüñJJ¦Œ ƒNh;þ =’Cþ„ \X¸G.$ß›IÞé?eæ51ëš_0aœrsüU·S”åÓ7eÃÎ<àF'@$Vzö´°K1þ‚+ðÖ/cëªÕýÊCæ„ùxã›hm |*m"å ÎÁµåûÔnxŠ–õËxcÅ]´[ó¨˜;ûˆÆGDDDDþ݆psÖ²,ÀÁ0‰I'“¬ISqvÞE¯ß¦Û¹‘¢’8©pç_êVÿÕ®ÃDFëÀs†TÃÏxíïNzÈœýmF®¥ö不׫…pJÊÆ‘¶©‰¸ÜEdeãoÒË7Ñ “V·”­k6x»kí‘äWäãì]C8~HÞR2Ò“Ä:»öÏÏŽÕèJQ”Uˆíâmîøb|DDDDäØÕvÖÒssq¥‘Uµˆ²â¡ªûV®p‚Ä’E—´Ò¼¶“²è¨S2µˆØ¦!¬ŸìÊ#wê餇ê‰D¢Xž²&,¦0½M}|LÇ7år»èí c<%äLXLQFÿ¶Ý}uâ~¢…V/îx RAböþpÚHûë»(9ñJFOÑÔÂ;þ*J²ü´®ÚNjÐÃæÅ7ýròx…úšVÜy£ödÂO´§÷Í÷oeŽ'' "w¿¥}ÙN0èfø¼«(qž$2xJÏ¢¼Ì&ºi[_PÔøˆˆˆˆÈ1ª&ÞkÈŸs+“çÄItmÿöšjÚúc*@4$×Ñè[…"Z»ŽØÔóHt‡°)‰‡´¬ M>ô 7#îßBó3Ëinê_ƒÚòâΨ `ê™”fz€ 5Í+¨3(I¢¯ýíî«)Ÿü&δpBoÐúìhlÂòz®<|ÃsÁ3ƒÊóg|®ý~ª_Ý÷ð²Æâ%Hg`€~¦v³÷ÉepÒÅŒ\xå±½¶ÜËžM{úÇpã#""""ï) ´)ŸˆˆˆˆÈ¿B“rEDDDDªEDDDDªEDDDDªEDDDDªEDDDDD¡ZDDDDD¡ZDDDDä}jà3f3vÑõäûúO›q5íGKCïä;™2»íý„`bÿ¥vù×™¶p+n¥­'5ÄîX¸†-dÜyWyŒ×yŒHêóy'Syöµä4ÞÁ–ÕÛÞQÐÊ"kÊÕTœ0‡ /$;_¢åŸÒÚê_ŒÛ…»ø4JgŸEþˆá¸­ɮʹ­{æÆî!,Ø=ÈvÒFQø¡«9nÛ!Ùñ2-/>Hkó¾'ÝxG/¢ì„“[˜‹$ ÿFÚÖÿŠ–½ìJùŽïKDDDDÞKÞ©¶\><>7‘ ßåÇn¥æéÿ£Ë™Né¯QœcN<.7–uèÅiXÄI%‡¾¶+ï ªÎ½„Œú”>†as¾Á䋯¥À7ÐÕ6ž _a‰ÓHm{€Ú§ÀŸFÙÙ_¦0Ûî ç^Dvl=+ÀŽg&àšÁÈ3¿@o7íÓŽ•CÞ)7S9ÎEçêï²õÏËh O¤ìœoPœ»ï·ŒÁXé$þÄ®¿Ÿ«þ@ОMé™×›n þ}‰ˆˆˆÈ{Ê}¸“©žFz;z c'áÐ0ò.<›¬ì4ZƒQœx ,Ö[§ËÄI¥†xÕ;…ò…—à~í곿LUÉ'ÓȘree´={ž¹_$ÿ-™ºœâé“0 ÷Q÷Ò:ºÛd\v=#&•ÑñÒn§™–?‰V'Ù‡w =½#É=o¹9:ƒܪ|0í¤OIe&Ñ—ÿ‡¦Úf îJyÙ7(9®œöwá"¾ó·ìÞ¹¯áW Å'Q°°ŸÏ¦;šÜûÒ÷XDDDä=5ˆÛ³6.ß &ÏÃÝHGG¬ïp"„ƒeåAfa ¶eaÙ6&dH™Ú•OÁ)_ ßÿ j7ÕòÖI# z7ÜDõcËhÞÓŠ3@ÛVF9YÐ[»û¸o3ýªÛžQKWxJÇâÞ—þß Â¶¯?½½‰¡Ü;´cٙؤz#ûëÅÀS\Š=ÀGagO¦xêD¬à˂ɡ½/yÏöNuÖ‚Ÿ1kÁ¾¿üøW.'틈}Á9—+ßÌ›™8)Ië¿I‹mC"0`ð}»Ð†Š¢jv>ºŽ¸ãÁ;`½Ã7h¥á&J(’À.,ÆNKÛ§7‡Â"Ü.ˆ’Ö]¹§R92ñ×—ÐHñ ÔŽ‰ÔìáSÏ"§é‚ávÖ¼i@ÂÓ7mfß[Ê8‰‰W|ž, HÕ±÷/Jùû‘c(TG^Z®Æ(–·_å9”±û¹›ÙYÛÙªm,O%…åI‚Í.òÆ¢½Û†x7©ÁÎIȘAù‡ªèY{#ÁèÑxì.Nø¥ÿbËk.¡$ÙSŒàØÃ2öÜ+ÈhºŸšõ5Y.=L;©Ý4?û¤Ÿqã/?gßÁ¾ÀÝÐyðüè+ìzì6<9•ä1#Ïû6<~'{ý±!¾/9æBu*ÔÔ7§šzÂ͵¤ —1zêl<;Ÿ"ï$elÜŧ’“ZKÝcœ‚o« ó3¸ç-Ü#’ïÍ„ÓÊÌÓ<·˜ã¯šÆî‡o§=ôΙh;IÒñdxÁ VŸbíôÇÂ.YÄøsã®[ÆÖ5ë‰ѤäwjÇjÿîÕ²ZÎIDATµËŸÂö Ã튓rÏgÂE—bö4<ÚDˆuÖ묣§i/ö¥ß¦dÊZžÛ:„÷%""""Çd¨>4DZ–8& éd’5i*ÎλèõÛt;7RT'òá9Cªág¼öˆ÷€=dÎþ6£ ×Rû÷¿ÒÓ;È–"µCP\5wÝz’HŸ@þ0ˆ¿V×÷7`ùæ1zábÒê–²uÍGJßNŠT¸”{$Å]DFüeêvù3™¥¿!—kHïKDDDDŽÑPmg =7WzYU‹(+Nz¡š„œ ±dÅ%­4¯mƤ,:êã”L-"¶©gÐë'›¸ŸhüÀ#^Üñ¤‚Äíû§‘ع¤çæbÙ#H³ÁJNFA”T¬•h8©Ú7o¥dþ5Œå¡µ²¦~Š\¶²{kcTõâ›~9y¼B}M+î¼Qû á'ÚÓ;È~¦ —¯ŒŒÜ"2ЦPpÜäøh}òtGú_Å•GîÔÓIÕ‰D±<%dMXLaz7þšú¾>ê}‰ˆˆˆÈ1ª&ÞkÈŸs+“çÄItmÿöšjÚú‚g*@4$×Ñè[©"Z»ŽØÔóHtú¦$®üs¿è,<ûT\ˤ HÕ}êUoà"V³”miWS1ý:ªN€T×K4þí—ø÷mBãÊÃ7<<3¨<ÆÁ/Ð~?Õ¯îûÁðŽL;idL»‘IÇç ÖÓSÿk¶mù=áä•=¤eM hòy¤g¸qÿšŸYNsS¸¿Î Þ—ˆˆˆˆ¼§\ƒBDDDDDŽ€KC """"¢P-""""¢P-""""¢P-""""¢P-""""" Õ""""" Õ"""""ïO礼1›±‹®'ß×ÚDˆû«ißø;Zº0Øx'ßÉ”Ùmlè'û/µË¿Î´…Ãh\q+mƒÝœÄ.§ô¢»‘sðáЪÏSS×ÓßÓá̺ŠÒ‰“ñ¦ÚAçæ_ÓPSOê •¶-ì¼M9‚òñd¦ïeÏïo§-4ÔR,\y'Syöµä4ÞÁ–ÕÛؽð0uÜ}ù- óÐtô9j–ÿ‚PÒ…»ø4JgŸEþˆá¸­ɮʹ­{æÆn- ."""ò~ՖˇÇç&²á»ìjˆáòU•”.,ÆyøvZƒN<.7–uèÅiXÄI%‡°¶åÅí†hõ=ì¬íê“Nhß®‚dϽ™1U~ZÖ,¡3à"³ê2*æß„Õs»÷ÕóqÜ÷¡*bµÏÒþâ“DBÄ"CÛÌÛJCÁÔ )6 <’:©Ýì}òvÚ]ûÈʘFÙéàiØL,¸J(œ{ÙáU4®ÜFÂUFÁ¬Ëyf±wÓÖ&ä""""ïÛPýf.ìi¤·£:v #ï³ÉÊN£5ʼnÇÀòph¦ÆåÆ2qR©!ÜgµÒq{R$Úëèí ÐËäÊ#Y»”½µ;p€Þ®ßà{¹¥E¸Ã8XØ%—P5;—¶Ç¿AKGô‡$Œ)×QVÖHÛ³÷á™ûEò¤Ž‰kßAìÍ÷˜KþéÁYɶ^éÛÝ4Óòç/Ñê$ûHl¡§w$¹çÍ!7ÇCG8ªo¨ˆˆˆÈû=T÷±ûîTOž‡7º‘†Žþ˜˜á‹eåAFŽC¬£ ˶1‰n†’©qç’f'IÙy¤y¢$â‡Ü÷Mˆ„ îÒñyké‰\9“ÈJï%Üìï›raå;s^Úvæ2J}^L¨ŽÎêßаu×ú“ wÃMTo0àMù‡Ž´ÎA¿°‡_ȨцΧ¥'~@gÞ Ôýõ|…ØøéíMèÛ)"""òŸª³üŒY öýåÇ¿r9h_4‰ )“Ë•ŽoæÍLœ”¤õߤŶ!ÀÊjON8Iö©w3ÍÚJû†_ÒXÛܘMÏ?HÎÙŸfÂ¥“è®oÅ3úœê{ØÝÐgÛ]F~q©Ö—hÙ²‰HÌMú˜K©<éÛ¸#7P»+0„a1G©N?W!ÃæœFZÇ ö6ö¼}µÜS©œ?™øëKh¤ôíùOÕ‘—–°«1Šå-ÄWyeg,Á~îfvÖvö‡jËSIay’`³‹¼q£hï¶!ÞMjÓMà)¶/ páʪ¢`Æg©<í\‘©o ÷÷•àMë"ðÆjB®ñ¾ªÓÈ­ÙAGOÜùxÒ ºkM ·óç¤W~ŸÇMĽký€s£ÿ¬ü”'¬\CtÀq±°‡-dì¹WÑt?5ëkP¤yÿ8ì’z©P½õ„÷¾LÛ‹KÙÝšMþÔÙx\@¼“”±qŸJNj-MÖAå)ø¼.LÌOòˆž±spBÛñ¿ðí‘ò'Tôu0m"å ÎÁµåûÔnxŠ–õËxcÅ]´[ó¨˜;ÀôM£°33h.@$Vzö{¶x ‡Ì óñÆ7ÑÚ8P—,büWà­_ÆÖU«ûb‘ÿŒP}hø³, p0L"@ÒÉ$kÒTœëèõÿ“ng:E%¤ÂAþ¥u+¬ƒ»eyKÉHOëìÚ?é"VO +…+«°/0'Z‡ ½liûžžt‘•N°ùCþQ`$¿"gïÂñÞªo£.&­n)5kÖׂ""""ï;‡þag =7WzYU‹(+Nz¡ºoå 'H,YDqI+Ík›1)‹Žú8%S‹ˆmêÂŒãt|S. '±‹Þž0ÆSB΄ÅeñoÛÝÎ#Û Ý Ÿw%ΓCOéY”—ÙD7m#á4Òþú.JN¼’ÑÓC45„ðŽ¿Š’,?­«¶m:…Kzn.–=‚4¬ôádDIÅZ‰†cƒ¯X™ãÉÉ‚ÈÆÝôÁ‹oúåäñ õ5­¸óFíÿ@~¢=½Z«ZDDDäýª&ÞkÈŸs+“çÄItmÿöšjÚú‚^*@4$×Ñè›­­]Glêy$ºƒƒƒ–wFSϤ4Ó$Hø«i^¹œæ¦þõ§S»Ùûä28ébF.¼ƒr€Ø^[îeϦ=ý¯•$úÚÙòÉ_aâL 'ô­ÏþˆÆÖ¡-MçÊ?—ñ‹Î³ï@ŵLª€TÝ÷¨^õÎ ëXYcñ¤3à…òð ÏÏ *ÏŸqð¹öû©~|uß9¦Y ›¡"""""ÿ —†@DDDDD¡ZDDDDD¡ZDDDDD¡ZDDDDD¡ZDDDDDªEDDDDªEDDDDÞŸÞQ1c6c]O¾¯ÿ´‰÷WÓ¾ñw´4ta°ñN¾“)³ÛØþÐO&ö_j—i ‡Ñ¸âVÚz†²¡…+ïd*Ͼ–œÆ;زzû[¦Ž{£/¿…aÞšŽ>GÍò_JºpŸFéì³È1·•"Ùµ™¶uÒÜØ} vÿ«ýìrJ/º‹9W ­ú<5u=ým §`ÖU”NœŒ7 œÐ:7ÿš†šzRZe\DDDäØ Õ–Ë‡Çç&²á»ìjˆáòU•”.,ÆyøvZƒN<.7–uèÅiXÄI%ÁGÓô1L½ÒiÓðÉ#©“ÚÍÞ'o§Ýµ¿CVÆ4ÊN¿OÃfb)ÀUBá܋ȯ¢qå6®2 f]ÆÈ33ˆ­¸›ŽðQìó`ú};Jº!Z};k»úƒ½ƒÚ·cÙsofL•Ÿ–5Kè ¸È¬ºŒŠù7aõÜÀ®Æ°¾Å""""Çb¨~3ö4ÒÛÑ; ‡†‘wáÙde§ÑŒâÄc`y84Sãrc™8©AßBM#cÊu”•5Òöì}xæ~‘ü#©c¢ÄÚw{3Áæ’úGðEV²í…Wú¶û6Í´üùK´:Éþ𺅞ޑäž7‡ÜáèÑëó`úÓ—Îq{R$Úëèí ð TÉÚ¥ì­ÝôvýߨÛÈ--ÂÕÆÑ÷XDDDäØ Õ}ì¾;Õ“çán¤¡£?&&B8äbY`yF‘ãëhòmL¢{Óôn¸‰ê Ü£)ÿБÖ9…=üBF6t>õ(=ñ:óf î¯ç+ÄÆOoobÃvûãÎ%ÍN’²óHóDIÄ¹ç  Ü¥'âóÖÒ3¸r&‘•ÞK¸Ù¯@-"""r¬‡ê¬?cÖ‚}ùñ¯\N ÚM"HÊäãr¥ã›y3'%iýã7i±mHp†4××¥:ý\… ›si+ØÛØóöÕrO¥rþdâ¯/¡=âÐþXž,œp’ìSïfš&´•ö ¿¤±¶¹/0›:žœ³?Í„K'Ñ]ߊgô 8Õ÷°»!¤o°ˆˆˆÈ±ª#/-aWcË[ˆ¯òÊÎX‚ýÜÍì¬íìÕ6–§’Âò$ÁfyãFÑÞmC¼›Ô{x ÕÊ_@Iq‚ÀÊ5D쇅=l!cϽ‚Œ¦û©Y_Cê=ê <ÅöåO.\YUÌø,•§Ý‚+r#õMá¾ã¾¼i]ÞXMÈ5žãÁWu¹5;èèIê[,"""ò;ì’z©P½õ„÷¾LÛ‹KÙÝšMþÔÙx\@¼“”±qŸJNj-MÖAå)ø¼.LÌOò= Õ2'ÌÇßDkSpà@]²ˆñ\·~[W­ÞÿÐà{ÒŸ}œÐvü/<@{$‡ü }NÚDÊœƒkË÷©Ýð-ë—ñÆŠ»h·æQ1w ¶¾Ã""""Çv¨>4ŒZ–8& éd’5i*ÎÎuôúÿI·3¢’ Ráà{7××I~E>ÎÞ5„ã¼ ßNÉÔ"b›z†¶æ³Kzn.–=‚4¬ôádDIÅZ‰†cƒ¯X™ãÉÉ‚ÈÆÝLéðâ›~9y¼B}M+î¼Qû á'ÚÓ;ø~•þ¤ã›r9‰]ôö„1žr&,¦(#ˆÛî¾&‘íƒn†Ï»ŠçI‚!ƒ§ô,ÊËl¢›¶‘ГŠ""""Çf¨6N˜x¯!έLž'ѵ ÿÚ;hªië ž©Ñ\Gg o^o´v±©ç‘è)T»òÏeü¢³ðì;Pq-“* U÷=ªW½3È:VÖX¼é °~³+ßð\ðÌ òüŸk¿ŸêÇWï_êî(ôùûcyqgTP0õLJ3=@‚„¿šæ•ËinꯟÚÍÞ'—ÁI3rá”ÄöØr/{6íA{¿ˆˆˆˆ¼÷,P.ùWhF®ˆˆˆˆˆBµˆˆˆˆˆBµˆˆˆˆˆBµˆˆˆˆˆBµˆˆˆˆˆ(T‹ˆˆˆˆ(T‹ˆˆˆˆ¼O ¼£bÆlÆ.ºž|_ÿi!}ãïhièÂ`ã|'Sf·±ý¡ŸLì¿Ô.ÿ:Ó£qÅ­´õ¤†Ð WÞÉTž}-9w°eõöý[»'0úò[æà²èsÔ,ÿ¡$`—SzÑ]ŒÈ9¸JhÕç©©ëéok8³®¢tâd¼ià„vйù×4ÔÔ“òŠÝïÇ>‹ˆˆˆÈ¿%T[.Ÿ›È†ï²«!†ËWAþ WRº°çáÛi :8ñ¸ÜXÖ¡§a'•üþÙVú ¦^Hé´ix€ä¡R»Ùûäí´»ö¿˜•1²Ó/ÀÓ°™Ø¾ìnyq»!Z};k»úwµqpBûv3Ì {îÍŒ©òÓ²f ™U—Q1ÿ&¬žØÕþˆˆˆüCõ›¹°§‘ÞŽèØI84Œ¼ Ï&+;Ö`'Ëá™—ËÄI újS®£¬¬‘¶gïÃ3÷‹äZÅD‰µï öf:Í%ÿôà‹¬dÛ ¯ìßZÜJÇíI‘h¯£·34À»Aþ¨<’µKÙ[»èíú ¾±·‘[Z„«1ŒóÛgy· bNµË7†‚ÉóðF7ÒÑÑ!l, ,Ï2 K°- ˶1‰à¦%$èÝpÕ-£yO+Î;^ga¿Q£ k¥'~Àî\Òì$ŽGšg€ß ©‘Á]z">oßÏWÎ$²Ò{ 7û‡Nß}‘wËaïTg-ø³ìûËårѾ@Øœóq¹Òñͼ™‰“’´þñ›´Ø6$ƒšBeW!ÃæœFZÇ ö6ö]=Y8á$Ù§ÞÍ4 Lh+í~Icms_ø4t<ÿ 9gš —N¢»¾ÏèpªïawChˆC÷~쳈ˆˆˆüÛCuä¥%ìjŒby ñUžCÙK°Ÿ»™µý¡ÚÆòTRXž$Øì"oÜ(Ú»mˆw“z—n¡Zù ()NX¹†è!¯aO±}ùS€ WV3>Kåi·àŠÜH}S¸ï¸¯oZ7Vr§ÀxðUFnÍ:z’곈ˆˆˆ UÂ4½ÝÙT¨‰ÞŽzÂ{_¦íÅ¥ìnÍ&êl<. ÞIÊØ¸‹O%'µ–¦ ë ò|^&æ'ù®„j™æão¢µ)x˜zNh;þ =’Cþ„оy.i)_p®-ß§vÃS´¬_Æ+î¢ÝšGÅÜ)بÏ""""2dm.àõÁÕµ°, p0L"@ÒÉ$kÒTœëèõÿ“ng:E%¤ÂÁwg®¯=’üŠ|œ½kÇÓ僧Œ[ÞR2Ò“Ä:»öOÞˆÕèJáÊ*Äv©Ï""""2d¯»ç˜³Fž›‹+½ˆ¬ªE”§½PÝ·r…$–,¢¸¤•æµÍ˜”EG}œ’©EÄ6õ0¤)Õv.é¹¹XöÒl°Ò‡“Q%k%Ží˜™ãÉÉ‚ÈÆÝ¼uìt|S. '±‹Þž0ÆSB΄ÅeñoÛÝò#Û Ý Ÿw%ΓCOéY”—ÙD7m#áü‡÷YDDDDÞ Ï»?ß=ð¨qÂÄ{ ùsneò€8‰®mø×ÞASM[_`NˆF€ä::}óz£µëˆM=DwpH¡Ú•.ã…gߊk™T©ºïQ½ê7ïz[Ycñ¤30ÀÚÌ–wFSϤ4Ó$Hø«i^¹œæ¦þú©Ýì}rœt1#ÞA9@l/-÷²gÓžÿø>‹ˆˆˆÈ»âû–™~¸Bã!""""2$¿®ÜªÇ¯Áþ¯"""""rXq`2°cßcn;€ë5."""""ƒv}Ž>hE¶W€pºÆGDDDDä°¾ ,Ý÷ǡ˯¡oÝê…œù ‹Ÿ;0Pó6Áùàa ˜ªqúJ¼Xyè ë.\ œ”j,EDDD䢉¾Ÿ§oêoWñÿ„Ðç+ýüÙIEND®B`‚stem-1.7.1/docs/_static/haiku.css_t0000664000175000017500000001773513157571677017766 0ustar atagaratagar00000000000000/* * haiku.css_t * ~~~~~~~~~~~ * * Sphinx stylesheet -- haiku theme. * * Adapted from http://haiku-os.org/docs/Haiku-doc.css. * Original copyright message: * * Copyright 2008-2009, Haiku. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: * Francois Revol * Stephan Assmus * Braden Ewing * Humdinger * * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @import url("basic.css"); html { margin: 0px; padding: 0px; background: #FFF url(bg-page.png) top left repeat-x; } body { line-height: 1.5; margin: auto; padding: 0px; font-family: "DejaVu Sans", Arial, Helvetica, sans-serif; min-width: 59em; max-width: 70em; color: {{ theme_textcolor }}; } div.footer { padding: 8px; font-size: 11px; text-align: center; letter-spacing: 0.5px; } /* link colors and text decoration */ a:link { font-weight: bold; text-decoration: none; color: {{ theme_linkcolor }}; } a:visited { font-weight: bold; text-decoration: none; color: {{ theme_visitedlinkcolor }}; } a:hover, a:active { text-decoration: underline; color: {{ theme_hoverlinkcolor }}; } /* Some headers act as anchors, don't give them a hover effect */ h1 a:hover, a:active { text-decoration: none; color: {{ theme_headingcolor }}; } h2 a:hover, a:active { text-decoration: none; color: {{ theme_headingcolor }}; } h3 a:hover, a:active { text-decoration: none; color: {{ theme_headingcolor }}; } h4 a:hover, a:active { text-decoration: none; color: {{ theme_headingcolor }}; } a.headerlink { color: #a7ce38; padding-left: 5px; } a.headerlink:hover { color: #a7ce38; } /* basic text elements */ div.content { margin-top: 20px; margin-left: 40px; margin-right: 40px; margin-bottom: 50px; font-size: 0.9em; } /* heading and navigation */ div.header { position: relative; left: 0px; top: 0px; height: 85px; /* background: #eeeeee; */ padding: 0 40px; } div.header h1 { font-size: 1.6em; font-weight: normal; letter-spacing: 1px; color: {{ theme_headingcolor }}; border: 0; margin: 0; padding-top: 15px; } div.header h1 a { font-weight: normal; color: {{ theme_headingcolor }}; } div.header h2 { font-size: 1.3em; font-weight: normal; letter-spacing: 1px; text-transform: uppercase; color: #aaa; border: 0; margin-top: -3px; padding: 0; } div.header img.rightlogo { float: right; } div.title { font-size: 1.3em; font-weight: bold; color: {{ theme_headingcolor }}; border-bottom: dotted thin #e0e0e0; margin-bottom: 25px; } div.topnav { /* background: #e0e0e0; */ } div.topnav p { margin-top: 0; margin-left: 40px; margin-right: 40px; margin-bottom: 0px; font-size: 0.8em; } div.bottomnav { background: #eeeeee; } div.bottomnav p { margin-right: 40px; font-size: 0.8em; } a.uplink { font-weight: normal; } /* contents box */ table.index { margin: 0px 0px 30px 30px; padding: 1px; border-width: 1px; border-style: dotted; border-color: #e0e0e0; } table.index tr.heading { background-color: #e0e0e0; text-align: center; font-weight: bold; font-size: 1.1em; } table.index tr.index { background-color: #eeeeee; } table.index td { padding: 5px 20px; } table.index a:link, table.index a:visited { font-weight: normal; text-decoration: none; color: {{ theme_linkcolor }}; } table.index a:hover, table.index a:active { text-decoration: underline; color: {{ theme_hoverlinkcolor }}; } /* Haiku User Guide styles and layout */ /* Rounded corner boxes */ /* Common declarations */ div.admonition { -webkit-border-radius: 10px; -khtml-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px; border-style: dotted; border-width: thin; border-color: #dcdcdc; padding: 10px 15px 10px 15px; margin-bottom: 15px; margin-top: 15px; } div.note { padding: 10px 15px 10px 80px; background: #e4ffde url(alert_info_32.png) 15px 15px no-repeat; min-height: 42px; } div.warning { padding: 10px 15px 10px 80px; background: #fffbc6 url(alert_warning_32.png) 15px 15px no-repeat; min-height: 42px; } div.seealso { background: #e4ffde; } /* More layout and styles */ h1 { font-size: 1.3em; font-weight: bold; color: {{ theme_headingcolor }}; border-bottom: dotted thin #e0e0e0; margin-top: 30px; } h2 { font-size: 1.2em; font-weight: normal; color: {{ theme_headingcolor }}; border-bottom: dotted thin #e0e0e0; margin-top: 30px; } h3 { font-size: 1.1em; font-weight: normal; color: {{ theme_headingcolor }}; margin-top: 30px; } h4 { font-size: 1.0em; font-weight: normal; color: {{ theme_headingcolor }}; margin-top: 30px; } p { text-align: justify; } p.last { margin-bottom: 0; } ol { padding-left: 20px; } ul { padding-left: 5px; margin-top: 3px; } li { line-height: 1.3; } div.content li { -moz-background-clip:border; -moz-background-inline-policy:continuous; -moz-background-origin:padding; background: transparent url(bullet_orange.png) no-repeat scroll left 0.45em; list-style-image: none; list-style-type: none; padding: 0 0 0 1.666em; margin-bottom: 3px; } td { vertical-align: top; } tt { background-color: #e2e2e2; font-size: 1.0em; font-family: monospace; } pre { border-color: #0c3762; border-style: dotted; border-width: thin; margin: 0 0 12px 0; padding: 0.8em; background-color: #f0f0f0; } hr { border-top: 1px solid #ccc; border-bottom: 0; border-right: 0; border-left: 0; margin-bottom: 10px; margin-top: 20px; } /* printer only pretty stuff */ @media print { .noprint { display: none; } /* for acronyms we want their definitions inlined at print time */ acronym[title]:after { font-size: small; content: " (" attr(title) ")"; font-style: italic; } /* and not have mozilla dotted underline */ acronym { border: none; } div.topnav, div.bottomnav, div.header, table.index { display: none; } div.content { margin: 0px; padding: 0px; } html { background: #FFF; } } .viewcode-back { font-family: "DejaVu Sans", Arial, Helvetica, sans-serif; } div.viewcode-block:target { background-color: #f4debf; border-top: 1px solid #ac9; border-bottom: 1px solid #ac9; margin: -1px -12px; padding: 0 12px; } /* Navbar */ #navbar { list-style: none; margin: 0; padding: 0; float: left; position: relative; } #navbar li { float: left; position: relative; } /* top navbar items */ #navbar li a { float: left; display: block; text-decoration: none; color: #666; font-weight: normal; text-indent: 10px; width: 130px; font-size: 0.9em; } #navbar li:hover a, #navbar li a:hover { font-weight: normal; background: #999; color: #fff; } /* start child items as invisible, but make them visible on hover */ #navbar ul { display: none; } #navbar li:hover ul { display: block; } /* attributes for child navbar items */ #navbar ul { float: none; position: absolute; list-style: none; margin: 0; padding: 0; top: 1.1em; left: 0; } #navbar ul li { float: none; clear: none; margin: 0; padding: 0; width: auto; color: #666; } #navbar li:hover ul li a, #navbar ul li { font-weight: normal; text-indent: 5px; line-height: 200%; display: block; padding: 0 0 0 0; float: none; color: #666; background-color: #e0e0e0; } #navbar li:hover ul li a:hover, #navbar ul li a:hover { font-weight: normal; text-indent: 5px; background-color: #c1c1c1; color: #000; } stem-1.7.1/docs/_static/duck_duck_go_hidden_service.png0000664000175000017500000013445213157571677024006 0ustar atagaratagar00000000000000‰PNG  IHDR“²Ã‚sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEß 2am IDATxÚìwœÕù‡Ÿ)·ß­ì²l¥#é*"‚ öÂOc¬)jb4vLŒI4±ÄÞ»1=Ä»R ¨‘&ˆ‚°”e ÛïÞ2åüþ¸eïÝŠ`ÎóùÌîÝwfμsfæîùÎyßs”;wŠp8LCC7ÜpÙÙÙl+ÙŒD"‘H$‰D"‘t–ëoø.§ —ˉÛíÁív¡<òÈ#"//ùóçóåºUä÷eÏ…)í­Ý«ý›o ìåþ©+”ŽÖ˜ÒžYÙËýÛ±*]¨·æ[)]Ù?ye/÷ïRÍ·Z†ÒÅÚh{ÿ–¥töÜS·Bìÿ:vs({õ¡ì£ršß:ûÀ+¥‹×¾ùÖ]ÿâèd9m—©ìÕÕÆÓ¤ìõUgŸ^üÄÍŸøAê§®–•üQì£rÚXÙÁrDg¸Wå´S®ØËúM®Y±¯/½ØW·P×®ÕËéx¹]?Ñö_]¾ÅÞTGÛ» ±÷etñ$Å>Z!ºø(vøÛ¥Ó_b¯ÊûèË£c§/Ø'§.`g鮄øð¸Ýx}>”I“&‰††ü>YY™RšI$‰D"‘H$’½¦ºº†k®¹ŸÏ‡òù矋«~y9™™²f$‰D"‘H$É>£¦¦–«¯¾5 ÉÚH$‰D"‘H$û…@c#ʤ£&ˆŒŒô. „À6ÂŽÆŠNÆ !P%±_ô· Tý­ÄÃãÛ)ŠÒ±r„EAQ@AEÓTEAUÕ6Ë‘H$‰D"‘H$û–ÚÚ:ô¦Æ~Ćec¦eaY"ј×4]Ópèz‹Dä¡û-„aXØ–…mÛØB Æ‚ªi8(j4¿±™`"–÷(씣£jš ¿ð° #¦æõàÑéÏ!À… ›ÝãÆ­)mØ$‰D"‘Hþ7Ð;ݜۦA8æôþŒ/̦wfy~e A¶ÔÔóéŽ*^ÿf'n· ]×[”A¬gÂ4L‘½{÷¦°°€nÝrÈÊʤºº†Ý»+Ù±c'[¶lÁåt¢;ôhM=(ÑòLÓ$ŽPPP@ÿþýÈÌÊ"Íï§¡¡ššZ6mÚÄöíÛq9àt iÄÊ9hGØMß#¦0¢ØÇÎþÃÒÇwØÐ?Øü9˜.•I}M=¶Ž?ÓÓr?bCŠÓ¨Xô+54ÓÙ̦ï{á‘âG>}/Ë6Á†‰%U'-ÓW—×\"‘H$IDGG{:„ضM$bëT¹û¤1ø]ÛÛDjÉÓTòr}LÌKçÿæó«Eë¨Gp8$KAÄ0p8œ8mÙÙ™X–eÙ44Ôãr¹èÙ³'½{3xð`þ»p!áˆÓáhJeš¦2mÚ4òòºcÛÑrB¡ N§‹üüPY¹›>ú˜P8‚ÛéDÓµ.5Äkh0ì&›¢ é:.— [gŸ´%…E£ÑÁh½Ž¹ _å£Z·zû“pË"Ü"61ìX¨œ¦áp:ñûèûMì ìP€ÊzÐðeûñ%W€0©¯j hƒêI£›_Û»Bm“£'?øÓµœœµ™Ýö oVôäç??/ZOŸ½Ã²:°Œœžl«×p©¿ªzvk+5Üéùa‡˜[çîºðÆ4ÆŸÿ Î9z ¹.°ª×ñ¯;ãÀK ‰D"‘H$ûOtØÂÆ0L ]O‚G5õmnŸçtóä±C¹bÁZÊ-]öTضÀ´,\N'œp<š®ÐÐÐÍ ±ã¾DPTŸßÃŒéÓyÿý0-]w ª±žÓBÓ4N8áxœ.@´Dü¼šÊIK÷s 'ðÞ{ï1 œŠ‚¦u¢å'l}{Óí\8$„d1صu#+Íåÿn"äóàÚÛ–~k×DˆTóÁæO¢½¡ÞÈeâY§qÒ‘Ãè×ÍØ+¶²nùBæ¼¹œÝ愇À±ÿ5s~ÑØÉK³þÈ[õ.üºùœ÷ØÍœ” Õï߯/_,Çïëºð¶•>ˆÑ=À ÆõöðVE×ën" !‹Ó~„™¹­=œë¸ïÖo’üpóîç6¶Ö•ÙQFÀ¢÷7rÅ´è¨vV8Ø]g¡êÉ”H$‰D"EGgÚܘF„ßOì¨"îy‡@·—[/äÒO6£ÇBš°mŒH„c&OB“`£ËíhZâ9Š¢`š‡“#ÏüùÿEW£9¶m ‡9vêT‚ÁvÊ1q8Lš41QN§Da;HËmjàÛ6¨?=úæäþ£™qì[ÜzçÛìTœ80¨­ b áÍôáÓ!R_OmX 8}tK×c B V4ôL÷¸Q[¹Áš ¦ÝMfº~pù“áÂ! êÂew_É1Ý’7VñäöaìärÞ³˜ ·°‰4Fc @Õp{<ø=]¶©’Yþ¹€ÓÏÊ{OlÀö9 Æ7áÿ˜‘]›Q˜ÃÜhíú""*ëÌ–T]ø# xâon&e”0÷óP'|DÔ‡-¢Z[As8ðú<¸;ÙC!‚!Â;ç'ùÆãÐ 7 FL̘˜W4'™Jü|ML!PT —׃ߥ¡`…3>0Xùð üiI6 Þ¬t|êžëÊll ºÑÕIfVôX¡Úzê P=>²}:²ŸD"‘H$’ÿAÑÑ‘·–B€iœØÃGwшQS@yc„Ê Án¾Ä¶«ñ;4 ü.¬`==ü™œ˜ïgÞcX&……¸ÝnƒÑÆ|,tKÄÞ+ ‰Ñ¦EÁ0L</…T”•ãÔœX†E=ðû|±ràÃbšf«çpüñÓ0 #QNyy9ºèDë®Y=•ξ™k_Û‰íÊeèñ?äšó'£Ï)\ó«¸ö…m4ºÇòÇ/ae¼tÃïy£L¥ß¥òÜd¡OïåÒǶâMS 9Ÿ N™Àà\5|õþ“ÜñjjÕ§süïä¢A:bë[üö¶·Ør0ùsûÛl‹x{Í¥QÁaoçƒgþÁ+J¨2œd÷Ȱœ2¶àB&z'N¾„ógŒ¥o†ŠQµ‰OÞ|‰,ØŽîw vúvX–Jzž?aq?ƒ©/ÜÆÜ‚mröÌA‰rÕŒ|ŠMØ6 7´í‹æ4÷¿šÙ¿ÖÒ§Š·¸þæœyÁtFëu¨+WðçmÍ„j‹9<£ƒ'D Åçþ†+&÷¦›WB”oXÊ+›ÃÒj Þν÷êNwº¢£{sc’Ýæç¨sÂŒ1è“ëCBÛçsÇï_ä[3Á§^Æ'Ž¦Ø¯Ùý5½úoþ¹¤— lÕM†ÀÁáW?Ìì«À'ü±ÙNã°6ê M5ãž=§'ìžÇïfÍf³‘Æ‘³žáŠÊß½“Y³wâöjRxH$‰Dò?„oÏ´·¦Å1¹Ì@¶i`›e!‹{Wlcmy-¶i°¡²Ž»——P¶Û˜:¦äz0L !À2mò ò ƒ†a˜ÑQ°LÓ4±,3ñ9y}0¤  ÓŠ–cZ=…‚˜¦a1q1•ãŽ;6±üTt]à  RTX€ó§SKó tûÉôÙüîŸyàÃh¨Y·IS(Æìˆ1m gþ†;~<9ÚÀ· lG&‘Æè[äÄÒqÑu\4H‡ÚOyèîÿP¢ê-Áß©?€™6ŠÓw°éð—Å;éNÒ<‚Æíëødån‡‚ѨÐÿâßò»Œ§o† Ùý˜rñoøÃy„Ñ·ÿ¾>B'-Ë €Ý`=9õäÞˆú0Ž¡§2=E¢çàËŽ½µoÇ—0`T±£ª†ªêªëŒD5X»wÓh5—-4­ÊzËÄòæåS_ÀÀM÷æpù¬Óèc´sï%£¹-ñ&9qÜ(úåúP1›àVk¨3]ô¿ðfn>{,Å~›†º0În˜véM\5ÆECX$®ŽÖc-UÕ5T–ÖÁÅ =Ô•e+ìzçY^Ø t;Ž+ÎèEÖ¸óùÉ”¾ËC/oEsk±ðG¹ÈE.r‘‹\äò¿°$z:öÜœ‰½HEÁ¶,zºì@#ÂŽf³ëžÉ¬SáÞ7ÿËÌÞ™¼¶¥–«O:šáJv}u´Ñb[ù<Ø–M·-ü>‘H˜ÖzZšÏ»Ñý,ËÄçõ"l;òb[ø|>"‘HJÁ`0¥œDÏ2c¿-¼±r:rî{hNFmŠŠËfËòìc‡¢ú ÈwÃ×í–gôÉNé¬ýûíÜõ~ !ܤûl%+¶“Þ§^űcºAx=½í/,7Ýø5›ÆƒÈa‚9}èícå—µ8Ê:áÆ©$õ¬Ô7ÔÞ‡‡ì´äPKñ“ëtÛüæëX?˜É É§rø«ÿ"ý¬Ñ¸©áÃ9_2ú‚#ÉðeãUL"þÉ{ôeÄ»²n뿸áJ/Ã.¾•[¦ç@ý2yäcvÛƒ»ÖÍèWÙò최û´_F¾ìq\{û9ôë6”¡™s˜4uzïåŸs/žÓô÷®WËuo¶u¤:æþ~Ïl4P]N´ŒI\u|7`/þê¼²Õ¢ûq¿æÑKú3ú”1d,]Dµ£ißù÷ÜÈ3_›(šŠ–5…ÛÛ»nìâ­Ç^aÂ=3é{Ú,î´]x(å•ÇÞ DsâSd>ˆD"‘H$ÿkt<‘<–¸íFB,Ø5 J3ø¿ñÃùÛÇ_pÁ‘#jWaÖU%)·m$ò,ìØP·ñ0(EQX¼xY›‡>òÈ ‰}]n [DßÄÚ1QïሠŒäóIþlYVâo—+VNgbEëF!Â%‘¬-°i™ÀÛò ¸…^8’Þ ^Åk w §ùÉV£á7Mû»0¦'`°ê™gx¿R'ÝC‰Èß¡?Ñ”ä‘^üô7³8 _>p%wE†Ñ ´–w–ÕàJ×)ýdß\4€AŽ^ ë®ðE™À“ÅF½Å€þÌoF58f¬¸ŸŸ<ô n\xØØŠ‡,/€AmÉR>øô$nš8œs~xž~ ”|À[_z d¸üøT£°#¾8IsÙh‡ÿ˜ë§ç€(aö]gy¸£ƒµ‘Hjt3ìükøùŒþ¤¥¬tâs*ˆF!”¼0íÉgWšŽŸ/…œ{÷Óœ›¼Yf!YºÍîæûú½xHÚwuåÀ]ñ¾0–Ï+&]…¯=ÅkÛ<>™„.‘H$Éÿ°èè€æÑdìú`—ˆ/Ά’¼º¡–óŽÁëË¿¤÷  g8›š,ªJC0MèV£åCaÅĂʔ)“yÉ‚AˆhÏ…kô£åÛ6 £(Ñ`Um­Í¿aÛ6¶õ<ÇzS:Q[¢•ÆŸˆö¸„†Ñ;îT·Ò@¸l¢µ¤‹(iY¤¢%bÜìX.‹Äfyo"Ø¿ƒ‘?¾£¾~ŠOC.ÜÊÁæ†Yµ•JŽÂOwšÁœ ¸¼{Vp¢iú”†®Hº7Å®IâŠh.Bº B}¨ž5o.b÷Äé=&*’^_Biý8¢²ÙC†Gé˜/–A m27_>?aV>ó(¯ïPð¹ Áè¼æ°Ž—rõŒþ8­æ¿8Ÿõá"NûññôRšöK>·äJhžÓ¡¹Ý(jv»~DÓ5f7ËÞûŒ²¤È;Ñð5u‰õÍ÷íøu3-/E}sÖÜÃÅ.¶†œÚE"‘H$’ÿ=ÔÔÍE ª_ׇØØ–ml¬ òÀú~9m§öp0kÆ<´¡†/«Ûa³©!Œ½JUUª«k°,;‘ÃÑØØH0$  …ŸX–‰ešX–MMMm¬œh’ymm]¢Ó´€ä„ô¦uˆ¯kÆÊ©­­CUÕŽ{ÊÒ¬ñ Pr}ÎU\{D´u½ë¿²Uh(‘ZªCÝ2(Ûh‘‚]¶‘R÷pN™˜K¸¶êÚ†BRïŽÅ?À[¥€4W\3î‘ÖÁæªâ¬^Éû_EËíwÑ•üh|wD BD¤ö´„w¬¥À=Œ“Çe®·È?jýÌm¬«°Ð•¦zwøU6Þw ÿwîËü—_‹Ë“èµWâ ÐÁˆÀÞ¶€76ÇÝ^Ê«+ë°F¢Y.ÒÝZû¾”[ØV&Ó¯¼€ahXü,-¬ÄŒ© ­ô ,;*jr»¹°, ìf6Ò »ã(ù//¿½ˆ…‹¾`G¸5•Ûú½§º=dfúÈÊô‘ÙÑQª¬]_±?Þ²¥¼òülþù¯Ù¼ðÆÞ›·ž†VçàˆîktäºaÜ/抉>¨ZÇêjp >ŸkOÊ%2»ðÌÉE.r‘‹\ä"—C{éÌèU¶Óáà£Ý†æ‚ˆ…Fy=^®:î0GÊ1*vÓ/-“¦OÄUþ-ÂŒehN>¬4q:¼¨¨èºNee>Ÿ˲PUµÑ451¼m\0X–ë¡°ÑuòòršÞj9ѹ;`éÒÏZ=Ó4°m‘(G× ¯J‡¨y\=@ãÚÙÜÿúN.-T‡+ƒL<ÂÀŸÜÃ¿Ï ¡ºÝ)|u÷'¼üé‰\;Þ˘Ÿý‰ç/5°TêÆg¹ôž¦9PìÀ×¼ðà+ »g&½ûÎäê“Wó›7w¥û»÷§—»–žú'Qž^̸òVf\ÙJ]Ö.ãù§ð»©™Œý޼ðó& \úîk¬ ë8\©sYè>/™{¸&BT‡ `4AÓªùxö\ÆÎ,¦îãwÙ$t0B1Ñ‘æRPËÛñ%$ð¿€óFÞrïãDë¡bw?ðMª°wóMŒ+t0êê;¸æî_óàºTÛµwÿš'¾ù–òñ÷¹ˆûî;šŠÝ´èékíÞ‹ ‘Ô$:rÿ*úîyiñ n8ÒÏð‹oåﶇáÓ?]Ã_Óªh¸êÚ«+Ã3š+: 7Õ¼ûÈã¼ÀY¬n¢a1LÌXî†6Š¢¢ª*º®áp:°-Ë–‚C"‘H$‰D"90¢Ãêø<Í1"&Šb¡i:'6GFÇññž UUŠŠKu!ñ”ܦÁÿ£!V¤ä}´UŽmk¸œ.‡#iD#@ØX6‘äü9G™D"‘H$‰D²ÿéøŒä­#‚aÈŠ”H$‰D"‘H${á_"‘H$‰D"‘Hº.:d˜‘D"‘H$‰D"ÙÏ¢Cª‰D"‘H$‰D²EÇþD ‰9RšD"‘H$):ö§Ð°mÃlÆ6:”­@×u ™.ùáp8¢ãPÇf^WUÝ¡ãÐuTU•D"‘H$‰ûZp†A8!++›SN>žqÆSPPH^÷<\n‡#¥!&Ú˜7CÚ¥ýP± !0 ƒ`còŠr¶o߯gË>eþ‚ùTWWár9q8m–%‘H$‰Dò}E™tÔ„}ÿ¦iG=f,—ÿür† ›k#º†‘x ,C¯$ßG„hšÖt Áš5«yâÉ'ø|År\.'ºÕûR|H$‰D"‘¢£“‚# #„àî{îcòäc°mEQ¿“X¶m·9iM„H»´ªv˲÷¹¢(,Zô_~uã,EÁívIá!‘H$‰DŠŽÎˆŽP(Œ×ëãoÿ={öIJ¬o|…‰ÏÍC«Zk|I»´Šöd¡mÛ6š¦%„öömÛ¹øâ q»]RtH$‰D"ùÞ£î Á1 „üù¹¿PXX„eY‰dZ ‘<.„H„VÅZñíš÷„H»´jöäû<¾$ç{¨ªŠmÛôÈÏç/ý[ʳ#‘H$‰dÏíÍäErè¡ïí …¹íö;).î(Šš/ˆÄ„皪%Þ'n%ö¦X²NÚ¥ýP³kj¬WOøïÝvt¨ŠB¯^ÅÜrëøÝooÆ)“Ë%‰D"i•šº¡°Ùê:·K'3ÝwÀ}ÊÈÈ`Ò¤É>z C† !?¿€;w°víZV,ÿŒÅ‹?¡®®6%ªç@àu:™º»×ê5­®Îüœ,‚‘ðwr-÷*¼*VbàÀA<ýÌs¸œÎÄÛÞöªd#Kò}cOaU)B;f.»ô6nüj¯Â¬†ý-õ1–ÂÚ—ä5‘H$ɡͮŠZŽ¿éïä Ÿb/[ÿ)sÿt1=r3¨?cƌ嬙g3yò1¬ÚXFmC€âü Šó3™?o/Ïy‰U_|¦©¤½ëu:™^YÃø5kð¶±M#ðéðá¼÷ .÷tÄPA~òÓKp8XI ãv¬qo|Åí–mGGîI ?IþÜ€ë”ÝÞÍ'~’Åù?âêS‹ptµœ½±›•,~îI>É¿˜kOë…~ Ž+í…=~¯ !â{˜±dr-6Z›ˆí}üèÇ?áš«‰ËåL”Ûi±£ ~{þÏRl·ÿûi¢]+‰D"‘šÄÿ¿6ɶù{̘±\vÙå :”G_\Æc/~JM}(e›Ì47Wž;žË/¿‚Ç{„5«W¡ëú~õÑãt1½²z‚À Œ_³†çýœL#‘z=÷ªßÇ0MúôíËèÑcÂ&ZŸ!l¢1UUUP‹ª*ض•Ø^;±Ä÷é’ݪg˪Ul¬ECººZÎÞØíz¶®ZÅ7aìy\i?(ìñuÍïûø3·Å׃`ܸñôéÓÃ4÷î‹‹ºÐ2êBËXò?•D"‘H$ûŒŒ Κy6C†å†?àögQS"3ÍÍäÑÅL] @M}ˆE+¶2rä(Î>û\\.–eïWÁ1£‚£¹ð˜^Yƒ×é< u¸W9‘p„#8·ÛÕ"q6ŽmÛhjŸÜu5®Ĭ ®ìž uÓO?‰q®I·]ùû+E!'¶±kXr÷µ<øy²½4òN8ý$ƺao}H4IøÓÚö"¸_}‰7}Áæªà ³ç`ÆN?Ÿ ïWÝ»zŸ¿›Ïɽ@"q\×õD/H˲PU·ÛŤ£q”n IDATæ¥_ÀépìÅ €0È~ÖÃò¿ƒD"‘H$û£Ž:šÉ“aki ÿ|kÅù™|ðä…d¦¹‚ãÍ…_±èó­œp ̟?¹sßC×½ûů»k:,8š †çµtï«Ã.õtĆmÛŒ?!1’O|Ñ4-¥á%lƒ@uŠfrã­·pËÍ7pÙé‡ãÝ8‡{¯¾ŽÇïÆÞG×6)IlEcMsFáýúî»æz_¼‹ý?œª]¿†¿ßt=¿þ-éÏá×^ÇÕ—_Àô¡>tUC{¨Ø·lÙÂu×]Ï–-[{ëÖ­\{íu|ûí·‰y:,ËJä:Å'ÅŒç<)ŠÂ„ SF¾ê ¦Â0M ÓÄ4Cò¿ƒD"‘H$û±cǰµ´6a«m%DC«.EEE¨JSrxÊp¹"ö&8>€•¿ˆA‡ !]UPFgòqÇ1ÿ¾Y<õØ x3Çú7ðÐÏnåÛ3æþÓóÑkכ̺êUzßòW õ€UͪןãoFIƒ@ËèÏɳ~Ï…}š|SP°ë×òÏ›ÿÈÜìq÷oN¤P‹­ô÷ä°ÁCIS€‘ã˜|Üq,¸oOÆ|˜â[ÏÃ?ÿßžù0œQ€bÛØeo1ëªWésë“ürˆÅ®a嫿ŸïÄ}Àɳ~ÇE}•¦~"°Žü&êÃ]7Í Èbý¿æíEœuûüp˃áØû)Š‚mT²òÕçøç»ËÙ_Ñ8N¾øRΑ¾‡y!¤ýÀÙŸ|ò)î¹ç^fÝp÷ÞwN§“§Ÿzš»îº+u”D$–m5å:ä“_P@uuU»½C Pµfo,t7#”èéˆ8B85á祆lÙ¬{IæyH$‰äà§3/áD^Ç Ã0b@™injêCÔÔ‡¸ôop)0yt1#öàÂSFPœŸ™ØoÔ¨‘„÷cÒv¼Ÿ¢ûÙgS»y37ÞHÉ‚<¤(Œ¾ÿ~úw¥±íR Î=—s^xÏ.¹äЦaÒ-»yy=R†m>gA¢Ç#ö3å¦pä1ù‚Sxýú9¼µ¬‚£§Š7QÊ›fbã ·rû&~p% LǨ©ÃßÝo¯ƒØám̽ÿ.ÞÑNá–fP ‹è¥±¦_Ê ­wçè NáµëçðÖ§}lbeôÍ´’º½°ƒl|þîxÃd⹿ä‚iÕµørõÔ«ÈvÞ¹¯É‡"§ ¼õQ-ž —sjÿÔp®”LÙøï[ùÓÛ0éÂ븸—`ë‡ÿæ_wÜB莻¹p€»ÅÙj9Ò¾_í¿ºñFžyöYvWVrï}÷àóùÈéÖË.»¬ÅhUÉ#Z%ì–ŸŸOfF&ååíŠUƒŸ<½ÅsÒÚ™È i–ò£éS[|?ýöûò¿˜D"‘HjÊw×aÛe•uMZM%';m¿øUXXD{3~{Édnÿó¢”$òEŸoeÑç[yôÅeÜwí \xÊHŠŠzbæ~­3×Ô©Xí×k„`UÌ>ã½÷(0€~HeÒö»uàÛNÇíöpØà¡(ŠÚŠð³Ù°~¡Pp߉ŽxcÉ4M²²²ðx=ØÂFÕÔÄüñ·ÁŠª$I¬‰…-l¬X˜ €ž3ˆÞ.X³¹cjâ(Šª$4‚@`×ÁìwJ)üÁý\5³i„*aÄ6µ*øèñ¿ð÷]GpÝ?d°/kOÂK5û§ç ¢Øk7UbÛ¤MD"%=&|TѰ2áÃ/ÏŠúÕˆÃ,ç£ÇÿÂ?v™ðA 0k¾egòGãQ›ÊM4hãõUû9/½WFÁîçòS‹p* #‡þv¯Ï^Éi¿™HºÒ´}[åHûþµgwËæ²Ë.å™gžETV¢( 99ÝøéOJfVfB¤Ø¶e[M ;ei—ËM~~¾\ÿe‡ÞØ„u_·¹>bìv¦ØÒ½ä2‰D"‘ÔD_ÖÁ™ÌÇ—SÐîöüc}âsõ¶¼}óéûÍ·;wгg/.}û’››Keeš«íq³mæ|œúE§+*3Æ÷#bFɺÎ>Y‹)ìûJ$‰Dr°SØ#‹–ñÞ]—0ãׯáö´.8õ¼}ç©Ûº†Â¼¬ýêÓâÅŸ0Þ<ÙØZZà ~ £ŠÍÏ‘bõËs'PœŸÉ;ï¼Ã¼ysq9]ûͯúI“`äHVƒ­#G²øØ–´]OàsEasLtÔuÐùÆmÛlÞ´‘óͦ-¦h ­W¯¢[;{°P8DQQ?üáyhš†¦i‰Q«â³äaÙ¼àm>o,`@¡BÕέlX±€—Ÿy‚7¿É`òU72s Eõà¯]Ì{ –³KÏÀeÔPºi%Ÿ¬ÜEÞ”S_”GNÍǼýæÇ”N«Žò-Ølu§Ð`ÝsÙ’?“Åø!&Kg¿Èb1Šc†f£‹F6-x›Ïùô/ìÞ±…¯V|Èì§›|8k€7Ň2=·QKé7_°xå.ò¦œÌ„¢äTõN³Žòo׳ÉΣ¨5^z‘%âp¦ 놆“¼Ýؾè=Þ~o9¥– á•;¾aͧËX_ß‹cOC7O7òKøÏë‹)seá ogÙì'yq}'ÿòBÆfk­Î)ÒüM¼´ï_{¿¾})--å . ;;ÇÃСC)--åÿfÎÄã‰~IÆŸ‹øCÏgJ¶{}>æÏ›KYyN§³Í¿Šu åkR—Üá‚ÞÝý„#õÑ7_—Ö°æùÔí*ÖÉ‘«$‰Drhî÷P¾m3ÛÖ.¥ïÄ“ÐÎf‚£Ž·n¿ˆ†’uû]p„B!*wWÒ·ßlÕCYU€PÄdki-[Kk EÌhÈÕÇ3ëâ£X±b<ò0ÛJJð§ùöj.®=±Âçal~!ýKJˆK³< (NZâ5T xb‚ã>Ÿ›°ÑµYÉMÓ¤jw‘NÌjÞ)Ñ ™6u“&Mn:ÿœ¯ª&¥ŸÍgÙ×kX²h}²„ÕÛ‚d ›ÁEW_Á™C3PEÑÈ8‚îõëøïÛï2oáG|²ºŠôÞÙ8y"2<äœH_e KÞ“wç/âã•ÛQúÁ„ž&_¾mðŸtx7ÜÝc¨¾‚9s–¢Œ›Ê°L›²å Xúõ–|ôQ̇æsÑÕWpÆt4EAQ42$·~mKŽ9‚éî¨lai²}'2¡§Éº÷ç²%ÿ8N:¼žœÁ Ñ¢>0öX†g騾b&3Ãf–/œË.ä£ÅŸ³Uä1hÌ$&)Ư9È>~lbᛯòö‚¥lƒ9ãŠë8ghZÌÏ–a;Š´P»×ëeÌèÑ)âÂëõ2vÌÜnw Þ\À$ UQÙ´i«V­Âãq·x¦öDÞp(ìæ lbáY:[+)_#E†D"‘HmáQ±} %«Óoâ‰h±ƒpC oýñB;¾¢àŽøÿäÒ¥ì.ßÎÙÓGñÐÍçqÂý9mÊ Î9a(—ž5†ß]:™ Êxçwx䑇Y¾ü3ÒÓüx<žÄ Ç}MØ0Xáó26¿WII‡ö©Ÿ4‰û|nj {uìŽöp$êpÒQ:œRŸ‡Ã¶áö;îdÒQG¥¼½MÍÅGrÃK´2Tlk ,i—öCÉÞVHV|4·xxUómⳓºl³nœ…¦))l¶Çðóãú‰õ8i|º±5ÏKÑ!‘H$’CŸeÕø{æ¸kÁ¶mæ?p%]ßPÐ=ó€ú!„À4M\.8’#Ž8’Q£FRTÔ“’’V®üœE‹1oÞ\‚øý>¼^º®ï÷yD2|~f5†Iûøãvǽ^×^ Ž. ·ŽŠŽ¸xhl rØaƒy衇ñ§¥%ÂCâó$‡‘4Ûü;n—H¾o4¿¿› ‘4dtòß õõ\sÍÕlذ¯·©÷¤#¢cdqê”U[m):$‰Dò½¡´¼–`8Êãu;é‘›ñý·,›p$L(& c&vln7Ý¡ãrºp{\¸œ.4MÝï‚££Â#*8œÔßIÝé­è@c#§žv*iéé [rFrÏGò¡ÉÂ%.LÚÍ{L¤]Ú{óg!Y€4ñgEUÕÄsàOKãô3Î`ÅïWàñ¸;ü%e™Q‘ÑÜ&‘H$É÷…üî…Š¢ ëºîÅçõTuThà·GMh£!o@ÀøÎüëèHîå1|$Ó¦mÙ-T)ûØMa%‚¤ù;ÔØ åŠÚ4²O³ý“‡Ý•vi?TìJtFI4UCÄfSU•èó¡©Z"ŒJ!šÃ‘IZóy äüÒþ}°Ç߀Ä'ÊLž«&~ÿÇÇ×ÅÇIóû¹îÚë1L“p¬Y†!J$‰D"ùÞŠŽd±ŽD¨««çÖ[ÿȨQ£ˆNP¶m!„m[€@UT5:q^|›h{K¤ØA`Yf‹m㟥]ÚE{üyˆÿ­ëZÊ3 „X„°eÅŸ!!lFÅþpuuõ„#‘Ï£D"‘H$É¡F‹!s›Ç£7ƒ„Ãî½ç>¦Ï81:G¬Ç¢)|ªõ!s ³±u¶iñÞ MÓRž§ä}’G³Š‹‘ø>š®£@l@ $60­¨êÒ5—ËÏã&#ÍOf†M&½J$‰D"‘H${…¢(„ Ç}ÈÌã¥we§`(Liy»«jéÑ#‡Âüîx=n´X¢8DsB,Û¦1¢¬²ŠÍ[wÒ-;ƒ‚¼n¸]Ny·H$‰D"‘H$]$|¨õthšÖá-Ëfû® *«ê8¬_/ëßUU‚ÄLÌÉjKSÒý>2Ò|ô/.¢ªº–/¿.!'+¢üî±Ù˜%‰D"‘H$Ig8”«4M‹‰Žôʄ¾ڼ‚¹1ºŠª lÛÚóÎB؉â»eg2!3»*ørãöí‰Ó¡Ë»F"‘H$‰D"é Š¢‰((‡DxU“èh‡@cˆ ›K2 ™iÑYÇíΟ ˆeÙ÷,È#ÍçeÍW›Y½b©‰D"‘H$’ïŸÏÇÄ èÑ£Ç!áoøPëéÐ5=uu„Â6lÞÊáÃáq»°í½ŸÀ¶-23ü>l n‡‘ƒûKá!‘H$‰D"ùÎ(++cþüùœqúi‡„¿#>w×ÁßÓ¡kêžz:,Ëæ«ÍÛ2 /n—+eÁ½6n—‹½{²á›­û´l‰D"‘H$‰¤3äåå gG"mÍÃ}Сiª¦·Ý𽬂üîÝÈÌH‹†F öé"l›4¿‡ììtv쪔w»D"‘H$‰DÒ¾æ b‡Šæ@Óõ¶{:‚¡0•Uuäçåb[©R…ÿüç?¼ýöÛ‰ás÷„ešôÈÉfWEUR7‘D"‘H$‰Dr(+¥eoå‚B$bÒ•®e~udé’èhÊéhIiy{¡©ÏŠW…‡~˜7Þ|€êšj.¼à‚v÷W„ o¯lÛYF¿âBy“J$‰D"‘HQ­m˜ñÅ*Þxó Ö¯_OUUÙÙÙ <˜ÓN=Q£Ftyô©®ì¦( =þ8¯¾úZ—ŽyÖYgråWtÚg=>zUóÝLË¢²º–þ}{awFp<ò(óæÏ§OŸ>˜¦ÉßÿþÎ?ÿüv÷µl‹ô´4¾þv½{æwhæòÚÚZ–-[ÆŽ;(,,d„ ddd´»ïºuëp»Ýôë×ï ¿qËÊÊ(//gèС¨IõÒ–ý`Ķm>ýôS2339ì°Ã*¿–.]Jzz:Æ “ß’ÑuyõÕWÉÊÊbÚ´ií39|øpy±$‰ä{ÈÞ¤e+ŠBEe%úÓŸX¿~iiiø|>Š‹{`k×®cÉ’¥ |7Ýt999nÄ7ÏZè o½õ6ÅÅŸÝî÷\!ƒ¼ÿþû\qÅ>¦ÖV"ym]€ÜnYjüÇ+ø‘GeÞ¼yâ÷û¸üòË;|2 6¹ÙT×Ôµ»mMM ¯¼ò ›7o&‡Ù¼y3¯¼ò 555íîÿå—_RQQÑf¥îÚµ‹êêêÙ÷ëM/Ÿ}öeee)¢-ûAûð Á–-[¨««;èüÚ±c ].#‰ðá‡ò׿þ•¿üå/,X°à 8·U«V±yóæCòËÞ²,fϞ͚5kÊ{9þìI$‰äàeã·Ûh †ZØCá6•ì—c*ŠBYYW\q%¥¥»èÓ§………äää••EVV999Ò§OJKwñ‹_\AYYY—ÖºÂ~ðƒ„ŠD"Z #:<ïYgÍìÒ1Ûœ°¶.@Nv&Bˆv»nš ·ÛM]]§vgžyf‡G¥²mAFšŸÚúè±÷Ä’%KƒôêÕ‹©S§°`ÁJJJX²d 'žxb—/„išÌ›7#F••Õ®}¨¨¨hñ¶7ÙnÛ6ëÖ­cÆ Ô××£ë:ýúõcüøñ8ŽgëÖ­|þùçTWW£ª*}úôaâĉ¸\®rž›6mbáÂ…Œ;–#Fì—c”——³víZJKKñz½œ~úéû¤Ü+V°cǦL™‚×ë¥#óÞˆsÿÕ¯~Å…^Hß¾}÷Ycû£>â¹çžcóæÍ8¦L™Âµ×^KZZÚÿÌ?±¶žI‰D"‘¯DlÛÆ4;Ÿƒ­ijk9Á¯»CŠîÑGeþüùáóù0M“™3græ™g"„èTò‰Ë©h u¨‘lYS§NÅçóáóù˜:u*–e±eË–ïÍC³mÛ6t]'//¯M»¢(†Á°aØ>}:#FŒà«¯¾â‹/¾èÐ1Âá0Ë–-£  €iÓ¦1jÔ(6mÚÄÒ¥KØ9~üñÇûõkÖ¬á½÷ÞÃçó1yòd¦L™²OzˆlÛ¦´´”¾}ûÒ§OòòòÈÉÉ9¨Î}_ÑÐÐÀ#<˜1c¸óÎ;¹øâ‹™;w.>øà!1êþ~&%‰Drðг ;é~»«kyýƒ C„ÂÞ˜û e•Ux=NzíÛïqEQxÿƒ¨ªª";;MÓðù|\sõÕôîÝ;Ñcп®¾ê*\.º®“MUUó,8`½–eaF$Ò¹%&˜ºB4§C×[H¤p$‚ËáHÌ ÞVå>öè£,X°€ÂÂB¼šª¢kÏ?ÿ<>ú(¡P(Ñ 1M“ð—çžkµ‘"„ÀáÐ …#í: èÌ‘q|>–eu¸2¾þúk6lØ€mÛdeeqä‘G¦4$–/_Îòå˘:u*………­Ú{õêÅÒ¥KÙºuk¯ÜÜ\Æ—˜ÑRÁúõëùâ‹/…BèºÎ„ 4hÁ`×^{^½z1iÒ¤”íÆ),,LéqhÍ>zôèÄú‚‚JJJ(//OÙgÍš5¬[·ŽP(„ªªdeeqôÑG“ÍÌ™3oè‹‹‹)//§¬¬ ˲°m›—^z‰#F$ÞÄ×ÕÕ1gÎN:é$ºwïÞîù·Emm- .ä˜cŽI9ñ\‹öÊ´m›µk×òå—_ÒØØ@ff&cÆŒ¡¸¸€]»v±zõjN?ýôvó}Âá0o½õ^¯—N8¡ÝsÏÍÍŲ,6lØÀ† ×bÔ¨QضÍêÕ«Y·náp·ÛÍqÇG÷îÝÛ=÷Å‹SRRB(àyyyôîÝ›7R]]®ëŒ1‚‘#Gîñ ê©§žâ©§žà¶ÛncÊ”)±\«¿3gÎèÝ»7W^y%&LH|=ýôÓÌ›7/‚øë_ÿš“O>™^x!Ñ{vôÑG³fÍÖ¬YƒišÜ~ûí¬[·ŽçŸ§ÓI àÌ3Ïäg?û3gF»bß}÷]î¾ûn^ýu|>Ï=÷¯½ö 0€ë¯¿ž¡C‡&ü_ºt)§Ÿ~:UUUôèуŸÿüç{ìaØ›s³,‹çŸžÙ³gSSSƒ¦iôíÛ—›nº‰¤<{¬P"‘H$ÇçqsÆ GóÊ»ÿ¥²ª†×Þ]ˆ®k”ï®ÁïópÆ G“žæÛC ]{™¶dñb²³³q¹œ†I·nÝèׯŽz±iÓ&úöéCÿþýÉÊÊ¢¬¬ —ËIvv6K/æøã¦uâØ]ËêP…'žx‚×^½Kçxægð‹_\Þ鎚®Ç«š+ ÛFU•6ÓâEáå9sxÿƒèÕ«>¯7ñæX×uºuëFzzzŠC–e±mÛ¶=:¤ª*V;3ž?ÿüó‰n{ï½·ÍmÎ;ï¼=–“••ň#BðÅ_0wî\Î>ûìÄy 2„¤„4·ÇóâxÃ0X¿~=ï¼ó§v999TWW³téR?üpzö_¾¿N IDATìIcc#ééé)‚«ùÅ ìÞ½›1cÆtÈomß¾êêêDC ¢!@kÖ¬áðÃ'//ºº:/^L H¨ñä2‚Á iii¨ªÚnx\Gο-•ýá‡2dÈŠŠŠºTæòåËY»v-Æ ãÿÙ»ïð¨Ê„mà÷9gzM' ! AzA¤ ˆb»¾²º®k×µïÚßu}¿µíÚÐU×U׆Š(‚€Šˆé½÷–BH&eúÌ9çûc’I&3©ÌDïßuyIžœ™9-3Ï=OËÎÎF ÀòåËáp8——UU±nÝ:¨ªŠ¯¾ú n·©©©8í´Ó¢‘,ËXZó-äI“ IR‹»„C‰ÉdŠ8çÇGzzzøœ¶äØ‹ŠŠ’’‚AƒÁçóá§Ÿ~±cÇpê©§"%%‡ºuë••Õä7î3gÎÄôéÓ™™™PU³gÏÆœ9spóÍ7£GX¸p!î¹ç¼öÚkèׯEÁ²eË““ƒx²,‡'\¨ß]O–e8dggC’$Œ?K—.Eee%ÒÓÓQXXǃU«V…CÇŠ+PPP‹Å‚^x‹/Æ=÷܃ŒŒ ¼õÖ[¸çž{ðÑGÁh4—™5kºté‚Å‹ã±ÇCrrrDÈ®ÞÚzlªªâµ×^Ã|€ßýîw4hŽ=ŠgžyÇ‡Ž¦þöˆˆ(~Š‹‹ñôÓO‡ÇÔ§Õjqï½÷6ûŦÙdÀŒiðñ‚ïPZïk5›0cÚØ› mWQY£ÑQ!Š"6n܈Ûn¿•••áÁâ|ø!~õ\.ÒÒÒ Š"ŒF#J—ž´ó»`ah ¹Ñhlõ@ò%K–àæ›ojõkÖéˆýìM&'¯×»Ý£ÁQi•$ FI‚Ñ`ˆª‡¦ küy[š<—mÒÒÒ››º1Íf|ñŨ¨¨@JJJ¸òXûoá¿aymËJRRR¸Ù­[7Ì;ëׯÇäÉ“á÷‡Zo²³³£*áF£1æ _„N§ 3Þ\yíØÈÏÏ#¯×‹mÛ¶aРA:thx_þùç˜çeÇŽp88ÿüó[ÕÌ×ÔñÇR;HxðàÁmzÎúÇuê©§}Ó]¿b QZZŠœœôíÛZ­6ÜÕjÆŒဠ( –/_Žªª*œwÞy­þ»¶ïfÝ߆[·nŰaÃb_K=;;@¨ueãÆèÓ§´Z-222°gÏ6:ÒÒÒ"fhs8˜;w.®¿þz\qÅ€¡C‡bçÎxóÍ7ñÌ3ÏD©‘#G6úÜóæÍþ}ûðúë¯CÅp ÅÎ;‘žžŽ7BìØ±^¯‚ `Ë–-8ï¼óPUU…ùóçãß÷Ýw.»ì2ìØ±#|ŸŽ?]t`Ĉؽ{7Þ}÷] :4êÞ¬¨¨hó±UTTà“O>ÁÕW_ë®»Â-e-ùÛ#"¢øÊÌÌÄ¥—^ŠÏ?ÿ={ö  º{÷n\pÁÍŽú_fK¢Y}Y-‰¡n>‰¢Óé ª¡qÊÁ`&“ @ÉÉÉá1III0á€r2[Ð/»ì2üðí pÑŵé5]§CE‚2´±Ñ¾úê«Q^îÀîÝ» ÑhÂ-²,ÃëóÂëõEµtävëÖäHbÓ7C[¯4§¶›–Ïç‹Ëói4dff¢¨¨²,#-- ™™™X°`zôèþýû7Ù÷¿ö+'''|“6U^[)Ÿ>}:Ž?Ž5kÖ`Ù²e˜8q"ª««Cç¾&`5eÛ¶mX¹r%&NœQ‰>ÑãoÈétbóæÍ˜:u*$IjQ—¸†ÏYUUEQš<®Ú¾‡á üèÑ£qèÐ!>|½{÷W”UUÅùçŸ"'¢ººŠ¢„_óDÝf³! B–ehµÚð›Sm÷«–*,,D0Ĉ#"¾1:t(V¬X¿ßßìXUU1wî\¼ð xüñÇqÊ)§„N÷îÝñý÷ßcôèÑX¾|9®½öZ|øá‡(,,„$I(++ÃØ±cQTTî’õ׿þ5âù›UN«ÕbàÀX½z5ü~Ô›ó‰[aa!ÆŒÓê¿I""JŒÓN; Û·oÇ¡C‡™™‰ââbôêÕ+¢'GS<^>šÿ5JJËa³˜kºW9ðÁçKpùS`1ã¾Ï]»vÅÁƒ‡ ª*f̘]»váÀý¨ªª¯Óa2™œœ„‚‚ÈÏÏÇçŸEQ——{RΫªªøÝ¬Y¸þºë[¿®  (ŠÜ¦º¸¦±–½N·Ç »ÍÜxŸ-UÅí·ß†—^z»ví„Ùl(ŠÊA\zée7n\̽•e9f;‡ p{¼0èu'=t$bàNýçÔh4˜6mŽ=Š7â‹/¾À!Cbv©­´6ì"ÕTymºÎÈÈ@FFôz=¾ÿþ{8ÎðõkîëŽüüüˆã¡Å]ZrNk+y_~ùeDùš5kP\\Üh¿ýXÏÙÔëÔþ®v\Híµ¨sP«K—.¨¨¨À?ü€sÎ9'\¡më±7Õϱ-Ç^û7ZÿyEQ<é¸UUŧŸ~Š_|O<ñ&L˜q^'Nœˆy󿡬¬ {÷îÅwÞ‰+V`ÕªUáÁr¹¹¹Ø½{7ࡇ ¿ZM…ñúSÄSíõm*p5õ·GDD‰qå•Wâ©§ž ·47×u¾~àøpÞ"—–Áf1㊠¦@£‘ðÞÜ…(=^†÷ç~…+/:³)®û;iâ$¼üÊ+0X·nîºóN¢B]_ }žÉ²ŒgžyŠ¢ÀívcÒÄI'í¼¶f t¼4Ú½ÊdÔ¡ÌQêó¦6] ¹õ–[ðò+¯`×ΰX­ `öìÙp:˜2yr«*FŽÊj˜›™5+Ñ'IH’ÕêÑXyc•˜cÇŽÁn·‡+Œ‚ ''999X±b¶mۆƜÖvÿþýÐëõHOOoQyc•mEQ­8ÅÅÅ>®¨¨(fà¨}.N‡²²²VUâêí5«½òóó#º¨È²ŒÅ‹£G.Ò×ð9- Ahò¸t:L&Ž9‚~ýúu}òz½Ó§¤¤`ܸqøâ‹/°téRL™2’$µéØ„÷­°°0ª+N[޽-ôz=*++#ʲ³³¡Ñh°fÍšpw¨@ €õë×£  :®ÉP¿~ýz¼øâ‹xüñÇ#G­3Î8ÿþ÷¿1þ|X,äää`Ò¤Iøê«¯ Š"&L˜½^¬¬,ˆ¢ˆýû÷cêÔ©QÏ«¯×ëźuëУG˜3'rlµ]Ô6nܾObýMêtºfÿöˆˆ(~t:n¼ñF<ÿüó¸í¶ÛZÜÒ¼mç^—Âf5㪋ÏA’=4¦òª‹ÏÁ»Ÿ,@éñrlÚ¶ £G ‰ësC†A‚>r«W¯Æ /¾€~tºÈÏ-¯Ï‡W^™›6Áf³¡GA† å$Ð@òÙøü‹/Úôø Î?¿mÉC³WE‡»Õ‚] G^v³Oªª*n¹ùæPðØµ &£III˜={6TEÁÔ©S[´c‚  °´{7½®@"Z:ž”¤¤$ìÚµ+\Á0™LHOOYžšš Ôß;)) ‹{öìAee%F ô-éÑ£G‘’’Û¢Óé ŠbÔìU²,cÏž=ÈÍ͸«<`Ó¦MHMM…N§CEEÖ®]‹ÔÔTX­V‚€üü|¬Y³III8tèPDe~õêÕHOO‡ÅbÁñãÇÃ×#)) ’$¡{÷îØ´i6n܈´´´˜‹ü5uü‚ @¯×ãèÑ£¨¨¨@RRRć,ËáTµ³5÷œF£=zôÀêÕ«!’““Q\\ÑåH’$ôíÛk×®ÅÖ­[‘žžŽuëÖA¯×G à¶Z­˜ø`8ä{î¹xï½÷ Š"† ·ÛŠŠ œwÞyá×ù%%%øë_ÿ AP^^ŽY³faôèѸÿþû‘””ÔæcKMMÅ„ ðꫯB¯×#???ýôS³{DD”x™™™xøá‡Ã O·ÄðÁýÑû”üpà‹Ù„kfž‹[ã8ÂubEÁwÜ¿=õ7èt:üòËJ¬\¹cFA~÷|¨ªŠ}{÷á§Ÿ†Àj³Án·ãŽ;îhrÆØx[´x1zöì ƒÁЪÇy<|ûí·mH®©ÓÑ0Øm¸œxý~h[0àFUUÜ|ó͘={6vïÚ«ÕŠì¬,¼ð⋘2eJ‹B‡×ï‡ÏëCr’­Éírss›]‹#Ö ÐÖ$ÀÑ£Gã»ï¾ÃÒ¥K!Š"N=õTdddÄ,¯ ¢(býúõðx<°X,8ãŒ3••¾H6lOëšššŠ3Î8#b~í9ªªªBUUUÄô¹M•×–Þ¼y3EV«E~~>FŒî.2nÜ8hµZ¬Y³@ ¼Ï‚ „g!’e_4H½µ3E 2>Ÿëׯ‡¢(E©©©7kSÇ_{®~øálÛ¶-šÓÔsÖ^'­V‹µk×B–åðqÕ7pà@ƒA¬[·@iii˜6m CT?##ÇÇÚµk‘ŸŸÔÔÔ{,£F‚Á`À¶mÛ°~ýzh4Œ=ú„ÆÊ´äï°ÖÝwßGy?ü0´Z-þð‡?`À€¸é¦›`2™ðŸÿü.— ùùùxúé§#¦ªù÷éõbÿþýðûý¸á†"~÷Æo wïÞÐjµ˜9s&ž}öÙp Fvv6 Ë2ºwï¾vwÝuRRR0oÞ<¼ûî»$ gžy&¦OŸQ1|øp,_¾úÓŸ}ûöÅ‹/¾ˆ>}úDoýîƒm=6QñàƒÂd2áµ×^ OáÛÜß­ áÏáá±ܵ˜M3rH3Ÿ§mÿ¹ M•ߥK8|·lKB“ éôz èt:Œ5 W_uUÍ@ùV¾h½Ùr[»¿—Ìœ‰ŸkÆ;¶†,˸ð ¡¶á55’᱇Tï¾÷Á¨_î=XÏ¡ý{¶¸O» Š˜={6vlߎ@0ˆÓGÂ5×\ÓlèE¶îFjj2NÉÏéT²,cîܹèÖ­FuÂÏ·fÍìÚµ —\rIÄ·ª•·…ÃáÀgŸ}†éÓ§ŸðL<ñ>þyÎ`0ˆ9sæ _¿~2dˆÚjß¾}¸öÚkñꫯÂãñÄíoˆˆ:–Úñ‚µ^ýu\qùåmz.A°ü‡ðúë¯#99IIIè߯ ‹ŠPáp@EØìvôîÝãÆŽERr2äšË[K£Ñ`ÉòÕ˜2~D«{i4ˆ’Ô–qäPä¶ $öé§jÇtDl×ÌT|ýÃZô=%z¦E'DUÜtÓ1wîg$ ]xaxš²¦.ÇëÑ’2 Ðû7}ã˲Œ}ûö!///ªkU¬ò–Ú³gA€ÅbÏçÆ `6›#Æ5ý–-^¼¢("##ÕÕÕxûí·‘‘‘¼¼<,\¸°Í{DDÔ±Åî~Û¶¦Žªª*|ôÑG7nΜ4 }úô¢(¡×¨7\Q•På=àoó~«P¡Ók ¶rq@@0pRÏs“ëtô: ìÓ?¯Ý‚Ic†µpp‹ UQ1cÆÅ¡ƒ’›OB¢(bź-: W³3WýÚ98Έ®M•·4Á;v {÷î ÏÇܵkWL˜0•("„Æ5mÞ¼ß|ó \.DQĈ#ðÈ#Àëõ¶ùoˆˆ~[l6;þõÚ«PTŠ,Ãï÷%îÅTz¦í}ÁN2I’ üýoO¨7ÝzG£ÆËWmFzj÷ë÷Qõ¢$aÃÖ]pº}˜4fx³k%J¨{Õe¢¿nË. Ðë¤OÛ³_ú'D©‰â¢(bôðþØuà-‚(‰ˆ¹rÿ‰’ˆGŠp°°ãG eà """¢vS\\^j £SU@§Õv–†ŽÆ§Ì­O§Õàìq§bÞ×?a`ïêðÀò¶.L&DQÄÚÍ»°mÏ~øExû?ûx§Q»1›Í5ª³,«B¯Ó ­ãONzèÐ41¦£>£AgÇ’åkPXZ†3N “A¥5sf DA€ÛëDz_Ö#ââ©ã¡Ójx—µBÃE;tè$ˆ’Ô²J¿N«Á9OCºÝŽw>þ ¿¬Û šrKkFæ !£¶UC”$øA¬X· ÿùx!RíVœ=a$Q+©ªZÓ½ª³ $ׄl)Q0tÀ)èÓ3k6îÀëïÍGfzúô솬ô˜ÍFèkfDòùp:Ý(¹˜~ÖHԜΒʈˆˆˆˆ:"­&T‡ï õê&×éhijé‘×=òºòʪªB§ëLÝ«¤¦§Ì%""""¢X‘ïDËMH’Q£aè """"¢ÄÐhØÒADDDDD T3¦Cƒ?šÃ³ADDDDDq—j7Cg-}gƒˆˆˆˆˆšdþÇüð¿åå(+=Ÿ× 4Z &“)©i0[,áí~üþ;pu>"""""j1YVp`ßnx<t/8©©éÐhµ¨¨t ¸ð(\Îj¤edBC‹‡‹„`ña(e%PÜN¨>7Ÿðy ¸A’½ ¢ÉÑ`tˆ4]!eæBSóŸ”’O01týÖÈeÅðo_ßöµðïÞ ¹¬PZÞ‚¡Ê2ஆ쮆\¯Ü×`;Ao€&;º^C ë7º^ƒ!L¼DD DDôk£ú}ðmü ¾-«áÛ¾riáÉy]Ÿý;Ø¿®ÅB$hòûBßo ƒÇ@Û£?/CuÞ¤¡À¿s#Ü?}ßÚeP<îöß%YF`ïönsþ;Ðdt…qÌ4OŸ)=›×Œˆˆ¡ƒˆˆ:¹¬îï¿€ççEËJ:ô¾Eõgo zÞ›Ðõ ãè³a<} ­Ž’ˆˆ¡ƒˆˆ:\¾ä0\ þ ÏŠ%PƒV?^JɨÞ Rf.¤.9ì)tD½‚É ¡ç÷{¡¸ª¡ø<€Ï¹¼ÁâÃD°ø ä’#áçÍRUøwn€çTÏ}–³/‡ñŒ 8þƒˆˆ¡ƒˆˆ:‚À‘½p~ù¼«¿kñ`pA’ Éë }ßaÐõmAˆÆ–WðÐh!™¬jÊ´=¢·“¥ðïXW3h}äãEÍ>·RY†ª^Fõ—ïÂ2åR˜Ïš;DDÄÐADD'‘â(Eå‡/Á»z) ªÍn/š,0Œ˜ý1ÐõÑhNø>JÉé0ž>ÆÓ§†BHi|Û×»êø¶­krÍÕU…êÏÞ€kѰœ? ¦É—†¦ê%""†""J,U–áþæc8çýŠ·™Áá¢ÀÓ`s6ôCÆBÐéÛp¼nÀïƒêó@ñy êÍV@gµz´4„¤gÁ”>¦ñÓ¡8JáY±žŸ!ptã¯íq¡ê£—áùé+Ø®¹º^ƒy1tQ¢øwmDÕ»Ï!pdo“Û f,S/ƒéŒó!Z“›2>/‚GöÖŒÇ-,>¹¼ª§éq‚¤`²BJÏ‚&+š¬šÅ³ò ÉÊktq@19æs®‚ùœ«8°ÎEÀ»ê»F[?Gö¡ìÿn…qôTØ.»¥EÇEDD DDÔBjÀê^†kéÜ&»R‰öTX¦] ã„óš„­üìÛßöuðo_‹À¾mm|ª„Zí€Rí@`ß¶Èý±Ø¡ë3º¾Ã ï;<BbÐæ÷AòGð¢ß‡Ãÿ¼ªŒñb*…o÷f$ßô84]ºñ†!"bè "¢–RƒT½÷¸—}Þè6Úî}`¿ö^hózÇü½ç8¿|¾-«:ä1îDààNTÏýŒãχuÚ“Ó#?”r{"í¡Wá^þ%ª>~ª«*:TÜ…²Çûõ†aøÞ
k ˆ ¬Â·y%œ_¾ ÿîÍäx½p=žï>ƒq.kE¼ IDATì9°œs¤ôìz,Â4á|†O@å;Ï„Ö#i@ñ¸àxùaØ®¼æ³fò&""bè "¢F+à®*”=wO£Ý‰4]º!ù–ÿ…¦Û)Q¿ ÝÊÿ>ÿŽõó؃¸—}Ï aš| ,çÏŠ /ZìH¾ùáúæSTÏyjÀßà T½÷(Uå°^tC£³fCÑo–\VŒògïF°è`ÌßFž û¬û¢õS¼n8ç¿ ÷’9mžª£…×Wïûê[Ø®¸=ªË”ù¬Ðõ€ŠÙ!Xr8êñÎùï@©,‡ýÚûQäEDÔñÝ™ˆ¨KŽàø“7Å ‚$Áþ?÷ ù¦Ç£‡oÓ/8þÐ5p-|ïW8"CX /ýŽçï…â(ø6¯7R}†aãb>Ö½üK8^y8ö´»DDÄÐADô[#;JQþÌ]Qktz$Ýò$L/Œ(WeUÏFù?î…\Vò«>?ÞM+Púèï¢Æ¸ˆF3’oy¦ çÇ~ÜÚïQùæßš\ׄˆˆ:ˆˆ~õ·Žçî|¼(:p˜¬H¹çy†Ž )e%({êf¸¾÷›©P+Õ(înT}<;rÝQ„ýÚ{a9ïb>γb ª?}7QÃ1DD'‰êóÂñû8²7êwbRRî~Úœ‚ˆrßÖÕpÌ~4æÔ±0Û5 Rï¡èÒo,©±+ð‚¥…ðÜ ßþíðn_ÿÁ]?À¨*\ ßC`Ï$ßú$DkRM:`½øm)¨zÿ@U"æ\ð_ˆ&+Ìç\Å›Žˆˆ¡ƒˆè7DQPñÚcðïÞ8¬IH}à%hºäD”{W}‹Š×ÿÚøØ W4¿|ÙãÂa­)²€Œô4 fqfèr{B—Û–qçäŠ2¸×~êï¿„/Æ>u$þ]QöÔ-H¹ûYH©™u™ë¬™€(¡ê¿ÏE¨ªO^…˜œãéSxïuÒe—Ìx¬gï¾<DD T=ïM¸¿ÿ":p˜,H½÷Ðtí™'¾ù•oýPä&ŸWø Þͪ%ðîÛ—Þ sv.Äffq &è úÂ:ñ˜O›Õí„ÿè¾Ûú¡8+áYýôýGB²%‡ËuÝûBÐèàß¶&ê1¾M+`<¢=•7 QœlÞ¸C‡ ‡¢(T¨5Ÿª¢@©÷ B¯7`ë–Í0 ÓAD”h¾mkàüòèÀ Ñ"éÖ'¡ÉëPæþ Uïý#ªÛP£"¿l¿ÿ3r®¿¹§O€F’Zµºn§ ýÖ¿"çÙO`2¦ÃžGÅQв§n‰ZÑrîÕ0Oº(j{5à‡cö#P }ßáÅÎÿ…sþ;-|!Ýúèöä;Ht! ÝzD¯XÞ ÚÌ\t¹ÿŸèrïsl)ò|ªîj8þq/‚‡÷D”Û®º+fWª`ñaT½ýwÞˆDD DD¿ÖÄ¡ â_O@©,ú•õüY0œzFD™kég­šy)8ô È9=Qr¬G qähè¿â’”/ƒ£¢n·»¦™»åLÃÆ£ëß?„¡ßðŽyZÝN”=}'‚%G"˜ýwÄ\¹Ý³ò¸—}Îû‘ˆ¨q 9Q‚¸}_Œ±ú¾Ãa9oVD™wý¨zïùV©ð/ÿA¿ð{¡Ê2ªÞUgt&¨ö ½+t¶dFجV˜Í¦fŸW²§ óQúÒCp­ZÚñ‚GuÏ߃Կ¼žÕJÐê|óÿ¢ì‰ë£ºTU}ðt½‡@“•Ç“ˆˆ¡ƒˆè×A.-BõoE•‹¶d$Ýø(Po w`ïTÌ~$º Vsoàk[Ì6¸Ó²áÊÈÐo$RGŒGRjZ“´:¤ßö$”ÿ»ž­«;Ü9–AÙ3w!í/¯BÐéCç$³l×Þ‡ŠW‹ØVõûPõîsH¹ïŸ¼9‰ˆ:ˆˆ~ªÞÿ'TŸ·Aâ‘ô‡G!ÚëÆK¨®j8f?5àOÜ}Z&ŒƒGÃÐkô½A›‘zš -º<ø"|{·Á·c=Ük¿‡w÷æ3ËUðÐnT}ðì×Þ.3žvü;ÖGu©òm_ Ï/_Ã8j2oP""†"¢ÎÍ»þGx7üUn>k&ôýO­+PUT¼ù$ä²â¸ïƒh4Á<å2XÆO‡!ûĺ ’†^ƒ`è5öó¯E äª—ÌAÕ’_Cä$r/ûº>Ca<í¬p™íŠÛáß¾6rÜ€ª_‚~ðhˆF3oT"¢“ˆɉˆâHõyQõ~t19–‹~QæZò¼ëŒï˜¬°ÞòWtû×R¤]~Ë ŽX´]rrÍŸóܧ0Ù!Î{ÕÛG°øp]PÒéa»òΨí”Ê28ç½É•ˆˆ¡ƒˆ¨ór-úòñ¢¨rû·C4Ô àÞƒêO^‹ëkKcÏCæ ó‘6ölˆšÄ7dkÒ³‘ùÀK°M»²ÝÏ»âq‡ÆqÔ£4 †á¢¶uû)‚Ey³1tu>ŠÇ ç’9Qåú§Á0bb]ª¢âígâ×5I!]ûºþñ!Í–“ü)""õš»`;­ÝÏààN¸¾ý4¢ÌvåaTYnùZ(DDÄÐADÔ‘x¾û ª»:¢LÐha»:²›û‡/Ø»%n•~aÖ_ÐuòÅZ¹yÜÒn|Æþ#Úý8?{#b])%–ó®ÚλêÈ¥…¼i‰ˆ:ˆˆ:Õïƒsñ‡QåÆ1Ó éÒ­n;WªæÌŽÛëϽYãφ$µïÛ¹ Ñ"ýާÚ}%sÅãBÕ‡/F”™Îš Ñ–y½dÎ…ïñÆ%"bè "ê<ÜËçC©rDVÄ% æs®Š(«úä5¨®ª¸¼¦Ük(’§^½^ß!ÎdMBêu÷·û~x~ùþꮃNËÔË£·ûq!G)o^""†"¢ŽO•e¸}Uny&4]ëBBY zCû^“ëáß½¹îÃÎh‚yò%QÛy~^Ü!Ö!"bè "¢&¹þ*ªÌ0d4´]»‡V*ËáþáËø¼ V‡àˆÉH²ÙÚõ¸·ï)ýO.Ã…¿ûg^ò>®½õs|³|?¤¤Tئ\Úî×Åõeä U–)—D…!ÅY ߦ_x%W$'":ŠÇ_ŒþŒã¦Güì\òT¿/.¯)÷ X“a0ÄnM¬XWˆU뢸ĉ$›“ÇwÇÈaÙq;î¢c.Ì~w#†ôKÇ„‘90›´(,®Æ¼…;Qîð`æù³PýͧP<®v»6ÞÍ¿ xp4y½‚É Ã±ð¬ü&b;ÏÏ‹`6Ž73CQÇä]½4*Lˆ;ôƒF…V~¸—}·×”{Ñ`€ Q¿Ûº« /¼µÇ»1nd¦L(€V+¢¼Âƒ-;J1 Oz\öÁåàùG'B#÷áªpðH%`¶ÂvΕ¨øôõö»8ª ×·ŸÂ~݃uapÌÙQ¡Ã·iTW5³•74CQÇãùyqT™qÔY¤º·W߆Ÿ¢Öïh3A„Òc t:]Ô¯Ž–8ñ÷WW¡[¶OÝ?)IÆ„÷)ùIþ./ǰ5•óþ U–Û/®ù¶«î w«Ò÷ Ñž±–‡ðóê[˜&^Èšˆ(A8¦ƒˆ¨”ê øwmŠ£§5LÚüš9P–˜ .ûå0† è‚Çï“ÐÀÑRRRLÃ'´ï5ò¸áÝP¯û›(Â8jJt8Yû=oh""†"¢ŽÇ¿c FÎܤÉÊ…¶{ŸzÁÄßæø TV“»„*ô1Ôi%ÜpÅÀv_(°>ëY3Û}ömãMMDÄÐADÔ±øwD‡]ßá‘ÁdËʸ¾¦jK( ZX Ùnèx'I`j癡TY†oëêˆ}Òõ#D®åMMDÄÐADÔq(ŽR‹5¨`‹Ð÷R¯²„çÆøV k¨+ŠÒ¡ÎÇw+÷â®ÿ››‹÷毇\oÁ@ãбí¾ …>FèðÇh¹"""†"¢ö«ÄÆhåÐæö„`ª›v5°TŸ'!¯/·2t8Ý>øüÁ„ìËœEqÇS_àÛ_ö`õæÃر¿O¼R7-­±ÿ:}»^/ƒÐ«¥#°oTŸ—77CQÇ8¸+ª¬aEÖŸÀî:@ EÛ­ÙzÝöF_ù N¿âeüùùE¨tƯb­ªÀ‹ÿý9üsnVþ÷ö)(¯ò`Ï¡2€ ÓC_Я]¯—\V‚`É‘ðÏš.Ý %G®Y¢îçÍMDÄÐADÔ1ÈŇ£Ê´¹=#CÇŽõq]! ~ó¡cÓÎ"üþáO°÷p¨òŸd3"'ÓŽûžYÑýéDTT{"B̾#å8óº×ñýê}8pÔQÈòz¶û5óÚš•Êë âÍMDÄÐADÔ1Īœj²ó"~ÙÿÐQ -iéxö?Ë¡(jøç©czáæ+NGnV2|¿#.û“l3"=ÅQVZî„ ½òÓêBG·SÚÿšÙñ³”•½MÑAÞÜDD DDíO ,-Œ*—2ºÕmãqB©rÄÿM»¢4ôüª ¿¿éu%vî/øù³o¶àç¾Â¼o·bû¾cqÛ§û¯Ÿµ6ÈUÓ‡!7«nÕrmG Z§4]ršÝ†ˆˆâCÃS@DÔ:rÉ Á@n19¢ÑTWy-LÌ7æBE]Xðú|Ðétn›l7Áí­ ÿìö°py¨…#-Ù·}š2¦²3l˜¿l;¼¾ÆëŽÉ£#»SI[û‡ŽÂ‘€1Z:d†"¢V›?onøß“ΜÂÐAD—ÐqìHô›if·È n‚*¯By I× ›ÕÚè¶—MŒçþ³<ªÜlÔáÜ }âº_zfb@ÏÌÆ÷[×ö5Dmª‚(>Áj-Ô ÐúëV~ jÀA«« ¹ÑÁ„c:ˆˆZí²+¯ ÿ»´¤„¡ƒˆ(.¡£ÞêÖá7Óô®‘•×D ƒ’•¯·éY¨þçüa8p¤s¿Ù.³[ xòγ‘™f=©çL4[·½^±W5,ý+¡ÏwCëÆ¦@|EF¸wØP½& j°…=…UÁâCá®^¢5¢ÁÅë®Û$à‡êª‚`¶ñF'"j!·Û9D0ØøÔì DD­kí ¡A¥ZqW'ìõ…âý@V>¼^_ÓwQÀc·NÆÌ©±aG!ÌF=&ŒèŽ»éäŸ3Ynv=C'L=\0twAÐ42Öè³=Ðg{`ì@Ñ›Ý[oƒ@i„`²ò&'"bè "jç7Î.¹Ñ¡£¤aèÈM|ºpoøß^¯/¾¡CmÁŠêª€Ò9Ý(«{]U¬Ð!X¡ƒ¯£]·´¬ˆAâ ƒ"H]yƒ%â3‹§€ˆ¨u¤ŒlRäw6Je9TOÝ d©K·Ä¿j²óx=ñ}r}Ÿf7ñ"G‡‹™‘A0Xt0jmv>op""†"¢ö'HHÙQåõ¿9fˆÉé‰Ý9±øP(tÄy0¹`» ùµs]7©AëS°æÜEl“Ù78CQdz‹UQd%VÛµ ñ¨(ÔÅÊë‹sg&ý)’¯nr]¦º.¾NsÍ´9="3[ŒîU'c,CµˆcÌFààÎÈz{¿á‰?º (J܃‡ý4 ïÝøïEé3C—ß×õ .$+EúŒ£Èºa²ÿ°iBÚÞ¼¢ë;¬îU…¿Áõ1Мˆˆâ‡ɉˆÚRÍï Wƒ2ÿ¶µ‘ÛôzÒBx=^ôq\ïB´@ÌÿÊþ ÿ¾Ø"ö2¯ß×f;œ’à+4¶ªÛ• ©Ð¦ù ËôBßÕ]Wti>@ˆÞV›æGÕÏ©ðký1j2ºBJͬ ˆ… T–Gî‹VMvwÞÜDD DD$tô ÖÕ°G÷AqVB´„ÖyÐæõ†`´D 0{è8^ø½€Î׋$Äy ]ÄßÁ9wŒ½Êc¶4¢ Ëà XW@vKá/Ó#X¡*‡Ô¯A£Bc B2!Y‚Фù Mõ7¾®Gž½øKõm¼^‘­Nþí뢷9e ­Ž77CQÇ Z“¡íÚ#õZTþíka1©f#úÞCàÝðcâvDU ß7!‹€ì–PúY$K l#ÊaRÉ(ÇÜV2Éz8aèß åÚjCù¢¬6^×7¾ík› &DDÇÏMž"¢¶ÑõUækð º~ðé ßáhh0¹Ï烪ÆJ©@ÍyÙ©ã» ùGO”¼—çºdÈ®Ä~wå/1àØœn8þyW(¾¶}d -ôFD5ÿŽõ1BÇ0ÞÔDD –"¢6Ò÷×7ŸD†Ž-+C]®„РãÈI¨zÿŸPþ„íGí"ªªÂëõÂh4Æõùwud*À{ÐïA°¸ ÝÜ0õvÂï„6ýÄS ðì¶Â¹ÙÏ^Ë OÍ«4 ‚ÙV¢öm‡Úà˜D£ Úî}xS1tu,ºÞCQ%\&—Á¿g t=“ú!cà]ý]CÇþð¿= M'ÞCfx™td Âç†>Ç }W´é¾Ùx÷™áÙog¯Š7~ ñÆÑgGüìY±$úZöµà#1tµ;Ád…¾ßˆPëFýJíϋ¡#TéšÐÐ!T”BpUB5ÛC‹&Çùùu-¼-WkàÚbƒkK¨eAШЦø¡IõAcBÔË´*TŸÙ­A \‡@‰²[J̹1[¡T×ÅM àYùMÔv†yC1tuLÆÑS£CÇÊoa»òŽðLHú£ Z“ TW$.xîƒÚshB“‹s›«øéÛ4Ím\®ÏÈ3#f¤òmúг2òÜé Ð?ƒ73Qq 9Ñ 0 ÑhЬh{œðÕ›±J40Ÿyqbß̆ºXùý~Ȳ×çÖvéÚ9/Ž Â|ÖÌÈ@øó¢èk84úCQÇ©×êЛUî^¾ âgóäKZ± ÷„ÿíõzâûÜ;D“µSBMv~øg¥ÊߦQÛGOåLDÄÐADÔ±™ÆL‹*ómY‰ÀÁuáÄd…qâE Û©Á`òxÓfuëdiP€õ‚ßE95‹˜hO¾ÿHÞÄDD DD›®ÏhºäD•;ç¿ñ³eêå­”Ý*®*ˆŽc¡Ðá‰èÐ÷Щ®‰aÐéÐt;%ü³êª†gégÑqÜôÐ dDDÄÐADÔ¡ "Ìç\Uì]÷GëZ D[2L lí¨]$0-†ÞC:Õõ°\x]düúc(^wäfzÌS.áýKDÄÐADÔ9GO…”’Y¨*p-x7¢ÈrÁu“Óó†^¸ ãúÜú^ƒ:͵0M8Úüº…þ®¯?޾fãχhMæÍKDÄÐADÔ9-ÌÓ®Œ*÷®úÃuƒ¼E£ öËoMÌzMKx<ñL®IË„6³ãë­I°ÍücD™ë«÷¢V 4ZX§]Á—ˆˆ¡ƒˆ¨s1?¢-ò›sU–Qõîs€Z·*·aä™Ð÷?5þÁ§hxuôDt±2 ŸÐá¯õ’› ˜ëfÚ –†kÑQÛÇž“°'""bè "JA§‡%Fk‡÷&¸\Qf»êOô†ø¾~ÀñØa€7ƒÉMCÇvèó¯ë=¦±çD”Uý÷ù¨«­–cpˆˆˆ¡ƒˆ¨S0M¾𬼍òêgCuÕuñÑdåÂvÕ]ñS/Là`ò¾Ã Y“Zý8Evè°pœÛ 3{—h±#é‚.ó®þ¾-«¢¶5Ÿ}9¤ô,Þ¬DD DD“ i`¿æîèŠwuª>y52 Œ;ÆÓã»0x$:EÏç‹ó'†óéSZõ]y:¼vi2>›dÅÆÞz|=ÚBœOºû E äW<.T~ðBÔ¦Rz,çþoT""†"¢ÎM×wŒ£&G•»¿ÿ¾uË#Êì×Þ³e¤Íõ ¬ð•áÃ]¯àÓ=obCé øäÖ 8·Œ;§EÛ9ìæLµáÓÉVTXë>jÜG»Hq=ßæ³¯€aÐée•oÿŠ£4j[Û•wĽ[5OÃS@D¶ËoƒoãÏP<®ºBU…ã¿!ý‰žÒBÝ{½I·üå» ŠÛy¯+; !à‡ªÕÁãñ"Énøý¦ã¿`éáÏë>D ú&ø®Ó00m$$¡éý) ÍÎG ð@Ìß+"ðÓ#V 6B–b·hfhSŸ)}õ}‡Ã:ãÆÈp·ìsxW~µ­aèX†ŒåÍIDÔØÒAD”ˆ7W{ ¬—ÜU®zœp¼òÔ` \¦íÚI·> A£=ñVE¡õ:bµt¨õfÑ€ Äæ²UxeÓã¸ÿÇ«ñåþ÷à T5ùæ‰çëáÕE†ŠãÉÞ¾ ?358Àa‹OK‡6§Gè¼IuÏ<¼Uïÿ3úzͰ]yoL"¢v–"¢1q¼›W·þ‡ˆòÀþí¨š3ö+o—éûGÒãÕGÃÓÞ¶9ðÝ%·|>TU…Popu@ 4ú¸*¿_ì{‹ÎÁ˜ì©˜œ;©† Öû ›¯Âª8n*rMhj`³GŵŸWbgw-¾?ÕŒ` òD™ýÄC‡”ž…ä?=Ñd©Ë[7³‰š­ ì³î ·.Cѯ‡ ù÷Fé£×A>^ñ+÷×s Éìó¤‹Âe†a«®@ջϞ`è &WU^¯F£1ü» ìoöñ>Ù‹¥‡?Dz#_¢_Ê0ì¯ÜW°2æ¶.£€9S­8žÜò á5œX#»hMBÊÝÏCª·Î†  â•‡,:µ½yÒE0Œ<“÷#Q;b÷*"¢Dæ“É7?³ëTÕ{ÏûþǨ ²ýÊÛ#¦~mõ{a½•Ét±’Ä–×ä±òèªFG­ÖðèOàØì)H½÷ÐtÉ©+TUTþû©˜Óãjr{Âzùm¼‰ˆ:ˆˆ~Ý´ÝûÆßEAÅìGàÛ¾6¢Ø4ùR$ýá‘6ñ¥€+4.ÃÓ`‘@Øòu2œ@Vâ>|Ú¶…M—¤ýåUhºÞ>z žK¢?àŒf$ßô­Ž7!CѯŸyò%0ÆXãB øQñÒ_8¼çp{¬ IDAT'¢Ü8j2’ïø ¦¶½¹72˜\'µ|ºXUD¡cœ?m÷>HýËlHéÙ‘ÁhÁáZüQŒ Â~ÃÃÐdvãÍGDÄÐADô!°_÷`Ì)[·eÿï6ön‰(׉”ûþ )µKëßÜk ôûýe9\®iE÷ª]µýÐqH¹ïˆÖäÈÀñù[¨n°àbø\Ϻ†¡œ—ˆˆ¡ƒˆè·–;4Z$ýñ1h úEWð]Õ({úNx7üQ®íÞé¿ÃàÑ­{s¯7®Ã[¯µÃ ™Úÿ<´0Í’¶+nGÊm‹lñQT½ûªç½óqÖ7Â4î\ÞpDD DD¿Ñà¡7 åοC›S<|^T¼ôgx~\ù³ Éwü?Ø.½‚Ô²– éè¾ð¿ëw±2hZ:Ô5uý-Øÿ´,¤>ø2ÌS.T¯üpÌ~®¥sc>Î|Ö Xνš7CÑoüך„ä?=s¼*˨ø÷Sp~þo@­7Š[`žv%RÿüJÌÀÅ] ¡¼$:ê &OÖ§µ|-’o| º¾ÃÂå‚$Á|ö0œvªÞÿg£ßü‹…û 8Á`@Z­æÿ·wçáQ–‡÷ÏL23™ì+Ù ȾÈ& ²Xi·.j±­míéy{<½ÎÛÓ¢ÕÓãV­×{<žöØR­¢T¥‚l…(›@XH ²ï™íyÿH2&d!¡¤~?ו‹0¹ç™ç¹g2¹so °(Ô¡jWÅEÏoX\ª*6/;¡&oSócËPBh‚†D ֔䩺)åFIRäÝßWýÞmšx¸Q7ª"̪cm:–bSq\€|m²@â¹ö¡Äâp*dáwåœ{ ë{~ø|ªýð Õ|ðÇÎwj7 …ó19çÜÍ €NƒÃ©È~V•ÿ÷´wÜá羪r•½ð…Üö€BÜßnïkd¬"ø´Ü'sU³úu5ee¶[rÊRôÅ2¼ •$E9b» ÑŽ8Ý>øAMì7Ãß+Rï®—$9;ï]±õ¬)sTûéúæRíÕ¤ƒ št°Aõ‹NÅè|”U>‹¡yÍÆâ ‘óæ;<÷nYB#:Ó[vV•øµ\Göuú˜F@ Â¿÷ÿ*hò^H@ètÇTä÷—¨&¾¿jW¿Ñ~.‡ÔüiÿKÕ¸k“¾óSÙ¯›Ðîǃ†*êÇÿ%÷é<Õ­yS »?–|>gò›{,546*,´9t$‡¤*¿úX‡óH [RîÒ¤ø›e5Úÿyè*l´q×#ªÛµI¦·ýð)g£Où.eä·\op˜BÜ#ç¬E²8C:Çô¸U·þÕ®ú“LWSça-J•¿ÿ•|5•ŠxΞRù ?‘ãúY ÿæc²D´Ÿ˜œ¦ˆG–(ôÎGÔðÉ:5ìX/×ùSòõKQc›ÉäC#Ç(³xÿÿÆèÖ÷jLÌTÇœˆÀø ™>_5[Wu’,²¯ i_“cÜ2ìA£)ç3U¿ù¢u\µ«þÔåü”Öàúõ²à~ÉÂ:(@è\2Kx”¢ÿõ·ªYõ'Õ}øz‡áJ’äk¨WÍ__Sݺ·›çEÜrw‡»%)8m¸‚Óš÷ܨ;}R–újYÁúfÚ#íæ‡ô#È©ð{$#,J¶¡c;«Ñ.lœ<¢ÚÕ¯7oŠØÍ¾ –ÈXEþÓ/ÚM¨:Wò°(ôÊ1a†ªß|±Ë¥b} uª]ógÕmzWA7.Tð̯+ !¥c0 Yc$%È”ÔävË,-‘¯¦RŸWF@€¬!ᲆFÈp8etÓ“`º]2›ä©(•¯±^>ŸO†Í!…EÊSЬEÝ_›Ï§¦œÏT·~¹šïê>ÄX­rξS!ßøÞE—:— uO׫ú/¯ÈWÝùªSfS£ê7þEõÿ¢À´ šŸÜGÕ”³W»?–»ðóž=ld¬Â=¬ ©_c³? t®hö QØwþEÁ·~KuëÞVý¶Õ].)+5/=Û¸o»÷m—$Yce6^¶áãeK»®9„ôa£Þt»ä-ΗëX–šröÉut¿| u=¾¿56AÁ_û–œÓçË´ñ„¡pµX£û)ìÛÍÖ®{[ [WÊ×PÑûyÏ«þ|±ê·­n16»âÈÚ¯¿âû+ ~€,‘1²‡É"Kpû=4L¯G¾ú:™uÕòÖVÉWV"ÏÙByÎÊs¶PÞÒ³÷éÉ¢„ ™Ÿ“çvÜ‘@è\=–°H…Ýý…οOõŸ|¤úO>’§‡C˜$Ét5É]øy‡=õ%#Ð&ûÈI š6OޱÓ$ƒ%p€ÐøÒ2‚C<÷nϽ»y²ö§ëÕ°cC&k_ii#4u®œ“æt=É@è|y&§)ðî(ìÎïËu4KMÙ{Ôtd¯<G;Ýïãr³8Cd2F¶aãd=Eýúó$¡ðÁb‘mØ8Ù†S¨š÷ópÍ’ëÈ^¹Ž–çL¡Ì†Ú>XkTœ’Re:V¶a㘒ÁîáB|%2HP°c¦É1fšÿ6_u…UVVª²²RÊÌÌ”ÍfÓ‚ tûí·ËápPI-<–/_®µk×Êår]´üÙ³gµråJ­[·N ,ТE‹ÀŸX tøÒIJJê²÷¢®®Nåå媨¨$™¦©;wjß¾}Z¼x±fÏžM¶HOOWPPP‡ÛMÓTuuµÊÊÊT[[+Ir¹\Z±b…¶lÙ¢Ç\ééé_ùú«®®Ö /¼ #GŽøos:š8q¢F¥èèh…‡‡«¾¾^ÊÎÎÖ¾}ûTRR¢ÆÆF½÷Þ{ÊÉÉÑOúSz=€ÐàËæÖ[oÕ-·ÜÒm™3gÎh÷îÝZ³f***är¹ô»ßýN555ºýöÛ©DI<òˆRRRºü¹iš:~ü¸233µaÃy<UTTèW¿ú•~úÓŸj̘1_ÙºkllÔ“O>©ÂÂBI’ÍfÓí·ß®… Êf³uzŸI“&iñâÅÚ½{·Þyç>}Z¹¹¹:~ü¸ÆÇ ÄêU®1 úú׿®—_~Y7ß|³ÿöeË–i×®]TP†¡ôôt-^¼X/½ô’† âop¿øâ‹*))ùJÖ‹išúïÿþoà Ó¯ýkÝyç]޶u:iÒ$=û쳚3gŽxà:\ë‚‚‚ôè£jÑ¢EþÛ^}õUÿð+ôL||¼~ùË_ú{7ôòË/Ë4ͯ\]ìÙ³Ç\‡ž|òÉn{Œ:c³ÙôðÃkÞ¼y¼¸€ÐàÅ=÷Ü£ñãÇKjž÷±zõj*¥—ìv»~ò“Ÿø'äþùçúì³Ï¾Ru`šf»U¯î»ï>%''_ñ󨯯ç às:\Ó ÃÐC=¤¬¬,y½^mÚ´IwÝuW»‰Ô{öìÑöíÛý!%))©GÇ~ã7TZZª˜˜ÝÿýÝ–­¨¨ÐÖ­[uàÀ«¦¦Fv»]1119r¤fΜ©\òu®X±Bùùù’¤ÔÔT}ãßèÓz Ö}÷ݧ—^zI’´fÍMœ8±]™•+Wêĉ²ÛíúáØ£ã655é•W^‘$=Z³fÍê¶|~~¾¶oß®C‡©¬¬L555 UBB‚ƯY³f]òäìÆÆFýéOò7ì§OŸî¿Æœœý&''kΜ9Wäõ›——§Í›7ëàÁƒ*--•ÇãQ@@€bbb4vìXÍœ9Sƒ â¡®¶˜˜M:UÛ·oWCCƒ²³³5aÂÿÏ‹ŠŠ´cÇIêÕ°—ƒª   Û!6>ŸOË—/ׇ~ØaiUÇ£ºº:hÍš5š9s¦/^Üë¥iÿüç?kÕªU’¤Aƒé‘G¹,õ8iÒ$ÅÄĨ´´T999ª««k·‡Gnn®öîÝÛ«}=<¿î» µµµúßÿý_íÞ½»ÃЮêêjUWWëèÑ£Z±b…î½÷^Í›7O†aôø<šššôÌ3Ï(;;[’4sæÌv¯‘¬¬,ÿ÷sæÌéÕ±/E}}½^}õUíÚµ«Ãõz<={V}ô‘Ö­[§©S§êᇖÓéä—¡®¦qãÆù{3. —‹ÇãÑsÏ=§ýû÷ûo‹ˆˆÐˆ#)¯×«ÂÂBåææÊãñhóæÍª­­Õã?ÞãÇX¾|y»À±dɒ˶™ŸÕjÕØ±cµqãF™¦©œœœ½—CYY™–,YÒn{RR’222¦ºº:;vLþÞ Iš?~Žïr¹ôÜsϵ >úh»`qèÐ!ÿ÷—ûš«ªª´dÉIjž?2qâD¥§§+44TUUU:zô¨öîÝ+—Ë¥O>ùDzòÉ'Y‚¡®¦Áƒû¿¿R«/-]ºÔ8œN§/^¬éÓ§ËjµvhT¿õÖ[ÊÍÍÕƒ>Øãã¿÷Þ{zï½÷®Hàh[7n”Ô¼áÝåær¹ôÌ3ÏøŸ³äädýÓ?ý“†Þ¡ìñãÇõÚk¯),,ì¢K+· †/¼ð‚<Øeàh{­ÑÑÑŠ½l×ëõzõ /øÇĉõÈ#(<<¼]¹ùóç«´´T¯¼òŠ>¬Ó§Oë7¿ùžxâ‰ËÞ „èBdd¤ÿû+±‚U~~¾¿q¬§Ÿ~ºË‰ÇÑÑÑúñ¬úúú‘Y¹r¥–/_î¿üå//{àš{j®d=nܸ±Ý\•'žx¢Ó [ÑSO=%Ó4{´Û·ÇãÑ‹/¾è†]¯×«ººº¯£®466êùçŸïÑõ=ðÀíæòlÙ²E¹¹¹’š‡³ýô§?í2DÄÄÄèç?ÿ¹þó?ÿS‡VNNŽ2335}út~á:àjh;.þJ,÷ºzõjÿã<øàƒ=Z騧cÍš5zë­·ÚŽ+^W‡~ØüÇ( @ÿò/ÿÒeàhØ£ãú|>ýö·¿Õž={º ­!¢UOêÙëõú{N.æÂÕ¨ZWWs:]žO»?Òzì±ÇôØcÉåriÕªU„„¸Zªªªüß_îqï¦iú'GGG÷i#ð£>Ò믿~U‡$ÕÔÔ\±z,((Pii©$iÊ”)Šï“ãú|>½üòËþ=7º Ró’Á­jkk/z|«ÕªQ£FuùóÊÊJÿƒm©¸¸X’4cÆŒ÷\EEEiêÔ©Úºu«òóóU^^®¨¨(~é:àJk¢#鲎ɗ¤òòrUWWK’ÆŒÓgcì?þøcýío“išW%pHÒÉ“'ýß·îÛq9CG«ÖÍ û«¯¾ªO?ý´GCjîMV]]ÊÊÊ.z|‡Ã¡_üâ]þ<33S/¿ür‡Û?îÿ~Ĉ½º¦Ñ£GkëÖ­’š—Ù%t¸Ö°9 €‡öŸ‘‘qY«m¯JtttŸwëÖ­2MS†aè?øÁRûUœ†zY«m¯J_6¢[ç‘‘‘z衇z (©yËåš@ßT/åuÓ6H·­7 tÀ񯯬mÛ¶IjÞ,ðºë®k÷óKí‰ðù|¿qZ,-s)f̘!Ã0dš¦^xá…}êÞ—Ž=ªS§NI’âãã»ìéèÍ5÷´l_Î%™1c†?@üæ7¿‘Çã¹è}ÚÕÖ^’¾ÖöuØÛëõz½ü¢ tÀÕ´jÕ*ÿ„Ý &tø944Ôÿ½ÛíîñqÛöh´Õv…£óçÏ÷ÙuÌš5K?ü° ÃPII‰–,YâŸóp¹™¦©wÞyÇÿÿ¹sçv(Ó:¡¡¡¡G ùîêPj߻їëÑGõ}ûöé¹çž»èó>mÚ4ÿ÷ëÖ­ëÕ뤧ÚΑéí²ÎmË·]a p;vLýë_ýÿ_°`A‡2mCGëDÞ‹9{öl»á06[ƒÇÁƒûôSúÙ³g_•à±fÍÿ5§Ó©Y³fu(Óv/‰3gÎôøùéJÛ¥d÷íÛ×wØ,–vÁcÿþýzþùç»  ð÷UTTèÍ7ßìó:2dˆÿû½{÷öê¾­å-K»ã¡.³#GŽè׿þµÿS÷3ftº©\FF†hËÎ;{tì 6tù3Ã0ü;žWTThË–-}z]mƒÇ¹sç´dÉ’>íQ¹ÐÚµkõÆoøÿÿÀtº¼oÛÆnëÊPÝ1M³ÛzLJJRRR’$i÷îÝþ ó.gðp¹\]ÞçÛßþ¶èÜG}¤M›6]Òcwnâãã•’’"©yWOpAAvïÞ-I>|øU™ë„_9uuuzýõ×õä“Oú7uKHHÐw¿ûÝNˇ……ùÃÈáÇ/>^V«U%%%í¾Îž=«cÇŽ)++K+V¬Ðk¯½¦ÜÜ\C,%%EK–,év_‰˜˜ÿdóÏ>ûLAAA4hP»F¡×ëÕÆõÊ+¯Èãñ(44T.—Kæ8„……Éëõ*''Gn·[Û·o—ÅbÑÀ;l`WPP ÿùŸÿѲeËÔ¿ÿv ú{ n¾ùæv“·SSS©}ûö©®®N»wïÖõ×_ßéþ™™™þ!Oƒ Rmmm‡z,**Rnn®vïÞ­7ß|So¿ýv»OÛ§M›¦ÿøÇÊ­l6›Ün·ÿšwîÜ©ääd%$$to¾ù¦V¬X¡àà`OÔàÁƒ5nܸve¨œœ?^UUUÊÌÌTTT”’’’:L¼Þ·oŸ^zé%mذAãÇo7ln×®]þ½1î¾ûnÿí­½R¥¥¥ÊÏÏ×Ù³guâÄ Mž¬ŠŠ ýú׿V¿~ý”ššª   •––*77W.—K‡C?ûÙÏôì³Ïú{¤:{üq=õÔSÊËËSYY™^zé%…„„(==]¡¡¡ª««S^^ž*++ý÷Û´i“î¿ÿþ]_k‡Ô¼œnVV–žþy=þøã²ÙlÊþèG?RXX˜Ö¬Y#Ó4UZZª×^{MøÃ” ¨¨(…‡‡Ëår©¼¼\í&ÖÛl6=øàƒÎ‹1 C=ö˜êëëuèÐ!•””èÙgŸUTT”ÿz«ªªtôèÑvsŠ&Mš¤‡zˆ7 ×,B€kN`` &L˜ ;î¸Ã¿¿BOÜsÏ= Ó²eËÔØØ¨ÚÚÚzCBB´xñbÝxãd†}ôQ >\o¾ù¦*++år¹täÈ‘Žo¶ºå–[ô­o}«Ç£»àñÄO(..îïªÇØØXMš4I .l·"Ww¬V«þýßÿ]üãµyóf™¦éïIi+99Y?üá5xð`9Ž.C‡Ô¼*ÖSO=¥wß}Wk×®USS“jkkµÿþeCCCuÏ=÷è–[néÕµv<ž{î9ýÛ¿ý[‡àa†xàMœ8Qo¿ý¶rss%5÷>w9Ã0 M:UßùÎwºÝXÑn·ëç?ÿ¹V¬X¡U«V©±±QåååΓ ÖwÞ©ùóç÷Ù&”@èð•Ó¿Í™3ç¢!Ãn·+**JÉÉÉJOO—Ýn¿¤Ç»õÖ[5mÚ4mß¾]ÙÙÙ:þ¼ ÃPll¬F¥iÓ¦ù'êŽ7N‡ã¢×ÝtÓMš6mšvïÞ­ƒª°°P555 TLLŒFŒ¡©S§vÚ÷_wK¡Îž=[v»Ýh233uûí·û¢£G¾èyÚív9ÅÆÆ*55µW­-›Í¦ïÿûš7ožvìØ¡cÇŽ©²²RAAAŠ×ĉ5~üxÿœ—3f¨ºººÛÍõ­o}K .Tff¦rrrtæÌ544(((H =z´¦M›&‡ÃÑáþ#GŽìtèSgÁ£_¿~*//—Ô¼*Ô”)S:-?|øp=õÔS*((О={”››«ââbUTTÈãñÈn·+22Rqqq7nœ&NœØã hµZu×]wé–[nÑÎ;uðàA•””¨¡¡A!!!Š‹‹ÓèÑ£5yòäN‡ÓÀµÆxù[æ¼…wPôPëÎñðUóÖKµø{ËãñÈ4›ço˜’¼<¥Ðà`B€žs8ì:µ_·Û¿tnsOGËjV-= ‹U¹¹¹ŠŠŽ!tè¹À€EFDhËÇåóùd–æåõæ™>nIDATsÕ8,V‹l6íü$Sqqq v:ôÎàôtY¬­|ÿ]?–«¦&—åñx”â„>Z³Zv‡CC‡ ÷߇Éô˜a2dˆªª«•ò„²öï“Ëå’ÍnSdD”FŽ­¨¨(†…ÐàÒE„G(2"RFË|޶_bx€ËŠÐ€Ð€Ð„„„ tø’`sÀ¯ººZŸ’Ûí¢2@Ÿ ´))±¿‚ƒC¨ : ŸRjê`…‡R OÔÖÖèdþq¥Fe K ¯ú q¹]ЧBBBår1Š„„„ t t t¡¡¸º¦OŸN%à’P×"S%¹ÚŸ•­£y…*©¨—Û4èŒPÜ€Á:b¬ÆfÄÉaPS t ·q£±X{Ö®Ô¦œrùZn3lN[=ª¯¯PQîåîÑ–¨ášsûQ ö ú0¬NŦMÐ×RGjÌž•Z¶áse½¿LÁ>¨™‰6êWàšàQɧ«´£L²˜«ûï¼¾càh˰+þúEºnYUªOVíÒy/µBºÒX Ì=å’tó‚ ŠéÑx•ÅŒ_ ý$•îÖ§§š¨G:Ð9×™:Ñ$¤MÓȨ^4á¬Q5-UV5èøÁ¹©J:БW5Å%j’›‘¨ ^Ý×3)C±’ΫÆGm‚ЀL5Õ6I²*$ÜÞëåo G„B¬’šªÕDè¡ÄYm’¼r¹.!5x›äòJ²ÚeeÃ:БU¡ñ2$•”÷z^†»<_e’,ýj¥6Aè@'‚‡+ARí‘ý*îÕ"TM:½ïˆê$%O”ƒª¡1Â24uˆMªËÒºg{ÜÛá>³Cë6Hö¡šš*FWЀ.RG°Òçܬ«t~û2­Ü_zÑàá.Û¯ÞÎT©¤ !ã4ÀIä¡ݰFŽÓí‹Æ(\õ:ºæ÷Zºú3ªíd›qo­ ?[­¥¿[£Üú曽§÷wŸcŸ\TÀµÂ¢!óõ½ï„ê½w·«ðÀ:½~`“"’©¿9­^ÕW–¨ðD‘ª:d—NnXªåæwu÷¤~²Q™ t s†œoÒ}?¦ìO¶iÇþ\•}®Ê¢¶eœŠ:NSo£àì÷ôÖ'gռЮ[ùÿ¤¿˜èîÉñ:ÐMô°ÇiÄÍwjÄLê+Ω¤¼V.ŸEŽÐ(ÅÆFÉÙÚÊ‹ý޾c¼¥73Ï|<6½©c~¨;Q‘ tàbé#@ΨD Šêêç ¸éÛºOoéÏþàá“ÇkÊ”XÍ WÉþ჉Cýoú¶î¿i€FÎü¶¾>ÄIàÀCOÀW$x$O¿_ÿ:ªÀ•GOB®®íÛ·S t t t¡¡@è€$Ùmª­­¡"@Ÿ©­­‘Íf£"Эªà«#1±¿Nž<.—ÛEe€>a³Ù””8€Š¡Í‚ƒC”ž>ŒŠÀÅð*„„ t t t¡¡¡@è@èBBB:::€Ð€Ð€Ð„„ t t t¡ÀU@_uÝþž6æJ¹q¡¦§ɸ „·2K«VRðM÷hîÛÕ9ËŠãÊ>eUêuƒjí«kv·¿ÙêPxl¢¹NÃD(и\WãÖé˵Å;Mw}m×ì9~ÁtWªðH¶Žæ©´ªI^Yd ‰VbêPž¢ˆ^¨O%Ç”uð¨ ÏU«É'Ç*eøxψ•½Ã¡LË9­ïítuØ~ý´l~ˆB»yÜÝëNê)O?½¹ Dá_ŠßϾº6 tøRp©à“LÅGÏÒ/['¨)OÅç:xÈ®˜a}:Zðqy}ºÂ,’L¯\ Õ:ê„l;¡c&iδ! ¿Úï’×À9ºËr´}ó^5Ú’ªQCÂå0\ª)-Ò‰ƒÛµúóM™{ƒ‡Y{ô\ר®5ŸJ±©2n˜B¬.•ž8¬Ï÷¬W•¾®[††^ÐMo(,9Zÿz£W¾–cœ+j’ÙMioU®¶|¸M'-ƒ4ù–Û´pÁlMLöèØ–µú´°A¦lŠIí'ke¾Î4´ɧÚÓ'U%ŸÎ畨鋃©°¸QAÉ) ¿°µk Õ·êæQá’£ snÕ¼iä0$Oùam\ó©Ž»úiÔôYš3ëˆiPîö5Ú|¤JÞK®‹@Å ÍP¸j”_XÓëãx*k㇙:Ú£ën¸YsfO×È~:ºm«ŽTù:mÌ»ÎeiÓǹò ™©9cûõ çâKpŽÞrån’7R‘=x½}Þ¼u§µwó6ZS4i|¿‹†á.šû:}ø¬~›oèúñýôÜÂdýçŒp%œ¯Ð¯ÖWª°‹ ¬-)Ó/6VÉ;4AO·WU•~µ²D[-¡úÑüþúŸo$êá¦Ön<­ßæ·ƒê»s艦ò ýǪsZßäн3ôôÜ8ÝëÕê­§õd¶K®K9è¹r={ا±´dœ]vÞ$üèéð7jø¹õÊÙ¾S oÔ@g'­_³N'vîÕ¹ˆ‰Z8}¨¿#<2FÆ}¸û 2')6.U±–L,iTzj ³NE'ë54U®y:ß”¢þvÉ[sZ§êJÑÉ'ìVED+ºmÞš£†„qš;s¸ú9.µ7ÀPòÈ$ýi”¡€ÖCÄØ•fkÒw××*«>B.˜…ÝPZ¡'ÖUªjP?ýf²S†$ŸG[2Ë”£Wg„+¡åµß?*^,§õÏ;˵ 9VÃ.õ.áú|nmú¤\Ÿ‡DêÅ[£”Þ’ÊF';•xJ?ÛSªí5+¸—Ç Ó|-Ji´:ô¹À8¾iŒÎ~˜¥O3)zv†œ¶YK”wÎTìôþÀÑÂSÓ~0G…UÕO©1Ò®“çåJ []±NÔ†+ýÆ ÕœÞ¬¼ó.õOP}Q¡jl‰šÜ‹OËÍÆ,•b¦d(ªÝÝ;t¨"r÷éÄy—ÒR®ìç³fc‰N”šŠ™2ä‚ó²ÈrṘòTÑö YªIœ¢['§Èi¹ÆÏÑ[¥Ãk¿÷Ev”n»m´Â]½xÞ<ç´/3Gõ©³tۤĿ{ÞŠ¯©Q«w•ieA“ÊM«$†êŽT‹ì2UïmÍ å•znm¹Š“âô›Bci­»}\bjØÌÅ[ÚŠþiaê¿¿RŸTšcüçЛç³Q[ÏK7„)-°ýó™1<\)ÙeÚ|Ϋ›õ²ƒlŠ¡•€Ðಽ1D^§¯?£Õ»wkÛáXÍéA#ÇU«&™ªÞþ®þ¼½³#XÒä“ ‡âEÉ·÷¤J]ýQ|BÕ¡ƒ”©Æ¤mÎ;/WR„ÎT)0aBsFOZ®:5)P‘!¶KüŽ0¦êÝ2e×¥´U}õeªpKÎHg¯Æ¡š®:¹º8¯jó´}ýY•z¤¨¨(Y¯­s4Cn—JK+ä2£dH²†(mÚlź[{:Ü*ùl›û.áyó¹Õè±(,.²MOÊ¥&·>ØP¬¥õÁzäÖxÍŽ±¨®¬NË?9¯ª ÿÖÖèù5 :æ‘RclŠlsÍ^—GՒжäká–ÎÈP\£)uV³½9‡^ðº<ª‘EƒB,^V{ " ©¢Þ'Ÿ¬¼¹ tø2±(tÈ šrf•2üMûíIí›U¶`Ùd(î†;5w£Û†«31U»(¿¬ZýNT*dP’œ†UŽA‰²l9¡ÒêD,·*~Tt¯Æê¶`ÙåV]­K¦Úƒ¯±Z ¦!‡3P—ÖVu«47WU ÑuB{ÕTëî¼:h8«†Ôiº94W[lÑžèšœÔÓô%8Ç€H¥%Û•—wXG+R4&*@R€Bbâ?@“ÜvI —ð¼Ù4qú$•ÿýÝ?Þúzm-“FΈÕü8« IŽØP=8¥AŸ¬il_¸¾Aåƒã´$¬JOï;«ÿ‹IÖ’›ïcµ(DÒu7 Ô¥Y{õúêÕ9ô‚Õ Pùt®Ö'ŸÚO£[å¦á´0‰ÀUnY@§-S§Nž®4G­Ží>ªÚ¶?r4›:—}\U 1}òšm“¨Aá.åæêhE°%Ë") r3:’{Le–8¥Æv·é`kÓÎlwƒb •fS¹§cc¼ò¢ÇìŠGUŸ¢­Gëe8AÃÛ|ÌmX-’§Iž¶ÓL·š¼ÖMgçåSSmSûIÆáã4kJª’FÞ¤©Énß–©ãµ¾kè7z‚’«uhó§:^åép¦¦«Je _<½{Þ¬ í?X)QvõÅŠÀ† 9lF»c†ÑñØÑzê†PM¯àÓ†Íç´¡Æl©;‡fÄJ9‡ªUÐáµoÊåë£sèÍuµœÓ±CÕ:qÁóy4§J…– ÝÜr¬VCòxÕèkÿ;[ëá-¡ÀÕÊŽ$M¼iXÇ]Ž¥M£˜ªýZ·é3?S¦ªêJ?}T»×¯ÐÚå_LC¶„(i`¨šNSyPŠ’[7 ˆRj‚©âc¥2cÓw‘|`±Ùeõ•éxÞ)Ê?£:3Di“F+ºæ6lܥ܂3:[œ¯œ´)·Qqã&u> ¾];·JEù'tâÄ È;®£‡÷jûG+´jç))i¢æLéßfR·Ua áRÅeVËíóª±ò´mÿ›rkÛ×Mêä1Š©=¤õëw('¿XgÏêèž úë•Óve(›Sv‹$#Xƒ¦Þ¤!öbíÜrPežkçàTÝ0g¼’|Ú±j…>Ú¾W‡~®ãÇŽèÀÎÍZõÞze׆kÈø– ^ pF*~ðDM‘®x§µýk§Ï›Ù'±jÁœyw”é¿Þ¯–38@QN›ÆÄ;z²ëe {¾7;JÇ>(ׯvØõÿMVDT¤ž¾=PË÷T蕪òI6§]cÓbôo£ì²õñ9ô„#*RO/ Л»+ôææjÕK pjÁMÉúVš­åœ ÅgÄé‡eçôÆæB}$CQ1ÁºuTŒî¬>£y»p9?È|ù[æ¼…wPºµ~ÍJ]7rtóÐPÃÒòoW_.ԩ†W¸¼@è@è@èBBB:::€Ð€Ð„„„ tè;¦iöº¡@y<ž•óz½„½WWSÛ£rM „½W^V*_›^ŒÎ˜>Ÿjjªz/6®ŸŠ‹‹äóù:ý¹Ï4UZz^a‘„½—1|„ÂÃ#Upò„*++äñ¸eš¦<jª«töôi‡*)y€ÿ>T€ž²X,:|„ª*+TTtJE§OÉô™ ´Ù¡Ôô …„†¶»¡@¯…GD*¼Íªnƒ Õàr¢§®Q•••*(($ 8Pááá]–ÍÎÎÖòåË%I÷Þ{¯†Þ'ǽ\eÿXèé€kTaa¡Ün·Ün·¿1ß•¿üå/ªªªRUU•?|ôÅq/WYÀ?z:ôZ^^žþ¸t©Ün·ÿ¶ÀÀ@=¸x±ÒÒÒÚ•¥§®Q)))²Ùl²ÙlJIIé¶ì=÷Ü£ˆˆEDDèÞ{ïí³ã^®²€/¿´´4=¸x±ìv»úÅÅÉn·w8$Éxù[æ¼…wPkºµ~ÍJͽu¡ Ãðß–——§×ßxCÜ»Àaš¦²e©° ŸáUzÆjµª©©QGÿ¶´´4ýÇÏ.›ÍÖ®¬Ûíò‡†Wè‘àà•ž?ßáö ‡$ÕTWËæp:ô\|b²Næ“Çãé¶œ×ëUÉÙbÿòè„=£ààÊÚÛeððz½:™wL‡Ã? ‹Ð Ç¦ ‘aÚ½#SÅŧÕÔÔ(ŸÏ§¦¦&+9«ìƒY2d(*&Î&’è±€‹RÓ‡¨²¢Bg‹‹Tpâ¸$Cr+¶_?‡„´»ñþò·LªÀåòÿÀ#pµ(ORÁIEND®B`‚stem-1.7.1/docs/_static/manual_output.png0000664000175000017500000015245213157571677021227 0ustar atagaratagar00000000000000‰PNG  IHDRØp‚t sRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEß #è€1! IDATxÚìyxŒ×Ç¿³$“]B6!!!AATj_‚ÄKíJÕZ~Ô®TKQkJÕN«´E•REK­µ†ØB‰ IDÈ>Ùfæüþ˜$²¼“H9Ÿç9Oë;÷ž{ι÷=ïÍ{ïˆP2#øðP Ã0 Ã0 Ã<pÀa?W@TBb½€“j†a†a†)3Ù^ðr¢-y©ÐZ˘²½†a†a¦TLôPÀÑâìµ>e;•C×jpën†ººYxôXÅ) ‘l;ŽG§®¨ö$OÒ”l“w1<'­Æ<¯Düu!–ÍÁ0 ü xN²ÅyG¼nr­WSµêIÞiËÖ_èˆÁ‹j£µ‡´Èuë °0Ú3—W«r:[ øÓ·bÊLïÊo\·!\úCÓ¶]amXvìÈÌ`YÓä?eŸÊÔÙÄç02sŽ£g3‘¡Úôê O‹bü*­‹–ã¦àoÛ‚ ˆÑ I­1¸JÊ—3}Ù– Ã0ožOórê‚9yÁëÔVknc, pÁ„Y†ÿ Ôl‡qçšÂ/º9üBÝ0v^uH+¦-»nÆÐ‡–]ªÁN¿ A§œß·ƒ˜3WÔ‰‘qt[vS·búö@Lÿþ†O —:FoTUËG1ñÛýôA£7jŸª¨³ÈÐ#ÖŸÆÍý=¡§Ó‡“刽öúZ¿¹^=—iØ{p†Ùëòt[(cÂ`7w¸{tÇò¶Ã0LbHÛ´öqáb@Ýתê?¶tb=±>mˆœ$\Þ” •£ZŽuÀT,Ÿ®õö‚æD¡Æ0dGtfÕ±ƒ´¶/T€ °ä¼‹f¨nm 1€¬§ 4­ ÷áíî Ó¯?ÆÅûoFYQ±OÔ¹í·'ñÓØdü8±~¼’˜Õ…»»Â’ù•›·R 2$¦ m›ƒa¦ Q7S.!•H$¾%•0ê\cýªÃÊ\ 1€Üø „lÁîïÕI¨Ñ0ÿ»«ÖºÝàÿ¯tìh†àä²ëɧٗŽèÐÏÖ5D©ñ@Žðm°ûç,Aú€ž›9¼ÆÕ@Ö†°´çå8*¤úÇâ‡âñ´º9úÌ0„Êÿ!V{Š$i"’¹¢û+8ù¥#<¯ºf_9Ák  ,Œœè4\[ƒ?÷È Ú’¹X¢ï76hâ*…Xž‹Ô—ë^¶†à™Ë]ÜN+Zîý5ж>Ì-Ôú*2pkýCüö“¼hA‰5úlõÇïÃÅØ=°%>ú#îµ"À¢MP„þ{éôÒ§¡8¿l8‚ÓkÁe¯ðnZžÃ{áâÂÝêuj£~¯™hÕ¡-ÌÄ ôHD݈?÷~‘_ºÂ}à4x´h†jz…ŒG°á ÜŒÏ)&£­ Ï÷£½ƒŠÐeظr/t[þ‚ñcÝ Šè4ߌéÛóÿuMð ²zhôÁ ¼ß¶%ÌôܧWqûðJœ>^P·ûØ¥xÏÙÆFzÈ}zaG¿Å‰okdŸ²úeÐJ ÎeØÐ¤åôèÛV&«w'F \a,ŠGÔþi8p4 ¹Ã§‹5à? Ó6:´®áÒIMÌÑmõ>|7¤œ,õäâÉX;g*–žPÇ™ØúCœ~´õÖ½Ûi× ¾Úí@Ž4ß‚æŽÓq]Ò?EŸÃˆêêÏ&È1)¯\Æþ.0ê_H±v? !óÔÐ2îŸÄ¦™£1ë@ô‹ÏumÑóËõX1©œÍÏCaýœOñÕß1/tþö7øõó€£­)dÒ"OàûÙã0sÿÍú/1Gû©«á7} ZØèBñô|;ãüÎ YHm‡að´:Ò‡ïGœX÷ï·÷¡Õï]PüIdØ ÄÎ3ߣ¿c5Hd=¾ŒÝK&bÔ¦ý&ópèÀgè\×Y1ñÇÉt´è ‡¬kØ8º7>=+ÈÚêW¥ÆFßu†ygðK$’>ÍI% #q·2¡€Žµ!š~é„»«ß¥PÆ¥!ôBbò¾&Gä…TD\HEÄñ4¤*„Õ­÷ÀàqÕ`mœƒ‡çRñ8E C{#4zOG°>`ÜÆí{ê ¹1Lôx’w´€ƒT[kž#£ž†žl¿û®èîÀPsSõ·ÞßÝ ƒG›ÀÂX‰¤G èØ£Õ7ð¿QzyUŠÑ÷W;4s•Bœ–„çb˜¼ôЉÚ>©¸w#TŠêt4„……Êø,$}FcC´'fì;€Y 4{5¥ÕŠ‹8³ÔÁ+¢}«ŽøpÝctXv ‡Æ©Ç™"f'F üYCvb÷ÿ@&µÅ‡[·cÀ³o0pÖ)dçùç×±cÞtkó>Þoç‹Y'j`äÆ¿°¡¥úa˺ÚÖÁâm0âh i‹}zaì1;LÚ2- „ùB[ýªÔØ`†ywð@—Î@™b`*%‡ùÉ/º9-Zk\ä³Z_ª¯/ÞlR®zt<êÐüèæäÕZÚ‰S]¿&ê2ë5ÒÇb‚+ùE7'¿¿,È@ò¢¼®ˆÃwMÉïaCjb­GŽ5WÿT#š}¿9ùE»Pûº"ÒmQ—¾ŠnN~÷R+{"2Ü€–F7'¿`{ªg2ðq¢eÑÍÉ/Èš‚ ’R“?ÔõÍœ WDWI½š43º9ùE7 ãWû2(¨9ùE7¡~b@Í~ó ¿èæ4o‰á+e­;M¡+¦’—µô¥ÏdTgÀ6š°=¦®ÙEÝ{v$ ·þŽF.ÛBm‹Ö¥Óà+š°=¦oZIöy¶@"³¾ôáö@š¾}¹™©õAGê¿-¦o?Jíëè’´Ît»=¦oü–\lk’quk2sIc¶ÒôËÉN‚Ô‘ZûÒôíôaW‡âãAÖŒ|ÖÒôíg©wŸ…êï¯Z@õM%¯”µt”¦o¤O'z’îKŸé8-P÷åÇíÔÄJ—)™´ÛBS¶Òôõ‹ÉV¯p[§¨s}=ddÞcMßHÓ×~E62² ~ йlê’Eÿ¿iúö3äíTƒlÇŸ§éÛS«Ú5¨Þ´+4}ûja­C€ˆ O¥# DDD¹NÑæéÝÉÑP$h\¿è—M "¢3}É4ÿš~3ZI¤º8šjç¥:ãˆ(˜f:ê¨ÇUùt‡²èHßEêÓo±Žb)–ÖµÐ/µ-q¾=ì§Ð-" e£3vã)€ˆÂ滬 ^ÜhÁ]"º4Žl%%ÔSwѵq¶‚û.©=š.*²èäp’ä_™Ó€9D·¦½ôEY·HIôë÷—I®¸IóÜ J¯ßÔ—ŽdÝžíDÈÄç0e©ÎQÿê cï?I®º@ƒÍEdÜy¥«üi˜•H°/Ô¶¬C‹Ú <ýªÌØ`aaayÛ%S.ÏK%%o„ªÑÛ›Ã/º95Áø1ê¥ jš½t]V=úõ `I%íè“­„¼ÐBiŽ\]¯¾µHÏAº¾\ˆ}‚|ïáø­‚¥TT{φ’ˆ‡j{%ŸJD,T3D]+ L\dê3Ó·RI¤Çž'A¹j]m^Ýuz fÏþ§âE®ë5^ˆžÝ›B€ØÄ û}‹ñß_ÃØ1íaf¥ôä¢KHÖí:B@NЈ’—¡¸èÅßÔocÐïïEG0vÕQŒœñ!LÔJÃHO ("~ñ.€Õý˜ºr;º÷ÿ¶5dÅ4`‚z½{Á ܸ÷4zwX #GwèÀƒˆHÈ @Ú­ÃHCؘéó½l<¿r‰`Ü–ÆaöѨ_%!fã+‘›– @™® Ùi™¤Ð‘Š2‚¾C;[´±{âÝðɪ¿¶ Úé¼^ f†áбxˆ\½à˜·9÷Ñ¡8§tňÞu–­{¡Â;ü“^«)Eb¢23[õê´c'8#§G¬#;GOÆÎ ôy¥žgw%ªÙ?¹Eß© Ü$2xýòŠüS9TO±·³`éËBf¼¾´?¦]¶Ç±žˆþz¾¾Uô5.©U'|¶ã""åPª²ö#ºè2ÃbVÔU*D‹R) ‚‘H°/´Ù¯ª Ã0ÿAt¥’lq- Yk ;‘›cq=HƒÎ¶èõf³² zòó)‰¨Äý’ZÓG@¡ ¤@B&Rræ… åçS…3fÑKç$Uß K¥„zJB™­./Òà9F¿!9!÷ÖOÂLW¸tƒæ­ßƒ î#ô—/pói¡¤UßnMªHÇýsAe§°æa&€§x–¢€H’§Xòß8½ëÒ ¿Ë©|Ž{)ê OƶÈApoã ÇfMѰG4ì1 ×—ÀÙ»…_DÏųð'¨áTM?™Š¨E+ð ]“sÄé¥ÿ}((ñ[ª\¨òÞ"Å˰ð~•øÄ"À†Y°(¬«2€¨Ä‡8Êzÿ_¾‚ÿ/KñE¿8¿o6¬Ø†]CN¾Æü@ ¢¯[)ãbíQ9öçõ›à2¸)T—Çã\âëžû®@ŽKDEíTò³^ ¨ P"±ð¦"‘"<ÅÎA>XRôA”ržáN¡É:µ; ‡«¤|ø1Z¯ž…‹©yNÑ©I‡O`E½øz²/þºý¢š]±êÏå°.Ö¼J(J¨Êé mö«jÇÃ0Ì©DZüÙt+uR•’‚Ók™!‚©©u± ­"C}ƒÑ­)ƒ(rÃROfx:R`ˆjŽæð|ÿŽÝ” †¥¸Üú”FÖs` ŒTd€š0ÓK)rãH¹–Ž èÁÐÕ mžãÊ#À¼‡j@rÆ+‘”‰\È ãf—ÚÏð¨”[¾\‘· §+ n§–©ÛªãdLóãÄêõEV±“þý»þÍÿ×Üüå nþR|²úýà` ã,B"Ë85Eæ„ÆƒÁEÂíä\è<¸L8Bß´ j(ÖâæÍ¼—ðÅ2@U°ÞcۺȾ³çBöàœÔ õGý†^-íáÞÅgï^*Ôˆñ~Š+]v [Óè51 ý~ƒ‚ ?t¨Wõuª×‚L 䨱Ì¢œ ¤G!öзó…C£Nôy?X@FbŸç¾”Þª“j£†P2ïãY¡¹)Ë>BûUšÎr6Ì[ºÅ“ßzâÛßÔÿª]ªÃ²ñð¯µØ5 Ÿ;ØÁF Ä–7¿Ñ±CÇ5ð󸟟ŸQ2ŽùíÄ“sŸ`bç{°k \˜ð¿ôGÊNG6 aa\¾³/å§ŠèÔÕ²Ë!êñ#«/k ô_DdBk§´ÈÃO „ M „î-y?‚Ȩ9¾<° ínNC“O2±êêfìûî4œFAÐwBWw1"ýfaÉ®`µÎ÷ªáa&ŠM°ÓN€IÞ¶Qy|ª\dæ00ƒõK¾Ú¯²æmÇÃ0Ì»‘`—°‚ñ ±ÙhP­F•!2\‰}ñ›L ”#2ÈšÖÁâkÖHÊÃÔ<¿µ G°€zrƒbpâœú·ÓC»_ÝÑî5õ)¤›Ù@7=ØfàÚ%‚C+KŒ=l„´BûÜr®<ÀñKÕÑ·¥1ú_t‡W¬fµ$¾‹Cd€“÷àÿ°9Ú×1F¿ îh¡€žS k=ñ‰¸{¿.lôàs¬1šÇՌҰ­Í}u]B1h‰…¿­Á'–À(³+°ç_.§×jߺ²nþ‰è79£õìƒhcQúbŠ[¸°ã/µ/"·âBpWtq«÷)Çà’üé*c˜T¯†g;{`Ç©X@Ö-?ÛW£ ¤ÅÅ #G&uÔ¢Ò=-fó ¶ÍE%káÜp6>쌟ÿxqºGzä]äÀºó0jÕH¤æêÃØäŽÎœ€ˆÈ­ðë¯†ï¡‹ß x>ä† bnEL6€‚78ªÃmÎ_°}ª„±µ%$Ò.üZÄ¥ÚGƒ~•¥s™6”ÛcøÊ¨sóÎß~ŒT•콦a”=ôÃ%Í“ë÷faé #Ï…ã EXæ’Œ}ýöáA¡|+=`5¾ ‡e¿lÄg1äø“WÓüGÉœƒ>K`äâ㈗ւ“Ée¬ù9TÊè­ø|Ë8µð0v(¾ÀŽ š|¼_9=–ο#F @KçÖ+c~ÀìµspvÆi\«þ5Öº‰ø\CØ8Ùáùþõ8­~Pj·tæÛÄ`—uŠUâã1Ýqç×_°å 3†L²"q6 è6ê+L¹¹gf@lÞ¶å=û^€/ ŠEX`0f*>ù ÇSkÀNÇ~ Ü/Ás‹–bƒaæ] äw°ÓÒ±gäc„ÜQ@\× »šÂÑÈŒËÄý[EW³ÎDb϶t¤dRK,l%ȼ— Ò ®çʰøqÁ\û+ 7KÀ•õò¥*ïu Mô)5Á>ö qáýQz¸;íNÉê †” —ãyÞ+•—ÝÀÞ_ÒðNGÀçw°qÛ‹ŒëŸþá8ö·i )Ìô`¤P!ý~""^]²9;1¡ @Wæ¶"<ÌD®¦+pÙQøçhʇøçŸ¨òyܰ=ÜÜ $ãÞùb’E’Ô;6°ª ½ÌGˆ½¼ ¿øWcòú®|Œàuñ磈KÌ€Ô´6L«Wƒ*)Osòþò JÂãKç‘$q͆°®SºÉwù÷,üüç½âDÒÏãìöcÈPÃw1Z×yñ^svè*;qi¹€Ä´6ÌÌ ÷$ÊG¸µf޾†”S˜Ô0âY ‚þ¿xøJ;™Os``m ‰ê)bOí»ƒ„ÛGƒ~•®³ zD6€©¹'Æo8„3×qãêYü>³.Ý=VÝ)G¶iŒ¶3·áÀ¡ÝXÒ1?Œi‡¼”$å„aëûjV )‡¾ÅÞ'¯fñôìOLµ×kOĶCÿàÈÞåöž- Ǽ§'·B¯%¡h<{ü3aI¯ÖJûïôž›îvÓö@Þa.~:pÿüµ«&tA#SõühÜr5~þÔ{Gý{bÕãûñïŸbê¿F²q!Ú™ˆ€œ»XÓ·?¾¹Õ3wý‹ËW¯ÀÿÈB¸%ârDZÅøÀ•…c±æ²&lý‡v¯À¨6ua,Ö/æ-ÅÃ0Ì;ÁAýªÄŽKéK§8t8®>‘cú8™ÖÛª·Èü¢›Óì-6Ô¬YÖ•Q }ªi/yëw¶ê{¬£ÉÛiúš/_99ã­–WNyûìcâs˜2sŽSÏjåø~1'r”&ºæÒíÜ(úÆCŸwŒk[4ôEUÓ‡cƒ……|Š•øŠH¥bn†O®ÖƒU\&ž&¨ «cËrÒpñï­79?ÛåNè÷? îfóâƒkQøìƒgoñã” ¶Z@ ãú!Äfó&ÛGƒ?w™8¢y£jW÷Ä„µ a¹VÞÌdÃ0 Ã0/Q%l‰L„Ø€,Ôh¢ÛÚ”J<õŽ +!à1UH›w–‡cñrÀÒÃ5Ì%B…´ˆô·ÚÙ"“ŽhÜHÀSD\çèËì“ú/ôu+®~÷YøýÜXØ©qcç$xM<ˆ'¼áØ`†y5§ýñ0úñ§l †a†a†yM2årˆK:¦a†a†aÍW‰w°†a†a†ìw ™#†/Y‡¯¼­Ø Ã0 Ã0LÉ ¶ô?’`KjÁU"P¾œé qe* çŒQs'¡¿KÑß\3óÚˆˆ9n|ݬJØIdè€6½zÃÓ¢rüZoz0ˆn`‚?¨UT¬j3Ælº÷Ÿ"›¤HAÌ}˜îªWem)$ž«ÚüÏÏuÿ„ø½²çC†a˜‚»¤l±EoìŠHƒ2o’ÏxˆÃߎD³jofªWÆþ„Ánîp÷èŽåUÇ€†uÜà £'ךUâ&¨ç2 {nÂ0{ÝJi/Wž Y¹Ä£©‚bU[1&¶‚ŸþøíŸ|1>íÑÞ{(f¬;ˆ+ ¹UÖ–B⹪Á·u®«jñ{eχ Ã0ù”xLŸH×NõpgAwŒû—P§yoLš¿ ×{4F§÷gàߤJþ….R 2$¦ mFÕ1à£mmÑ0Ø9¡7ð.þfYzbH™ƒgrþÅ¶ŠŠUmج¶'œe Øýåìð—¿5æ~ëÆ`ëØï Ã0ðùìéÅþ ¤ÖºJD›“(Á4 PE,nü¢¬®-õ\tn?'"Rѳà?iaÛ‚Ï»È º:†j‰_j£z:“›F¿w6&ˆÌ©Ûê“DY¤&õÞqZÙ¯n1¿*V‡&–ò«beè€$6iwx2åæµ•ùèm›Ð¬H‘‘ Ü|eåPì­ J%¢àéõŠØ§€âôÚ/ÝÚÔcÁ JTª )S)&ø8­ò±þËA†mé§gT,éû:kdqõÖ4eßäO©9ùµ$Ñ…Y^iרÃNJˆýžZ¼ª“¸šMÜ~‰¢3òªPfPüÍ-ä]]$ü—'›Ì£Qij?E_ ]Ûþ¡ˆt"eâUZ×ÛF¸O…øBÖ˜–Ü'JÙÝñŵj½éßB~?‚bµ ÑZŒ•¡³´Zó—€xd!ýÒdþy]™S·ïÎÐÝ'ò¼–r(þúšÛ¥¦æñ#1§ö3vPÀãl""ÊM¸I{çt S±fs q* ­²Dн@€Î‚ü.t>daaa© _rļ¹³'Ø™S¿ã9D÷‘« HÉkS EÑžÙƒ©{¡4wßC"Š¡Í^f€šú=$U~y™9Õ«¯¾ÉêÔ›NÁ¹÷iIcÙ‹Ÿâ½·–Fúz“wïQ´ìt Ò¬ºÜtÊÖA¯uÔ›:·ö$϶=iÒöp"Š¥ - òn&VôÁïω”aôËÌAÔ£÷pš±ÑŸÒ_J´ê4t&g·.´än úê—˜:nTëx`Þ0êѹ õ±†î½Ô–±vlDÍï¦DJ¤Ýƒ›‘³³39;;““FöÑužOáD¾u íÕ•:¶ïDÞ}QO'ƒWãĪýo|[2.æFÛjË"ùZñQWjÕ“ÚtíO£Ç÷!{]Í~þ;‹Béëî­ià–"ºMËzw¢Q»žÅo¢–}*Äì2ÛÒR‚­½+)6’}u]­Æ†Öü%(žØGH¿4™´õ³ãá«h¨·ué5†–O ¢(Z×ÞT£øiµò.Qvmܛڵì@çýM ”MçÆÛk«BÆ© ¶ÊA÷:—íwañÃÂÂÂRa ö‚yŸ O°¡GÍV>$JßO]ŒA»ñ@Daó]HV° èF îÑ¥qd+SÍ—I™ü+u4SÍáçHI7iŠƒ” Zn¢øìó4ÄRôâ¦Sh¢”ÖDDtmœ­à›NÙú”` S_:’Mt;o5Oê0™‰(h¦#é”–h•uÐ/‰íòWE.iBzeµ%dÅ·Å:Š¥XZ×BÿUŸ ´:‰Ê ?º¿F€‰É÷H6Ñ£ÍÔÝZZîzL|S–êõ¯2öþ“äª 4Ø\DÆ÷QºÊŸ†Y‰ùTPŒ M°ËjK‹ ¶6b¬2cCkþ ³ÖæMæm%Øgú’iþ5ýf´4’Huq4Õ–ìWíÑtQ‘E'‡Û¤ÐÈ€9D·¦½Th¬–=NËÝÖK"è^ åñ%(~XXXX* Á.Ç1}¢‚ÿ3pìgÄãôñ(dç_ÌŽÄÑ“ñ€sG8꫆dcÔ©f‰v½1Ü0ÄËƵÁôy¢Ò‹ß§xvQr š‰`ÍÊÖG}IjÕ Ÿí¸ˆÈD9”ª,$…ýˆ.º€ÌP½Fß¡óçAÛÛ¿^î—¾cg¸ŠpòïpdUðë@Bí£T89c2ö«>Áßq±¸¶ÿ[Lñu~Í*U ˆ ¤R@1$"‘ Ÿj+ÆÊÛVeR‘cçMú«2c¾¼±Q.2ÃpèX^Ö@迈È”ÏBp3ÙÞfÀâ¶Æl¡íØ™øÔ¬O…"N¥áì¨ÊEf.3X‹ØBwo¹}`è„®îbDúÍÂ’]Áê2÷ªáa&`]PÏIÜÆtõmýK7Pêýƒ²‘–ÀØ 6 Z©™²¢¯à!ú¢mkè\‰|ísÊNG6 aaüj’(È>Ú&7×÷‹ëû¿Å\×™8ü Ö݆FËîj\UÚÉ0É[Ä2*ºÄV¦O¡HBÌsÀ°¾3¤'p_QìÒ¡ð¶J‰U úZ1&„Šˆ mø«´xbAý½áYXÇ;ÔÂÏã~–À¹.üBhÚ´ÐAèÞÅ׫I¬–2Nµ%A÷# t0.ūޓ1ÍGŒ«×ãT¼¢BË0 óŽ$Øe­`›6hŽ-³QÓ½&.š÷¬Gç•Aê 3z+>ßòN-<ŒŠ/°#D‚&/ÁWN°¥óïˆQȼ‡3áºék¿>8‚˜h)6\]]Å85ÿ¾æ«b˜Œ™ŠÏG>ÃñÔ°Óñdž_Ä铉³a@·Q_aÊÍõ8û0bó°-ô§YeôVÌÝü%N}~‡¥s±áôdÕh‡ZÀ‹?3èÛþ1ÀôYX8á)<1E]=¬ÝqGXþ¹ ~Ççc»ßlT~?è ^DZh ºÍ~€Ì9è³tF.>Žxi-8™\ÆšŸC…ÙG‹´Y´}“NãäõH$fëö]KÔ‚ñZ>{L€O…epzçUК¯ñãâ¬:…e[ØÈ)O[¥Äªf1ÿz1&¨ë•ذ´xbAý’j¦¾I«8sbjŸýZöÞŒÈò<¿7 Kgáxx.-Â2—dìë·纘0{íœqתu‡n">×6Nvx¾=Fç ¶sYãTP[Br/Ðh|•=.ÅAK,üm >±F™]å8ÿWÛÒV†aÞ¾[µ¼Ø´Å½é×{é¤Ê;ÚHþø&^=šš›‰_9Ëwñß–¢.—|ç/ZìkW¤ŒûÒûD [©½±úߦ޻)‰BiN7jÁØ‹ö¦Ý[äúŠnR›^ôÝÅ8R)žÒõ>d,®žC?ò;r›òÏäReRRÌ Ú9¼N¡~Õ"Ÿyû(ðInÁqZÏ"ÏÓº–¯n²èL‹OES6‘2‘nlì¦ÖG`¿ÄfïÓÔ]7(A™w$`ðmJ'¢[SÊõr½ýà tñq^çrèêzo2ÐÀ>ZÙä(6§®‹SГ¬‚ã±²âƒèð²>TGV¾MŽ…¯uúRU—i„µX˜O…Ƙ®-õZ~Œî¥hM‰÷.ІžVšÅXÕäȾ׌1Ùð¥…ØÐš¿„ÆsYöÒ/ çÇY!yJ¿è4Ýä˜LÁqê¹%ç±?}?Ú­Øò¥ÆØ”ÚNÝFçî§æé£ çáGhNc=á±*tœ hKˆ”y/Ð06Jõ»Ðø‘XSŸŸîS®âýòAÍâu×V–wç‘uß}ÃÆ¨b"­7‚(—Nö«Áö`a©b"®Ö‚æ^Ê!ŠÛHï”ÿ1Û’………å­M°¥‰†e´NÓ±³ð~êmÜK‡¸† |g~ ·ô£t1™Ã0Uýúý0íóé˜Þ"¿ZŒËr¶ Ã0 ó*mrd*Âvpi?‹¸Á\€*‘çwaBÇÙØ¯dû0LUÂÈβ ø¬Uol Hd{0 Ã0Å"úqËýÉD¶Ã0 Ã0 ü&™r9ÊñC3 Ã0 Ã0 Ô'Ø Ã0 Ã0 £Í[*} ¶Ì׬ÃWÞVì†a†aæíJ°ßÈ ¶ž3FÍ„þ.Fì†a†aæmK°ù˜>†a†a†ÑZ‚Í&`†a†a˜ÿX‚-2rÁÈÍð(›@”ƒØs_ÃãåBº¶è¹è n?'©ð,øO,ìa[¨st[}ÁÑIÈ"!õÞq¬ìW·h=s´Ÿ±³ADÈM¸‰½s:À”%†a†a˜·"Á–X¡ïöóØ6Ö§¿Œž}FcÕÅô—–Âk?ÏkŒCУç0¬ºÛóÿòÇf/³¼zLÐÀË ®9;0¡—|úŒÆ†hOÌØw³èÔÔjÅEœYêŽàѾUG|¸î1:,;†CãìÙÛ Ã0 Ã0LųÏ® ý=v©Ãd $¢ ™Ž¤“½Zoú—ˆ‚§×#$±OD6ß…dùedn´à.]G¶¤45ˆˆÎô%q~Ýu'Q ]g«®§öhº¨È¢“ÃmH’_ÈœœÈ!º5…ì¥oïïÞ³°°°°°°°°¼yɔ˩ÂW°õÚÁñ8þrK(càØ ÎˆÇéãQÈο˜‰£'ãçŽpÔ/þ{Šgw%ªÙ˜¨Ûrê7‰ ^¿<†"ï5R=ÅÞÎ:€¥,uøŠa†a†©X*þR ‚X,*£ /—•õ¨ P¢¼ºE"1DxŠƒ|°,$«¨9Ïp'“Î0 Ã0 ÃüÇlyÄIÜÆtõmýK7Yl™ÓÅtêêÙåõ*¶¬|¼¬Ð‘ @$ ­ð¡hÓB¡{o°w†a†a˜·/ÁVFoÅÜÍ_âÔçÇqX:N?@Vv¨¼¢ŒÞŠÏ·|S c‡â ì‘ ÉÇKð•Ó#léü;b”Â4UÆü€ÙkçàìŒÓ¸Výk¬;tñ¹†°q²Ãóýëq0:—=Î0 Ã0 ÃT,½ÉA·ùÌÛGOrIM=‹ñ¶-³"3¯ˆÈ‘ãÆ×Í*¼-!ˆ ЦWoxZHÞÍ ëþ5ß~Šl""17öaº«žöüõâÓÿb¿^I­1¸JÊ—3}…!=gŒš; ý]ŒÞ‰¾—b8vì„ÖNÕ*íÏ~•1G•;6Þ¤h=a&v·{«|ª¹NM1ûŸ‹XÝ9¡ÑrÎÀ´è¯ª:¾þ‹ù{w™ý’¹bÔª]8´ã迹Ûaê-PÆèb\ôº‰Ï!dR &Õ•jÔa78èèÃɵf•0=—iØ{p†Ùë¾{«ÖCðÓ_¢ý“ï1Ƨ=Ú{ÅŒuq%!·ÊúK[>ý/öëuQÆþ„Ánîp÷èŽåïV¬kÒ÷wqŽz—c£*úTßev]y€¤uB–tç0v­ÈUe1:¬<„¥7ðY»¾øöz*;I‹c°ªŽ¯ÿbþ#d~.³_Ù!XÖ¥;6$õ–“ßÁÛ¼bgú³ä̤L@*ƒŽè¥'© Rd"9S©QC¶µEÃ`ä„Þ€ŠÇíEVÛβìþr vøËß)½“qH D†Ò´ÍxÇ‚]ƒ¾slðÜø¦ÉyvW÷.À¯3C‘(uÁˆu?bþ¾õ¸l7G“Iû÷×ùØ4Þçÿ×ßñê5¯·ÿÞ­L8ŠéÝþçàØ¾x7lÆŸ©8¥÷ïÙE^Ó>§I©sè— ‘”¬RU¦Fщ/ÜÕŸ hK¶¥ŸžQ±¤ïëü¢œ®-õ\tn?'"Rѳà?iaÛ"u‰«·¦)þ$ÿðxJÍɯ%‰.Ìj¤™Neõ]ˆ>"sê¶ú$G'QVž&©÷ŽÓÊ~uõ=t¶“fþÒ­M=  De¾Â|œVùX¨?—5¦%÷‰Rvw|ñj½é_" ž^O#JlÒîðdÊÍû4óÑ%Ú6¡™F>Þ/-ØY€t=Atu Õ¿ôYõþt&7~ïl,LvV¡:41°ä¾‹Œ\häæ ô(›ˆ(‡boQjqõ”"bë錂(fuó"×»È Šù–<ô ý~ ‘Rú.(6òçŸBŸUo¿‚‚r´¢IóËIÌ©ýŒð8›ˆˆrnÒÞ9ÈTüfæ(mØGh¿Ê§BÆ»–Æ— }ò}šz“nD«o*Ù.Ò÷£Ý4›„ĪPŸ¾$vnQ©%)Ÿ_ËÖß?!ŠÛD­Šù\dNݾ;CwŸÈó4Í¡øë{hn—ššßĸšMÜ~‰¢3òªPfPüÍ-ä]]¤Q­ÜsúKpPÖøÊŸÃ$O?@]Ë™'Tµ¹Edžº~±‡®Çeçµ’FCNЪn–‚ÇŽ ù¹ã«Ág7‰rÏÑhÛŠ[™r9•˜`wþÒç¨uÄ´y4«OÈ|ðR¤ì¦NF…&¨‡ÛhÒ€äÝs-9™L¤ºB“ëéÔU§¡39»u¡%wK°ÚþAωèé¿ëiæÇý¨{Wê3ìáY½èdXF[BÄÚ±5¼›)‘vnFÎÎÎäììLN6ye¤äµ)†ˆ¢hÏìÁÔ½ÇPš»ï!ÅÐf/³‚ztçS8…oFC{u¥Ží;‘wŸAÔÓÉ@#}Êì»}òíso-ôõ&ïÞ£hÙé" ¤Y tËè{C²¯®«¿ÄÔq£ºýó†QÎ]¨Çˆ5t¯ð E`‚$Ȇzõ¨û ÞÔ¹µ'y¶íI“¶‡Q,mhi O…ôK{v.Kšú=$Õ½Eä*AfNõêÛÒ©7‚sïÓ’Æ2aúh+Á–XÑ¿?'R†Ñ/3QÞÃiÆFJ×4¡•Ô¦1—‰(ì j¤›wMß“ÖÇ%ïê$ÜΕ˜` Š—lën«)8'‹®/ëH¢åZ­¼K”D['÷¦v-;ÐÀySeÓ¹ñöodŽÒ–}õKÀ8-s¼ki| Ò'¿­tÚ8}õê1ˆfî¸K*J¢½}­´«Bæ¨Â"µîI›ïçPôÖîd*Ò~½¦ä÷(akëb"Ï>á«h¨·ué5†–O ¢(Z×ÞT£9\Hü´Úò„H~V|Ô•Zµð¤6]ûÓèñ}È^•ÑÎ=W˜¿çZH°…è\µæ1uXÿ€ˆé¤ßXêÝÅ‹¼‡øQh9ò!9¤¦ãK\sU(ÉT­ÊO° ÞßHq¹þ4ÌʈZmŽ'¢hZÙÌj~|™rbVSsýâWu¤öS茲`†mè‡"ÅÅIT¯¤¢I[D¿Å:Š¥XZ×BÿÕ•»ñ@Daó]HV°JáF îÑ¥qd+)<¸2è.Æåw„€¾ Ò§8ûÔDDtmœ­à¾ Zñ³Cþ*¢È%MH¯¤A¡Q‚­¡ M}éH6Ñí¼Uw­õKËv.MjޏLÊä_©£‘˜j?GJºIS¤dÐrÅgŸ§!–"aúh)Á–:L¦@" šéH:¯™ÐÖ@DÁ4ÓQýà«Ûp.Ý¡,:Ò·†p;Wr‚]f™|¿ŸFm>ÙO±ÊD:2¥iÑø©=š.*²èäp’Zp"‡èÖ²—Vþ¥•þòö«˜qZæx×Òø¤O¡¶L VÜÐì"º6‘êJµ«‚æ(€¤5{Ó‘tïÇþd«ƒ I`Ú‡N)‰®Œ®U¦/ ì£ßŒ–F©.ަÚïƒÂâGL¾G²‰m¦îÖÒ¶²Ëhçž+Ô_‚ï_¯›`k sU™[$¶cé’Šèþr2(=é¸Bóүʴ³òYn&[Ã{ 4¹½7lÄm—Éø´O-$^ EœJ >šØY•‹Ì\f°¿Ü÷“¸ +tõmˆ×^”£dóÛ‰'NŸ`bç.ø¨%páûðX©µ?ú.$6 ˆ;‚ÙÝññï˜uâ<Öx[¼°aø „Ú´ÐAhhh¹sïIÕž£J‹ !ýÒ`œVβ`9õÑ«î]¬A·Oá^¦öcUÐ…lÜ¿‚¨TEÅÚ(3§îŽ>ÍK¯<¸Ø¡c‡š@øyÜøçKÆEn"®ïÿSû6A-·Y¸óÞgX7¶¾æe^óž«™¿^o|Qfî!((!÷S ÈMBdÞ¿ƒÃb+$GªŒ¹%3ò,Âaì «ä;`4MÚ°\m•%¢}è°œ(+`ôõ¦n}GÑ”Î/ùwÚ¬~ÉïÜ¡äÛk8Íû#º„Mޝù¶¾ ÑGû}O©DIméãcr¢Ü úaòêÑk(M^ý/¥¼ôÞT½ÉWHE©ôïò©gg/òº’îjú¶nš}‹ˆï£Ïúu ÏæïQKŸÏè\ö«ý*ݧBâP»v.UÄ5飋DDt¸¯9‰ÄÖ4ôD6åÒÉþæÅ¡;£ð&!e­Ý›|Œ¢‰1&¦N›¢ó6¤Œ£¾>]©Û‡«(¼¼ï<ë6¤9ÁDô<™H~œ[‰‹l&Õv¿„HÉ}ó/ù]Ç–íŠ%ʽN >äÝ£œ6zÛ鼑9J[ö)³_ÇiyÞÁ.×ø¢O~[«i˜uíû ùBDicGÓ ‰U!s”Žã ºID”s’†7Úû‰WHE7hz}’}‘áOg §>¾ƒiÖÎp"J¢ß?°Òè>(d\´Y´•VMJÝÚyÒ{žèƒYû)žt~dmÊhçž+Ì_šäBæŸÒ69 Õ¹ÊÌ-"sê³ç9ݣݳ‡R¯>Ãiúú ”VŽÎ; *7®®÷~q"€®-ù.þ›ÂRÔ'ßù‹ûÚ•oƒƒ)µïBô©€»4‰ÍÞ§©»nP‚2ïH·àÛ”ND·¦89ê§×òct¯ SY”xïmè©Ùä¬çÐüŽÜ¦„üs»T™”sƒv¯£™O…Ä¡í\–¸/½O”°•ÚçM¦¦Þ»)‰BiN"6,+…Ø9_¤6½è»‹q¤ "R<¥ë} õ½ùÌÛGOr ŽåzyžÖõ°,WL›÷úRˆ(ù7ŸW7¥h¹_B¤Ô¾—Åù]ßæ\U%ì _‹¼DHlJm§n£s÷SótVÐóð#4§±Þ™£´fý2N+-Á¢Èœº¯=O‘ÏòÏWË¥ø{é ïZ«eÍQbË^ôóC%e¯¤ÖÆ¢ M°Ef]é§§DÇÇP]|‘LÁqê9!ç±ÿ+Ç º–?bsêºø0=É*8^-+>ˆ/ëCud^F›÷\þÒ$2ÿèÔîJèLµt^Oçª2·ˆŒ\hä¦ “wôëãÀ›¯,Äi2vÊÊ!…æÚÓø³ÙDÁŸ¿8íªRlMnÎõ¦QåÒÉ~5Ø,ê›O£¹t;7оñÐg{°°TQ±ôý™âHE·Wu*šˆ÷°ÃÂò:ò:'AiQÜfùS6=¤umM*¬L¹œ*qó6Ñtì,¼ŸzwãÒ!®áß™_Ã-ý(]Lfã¼ÃˆMѼQ5ˆ«{bÂÚ…°Ü?+of²a¦Š’pxºL¶Â…µÇq&Î-VÞe£0o-ÍgÃI¿f¸6ÇŸžO­Ð¶8ÁfÊ5vpi?‹¸Á\€*‘çwaBÇÙØ¯dû¼Ã¸ÏÂïçÆÂN•ˆ;'ÁkâA<á`˜*MÈ:¸G|Ç[‘l æ-Î]jÃÑà §§µÂßݪðæDû÷ì¢~ƒ>dÃ3 Ã0 Ã0Ìk’)—kç8A†a†a†aÔp‚Í0 Ã0 Ã0œ`3 Ã0 Ã0 'Ø Ã0 Ã0 à 6Ã0 Ã0 Ã0œ`3 Ã0 Ã0 'Ø Ã0 Ã0 à 6Ã0 Ã0 Ã0œ`3 Ã0 Ã0 'Ø Ã0 Ã0 à 6Ã0 Ã0 Ãp‚Í0 Ã0 Ã0 'Ø Ã0 Ã0 à 6Ã0 Ã0 Ãp‚Í0 Ã0 Ã0 'Ø Ã0 Ã0 à 6Ã0 Ã0 Ãp‚Í0 Ã0 Ã0œ`3 Ã0 Ã0 à 6Ã0 Ã0 Ãp‚Í0 Ã0 Ã0œ`ÿ': M¯Þð´TX’Zcp•”/gúV cVF߆a†a˜*`ëÙ÷ÂW{¯âq&(Ï"þÅ–‰žVD[.Ó°÷à& ³×­°þ(cÂ`7w¸{tÇòˆ’²]s|°÷ä…ñÔ¨‹øyFXI+ÈΕÐw†a†a¦d¤•ш®ã ܈. bɧKq!N‚ÚM¼ÐÞJ ÅÕr¤@dH MAÛŒ’_ô`îPúÁ_¢Ë¨¢[ |¦áÛ•ÿÂÃÄ®_q2 Ã0 ümìß³‹¼*:uéƒiã¨k}£â?*’šôá±L¢§;¨§…¸ärº¶ÔsÑAºýœˆHEÏ‚ÿ¤…=l_|.2§n«ORpte‘šÔ{Çie¿º/ʶ¥ŸžQ±¤ïë\PN\½5MÙð'ù‡ÇSjN~‰$º0«‘p}òEZ‡&Ñ™¾$~¥ïµiÜ5":?jˆ^ô£ÿ‰¢ûKÉ]&¼­2uØw–Š“L¹œJL°Efhõµ"RRÌ™ïiVoW’Š4oDâóX IDATl=œÎ«ˆÂ¿r)¥œ”¼6ÅQí™=˜º÷Js÷=$¢Úìe–—È:ÐÔ "º·–Fúz“wïQ´ìt Ò¬ºuY;6¢fƒwS"%ÒîÁÍÈÙÙ™œÉÉÆ  Œ®ó| '¢ð­Óhh¯®Ô±}'òî3ˆz:×§¼ 6L©ÇáL¢+¨‰žð¶ÊÖYXßYXXXXXXXXÞP‚/MûÑœ­g(ZAD ´sþzÏJWp#z;¡‡$§]K,#±OD6ß…dù×en´à.]G¶’B v¡DVZwѵqEW{õ[¬£XŠ¥u-ô‹mO¬fÐ]ŒË¯O9l±¾¹\CÁJ¢Gë[jÔVY: í; KÅ&Øenr|¸ËÇt@jðZÏ…¿âJØ6t0øŠJ TJÇNpFŸÜ›}÷^{íµÖ^gŸ}ÎAA8[AA$ÁAAI°AAAlAAA$Á„ÁèÉ,½!YãåÕž‚ ‚pª0ì^÷=6†”ØvJòíA©?ð…ln»/®Ë7<2{9#¿ï'‹ÅsÅPvû.îýSÛ µ3æ›3ùæ4>q€{n­?eôÓÛ¸¯ùý%Z¼¿µŠÜ5,ô‘ ã t-‡›ùèö|^K˜Æ‡™¿“ÇðÝ·&ÞõËm…üË¥52# ‚ œ. vì‚Ñ|êæ4Î8;†€œšòþVΆ;k¨öxÿ¯ó¸ùF?í/åñã¥ÃvY#¹ïØøc£™ºÐÏ ×ccø›g3;å“/­ÅAòž+ç…ÿ®¥®Õ{¹Ü÷d^ð“|úŠRÐ~¸‘m¿.â¯O·ôPCý®>z°˜—þ®dòÝgpÓU=™ŽÅÖ/îäé!7æŒ ã‰bÖŽ"ãŽzŠZ†¿…ÍŸú2[l¨§6ÖÁ–ã’ëø‹§óõÛFášóƒÔ…tcýĶ;„ÜøûãTÖ²ã/1¤øÁÌHdþ™†ÌD‚ §S‚pQ&ß~ …QíG:DMˆ!ëü^¾s¤‚ +-[Šyx SÇrËëãI;‘ qŒêH0ës›iòû;-Žyß™JÖœB~ü•ša×w·2Ïÿþt¡ØÔ•@âÄx–Ý“M’µ›‡žk?¦ž ­É1¤ÏMdÕoH×wó§¿¶Ì©gß;>tM'yI€ìƒM;(+Dq­:)ƼóÖBR®¥ùå§Dr=T6ÊËlyóG…ìéaÕ9uU> }ã~îøÆ±W.úö÷¡FÛø¿sÑLæŸ/3‘ Âi“`ÇÆðù{ÂÉuÙýû¸÷®ÎÙ-)à¶ËêõÂÛgpÞ ŒŽ‡ö¢F¶þö0Ï?<úÿ¥¿Î朳cH­£ve3;þûO>.sì¶ ÿE3¸»è“OMüyÞ^vÕAôÜTÎûF YËâHKÓ;V£Þ-å_.§¢Ý<îi敯ìåƒrEÌòIüó“£IX“ÆÒqGx¯T¹j«/™›?ë®ï^ȼ5a\h€jæ…5{y+Ò¾žÅ?ÿ{YßOcì ÅT[O…Îô»æðõ«|dÿS<üµ†ÊG ùßGÂ¥–ÿc1ŸŸ åðàcíkøë…‹™n´ñê§wóò^utu¼uÃ>nûVc¿ì‡kc©9f@`m&ßûßµGxô¼BvW+âÖdòý‡Sˆ+«âÁµ‡8Ðe1võ_Îà‚åPxï~¸¯¹›ÌËîŸÅª³£•¤£퇛øèìÿsg¹À§&óõ»“IO — •7³ûó—›"²ùOÜôÌ?ŸÁ’€ŽªmaçýyüÁæˆôÜ—ºmcüçqó7ü´¿]ÌzÛÛ¹ó?¹¤Š`GžïÕú!K4ÐQLýéL°Ú¨¨V‘·ÕƒÌ÷½ß2ClFx¸UCˆ¶9œÆ- ›$'jpt÷K,«~7ƒ³’bɘj{=™w‚öm?}m(øÉ.6-]̧×dró  )Pó‡B6|ÐýF=+§˜wþ/‰ó—iþ©šÃ­'–gûwö°~ŒY—Å÷~ˤuc˜üÄA¡ýƒCÜ{N‡&MÆ|g7~ÍÏ” bà¥ÆÇÝâýÚÝ­ïYŸ†-îW±û’Ç '’ùáhëwLŸÈ3õ¿pÃç š7ñ‡é_å}éÇ·hç-ÑÀnâ¯kö±¥HcòÝóŽ»aâìð‰Oñ]ûùÍÿ´È #‚ vw”êûræ¨3Äì®f÷¡pùºW«)%žŒQqLN×Èo:¾žŠ!Xî'f\?bÒfMTÚƒj@òôL—½¿ˆËº|Sö»vÔÀè«"l«™½§'™Æ\è»uÔÅñGpðŽ=<ô\û°0ÚØÏëß,bÆ«LÎÐáp9OÜwâ„ìíëvñ¶«*ÿ^Cùc“˸dƒAEÊ%\õ“4&¥t/í¥Ÿ”¾–<ÇÚŒ÷>84ô¥Ÿ˜i±ö×’WªÂg±':÷6Èê[b™pÛlî¼¾‰Ï×ðÁc5ä—8‚ ’`Ó´?D¡M01ºöÄ«xêh6ÞuŽ=îßÇbw<@ózËA?åéÆAêëm šÙ÷|[Þn´¶¼¢'™ƒ‡-À–à#Ú€Vôx1:€Å‘º®R7óìÒ<*o˜ÍM_õ3ñ‚æC-XwÌVaÅù|šk­õh?=ŒEW¢§Ä’ü‰ÕgÊxÃy΀;aw4ªk Í—~“F†f±ÿR¶í´ˆýÔD>÷ßÀõÕßq+OÆb(|p°q¥ŸONŽ ­×R¥÷ær×¶4–]‘ÌÜó,X`ÁºtÞº|/¼?²¿)‚ ô2·ôôæ÷P¤€1i\üÕ¸nÿ‹¾ Z¿µ‰f€9©dÓÔÏŒf@]3‡Ê#›N­æpyÿب~m÷DÕjÞé#-­§‡w5óòÕ{øÍ¥ûxøŸ‹;“ëaØw727mo `v*s'wÈ|Qjxeûp=«Ž‘Ùq8x×~v5‚±dW¬öþ±éõõ~&ÍxÝNÐêØ®à#ýûÉõñ)\ñß©$XA¶½ØfŸùýX&Ä_×9šËäÎå«7ÄöѪFüÒÄð3[(¯Ué±$iáνöëJ¶¿PËî­¡A÷žq+Û±è*sLÇVp=ÖÀÔ”ç~áÙ¹w/þîF?-yMÔLOeÉR¾€Ÿ”´ãG,qV4­ïVòâ·öòóY;yô¯Ͳëãd¶A8èq&uŠ+yþ¾T¾}K,“”ÍÝßn§ºBáEB]¿Yu˜â²iK2—.‹ç²Íó9¯T#i¼(ÞWF~d: þ£ mDµ`ÿ¹u µ­:‰©-<¹,]µ}ÿ¾=yœ’Jög0~B4¾2%¥×ÀCgRˆ·m Eß]%ñ¹Å¼òFW¬Šãâ×Ïàì:dvØóË*ÊÚOpÆlá÷™ûﱜñ¯£yõí2*<¼akÇëK.3™t÷þí¦æÄþ'Úª¼š}“™8%š ^žÇâ2h䡳 Èo†³~5™ì8Å¡ÛóyêOmÔlZ̧³Ærå7ŽðËû:÷Ëš³'pöyQDÙ×§2ñ‘¢\Á1YòÌ\¦)FMñcuÏTr  Ø_CiÛhfŽJáºD‘ŸgadÆœ´q¹”ÇíXt•ù_Þ?FfýÂ+zó÷|ú í<Ì+o沕Ѭ|b>+{hgís83Ù¦>¿†¤9aÖí•»AN'z]4+¾7—û¾[Ann+à'uj±--äý_ VÇ/·\¹§mäH‹IÒxƒPIïÿh¿{(ò·±´¾‘ÏS5QßfZ£'´hCùÜ¿"y^»é0»Ø`úHÎÐiÚ׎Á2âpë»¶~y;Ï>ÞDm‹–¹¸‘-?ØÃŸzÙ_]ýèr‚ÀŒ1¬YêíK1|ïc6<¤ÙÖ59Š8Ý¡a#9[ú—¼¹®ˆr-ðûH¨qä£BšFâå3øÜ2 ”ñÜáuî·n­ HÿÎ$–NìÔ³•SÌû[,Àæà“5=ÜäÍEŠÀ?¦âࣅüögû¹›xê«%ìÞc¡OõéD¦O‡–² v„†~Ü]Êãv,ú’ÙK¿ð’ýÝ¥~>¸v;ÿû“ ¶¾PËÇOVòÁîðj¼ÓåÍ7…«§¤\cÔÔX&Ή&ª2HÎïò¹ÿ7rã ÂiÅú§?¯M9éX¼a±º»h±ºå«Q#¢?Wî\¬î.:C}q‘.zÌ#q”úVÑbuwá •òå1£º^µ)¬ïï}£ÿú޹h¦º»h±ºû¯)+äC9FÈÑ *SN1AÖ±œ{g&óB`¬aý¯OÂ+åS“¸á餗µPUé5)Ž´ ½‘Í/Föt-6Šón×ñªôX_A„ˆ$Ø‚ û05åsÏÏÛä…ß4Ð6Ä÷JQ¥ï·’rF '¶MÕ»Gxç®bÞ/‰L=-‰ù_J ß+‚ ŒH´õO=®¾xå5¢ AAA -ÁàÉzùµ ‚ ‚ ŒL$ÁAAI°G>>o0s¶&ŠÁ3¦ÜèãŒW$ö=ÑÙ:ñrO¯ öÉ#y¾ŽiŒ,%û²LÎû½Ÿs/q´3.27nàõ#ÃVG¢_ ›¾ë°òA?Ÿûäø¾Þ¿2Üé·ú™“­h<¢NÛñ*öØ~Nñî…f\n²úg&“ÆÈÜ!H‚ÍØ||¦Kà¸èN ÖÞÄbd,^g1²”l¦hį ‹z„SËVGª_ ›¾;°íŽoü§ÅþÊ”Ƥ^ã#;C‘û ‹üC§ý IÌŒÀ6NÅî•æý´Âfù·˜¤ÆÉ"œñ§·úS5Œ›-;„LÀ9—›¬Ž ñú%ÚsIËæ¯•h4TâAºÓ\~?@JÛÀÊ GôñóÎÕ¨y<Äb‰½'Ë~$†ÃîûBÄßácá¥:›s$ð§o‚ŽŠú"E»RÔ88Sü,^ªÃûh‘ôKLf­ï¯j/q(|Îfß®îdÊÕ&ãgiħhG/5Yâ—ÃåÜëgbÇYmæüdvüÎÞnñâî1íJsÎÒć?·9²–kD›ÐZ¬0£/WÖÝÕ“v…Éì…:qÉáKV•áõ69Û»÷=ýb“ì5: q€‚–R‡Òg-rr"™µaÑOýŒK pêÅ/Z|üf÷¶bfdF'}ª†OÕª¨Þh±å%Q™”µ&³Öê$%‚jT”½b³ucwd~ÅÇ´Å1þp¿ÚJ¶ÝcQŒ¬L_¸µU7~1”m¹±y7¸¯¾äqc«nû>P_ö7¶êFf/l qN ÁaóÛ'±Xñ€ŸØ×B¼òt—1¼ÉÏÒI6/üÐÆ‰‚³îö“¼Ëbãÿtöuñ½~’¶Y¼âa25¤±7‚X×W¼t%myh«n}ÐMLPÕŠk.5ÈxÉ¡èˆ$aÂéœ`wó°C„=¿ƒÔk|,9JŸ³È-„Ùß6‰úUˆ{;bÆXƒÌU:¼c³s‡¢µôXÐÊ:/çgídš,ûºNÕCäu¬´4UDXY›í)ÚL½Ú$û»Ñ÷„Ø•ç^ž¾úÕ¾Íâˆã'm‘ù¿{¦†“gSÖþüám!LCcÂ&Ó{yì ~ÎX¨(^oQR ÙYºpÜÕÈÖ‰·m>¾_ѪAÊy&ÓoÔh»-Äòîý*ÿ›Åž QcÎW ÒÆiääD kŠÿfQT«°4Äs¯1q‡ØYÐt—˜¬º^Gí³É{DÑTZøºŒ©›2É—ûX±ŠžµÈ=QÙ:ó¾`²¢%Ŀމ'ùZsÏ„Y”—+ˆÑŒ¦[2⦌ÜØª¿Ê¶Üؼ«äÚÅx¹‘Ç­ºé»¾ì%nlÕÌ^Ù*À˜Ùí;-ÚœþÇâC0ŽOwYXÉ„Ð>…ÐÿÁáÜ(±ù5ÅÄoû×lóÒÞ®TiìuëÜÄK7òxÒ–‡¶êÆÝÄ„®4½¢æR?“²5Š6ËÕXAl4ŸFü|Ys¡õŽ€Ùçj4m±}c8ÐVìQè·û˜ùy?ïX¶Úçö4«ÁŽW8(Ú«eèU¢"Ç!Tå†P?ñ1ýR]w¹”Çe¿Šò`áÂÎIGo0! *Ÿíl§¥<|é°µ§·)'êÌX ÏZ|¼©£­}~®IT× }Õó µŠ¢áö+óB¤ÝçcÜ å*ܯ•Á—Bl}±cbŒÑ™îrÄT|è=óªÝï~–Ÿ”„ƒæŒ+tÌ|›¿ÿÒ>˘0ë<ê‡CìxO¡ ˜ágñ¹:¼þ?Yƒf‡š‡# a™Ž]qSÆÕß—­FèCÙVo>è†>Ç+yz³ÕcÂ@}Ù«hêÆVÝŒ…W¶ ˜Á‚Ä  ò]×èLM³É¯}ŒÁèQP»­Sí¹þÝÇ9W™,cf+öþ§5;†2öº‰unpýhË+[uãƒnâü±TUÂÔ, $ÁNë{šÉèüXÿ®Å¦¿„ÂÌ4‰GQœÛ‘¬XŠÊ=Š™KuâM‡Fë$÷0¤(ÏUL_â^·ýª|ÝÁþ¦ÎìI69‡ ~™N\ÐaÛž`¬NÅáý]ÚòŠ "Ø £ºôKS”ìò¦­i×ù˜¤ŽNv™Ã‡·¶“¸Ð`ÂR™ë ²Úl¾×¦®Å}™Ae(ýbÚŠd¼ú#O7[=…Ç¢/[uƒ—¶ÚÖŽHyÜèó‚Ýpæ9:l²I:SCØ”4£ÖDôñáò%:Q/Ù´ÙÞëx(co_±ÎK†²-/lµ¿1Á4Ài–LÙô=µ*jŠOœ\[…h¤ÎÒ:+25Ò²4(|eH…ÀAÃïe414RgjP¡\ËI¿òßVD-1ÈXi2> ÈíÄ‘É Ñ=·•6_ÃÍcF{ªÇÕyÆE”©Ú€ó˜´ Ðü†MÞûµ‡µûÁP—±¬v¨m‚Q+zž½Ü”± -$gBc™êvœÈ&ë¶Ûìþ]ˆMwØ4M6X¸JëW™ØêPú…×mõ*‡ÛñF1!Rylð÷‘üöP&R[uƒ¶ZU9?£¨zÙ¡-]gÞ<‰SàÈ[ÇǺßñ‘rØæ;,ª V];xgLC{ûŠu‘ÚOo1<’¶B$¶Ú›º‰ '"1ZŠd{ˆ0²1ôë6Øó–bùçL:6Å%°Ü`fºâà¯"_ærŠmCc/5ÈxIѪC ZQ°%BGœl½*+!°Ø {”Fð$’HúU¿É¦v­Éׂ½Ë"¿‡ç 6æ+Xk°`5”5@¬OQðž ·õ¦bù…>–è…{ÁhÄô°(Ðc=nô[ns ×`Áe&s›òˆ›©“È1wÍ» ºÒVL9ìPS£  ãë^&ï¯ãþÉä‚ï;ìßìÐXz Ċ”»2mûšbÅZ+cm w(ÚlˆN×hßnSÞ±15ù“±ÍU‡í–FÌ h ¹Ë ››2žØêPú…Çmõ…›ñV1!ByšŠœc0÷l¨jén«}–qi«nðÒV+ßUh_2˜šæôŸ\%eû- Jüd_g‚î°í˜'3¥\åcf²Ã¶ŸØ4ÔÁG:¬ùšÉ¢!¶}ܽ¬9Õ`Å-1yÓ?;ªØë&ÖEb?½ÅðHÚ#°Õ¾|ÐMœï&÷4“ô8EéNI°I°{O´ ñA“ɬ LΊ†P¹CÞý6{ûywþ®‡^npƺp”«{ÓŠ<Áv å|“É áÇz4ÄŽíjpúÕè°÷X¶TQ¸¡ç W÷Lˆ¼‰>¦}Éd¢‚ú·¬Î úxˆ÷êL²×˜œy~¸|{•¢¤<²zÜpø¾v|_ó1ãJ“I´–(4@EŸóÂÿe“i_3™e BuŠŠŠÎ2Á·-Þh0ȾPgæWͰ±µ)jßµ^7ejž ±¹Æ$kÁ‚áºC•ört"04}¡ÉÔŽÇ3: Šªïw¹‰ÆM¯lu(ýÂë¶zÃÍx ·˜‰ÖP«ð©Ù“.Óô[ýês÷˜ÊÔd|N&œïSŸ}ЧæN—±“cd-Á 2åãôbÔ9I­Š¦:…ÐHÿ´IB›ÃÖ¢A©´í°x÷I“³¯2YYâ­M‘­„'ej§3ù*ƒ¨m9xݺžª1õ3&S3ÅÚÝü)œº:L\k²ì‹uυص_ÆPùH‚}š?C'k‘†¿ãòcó~‡÷X”6ˆna$ÓøšÅ:Q‡"ËÆÌé&‹ 3ª IDAT£ þ=‹Ø6-&üxÄÜŸÛÉ6ÓF‡q“4ªŸñáÿÉ•pšøéú§W_¼òÑ„ ‚ ‚ –`pÈž:+‚ ‚ §’` ‚ ‚ ‚$Ø‚ ‚ ‚ ¶ ‚ ‚ H‚-‚ ‚ ‚$Ø‚ ‚ ‚ ¶ ‚ ‚ H‚-‚ ‚ ‚$Ø‚ ‚ ‚ ¶ ‚ ‚ H‚-‚ ‚ ’` ‚ ‚ ‚ ¶ ‚ ‚ H‚-‚ ‚ ’` ‚ ‚ ‚ ¶ ‚ ‚ H‚-‚ ‚ ’` ‚ ‚ ‚$Ø‚ ‚ ‚ H‚-‚ ‚ ’` ‚ ‚ ÂÈÃì_Èæ¶ûâº|ÓÈ#³÷‘ÓY™‘ΘoÎä›? ÐøÄî¹µ~@uE!%¶’|{ÐÛAA"H°¯Ü¹˜E‰Ç¯6à‡_ªsÕ€]ÖHî;6þØh¦.ô£õ³Œ+b£¹êÅlæO50ÚB”m>ÂÛ¿(ekŽ=¬"ãÂxb€˜µ£È¸£ž¢–þÕ3þ_çqó~Ú_ÊãÇ76 j[‚ ‚ B„ ö'4ïj¤´^ýܶ5亖-Å<¼Œ©c¹åõñ¤õ³Œô„iÉu°¨ +=бkÒ¹bM©—ìeãGÃ7ÉÞyk!)ׯÒüò%¼ú¶%‚ ‚ ô'Á¶Ø}Û~ÖosNøß¯.fºÑÆ«ŸÞÍË{“ï>ƒ›®2iݰ۾u²öx4óÒe{ù ÖÏâßÍ⊵1¬ù^¿¸’¶Žó„9ÿ2O_“Ș$pj[Ø÷D)Oü¢–¶.Ý\~w+? 9àи·žW¿YÀ»ù'‰+ÇðéoföYQÄè@[ˆâŠùÃ÷jhS=7•ó¾‘BÖ²8ÒÒôŽÕy‡†wKùã—Ëiþì1Ûc®¥æÛc–Ý?‹UgG3*IGÚ7ñчYÿçfàøm6þ‹fpwÑ'Ÿšøó¼½®q×ÀÂÛgpÞ ŒŽ‡ö¢F¶þö0Ï?<úÿ¥¿Î朳cHî“]ÙÌŽÿ>Ä“«kõ_Îà‚åPxï~¸¯Y¼NA„ÍȾɱ­ï©äÀ¼æ §·ó~_þV"c|m”ìh!˜Cöº©üóí£?ýà>U€d_;¥5SZè7# ½Ëâ}ʵ3øþcX¼4ŠÛâHA+G ’b­£‰|üÙc8÷’xÒ&×aµ'D[T´²=¦ÛÛQ½t%ãœX’’tìÃ-”ä[ø'Xò³,Ö}-ø¤žFWvü 1Hþ; ì§ý›i°Ü·µô/ ¹êúFÇÛÔ[ø2âYþ‹lnº.úh™I«ã=ZÇ.o¥²ØÆH‹cáOgpÙR£ûÜì ,]a¢i&S®Nab´8 ‚ #ÓM‘%]È’£Ÿ[xqe.oT§D­’fŽ8¬ûHKÑ0S&ðÙϘÐXÇÓ—q Ìié|ý±t’.OcÚÝMh†‰³Ã‰bñ]ûùÍÿœxÅEÿš€(ýí>îûE«õ;ñ“KªvìRñdžÓíȶÇXlÿÎÖoƒ1ë²øÞc™´n “Ÿ8ÈÁŽzÆÿx7ÃOûÛÅüáØ=Ø.ÚòŸ5™óWè`5ñüyûx·’®šÁîŽgò-c™út!ùMòlûf.ë·9,|rW-7ɾ8Þë\¥¶rŠyçÿ’8™F៪9Ü*N'‚ ÂiŸ`C0·‰²Oö`·µPs*íÛÕ:׿(žD€øD®ØxÌœ(FÅͰóÙ «o‰eÂm³¹óú&v>_ÃÕ_ÞCâ›;‘Œ`5ðÊ]l…i³&×íÁœ 8Tþ½†òÆ2&%–qɃޜðŒ:3@Àîjv ×Y÷j5¥Ä“1*ŽÉéùMÇ·U±3ËýÄŒ;Þ¤Þ¾no‹¯ ‚ ‚ ö'Xìú·¼÷`Û @ÃçÓ:RØaÖÁ q¤ê!*ªšÙ‘pWÖðümµÔw½ïѲȩ ÿYzo.wmKcÙÉÌ=?À‚u¬Kç­Ë÷ðÂû6G÷{(åM·U—JÜÞÊÈŒ"¦©CÏ—òÈš<ÞØÓ¹Ååƒ/oçá_áP±‘EÊ8§¼™ò.{Ë ÿVOI¹Æ¨©±LœMTeœßåsÿo: Uüq/÷\WÂö÷[ ê&ÉS£I¯Ó^f?N]Þ\WÄG¹ø}¤NÔ8òQ ¡c³›‹)~L+ÄÁG ùíÏšºý¿õ|žz¨‰ú60Ó¢=Ñ å@ʧ¹nkË•ÛyúÑFŽ´˜$7•4ñþöð»‡"ÏŒ­œbÞßb6Ÿ¬‘äZA„¶þ©ÇÕ¯¼F41Ì ¿UÓâýKwö¸^AA8¹´ƒÈ-i‚ ‚ ‚à!’` ‚ ‚ ‚‡˜¢‚Sƒ§æmå)Qƒ ‚ °GV°AAAlAAA[AA$ÁAAAlAAA[AA$ÁAAAlAAA[AA$ÁAAI°AAA[AA$ÁAAI°AAA[AA$ÁAAI°AAAlAAA$ÁAAI°AAAlAa´Ú`Þ…š(b˜2áó3gËøˆ= §+¦WEÏ5˜™Áè± ;ÐRìPð'‹ü’“Ó±äù: »,[ùX|Y&+oÖ±6†xóoê¸S®•øIüäsžÅ†{œÈËœˆ L?½Ú¡Ð§“VLnVìü‡ê¿¿‹D=ã°/ÇÃJOñøì…= ÃO•¸Ñk‚¸ÀÇš/{F©Øs[ˆýåÝ¿]ðMƒ¤|›Ÿvh±5¢R ¦òä(ÏÈ4X¼N§ìN‡]…ƒ”¤Î7¹p]‡÷o±¨h¦gU)±8ã5à§p`Û! Ccü7L¦Ÿ°.ÊŒp†ÂÆFº~zµCÁ3©z>-}ðŽÏ3%†ŸnvØk‚Ý´1Äë»5¢æ›,¿öþÊ¢¼ŽI®Iñ¦¢äy›â|N‹É2´ÃâõŸjh€¿«~šÂ®¡eøÊÞ²9Äk%ÍOUçjUTo´Øò’ЍL_ö“v¥9giâßۊ ž³ÙŸ«ÅÆÜÈÜ—ý¤]a2{¡N\rø¦ «ÊáÐz›œí‘•q£72÷©Ÿ.a{Ñw·±Å ^ÉÓ®mlºÉ÷ƒßv•ÃÁgmr>RG}Ë­ž½Ðßñ*zæƒ.âÛ1͸ÖGÖrhZ‹&Ð2HñÐ+z WsÊž!´çìÇ‹\BbøÈ‹áníÐy’`÷EÎÏÚ)È4Yöuª?†È+îH>Ë"&ùZsÏ„Y”—+ˆÑŒ¦›ò’/÷±b5=k‘{¢²uæ}ÁdEKˆÍ¨'yš*NÎVê5>–œ ¥ÏYä–@ ƒìo›Dý*Äν1u¬Aæ*Þ±Ù¹CÑÚz,hè°½BÁøÎí<±©¬-QÇâH#àÀ‡·…0 7“K‡ÿÍ¢¨Vai‰+ æ^câ±³ #,1Yu½ŽÚg“÷ˆ¢©´ðuS7eÜØO K#Ðb³ý!E› £W›dW#úž»òðÔÆÜÈìÆ~Ù:ñ¶ÍÇ÷+Z5H9Ïdúm·…8Pý¸‘¹Oý¸´C¯úî&¶xåËnäH\=ÎÆjö=ãЂ”O…Ûjùqˆ‚*÷zöJ?n|Ç«xèYœwÜŒéØüœ±PQ¼Þ¢¤³ ²& N<ª¹ÉÕœ2”öìÒ~¼Ê%$†¼îÆÝÈW‡7mOåñ„(È>W£iCˆíP±G¡ßîcæçuvþ¼û_ÃV›âÜþ5ÕV j¥F¼ ¡Å>λrþ-Ä¡x¿ õ«ìåáK‡­íÃç2JŇŸèAQ»ß!ý,?)34(ýŒ+tÌ|›¿ÿ²ç;ú,ãÒ~¨STä8„€ªÜê'>¦_ª³ë.ÇSëSæHì§VQ´#ü¹2/DÚ}>ÆÍÐ8P®Ü•q©7cáF?}Ú¡‡}ï3¶xíËnÆÂ«¸ZíP¸­£­B‹ô_šŒŸ¡QP¥\û»'úqã;ÆC/ã|_ñ§Ï1MÔ™±žµøxSG¿öAú¹&Qƒ%ÏÌMnç”!³g—öãU.!1|„Åp7ýŠ0F z‚íUÏX”Ýl²ä?uÛmŠ·8ìè4,sšI‚æu>.¾î˜7h˜XÃl™i¢87>K£$¨á **š¶L»ÎÇä¹1±`5‚iB°cfÒÓ ’ã¡î¹ž ÛM™~ÛOHQž«˜¾ÄÛñr%sí'¨¶C¨^8¦Œý8i}Ë|Ò}ç}ï+¶ µ<ƒF£C0ñÉÞÆÞþ¥î¾Ó2„ñЫøãÊwÆêPÞߥ_C)Ï ùWðdÏ)ÇØ³[ª\Bbø©ÃOFÎ6ll»ÌáÃ[ÛI\h0a©ÎÌuÙm6ßkS×e#[ñƒ!öóè?RÃ.¹î•AxÔ§]dÑ¢|$LÐH˜ 8° &-ו^®ú™ò¯~fvÈ{Ò¦¢TÁ(Ù7GW~”ÝyIª'Ü”ý B,ŠDæþØRôù”û•éM?Ú@dBß9¶_ncËPÉ3˜8Näm ª~otx²â«1U·õk'OžÁð¯á0§¸²gíääÃGH Äœmؽh¦n»Íîß…Øt‡MÓdƒ…«Â=³ -$g†÷ww=šª5&pÐðGܾX…h¤ÎÒ:mj¤eiPêñjMÔ5ÒÎ5Uj“÷’Eã8)gh´:>bX! º‰×ü/Ói ù ›¼÷j+j÷+‚¡.cYíPÛ£VôlánÊDb?Ý04RgjP¡º×@m̵ÌCd?nôãFæHõÓ“Fß{Š-ÃΗ!޹ñ÷èÇïx­C/ôÓWü‰Ä6Òæk§HäH|v5Î)ƒ=^‘Ú¹„Äð‘ÃÝôËk™û\ÁŽŸ~¦5@Ì8„xh(ñþÔ5ù“±ÍU‡í–FÌ h ¹¡3Ì}M±b­•±6…;m6D§k´o·)ï²!Ç)¶i Œ½Ô ã%E«hEÁ–îr›S VÜb“g±ñ7ƒpJ×{ÞR,ÿœÉBǦ¸–ÌLWü•÷íÕT@Æ|Šß;XA8xPca6To8~¼ó¬5X°Ê Ö§(x¯{¹¦"çÌ=ªZ ÆP~y™Þ¨.‡´S;ÔÔ(hÄøº—Éû«Ã¸2¹àûû7;4ÖƒÓ½­>ËD`?L6È^ ••Xl=Jy2[ë 72™ý¸Ô›±ˆD?=Ú¡‡}ï3¶ C_öÊÆÜø»'úqã;ëÐ ý¸‰?®lãMÅò },Ñ- ÷‚ЈéÇBa$ò (>»‹Hæ”A/—2{™KH A1ÜM¿<¯>_4³ºË‹f²¾ç#«‡Í CƒÑšLíxēӠ¨ÚhñþæÎÁ¬y*Äæ“¬5 V„¿ U:ØËqN±ëa‡…—œ±.åêÞ´Ž3Œ¨i:£üÀƒ‰ ‡¼Ÿ$« ñA“ɬ LΊ†P¹CÞý6{÷zßV}ž‚4Å®]áÏ›BÙU'x›fÝ3!ò&ú˜ö%“‰ êß²ŽK°<¢`¼Ì/›d:Pÿ¶u\wS¦7òÂÿe“i_3™e BuŠŠŠÎ2Á·-Þh0ȾPgæWͰѶ)jßµ¶å¦Œkûq å|“É áÇdz4ÄŽÎXз¿Mø¼ÁÌÙ§¶_&žk0÷üÁéÃHÐ0t »›“çë4ìv°ìÁ;¥Xù€ŸÄO>ç ü±R½Éœ´Ò`r³bç?ä1%ÂàáË2Yy³Žµ1Ä›SÃÞ—Å/$®žVú9‰:œ~«Ÿì±9.|-ã"ƒ¨gö场±.y•Af³b×ËÞÇ–þêg8Æg‰-§Y‚md,^§Sv§Ã®Áz²‡Ûîaã¿a2ýTÙÏ7¹p]$‡÷o±¨h‘DcÄž)§hÄàŒ×uzøò)ìZ¼ÆŒ«M&ÍÓˆöA{¥CÙ«6;^W§æXxWÇÞàcá¢Î׎[5в×l>zÅѶêõÜzì EîYäK¬™%g;mì¡¢¹DŠ”¶‘ӧЋת¡þù&Ë/½¿²(o hƒ$×#š–Í!^+Ñh>(+ÂÃÝ/´T¥·ûÝè÷›#õ3Q'%Aâ*€?UÃ(±Ùò°CÈÔÌÑ™s¹É꘯oÙöíåܤ7˜w®FÍã!бNâó陳õ™`ÇÌ6ÈþŒNúT ŸªUQ½ÑbËK†’~‰É¬Õ:ñ±Ð^âPøœÍ¾]ÿO»ÂdöB¸äð¦o«ÊáÐz›œ.¯Ð]p¯Ÿ‰qá¿3ä'³ã{{»Å‹t®\L¹Údü,ø ³c‰ãÈúï¼ì^¯p+3ÓM.¸ü>°«>k“óQwyRÖšÌZ«“”ªQQöŠÍÖ‘­Ø4‡ëŒšÐáÔ¥Š†¼þÝ~Üè¹/Ò®ô1ç,@ÇëMÛŠ ž³ÙŸy[ndvc«nôœùÓkÄøÃ‹ m%ÛFV¦/²ÿËOf¡ÅKìlùƒ~¢ž ñú+Ê][./Ÿ¹ñA€ô‹M²×è$Ä…Ûj)u(}Ö"'GüÂ+¿­Ñ!‡÷ï´¨hìør—áå©q5–œ ¥ÏYä–@ ƒìo›Dý*ÄÎŽw·²uâm›ïW´jržÉô5Ún q <\&çgídš,ûºNÕCäuœq7uiKk¹J‡wlvîP´¶€ ZYdòx…™¨uØ÷ŒCsR>î{ËCT…ÿ|¹«¡èY‹Üƒ•­3ï &+ZBl~Ó[#s£7zvC K#Ðb³ý!E› £W›dW#úž»ò¼S7¶êFÏÉ×ú˜{&xÌ¢¼\AŒF`4Ý& 7e¼¢Ï¶øð¶¦¡1áÆž/Ÿ¹ñÁOô\þ7‹=@¢Æœ¯¤ÓÈÉQâùÅälh~ÁîL®û)ÏH«Ç¡À]î-óJf7úñ*þ µÇÌÖhßiÑÖC:ö?g,T¯·(©„Àlƒ¬ ÇÄb¦ýô9¦.c]ø2Ô¾j±¯âÎ4˜ýe¾æ[;NàÝôË~úÄÃøì*¹–œm`ó©Ë¼ÅíÜÔk‚=ã 3ßæï¿ìa÷zdŸ«Ñ´!Äö ¨Ø£Ðo÷1óó:;ÞųkE;Ÿ+óB¤ÝçcÜ åaaÚ«ÁŽW8(Ú«e=ËÕ°Õ¦8w€òx€k™« ·uô½Ð"ý—&ãghT)0aÖyÕ‡Øñž ïÎ*t`†ŸÅçêð¦‡wD¨Ÿõ uŠŠ‡P•BýÄÇôKuvÝåx:¦}ÚªK=û“5hv¨Éq8ÒžÝ{ ÛE¯pÓVKyøòYk{•õæƒQ½R#øRˆ­/†õLŒÎÔðˆ_xäz†AŒõùÊyF`\í–'ù4âçëÌš ­o8žËܧ~¼Š?'A‡‰I,èéŸ:3Aóoêg¤Ÿkvú»‡1³Oý¸ô/×±îÍžWÂó¹ -ÃǬ‹tøÈv×/7úq{1Æ‹øìÉÙ>Ÿö™·D07õ˜`ëéÉñP÷\Ï43MâQçvLÈ–¢rbæÒð«È­ü0¨¶CÂ(oJ¿åJ‚!ˆOîyšI‚æu>.¾îX«Ô05°ÔÑOHQž«˜¾Ä}[ndnNqa«.õ\õŒEÙÍ&KîñS·Ý¦x‹CÁŽîঌW Z[Çø ™i¯)Jvuѳø…÷~¡Â·8©Ág$ÅÕi&ü¡ócý»›þ¢†\fÏâÏIС®Óvb™cu(ïïÙ߽Йnr‰AÅVÔìS°L#Þ„ýÂ…~•~ø²älòU?+–u~.º» p>=&oi‰`nê1ÁVvçe™È—\Ì3Š¡{ ÷0{l¥ãß÷âCì/9FG!åY1lôãx/s$¶Ú—ží2‡om'q¡Á„¥:3×d´Ù|¯M]‹û2®r-šÑÇÜàQ[}ú V©ãˆ_ ¦_8‡mÚ0dh«<—gÄÄÕb›Í9´µ*šª‡¡ÌýŒ?C©Ã¶v¤ôðÔŠŽ=7í4fH?ƒ8î½õËŒ@?ƒE¤¾,94ü#Ä»ï…ojG)ªx4Ÿ:‘û½©KU;Ô6Á¨=÷Ô*´hD#u–ÖY‘©‘–¥Aiägä*þ¨þ)7RylðÐ ¼YAr&4–©n‡§Ë ŒWÄ©35¨P®Ûr#³k[@ÏuÛmvÿ.Ħ;lš&,\¥õ«Lo´4ƒ‘æî7nÚ²B@t?¿#Š )S5Ob¨øE/ K!ÄŸg-qµGZ5ÅýëHdîM?žÆŸ!ÖaUæh½Ê“6¿óqˆƒ3Ýè'âñ$Öù4ÒfuêÙM¿ÜègPeîOÌ•œP¹¢zCÕ‡ª½j@óiOyK$~Ñë켿:Œû'“ ¾ï°³Cc=è1c( ?PÐ{ÞR,ÿœÉBǦ¸–ÌLWüUä§QN±McÈ`ì¥/)ZuD+ ¶¸\é‰Pž¦"çÌ=ªZºôkˆeÎ}M±b­•±6…;m6D§k´o·)÷rs¯ÇãåŠÉÙk¡²‹ ²ÇAéŽç2»±U7zN¾Ädl³CÕ!E»¥3C#hîòÔ 7eÜPýž‚« –A‘¿T|¸ž®–I[ù Ö,X e ëS¼çÎr›¹ .3™ëØ”×@ÜLD"¼k^ü¢OÿÅfÒ Îù±IÞF‡Ú#à­‘’¤Øù¼#quˆÇ´Wýx†Z‡•ï*´/LMsȯ<~ÞT,¿ÐÇÝ¢p/ؘ®‹uÆÌ>õ!}ƺDôÙ:m~}®Á´4ÅÁ?;îûåF?^Ëì’³õŽëù´·¼%‚¹©×;ø¶bÔ_ IDATÅ ÙêÌüª.ܦ¨}×>Ú©êÇB|Ðd2듳¢!Tîw¿ÍÞ~Þý¹ëa‡…—œ±.lÉuoZî+ByŽ<¢`¼Ì/›d:Pÿ¶Õ/g¨Ì5O…Ø\c’µÆ`ÁŠŽ3±J‡{ñ6‘„ñêÛ!å|“É áÇ%z4ÄŽ=äFf7¶êFφ£/4™Úñˆ§AQµÑâýͪë mŸeÜÐüZˆMf¯6YrAø»ö*Eiýj«î™y}Lû’ÉDõoYðÃ÷µãûšWšLÒ µD¡Ê99¾µ^™,t!QgÕÝ&í´óîvQ‡ œjDÍ7YµN§ý‹×Ÿ‘8,C•·´ƒ§ç›A8žQç$µ*šêZ@#ýÓ& m[ˆnáT¤m‡Å»Ošœ}•ÉÊúom’7 ÂP! ¶ ÄÏÐÉZ¤á7ÍûvÞcQÚ º„S•Æ×,ިЉ:$ɵ %²EDAA<¢%²§ ‚ ‚ Âi$Ø‚ ‚ ‚ ¶pª­+zA„‘´Ú`Þ…ƒóÚÈ Ÿ7˜9[%Ÿ†ô&Çäù: »,ûä×ãË2Yy³Žµ1Ä›S§LßO52.7ÉJrØq—Å¡òSGî5^:¬|ÀOâ'Ÿóäщ¢ç“‡ÛØ=×`þe£Ç‚î@K±CÁŸ,òKD‡BßœJö“´Ò`r³bç?¼ÏE2.2ˆzÆa_ΞO‡iì²ÛÈ4X¼N§ìN‡]…'¿3E#Ög¼F÷wç ß¾ŸŠäý´¨ÿô3ÿ“æŸZT7N;ç<ègÔ^‹º¼ý)õë~–§Zl¸Ó9½ÇËmw„0 ñß0™.s¯èùdN:.cï‚o$åÛ|ü´C‹­•5•¢?Á±cŠÉ§nÕ(½3ÔmH¼ÊÇÊ3/ÿÀ¢í>wÖâ5f\m2ižF´Ú+Ê^µÙñº÷¹Ð̧.cïØ|,\¤at|¶je¯Ù|ôÊà æiû˜¾–Í!^+Ñh>(.lvß"þ /ÕÙôØàE%=ËdѼv¶íKs‰)m¢ Ñóð½Æ$ƒxSQò¼Mq>ƒ¾"Œ,Ä~zI®S5–Þîct£CÞ_lŽÔCÌD”„‘{ý©F‰Í–‡B¦F`ŽÎœËMVÇ„x}ƒ÷6Òg‚3Û û3:éS5|¨VEõF‹-/¹fÁ½~&Æ…ÿÎü‘ŸÌŽïíí/>à@œu·Ÿä]ÿ§3[|¯Ÿ¤m¯t$e}Öã* sw)!í “Ù uâ’ÃÕ­*‡Cëmr"|Í·[™Ó/1™µ:¼_¹½Ä¡ð9›}»º·5åj“ñ³4âS4ÌŽS°#ëC¼órg¹Ì¯ø˜¶X#ÆŽ)m%ÛvôëJsÎÒt¼*´­È¡à9›ý¹ÝÛJYk2k­NR"¨FEÙ+6[7:ý² U­Ø¹A±æRƒŒ—ŠŽ ‚w)h8 û%s—ÕÃ0õ¥g·ãåF?c¾âãÌ¥Pò Åöí‘;pöùÉ,´xéu/ÐOÔ3!^Eyj«nûÕ—¹-Ó+ðûZˆWžîìGÚM~–N²yá‡6ŽË1u£C·±cÑOýŒKð+t‹_´øøÍÈõìF?nb‚m YLp{»úà¤ú™Ôñ}ãs!^ߨ"² 7ô¥g·þå6& T·sA¯ èDƒ³n2ÎEéEÒbXKqð‹]+Ïå*ý¸±ïVuÜÅWñpºÉ÷ƒßv•ÃÁgmr>ŠÜÆ2®õ‘µ\#Ú„Öb… ´tùÿøk}Œ9¼§EEcÇ—» ‚_¸OÝØWñE}‘¢])ê œ)~/Õaƒíù˜öš`Ç,1Yu½ŽÚg“÷ˆ¢©´ðUDÖ©œŸµSi²ìë:U ‘Wþ¾é“zÚàã?8œû]“!6¿¦˜øm?ãšm^zÂq_øð¶¦¡1áÆž/%²uâm›ïW´jržÉô5Úþ?{o]ÅuåûNUÝ+$$HfFLB˜Á`ldƒ±Cl’Ž;±ãÄNVâNg°ù¥“•~Iúåű»3ýžc§ÓËi?§_g²ÓñŽ˜`Üí›ÁŒ$$1H  ‘ªêœßW !î)©î•ç»Ö] ‰£S{÷wï³k¸§¾ïr :Dß±wGXºŽ®õ(®‚QE6_sHyÄeç¾Î˜·É»Þ‚·}vîPœn+ ı®y²î‰0o xÒ£ºZAª }ç<}Ž ½ÍgÛ(Ú·Ò¡àï#vÙUÒ9ÏŠVÂáç<ŠBJÅ·;µ¹lìYPm4¿ìrü¶(S ‡7&æjBãùœºÇáš•’·^=ÿ:<ëÄK‡Ÿ³Eaž@X3HÐëÆÃÒªŽ_:Ó£ƒÊC0ÿr žézp/7Üýêl¥ÓÐ ¡òÃ'ždÙÌ»ÛAqÙY€g ~ÂòkHÕÍÚÛ[6u«u:ÚÐÏ:ù¤& Ôµ îUÌQ‚ìlEÉ¿z4ÎwX¼\PúK–Å6 î±Ù»ÃÃS!®MIäGG?ɬ Úõð¤dÿ³’²?ÓXÛ÷\Êëô9ÿå( )*×xTÕBú\›9“Î=Ì´hù‹ßÕ\'0/tÖSý$¬Î+ð]btbÚgƒ=ûN §ÌçÏ?Ø“éõàg($ŠŽzEÓ± Œ)öØüç×ÝåpåD¸l®bß?ûx2ض8ÔìUXDÈÿ¸ÅΟœ»\4nñ©,îåöG–€Éñ=’1õ\ðbqƒ¢fÄêŠ]Ô"̺Íb×O%8Px£ þ7.;6©Øµ ³£,^aÁ~¿µQW 3æHPƒM‹dÿ Š•·Úd¾ãõ‹ç¸ñÒäç öýÊÇ GÖ%øå@µªé—ŽÆ´uµï(¸ÛbFŽOY-X—ÙŒ '·Ê~åN¨Ù,ÏVæ“¥’Ü«¢dÏP®߸ü„è×P« :µW§ÎÇÕ†‚ðÜW~¬ ¡Øg-оëW®¨• ÿ:AãIM»Å¼%‚Ë2 ²=${’ÌOX}ˆs®ºžE“ T´s°^RÑ©ßÚ ÜŸ9Lœ-(¯ÓÔX¦Åì+¡ñ9í:ùÙ¹+RÎ4³SlRœ*S‰Ï‹€±èU? ªó""ȘoQ8N¿.Ó^l+×&+Ö&ïIþ†?»ì™åòë ùÏ]g;C­ŠÖ5:Üi<‡ •ÅÝ®¼xŠÚ½Šü«-2I“§ÙÀ>ëqìëKŽÒ°Í§ò]IùŽ8 ¿«¨.VÌZ;VÛL‡Q8÷FøØ½=3@à9ýÓFk+D2¦7]}$ÊE‚} àÙÑà§ûã)íû|Š÷ }­êú¥£±~éðBÍØ[.Ç?eÊAÙEÊL‹t)Ù_~îèb潦ͤ¦×Ž­)ÁæˆÇÏ¥Tú‹xÚHhíí‘_AkB2Ö‚ 6€èüΩ꼠7X5s(ñsô×.ŽvýœqS„…ùÁjB¿r°IÒêBF–>‡Œ·HGq¤´»8ñUIÈ‹¡Ø#ÅæpóÿéúñÔ;þS%$¦½6ØÊﺭ—,ˆLAîÄØ1Ó—Z¤¬óiBÛ¤)EòvïǶ•þ1Éæït¹ÈfÒÕù÷ÛôÙø¨OC[ß·¹z¢ò —ÒÛ)Wá)ýÔ†cƒlIäŸvlÒ§(VIÉ‹¡Ô#ÅHôÙø’öÓŠæúþÕyݘöJ…ª—œl†ÑEz^¤äÛ~Â&#µ—ù\¢}¬F³ÿßÙG|^У.Óæú{¬~Í£ ÏF$¡1ïÃf¯Â£ ÁØBÑ G3GÀÑþ‘7lóÙýK— ú4O³Yt}1´cóÔ(š¼N{dåÅžYëþ9#Æ Ú8ƒÌ±ÐvXõK?®n½íR‰ÅÌ9ýã9n¼âð¦_m-`ç„·‚ø>¸_: ¤ÃÞ®À¾,iϵ¸â ‹ÉÓáÄ›*pLÃâ0g´¼îSòžääÅÉRE«Œg~.…šFííKZ6„ÄsÐÜI´=×Á½ë¾êRÕdøIdMH=Ôáð ?9ó»¶¡»`Y7ÚdŽHÏíÙ‚Ú·öžV¯ì]{aÆ´Ïg°Kž—Lø¬ÃÍß’”n”4+RmEÅûç³ü/ÙLË€)i’õ¿?¿ÐÉJŸ&×füm6SÖ)N[>BQþnllö]ò³$[àÓØüNrîÜá²µÛ7šãÍMe VÙ,\ Ç!-¢(ßþ³²}ÚÜ{ßT,»Åa‘ô©¬‚QËlòs v9(ëV‡ñ-’ºCŠO:[0héyUgšMÁ*¨­…ôÅ6àè™oô¶Cñ«Š¢U–§ùTìP´û0"WбͧúDpm@ìWîHÅÑæ7ž~‚âÀ)¦~²›Øð/^:ü„åWý&wÙ,»]Q¶TF,¦ýe¨ù°‚ëlæ] umÝâ¥é—ŽÆ´u¨S\K=Ê«¢Üë€%ÙÚýª‹fLÃâ°¾rŠl¦‘?® ] ȳ?—@M£öö© „ÅsÀšp{‚á'”šJ=Ôá°ö¾¡X¶:ÂRË£bøé‚Ô7–Žü§ÏÔïÚ\÷=‡’õ’“' 2N=F±óO2tžܳ´§¯Ú›ì˜öÙ`·¾åñz£MÁj‹ü/8±Á튓ïøç\»[1u)Ôöñ¶ ]¿‘,ºÃfÁý±ˆ7¼áQþ®Â™n³èÁÑó¨jè<Éxßc÷uQ|ÆfïnV/þ<¯ê<ëR29ÂÌO;LVpêM/! v<›ëŸty¿Ù¡ðf‡«F€[-)yÌg_ÀgwmãV;ÌèÜnK6*êÖ{¼×óK…²or˜6*¶͡߹ìè¶µÎñ§]6w˜sƒÍ¢ØïÜZÉ}œ-†A´0é6‹”*¿×æuô-\ª?å²î‰€ç¾â¥ÃOX~µ¼êò~¦ÃÜ•KoŽý®£Nq´¦óøƒKùÄyŸsÈ“pê-ïl¼tüÒј¶5qèO’Y÷[¨Íò¼Gtb‡e¿p‰~Îaæ X‡î6(jj‚ñ¬ÃÏÅ^ª½}iCk1 ‰ç 5!ö„Ö@~\ª‡:Ö?岩Á¡à‡%7uÕºªn»Iy}6þP1çv›¼{ò-MŠÚ·ü„ñ<О-ˆ=}ÕÞ¤ÇtÍÓOyæÝ|.Ïô¢ê–oYI=樛"êožˆ¨y³ ÿæüc·ÕÊÇ#jîTÃÅÅRŒ6ÌÇ|Ìçbþ´µ¶ªKöMŽÉAæ*‡k>!hX벫Ôða 1yFZL»Ë&e«ÇžC†£ ƒáÓ`$#§ êŸqÙü_æUµ Ó,‡Åÿ`‘ªàÔ&õ¿–†£ ƒa±æé§Ô'>u·aÂÀÀÀÀÀÀÀÀÀ`€hkmMÚŽ…—Lƒm``````````ì.Lú¸Mþ\a" äÞåpíg/¾s¦1+m®Xmbl``òÂÀÀÀÀ4ØIÁ”ØL˜` 02ß"+7þ¸È‡ÿ-ÊŠ[‡Îâœ5ßÂéåõSc–ÛLKòIT_ö ‡CÍž¡†xü WÃȋ᪋Qó}ÚlÁò'¢Üræó-«c †mJFÇg4–<˜]D’‘!˜ý‡©WFD £Vrì¿}v¼68;k8Ù‚4äDAÿß Øy‚ó?¢,˜ Ϲ¼¾¡sÙy6‹ï·8öcÙë‹h’ {Âäp¸Ù3Ô ÃÏpä0¬¼ŽÚ¸X5ߧͶ>èbÛ‚‰_r˜u¡ tÆ\ˆÌwX}/ ¡”¼÷ š¶á›Ë†Ñ˜i°/ªæz¬àê"Œk’”ü§Ï‰S:Ù"{ÔàÙÔ¶ÑåÕ*AËA5@ß,¦ç)êö Æ­°`ƒÉÄ5,/V{LL_Ưà6·TÅÞS‘ÝÞû:c.U¸;<^{H €è|‡e·Â¾G<ª›ccc›áÈhl5ØyŸ0s± 5;án¯’l}Ø£¾ÆÝåš1/þðü}H‹Òþ/lÙû9÷V‡Â•iÐQ%©Xë³×¹Efúg& 2²ÅÙ[)'Ö¸¼ýr׸)÷D˜³L0ÂÓ• èO΄eOç³çÈæœ;æ.²™{6Ê«“Zã³§Û+¡ãÚ€ÃÔ¹6µÈ!ˆP§õë=Þ]×y< ®|(Ê„Ä^Q]ù’Çö7cO<ýèð&úª-º1ÕÑOXêò“û1‡‚,FŒùÕvTrô9={ô¹ %/hC'aÔÕœOE¸ü*Azç+†ÛKÊ×ú”_Ík­ƒûõmN&¨Q:u>¬|×ASeì˜)“:OjŽ*¯ÐÍå ëû¡¯0Ñ—ÍAúÃ0üÒÉå¢Ç£¤½êòÊ3Ýþî¾(WOõùË·}t•¦SÇâ6ØY÷D˜·<éQ]­ U>޳ ÑQ£`b׳dic¡µD¦EʼnΆrìÝ–®€£k=Š«`T‘MÁ×RqÙÙù.yk¼MÞõ¼í³s‡âtXi Žu<þËQ,RT®ñ¨ª…ô¹6s&EXöè`Z´üÅïj®ûiΘîH¹ÜfÙý6rƒÇk;m–°ùû.Ž-˜ô•ÞoýdÝ¡h%~Σø ¤X\q»CQ›ËÆn‚žtµ iƒ¤ù>j3ýjÁî€W“öü°ƒò<‡kþ΢îW.%•±ß7×ô˜ç¤dÿ³’²?ä0ë+‚¶ï¹”×éÛœ^`‘áûlLqZ@ö±yÚ¿ïr ZÓMS—:\ÿ·j¿OÉoÍ FA¤»_*_ð8|Rá Af‘ͼ»ä—åáÚ££~ÂB¼Ú¢Sý„Å¡?gx®~Áco9)¸ü 69{ö¨äæ…n¾kÄ"¬ºš>GÞæ³í?íŒ[éPð÷‚»ì*žš×Z5mNjsRJf¾‡…dö:¹t}ï!Å+ uûðüÒÉåÊC0ÿr žéºÛž›î~EÓ8:·ÁŽf h‘ß#9Ñ 8ÑíÿÛ‚Z.ÈpÀ]áÆ{aÏÿt9”a•Ðx H‚‚æ]¶­9Q³Wa=!ÿã;r®[[|*‹/`L¦Åì+¡ñ9í:çÙ¹+R‚¨",{tNº¦Ø¤ 8U¦fO›d-wX|·Eã3.›þûÜc·UÇnýœîèýžFá‚úß¸ìØ¤bO VH˜eñ ÞðÏú6q´¢t§BùPý¾¢p¥…ó´ þtÔƒŸ¡(:êMÇzX/©Øó³¶Â#÷gg Ê딶ͱ†DqxGç<%.9?0a¶à@µÒ¶'.‡Àì;-œ2Ÿ?ÿ¬ïÇfj6Ÿ‰âd©$÷ª(Ù³”‡hOýÄá',Ä«-º1Õá'¬˜Æå' – Z×¹ly©³`§Z̈… BÉ M¿âÆ"ìºÚ ¨Ù#qºbõƒ³n³ØõS9,5¯µÑX’VJf¾‡‚$öZzhO<„¯08ÔÍ‹PýŠ“Ëµï(¸ÛbFŽOY-X—ÙŒ '·öãnRœ:·Á®{ÖãØ×–>¥a›Oå»’ò]θõ w„ 3] ¯‰=÷4qŽ ªUiUÔ4ƒ“¸Û‚§¨Ý«È¿Ú"Ñ4yñ}qÆ[¤£8RìLã¼yò±G *ö55@{Ú‚Ø<ËáÚYаæüæZ‹Ÿ™£,pîð±{{üg£Àà)ȸÊ"¥Ê§ædì¿Z·Kš?n‘?ÅgÏ¡¯ M’V2²‚Ù|Z­0jt¸æY¹6Yа6¾RgÞaÚ»é²áAŸæi6‹®ïd±Nµ rVØŒ>êS²Î£i‚Åô‚ŽÎ&Ë«ðhB0¶PtÌäÌpTÿÌìÌ<9óéÙ²G»Q­€Œm2Gôßž@6Ÿ’ìøql™ßˆpùÜ^Žë#z±GAV4Sç|šë;Es™Í„±Šƒ¹¼ö@×gÛ¹¨KRm-`çįʉ š2€˜Æ±9Ðâ£iOoªzÉÉf]Ô·ï9“ åuŸ’÷$'(N–*ZÝðíI¶æƒ ·Ú$¦:ü ”C­úzBÑŠ {†åœd yÔ¯^ë|"ëª-›/ F3fXi^c  ߢӫ¶B¬Qºu>¬|p. B=ìKÏaÚ£»¦ TcZ6Ì‹°üЇº—%í¹W\a1y:œx3„³·^êXß_r¼Õa|‹¤î¢Ã¤ÎŒZºuûÇk`Ê|AÍ¿I¼V8xP°¨ê_Tg‹ÏÞ7ËnqX$}*«`Ô2›ü\ÅÁGd "¶÷ ŲÕ–ZûÀO¤½–=š8òŸ>S¿ksÝ÷JÖKNž€È8AöÅÎ?I={úaó‘w‘D¸òkÜŸºìï±÷fS™‚U6 W±FH‹(Ê7)h‡âWE«",Oó©Ø¡h÷aD® c›Oõ Q`‘ޮضWÑÔíyÂö­µØ"/Û§â8ÔoRp—ͲÛe{AeÄôÓSβҧɵ›Í”uŠÓ¤P”¿«´cÏæ@’¦=½r”Šm~Òažô©>{ùS&ýÛéhÀy¡é—Nµ®N³)Xµµ¾Ø¦`}\yÍ÷…¸ë`@5Vpͼk¡®íܺdL_«FéÔù0ó=Œ¢dj#®žC´GwM°Æ4m’aù÷«Ô£¼*JÁ½X’­Åýl°5꘧)gÜj‡[‘ÈFEÝz÷6vtªDAŽb×®ØÏ5$n ®Ûmžú']Þov(¼ÙáªàVKJóÙðñ…ú§\658Üà°ä¦Øï:êUw8Ë­`ôÙøCÅœÛmòîqÈ·@6)jßòÙÓ›«þÝ%-7JÁÿãpêÕݾµÛð¬KÉä3?í0YÁ©7½³EþøÓ.;̹ÁfaQl¼[+9°ªO@ÖbÇ|z|YÇ=$i&ö%«Šw-¯º¼Ÿé0w¥ÃÒ›»âu´æ|[wýF²è›÷ÇΘÞð5ñl {úâ°õ-×m V[äÁ‰%Z»âä;þÙ"Vö —èçf~ѡЉ­Hnƒ¢¦&|{ÂÖ|ÊL‹ÑQàr›É£$GÞbÓ©-AbªÃÏ@9Ô:¡þy‘/F˜ý)‡©NW) ú¹n4/tüÒ‰E¨uUBöMÓFŶÛ:ô;—Øo¨i¾/謃A4vâ.å#ä}Î!O©·¼óš1}!¬¥SçÃÎ÷"™ÚÐÑsXöYSª1›ƒäEX~éàП$³î·P›eÿÑ©ckž~êÌ÷ðÌÇ|ÌÇ|´?³¾U·<ì(G.zýdZêú'¢jÙ"à¦?U·|Ë2\˜ù˜Ï }¬ñ¶ZùxDÍš¸:ÖÖڪ̛ Á+˜ñQ‡yŠÊ'ü!ù%®ÁÂèëlÆœV47(Dº ÷ãÚ%[n còŒ´˜v—MÊV/á;ž™ÛÀÀ Djl+¢âŸø®0|tGÆl‹9W ¢·1[J%;ö8Úh³ôDŠ IDAT¸1000,8³ÿƒEª‚S›<Öÿ:ñÛ‰5O?¥>ñ©» ûD[kk"v¸5000000000¸talÓ`_z³ÒæŠÕÂa840¸ ¦%‚…FßA¹ÂfÞMÉál8ÖS3 C“>n“?wøëÎ4ØCYó-œ^^S9f¹Í´d΂åOD¹åÌç[Ö +4,{’Æ¡fLcžá¤ù¡¨çȇÿ-ÊŠ[Ŋ׬ïD¹¼@ÑtB z¼âÑå0)ú»Þ&ožH ?ƒQ†£ÍCM?ÃIÏ‹6¦|Äf„áÏŸi°‡ì<›Å÷ÛLdC$l}Ðåõö(­Ä 5{!¦CFÃQó!ëÇɤÙ>Q ™x½;BÁEñÿö(»À¶Sîp¸áç'EXù÷6³/1:=_š65ý=_|ëN2a¶é38-U±½Ò³Û=FÏÝѶÑåÕ*AËÁ¡±ù·5ÑæŠ‚ãO¹¨<ÿÿ3?añ*8ú¼Ç®R…JdÏÔŸ<›‡‡à CM?FÏýn°§Æab¡ #[œ½UpbËÛ/w‰)÷V‡Â•iÐQ%©Xë³×¹bKkSðQ‹Ü‚ˆuZQ¿ÞãÝu]ã²W9®²“ ªIqìŸ-ëÏÝ«0ïóf.¤FíU’­{Ô·£ƒx~åÜé0w‘ÅȬح¯NrhÏžmÁmá£Q&ì´ý»Qò:ïoóx©û»íg9ÜüD#à×I>ç³çƒs¥ÃaX%î\ùP” 9 ˆ½r´ò%ío$¨Xip¨ãW›qÙ O(ŽîUŒYl‘æ)þÖc×vj¾‡¹žN¹'œe‚œ®T8@[ÿÚ×…ÉnßÒgƒm·É»Þ‚·}vîPœn+ ı®IÆÞaé 8ºÖ£¸ FÙ|Í!å—ï¤O]êpýßZ¨ý>%¿U47€‘š®y²îˆP´?çQ|R ,®¸Ý¡¨Íec§ÑY÷D˜·<éQ]­ U>ŽsÖ£¿Ò ,2|Ÿí)N ȾÑaÖWíßw9P­¬=?ì <Ïáš¿³¨û•KI畨æšÉuR²ÿYI‹ ÙŠ«í{.åuú†…°âŽ„Ê<ŸTxBYd3ïnyÄegyì8êø¥£1혆  ›µškx…•:~…UB„ÍßwqlÁ¤¯8Ìh.‡„Ëæ :vz´÷Ò»7YäM”TT]xŒNÝÐñ+îMuôs&îÕ/xì-2—Á&g‚`Ïž€\ 8ùßû«a䛹Ÿ‹iqÙÒÙ(èh,¬®«Å0jf2×Pj‚¦~ÂZw²'Y½„%ÈÎV”ü«Gã|‡ÅË¥¿ôhYl³à›½;<<^¾‡µžŽÿr”‹•k<ªj!}®ÍœI=jT}]˜üèæ Ö#"[|*‹/ð)P°BÐü¢Ë¶õ ÔìUXDÈÿ¸ÅΟĪþì;-œ2Ÿ?ÿÌïõ:zá‚úß¸ìØ¤PfGY¼Â‚7bÍÐ"9¾Gr¢1v5æD©tÆÄ…¦_1)ïˆý\[â’óóf TëùŽzð3EG½¢éX/ë%[;Uá‘û3‡‰³åuJ›ÃPVÜ;Q³¹ëêÚÉRIîUQ²g (O@SÒ‡š~éhL;¦ÕF­ÆAÜx…˜Aøhý íVpuìQ“Ó!ärXW°Ç@kMUý¯;Ø“áò¢LÛáSñšä`± \{uüÒ£Ãa\ý¤@ÁrAë:—-/ÅâNªÅŒ˜$‚ãÏÞW$.@±BL‰Pø >ðµ5J €0jfÒ×j‚Ž~ÂZwB±'ɽ ˵Rá_'h< ©i·˜·DpYT¶†—§™³¯„Æç<¶oè³rW8çär(}]ˆüèæà€žÁvò2PTw9OQ»W‘uìuÊ-Ù6Yа¶÷ÅΙé0ÊçÞ»·çê*px êžõ8öu‡¥GiØæSù®¤|ǹâÓ†_MÞþ°UÑÚ£F“x4IZ]ÈÈ Æa+îg0óÞÓæ RÓÀkÇÖ”AàP3îah,,ô[«=ïVåjäéË‹°|ΰÈö¾µWöK—C—YL^n1ãk ú¼õ/>M§“[7úúqò2„¢jW·¸‡_q|¿‚k´%Rc=êO ™šÙ_ý$¨&èÔ±dr8h5³“s!bÿV±5‰Í÷~¬§mã-ÒQ)í;—C_sCàGG?‰ù’c·/Ó*¿ë’záRÚã6¦rÕY‡üc’Íßé s‘ͤ«-òï·)8è³ñQŸ†6ý1aøÕkÜIÛ›EÊóÄ¢qŸþQ ÇIJþèSsTÁh‹¹÷Ù¤0xÆ‹{B5–€XhÕ›y:Ôó‚KhÛÞöHÏ]+F/ðª%ÏHn,ý§Ën—¼ü54êõcu>÷(Q?"‰õ§5S) Ú&2¬u'5a¸¬; ¯™ ”ì½*$*߯§Ím<>B_sÈ®~$o¯Â£ ÁØBÑ5‘#È™#àhìÌLÕKN6Ãè"Ñ÷< ²ò é˜:çÓ\þø†m>»é²áAŸæi6‹®ý3¿B_@\¢)ˆEµ.æø@4qqÈ™-¯û”¼'9yDq²TÑê³',{< 4¦:ó„¥Uí< 1/BÑ|{ÂÒç#îWJ¾Má'l2RûoKÝ1H¿\¿¶©Eu ¤L놎_º¾Çã°ÏEü„¢Aö þ9[DSØ¥Ÿ  +ßãA§f¶µ€#’“ƒ!®;ÕOØëÎ@íŒ^ÀÛë±î«.UMýW2êó™19ó:çƒéëÂäGW?»‚Ý{ßT,»Åa‘ô©¬‚QËlòsé:…,y^2á³7KRºQÒt ¬THµï+h‡âWE«",Oó©Ø¡h÷aD® c›OuçÃ6Y·:Œo‘ÔRtx‚ÔÙ‚@Kc—I:cÂò+Ô«•>M®ÍøÛl¦¬Sœ¶ }„¢ü]¥m³‡AÐ|XÁu6ó®…º¶sãJÜújÈ)²™~Drü¸‚tAj$ =¡]ÔóKWcŽ©Îß>å0ºVRDá)Áȹs¦@ãó*pÝÐñK×÷xö©›jŸÅ6 ?é0OúT‡‘ù™œ¿ó€2¹s-Ú£0n…ÍÌÅÁßËÀ +ßãA§fÖoRp—ͲÛe{AeÄj”âëNú sݰ=ƒÐK„¯¤ÔçvØû†bÙêK-Š}à§ R{Ü„¥¯ ‘]ý ø‘ú']Þov(¼ÙáªàVKJóÙ×íü­oy¼ÞhS°Ú"ÿ Nì íŠ“ïøgüi—ÇæÜ`³°(öwn­äÀ>Î:e ·ÚaFF§uë=ÞÛØp1aù6výF²è›÷ÇÔÕð†¨8ëp'þàR>1BÞçò$œzËë*P!Žì.ÑÏ9Ìü¢C¡[ÜEMM0{B[¼4ü ¢±ÆTgž°´ª¯°ób ü±',ý4<ëR29ÂÌO;LVpêMï¼æPǯÚÝŠ©K¡vOÿõÚúšË‘E™ó‹²Ÿ_`Ávaì‡ffÇîÂú Šš<¶üUõ«nèø¥3F‡Ã¾päçD¾aö§¦ 8]¥ÄnûAË~EëR›E_ï\_Köý‹OÉþþi,¬|ï :5³åU—÷3æ®tXzsìwuŠ£5Cݨ~Â^wjÏ`ôaÅ+õ¹þ)—M 78,¹©K«UÕý[s“Á®~Äš§ŸRŸøÔÝ ?¤Ìw¸þ~‹ŽW<^{V^š$dZ\ÿÿ9t<ÞÁ;ÛŒ& m­­æMŽÃí;<Þù£Ãµw9,?åò憋ÿr£¯³sZÑÜ é‚Ü;Œj—l9`ô```04`lƒaަW=^¯±H9ti¼®9c¶Åœ+ÑÎÛ³-¥’{m4Z0000 ¶AHhÛ#i»D|­ü¿.•ÿ×ÄÜÀÀ`èÂ2˜ÛÀÀÀÀÀÀÀÀÀÀ4ØCcVÚ\±Z¿`ÒÇmòç “1—,.Öºa0´0¢À"#ÍèÙÀ Hdo3ììȇÿ-ÊŠ[û&$k¾…ÓË«Æ,·™6L›ÅÁòkÊGl&LH\¼†Ü"7ÏféƒQþæ‰(·<eÕ÷fL 6&,ß“Ía_Œy.…üê/‡ÃU«~B©µw8¬ü¡ÃÔËÜ`kêy¸Öð¡–;+ÏÃÝ÷þö6:=À°û’£“-H³ANôö&y;ÏfñýÇ~,ÙUqñˆp8ú¥¯¡ˆ…_µSæ³ýI›/HɆãµÁÆ„å{29 KcÃQ«CÍf{†£6†Ê±"óVßßË5&)yï5ƒð­Ñ’‡:Hùç(ó¿áÐòG}Ëàú5køPË‹y­4}B=Àp DÛF—W«-/-W ÇxÙSm2EÕŸ|*˸`ÂëŒ Ëw£y£ðáîðxí!¢ó–Ý ûñ¨n$4â–,»î’ñ`„E·YlxRª_«Æ†š_—r._¬}BŸor̹Óaî"‹‘Y±gI¼:É¡5>{¶;QÞç#Ì\,HÆŽÑ^%Ùú°G}k0ƒ³W9®²“ ªIqìŸ-ë;‹‹Ë’yö4ßãŇÏ/< 2yäùsûÛ<^z<6~úQ.ŸD#à×I>ç³ç¥oO'¦Æab¡ #[œ½ubËÛ/+ìÉ6WÝg3.ä ÅѽŠ1‹-Ò<ÅÁßzìÚ®´¦_¹·:®Œ=ç×Q%©Xë³×¹c¦ÜaÎ2ÁNW*œI‚¶g]^{E34ã¦~âÍSð£(yë~ÕeDz'¢¤tó«7ž›Öº¼¶^sLßSçÚ|Ô"w† "@VÔ¯÷xw]°yâéG'—u4¦uV¯9ŽutvåCQ&äÄ^.•/yl£kžÄ=u#”X„¥1MucªS3‡”~:‘ru„›î…¾årä{i뫯µ ?H¿) ·Áöt9|‚ÐýŠ«çA¨áñxÎùT„˯¤w¾2»ý°¤|­Oiqbr'®=š=ÒP[+u´ª“Ëã>âPxƒÅèQ±ŸO•T=ç³g·Ò«½|Ëæ÷6š}BÜ79¦Xdø>ÛSœ}£Ã¬¯Ú¿ïr ó=ñY÷D˜·<éQ]­ U>ŽÀϺ#BÑJ8üœGñAH)°¸âv‡¢6—o(°ùû.Ž-˜ô‡Y½Ì³ç‡”ç9\ówu¿r)©Œý¾¹¦y'%ûŸ•´¸ý¡˜_mßs)¯Ó´°ÆÛä]oÁÛ>;w(N·•âXìÿÅ(Av¶¢ä_=ç;,^.(ý¥GËb›÷ØìÝáá)½c…åר»#,]G×zWÁ¨"›‚¯9¤<â²s_lÌø/GY°HQ¹Æ£ªÒçÚÌ™°²kÆ+4ý„4Oo<7Súc4}O]êpýßZ¨ý>%¿U47€‘š`óèèG'—µ5ÖO»Ï££C]U¾àqø¤Â‚Ì"›yw;È#.;Ëõ9¬ºJ,ÂÒ˜&‡:üèø>äô£cÅ[ úƒæ—]ŽßejàðÆ]ÙëKÏI®á:<§Ï¤·ùlûE»ãV:ü½`ÄÃ.»JÂÍ-{4ry¨­•:ZÕÉ屟ŽpÍJAýËïï™.˜ûE›œñ>{v‡ë{X6‡ÒÛhö  óˆÈIÅá±3€Ú—œŸG˜0[p :6Q4K@‹äøÉ‰ÆØeòÀ'ÛÞ(¨ÿËŽM*v¡½BÂì(‹WXð†;#¨V€âtGïSuÔƒŸ¡(:êMÇzX/©ØÚéW…GîÏ&Δ×)m{Πq‹Oeq/ÇQÐX®¨• ÿ:AãIM»Å¼%‚Ë2 ²UïX¡ø•+Í/ºl[¯@Í^…õ@„ü[ìü‰„L‹ÙWBãsÛ7tŽÙ¹+R‚ÞöшW(ú qžuÆèø>ûN §ÌçÏ?óûÏa­ÆÉem ”C@Ífy6ÙN–Jr¯Š’=[@¹ 5î¡Öb–Æt8ŒkOÀš9”ôÓ÷%à`Çês-èêjaƉj°ûÒs2kxž5{$.PWì¢~aÖm»~*ÃË öÄÉå¡¶VÆÕªN.§@Áõ‚Öõ.ï­Uø©3$ŒH@ŸŠÍ!ö6ºëE°g°[­0jt·ð¬Ç±¯;,}8JÃ6ŸÊw%å;‚g¦Ã( œ{#|ìÞžŒ ^"Íi’´º‘•@{:Ç‹Îgø±Û± õ½§_y(*‹câÀSÔîUä_m‘áHÚÆ[¤£8RÚmL†~œ'Y°rm²2 aíÀXî·~.Ëɂޛ<ýùfÞaÚs§BrÞ¦…¡Ú£@ÉÞ¿›(ß/ä×y=ììù»",ýèÌ£ˆ!²í—ò»nW†þè§g.:ú¡¹éÿ¥pœ¤ä>5GŒ¶˜{Ÿ}ΉDÆ=¬º‘ˆXèjL‡ÃáPÃC[«ýZ m-ÉsKk½HP ï7ÏrhÅ=Qu5¡<ÌeGè…&ÙknŸ6'¹·éWƒÝ¶ù4lóÙ;ÑæÚl]/yõ¯zUÕ«ðhRQ²ò iKü¿ñ\ú¼¡\¢ý¼ŠÔ­9÷z¬ûêù¤9V(~el¡À*ï<‹s9sõcgäcræ ìòpÎNãÅk úѧ­ìœäî³Ù›ïª^r²& x·ÿš[«Õ˜ÎMq£Ì±Ð¶{ðïÄ%º†÷›g[06_@͹W”š;ÉÔØ`­•©c^¥¤‡ì9Ýø¹‚¬¹:¾Èæô6 o°³nuß"©;¤èð©³#€–Æ“´Cñ«Š¢U–§ùTìP´û0"WбͧºÇƒFMe VÙ,\ Ç!-¢(ßÔEª¬ôirmÆßf3eâ´é#å彩Ø3 8V~í}S±ì‡EÒ§² F-³ÉÏU|DvyC±lu„¥–GÅ>ðÓ©¸PÐW¼BÑæ<õ›Üe³ìvEÙ^P±1 }ú¨ßKž—Lø¬ÃÍß’”n”4+RmEÅûJožµ:`éÌ££CMÔWCN‘Íô#’ãǤ R#=ÆhÆ}¨Õ ]{ª1ubš4ßCÔO(53 ò¿d3-¦¤IÖÿ¾wm93rG*Žîü;á5<ÏÓl VAm-¤/¶)˜G{ìr4àÜI¦Æ’¼V†RÇš$û·ÀUwX(}ªªadÍ Úèßš¯¯°Í èmÞ`ÛÆ­v˜Ñ¹mŽlTÔ­÷x/à—2Ž?í²ñ¸ÃœlÅ~çÖJìã¼âÜð¬KÉä3?í0YÁ©7½ó±ë7’EwØ,¸?Æ^Ã^ &!ˆ=Ec Ô¯ú']Þov(¼ÙáªàVKJóÙ×í›÷õO¹ljp(¸ÁaÉM±ßuÔ)ªªûç__ñ K?:ó´¼êò~¦ÃÜ•KoîòëhM⦾|o}ËãõF›‚Õù_pbÉØ®8ùŽ^ƒÝ×èbÛ‚‰_r˜Õß1C'¦Æ¯ääÅÆÂ¯ÚŒ)óÙþŒ¤Í¤dÃñÚ`sLýl„ük#訔”=íQº¿Gña‡+V[Œ U’Oy8pî˜9?Œ2{ܹ¿;ñ«ÞÞÜCC—Y,ø¦Ã¸Ý±'Q˜p‡Ãœ"‹ô4ÀU4•JJ~ïSu|p4ïd Òl½½÷6¬c%3O¥ÒýÛ÷Av ýú–Íkj}i°û w‡Çk ï°ìVØ÷ˆGuslñkl3……–*(²Û6ÆÀàRË‹!y²3Õ&ÃQTýɧ²Œ^›¶¾0þËQæ_¡(û­ÇÑ0ö&›‚oD¸”u¾%.m¹Ã²OZ4lðx¿4öö¿Âo:¸ÿËãP·f5š-ë=¶¼¯ÎZÒXyîñ&ÂaÎM©@"÷IÈüd„Å«àèó»J*]=KPjðâÕ¶ÑåÕ*AËÁ‹ë*d{x¼¶Ÿ·I›M_j_·Áνաp¥EFZì @ÅZŸý»Î êôÏ8L,dd »ó À—·_Ö ¾=ÙæªûlÆeƒ<¡8ºW1f±Eš§8ø[]Û;ç±àʇ¢LÈAì5©•/yl£ë89w:Ì]d12+ö€¹W'9´ÆgO·W©=%íU—Wžéöw÷E¹zªÏ_¾ík¿—¾©2ö÷)“: ÑQEcãàpx©sm >j‘;C N+ê×{¼»NiÛ£ÃáÂG£LûwÞw£äuþÞßæñÒã2_:ü„…ìU…«,Æd‚jR{ÅgËz8yŸ0s± 5ëÚ«$[ö¨o=÷x—}>Â’«¡ê mÛ¾þ]7/49Œg³nLã¡àGQò*<Öýªëo.ô†/uâÚ~Ír¸ù1ˆFÀ¯“|ÎgÏ*°~úBôJ‡Ypä§.;ʺ~?êÖ×ߤØü?<Ž5ëÕº0cÏ::싩ߎ2õL-]ëòÚz}ߦ/‚æ?yì}O!“Uù‡× ÊžŽÍ“÷ µÛcóI»‚š Œ;̾^phM×±RRàôAÉ©Ê kôm ç**žðH½Óa|ø1…J<¶üõ ÷ŠúíÁëX(¹¬ùRXuCwž°Ö‹öE[uìïšO(RšÎ÷?^êäW˜~ŵyò·®ÆáY»f†TÇÂìëúl°ÇÞaé 8ºÖ£¸ FÙ|Í!å—û:¹o“w½oûìÜ¡8ÝVˆcú£ÙÙŠ’õhœï°x¹ ô—-‹mÜc³w‡‡§bg•/x>©ð„ ³ÈfÞÝòˆËÎÎÍ1Ó ,2|Ÿí)N ȾÑaÖWíßw9Ðù¾ùÊC0ÿr žézø(7ÜýаŸbL‡©K®ÿ[ µß§ä·Šæ£ R£Ù£ÃážvPžçpÍßYÔýÊ¥¤sqjîv,¿tì YwD(Z ‡Ÿó(>)WÜîPÔæ²±3™ulκ'¼%pàIêj©‚ôqœ×\äÎ ræÛ‚Ù«›:êØ¬ÓÐb¡aN¼t í×IÉþg%-.d(¦ù¶ï¹”×…gOÇV2JΕʺþfü,ñÏ.:µ.™yV­ë-MAj] 8ÜSÝ®}ŸVÔÕÂø¼ÎÇÒc³àÔŸ‘•7Ü&8ðªJX8çÜGFD¡#Úûã§žwyùùØ¿/¿3±WÐšŽ‹,ò&J*ªú¯PrYÂæï»8¶`ÒWz )¬º¡3O˜ëʼn']Þíü÷±Ç]ªZÏ÷?Œ Ó¯¸6AžãÕÕx<ëÖ̰êXXµ®ï; Vš_tÙ¶>ÖxÖìUXDÈÿ¸ÅΟœÛŠ6nñ©,€Å ˵Rá_'h< ©i·˜·DpYTvžAÔlî:³?Y*ɽ*JölåÝ<©8¼#6®¶Ä%çç&Ìè¢ÄãbIDAT<ó«}GÁÝ3r|ÊjÁºÌfÜh8¹5äö:ÉξÓÂ)óùóÏüۇÎzð3EG½¢éXïvõêW@~ oÔÿÆeǦÎ[ÁfGY¼Â‚7|íXD³´HŽï‘œhŒiñD/‡Ý÷+w.Y§“ízêØ$¦E\{ƫϦVׯzIEg ¨­ðÈý™ÃÄÙ‚ò:ª=‡K`Ñ¢®|k¢Í¤¨}î\½kÕº$çÅ@k](k‡ºã0óÃãöùÔžgŒ mÐy ×kN6€3EI´Th8 LíÚÕ@ŒµðOÂØÏG¸å^P'Ÿ÷ØõÞàÜz¯ÿu{R#\þ@”i;|*^“,VãV.Ç®–*Nw„_ÍÓ®²—F5ŒL”_²u˜ðÜW]Õä9nÍ ±>‡Ù×õÚ`;y(*‹»]Õõµ{ùW[d8’&/¦“sÑyAA»mp3ï0mž 5 ¼&phMéc¾VEkŒÝ­h¼årüÓQ¦,”mP¤Ì´H—’ýeẒL­\›¬ hX+÷ç7~œ™£,pîð±{{žAì.‰êžõ8öu‡¥GiØæSù®¤|Ç…ÿ¸}ŸOñ¾Äå….‡AlNâÙf¼úw)QÒêBFVøöÔ¾&ñ¿j1wªÏžCqÅÈVÉÖ½çŽ \ë1/’½^”üŸô¯Ø\ýûܦc×ù‰ÓðœË+ÿ íÇ!ûC=þ·^òÎwbÝ£•“?aþß:8M.Nn”ýÒåÐe“—[ÌøZ„ƒ>oý‹OÓé!ƒˆÁèI’’ƒƒÕk †==êª.Ïñjf2ó"?Á¿ä˜è- (yá›uÓÿ1Já8IÉ}jŽ*m1÷>›xzWŠswü–P¾–\gÁŸ1KªÜ§ª1I N‡ÊWg}K„=çq8Ìø9ƒÊ'\J{ÜzU® ”|þ1Éæït¹ÈfÒÕù÷ÛôÙø¨OC[òóB‡ÃdÚ¬;ÈW¿¯jÉó5†=xk2éZÁžCмk§7y4´¼Öõ' å9A¹ìôyÿ;>X"Ó¦è6þî˜Á²^Ò͈LŠ¶ã±³Óc€ÕëÁC¿sÉœeb‘ÅŃ·í¡W-©xFrpƒ`é?EXv»äå?¨!‘C Ò˜Nêæ×P[ÓžžuU‡gš9èyq~zm™¼ &c E× G3GÀÑÄQy{=Ö}Õ¥êïçL‚–×}JÞ“œ<¢8YªhuûyíeI{®ÅWXLž'Þ ?ÉäPÕKN6Ãè"‘4{” A4%9üø>Ó¸õ2Æ«ðhR•{Þ³û§¹¾ö7lóÙýK— ú4O³YtýùÜ[™‚I×X Ë‹ Ƴy 1hk;G ˆÃ°ãŠVC´§ì-EÊR›)Ë&¦+Êzìe¤Öõ•ñb–_ƒµ^ Ám… wÚdœ–”níä±UQF/D;Ý‚‰“ moâVÛ”|›ÂOØd¤†T×Õ52)x^„‘Ëgãë#—_:ó$[c:9¨[높_Ñçx53ë{µ®÷+Øí°÷MŲ[IŸÊ*µÌ&?Wqð‘Á9³¯¯†œ"›éG$Ç+H¤FúIR©GyU”‚{°$[‹Pt“ÌaÉó’ Ÿu¸ù[’Ò’¦S`¥Bª­¨x_…n¬ôirmÆßf3eâ´é#å彩ðÓ|XÁu6ó®…º¶n~éŒi‡âWE«",Oó©Ø¡h÷aD® c›Oõ }¿³nuß"©;¤èð©³#€– ÜÉÿv„YÙ0wºËËO žÆtmpLúM î²Yv»¢l/¨ŒØ±TCŒWXZ ÓžS|N®rXpø»<Êjû_ëúÊ‹¸±˯d¯Œ™a‘ž'˜´ÂfÜEÙ/<ŽuÓsÅ:IÞ=‹o‹í}õa‡!ÙñzWÌ3?d3î´âÔq Æ^k35Cqdã¹6§OXQAŠVº`Ì$h¬Vø=šü/ÙLË€)i’õ¿žï>å0ºVRDá)Áȹs¦@ãó*p¼ÂÈå3h*S°ÊfáJ8ÖiEù&ú±úœ'ÉÓÉAZ7ÔüŽ<Ç­™!×ç°j]ŸˆÔ?éò~³CáÍW·ZRò˜Ï¾} Ê~áýœÃÌ/::1» ŠššþÍwèO’Y÷[¨Í2a‡$“ÃÖ·<^o´)Xm‘ÿ'ÜvÅÉwü®7d{výF²è›÷Ç®&5¼ákÆØsâ.å#ä}Î!O©·¼óì¾ÆÚeãq‡97Ø,,Šwk%ö(mãV;ÌÈè,VŠºõïm<ßï– œÑ½ïR ±y 1myÕåýL‡¹+–Þû]GâhM0{ŠWX~…jO“dßûpÍÕŠŠå€j]_š×‰EX~%³Ö¹#Âu+µŠãx¼ö’¤©¥G=|ÓãT‡ù«c¾»U’âG{ì=Z0éf›‚Q±ŸO–”>î³·Ûó×öT›kþ§ÍÙ‹Ò ®[Þæs·g¨Ý­˜ºj÷ôÓ1Æ~Øafv쎳ߠ¨yÁcË_û—ÕüÙ;MϺ”LŽ0óÓ“œzÓ;§ÁóX}Í“Léä N~ 5¿†#Ï:53ìõ"ŒZ'Ö<ý”úħîæR„5Þfŵ?vÙsƒÐÍ·¹ö›6 ÿÚÁ¶Ý†ƒ‹m­­—æ›Çä i1í.›”­ži® ‚‰÷E¹rÔ­uMsm`````p á’k°Y‹ÿÁ"UÁ©Më- ‚ú—\^ü¥y•­i°/rx¥¯|ÉÞ ñh?dškƒK–¡ÀÀÀÀÀÀÀÀÀÀÀ4ئÁNrïr¸ö³æ¼Á`haúW",X( ƒ„i†ƒä`H=ƒ™ã°üëÞz—7^èßó«#ó-²Z.í/.fÍ·hÜ-ñü6%ólæÒfÜx°$´UJÊíQVe'f}'JÁxÉž¿&ö™ì„ÇË‚åGÉ<ós‰Ç‹Ë„ë0 L¹ÃaÎÉŽŸzª6š40000¸„l'[fƒœ˜¸—r\ì°ólßoqìÇ’]›káWmÆ”ùlFÒæ R²áx­á8ÆÞ¡`Š¢øGe•çþߢŽ21§ë…õ[|Þ{FÝxIØú ‹m &~ÉaV’t÷„òÃW¬¶5:ª$žŠ½¹¯;Jê 埣Ìÿ†CËCõ-F›—HƒÝ¶ÑåÕ*AËAÓ\z£>Õ&ÃQTýɧ² sÂÓXm®X!8þ”ËÊžÿ é9Ðügû ušEÞß8Ü2Ïçµòiêšñj©R€"»}hpœ¶ÜaÙ'-6x¼_ Ù79~ÓÁý_ç¾±`÷Ï]2Œ°è6‹ Oší9 ±Ážþ‡‰…‚ŒlcÇ~wbËÛ/ë/à9ŸŠpùU‚ôÎ×"·–”¯õ)-Vg› Ý[Ï©sm >j‘;C N+ê×{¼»îÂöDgÛ,û¦ ¯¸¼¾&@ÓaÁ•E™Ðy…Q6(*_òØþF°Æ%®ïȽաpeì9ÑŽ*IÅZŸý»T X,|4Ê䑱ßç}7J^çßùÛ<^z\¿¡è>ÏÔoG™Úùû¦µ.¯­W¡Ú¬ƒ¢Ç£¤½êòÊ3]“s_”«§úüåÛ>RÓž‚EÉ«8÷õÆËžˆ’ò¬Ëk¯„ßfÞ`‘Þ(ÙøVïs»Õ’¥@©äØ.›¢Ø\õÉÿ©ëo²W9®²“ ªIqìŸ-ëe°xiè9,~‚èð²ÏGXr5T=á±m[ðä}ÄBíöؼFÒ® ¦ÂûÿÛ»÷ਪ;€ãßsïÙÝ$&ðHTž„¼@|€´ÄWlñ1S#c[Kk§ô1R;vÆþÓ?ªÿtÄ™ÖvÚéLG«míø‚Zíà£U E:  ˜@ äE6$lLî½çô%’!‰îf7‰èï3sþ` {çœßr÷îɹä<¨Yrƒ¢é¼Ï»í´Ô¾h¹±ÚeþVñSrB1¶s‰Ká ü' ¶Æòa?8Y N$w"Ì.Ud÷ì}Ü2 av•¦ì^EƯ<öÕvÿÂC»Š¹?û«çÌUš¾ë`Ô?ié‹‚š¡¶Ñã‰,uY½ÑżæóÖ–$OÞšÿás¬Ûâ+En¥Ë²õsÜ£¶1}'¾Œ`Õõкŧ®¦Uº”Ý£‰<ìQ{0ñ¹ØÿËA 5_ü¾CÇ£õgïšöµ%×÷±Þ§wرÒs"š›`ùRž=·˜· ¼Cö£â:‘x&ÛÅŠÁZŸ¯mL[À]V®tà…x_gÜ¢² Ž=ïSw"e—Ý¡©ì÷Øq¶8Nd¾Ò•Ï©äÏhyX°L¡ȯö&y ,ŬÐó‚%T¥¹±ZñÁ&Ÿ–f¸¢tôef}¯ztU‡YP¦8¶C¾•B1öÓï4×¥x¤¨¥m¿Á:ê<ì!Š«ö=¯>úOÆ¿zþðc¾_òUÝðÒ¯?á·¦̸N³b½Ãég=v½>¾iÛî¡ÊÈÒ}ØPpu˜™K4Úôõ=e×+ú^ôØûJ¼`l;`qîQr»Cí&“ð\ vBc1X;-½'Æ7UŸø>iŒ9í;-¬wXœÐÐÎÅ.³§C÷3®x&KnÄ’)^-ÄZ,,Vä†!j üKŠÎ'§š?Ã|4À«€ã[“Á™åº£ ç+BÈÊ„h7°`ì[:Úaq©)°…BLevžåd¥x•CŽ6ôú œL \fä@tKÅR±æšbˆnq P´!ÄÂeŠÌ,ð{AkˆEÒÛ÷þBM–æºswcñ-í,%_H||&5i&9æþ·=ºî 3ÿrEÃk–H‘C¶1j˜šx.˜ñçŸ.ÒLs@o±vÃùW½ ­À·SœÏ)8P—ò7 –èóÿzº`æ—?þ§c1åÊþB!>k6@’7m`ÿwm†¦˜Ã‚jMy“7®ø¢Ÿ‡)Ÿm¨: ­ÕÂt‡Š¹D&«ïâ–Éjâr¥ñ}Xy­¯ä­TØÆ€–ÓÉÅc-(w‹ÇAÈž™ÄŽ8 ²æ(8mˆžûp6?âqø¼­ö¬g“*®ÉçÉŸ”Ó¢Ó0ˆKF®BK yÀ™±G»`d!„hjžÈâ*f•(h³#î,ú1JÝièîƒé• Tq=†šùß{PôÓK+’1.œÙPÿŽ¡û¸¥û°%楿ïþŸ^³ÊÕ¹ÉЊüR­Éßyµá ¼3™î˜Ññªa Àá²Ëæ-‚SÛmÒñôŸ7?±«€H‰Kù:—œÌb>ÙK¿êpf»•Bì=s®_fÆ×So}éÏçdÆ'€pêy˜Ò8Ç,§`úJEølØ*G1g.ô»ÀÎýÇdyˆBˆ‰3yw°º”­övÈ^áRv)´Ž²³Eoƒ…5.WTÁ‰Ó²4 ëÿn¸ô[š[î3Þaèí'2]Ë‘wGž0?æaqÕ=!¼‡<%±oçIȯtYtÜÐÕe![‘š€¾Àí–Õ·i®4Í-0mµKIåèÃɯ6ͽžË%Õ.ó·Z>t ;ÃÒøß4iŽ9¡¢þ°OcK˜² ÞỰ$Oç. _wY}‡¥áØE£ß_.ù˘Ÿexå/ã»öu—Ëâ|CÃûQ‡.vÈ[‘yŠÂÛ\òºÞZ<uoX*ׄ¸.+àHe €ŒÅàÞ€“§Ò›ÏÉŒOß1 ׺,»:úG~ÍÃTÇùÈVCá75+ªã{_ϸI“¯ 5ÛF/]¤)¸ÈÒZ+¶BˆÏBmâ{Ô.œß"¬éÏ5£lË}Σ~^ˆ¢»4ó,ôl÷?*°coûl;íRv«CÉwt<øK÷Î`Ô å1¬‚0e?Öô<às²7±p~ç¾[Sô=M¹ŽW^ÔÒÖ–þ¾wþÕãÝ>Mù-š«3â[·Õÿ!àà8צî{Âpå.—oŒ;ú–ŸÞ{bNDÓ †âv·±<$‘xμáñn®¦¢J³ê–økƒ–ÖQæ´ý}Ë‚UоüñÆÞô8¾6Lé7~kFäÄ™˜³VsíÚ³šyÇçŸḬ̈©êzÆcG—¦ôF—+*ã¯y톒TH>'3>§þæÑ8'DáÝšB=oû#>ƒ‰äaªãÛî³3S³üÖxÌ^‹¡î7#÷À2·Ú!ÒLøÃo„B|Îm~æ©øöØÝ¶·ÝçLøq>íóÜ÷t7ç×Vý1d+\81G–k{ó#a[u§äÀT·i7‡ìW ÙeÅ2Ò¤I“&mâZ,f¹ÄŸvy…м¥.Ë7ºDöìoºpb¨ñÙù´!c溛”LæÉ]£©\§ˆnñÙwXÆC!Ä„ÔÀQ`¡Œ…ø4ÒÅš?sȴгËç•?]x¸î}Ãg[›C¤IÖýN•‹(:ŸõØýo™!„®Um~æ©ç×}mý: !„B!RÓ‹mv€—d(„B!„H‹—†…A–‰!„B‘Š£@áÐsÛ¢Àí2&B!„BŒÛ½@ÍP]ÌVɸ!„B‘´ß›Üa/¾,E¶B!„ã*®2ô÷¼¿|™øÚ‘Ë\+!„B!Æt”ø²MÃ_ü¸'_|X \…ü¤B!„CEõâ;ñ=9Úü‰àæuˆU¢IEND®B`‚stem-1.7.1/docs/_static/locale_selection_output.png0000664000175000017500000011055513157571677023254 0ustar atagaratagar00000000000000‰PNG  IHDR8ðC½V‘sRGB®ÎébKGDùC» pHYs  šœtIMEÝ pÎÀÙ IDATxÚìw\GûÀçúÑ9zS@  Š€"J'bbAcÁ5šcŒÆ5y£Q_k~¾v‰‰Ä(Æ b¯G“. éåè帲¿?–÷M±ãÊ ºË ¸Üná[N£T,G1eÆ}z»…LFÃ鯋zÈLò”OµõÕ<}šŽ!íÅãöÎ6Š}Òä¦v §g²ÛEBtôiœz@C‹2ÁW=ùº[˜Õ%ºï°‘ ›±ªxî+3”ý U”Y{5 Jnm¼xÜÖÔÀ×Т´µÐP-ª³—†D‰N4;àë1oïEKù "*´ðÅéÝK#F3FŽørÚ‹â*vrŒ‰‹àQdÓo›Ÿrùôš±v“ݲE‰>ÓproJ¯wB*Íxå¿Æ,×ë+ü‘Ú#÷Édú¯‡ý¶ÉÍÝ/Ñ ¿NÜí+ü‘ÚÓÇâÂn §M÷ü)x8´+¨¬’“d¤åRÓ’Œžq5ùø+œùÅH³ÌTõ§„{­[W_#2„€,'½*MBžªsÄK;ÀÛ«ÊÊÊRRR-Z4wîÜ… â/µÃ‡7NMM-44´±±ÑÇÇgÅŠhPQQÑáÇ7nÜhiùÆ$Î;W^^¾uëVÔEKII‰ŒŒÔ××_½z5zÁ‰'DS(”/^œ;w®¡¡aΜ9sçΕ¸ûž={ÒÓÓutt>ýôSÑù£GÚÛÛ³X,Œ¸Ø?~}Û¶moœà¨¨Ÿþ¹¿¸2™8qâÎ;µµµ¹\îÊ•+W­Z% rvvþá‡nݺ…Ξ=ûþýû"/­¬¬ÌÃÃãÆ666ééé¾¾¾ÁÁÁ¢ ={ölÞ¼™Ëå.Y²döìÙuuu'OžüñÇej’`š•W‚ä‘F~zÇÃN~z‡øÉ„û-#8-‚‰DÜŠ¢î‡œ¬Äv@(_Œàä$··px#8/·%Üo‰‰lª«ìyÁIoEäñ懜†êž²W]#8¥y]‚$>lyÁ)ÊéDSÕXÛó0‚Ù$ó¾xBQ’µ¢)?ID©ñ­#8IZÑC4Ë ÷[$b]:V›û¢CâdðÖJOósæg=ÌÏζMÝ¿ºlÜB󳼡øeË&åy˜Ÿ½úgøI¿QægóÓ;Ð4 ÂÍ Š<ÌÏîþ¶AôÿµåhPÆó6ó³žÿ q ²:=ÌÏN³ºWY"%÷¯p<ÌÏ.Ÿœwî@‡ùYßɱ­×̶Mõ0?Û7›óís<ÌÏÿ¹½oÂýó³>–ahèçŽ/=ÌÏ®ù´ ½Úàa~v}@¡„©ùÅN3vª0´ñøF³‡ùÙ¥®¹‚L³ºça~öñæ³ÿWía~öÌþj4z`` ƒÁ`±XÇGÂäÉ“ÅÅÅèá¾}ûôôôD¡¿þú«¾¾¾èõorssÅ%ØÙÙ}ûí·}%{zzâââÐÃþù‡B¡ˆB—.]j``ÐÔÔ[qBBBÈdò‹/ðÄÅfÿþýt:½®®·hÎ;§¦¦&~Áúõë 8ÎüÁ`0ÒÓÓûµhÑ¢ & ÿïܹÈÎÎFDEEeæÌ™‚ìØ±Ã××&E|ôÑG}Õ%3ÍJ-Aò¡òV¯OñË®,vGrL[]%ÐÝ)Äïðõ—D€žÿŽô¡C~âÓ‰ðÜ×ÀTrnz :¨¥CM£3HèÔ1NÐ$€® =DÐÑ*hëõŽüjéPÉ$’AP9÷Å*âÚ`ô¦¬&Þ}ˆ²p­£ä|¬WëtT>™î­§êÜÔ•sûFlÊ‹§fzDºB{㊫Ø*Tƒ¹+ô±sÑÓ…TÔ(€W™­€¸ÛÅsíÒæÚ¥mÿêAèÂVö*zªÎ¼êEÞáßO+x~·EJcû¯w©dÕCç§bôäIÐØ‘pÚ;í8EBfò…™ o†¼¼zGÇ{¨²³_Jô>JÍ/ž4÷¶6ÐQx“j0AG-°æ¿%\¾|966VSSsÍš5óæÍP¥¥hhlêÔ© )))èáŠ+ššš®\¹"5sss³µµÅ)™Åb¡.ÀÏÏO „‡‡÷vÊÞ¼ééé©­­ ríÚ5 êx‘È€ÏCÔ4Éâ^‘èð(: LMƒ"º’©Jîìpêx¦tŒûb§J&ĵ¡¡E‘£˜–-ÛÒ;žÕÚôQÂýV-ªëÇšo >®L #SZya7`¸5ÐÅ«´ó^žhp"*À•ŒÑû¿W}˜”÷üç•à#ËI§bmúÊä ;KòºE³eÂvÌmz‡Œi ’Ý¢¹;¯¾š'1ð Ð3¦‘H.ŸSUÊ5±`ÈÌ/Î4÷E¦6Ðבù o^&MšdkkûÍ7ßܾ}{Ù²eOŸ>Å©GGGÑ*•ïìì 0555kÖ©S§ׯ_?~ü8~ã™4i’è?:*ÊåöNÍäp8â¡úúúVVVEEExâbSRRRWW7nÜ8Ñ …’’’òù矋ÎüñÇ...NNN}GwïÞ›˜˜hddÔÓÓóvÓÑ[³¨Tª‰‰ *™ÏçãÑ$ñ4¿“„@ ‚£V”Ó…>ØFÚ©0TH¥yÝ%yx׈’ר‚^YÂåóMÅ܆)þ Ü÷eª’ªêd@Uiú¨kktv†dÈŒN£‘x<¤…ÃGç–ñyúµ„¸—¦$”¡ ™ˆ¼4´+Î?PGÒïùï*Ÿÿ c•ŠÔ¸ö†Î Û¹¨4UÌ»ÚêÖÿ:Mê÷h7çÖSæ?ñ†_:Zwáù% Q!:s‚Þ\¬Á°œ½ÄúŸ¿îÝõh¸ÕtñOI° €ª×ÍoÈd·{ÏÖ´·Zº_ÄK¿©®÷é[š×  †¥ÈKÃίÌ4÷†6žÜ@Ïœ••Õ¦M›4õ¾­­Mô¿ªªŠÏç‹/!±jÕª?þ¸¨¨èñãÇd2ù믿Æ/YEE¥ßR`2KJÞ¬WÌãñ*++uuuñÄ•Ùçææ‰qÍÞ½{ÍÌÌÒÒÒ>^t˜œœÜÙÙ)Þ¥$7ãÇ¿wïÆÁÁÁ·oß¾uëÖš5k–,Y"¾OÀ±cÇæÎ;}útMMM@DDÄ€n­I"iFyöìYEE…ÂK|à=j†fôâÜ®¼êZ”–FPÚŠJFÃéœzÞ«Œ®ºJŸ‡hëQÑ5¢dÆíé’cÛd‰e@6’.i†ç¾RfÅ(Éíª,îqŸ¡ÕßY8LRj®«êi¬åQi$t®ØˆÑLøaU¼šò>ioJòº«J{h ’ý5åiã-ÍhM›`z]ñ?­ë·;mõg¹‚¦^KÐrùñð0ôÿ–ãÃãî¿®Oœï–ÌRÓÊ-à ;Í '¢vÙ‰'Þ!¯£™è:r»†Î·iš}åo8hVš79#çÙêé¹Q¹ožôÓ¾`½Ü ‚÷Åß¹8¦½Eàì­±á `ã!³åŸ0SÓŸÎuÊaPuZ¹E€›Ç‹Ë,«Mœã”¥N·@ÔpŸ©…'¿xÒÜ_ª°µM]%ïïW¯^ HllìgŸ}öÿ÷øK°®®.00pÓ¦MUUUÛ¶msDùî»ïÎ;—››+Õ™8xð`bbâĉKKK-,,ðÜt×®]S§Nýúë¯×®]›““³oß>kkëåË—¯G;wŒôññùæ›oÆ—–––œœ|äÈ44##ãÇÜ·oŸƒƒÃ‘#Gbbb¾üòË»w{WK™4iÒýû÷³²²TTT._¾,1A¸&y<ŸÏïë×b§åñãÇžžž666ùùùŠ-Aò÷¨YŽb§šøTÉÆAŠëclN7µdÐ$N=¯µ™/Z;®h¿K“ŒöÉ5Öòr_tâ¿oXØ2{z„o4fwU—õ¼Êèd?hÍMŻɕ÷m -Š@€p»… &y´“šÄ¤~ùhoÔUõpêy¨›ÕÑ&àÔój+z”­ ”ò‚îŠÖûå-ÑŠõ(²©•[¤§êŒ®‹&•A‹ÝÂÆ|Ò7«§]É­oòæCг1^cí&SÈLNW‰Daâúéâ^¿d´³êx‡)j4ÓŠ†¤¦®‹ k~úô“/¤{-ÇnY髹pº2¾ó+xã@,×ûxªƒª“_’PÕ”Êëéìeþ38|¦¾šK ¥•[¤N¾éß3$F'Mu&¹¹û%¢µtÅTßÏXxò‹'Íý¥ [ؽaUTT$ 'Ož|úôéK—.ÙÛÛã/ÄÅ‹kkk{xxÌ;—Á`œ:uJ₵k׿åå™™™‰géÒ¥S¦Lñññ!‘Hâ“¥°ñóó»zõê½{÷ÆŽ»dÉ##£G)¤a²²²zòäI{{û’%Kììì6oÞ\ZZ* ]¸p¡‡‡ÇúõëÑË/ÆÇÇ‹üÚuëÖYYY?ÞÖÖöÉ“'?Э14ùË/¿H$:^TTtþüy‰D"‘DŸG`§EUU ¦¦¦ð„@ *$e/Gþ(²‰L"¹NÕd¨ôNI‰mkk¸xkôÝÛ` Ts_et‰zžh4’…-s¸5sȪ[©Ú@ÉM픣‹Q!T—õô7r*ÚSAnÄ¿)|ÑøÜJNÒÖÿ›õñFª°Á“fŒTÉ}ßyóæ-Z´è³Ï>ÃeÊ”)Æ “ù¡žžÞÆþùgŒkjjj$ÖQÃ|±pR[[khh886ŒS“DÒ,µÃR%@>0¨Ê¾º¦«P€@âóæ>º¦†BüÓ ÓŒÖ&~[“@!ýaïµ6PÞ•—ÀðKˆg°?H¦p¹·[Å“fŒTÉ}ß«W¯ÊKæ×É“'…B¡Ìg¼|þ–ò¼4À yi85I0Íý ++ª!tÔ†ÙHFya7ûa+…B-C ¾«q4YT::ï»6 qjkk~E×ÔÔÔÌž=š @ ~AAÕ«W¶nÝŠHcÔ¨Q}#Î; ÍÊÊš6mº5 Ê'Ÿ|"]KKKWWW´ß ÀÂÂdAÌÍÍE磢¢ÄÅzzz\]]ÑP2™ìááQXX(ºàرcfffÂ8€àFKK ––&q>88˜ÉìÝÿ€D"­_¿g~E .éµk×@ ~èíQ[¸pá‰':D£Ñ‚‚‚ŒÅ›+V´··?~¼®®î«¯¾²´´ˆ|,{{ûçÏŸM:•L&Ÿ?þÎ;iiiâ;666>|ØØØØÏÏ/''ÇÍÍ dÀþýûKJJ~ÿý÷ŠŠ ©Ž&›Í5jÔŒ3"""?~|îܹ;w¢AèÆ|ÿùϺ»»wíÚÅår·lÙ2wî\‚®í­[·¾ÿþ{ÀÔ©SMLL.^¼xøðammí_ýUf~EP(>ŸÏ`0à«@ =j‚üüóÏèL,*•ºpáÂŒŒ Ÿ²‹íúmÙ²°aÉ~©ùóç÷E¦dtèPjÚäÉ“ÑØ˜€zxæÌÀ_|úûûΞ=; 7VjÚ„ ;vì¿¯ŠŠ þü"’ŸŸÿäÉø¢@ ƒ7_}îÝ»7;;{öìÙB¡ðòåË...èÔ1<”••íØ±cÁ‚nnn—/_FÏH\£¤5µ}}}Ñ?ÞÞÞ€œœQ—í‡CýãââBüŽYYY???ôpòäÉL&³««+99~mll¦L™ß `ðÖ:jÖÖÖQQQeee ,èéé9pà>´¶¶Þ¹sgxxxII Ç“z™½½½22П؅ jhhÄÇÇ[YYYXXäääxyy=šø»ººVVVè!NG'ÒÕÔÔ B~!ü:j(fffW®\¡P( xDlÛ¶Çã}ñÅÕÕÕ+V¬Ì H$©çi4ÚòåË#FŒ8qâDdd¤B« õŸµ´´Ð v@ vÔ:tïÞ=ÑÙ¿ÿþ[ ¨¨¨ˆ_Š:"ååå"ÚÚÚ ,055moo¿páÂ@ÑŸd‚\¹r…N§ßºu+66öûï¿g±X ‹Ž±ž?¾½½](ž>}Z( ¨ íüùóû÷ï‡ö@  tªº´…B±³³-ëúóÏ?‹Og;þ<@]]}Ú´innn?ýôz~ß¾}]]]___‘o'¾Ä:¹¾   ¿‰rýI¾sç΂ üýý555ööö3gÎ\¼x±øÇááá"9â9B„L~Ó_¨ªª:kÖ¬û÷ïÿ˜   ]›ƒÅb‰–Æ ÅŸ_‡ƒv^ºt N“„@ "ãc‚¯¾úÊÓÓSCC#''‡N§/Y²äâÅ‹{÷îwé¾øâ‹Õ«Wkkkß½{7))©§§=ÿÓO?}óÍ7‚>>-- 0t|#è¥A Á†ü¡flÍš5íííÖÖÖÚÚÚššš3fÌàóùË—/·±±¥@ ä½@rèóC"***...!!Éd><00pæÌ™°È!@G @ B2T@ tÔ @ ÐQƒ@ Ž@ :j@ ÐQƒ@ @G @ 5@ è¨A @ £@ 5@ tÔ @ ÐQƒ@ Ž@ :j@ ÐQƒ@ @G @ :j@ è¨A @ £@ 5yäåµA%@Þ!ååUU]P°)P$A'NjkÓ/6GÏ–•uÞ¸Qen®:s¦ÉःÍnÌÉiýúk˾A7oV?}Ú`lÌ 0±°PS”ä´´æÇë««»}| ¦N5Lì¸ÁÁ…òæÐÛÛÀÎNSQÚÈÈh¾v­jøpÕåË-ª lM ÅæêÕŠššnô¿¿¿‘µµú Ù÷êÕi††ŒmÛF+PfttÕë×èƒÑ£ñnHH1—+P($}}ÆèÑšøãBæ‘Ý IDATd4d¤ð3g\–-Ã[)°ëQÖÎf7&&rÖ®µ¯ìßo¥ÀŒÜ¿_›‘ÑÜÜÌ›8Qç“OŒh´÷þ]Zupâ姧Ǹzu’bÅòxÂ?ÿ,î{ÞȈ9ož¬ø\»V9gÎóêê™FFÌ*c‚¼~Ý @~ù/ææïÿ̧RÃuu¯õ Z·.ÉŒ˜1ãɘ1÷ôô¢32š"yݺ4ÂX¬k3g>Õѹ¦¥U\ÜŽS¦Ì¸„]77¿‰þΟ/S”6/NTS‹œ=û™£ã}*5üþýüb±5I$T&'>42ºîëçë[§@˹y³ê_ÿʸ >¾.,ìµbÍuÓ¦ _ß8oï8ÂBBŠñGÔÒŠ24¼>vìýÑ£ïÒhWûòˤÁÔ†’â;s¦çÅØõ¨?kß·/×ÎîîÆé::½uóèÑWãÇ?PTŠŠÚ]]‘Ha¶¶wÜÜÑéWµ´¢†¾æßI|‡öÜŸdOÏØ¹sŸ+üvYYÍ#GÞFdr¸¶vúÞ¼ç€m(œ¨¨ ª«»‹^GMS3ÊÐðzRR#z600ÁÚúöà8j $èéE¥ôuM23›‹Œ¬@D Nïã§ÉÏŸ7DEUˆMLn¬[—†S,vÜÂÂ6Â^¼hR¸6ŠŠÚ)”ðz*óæ=ÿøãxœb±5I$§£öÅleÏÊ•©ß~›òƒ:j¿üÒÛluuñ÷îÍ%“à چ‚6Þ­&ÓQîGÖîèx?"¢Aw÷˜ÐÐR´îGGW** #GÞ63»!j„ÉÍmúšš–£¼Tõ'YIŽšD²eKæ{T+ß6>TGŠö«utð½¼ô“’8..:€ädŽ£#«½/>ØWÇfslm5üü ÝÝõÄ»å6oÎ !"çÏ—åä´ÚØh¬_omhˆ«ïQS“Êfûܾ]Y!táB¹‰‰Êœ9¦2™´j•Õœ9ÏÊË;‡W%(yÒ$]ñÉu9}%ÌŸŸðÉ'F_}e‰?nCCÚ/6©’±Óœ›Û* cÆh¡‡vvšýU‚³ß[“DB‰pôh½½‹E;w®¬¡;gŽéܹ’ù{ö䦧7ëèÐL>ýÔX|p*%…Y¡¯ÏX½: =yâ„£è‚íÛs{NN,©Ã[Ïž5DEU¶«ØÛkJ `?^˜ÐH¥’|| ð¨á‡É¤üðƒÕ¶mÙ‘‘•›7$3¿µ–c\\—+tvfMš¤‹Öt>+VŒÀ*³ªªºŽ-(,lwpÐÞ¾}ÃjØõÃÚz´´h--Zmm÷±cFFÌY³Lð×n Ž)(*j?sÆET.[[ <¥]ðÔ2lkﯦ©ƒxRuáBùÍ›UL&EM 07WÝ´é#<k–IhhiBB#›Íñó3üí·|©"žv£/·nU“ɤ€és‚±K»a‡ÊÔ3FM!Re¦ÊÒòö™3%þþF 98¸°¹¹Gü‘„vª°5ID2 '§En=ËÌÉýt&b9ºŠ­ô¨'zòdÑ¡C¯D>_}=W9ªªêòòŠ+(hû&󉿍EFVŒ}AÛ·«Ç°o_nCŸ‹±'Lx(Ñ%K"…¥¤päîÙ;p ¯ï`Ÿ«ë#ñ!³ÎN>aÿ]B\2‚ ee¿þšýé§OÌÍo:”/5n\\Ýë׊ZJ"…D3™3g>ío‚Z’±ÓœœÌÑÕ½6jÔ]5µÈÍ›3ð+[“DB‰ }zzÆ×;kíŸJ)”pQèÒ¥‰ÑMM=èaHH1™.1¦lgw»k}òä˜ÀÀ‰“ééMdrøêÕ/¤FÙ¿?—N¿ZWמ;Wª¦©¨¡Ogçßÿâ»ïRÝÝcï‹›v~‰h#;»€°ÄÄFŒ´ahí–h&OŽ L4ƒsß¾\=½hœ¡Ø¥QA¡„WUõplÛ–= 9jõÃÚ9î–-™ÞÞq—/—cÏNîÝR17¿éêú¨¿PìÒÇ®GØ¡ØzÆ®)Dê vª=ª%“Ãkk{SåàpoÍšÒg©ÂSä“LDÏD†>eæHî§3ñIÕÕ×_'ýu2‚ ÁÁ…óç?§Ñz'Ç3WÑ6ŠHŽÐ¡ÏººîŠŠNkëÛsæ<û0†>Ébo¨:í踧Äèž8EEí¶¶IIœ¾ƒ‰NN,Å:‘|&“":d0Èè(­B„wtðÓÓ›‹ŠÚ»»…µµÜòòξ×xzê›™© (îÒ¥æW®Lº|ÙõÊWSS•  ”yóðKƦ©©`jª" UUÝŠÒ$‘P‚°XtOO}ô¿ŸŸ¡@€„‡Wˆ:Ï==õµµièa@€ ‚ ×®U¿éíÛ5B!4¢Ÿï†ª\]ukk»³³[²³[†Wíèà_ºT®üvw ››{ZZxÍͼ¦&ú‰'¿D´ag§©¯ÏX»6ýáÃZù’§vKm,-Õ,-{¿šœ:Õ°¡›’Ò„'»î߯3FKÔo¿kYf=°v‹¾ÿ˜˜ÏÀÀa¢î4©kÈQ»›šxâ=y}ݰK£a‡b뻦(¯îgd43™dMÍÞ™9††Ì–žBnª¼V…ˆž•#¹ŸÎÊÈ‘³3+3³ðüyƒ——¥¥Z||}VV‹P&LÐQHŽ::ø^^qÎÎ:‘‘nÆGŸTÑ?33[[¸¸ú¤$ÎçŸ-@€²{wnll]b"ÇȈÙÓ#e`ÎÏÏPá‰30x«~¢ÿõõ >j”ftôdô¿£ãƒ'OêŸ=óQH\Ñ(û¬Y&|¾ð¯¿Jjjº‰-W?mÚ“§¯¾²ÌËk[´ˆíêúˆÍö%®I"¡%@UÄå ÐC§GIMmª®îž8Q'%E'.®¾µ•/z#˜#¡™?ßÌÇÇ`ùòd++u…ô½ÞÊ­««nXØkÀˆo­hzìXÁܹfÓ§kjÒƒ“¸O>1JNnjmí}Á½¿VK‹&ê‰U ééͨ}(<¨iO$‚ êêok:,Õ^Ÿ=k¨¨è&‰„*qã´ããëE‡ÉÉM‚qãÞÒРut*yìXmOˆšz_ÆgIýþ@átv 23›ÝÜôðäW!Ú°¶V qÞ°ÁæâEÉ ù4)³eÈÎnáó{WNLäÐhdq‡#»¦N5JJ∖•Ž­WT=’iíhwZ@€IjjêVZ[«³ÙáÛoGVTtI|¤5 º ØzÆ®)D,G&{öäîØ1º¼|ú… ?ûÌt ÑûKqMÊ—_åµ*ʳ â9êOWZaa¯]\Xh§]zzs~~›è{gâ9Z¶ÌâÀ£Y³žIí¨–ú”|oµ‰uRRšú¾»Lš¤Ëf7feµ¶ïÞÛw‚š’øüóázzôeË’óóÛîÝ«ù÷¿_~ù¥…‚$³/ÌÊjÉÊj9tèÕß—úû™šJN+3æþÎ/wß¾¼;rž>mÈÊjÙ³'÷Â…r© H•ŒÍwß|ö¬!8¸°¬¬36¶îÇ3¼¼ô%F%?®Ÿ2%VâÛ™š$ª>ñ/–¿|ÙzáBùºuéŠÊÔë×OŸ6<}ÚðçŸÅ3g>moç¯\9O~‰h#&¦nß¾¼ÇëQèÎtù‰iR*2[†º:n``›ÝY¹m[¶DÛ‚Š] þþ†NÏ—_&åä´^¸Pþûï…$’bê‘Lkß¿?oûv;€Ar2‡Ç¦§7ûø¬ÝŸ|bôé§ÆkÖ¤­_ŸS‡–rHH1þÒ—l=c×"uP&B!ÂfsŽ).|ò¤a ÑûKqMÊWS”ת(Ï6ˆç¨?]9;ë\¹ò½0~<«¦¦;9™#rÔ•£¨(7CCF@À3‰óý=%‡2o }ÚÛkijÒ\]%µuëlŠ‹;Æ€ À××àñcog燃“¾˜¯yóžÛÚÞe2)ÃŽ§±jjÔ“'‹Ö­K§RIîîz[·ŽÚ°Á¦ïe/_¶ff6(®žýÔ©â½{óH$àçgxøð8©&U²Ì7˜ãǯ\y½vmº®.}ölSñ­lPTU©55Ê@5I$TIøù^½êöÃiÿ]B¡|| NŸv–¸féRóÄDŽO\g§@[›ÖÔ4=øð« 2þ{U‰8uÊI4-úáC5kÒÌß»7—ɤØÛk.^lŽŽpYY©?yâ½jÕ‹%K’„BÄÄD}óSçΕ;W03S™=ÛtûöÑ66xòKD¢£+wï~ÙÙ)01QñöÖߺuθØÈl/6§PHq<žÐÁAëÔ)'œ¡Ø¥0j”æ±cŽÿúWÖ?ÿ”2CC]¾ûꆵŸ8ÑÛ†æý»ïRÿø£ØÏÏ@bÆŒµpëÖ”íÛsNŸ.9r¤`dÄùÓxJ_>dZ;FM!X±±±Ñxð 6?¿ËTVvikÓ33§âÿD£¿Tפ|5Ey­ŠòlƒxŽúÓ•‹ ë?ŠÜÜz= ''VRGô²¤Àݸ1e„G $„…MÂó”º þ)/ïxï$—”´55Ü™Ï2Ór/E]55] Ü™@!ù%¢ÊÊNåiRêº &ÈгD+tü´J]rÛÚefJi9òöúõéÝÝô°½gaqkëÖ,jŒxjå–€­ç¡is$_Ú”—£!ø”ĵ3D*Æ©¾w’娷~xþ¼qñâDÀêÕV}»l±Áóá‚Ü7`„Ôu÷ïÏËÎn •¥+ì¼ц‰‰Šò4ÙÏ{ ü¡Ø¥€‚½²ô‡×n(u«iìuPefJQi«®î..nŸ>Ý]…ÏÊ7®¿TO­Üð¯?tlƒ`ŽäK›òr44Ÿ’x‡>!e°t©…h©9´Ûù½F_Ÿaf¦ زÅvìX-X¾ˆ16fΙcºysæÊ•#LMU²²ZîÝ«mmå¼+:jÿQºj×Gê×!¾˜›«b¼c‡Bþ—ùý÷ñ•Õåç·éé1\\X!!Nr¬|œÃ@ Á… U@ 5Q R÷Ü„¤¼¼cc«ÿ…Tá·+‚©zï X¥ðòe«¢vñúPëBïÐ牅ÚÚ´Å‹Íѳee7nT™›«Îœi28é`³srZ¥Îþ¹y³úéÓccf@€‰kô'9-­ùñãúêênƒ©S¶vÜààBññdoo;;MEiãŸʲ²Z,-ÕfÏ6è'oØš$ŠÍÕ«55½›üøû‰o"¤lV¯N34dlÛ6Z2££«D¬ùøŒ·pCBй\!€B!éë3FÖÄ"£!#…Ÿ9ã²l™Îë32š¯]«>\µïuŒúËf7&&rÄ×] .üþ{+…dáÄ Ém \]uEûê·g9âzyÅéé1®^4øµŒxªÙ®ˆ¤êÚµÊ9sžWWÏ|W³6•gØ=ZpèЫššnO¸fµÄ ƒlWCÇêúBTTt­Y“F§“EŽZDDÅÆþþFƒã¨:ôjË–L--Z_×dýúttIÉÛ·«wïÎ}ôÈs@;÷'yýúô#G X,ú”)z!!Å’–ö±¥%.ÿCfÜÕ«ÓŒŒ˜¢oËY,ú€5 mLžÃfs¼¼ôOž,Ú½;÷î]÷1cðj[“DBeòŸÿä—•u¢J°·×R £vëVõóç{öô»ùî‚fµµ\Åšë³g /^4 … 6¶.$Ä¿³µiS&“I12bòx‚‚vOøå—gϺ š6”÷½cÉ’¤¨¨Ê?6ŒŽ®\±"åöm÷?6”Y÷ïÏ;¾lÚ4#]ÝèÆÆÀ±c¡¡e qÔjjº×¬I34dŠooµaIÂQ#bÏʨ Ê– 0JP©-î]/ƒ‚FìÛ7f0íê½lëyýºSS3ÊÐðzRR#ººZ``‚µõmÿǃ°’Û‚ zzÑAA)ºº×$‚23›‹Œ¬@D Nïã§ÉÏŸ7DEUˆMLn¬[—†S,vÜÂÂ6Â^¼hR¸6ØìF29<'§AººnŸ8/¯Xœb±5I$t¼Å`åÊÔo¿MyW‹tÁ[-­¨_~é]´³«‹¿wo.™^PÐ6´ñn5©²8s¦Ï•EEíJøƒ5èá¼yÏ?þ8Oýut¼Q ˆ»{Lhh)Z÷££+µZ)aÿüS:¤´êé;wîó¡VÖƒ™*üvE$UQQ„½Ãkåhˆ—“'õ„ee5‘ åºÐûöÖÑÁ÷òÒOJêÝo+9™ãèÈjoç‹öÅÅÕ±Ù[[ ??Cww=qooóæÌ  B!rþ|YNN«ÆúõÖ8—õÓÔ¤²Ù>·o×DFJîè|áB¹‰‰ º ™LZµÊjΜgååÇ«”,±çàĉ:è~dÌŸŸðÉ'F_}e‰?nCCÀ±RŸTÉØiíìÌBûoôõ+WŽ\° áÕ«6ÑD`k’H(Á~o{{-‹vî\YCwÎÓ¹sÍ$®Ù³'7=½YG‡`òé§ÆâC±))œÈÈ }}ÆêÕiÿ>øÔðÃdR~øÁjÛ¶ìÈÈÊÍ›?’™_‚Ú@Ë1.®ŽË:;³&MÒí¬'3.víÆh~5nœ¶š54´´±±ÇÇÇ`ÅŠ8Ce–BUU×Ñ£……íÚÛ·`p$7·U @D]ÑvvšýU‚§þ64ôhiÑZZ´ÚÚîcÇ ŒŒ˜â{ÌˬÝDÀ°g™õHf]èÏ6Ðaú/šäŒ§v_¸P~óf“IQS£ÌÍU7mú6°S…a“2S%Ó®äÖö3T¢{uß¾É2SeiyûÌ™#ƒ\ØÜ܃"Fª°mRfª°íJn]É|†Š{Š^^qmâùZ¤ØØúGêÍ'O:ôJäóÕ×se– Ì–Û60hmåQ©d:Úé€J÷°-Ûß ÒÖÉmuØí³Ì¶ïÐ':¶5zô]Anß®?þÁ¾}¹ý }.ZÄž0á¡Ä˜‰–’‘»gïÀ¼¾ƒ}®®Ä‡Ì:;ù„ýýw qÉ‚”•uüúkö§Ÿ>17¿yèP¾Ô¸qqu¯_w(nhh)‰f`ÍdFÌœùôüù²IÆHó™3%ÚÚQ<ž=Ü·/·<¶&‰„úôôŒ ,.®=üçŸR %\ºti¢AtSSzRL&‡KŒIÙÙÝÅîÄž<9&0PrCÉôô&29|õêR£ìߟK§_­«ëFÏ+US‹TÔЧ³óƒï¿ñÝw©îî1ŽŽ÷ÅÍ;¿D´‘Ý@Xbb#FÚ04‰¿vK´ “'ÇV\Ü.²X=½hœ¡Ø¥QA¡„‹6úܶ-]@$9™£«{mÔ¨»jj‘›7gିwË–Loï¸Ë—Ë}5~üƒþäc×nŒ¡ÏcÇ ^¿îýpÚ3v=ÂŽ‹mD$cÇ}ô¨–L¯­í-_‡{kÖ¼À?…'URm;.¶])DWRS…}ÖÕuWTtZ[ßž3ç™|-’_üõ×É‚ΟÿœF»Šžg0®JäBj b· ʯTnܨ cÛÍþR…Ñ"lëä¶:ìö»­ÃYìMB§  ÷”ݧ¨¨ÝÖV#)‰Ów0Ñɉ¥Ø—ÈÎN>“ùf‹{tzoG_!Â;:øééÍEEíÝÝÂÚZ®h#q<=õÍÌTwéRó+W&]¾ìz劫©©JPPʼy ø%c°l™™L3æÞÎ/§M{rýzú:B\“DB ÂbÑ==õÑÿ~~†^!ê¦öôÔ×Ö¦¡‡&‚\»¦€ŽŠÛ·k„B$(HzçóµkU®®ºµµÝÙÙ-ÙÙ-Ç«vtð/]*WH~»»…ÍÍ=--¼æf^SOô^+3¿D´ag§©¯ÏX»6ýáÃZù’§vKm,-ÕDßÙLjØÐÀMIiŠ] ÷ï׌£%ê÷ïÃCSSÀÔTE @ªªºÅƒ0ê/‹Eß¿LLŒg`à0QwšÔUä¨Ý(?ü6lØMÑ/=½™x="hrKÆŽ›‘ÑÌd’55{çÞ2[Zx i7dÚ$F\l»R”®ú{†vtð½¼âœu"#ÝÒ"9;³23[ÏŸ7xyXZªÅÇ×geµ…`Â¥¶Þʦ¿‰x[§¤§vK(“7_™™©ØÚjÄÅÕ'%q>ÿ|¸h”Ý»sccë9FFÌž)s~~† ׋Á[µýÓ5‘ɨQšÑÑ“ÑÿŽŽž<©öÌG!qѱt¬„ÏþõWIMM·B¾Õ§ðo IDAT»nl ¸x±üÖ­j//ý)SôÜÝcq>°5I$”x}ýGUÄåön½Ìáôˆ‡êë3¬¬Ô²ÜNQQ»±1³¿WKJ:êêºÇ{ >5!%¥éóχ¿u@€Éîݽ_eg·88Üçñ„è¼ìüÔÆÓ§Þ›6eúû?±´TÛ°Áf ›zaÔnì–A|ÐÜÁA›J%ÅÇ׋¾dÄÅ.…øøúÉ“õ$,'qqõÓ¦= qúê+˼¼¶E‹Ø®®Øl_üõ÷øñBCCN¶°¸Åbѵ´hqq^ ©ûö™1ãÍÔ{{-âõˆ m‘ŒwêT£-[²vìxd™’ÒWï¥vC¦MbÄ•iWDt…*2™4wnBaa»¨} Þ"¹¸èlܘxþ¼qÍë tØìFSS•}³¯$«#F‹D°­SÒÓ »%” ùíI!:ÉÉœ¾=j§O—ìÚõrÛªª……ŸˆÏ}A£)~í\cc¦øsÕÕÝm”q²q£Íóçò9Øq§O7TV*l¡¼E‹†_¸0ñ§Ÿl_½jSQ¡Œ«M\“DB ¢¢Bé/ˆÉ¤””tˆyîì ÝÛÄ13S±·×ýRÚÉqíì4Ï›pà@¾·wüõëU—/»b ã H²L›Äˆ+Ó®äÖ•ÌT …Èüùf?þøÑòåÉÖ(w‹ääÄâó‘ÔÔ¦êêî‰u\]uRRšrsÛðûʳ:‚`øÛ:%=­°[Â9j®®ºaa¯#F¼µ¢Ø±csçšMŸn¬©Iˆ-Êæ“OŒ’“›Z[yÿí—®ÕÒ¢‰ú:Ä >À§¨¸Ô¢Fái>r¤ý„G‚gÏ**º¤I"¡ÊcÜ8íøøzÑarrSg§`ܸ·S ZGÇ€ßáÆŽÕæñ„¨©÷eüx–Ô¬ §³S™Ùìæ¦‡'¿ цµµzHˆó† 6/JŽ›È§I™-Cvv Ÿß»zlb"‡F#‹&‰Š] S§%%qDËÒÆÆÖãO3‚ âk•ÑédŒv¿oýE»ÓLRS›Ð¦ÖÚZÍnï9¶¡$öìÉݱctyùô &~ö™©¢ÄyZá´+9t…'UË–Y8ààïo4kÖ3ñwc"-’ƒƒVXØkÚ!”žÞœŸß&þ¥ªLäk†²=+#G2Ûgì–ãÙ-½G-%¥©ï›Í¤IºlvcVVKaaûîݹ}וÄçŸ×Ó£/[–œŸßvï^Í¿ÿýòË/-$™}üxaVVKVVË¡C¯þþ»ÔßßÈÔTrq̘û;w¾PÜ}ûòvìÈyú´!+«eÏžÜ Ê¥n0 U²LJK;lv£Ÿ_|}=·ï§ì×O™Û÷ëlM U»vÙeeµ|ýuJffË¥Kå+W¦Z[«K|ª`r÷n º< ª ¸\AW—d\²Ä|Ô(ÍuëÒù%;3³%&¦î?ÿÉ…îÜi'Ÿø‹Ë_¾l½p¡|ݺtEeêõëΧOž>møóÏâ™3Ÿ¶·óW®'¿D´S·o_ÞãÇõhqçN ºØÊ€4)™-C]700ÍnŒŒ¬Ü¶-[¢mÁÅ.C§çË/“rrZ/\(ÿý÷BÞ>Áwß|ö¬!8¸°¬¬36¶îÇ3¼¼ôEƒA2ë/Úðñ1HNæðxÂôôfâµRí™H\<¶¡¤T …›Í9r¤ 8¸ðÉ“E©ˆÈÓ Û®ˆè ª¢¢Ü ÏÒ"9;ë\¹òÏ?žUSÓœÌéë¨a” |-û²våµuŸVØ-!Ƴ…*~`o¯¥©Isu•±nMqqÇøñøú<~ìíìüppŠ*&Æk޼綶w™LJ`à0‰-&äFMzòdѺuéT*ÉÝ]oëÖQ6Øô½ìåËÖÌÌæÅÕÓ£Ÿ:U¼wo‰üü 'uá"©’q¸íZZxšš4ww½ÔT?IÏRU• PS£ T“DB•„ŸŸáÕ«n?üö÷ß% ÉÇÇàôig‰k–.5OLäøøÄuv ´µiMM³Ñó‡¿Ú°AÔãÝD"…Nr}@ðð¡Çš5iæïÝ›ËdRìí5/6GÇs­¬ÔŸ<ñ^µêÅ’%IB!bb¢‚¾*„sçÊÎ+˜™©Ìžmº}ûhÑ2xØù%¢ ÑÑ•»w¿ì옘¨x{ëoÝ: g\ld¶ ‹›S($8Oèà uê”ÎPìR5JóØ1Çý+ëŸÊ ™¡¡.ß}‡w •ñãYÇ;^¹òzíÚt]]úìÙ¦â[Ba×ß'z»Óм÷]*ºc‡ÄŒùj72íYî¸xlC©ØØhkjº¸3BòKD••ÊÓ¤Ô¯ë.L/g)ˆVRøi7”ÛP #GÞ^¿>½»[€¶·ó,,nmÝš5D´mWƒ¬+ü-’Rš')#eäHªLœmƳ› ý3l˜êP“,3¢ûÖÏŸ7.^œX½Úªo—-6x>\ûãl}J]·yÿþ¼ìì¡PYºÂÎ môí‚U &û{Á•;»P°W–þðÚ åÇ6Euuwqqûô鯢 U|¾pè̅¶«ÁÔþº lÞÕ†ñʳgeä¨?™xÚ:Œg7tÔ JgéR ÑRshï{¾>ÃÌL°e‹íرZ°|!ºAsæ˜nÞœ¹råSS•¬¬–{÷j[[ùRg‰@ è¨A”ŽW² Hý:ÒssUŒwVìPȇÍ￈¨|ô¨.?¿MOáâ q9Rjò¿Öâ„à~€@  .d¨@ ¡ ú„@ ï=yym¶¶P¥¼¼“J%a̼.(h‹ESàLv™÷…@ "z‡>Oœ(ÔÖ¦-^Ü»Ò}YYçUææª3gš N:ØìÆœœV©³nÞ¬~ú´Áؘ`"Ç'ýINKk~ü¸¾ººÛÇÇ`êÔmTŠ78¸P|<ÙÛÛÀÎN¿ðÐÐÒÜÜ6ww=tûj;.‘Pl®^­¨©éÝŒÅßßh@[gdõê4CCƶm£(3:ºJ´®ÁèÑx 7$¤˜Ë(’¾>côhMüq!22Rø™3.Ë–Yà¼þŸʲ²Z,-ÕfÏ6íû‰_ÖÎf7&&rÄ×] .üþ{+âé/-í¸y³Zâä¬Y&Ç+÷Ò)SbÍÌT._víï‚I“bJJ:êë¹AA–üᤨZæå§§Ç¸zuÒà×_eÀã ÿü³¸ïy##æ¼yfC!…ïJ“ïK uyýº€0:ýªhÑŽƒóó÷<8Kž<˜O¥†ëê^ë´n]“1cÆ“1cîééEgd4+Dòºui„±X×fÎ|ª£sMK+ª¸ïòc2ãfdtÝÜü&ú;¾ §ä{÷jôõ£-,n}öÙ3=½hk……mŠÒv\"¡xÖQ32ºîëçë[§@˹y³ê_ÿÂZ{)>¾.,ìµbÍuÓ¦ _ß8o︮£¦¥ehx}ìØû£GߥѮöå—Iƒ© %Å væL ΋ÝÜ‘Éá>>qêê‘&&723qYû¾}¹vvw7nL×ÑémOŽ}5~ü…¤ÿÆ*†¿9rämÑïñãze—àäÉ1²Wxúè£;ß~›¢ÀZæé;wîs™—)£þ*ƒ¬¬fQ©‘ÉáÚÚQèÿy󞑾+MbÜ÷}osµ}C5MÍ(CÃëIIèÙÀÀkëÛƒã¨-X §”Ò×ÊÌl ,2²A@8uj¼OœB$?ÞU!:41¹±n]N±Øq Û{ñ¢I¾u2y%:43»ñóÏ™ Ñv\"¡ƒ°à-+W¦bÓ³g QQ•……íÆÆ*ööšXÇ&$4R©$üjøa2)?ü`µm[vddåæÍÉÌ/Am åWÇå Y“&éŠöû“»vc´ ‡¿7N[MZÚØØããc°bÅœ¡2K¡ªªëèÑ‚ÂÂvííÛ0°þÚÙ™…:ëë3V®¹`A«Wmè^^ÖÞÐУ¥EhiÑjk»+02böÝY¹¿ÚM¹K»õ¦ÓÉ ÿüSÆáH/ dÖ²þÒŒNxñ¢©¿º!O»qáBùÍ›UL&EM 07Wí»3rÓZ0tEŒÚMäŠÝša—‘Ìûö'ùèÑuuªøœ¢Õ«Ó¾üÒ\TÄ÷ÅÓ^AÄéýêS @ÆÓNNnBËË;ÇŒy³’gYY§‡GìÕ66êéé;¾ñÁÁ…âRN*¾p¡ÌÝ=öÎ55ê½{5ø-,$ÄyäHuOÊBïyy­ŽŽoöŸŸ0AA@NN+qÉâTVvݺUÝw&Auu÷Õ«‘‘•ŠÛÐÀ%‘d,lG2 =½Y¼ˆh;îÿ·wßqMœÿÀŸa…0ˆ Š2DDE•¡hh]µuÖÚ:ëèWmkm¥j¥µÃ…_¿ZµZq ‚[Q”)[ÙKžaÂH~œ¿3†p¹ Ô¶Ÿ÷‹×K/Oî¹»ç¹çî“{îž“'UaaU_åé]ZÚ®¥E[³æ©ð+i++;-,îäªæåµÎœ·{w6žÊfó”•©!uue##:ö'œ¹µµ&‹¥zýzUxxmÿEûûçzxDž>]¢««Âát;Æ~=ø~äïŸÃdÒº»ùk×>]¿þÙ`´½èèú¾>¯/‹ÌöÊYžžQ°Xt&“vþ|ÙÙ³¥äç%hÝÄG†kתvîÌš5+®»›ßØøâóÏŸnÞœN2Ub-Œû(0°ÈØXíæÍjGÇJJdßÊ^XÈþýîb³y÷ö9sLÎ+MHhLLlòñaýôSØ‘dë––Ì5(ñèšÚ,ˆ_½:û[»ö©¢j¸ŽTUCð#ŠÔÉ®O±­Œx‰Û>qÎÄó>zÄ¡R¯r8/÷GÇðM›žÉvVꦓ¹ëSbû•ùJ|4#.IâåçÜ¿ó¡à¿þ*%¹\ò{,T¡_¨º……<¬ßS¤wOXQÏÖV+9¹©gâ˜1:Š ";:zéôW/“Ç^ ×ÞÞ«ÌÛÛ{ÓÓ[ŠŠx]]|§Ç‘°É“ LMÕ¤šwùró+W&\¾ìzåŠë!jkÖ¤.X@>gÜâʼnsæ˜_Ò—§4ˆç•'UN::*“'`ÿ÷ñaõõ ®^­Ä/OžlÀdÒ°I??@pýº.Tܽ[Ëç Ö¬ßÅsýzµ««‡Ó•ÍÍÎæš™©··÷^ºT®ííêâ·´¼àr{ZZzš›{êë»…»¶WžÒ°³c¨nÞœÁ‘mµÉ´n±GKK KË—OMN›ÆjhèNMm&“J\ Ô:8hã×­?üp(ùmY¹Ò‚J¥88„ûûçNŸ{óf5Ö*qo×ÑQ pxüxòâÅCñËiùùm2´îÛi׋ý 71ùk ŽÆÓŇÉè_G2“¸Îm_žãFFF Ne0^ÞÕÃbѹÜE••ÌÈ´_ÙΡÄG3yZ·ü9Ey5Žš©©š­­VTT}rrÓ’%fø˜}ûò"#ë’’šŒŒè/^ˆéLôña)|å _kcØÿñCªœFŒ`ܸáŽýô臱±õOžx)dÞ… _FWsæ˜ôöòÿø£¤¶¶KªK»^^ѪªÔ°07E•ñ¼ò¤ÊIø'VDÝÝ/_ÌÜÔôB8ÕÀ@ÕÊJ³¨ˆ'ÿB‹ŠxÆÆtGGñ½!%%íuu]NNñO””(©©ÍK–˜É¿h??“}ûì±ÿggsôôð±»gˆ·WÎÒˆ‹óܾ=Ó×7ÖÒRcÛ6i_êEк‰ ÂÝˆŽŽLeeJtt½‹‹ŽÄTâZˆŽ®ww×ÙsÈklô»x±üΚ)S &NÔ÷ðˆÄã*2{ûÑ£lKUE…jaqGGGE[›5E!Íá×_G 4œ<5H\GÂ[׿ŽäA¼Îm_žãÆ´iF;wfíÙ“»fejjsTT}tôE••ÌÈ´_ÙΡÄG3yZ·ü9EyíÍãÇ릤4õ¿¢vútÉÞ½¹Û¶ÙTWÏb³gßûŒ£Ñÿ’cczuu'>YSÓ…ç÷_~iß([@%PsuÕ ®@ öÚˆ¦GŽΟo:s¦1ƒACá§–Á6c†QJJskë˸p´µiøoJOoÁÚ’Âç}øƒ"A{ݺg11 “ûÙM²4ž3(hü Qàþ<¨G3ÙÍ/g[[­œ.>)¼u$I<æˆ=—A †Æ×MMmîÿûc½ÄÄÆ¬,.›ÍÛ·/OQÝö-Yb¦¯¯²reJAA[xxí?ä®Xa¡ œegeq³²¸¿ýöüÌ™R__£!CDc#‡þþ¹RÍ{à@þž=9qq YYÜýûó‚‚ÊžnAlÎûöå8QôÅVùùm·o×`ø•2¥S?qb¤È3Pç•'uðìÝk—•Å]½:53“{éRùÚµO­­5Eóöó3¹¿û1WZÚÞ?“îî¾ÎNÑcÁ²eæ#F0¶lIßµ+;3“ûøqÝ/¿à©þþv|>òòоx±<7·5(¨|Ë–tEmTEEG\\C\\ÃÿþW<{v×»ví02Û+Oi<~\wà@~LL=v&¾w¯~Bª’Kâ‘¡®®{ñâ„ÄÄÆÐЪݻ³EŽ-©ÄµàëËjjz±bErNNkPPùñãl EŠZÀ601±ÑÇ'º¾¾[xà‰{;v9 !äåe˜’ÒÔÓÃOOoñò2”غɈ‹k¸¿ÿSH ÊYGØåŸÞ^Á9Ul+#³Î‰ÍY">_˜ØtèPa` ;6¶üŒƒw¦#Ó~eC|4“§$‰sž?ß4?¿íèQviiûñãEüQ,m s:—ýKáO}b0aäaÿàO}æåµN­¬|UIéê´iÑ©©Mø÷ñ'Göî͕硆žÍÌËkµ³»P0~M¶aÜÅæ¼zuʈ÷©Ô«**!ÞÞQ¿þ*þ©O*õê<‘jÞ“'‹\\Òh!**!ï¿;ÐÓ‘bsÆžƒù~ŽFbi¤¤4!ûÜÄäÖÇ'âOùIœ—¸uÜݯX‘üÉ')ØkÃóó[I¦J¬…#G 55C f±nÞ¿_ciy‡ü› °Š`0ÂfÎŒí_{ûÑ£…xãzö¬yüøˆ¡Co¯Z•L¦u“yêSäïÞ½ùkPb>ü| Zøæ›¬þk…4OÜʈי¸íç,ñ¸1wî ÐáÃïššÞ¢P‚ut®“|Wâ™Nžo‰Û¯<çP‚£™Ä#!ñr‰“;vd˜›ßÆê÷Ñ#ÎС·IÖ Äcñ¹ì_Aè.|÷s.)á½kÅ(ç› „ ò|G†Š¨­%ÊVÚ@M!Û+Oiô?»+°$ÅŽ@0ê=É1ñ‰k¡ãÝi€ƒšù®Á7¶Î 4|øÝ­[Ó»ºú°I¯ÇÂâη߾+¯*ÔÚy+',⃤°ÊŠx[ä)þ7>*°$¸`/{*q-`ˆG–~+ pP3ó5øfÖYQjjºŠ‹y3gcãª`z{ù2ÜùVZ÷ßñ„E~`^iËäÝ<—½¨A·|¹>Ôœºúß~—30P55UGíÜi;j<»À»Âؘ>oÞ;2×®6dˆZV7<œÓÚÚ«»Á€@ ücI;j×;NìÓ! ?ssu‚ëÄ©Èæøqçkת=ª+(hÓ×W;VçÔ©1ÇkBÉ€¿/Š€d÷x³¨P¨À ûÎMøxÙõyì›É¤-]úr„î²²Ž[·ªÍÍÕgÏ6y3둘ؘ“Ó*öîŸÛ·kââŒé~~&2<2PÎii-11õ55]^^†Ó¦I÷’5âyÙÂýÉžž†vv ò™Ÿ;Wš—×æá¡½~JªTbÄ%)O*±ÊÚÚ—/ùñõ5RÔ jÈØ¸1ÅRݽ{¤ó¼q£®——áÈ‘d+÷Ô©âîn>BHI‰b` :r$ƒü¼@ÂŒrõìÙ±+WZ¼cÎ@©‰‰IIM›7[  6l°’ë°=‡J¥XX¨ÛÙi››«Cð/‚x«¢‚Úñë¯ãÞ¶_-PV¾*vÀÛ-[Òèôk³fÅ:8„ëëßÈÈhQHÎ[¶¤!¬£s}öì8]ÝëÚÚaÅÅd‡l‘8/BÁFF7ÍÍoc.”‘Ì9<¼ÖÀà†…Å>x¢¯CW÷:›ÝF2•Ìj”¤<©dÆQ32ºéíåíY§À=çöíêo¾!!):ºŸSQ¶oÏðöŽòôŒ’aÀ[ëæ¨QF޼/*ÛÎ2—Æ ÍûN ‰‚Éx+Ï1g Ôòììîùeº®îË<~îìüP![‡í9ööáØè ‹%ÿ/5#ŒÅº™œ5>ëi IDAT܈}ºxq‚µõÝ7¨-Z” ¯cÍšÔþÍÌÌ„‚CC+A_Ú´h/¯(…äßV‰Oš˜ÜÚ²%d¶Äó²Ùm?{Ö,Û ‚‡=Ç'MMo}ýu&ÉTbÄ%)O*É@Mžo ¬]ûôóÏSßbp m ¶k×Ë`¨³³÷Çó¨Ô«……mïBi¼Ý’|ÚÌÇ‚ÔÑ£\»V)<<Ÿ;WŠnܨRT †í9|¾ <¼vèÐÛŽŽápöà_âåðíí½S¦$'7«‹JIi=Z‡Çëî싊ªKLl²µÕòñayxè _–Û±#sÍša|¾àÂ…²œœV­­[­IŽƒÇ`('&zݽ[*úÜ  r5ì qT*eýz«yóž”—w˜™©Ë™³ÈûìÆ×ÅÞ8&bá„3Œ>ùÄ’ü¼ /‰Q ÅæuÊeøpÍž1½çç·ŽÍÄ'ÇÓPNN«ü9 «ªê¼s§fÁуWMMWHHehh•Tó64tS(L'“3B(=½E¸¤J•ª$åI•GXXÕ×_gyzF—–¶kiÑÖ¬y*ü ÞÊÊN ‹;ù††ªyy­3gÆíÞ§²Ù ,26V»y³ÚÑñ’’oe—ù˜C:gŽÉ¹s¥ ‰‰M>>¬Ÿ~*>’lûÄ&NÔ5Šyûv ™}ƒ¸•½±½ ³WÞ:91CB*B÷îÕ::2…_Áan®ÞÖ6Ÿüøã¤óçËD®@üðCnJŠÏ˜1:²­Ÿ/f87§{øðW÷ê2™4„~[º<9cÁèéÓ%©©Í99Ü€‡­[mD¾`lLŠš"v¤D‚y±«8,ÖÍÖÖÞ©SY‹ýøc3ò9ã²²¸ii-_m+Cª´%)OªœRR𢢦Lžl€rw×[¹2OÚµ+«³³¯¢b¶Ä?þ(ùüó§|`Š)·l±F]¾\îìÌüöÛýsÆžŒ çôOÊÈhùá‡Ü ¬ŽÝ?õ§ŸòÓÓ[*+g¨"„þú«lݺgÇ;+d{ÃÃk[Zzø|Av6—Çë½paü¨QL2Û+Oiää´FEÕ'%y§Û•$–$Aë–xdHIi*.~ßÒR!ÿë¯Ïv"“J\ ¡¡UNWEÅ,ìÑwßådeqßÀ1‡ uï^»Ÿ~*ص+ûرѱ±õ]N#Óöɰ²Ò|ö¬™ÌžCÜÊuo(òŠBhìXÝÂBÖªEz÷„ñlmµ’“E; 'LГ9JHGG/®„Ob±c{{¯B2ooïMOo)*âuuñ9œnüGÂ&O605U“jÞåËͯ\™pù²ë•+®C†¨­Y“º`Aùœq‹'ΙcÒ¿“‚Lª´%)OªœttT°óBÈLJÕ×'¸zõeoÔíÛ5“'`焟Ÿ‰@ ¸~½Jþ…Þ½[Ëç Ö¬&6õúõjWW=§+;››Í53Sooï½t©\!ÛÛÕÅoiyÁåö´´ô47÷Ô×wãIÄÛ+OiØÙ1 T7oNˆàȶÚdZ·Ø#ƒ¥¥‡!„¦Mc54t§¦6“I%®…j´ñëÖ~8ôÍsRutT?ž¼xñPüršØAC$¶}2´´”ñ[S$î­lP÷v€‚¯¨™šªÙÚjEEÕ''7-Yb†@€Ù·//2².)©ÉȈþâ…˜.–ÂWÎÐÎåöà“Øÿ±_~ò1‚qã†;öÿÑ£ÆÆÖ?yâ¥y.|?Í™cÒÛËÿã’ÚÚ.©Þ–ãå­ªJ s“!U†’”'UNÂ? °"êî~ùú䦦©ªVVšEE<ùZTÄ36¦;:Šï8.)i¯«ërrzˆ¢¤DIMm^²ÄLþEûù™ìÛgý?;›ëèø §‡¿}û{·WÎÒˆ‹óܾ=Ó×7ÖÒRcÛ6i_êEк‰ Â…ŽŽLeeJtt½‹‹ŽÄTâZˆŽ®ww×ÙsÞÀ1‡L[8z”Íb©ª¨P-,îèè¨hkÓ¢¢¦(üØXRÒne¥Irß heƒº·|E !4~¼nJJSÿ+j§O—ìÝ›»m›Muõ,6{†ð½Ï8MñcçÓ««;ñÉšš.Å”q_~iß([@ïÇ„ùNáuëžÅÄ4DDL61Q“6óäICee§T%)OêàqrbFG×ã“))Í}NNLáïhiÑÚÛû¤ÍyÔ(fOÛÕûsvÖûüÂutôef¶¸¹é“Ù^…”†µµæ©S.Û¶Ù\¼(Ú·%[IJ<2dgs{{_Þ –”ÔD£Q…ïÜ"H%®…iÓŒ’“›ða¥##ëßÌ1Gb[À.§ùù™<}ÚŒÖÖš‰‰ Ümúú;vdvuõíÜiK~ßɽ]ìQðv®¨¥¦6÷¿Am½ÄÄÆ¬,.›ÍÛ·/¯ÿ jƒdÉ3}}••+S ÚÂÃkø!wÅ åœxô(;+‹›•Åýí·çgΔúú "ý88<ð÷Ï•jÞò÷ìɉ‹kÈÊâîߟT.vès±9ïÛ—wâDÑ_Xåç·Ý¾]ƒýáWˆS111õ'FŠ<Õ%±$åI<{÷ÚeeqW¯NÍÌä^ºT¾víSkkM‘6üüLî߯ņG)-mïŸIww_g§hü±l™ùˆŒ-[ÒwíÊÎÌä>~\÷Ë/xª¿¿Ÿ¼¼¢/^,ÏÍm *ß²%]QUQÑ××ð¿ÿÏžÇãõ®];ŒÌöÊS×8SÅC÷îÕbLHU’bI<2ÔÕu/^œ˜ØZµ{w¶È±… •¸|}YMM/V¬HÎÉi *?~œM¡¼‰cŽÄ¶€]NCyy¦¤4õôðÓÓ[¼¼ %¶}‰ÊÊ:îÞ­9t¨ÐÕõѹs¥:â]ŸdöÙÛ:ªÞ eá {{mƒæê*¨mÙbS\ÜîìüP @ÞÞ†11ž..ofý?ž²`A¼­í}:]iñâ¡ÂŒÉCCCù¿ÿ-Ú²%]Y™âá¡ÿí·#¶m³éÿµÜÜÖÌÌ©æÕ×W9y²øÇó)äãÃúýw'±GL±9ß¿_‹Úµ+[øÃ¿þ‡=ÀHœŠQWWFih(I[’ò¤VHˆÛ_¤9S¢¤Dñò2<}ÚEä;Ë—›'%5yyEutô1™´ææ¹Øç¿ÿþ|Û6¼w¯™B¹Š:yr þADĤM›Ò~ýµàÇóèt%{{ÆÒ¥æX–••fl¬çúõÏ–-Kæó&&jcÇ*ì)™óçËΟ/C™šªÍ;äûïGÚØh‘Ù^yJC @7nTíÛ—ÛÑÑgb¢æéiÐÿéÎæ%&ñȰt©¹’eÒ¤¨ž¾££öÉ“cH¦׈Œ#GFóMÖ_•±XôsçÆ®[÷ìÍsR{y9 +™uëžž8Qìãc(r‡ŸØ¶/Ñ… eÁÁÖÖšvvÚüá‚?,Lrß™½à¨x^¾ë týcèPõ¿WÎ¥¥í2¼uP¹º>²²Ò¼pa¼l³“yCÚÇ5HV‡ÓE0" …rõÔ)—O?µTlqo‹<¥Q]ÝIÐi.gIö7qbäСj—.¹ÊJ²jjºˆÇ,üWUä¬;‚r~*üK¯¨ƒt<ÔœßÍãi||ãÒ¥I¡­ú_²%FæÜ#óù‰¸"Äž·ò³³¹|þ`•ñ¶ÈS£4¤è‡uˆ’ü‘H+ÿí¢´AmûrÖA9C”jàŸlùr |¨9¬åoÍÀ@ÕÔT!´s§í¨QÚP¿ PcÒŽÚõŽûtèÏÜ\àq* Ü£ðŽ¢B@  P€@ @ €@ @ €@ 5€@ 5j5Ôj5€P öìÙ3áÉO?ýÔÉÉ)""BዌŒtrrúôÓO‰¿vîܹŋWUUA…‘çäääää¤À ¡€·¨Ý¿ÿ½÷Þ£P(cÆŒQUUõððøé§ŸBl6;##£¥¥Eá‹çr¹l6›øk‡ Ž… #/#####CÊ\ _}õUqq1T c vðàÁ÷ßÿùóç,kÊ”)jjjqqqÍÍÍïÂZúûûoÞ¼ùÃ?„ û;ÖÂ7~úé§òòr(C@*ÊØ?ÅÅÅ»wï_}õÕ°cbb&Mš„U ääääåå¹¹¹™˜˜ôÏ+&&†ÃáØÙÙ9²êóçÏóòò”••Z¡ŒŒŒ¶¶6UUÕ±cÇ"„RSS»ººtuu,X òͬ¬,.—;qâDâµJHH¨®®f±Xؤ¥¥å!CH–ÎÇÛÛÛÍÌÌú/ÿ$..!„’˜˜H£ÑÆŒSSS“˜˜hhhèîî.U­ˆ-I2Û[^^žššª¯¯ïàà RV­­­îîî™™™ùùù¶¶¶ŽŽŽ$·WÎZ¨©©¹~ý:öMeee„¾¾¾­­­ðwkkkçÎ x@ Ÿþ9BˆÅb Ä™û¨Q£°Sø´iÓV­Zecc³sçÎþÚ±cÇB=Âç½téÒ?þˆÅ[bC„ÖJ hii1Œ_~ùeß¾}ªªª¡;wK,”Û·oc9O›6måÊ•***!òö‰±±ñ²eËœ7nÜH¦2ˆK’x{+**°Ô3f,Z´ }D5 …âííýÙgŸa[ô矒Ù^yjá÷ßß»w¯¡¡!Bè“O>Ù»wïÞ½{CBBD6«{÷îAƒÄjúúú¡àà`‚@ÍÝÝ›|üø1BÈÎΛ\¾|9a“)))!%%%lòòåË!VZZÚ?g,P›:uêÑ£GB #..®ÿ×°8Clˆ0ÐZ={!ôñÇc“¾¾¾Â¡ ±qãÆ!„öìÙ#œ³šššTÚÂ… ¥­ â’$ÞÞS§N!„V¯^Mž?¾ ¶`Á<ðB-^¼˜ÌöÊS ;;;„Pddä@^PP ­¡Œ÷X!„„;ÝúóööÆþãéé‰ÊÉÉÁ&ÓÒÒBW®\Á/Ì „úúúrrrììì233B“&Mî>ëkÔÇÕÕÕ#""°[ÓÈh­”””B•••X°‚ý‡dæYYY!¼»ÖÝÝN§wvv¦¤¤_½>úHÚnhâ’$ÞÞû÷ï#„ÜÜܰIá› qø]tXÈõðáCEmï@kE’ ܇ˆx¨YZZÖÕÕ?—goo/öóÚÚZ„Þõ†I<!TSSƒ=z´ÄUéèèxþü¹´Ú@kõá‡nذ!::ÚÊʪ§§§¼¼|Ê”)bŸr诳³!dee…Mª¨¨˜››`[*b cZ1Ä%Iœ-la½¥!¼ûUþ…‰‰‰²²rSSSee¥©©©TÛ«¨€D/ï=Ç.Ø\¼x‘à« EìçXppîܹÞ×?!„]H‹‰‰!ÈÙÒÒòçŸF­^½:!!Aª h­h4ÚªU«BÆ ;vìXhh(É<õôôBXÏ#BˆËåâ[J£ÑB===Xjbb¢¢*ƒ¸$‰·»Z–Mн¦U__ý'//¯··×ÒÒ»íŒx{å©( PÛ¶m•JˆˆØ³gž–——WRR"1 ¬—íÿû‡ÃÁ>IJJÂn>Cÿß—’’‚ÒÜÜ/œƒ™™ÙöíÛ¿ùæ›îîîyóæ)jÀ­+W®¨¨¨Ü¹s'22rÆ :::$gÄúï.\¸Àãñø|þéÓ§ù|¾‘‘vÝ»+ » !„=¡Ä%I » ïÖ­[<O ܼySlp¹\@påÊ„ÐôéÓÉl¯¢P‚j½páB@@´F@~·Ú—_~‰}¢¦¦foo¯¡¡úý÷ßÉÜ> E¥R±Q<ð7ÁÌ™3±ï³X,ì©À1cÆ?L€¦ËÑÑ›¼wïÞ¢E‹|}} BÈÞÞ~öìÙK—.%yS?>VBH]]}Μ9< sã^aa!6V…ŽŽÎðáñÎ;‡¥æææbŸØÛÛô/I¬Û±°°P†{ JRâöbOzâcs ×&@ihhàc˜Ýºu‹ÌöÊY àÂ… !MMÍéÓ§»¹¹}õÕW©MMMعK—.ÁM£€°×N¨AAAvvvØùžÉdNš4 ‹l$žŒ«««çÏŸ¯¦¦†b0>>>'NœÎyçÎØ-%%%‡ï¿ÿ^l &°{ÔfÏž- ê à@­´´ýàÁ‚ææžÊaÃ4&LÐ1‚±cÇ{Ø—V®L¹r¥â½÷´x¼Þ¢"ž……ƶm6›6Iqn»{·fæÌ8ssõÒÒ™ÿæ@mâÄÈÊÊáOÊÊ:~ùeÔ—_Ú`“îL1HNnb0h÷ï{88h“Ïÿ·ßžïÜ™©­MkhðþüÁÎÒ¥IÊÎÎ̘˜>_œì=|¸&þ…­[ÓOœ(öñ1,+먩ézôh²£#Ùå.[–V5u*«¬¬=+‹{÷®ÇÔ©,á/x{G?{ÖìêªÇbÑÝÝõÖ¬!uÔuÆp8]cÇ>ZºÔìǤšñΚøøÆýûíáòÖ±X7ëêº gXYi’L%ne÷«ZÆÆæžëøqg¨€b^§­¶sg¦È‡+V$ÛÙÝÇþ_^Þ¾dI"“&ƪUÉãÆE œœÜHüM„‚Ïž-‘-õoçÑ#•z•ÍnÃ&©Ô«99\@PW×åå5eJ$ùÜ-JÐ׿±fMªžÞu‘¤òòöC‡žã“¦¦·¾þúU-gf¶ Z)úúøÓ¦E{yE‘\hQOIéêǵØä‚ñS§F ÁÇ'z̘‡UUÒÎà­3n„G³fÅÊPqk×>ýüóTxÛ,ˆŸ=;¡àÂÂ6’©Ä­Lâ~EÐÊ0yy­ÚÚadz¡v ¡,m`7t¨úwß¼t©üÏ?KÉ_Ùºq£ú‡ìx¼Þ«W+ÇŽÕNª®î<|¸Íæ9:2¿ÿ~¤ÈŒÄ©;vd®Y3ŒÏ\¸P–“Ójc£µu«5‹õª#ãèQvBB£²2ÅË˰ÿÚ•GEÕuwó]\t&LÐY1âT„ÐÂ… 3f}ò‰¥ÌQòáÃ…Ó§áW‰®^­pqÑ9’20P]»vø¢E ÏŸ·‘ìkf0”½îÞ­ ­ì_k›7[㓾¾F·nÕà—‘‚‚ÊMLÔæÍ‚¢R)ë×[Í›÷¤¼¼ÃÌL]âBóòZûúø ;;Æ”à©-œ„/5ö´AZgÌgŸ=ml|ï%6u Ú¿}»&5µ)4´ÒÀ@uãÆ4ìÃcÇFã3¦¥µDEÕ%&6ÙÚjùø°<<ô¥Úcƒ‚Êoß®¦Ó•44”BææêÛ·¿GfÞ–[XÈ;|¸pûö÷ÌÍ_•Ìùóeåå‚Ä-…Øþýyéé-ºº*~~&ï¿o¬¨í•ØÊ.]*Œ¬»|ÙõÖ­jò©Ä­Lâ~EÐÊ0¶¶Z/Ž÷ó{âà =q¢>\ ÈI–‡ ¨T„jn~Aòûpšš^Ìžm2{¶IHˆèÑmìØGEÆÆj7oV;:>PR¢O=y²8(¨ÌÃ#òÞ½Z åððZásÀøñüýs˜LZw7íÚ§ë×?ž×Ó3êàÁ‹ÎdÒΟ/;{¶”|*B¨¦¦+$¤24´Jæ¢/*âݾ]³qã«äÂBžpœ1a‚BˆÍæ‘ÌðÔ)—áÃ5{zø¿™žÞ"ÜדŸß:z4Ÿ7NW @99­d:s¦±¶6í‡r{zø……¼3gJ?üp(žRif¦îêª'ÿžªÀuþÿ`¥téR3±IµÏfó”•©!uue##:ö'Ü‘=iRä­[566šéé-ÞÞÑlò{¬¥åݳgK|}TU©ì––›L0/Ár­­5/_.?s¦Dx5¶oϾW’¸¥¨¬ì´°¸oh¨š—×:sfÜîÝÙŠÚ^âVV[ÛµqcZ` 3ƒA“*•¸•Iܯȴ²÷ß761Q;¾ N0€·ÐõÉãõ¬]û”J½úìY3É«vkÖ¤:9=À: NMm“®]ê'¢»½IDAT«TRºZ]݉MîÞ-ܹIœŠ­-…òZ†¸€€<•ºº.lòüùR P<5;›‹PpR’ø~XâT\TT]EE‡Ì37oN³²º+üÉÙ³%LfXO›

þ8ŸìèèE(øÌ²ËMIiÒÓ»>bÄ} Ð;2Döœ)S"7oNSU QW¿¶rerff‹ e¥ðuŽo@(øñcŽlµogwŸL×çG%Ž!Ò¾Úc±~pçåëè¾iÓ3’ó/wÓ¦gÆÝÁ'ïÜ©F(87—K¦¥[¾<ÉÐðFsó lòÔ©b‘#ƒ<ÛKÜÊfÏŽ[´(A ÄÅÕ÷ïú$H%ne$÷+‰­lÉ’Dü˜ ò {E­¼¼cîÜ'nnutnܹSóÛo£„w»~½ÊÏÏûyjb¢&|QíÁƒZmü©+á‹1SñÄcÆèˆ[hµ««‡Ó•ÍÍÎæš™©··÷^ºTŽ÷ШnÞœÁé?/q*nòdSS5™Cä³gKׯ.üÉÊ•T*ÅÁ!Üß?wúôØ›7«±Þņæ‹'Ιc2¾)þIGG/®„OªªRBíí½$3Ä®­¢Ö×'¨®îzýŠKGBBcWW_FÆ´øx¯šš®Ï>{ú.¬s||£²2Eìó§$kŸÌS[[­ää&’{lFF Ne0^ÞÀbѹÜ’ó/wÕ*ËââöØØ¼ßsüxÝ#dZ ±Û·k&O6`2_^µòó3ׯW)j{jeþYšœÜ„ݰ/ ©R‰[™œûÎÝ]/7·ÀëúTQ¡ZYiΚeœ”ä]^>Søæ!b×Õ×wŸ9SjoîàÞÚÚ#¨EG× Ä…{‘$¦b||Xb—[RÒ[ïäôûóöŽVR¢¤¦6ã_ˆ‹ó44Tõõµ²ºwüx‘ÈìÄ©ò;|¸°¯O°u«Èç~»w|þ¼mʃŸvDÉ öçå­ªJ sþÐÐðµs$ö’bTTýôé±?ÿìøðᤴ´©99\W×Gxj_Ÿ`ȵÀ@ç÷ÞÓ5ŠùÝw#KKÛßî:#„23[¬­¼óOžÚß·/ÏÛ;ZS3Ì×7öÔ©ò{ì´iF==‚={r‹ŠxW®TDEÕ¯];œä¼ÄË=š9jóܹ—¸7oV¯ZeI¾¥hjzub T­¬4‹ŠxŠÚÞú[·lI?yrŒžžŠ´©[™œûÎɉ) <8™‘}˜ÀȈþË/£dX@HHå!j_|ñòN¬ªªÎC‡ ÓÓ[œœ˜!KKªªNüËÎk×cˆS14šøXSG‡ææ¦ê6ÐŠÙØhݸá^XÈûùçü­[Ó‹Šx¿þ:ŠdªüŽeü±ø¤>úÈì£ÌBgΔ¨©)ÅTÔB-J(.æõ¿}ÞØ˜.|r­©é(,îïâÅrmì^o[[­ÿþwŒ«ë£§O›±{èPõÞ^~g¡½=!”‘Á%?æÙ`¬3Bè½÷´®\©mß pútÉÞ½¹¡¡nú íØ1ö¦Mi$÷X;;Æùóã>þ8éâÅrýË—]…c ây%.wÕ*‹ï¾Ëùãì~;á¾$¶tºRIÉ«°»§‡_UÕ©§§ª¨íëÔ©â¶¶ÞmÛ2¶mË@uuõ!„¼½£uÂÂ܈S%¶29÷+\^^BÈÕUÎ1€7¨É,,¬ê£ÌþóŸWOr;WR‰jÓ¦íÝ›+ !„"#ëE~s¤svÖé‚ËÚZóÔ)}}Õ?ÿ,í2&N•ÙÍ›ÕEE<‘KDý:T¸|¹yÿÏŸ6¯È Òíߟ·gÏÈÝ»GJ»GI\îæÍÖÛ·g^»V\=Ò(mK[GNNÌèèW­2%¥¹££kÚƒ·½Ó§éè¨_xíÄ0k–1ÞûéëËjjz±bErNNkPPùñãlŠÐcÄ©Äüýíø|äå}ñbynnkPPù–-éxêãÇuäÇÄÔ#„’’šîÝ«>{§âøûçÊP,‡Nšd v$[¬[01±ÑÇ'º¾¾[d¨¬H'NŒôöŽ–j‰ûöå8QôÅVùùm·o×`øÕÊ%KÌôõUV®L)(h ¯ýá‡Ü+,H.wݺáOž4²ËÊ:"#ëþóŸŒ)S ðB×­nh¨:kV\DçÖ­ê={rgÍ2!™³üëL`ÊeeÊ“'bz¦ÈÔ¾ŸŸÉýûµIIMx•áibbcV—ÍæíÛ—×ÿ5b|¾ 1±éСÂÀ@¶T½fd–;{¶qPPù£Gu"o n)Äu´w¯]VwõêÔÌLî¥Kåk×>µ¶Öèí²moÿV6a‚Þ–-ÖøßÂ…¦¡•+-°7©§JlerîWÂÁoúŠZ||£»ûcìÿìÀ@¶ƒƒvfæ49s ©42¢»»¿6˜Ð¼yC°÷·88hÁ8rdô7ßdýõW‹E?wnìºu¯† N%fe¥ë¹~ý³eË’ù|‰‰Úر:B×ÐUûöåvtô™˜¨yz)EœŠËÍmÍÌl‘¶L²³¹×O›êäôËía0húOŸúô¿’¤®®ŒÒÐP’j¡÷ï×"„vízmè„¿þ·t©ùÿG'S,ˆ·µ½O§+-^<ôða'’ËuvÖ9ztô•+›7§ëé©Ì;DäþÅèhÏ%K§M‹Ðĉú$s–‰½ÿ¾ñ•+ýCa2µ¿|¹yRR“—WTGG“Iknž‹}¾e‹Mqq»³óCy{ÆÄxº¸D_%­‡9mÝÝ}UUL¦Jfæ42—NÉ,wÕ*ËÙ³ã†U¹iŒ¸¥ב+$Äí‹/ÒΜ)QR¢xyž>í¢Øí•­•#nerîWX|Ïfód»WD¼|…Ô[WSÓEð^KâT‰8œ.áÑ›„UWwŒÅJœZQÑ1t¨ºÂ‹Bb¶¥¥í²½×RNƒ·Ü·µE¶¶÷'M28yrŒ µ©­í’á¦~ZÜ›3ÇäÀüIC{ûK—šíÝûæ^TEÐRˆëH†r ¹½o«•És(sq‰X¹ÒÞ0Pˆwå â8Lž( !4й!D|&&N¤½ÄlßJL3¨Ë}[[tëÖÄJ‘1iIÖ>FQQZMMWq1oæLc,jÁôöòÅÞ 7xZ qI[ä·÷mµ2™Í›÷düx]ˆÒŠò®\Qà­ˆ‹k¯}“W­2~|iiÇڵÆ QËÊↇsž>mŽ‹ó{/ã?À?r{ŸcÏ™cbf¦þ†×`„Ç%%íõõÝkÖXž81æÍ,ôÉ“†´´„šš’©©š¯¯‘pê±cl}áw7]¸PfhHŸ6{ Þ˜—WÔ²³¹›6¥YYi¾ù@-!Á !dk{ÿM.4,¬êСB{{íúúîêêN&“ößÿŽùðáXê¦Mi¿ÿî$¨仸èB €7éß{“IKOŸZU5‹ÍžakËX½:ö¼S¤¸Gmÿþ¼ôô]]??“÷ß7I}ò¤!,¬ŠÍæ«ÙÛ36l°Â“ÒÒZ¢¢ê›lmµ||XúR­âѣ섄FeeŠ——áÊ•ý¿°paÂŒFŸ|b)[ ®¹aÃðeË’££ëexû2À !uE­²²ÓÂâN@@¾¡¡j^^ëÌ™q»w¿öFÿ\ÈÓ§KtuU8œ®cÇ^ õ^VÖ1iRä­[566šéé-ÞÞÑ /Öøñüýs˜LZw7íÚ§ë׋¾ë³¦¦+$¤24´JžR¨¯ïFYYÁNx‡º¢¶kWVgg_EÅ,&“†úã’Ï?úÁ¦£G3B-?ü»aƒÕÑ££ûÏkn®ÞÖ6Ÿüøã¤óçË„¯·øé§üôô–ÊÊYª¡¿þ*[·îÙñãÎÂß16¦GEM‘yœL¯7:ºþøñ¢I“ † QƒïRWÔnß®™<Ù‹ÒB~~&àúõ—±îÞ­åókÖ “˜OQÏÖV+9¹‰äÊ]¿^íêªÇátegs³³¹ffêíí½—.•‹|mòdSS©c¬ÆÆššaLæõY³âfÌ0ŠŽž{Þ)¤®¨55½˜0AŸ40Pµ²Ò,*âáá—±1ÝÑqÀ7ôíÛ—Y—”ÔddDñ‚O~åJJÚë꺜œâŸ()QRS›—,1“Ë Ú•+®/V¬H¶±Ñ’ø} ö¼{®TRÒŽOöôð«ª:õôT±I&“ÖÐðb yOŸ.Ù»774ÔÍÃCŸÁ ;ÆÞ´)äÊéèÐÜÜôBCÝcËi4ÊôéF¡ØØúo¿Í^¸Ðn—Á åäp…¿\TÔ.ö9€ÁCªëÓɉ]O¦¤4wtô99½flÔ(fO?8¸Bì¼GŽΟo:s¦1ƒAC]»VI~åœuÂÃk»NœC¡ ÿü'ÿdØ0Gêðɇ9]]}óæ Ýo-PKNnº}»ÿÃ?ß»×.+‹»zujf&÷Ò¥òµkŸZ[k®Ze¥.[f>bcË–ô]»²33¹×ýòK>ï„ z‰‰YY\6›·o_žØÔzzø½½‚öö>‘Ïýýíø|äå}ñbynnkPPù–-éýgwpxàïŸ+O)ìÙcwáBŒ®[7¼¤¤}Þ¼ø8Ç­[÷ÌÁA[æçdóòRÙÙ\‡"i‘‘S¦Ly9®XhhÕ_¤UUu*)Q¼¼ OŸv:ôÕ; ª«;7mJ»s§¦»›O§+ÙÛ3nÝšhdDGåç·}ñEZdd@€¼½ üÑÁÅ%B XˆÍ¸kWö?æ‰,78xÂÂ…¦ØÿSS›×¯öôi3Ÿ/01Q;Vçúuw‘ï+)…Ìkríš=¤ÿùOÆŸ–64øáŸŒN¥¢ìlßÿMsþ¹€Çë¥P‹‹îÉ“cð+ˆo4P#©¶¶ ¿RQÑ!À)‡Ó5Ð+Ûo¡UU0fþxc¨P¨Ô P¨@  P¨@  Pøû?ÍHÈŸ»¡IEND®B`‚stem-1.7.1/docs/_static/section/0000775000175000017500000000000013411004021017216 5ustar atagaratagar00000000000000stem-1.7.1/docs/_static/section/download/0000775000175000017500000000000013411004021021025 5ustar atagaratagar00000000000000stem-1.7.1/docs/_static/section/download/git_alt.png0000664000175000017500000001121513157571677023217 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÛ20IYçé IDATxÚí\U•Ç?çö}¯L÷Ìd&“LÏ$$!†!0A#!(‘ƒDAV@j]~ˆh‚ P'á纅+«µ²XÀ‚&,›u % !ù1IÈd’™éôô×ïìÑ`H&ÉÌëî7ý­êª©êéwî½ç{Î=ç¾sï…*“ÚaÚ¬ %šÚ W3‘X't|&(‰¶6臹ˆ;ž†5?t$…Ejã]Ih91'-àZâà<™F,bÄ|I´@ó+н©Œ>p&ð}èXP#À¨¥=q—AÇi5Œ^¼q;aú%€[‹ÂìIÄ Í P÷<ôöÕ<ÀèƒEìH}'rÈìF/NA½Nè8aߨThsnt}Í$€:“@ý(¨³ÞûöÓ!Šî-LrÁs á IÍÛÃàð( v¤aíÙ‹E#)ç(Œ³º†–vƒ9H0³"9ØàLŽ`Çlʈ‰ +ˆ)áå3þ¦3º¼Å÷U™²]˜Ö n0±SÀßhš€C}1Q`Ê^ÈèG½ë!» þÔWÑ Õ.dˆ,°â,´Dg9k³D㜈`Ù9'=Í;TÇÒuDä°´j~ð`b:P?˜øÎN Oöi6N!ö24Ñ S—Ã+k+Š­v锑“‰ïJb†K¢>‚#ï¥ìêÄôI`Žæ)Źˆ™$ÞQ¶Œx¸%ˆ=l:}¬y¸¬hsn4höxGbgEI•äƒ ™Ò§$¦¹hî8Ä,Î}/ñI Ë`íÏ'À8{¡ëÐúó¥¸iŸáwÂ¥t€IõHý"àD(| 1厧Þ~è„CÒès7^ h·×~Å•äy i<Ø„Oñq0ŸóyÔ_ˆ˜x7¶ ¸¦·ß k7ŒÒvéÑQ©»2!c渒iAǰ§#æ$ ®j2±¡^+L[ëžVŒ³ºQ™pS\N‰ÓÐ>‹˜Ú†$ÎFý33©*×Äž 6N_kV Òv邘¤®KJˬˆX §Õ|,bÎŽGLµ÷qþöiaz+¬¹mŸÐn¿¿$! $dLK8­ÓÏCÌ?ÓBÓ+±Ëà6´p=¬Íì1&:ËoKJÓ©QIFC:×7#îÅÀ@,„l¾ & ˆL€6çFcÑÿ¬—qŸ´â†ô%RǰK€³**­ 'ö\´ÆFδú@ƒ¤?f$¤%òþi¨w9bNct`5˜Uv(–ï௠µòé˜2Ê”ÿs4× ëÙ-,þõ¡V~º ìbÄœ: ï£ÞÁ_ë^Þm0Ñé¼9%-'†7ÍÃ@Óň9;äs>@/°üå°6³Û4°Ý^ûå„4}É‘Xˆë>8?ôÊWïÅíV¿öGëáw‚V»tRL–Ä¥¾.ÄÊŸ| 1‰[þÃÛsÿµ+v>ÅïQIÜ’”±“Ã;&“óUà 0Û=êý ¼e°î©÷ŽñÞõÛïÆ…!]áDòtà³!î`õn¯Ö­ßu¿cÊ‹b/ˆJÒ ïØ| p:áݽ~»Ë_sPÜ}–÷×k!š¿¸Î´LõŒ(æ¶×ê…1Ø{j0Ø»c¨?y‡ãí剨ÔV‰Ë¼ªŠÇ6y9¤cÐõWÚü¦ƒ<ÓJ Ö>¼'?²ù#ñwqi¨ˆ7_¾–(2/j®Û#ÿ†Oéuݨxì㣯 Ào+ðððG´°ìtĜ˞½„RÔ» Ëà•÷´ïÀ‘ø©–hY­ßÓ¼ŸÕ­,’]éiágJéù Þå™áyzûà8Ê»J¾õVÿ{X»(mÿzú'Àœ»ÏË ÞrÈ.‡?õîMƒ,@Ú^}`T’3Ëù«úd´ûÕœößê±íæÞ•Ùá—Ò8ø`•¿ø1Z¸Ö>? Ï{y0Ø»•}8FÆì .uɲä+šó3Úý@AûÏ^ï]¶qEÅö]8e`¸ÿkàFxþÞa ö öîß×GY+±…†Hàæ_Ьׯ›~òFñë_YISSˆ9¢,ÁŸú"æJô¹Ç‡i ¹ XkWGól«½ºÑ!zPÐžftÓ#¯|w"ÐQÛ_ ,&å—PïÈvŸÞ®ZA§8k :­Ë覧=ìß“ûÛ©@sÀÊÏ€ù'xî‘axÖÛÛƒ½57ùál¤"Gp@]?Û yÍ\Óå-örÃÓwÞéúï…çî†'=‹:aíOG¢™VˆL5DLÖŸÓþg‘Ľ‰”ÀëùÕÏ÷ï³µª÷à`°÷Ë‘jª5bÒ`l¤”(êÀƒ]Þ%~@"-0>ÐPÌ+hîñ}&øÉö4oXRÆ]y3&ȱ)Q,ùøhõRH ï~þëzöò·¨· º¯‡M›GÜ: tƒ£OÉSü® äE%íø4¦Šd‚ë¤z›ØÅŽÜ] -|s°rGƒhªÕ€½ËsĤ#Þ§[‚í£Ø”½˜âÖ< ü6ȦÐ`Z+8íAÉså€t„dK°í-áü MÑ(~ON ‚19:(yŽ´ÎÛì°Näk”Á±î |õ»4@‰à?¶Í¹1¨Ì!ù9°:U™LµÀ(¥W|¼@]O\ê8k¤ålßÂÞtx ) .ÈŒj"€>ïQ,)Ô!n£’º Õ^=b–ÙæÜh¢’¼2&©€KÛǀ̬*ðZQsÝÉ"¤¤åÀ¨$ï)¼MÊØ#¯q‰ ì×PªŠ²j³Á»¬Ï#÷¬jÀ™’êeÜÇ÷s®¿¸ã‰Î²[SÒòE+nðJìßKUð´ðß>^àakDi”¶\äÑ´]:g_Ÿ×j¯š8ɹae½Œ?Ë•„üpº 3™ÜTj­*”ð~‘×LoY MÛáIiY1Ñéü—VûÝ){®ø«'Øë®ª“æÇ¥}Qùö3N"jgӔбÕB °Á[òjÔ¹áɸ6~¬\uufLs\ëÏ ÷D×¹þ1Oóÿáã?j¤î­®âù;©c#gZG¦4 öƒ‰žä?&!"â”wÞ5s™95ŠcJnU ¨¹%w´K¼l;fŒD¨“¦æ„Ž9¡$…OÉe=ÍwOvnÚ¨hhIzƒoqÇ9KY¢V¤¶2$Aæ³S‰jÂ;ÊöØxÏ€&¿åJüÐr7JD°D%šDHªêäw_q£ij˜I:•c}õ¡ôNKßö®/tÛmEÍU…Ed‡Oå!fû÷qªì4…¨ªûAV·„åVŽá¢ßþe㛎àCŠU×»ÐU<ßËk溜ögkŠÇ,vó}šˆ9™ùERQ­nty‹ïÎê–_øê×t?ÿ`¾À‘3`¿Æê¯F+rçeôí55õî9Yí_àð*tý»$À†â’žœö;ëoÙRSó{(ŸCùxÛ%,8Ô§š‘~Ï|¥Ë[|oV·Üœ×m…šºßf¦¸—2c–CµŸ!¾Ë„õMï’ïd´ûö¢æjÁ;po¿ÍI '‡¢7»]±x£øõ³úõí{<-hMù–{g,œš iÉêõâE'÷éÆ{<ÍbOe¼½Š3Ž™„è¬ô!wåõâ…ŸëÕ ÿ^ÐlÕ…¼û¾ó©žVû=ÎXx4‘-¶G\~£øõÓûtãMÚ›©6 ì=¦‘²×ð¹G„Êò÷Šo¿qq¿ß}a¿¿éõ «ˆöÍì d>I÷JN9j6å(/©HlO¿ù£¬ö»U»ªÄ—G½;b. æLÆÔ]Éç?<•æDxãß½žÑÖ{—¾ÌŸ`¯»"&õçÔIsk%¾©óÈQ¢À7¿È\0Ÿç€‰áØŽ 'ÜÉÏ>Ïjoz—|g[çmÑ7žÓþJ›Jxèöiîæ"Ld9s¦˜gBëö‡Åìà Šßz øT›½ö®ô#Ný—ºh%x_K»Ù§Ùf˜“˜nãÈI&7-Ö¤¦ËûÖJ`e›½æÓŽ$þ!FjNŒd]9K¶"bì»&¼Ì1 ‹Û2‘ý}æLÌWå+ÝŠ!À_ˆ°ø>ྴ½zvVb纚8&&©¶r\(mp0|,JÈa óÀEz|é”Ϭ¶<õQÅ0ê0¢Ëë½KŸžlµW7hï"+Ñ“]Ïv%1ε‚±¯í±ˆZBæx™m­û0‘dšñM>ãë|&ÉŠy¾lø36x—nîîhµW7íùg¡%:×Ñèû¬D"¸ŽÁаçuNõ|JêSðŠZèóxÍ£°ZhùígûîòÉi<%,O `'dX5ø¡ÕYÚ$¾N"ìt#棶Ík°u1øó½uê«ú%Eó>Þ6oK‰Ò[¾–^ñ)½ ø/øä^Þè]ñ6À¢9…¦ºDiyMÕB€¿!DqIÐ<¹ClîÜh}ÝCl ¿ä@dp³E© x%ÁæŒÔg»Šçï2ÇëÛŠM'B%\õà=ÉíŠÍ ~ö©zêŒ!Ð::„«ZB³TñÆ;@oÕP˜ÕÞïÆ"zx…›ž–”Wj¨ŒkÎkˆi EJRBä5Tb=§ÎÕ@3€¼G¶¿Ÿ—k(3æR˜Ñœô]·Ÿ-ʯ¯{a}eƘ”~§9¡c‚”é+däw¯fz5”ÇV8¥9á/ Úúó~QåÁj«Ð`þû M ÿò1qM-»?/=›»½‡«i¼BwƒvSR:¡ÑüzXUè/˜ß­~-º¾æÊ„ãgçÔ–*-*dž͜‡?PäÎj³Ðx€Ï™¿¥µÎ?=Ô=æõ†fsweÀ‰Gä’Nú_LºZ–úχþ¼¬¸ÿWN¦F€qÌÌÂøÆ:ý·öúÒ11[¾é¬'+›·öËMÕ8†UK€O|(ÿ¥Æ˜¿¸½ÞŸVÎêó’›3æ_=ﮫ Ì;¸0­)¥×ŽKùÇ5Æ4^îölΚMÙ¢\U­†T5X0³0)áèâæ¤bK?®Žf)–ÐÍY¹ë—ϸ/Õ0˜ÕÞï¶OŒéýjC´4¿)¡cm…$®ª°1c^z{³,©æ8ª¢Po>`=àñ±c9Œ’~:×y ±ÒþIWÝJ;Œ©?/ù­9¹þ‰—ݾª&ÀìÉù±MceBàÁ“‡“HP_òoD÷w ¹V§'œÒÄ„£ q[©'pù úÍ+WGo­öÚNHÓÙš*}!hÁ5Æ`¬A"R%ÅÛ]}f­ºæœ0¬¡XQšR®ºR«œº·ÉÖM}æ²UÏ8Ýaè©©tèÈ䥸)kþyÕ3îÝaéSCDÁC×gÌ]?"º$Lýª`(«oe"Þû›èiaë›­©w÷ÿë½æ×ë^-|:Œý«`7Ê­Ç image/svg+xml stem-1.7.1/docs/_static/section/download/fedora.png0000664000175000017500000001053713157571677023042 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYsÈÈ)ÈätIMEÝ ÝRÌßIDATxÚíyp\Õ•Æïu·ZK«µ/–lÙ–ƒåcdÄÅc–! Â8!AÔ°UÆ,•™‰!Ì Ì’ŒSå°Ì’¦€P kNL;36ÞÀ[ãK²Œ$kߺµ3Ú%³€ßE¾±i-ÀÏ|‡ÝÎïŸø ÓJŒÍÝÞÐÃÏn‰Í)“SŒTÕÒ×ËMérV×lŤ!Ý;n]Â/—~G—g…TžÁQ:ú†e‰\W:9YN\éa¡o$ÀžÃý¼ú‡xæ½ÏQ…âêÁ-a_Áñ¡ õÊ't"_6 ÌH~Ž;‹}ï®HhÒ×Ö;Ì«kwSÿîf>Þ¼‹ú5ÿŒ$ãp]RÆ =MŽ˜Ñü=¨‡vDRDD°“È®Ó7¾Ù¬äüÇÒk"ÿÙúm,{ð·ø‡F£°¦è¢w  lväÂiH…S@7ˆ’«É•æï=Ñ%gN”}jÜ-€³º®ˆðÖ©<3’_^VÄžÕ‘‘&îójíösë}ÏñþG;ãü8Yئ΅4ñ¸‚6âCmˆ:wèf$šhªÇx}¿YÉ¸ëæ«ã"ÿõ÷sÖËâ'@"Ô¸ mdP¼gfd#eF»$/òíÇÏ8«ëÊ€F̳Cçøë¯©(›ùï=ÜÇ9ß»EÓ§6¶ªaK õAmý,ªÄ€ÊDö$jþÍÌäÏ™uŠ0ùÁÆM?{V?òBBÍ;A ‰õÎì‚oê£ÎÆ‘±ÿVLŒ+.=Wøž_¼´O?Ý«c”!´îÂSô4¤ÌœoºêÖ†[€»Ð ¶¾¸p–Ðõ;»ydåKIkÚÝ A1Ë"¹¿‘ÛÌÆ ÀY]ç0{ïwØmÌ­ë+_ZG ÄL,5„Öß.vO¦;–«npb˜øP`f”–" Lq!•5ïnLz»´A±U›diŠU@œWñ à‡˜åebÁÈ­û;èïL¾†Ä&ƒgR9€³º.¸Üì(+3PÍíýµLC Œ ˜l1Y÷ËÕuyFX€kHœþ²’|¡ëÛ:ûk\@b³NÂ%s’.€ZR¹n±zý¾aã§ Æpb'Ô&U‘™æù© I2qñ»˜Õ‚1[Œó#u”’fz¥ZÌ'N‡ˆóTñd.——4\dÑ— Ò2À. €`@tãéEÉÀb‹Á{¿[Ì9¥ NE9ŠY‘dÄ… §TìeHô EGE,À â0ò‹‘2Ä¢“š¯[ô5™„ë$ë.€… @–‘KN^.Æ!!®,ÅùLñ„¡>áKf$¿¤ )§Dø>ÑÀQ<\‰8 ª,*E} ¹ìt¤¼8v‡hýñ¾¹*È™È\9ìúî”—2ÜH“N‹%£ç¸P;›@;7!æ*«"C@öDÀ•‚ÙC'êñ’+¹b6rUMÜä36‚ÖÛšHK²“aŒ€$ƒÃN†p8‘ì*Ëò˜sê$ sbËB›?sªÐ+çVòÁkñú{Ÿ¢ŒE/÷ß;8®ƒí4´ö bC²§#É•kè6zïïh¥´éHÙ…Hî¢ð:ù¨xÑœI<~ËB* “‚8çôRÎ9=öÄš–žan{jÝÝ®[4/Ú@G¢‰™«˜=FÎê:=óìiÈù“Á]„”~ümïw×ÎdùuóL=th,{q;ÿy_âS† 5n…PÂy‰cŠ×SÀAd ù² ©h:¶Óþ©xú É?sz>ÿ}Í\ÌI‚®›Ç¬Š«Û‡‚„ïÔƒ|1:ŒüRR~9¶ÓÎE.©ŒV €{þq6[jO³ËÜ»dNBfDýb7(º%¥ø’1ˆ6;ò”ÙH®ØÓ´æWJ˜W™ßjõ o´À).g¶©s -ö=$YN;“òR+î4¥ ‡M&˜½ jÞOÄO7$ÕÆJمتÎ"`H ÒÒ3œRhîò ‘¯ù{ 5lMùæ@Ø!2äøŒÌÖƒÝ)%€Oc4áAµmjóŽdNøúÇWiÈSfC‰™Ë_ÝÅh ”äB<øÚ®oëC¨„l {ù´¤žÓ0~°ÙÃU1l‰M/öµ °ì…í‚–Œ‡ªi,{a;ûZŽ_Rõ£u6:°­«)Þð®(öÛ$Pž< œúxížyïsv7÷óÄ- 9}²ùbQûZøñÓ›ùøÀQaÛPmć6ØNæÙ”êÜÅ‘¢‰v« ÚP?Œ²qCó>ØÀ¤ÂlΚQN¾;úêÀ™æ`É%gqáœr¡W¾ùÑç¬Ù°;¦k{Gød+Gº}áq<¨„“7J¢>ü€$!—$–2 ùºÑzZ™0_ûm½Ðv 6wë3ž7ùø­_pfU츟ì=Ì ¿[ÍÀ0Ðb¸¤¼2pÆW/Bõ¡9îõ:á{…0°Yä,B} Û‹ã;Lë?‚ÚºOwÓ ©œ¤X'r±.rŠ…÷»h]‡Â±o zb­PßÕkò'Lþ@‡E¾þð®×l dR–` dlä›êßYˆD›KX’«d±Ç¨  ª]ú£^¸ÿ&nþ7;ŽúõHy²p,Âg3+Ñ¥ŸE~Ò°ZñzúŒ·vÁJ±ƒ]UÉÁ qMá~­Èò/DKNüûdG°ÆxØÓ„B¾ÚøFN<­x=à ‰:‚c¦ý‚šÉÃÎQ0¬Œ{ŸØGKZ¹³„áv‰åú†SUÏ*^O縀€`åk‡qG ”¸…®oïìKEòÀŠD˜Ô xÝ[ƒê÷•‹%iïIE¼¨x=‡ÇO¢ãº$#e%ÿx!·ÛEÍ ±bLmí)·<îKô! @´Œ™”üýeŸKš=öŸ¦iÐÙÑj¸OñzŽŒ»@nI £Ñ`³Ù¸ó±z–;»C©Dþ'ÀoôxPâ@Ô³gs NMÚ—ù÷;®cþ©báé·?ô¦ù*p»âõ„Ì!€áAñsp ¦è–9|4æÌžÁ½?ºPø¾·ßÝ”JxDñz¶èõ0暸mºìøÊÃá็ÿEhì8Üåg×îÏS…üz=&~: ÎrfiÈSçêRRÅ••ÎÓ¿º“ÙÓÄSÒßZŸ2æp½H§qð÷ÄwC~ྖ>λîAÖ­ßjVò÷ ’¹ÔÓKmñ *ê{"°ÿæÅ\ïmOú{gK#üà¿hhl1+ùõÀ¹Éròè-€„vsj]‡Üüå!H÷uñú¦æ¤ü¨­ý\³ìy®ºi9ƒƒ¦Ü‡ W%ý›¬I`=á“Ãã‡2„Ú¼)3©ôîþíV*в¨9EŸ aGÿËŸù ž—V4oˆm„ãùÛÌБrñ9@3:#eå‘^PÊÃK¿ËÏ Ý!~l˰äýíM¼½noÔÀÐðˆY‰ïî%¼‰Ã4êò«:«ën<ÉhH~q ×^µˆY§•3mR.ÓKs˜RèÂnû[•@ˆ#½Ã´õøØ¨“?­û„÷?ØÂè¨y7œÞµûp¿âõ˜.óTر«®0d|²Û™2¥”¬ŒtÚÚ»ÌîÀ9Æ8«€Š×ÓfÖFÆ#€ÒÈÒ%µê¹‡žñ+ÍØã@D—/["øŠ™_Mx‹öšx7j¦Œ""(ž®:II÷FVG¯ÄSœ!¥p”®ò&8á#À‘ºµÀ#¢u¦@DnàÛÀ•@5P¤øc„Ë«ý×O¸äú~à@äß/ôNÈ´`Á‚ ,X°`Á‚ ,X°`Á‚cðÿ —Õ5@û’IEND®B`‚stem-1.7.1/docs/_static/section/download/ubuntu.png0000664000175000017500000001131613157571677023120 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYsƒƒMäi¨tIMEÝ6vbaONIDATxÚíy”Tõ•Ç?¿¦¨‘ÅjↈͰNʘ¸&.ð 0®Ä=–†ã(ÑLfˆN2ÇàŒcNŒ¤dãŒff\(1Ì$QÄV%q!¨ˆH=ÒP@7¼ùã^NÚ¢º_-ïõ{Uý¾çÔᜢëm÷ûîïþîï{ï"DˆÐ}a¢G<iˆ_¾Œ†½V ¼ ,ž>Jq"T‡áë‹€ocÕè¡XÌ&È| ²pp¹‹ás±ø pG‚̪ˆ•iü〟_-ã0oßJY ²ŒðˆŽ÷åâMà 2ï”z€šÈ$]j|Ü \èÑ!G³iè 20¸ÁcÏ;˜ 2p…Nñ¼D ¸NgBìþÎóéð àĈáÆàXŸŽ=HóBŒa@Ÿ V4j#»€“ŒÕõÀ¡Àý·¿¬'PìöègÐ l¶ö˜TÖqyKýœvŠP˜±÷X7?¯ÿ€~Hf®'ÐCvÀpŽ¡ Ø ì¶›€dì-à-`…Ie›sNíwÎ¥&"@ÇFï œ œŒQ—Ü¿Èg”=€^ê)'·û›,p#ðXÎo·ù|›Û"|Öè5ÀÀÙ:Wþ¢NÁzø|êptžï?TQïÓy×FÃ÷F!‹,–ºú®¾ÏN2frb‚5ÀàηX@pð# æ‚€@S»ï6¿õ‰¯Œ¦‚•@KÀ×p|N\€Š8Ë!…h%Èü9"`RÙUÀ\؃Â!ä_ðyø…Ççú5ðß]:u¨<¢n1HLr’±a9^  ˜üÞ£s|ÌJiî6pÒñáN:>ÈÅ lФMP\“ûe‚ÌàïJ ÚÚácàÖ™W»¼Sà[¹q´;ؾàà';²"=€“Ž'€ÿ$¿Š¦X¼\b,»Ée(˜® ¢‰¥}€­ —5À{H®½I ߪϪ7";\üd}ÿH“ƒÄÏ€[‹ k6þaÀÝDïw…&]:Ããê1†#"_#«‡-.êÞ܈|áËH“‡±J’®Æ5:Õ_1ÀIÇ¿§ðr(zøº±ì÷\Œ7\ßüL*ë‰[w’±>Hýߤú÷È.~Æ&›TöÐÀIÇOþ ïkåþ ¸ÝXöþ@î-먂®ÓøfHžþ`šIe Z ¯ Èø}€ïøø`®¾¹M*»Ï¤²ïê<ýBàQD.Þ¸ 8?ì³€ ÀxßÌP¢ ö«Dm*p“ºh¿Ñ˜á$cCI ünFôó~bœFêä²Y“Ê.@Ö-–â¿^ñ+ÀÅaõ»À=¯nÕ€040©ìjÖSÈê _¨nt’±ÃCE' ‘ŸÓÏwëe?e,;lIL*»ø{à'š_ð c( QW{€ó)|•¯¼L5–ý!†Iewÿ¨$ð‹¤=€kœd¬(à¤ã½u~ì×:ø'À-Ʋ_¢`RÙÀ÷ñ¾N 7:#,`¤'~`0ËXösT´„ü»H6ÒÄ€ËT8&Qbƒ“ ¨@˜Tv“ùtŠ3‘¤TpÐBŽs}:ü«À:[®,G–©ý ‡ÒIGÒ®òcN^£¸ÇXö*‹‘«8ÏIÆzI€¾ÈZº×xi¡^ñЙÁ½x_= ²B9,H<\‹·‰™&à§Æ²wS=X¦ÏÊk|ŽÚÈ•”Ñ.‡"]´ŒFáÛM*»+/»%!³ØIÇ7#Â…±ÜÔs:þW L*Ûæ$c) ˜½,g«Aô ‹:gFï…´^4[:Z]»AT3ׂÇWuž›/ ƒèôO.ã†vË^J•AëÅ{õòrÀ2©ì¶¢ Òä±Hn}î­WZt^{?ðb>±…“Ž×i[¼Ä›y }ì  á$c— UD^&Í>&èêda1€²ñF¤ˆáJ ë»ÓÉA?Ü¡*™\<ȶJl,©Vã+^FÒÚ^byú ×tbü:à6àßu.Y,³8ÉXßœ˜ÀFŠ!ŠE3þe΂Íz‰^HEQÁ³€k¢¼þ¶uˆÜû6•Iµ'Á%A±Éµt°"È`Ð~W†‡ì…y'íñÛ“àVòg—P|{³7eo£ú±iCë%†¹@Çý›ñNª}`ü™á$cýòxç‹<ÖèøXgV^bp!y€q”±I'8]?éœï_PQˆDl¯ÁQX±CŸUÞh yšfå#ÀDü)žŒ!­[s °F§(…l¦Ð‚OV=L*Ûê$c³a‡WBSÎôñ¾Æ:ÉXÿœV꟪»+„;‘*Zº ðW6–7îãù†p°&`7°¥Àßï¢ëôõÝùàg][¤Í[û@p…÷ömÅ_5mD€ücw"ûëüeÚ™Ž÷ ðÒê:¢}Ž|'Àû>žo3 z#¥\… ÿ+Šºò½M/âŸvežÍ”QøZC‚©½Ú8ÒÓa:AfžAªw<¾Ÿ,ùå[''CÕúêß¾ÑMŒ? Ñ^x•ÚKÎ>ù𒣿Öã{Z†¬ãçâ¬"ÜzOŸ§©aB?$q6ÊÃcnqL*»Y«÷RiÛ ÜgRÙí9`.òà Ý„C)mÞ-sŸšTv%Ò¶m—'mC6oÈ'y¾ ƒŽÔ"ÓjÇ_á}›ûŠÉÌþµL´!"Ð{s¥aúöOÕ©]18žN*]ªdü7H×yš5@‡‚9HSÅR`¶!  þ!·Eº“Žd“„SK8CT¼^by–Ò;e˜6z¸éåWH’h§‘—?ì ?þ¹Èî¥2|¼“Ž÷«bœæƒ—ÛFžº ׬šÊ“dì:D|@~ËÂW åùvÇзRSÎ4sœæ*þ· ÝO¤_²×eôë¶²Í ‹†“ŒÅÔHáîR†íê¬É¢“ŽÖ˜à¯=¸¡Hoà¶*#Àiš‹ñº’ú¡™›Šöx…,E,Ë:éx Òdå„´Ç%Òò*2~-p½ÆßHÍ)*ð)¿(qà&í4^Mcÿ$Ž»E‡çÀà׶郿ý»òí?iu˜‡_©1@`XIa-Ú‹E_໺µ\¥ãJŠÏŠŠ¥í:Ö%Ðöí~Eì `¦“Ž÷¬à·?ô òã6"ÝÐ Ò€4sØêÓ±oDúW¢ñ#i÷£}:Å‹tRIÕ•xïvÍÎE=p—“ŽŸ_aÆïüNzø”‰ÝÀºky°ÐNÿ¬Iû!ÀN:þå 1~=p§Ïžkù—àñ +‚~võ<ì¤ã_ ¹ñîB¶‘ïáÓiö d¶…†Æ²·"užÅ-Àý 2M¡%€±ìN:>Iâ öá‹è`ñ£ "¬½ïµ}áIDA˜=È*ÞO‘>B^Ek’û]Œ4L#å 2û=2|=ÒýrdQçhºvg¶µÀ½¹ÚÿN_Æ ]¤“ŽÇ‘M½J„ìn3–ý€‹¡êy‡¿þX…¤Mw%È8¼ÑEH¸ÎEÄ*AˆV³Àô™yÅü(Ð:;cÙ¶“Žß©ó÷#=8äï‘þzn˜œ£÷? )„É ÝGÞm¤!wëØ6}YzñÙ­cOÐOû¦™Aá1%uq6C”ì¤ãS‘Æ’½Ë ~®6–ýT®ÿYÜ»—ïGÊÑ[ùK‡Ž:w[êËÀ7dŠžõ„%Q²Ÿ–3?KÃ) ΦRXëú}ãû"= Ñ(>lÆ_ÜQŠñCãÔ Bú^TÂÏ7“e¿æB€S§ð§RY·(®7êg+"ã®ú#ëG …"íSÇÍÀ´™ÇK=qhØl,»ÉIÇ¿ƒH½N/òçóé@òÔÎø1¤Y˜Œß¬î{ ’]¯DhMÙ¯"uê…Ž@TÙç#uýM§ž(ë¹¶W!?©J*T9ü¤qôz\¢CM}ns‡z¢Ÿ+d ΊjÕð)HS­%Åü¶" $ƒl5ÒåO[鯲çº<´$5ôR±ƒT_ßÈ´öý¬CÙ#ÈXö눗&È,ƒñCër†ƒÉ_ ¸˜b,Û-ò?Q§}AöhÕû˜ ³£“û­Ó$Ò@·"7[ýÚ'ÔЇr²~~qNüs`š±ìÖNŒß¸é}¤Û˜™ Ó’çþŒ&’.¾œ„†ôT¯ÑŒômz é²ú–—{"‡žúú·«!ûj´<ÑXöj—·ÿ,à—ø·ae!X \ “é`ê{=R)=¼€!y3R¤û€±ìu݆ú°z"Kª³€…Ʋïv1~_dUpR€—½ ¸8A敆·9Ày/ {¸ÝXvÙRûŠii,{/’ï¶UD7LÆ¿B‹B‘êÀø#uJ:žÒ4£ÙÛ¤nãŠA# CÔð¸/c-0>AæýãU"ŸáÁ9ÖWË~¥ê=@‘ø&ÞìMXžÉcüZ¤þï Îq,ðýrz&ÕTáÛ? ]éÝZÙ[.ÀUŸë!EP|‘້¾GÎ^H:Ý»ï«k«Jm™SxTÅŸ mÑöp äà:ÈÁÀÙ>o4%öO¬ºÎÛº8²¬‘†åH£¯"YŽCºoõè‚ËX“Gg8B¯ÇôÆPÂ^ƒUÛz] ð!j¤a"áú²ÔxÁ=H¢*ÇàïJäðÈtL†=ˆZxM# ‘|û0$íz2¢ë;Ñ"ôCòðuê-Ú“Ž~ÚÔлÔÕ¢d{K?ùêø˜pÒq£»²Fpñ MúyMguH+úþj¨þúéƒääë¹Úýì@i¶+v»]ÔÄŽÏ·ækünI€HÑŠ,º4“§—žGhRøå>fáÆ¾9V)øSD€pc-yºu{„­H#®ˆa…±ì ²4ì·#„ãý†Ð»ƲwE?ÞæR^L.ž%ÿºCD€¢ \ìÑ!W³eïŒP9$hBF”«æyø[cÙo—sˆÁà ‰T4«ö݇tþ¼ÊXöïʾ–ÈÁÁIÇëéÚ4d1§³íóZu®?˜o,ûSOÈ™!DˆóÙUË!J†V¤oÁj¤~ð9`}))ß"D8ÿúÏ(¨  ‡IEND®B`‚stem-1.7.1/docs/_static/section/download/git.png0000664000175000017500000000434113157571677022361 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ?j)aIDATxÚí[lWÇÿß™unJ½ë„Hª¦%%äìnL¨ÀöÚ2—@BòÐRx"”r‘H%¥¤HyBAMÕE´”‡)m%D°×±he¯³5µ¥·öŽHíìÌÇÃ:5ÝõîÌÎåœùþ’Ÿ<çì™ùýæ\Æ;Ç€D"‘H$‰D"‘HJÚ ¿Ö›ß`Y¼_d`#€K œ'¯ÓÓÎO©\^ ÍL!ÿUß`eC^Rʽ«søÜiÀ 0@ö@îA0>ßÄáó º³«8qB0~!{ {Z(¶ÀLwvNüJHüDI@?ÙÀO¶$ð“- üdK@?ÙÀO¶$ð“-Òýf ¹{C†ˈøç3ýù="@Äéœq~ÂS|´˜1èî^f¯±N€±+‚×z80g Èsîî^fwYOØ)6`€*ƒ¹›Ú\./¤gœÝž–9A\]ê1ž›Ì÷ˆ ®Yç^g¢]Ãgd80\€ºyDó¨ÁÏ?ðçê´\$0u°$üÚAk‰ù™™¾mÛdN`PÐü7÷Žúp×é³g¥'Ð\€–á‹æà¾' RAî ÌÖy‚3ÇP7ó{AØ `s’$ #à·(Aƒv(»?¿ÄßðŽ$H@ÆÀo“0Õß³¾Îo@è1]2 ~%˜è¹ÞqgA¸Éd ”qð¯,-÷äRKÄF¹näÌ8Ð/šÄb‰HÆÁSOà.ïØ´æä¸íµŠ™B~”À}¦N •±ðkÌøDüXÀŒ´'PæÂ˜yÌwŽ ¡©‘I L…_øU߈/¿Rs#‘@™ ñôÈ V*ć.2>ðF¿5¸„w…ÜèP%PæÂØïJGÑm´;4 ”Áðà†ÙüGüT0oU!`ÄT ”Á𯬾ËûöY^˯;U¾8Ÿrv™*2þb¶ÛÿüËý~*0Y2þÿ·î{éâä\¯5\ê^½¼j=Í@!‚ä‰!%þÕF“¢¯¥G&ž Ú8h¿¦û 3otÈ\_n]ÃÁNŠQ •Ü'c#€6ð›Œcá {pÛ»ã,·K%ð¯9© 캿OŠJà¿e#øÉ–@ üdK ~ Ì-þÄV%ð€ùcœR]™b©3S,uZd­a/ƒŸ„QAH@ „ÿr¦XªûgâJ!÷€ëüúURêéá³ç½~øt!_PàŸØÐù-€pWf¤ô˶ô ¿ó=õ²¦8Q´Èê0‡ž`IìBö뿽\7rf àÝ ¼¤³ƒ[û| PéÛº  ƒÂ¼ýdŠ“#—¿äÄÐuÕã¼ó–åž ¥¾  Cxוਟ :+îÃ.ØÆöÅUŸö,€ Þ!œÜ DÃ¾Ê—Ë DÁn\ÁŒ;¼÷ ›sÃ+4î·<h [ýL«¹~fÛo j*àf®ð#À_sƒ‹ÇÎJÿ}´›týÝO æF“dk‹BjS°tçY€Ôe÷€ êzwßî»â ÷+zÃ%>æY€Õ<÷/Ý+¨ëp{¥õüæP¥ë[‚»ûù[k‡Ïù.N< ¡]çúñòöï¼e9È:`ßÿHzdòðÒ'ÐD2#¥C"AÝ^`×l!{ µ" Ù¹Uœ þ;7ï'€Û"ÀU ßâo9Ó>8SÈÿ€‡†–|“øÂP÷j»ûŸ þñãNs]X ÉŒ– ê\vðíêtÙÈßýíÛW]3Þ²]v!÷…ŽªzÀž8À¯µÛÓä%w‡4eåçûMϾô'‚û @)7x€÷h>¼6(3Zz ÒŸƒÆµ¥ÂÚƒËü–‡b9øx†ïK‘@ø¾ ô†ßD}á·M‘@Oøm@ .‚ñÐÇü9)ð=?Ðò9ñsÕªúÄÛÆ&nÉU²_!¦Ã,“á&@Ü$`ÐéLÊþzñfËØýÙO1Ñ£ˆÅ?Õ~Û‡€˜R¤v·Ò£“?càˆÉð .0p¨ö"†‡²+:¾ `ÚTø  .]ºÔqÌká5'Çm3~(D,ÁÖÿÇ×"zÊTø¡ • <ï»vÏ› ?T¢€Ú°99nÅTø¡ ë|#QÖõ¦ÂD€%Èùˆ·› ?2B”à¶©þžõ>çw˜ ?RB’@¥”{Ÿ×³½Ù-í1~ä„!1ß3Û—ímùÎJ¹Ž"°ïñE?„ A‡«èÄlîÖ¦áïÛgÙÕé2þâJ)> øH6Àû3ÅɆ»…¿Ö›ß²øG>j:üØ ‚aŒ™¹)zfí©Ò+µîþ¦•jæý`g}ÀÊ$À¥¡Hð¿Ì<P§ÉK=íY$~¬0G‚øÂ½úKoøZ ¯ñ‡¯úI |­ÐG}àk'@ü%Ð ¾–ÄWýàk+@ü$оÖÄG}ák/@ôè ߢ“@øÆ¾fÀ7J€ð$0¾q/Yð 8 ̃o¬í—ÀLøF Ð> Ì…o¼þ%0~"ð.ùð˜¼tZø‰é®ÄÈßÍÌG¬®sÈeßIK‡šùg "€†¹ø¾­o¿Üa}‰À°y±|‘ß*Ç9’+¿‰D"‘H$‰D"‘HÌÌ@)R ‚uÆIEND®B`‚stem-1.7.1/docs/_static/section/download/debian.png0000664000175000017500000001301613157571677023017 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆtEXtSoftwarewww.inkscape.org›î< IDATxœí{tÜUµÇ?û÷˜¤[úŠ”Î„D–÷C®Þr¹‚¼Ú<ʈ(Þ‹òP Š \,•òZÞÞ‹OKA4äÑVBj‘‹v­^yhÞ6™”B¥…-m2ó{ìûG’’¤3I&9ó›I“ÏZ]k:ç÷;{g~ß9çÌ>çì#ªÊ8c«ØŒS\Æ0ÆÀg\cœqŒqœb;P,RrQyBïíØ(É ™²p¦¦ý΀°c2éŽý9¹½>,¶Ÿ…f@»Ô€Ã媺N,l”Ã怾"åÁí@ÀL­ïhŸ0ÏW'6;ð3«÷×ÇvÙõÈ=1Ð[p¼^%Jpû¿‚ð<Ê$…ˆò¢Hø+ñý—쮵§ˆ“YKàN U¿g MŽÇÒµé­èÿ¢Â±Ç`…œêÄí)5"rèÉyÜšRÓ¦÷+ßLê~‘Fõ즄ÖÿcÄŽ™Q/€ rΔÐq/AäJ”ƒ"4í©Po£‹gešWGh×(£V­’œ,Ž­ _Ý«Èî<-*‹ãÁ‘KGÛÀqÔ `œUæ:®Tô[ÀÔbûÓ•6ýµ%ÄU9ØX#Ê]q¿éb»—Q%€6§îB±ôƈ›ztvpDeúØÖRk!F…Z%9Ùvý»T9¯Ø¾Œ€wQ¾¢ÂëâO~º'QlJW’´W3Åšên>FBë7ˆVÛ%C,¨T /Nd–ü¥ØÎ”¤ÖH26Á ~m©nUáßÙý·üž@Üæûß­Ò–t±œ(9l’yÓŽÝrFLÀZm ÇÏŠ°H‡¡¤!L‹HZAAâ‚V•t ÀßCÛª9¸³áÿ Tÿ€””ÖÉY“§üaàc†«~ág‚¬²=;Æ23üКº—¿ã¯C û®—Úý‡J=DÕ:GÐ3‰†üÛ$§ÅÓM/ªoÈ”Œ^“ÚižÃcÀq«}^áš ¯i¹Á:®–ªÓv΋¨œm ±Y-ë醌88DJB¯Êü޽˜m¤Be=·'<ç'h}`¤ÎØ(É ¾ë]ŠÊ"FÖ*l‘OÄ3ÿkÊ·Á(ºR’œã¯>4ªU½C`¹¤-ÆÀj}ùü*+°ï8eÕ¼ƒÈ™‰LãŸ96E]²VæMÇñŸ`Ä_v(üÙk«b9ÅUWv.]WáõqA®†û;Tß«1Ùæ¤h-@JjöÁáIc†YÅV…Ÿ;¶ÞsPzI+ÅnÊú‘*[p(¡Þzâpî•u;û˜ÙZÿža×úP´@\¹s¸_ a‚¿cV…×ôíƒ:›×—ÚÃH¤^Nøö)(÷ç~­šhû·›ö«?E@klÁñª,ÞÝú_qÿ¨OŠU;Z$ç`Ù°î.jsj þŽ^""Þ Hþ7ëc¢Ö¥6¡2 Z8¾s¾ÀŸ†s»w®—ê‚M~E.€”Só”ÀiyÞö¶(w ÖòÎÀ_YÇ ÈL­ïP_Ï^ÆíûØŽu?rCAžU¤ƒÀ¶XÍGD%Ÿ Ð[|?½¸J[¶̱ˆxUæ0°ígyß,zU"Óüߦ}ŠTíníCÊû~Ñ ‚]Ï4üµÀnEJky퇭€?ûæu£ÐžðœJÓ-óÍŠHÖ¾}Ä+Ô ±–§ONØÓ>ÀÁMkA“@~ß<%ž²½sMûc\)·ú’”[smÿ÷ÕÓ¯ö (w¼åï{Z¥6m6í[©ðšW Ü™÷" Mûb\r¸Âs½ßÛ(É©*\4È­ª¢ ~ÓÓ;<Ó~•~Ðy-ðZž·ýˆ²sLúa\eÿ²Âk~¼÷{žÜ:èl™pUE¦ùǦý)Uª´eÊC»ZþBwhYÃàS&ý(è °µ¬ú+°®@¸lK¯OxMß+˜#%LÊ­] ›µPY¯Npvö69Nù·€ÿ•sÞ ¦?nª•,hÀ­ECxø‹ÇêÃP•›r “*:—¾R¥-Û|¿s°%@ÅdY0túÏð"åž„ßüõBù0¨Žl^ÉQ¼o«$gAw—!Ü$‚љ΂ @ýðKƒÔÿT"p.-ʼnœHÑëCÉ9éc9þoRnÝ"€ÐsîÕþ{GDAÆ%9ÁwüäÞ¹³E|9*®›Œ›dÞÄ´íÌSápAæ€ÎâÀ›‚nR¬M¢a ‘ã^Ó³¦íw/ŠyÜ_Oýà  ]úF»³à¬¸ßÐbʶ¹ü’´{¢Të]€J®‡¯ÀçJááw-ôÔ+Õq®¦vE°ú|!Tä@P´+¾µ0åÖþ‘»CϾ÷`­ׄ ­ÿG›[ûì+‰\ËvZÔ¦µ÷g=RŒ`µ\æNùUqx @U®Ìu­BKÆž1aw¸¬S gÊ"Ûa¡"åýŠÓ O+DÄïS¢:8ÕÅ–ã_“rk¿ðš~oÂ' iV4÷R2Ñ£–DºáåuR7³ 6š°kDÓìÍ :3áÃܺS€£s]kÁåå:ØnÂv¾¬•yÓΔ‡æöz{B‹†Úܸ-ƒ¬ÂùÆ:©›i»z¦¨\žrjçOv\=Òõ "á Õœ3äa·°ñý 0"…à]º ”ðrrÿ!¨Êý‰Žem&ìæËú²ÚÃc¶ó;x6N„ûÅË|y–>üöPë©ÒÆÀ]À]mnÍéîÄ_¬‘äÅ#Y¾eyn[èøYËTx^ã› 3\;»Ù5Q‰xË¡+ñjÍàÒ td‘ ›ùò†œ±—Hs¯©Ø7Pªã™¦ óyøý©ðš÷½ô¥mïÜ”\Ô¿;23µ~+]ÙHvC”³,Ûº®gM@+;¶¯‘dl¸¶zcD= ÚÛN(ä+ƒÅÚÕaïõC­êr„z×gNÂoZj¢î*mÙ–ð›ÜÉŽ‘®TÊÕ2NQC{VBÍÕ§üÍl1²*Êh@,­ 8T±n4io¨´9uóz"’ $¼æó ‘ìi¶Ö¨iå¶\e*὿õsõ©ìýEžÀ 9ÕAh¾zi"Ýð²){C%«û¨ˆ>€J›íg.,ÕàSˆ å›0i(ÓéybL³œis e‹¨u·)[C¥U’³P}„®íZbIÝHúûBc¡9›u]5Së;ÌÛ4„h0ÐjŸ×âõ˜)[CŶ½«é¥ˆ^Yê+Œ´këzö2•ü– sÉÄP¸/ŠMš½yMj§©Èºÿ»6žiþE”ö‡ƒæØ ‡­Sgv57ÍÙ¿«þÖ˜!â¹r!ïïÔÖ±prI”x…=õ¥‘üÔÌnÓ¢¬ÍUf2í¦ì Ñð3Ý/Û~µýá 88 -ý‹éäRÆ X¹š¯Ž¨×ô§bÕ'*r<€ÂïÒ¥¯Gi`$óî³CdïÊ5ä7Ã÷(;…ߤ}>]µn}ÿµåÛïÚþy7×–L ´£3p |X^¢ÅH¨|TÏ Ë²‹yDä»ìó¹ÅR”£(ži )Qœ©VËeî4‡]ߤÀ³Š’ÞÝó;~\å?š×S•C¬Ã€gPÖ˜ñ¬/c 0â.`:oNïývÂÖ(í÷0¬,%¢ÙÇ Âë¢òôH}ʆ1*šmÇwÄ]@ ¦[ᮞ-3›‡J?]I°gÂËýwŒ lô½ðZ%VÔ²ÇVö bX*½ãå;Rnõ¿Ei¸TiKZ³„‚Ù`óª´~Ë&™g*/á.Œ ÌÑhhE*õ¬Þ±þ) §Fi`¸{ù¥gººÏ›ºÁbg ×x8Øä¯€ì-€FÛÐÑw²G‰Ge{µ\æ´ñBÞ=ºfS³ˆUyÎbbÁ2‹›‹’}[¸zn¤¨âÑíôžT‰PSÊÞJtmÞôó~` {ÊÙt0Ñ›´ï;÷ÌdN $0žÇ` ½ pØíâÏ®¹þ¿õüW„™…˜DéO›[ý±½ÒÛ_× 8´B—¾‘wÙvO«Ù³É²PTiK:î76çsÏIî­ã\„ð–]/%i¿Å~‰g˜kÂì-€SF.€ë²7Qé= dÙŽwqÔ~ ÆÇ;™ÝNC‘ÿ¼vÿÝ]{×ñžS¨¬)ÆŽ…îÈÅCŒ¬_χ5’ŒMŒÉbB½„Š|q$T¥õ[ò©«=¶àÕà û“P\ÁZhbƒ¦…Þï3{#íûŸ,sí‹{¯úÝHG°{€À æA¢Y» B3gäÁl­Ï`ªú³^oïk;~Þ+ƒâ™†¿:¾»@áÛÀ‘ðB?«9ZáêÞï©Èu‡èÒí‰LÓ®Árƒej x6Œµ6ÖŽ0[æ3á$ É”¡¢¡=IÿÛ8Öq=»În‹Õ\™o.¢îո˻ÿ˜ nÍi M¼&1¶-OîvqÓâk‚-p¾éul9‘¤Ý«» "Ýð1gFàç ¼¹ë•ÛLgÚʇ”Sóéi¡ßÃ"9 ¢?æº+È:T˜‰ûì Ä&:ËTuáz©Ý`gÆj­Ô%¯†pÐóM*ƒðá¶òù‡DáSoÚÜÚkyúŒ‹TÐï‡"_žÕÑеOæ~¤Ër&KÐÜ+]Œr€.Û)j}ݱ¹1%•—‘Ù ÂkZ®èõ».ØÏ´»Õù3?,VÈ©N›Ìß?åÖ<"p+}çLD?÷š¿ó¶7ý¹\uc¨Òú-¯f5"D– $î7´(ø–ûÎÛµl-«> Â_r#ÊÏ{]:M±þÐîÔ 5}mÞ´»µ'Åí)5âØ/‚ôôuªJm"Ó|@±’cš^˜5óGJ¤«‚ý óª@¥&‘iü³Úçn([0g}ټʄßô%„¯Ñ«;Pцv§æöµ2ÏXò¥Õr™›rj¡ðõìžú]à“~ãð’0ˆQhWc7Dˆ4S¥-éÀï¼uCYõì¸äÍA^`ne›S“Ldš«†Õ®ȥ¥" c޳.åÖ~c¤ÖÖXÝ Óœ-«>ì¶(TàO8ztÂkúãHì˜Âh–°öXݱªšu2ÄBþi–×mn AU‘v§ö›*ì ™¦ÛÛbµGYÊà 3ûÞëªr—ŠMPá7=äÎq§2ÃqÝÁæÕÇ)‘ °ƒ+ ç©—1 }h½TçYcœ‘™ºf×äæœ(q˶¢Ïç3ƉL¾ßq“¨äœf•b$tãôøøl ´`U8¶ÔWÑìIDÚ$¼†ÇDx(G±%Ê]=Ù¶Æ)<‘ Àò‚«€Í9ŠO˜îl)Êébc‘È»€ÚÝÚ“žʲ+Xg&¼†ÈÏkMíNÝ*ú@Žâ7ÔŽª ìͨÏK¥ è!î7þä†Åû[Žu›ãßš£|µè!«}åüÅÛwúÎôB–0N‘[€]x“/"w†ŒLpýQ‘ñ{4R-Àz©ÝÏvY•-·¯À{–­GÔÙ¼¾¾íÉ”F TjÓæ@8x§™ÂÞA`=EÎß±FÉ´=l(«žªÕ’=Ë·>&ÂæP­»+¼Æ•Ñ{·çQrHIrŽÿ0¹÷Úo ìàı²}«”¤Þ3öÚéìõ[³s\ò ¾37¡õÅ8–n¡d€$í”üÑ\k·ƒÞ„¿ÏbÓGªŽJf˜­~ãå ×Òÿ8­.>²çÝoFíÚžBi  › ¯é6U=Ÿ>)àw±M}¹'jŸöJ» èÇúòùUv`ÿè¿¡4­ÊÝaÞ2ÚwëFͨ@)§æÓˆü'0£_Qåž Q¦eï¤g´+ãhaT %5û`[‹½ŒÝ»²´(¿R‹Ø[Þ¾‹ 7£V=¤bÕ'¢Öô:1¼7Š4¶û[Ï/dÎýÑ̨t%dN¸SŠòµÝ?v±2ô Öú ‘;WâìØ…Ü`¥œçOø‚Â<ú¦e•/&üÆß˽RdÏ@/^“Úiž«ŸEåóÀ‘=ï‹p?þ¬ÍwÕx·°  7­±ÇK\$"s>¬à¼§ð´Â“–È“qÏ~~,.=èÍIÆ&¸þa„z„ˆupè$@Qy +|QUÿfûþßféÃoVßhgÌ `œ¾ŒŠPð8…c\cœqŒqÆ0ÆÀçÿÆݧuG€¹IEND®B`‚stem-1.7.1/docs/_static/section/download/slackware.png0000664000175000017500000002527213157571677023560 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ) ?>9 IDATxÚí½i”×uçù{/–Œ\kßö ÂEsÅ$µw›Gê–ÙÃ!%ÊVFgܧeŸ‘G­žvËzÔjÙd‹Ã–ìnS”e»%’E¶A"DqH( °Pû–•{FÆöæCVU@¨2‹ Y·NdeEEFD¾ß?nÜwßB)ż}|MÎÁ¼æm^ó6/€y›À¼Í `Þæ0o'Ó?_rýŽGÛPþª@ÉZqq”Š %bJ¨BdQdQd¥RíhÇ®Çû?êe#>J‰ w=Zcu›j«Ú&¡Ô¥ÔbP!©¶D ¤Ô”ºÐ¤&š <_yAø*Pž”/ßµ@”„”§T@)±ÏUbÏñOÏ à*°Í÷<uëf%¹SGÜï‹`!¬‚eÆMC›!=‚¡‡IÄâ„Ã! ]CêM 4MCJ€ëû¾Âó|<ϧh—È ¸N×Ïc{E§äd'(F4ôNOøÏ —LiÿúÝ~’ŸÀÙöíßÕÌî{…Ð¿Š vhÒp"V­aµF<,¤xP“š·ZµáfÑÔÜ@}CŒÆ†5‰0™¬Mj,G.o“ËÙò%ÇÊW»ÿ]þCL.Šò„%P(tC X–Ä iDÂ&¡N±à’ËÙä‹.™TžtiPeòýE?p=¨Ÿhðäû¿zâyTÀÖîxx»D Ô¶¸Õ¤áf³¹¡™E‹h[PçyŒgÉ’Læp½!ÊÐÅyˆ/ÿÌËyë•R(R(ÂQhÔ$5HgJd2™\šTaÐÉúÈ7œoÞõäîy\VäþÈýBé)©Ö×Fè-5‹e{{3í‹êÑMƒþ$=½IÒéb¸SWþ™ýMþ¼RÊ'Äb±Xß÷I§Kd36£¹Þ ™ëö„¢Cá}»cמ›À̪l[§rM]t¡Ù\·H¬Z±€öÅ géîax(3DLb=wðS×+¾ò‰X’XL#l¤³%Ré"©ì€JfO;~'Ї:v=¾o^ÓØµÛªµ-ó{"à¡úØ"ÙÖ°T[¹¢Eíõô¤8vt€\Îwí\1|1éóWbã‰õAà!µ€xB'ÑÉdr—d¶ÏIŸ „ä)Óv¾µ÷S©yœu÷¿òa=a5×­´Ö­^ÊŠÍôõŽqôX?Å¢{îi_•ð'ŸCø€G<. ‡u29—LºÈ`òˆ]pS6øßèØõ£¿þX `Ó§þ°Î÷‚¿•BÞÚ”X^²p)7¶cÛ.v“ÍÚÓòUòþTàƒtˆ%tt ©´G:—bpìP1üW4]~éÀ³?ûØ `ÍŽG®×”ö‹H(QÓÞ°ÎÚ´y9õõ1::zèë»Py|¸àO>¾ï;èºG<®ã”<Ò9ŸÑÃvÁN¦=á¦s×ÞøØ`ýŽG¿ ê{ Ñ%Æ¢–åbÛ¶ŒŽf9ØÑƒï9øë•RA‘H8@7%™t@27¤†SG\à[»ÿþGZxÀ ÒµOK©ßÛV·ÎZ²`!›·,áHg?]§†/všzø“ïûR+hd³>¶ãÒ=¼ßö•·SÆ“_|ÿ™gœœVÝ÷å„DwšµuaÝkÍêE,[Ö¾ý'É~làŸ©:*‹A±àã¸ÝÃûlÇ-ì+Éì½GŸÿ›ÌGF×Üù•–@×^±e‹Ö…¶l^N"á­·Ž“Ï—®þ9P>ðÏüOx^–HTày¶-éMv”Š¥±“Òõoï¥ÿ2ø¡Àš»^®iú«±P]Ó⦠ÆuÛVàº>ûöÄóü-ü‰M•×ÉcZ%¤”ó’Áô7[ö|ç–Ο<ñ¡À5w~¥Å×径Õܲ²}ƒ¶mÛJúz“:ÜËÅûñ€?y½çÙH™Ã0$Å¢`(Ýí§s½ƒÒó¶VÓT­Kتû¾œtíåX¨®ieûí†VÓy¸ŽCóð§;¾n„QÔP²,+ )±P‹G›C{yÕ}_N|¨<ÀÆ0ƒLÝnˈÿÎò–Í¡[n]Gçá>º{F/u:Uƒ D£!SÇ „B:!CÃõ\×§ä”Çñ)¹>Žà:þœÀŸ¼&|\7‰iØ%“þäáRÑ{›ÄèöjÔªÒ'0H×>mèÖÖE ëB×m[A_orNákšdAK‚æÆ(Í QšcX–Ž <ßÇs\ÇÃõ\4MÃ4LtCG×t4C?s.0–±KÙŒ¥mGò çAÁ²Åµl\ÛDc}„ P¢äxäòïv —·|H©£5¸^ C/±°n]èôÈ»[í¬zøÂUïÖïxô›Rh¶¸a‹uÝï¬Â0tÞ|óØœ¸ýÖæ«W4±rI=B¤ÇR ÒÓ;ȱ½ŒŽf¸Ô×B†ˆF"44ÆYÐÚDss=õõµÔÔÖẊÞË–Ôr´ó‡œ@“C׈FÃ,\ÐÌÒeËxõÍ^Žœ›1üÉîÃsò(•F)P"Æñ¾×l?pÿ¤ÒɢР`ÍŽG®×¯.¬¿ÆÜ¸v 6ðë_Æ÷ƒªÁ—B°aM ׬m!3àÝwóöþN‚@ã†/J~º³šb–bëæU¬]»œ¡áQž}~ï÷õ¹OßBÛ¢•üâÅc³†?±¾h§Ñ´<ž§ð q²o¯ããßRÉ´qŰéSXç¹þ¡†Øâæ5ËÖ‰M›—ðÚk‡)œªÁ_ÔZÃMÛHÞÙÿ{_?@&[¼ À Á¾äù]†x–-iåÁÿú³÷˜RÛ!|(wK+†Ñõ®«‘sòjhôÐfÈu•j@ªX à{ÁßFB‰šE-ËÅæ-KxëíUƒ ܼm)KÛk8zô¿øåŠÅ©ÇRƒ}AÑŸ GÍL<çìOɱr"Ï4u¼¢7køåbEš(1t‡¸¨ùhCM¾˜ü[`ÇUS \¿ã‘ß—BÞÚްκîºåtî#9š« üšxˆ/ܻژÇüSžþé  6J(Ô¤P ‚‹,ꜥ¼^M^Îý9÷ÿgufA)²Ùr2µË‚&(’ˆÕˆç ¤(Ò_aiB»µÜ‡â*ÀµÛªùƒ¦Äòð5›–1:š­@ÃÎôðê"|nÇzR£ýüð/ÿ;§»Ư· ØSOgê2ôTqIM/ž‰ãzž‡çº„-ý²áO¼jºIÈjÆ›ÖúõaÐ~P.ûø`[æ÷"ZÜZ¼` õõ1v¿|pR·­ÊÁomŠqßk8ÝuŒÿöôs“¼®š‘+_¸ ‰Å‹[ikk¢±±‘ºúztÝ d)–lй©tšŽŽãt=uŽWŸîû¨i9±]*›@á²áO|Ãã¸1DÆÔL¢¡« F¿<úëw<ºÅë‹›¶wn¿–#GûéïKU¾¡K¾øÙMôž>Êz猃µ†ú7߸•5ëׯÉ\’é"É”ÍXªˆ]òˆ„ ÂV9IT›°hmŠá{}½=é<Î;ï!_°/pÈ‹‰ßø×r¬Wq°säŠàŸÉ¯Ùl7štT„“ƒo¸À WÒÑôJ=ÀSõ±ErÝê¥m—¾Þ± \ýWíâÚvŠüôg»P*˜¦à§ŠxÉ’6î»w;­m MÙì?8‰Ó'±ï’é]S—,j‹³xQ=·l_ÊwßÁÁxnç«Ø¶sÎ!§÷>»+òDÉŠÀ/'‰4ÂáJÅlškWÊ¡ô‰§€Ís.€õ;¹_`¬i­_¢-_ÑÌÞ½UßÚgýêfžyú<×;ø9…wë-¿ÃíwÜNWw–¿ßy˜Ñ1{V¹}× 8Ù“ádO9Š_º¨–m[6òoþh;Ÿ·÷º„÷QgÎ.ŸËŽÕWþÄêP(cg@戅êµN®Y¿ã‘û/wÜ~ù÷ý±ºØBsÅŠVúz“d3ö4¸ò ß×-æè‘:˜8“bù/>ÍÊÕxíÍÓt­HÃNWOšÓ½i6®mâSŸù ­-M<ûüžé½˜º·l.ÏÂF£bð'Þ‡#Mä³y 4Ö¬0‡SÇ.K—U X»ãáíJªõMu Å¢özެ ühØ ¹1Êž—_?'Ò??:ß²y5«Ölä—/vV þÄ«Þ;<‹¯v±uÛ ì¸ç& ˜´L=·‰šE&“%6* @7,„Câ5k"X¿vÇÃÛçLý±ÚÈ}åò6ÒÏKøT&·¿¸½–|>KwOÿ%ëÞ›®YKW÷ãªÕ¤ÛÓŸå•ßöð»7ÝDû¢–i«““«‰ét†HX¯(ü‰ÏG# (¥á{yšj–ëR˜Í‰6ÞýÕ- ¶5×´ËÅ‹8vlàœ«¿r­z‹ÖÒ}ªëõîI^€€PÈ¢h{T»=¿«'ÍÉÓY>÷ÙÓæ&‹b,™Â454)* _ºAèQQ³^¢‚me6U€Ç­&µ¸½™áá¹)}ú*Ûž¿¨-AGÇ¡©Wç.夾6\Uø›<2JsëB¢ë=2©(+ß™C×$™tvêýö^ §»—†ºÈœôäN)–¶^»î¼8àL:¸ý¶O”[BEåá—ÛbHÍ\âV“)¥xpûöïÎ*°ŸÕÆf÷½º4õæ†ftScd4ËÌGé^f7.!˜š¬š¾î}âäiB!X$D~JLRž<§û²Üq×Ý,Y¶„·ßz‡ŽCÇQJ ¬Y½œ{Xm3ÿóµnògÆ6VþÄÆ!«ŽbÞFC i†>`vß ü²*Bÿj,Ô^ÐVG_ÿêÌD Õ¸ .Y÷£T*² 5ÆÑɪÂG^ßßÏàp‚eí+øÒ—7ã–òx¾G4VNÏëJñÂÞcK^ÕàXáZ ¹>'Gm|I8™:þÕª`ó=FÁÚQnÍ-5¼³¿ !d¯üñÝŒÏÎq^æï< ÞwŸØò º{3Ø%¿ª}ø|/àXWšc]i C²xa!©Ô(©L ? *nÿÜ–E] ¡ë12ðA ë!¤f PDB CWúým^q×£5¦$W4]/o½u{÷'¨*ü Û°¦™m×4ðïÿŸÇ¦¶Æ]°%vêñ›[Ù²y#K—-¥¹m±xB×'_ðÈò—|Ñ£h»å÷¯NmÅ=·­À2ìÛË®¿"ÎÍ&ŸyÉ@R0û#k׮䯛odÕÚ- ù¼üz/%'˜3øc#Ç(æ0#õœ~Çîxáñð  ü°… wmûMbËæ%¼ñVRhü3û°bI[Ö·’ˆizï ~óÚ^Ž=QNOO[°3³Ønš55Ôóð£­Yį^=M*SšøȤ{ɌĊ4Ò5ü–BÈ…—zèÅ¥oÊ_%5Ӷ¡pÑvÆq|pðË7—síÇ»R,^˜àšu[xäë7á{%†úOsòÄQŽ·ŸT:sŽ÷¿xï‹‹G]2®åÏÿì?ð•Gæ“7mæ/v•'°®2|„@×-¾ë ë–íyÅUÀ• P²VG tMâ”üþ¹Nút_–Ó}Yt]ÒÚ£­¹–U×Üηݔ‚Àw)äÒä²)2é1RcI’£IFF†appoÒÔtjR 9}è .!|Å“O<ÉŸ|ûO¹ñºVö¼ÞWuøR3Qž®VA J—8¢ÏÀëÅ¥Ô””7ð/o6®*ÁŸ¼cÏSôögéÈž9f4b‹˜Ä¢&ñhŒh¤Ž…+Ö±z“A,b`~P̧ɦFHŽ1<8HGGÇw×4fVs˜êd®ðÿýè/ùæ¿ýw,h‰Ñ7”¯*üòÛò04_yhš¡Ä+#¡ )ÅÔI¯"øÓÍú­äò.¹¼‡)L{|ÓÐHÄ q‹D,AMMÚ·rÛÝ_À±óôž>ÊáCùíë¿%“Éÿ=ι5œ{§èéîãØá}¬Y±žþ¡|Uá—c#­üÅM3De T\“º”RâOŒs¾ÊáÏ4·ïº>£c£c¥)ç`’…-1¶-åö{6rïg¿DOW'ûßz×^û ŽãN{kPÓÄ¿Þó2ýÁõ„LÒä)g* @J! †D©+€P"&º”àMtoúÀ¿Xnßuºz²tõ–'°liŒ²¬½•»>ý wÝ÷^|þçìÞýêy=•¦ /ß;p|f”eíqOU >4©å5MŸx,^ešƒ™: þ£ ºãŽøíþ~úìQ-qïçâOþô;ÔÖĦ´LžiªžòÐ×sŒú‰þ U‚/¦|~æã=/é”P9Eàùžo躜søu5×nh¡&aèš,çâGò¼×9|&Ù2MºJAÇÑ$ÇO¥ùäMíüÑÿ;þóü÷  OÎ)ÿ¾^ÖoÝ\uøAà£(?3)O •»r DÖW^àÁÔ>sÛæ6þÙ}k1¼nÞ{ó—<ûÌ_òóÿöŸé9ú Ë|êÎUå‘7s²•œ€_í9MÖ‰òð×þuù´ôœî¢¶Æª*ü ”ŸŸ$ñ• D¶A Ù ðËÏ=㥄¨:ü¶¦(›×5ò×Oü9o¿½Ê–¿Ùû:–õ ßü£?æþO®àçÏ&Ps×™C¾R¼úFŸ¿g·Üz{^~uÚ0°\èÆ4$–©õX†à ÐËB EöÊ=€"(OøA€6¹@•ïù[7µqèÀoxû­·§í d‹üàÿýX†Ëê s â¥hûœî˲vÝ5çO-3)HÔ&PJá¸Õ‚_î=«B¢øŽ¨ˆ¤Rågéyn[Yõ¾¶æ¿~ù¥ ÏÕC@>Ÿç7{žcëÆ–qï4wðϤ~Gm-]=uZ厫奵µ•lÞãl^©ÒðǯUÏ@ ¤Ž¸RŠ U@;ø®e—<Œ6©&P=ø‘ˆ”‚‘Ña.>Wâ—ÿøˆ Ϻ• sc™µu-åIÝ.0pµ¹¹•\Þ­*|¸ŽBa!<϶ÚÑ+@¹5I”Šv€¦U¾¸hUo"°¹äýÉq^yéÙ¼¾C—s ±ˆA>7† ‚ NÕØÜJ&ïTþD¯`¥ K—j œq@HyÚõlJ%Ô€Ï êùå9qfbÏ?û,Ål?7^·pNá/hŽpõ-œËÛc,[”˜ø[Ö7r×ÍíüvÏÏø«¿øþ9÷ÿ³·­»ï¹Ç3éîÏWþ„”Rx¨ƒI¨À?PòŠ÷—Ï4t‰R“{Wúʨ h˜¦y6ï~ ;qâ${^ü;n¾ãÒÙŒ¥K‡¯IɲŠ6¬ª#l:ü×~—·ßÞw‘Šàwo»CÇSgûT ¾ëÚøž‹@àú¶ãÞÊ @‰}%'ã8%߬© .š&«_þø$Ϧi3âÀ?üÝÏhniã3wÝÊ+oôr²;Sø±ˆÁÚ•u¬^^‹r³ìûís<ÿËÿÁØØÅƒì›o½…h¢…£'OT>BP,$A˜V‚d©ßQJ쫘\%öˆ É 46‡Ï&<ªþ™[€ÁlL)Å_ýÅâž{pßçÿW¶Ä8|,Éhª4+øš&hnŒÐÖeAs”Ɔ0=‡ùÅßþ˜Wö¼2£Ø¤±©Ïñk<2†ëªªÂ(äF…nŰ“Ùˆ«äžŠ àø‹§7îøƒÎ|)¿Î¶˜xÞåÁoiˆÐP!_t9Ý›™öª›(àÙ `Â^ع“®ÇùÜï}™Oßµ‘lÞåÄé4céò( BÑ¥XòÑ´ñ'‰D "aƒDÔ¤¥9BKC„ pè=¡·ßç×÷ròd׌/¥àkßøcR9w V>@)?Jà  £óø‹?LWLžðŸ+”R+íb“²4¼¬ãCgså/_RÇ+ÏÿŸýâ×Çp¾Ëõý³1ÀåZgç¾÷ØÿEcc=·ßq'®ý]Ö-o$dÅRŽÏm0<•Š i²™AN¾„gß{‡÷ß{Ïó.ëØÿòÁ‡¨k^Å/^<}Nr¸:ð=§€ëPl/ïú›ñ”q3€ðx©XùÃRi¥Q[kI9èº>k·/¥äT×Q|ß¿`°ågö62’äïžy†¿{æ™3Wg}C=õuõ‹E†‡‡Ëã *dŸÿçÿœnû¿zµûÜgU¾@ÏŽ T@(RËh¾ÇÅ㥊 À”ö¯]3_(PWg¢ªÙÎòž¯iÏuQiÏŸèÔ`&•¶ PŒ 22ø…ì0N)‹”‚œ›vÔOvïþŽW5 Á“ÙBÿ£…Âb¢&ÆŒ“<*ð/zåOX&ë°xÙªKžO,% 1:š¬*øÕ«WñÉ{îgݦ›)yï£óD?J‰iG[mø£CGE$ÞBo¦Chzr¶ßkÖxÿWO¼³~Ǽ™Î÷Ý /”VJ%©™3ì½ëM\¬ßûGFøÂŽÍ\wýu¼õÆ[tÃô>FCóÒ£ýœ>ÙÁ¡ƒxwÿ~ÒéÌ×uõë×±nÃ5¬ß|=­+è̳çÍQzòÓäöç~1Ÿ¤˜F p47PB¾yðWõNÕà|;™ïÙUm5LŠv sð§z€‹uãJgJ¼wx„ßÿÊ¿eëu¯°÷•Ý 366Fûâv–¯XÉ-w| _kâ¼p‚¦†0 [¶ñ¹MÛyàAÉØh§Žu0<4@¡#›ÉËfÉærdÒi2™,–¢¶¶Žšºñ‰D‚Öí,Y±žæÖeMgt¬DÿP=ûO+øSa}@ð’ƒ(±šzÓ^ œo_–Ð/çC‡w=¹{ÃŽ¯ud #›#á&2žë!uã¢ð§@‰ Ÿx}ëÀ #y¶n¸‘G¯ûä”.ðm± .IDATÌ\G ì}û®LÙtž(7ÎÔ׆hkŽÒÖ~#‹×„B¦¡arJNG)EÉñ)–|ry—ÞÑ"ïëg$Y*'¥.Ú“gîá—Šir™A@áéJ‰@tÞõäî9@9ˆó¾Ìþym¬9”HHl§€IÍEá+`ÿKôáÐÓŸ£§?`…t¬N®à޹ž¾ŽL•H¦:ŽŒw!SÃ45B¦†ï+жvÈÖ¬ûíÏ=| õÑD ý©cNÀå]ý³®L¶Ž]?z.ÀïLåýbÑDz®[âR#v‚‰y§ô-½PÁOª=((Ú>c™ÒEá_\€‚’Ë»ŒŽ•HeœüÌX…üHy> ?PAçå>/èŠ0ñ¡‘LWP(úãçŸ?›Ç½@’Gç<øið¹@á_NOžÊ Ñþ à—3¨Cýï•k?u Hv¨à¡+AxEèØõø>!yj8uÜ.VXàø…‹fø‚q”+óðg `tð0žcc„b¤ì~[žº’g^Q p¦‘Èv¾U¥(”ò–a„ѵžg¢ë¡iëùA åaØW|.ŸªÁ(5=ü\väð±ò3õŒŒ°ÍRé[WÊ÷S©õ;ùÆ`ªóñ±5±'M ꑚq^U/oê=¹ÕÍ!æ­l5uõ(k%ïv΃_*eéëzÄj00v¨¨ð¾±÷S©+=î=:v²mØñµ]‘PÝmmu+-Óò±‹‚°ÕˆrŠ¢ï¾!Æ«/ïÉ3oÖ¶`1ÍËnãÝÎüø¾ïÐud7®S m  ²v&?´çàο¬Èãã+ÖܦéòK;y(m§Bq²|l;‰n<ë„à½P»xÇ4nŸ‹º}¦sá0;·/¦wòÓçŠÜþEŽsÏ{Àñn{ |E@ß©7p†AF£*3t,­éòK•âV1°fÇ#×kh¯.mÙfêÒCÓÀó"„õ|À'ÄôP®Ò€ƒ=ï26r)u®çhÏËŽ¯ü[:wýèJ1“•tcã'ö­îáwlˆø )r8N~þ,á§FN26|4-ØÈÉþ×mߪ$üŠ `¼jø}_y;{FÞ±exþ¾gÏß!üBv˜Ážò¸Ž†–Utì·ßÙÙ±ëñïWšWÅ ãÉ/:na_êHÉ÷,4¡°‹#¾;ÿðRŽÞ®7P* ^ÛÆHþTÉ.¥÷ýb5XU4˜l«îûrÂT±ßÆÃM+£í†4|W 7a‘yø¸òûN½‰ç–°"5” ßMe{Ž;"û‰£ÏÿMæC%€kîüJK ëûjb Zj#Íš&KøžÀ´š°BñyøçÜóÇyBáž)üÑÌ©Aéº[ß{é¿ V‹QU°æ®‡—ëšùj<ÚØÔYb(‘/Ï3 ×‰6ž}øÄǾ"`¨÷=ƆO „ VÓJNeÝT¶wØóJ·t¾øä‰jò©ºÎxC{9ª_ÖZ³*äû @Š‘ø¤”bøÓ§—gß÷úN½A>3Œ‚ú敌äO•2…¡“Òõn¯æ•?§˜ˆ BA|§iD·¶7m±Jv!| D<¾Í°>VðK¥,='öâ– HM§iÁFºGöÛv)½¯$²÷Vëžÿ `ã˜A¶þiMè÷.n¹Îò‡@éDc 1CÑü\vþSoâ{.F(BmËJNö¿n¾³“øèßæg®˜Ì©&lýŽG¿üÇ–ºuFX ßË¡” j kF“ò# ß÷]F“>†@`Eë‘Ѩê~ÇEñ­jÔó¯JŒ§¯Õ•¾3m¨iŒ,¶ÝÿZ~¸÷¥ìàñç}·t(\ WûlEð¡Ày‚0#_H´,ßbÕ4|ŠÕo0¬x“ÔMCH„†’š.4©£i&š4ÐÐÇg&õñ•ƒï»‹ï{Ê-Ïöî9Ê)fŠÅ\rÐÎŒîΞxÁwНÃãÀ½KEõW³>R·`Ð ,5£5ÍV¼a©Ô­åÒ0,©›RjzTjFï–ß•ç× ¼â¨IB: ¼\ 8öº øˆ qãWjaRí">.”ÈxéY`rû{Û8ìPú(Æ´¬?µ€ª•F÷]õZÀÇXiØUÍÎ ãê]uÌ åêƒ{U àã&˜«¾|¯öœ·êGÁóö1¶ÿÛ$Ñ4.¬IEND®B`‚stem-1.7.1/docs/_static/section/download/freebsd.png0000664000175000017500000004330213157571677023210 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ-?é Œ IDATxÚì½y°d×]çù9ç.¹g¾}­ªWû*©ªdI¥Ýy“ Æh¦aèiè˜îèz&¢éé?`ºg€é ˆ™fÀ 1xdy•d[’±%k±–RI¥Ríõö%÷Ì›w9gþ¸'ßË—õ¶ZdÓ1ºç½Ì›7ó.¿ïoÿßw·w·w·w·w·w·w·w·w·w·w·w·w·w·w·ÿ¿lÖ5+(i@ ýî£üoÒÐÏr4P[ý±•%àÈ8ül^Êú»')…ˆÀoDQI…áI¥øÞExm¦…k¹€È¼IÀ1O&“I©µÖ­VK™kŽ€VÇðÿ=ôï‡}½‚û°äñ´`, IÔ5­ŠæõºÖŸ9£ô·€Æ@ôÀ÷ ñ»÷$ûväó²Ð×C>—#I‘œfCO–JáÉj­îÕk/]®5¾ùµæá{ÀÒá!ãÃÃÃÛöîÝ;´mÛ¶±±±±¡B¡0(„QJõ !B× ¥”òµÖ- á8ÎlE³ ó³³³3çÏŸŸyã7f«ÕêeàÊVêMÞlàÖƒpçý y_¾P¸o,™?æØŽk[VA£P¯7¨z>5?àtVÞRê¾ ¿¥6¹^± ëì{?|ê×½g P ŸËËfÈårôNì °g/©\'ð±f§Ñ3Sœ›gaaaîôÜÜóŸ­ÔŸ¾ìE_˜ @ðqwfppðpOOÏ{÷î=vÇwLÜzë­ãŽãŒ9ŽSèïïgxx˜ÁÁAR©Zk´^­µ”RËŸU«Uæç癟Ÿ§R©„Zë¹f³yåå—_¾òüóÏ¿}áÂ…ç<Ï{qrrrÆHŠ›½  ~äxÚþÈOöæï?´hÈȤi%Rø™- Y­Q‡íÿGlÚðÀ-=ÃÛvâ¤Ò´2YÂ\ž(™"Tšf±HùSLç;̾õµ–O]CSÅz®ŸýàŸ7¸®àüüÆqø·e@;¹d‚|:@.“¢oß>†î¹üÑc$GÇQˆ¨WS“8•bx˜°§@åõ—ôO>^zãåï}ùÿ½Tùü«-ž*×òdöïß¿-Š¢·ÝvÛ{o½õÖ{víÚu˃>˜¶mã8Bˆe‚ߌ­ †¶thïSJarþüùèÅ_\,‹?õÔSßxüñÇŸŽ¢èíëdÇ?Tàã÷îÝõñöï;xâøí–»ó 2™A9IÂtÊ †´æç(¿ùóßý.³/}ŸâÜÕF“šÒx:¶ÔËpæëðóÏÂó×€ì/Áz~ahÇ&ŸJ’M'É¥Rdó9n½•¡‡>@σ?‚L¥‘ =;ƒX\@.Í¡ yľÃXQ‹™¾Í›_ûÜâ—žz景](ú5Çc ®Ï÷Ýwßv˲Ù½{÷‡>øÁÞ¶gÏžÁƒ’ÍfQJ¡µŽoB¬¾Ñ霈ÎÛÔkÜv÷>½ò» h¥–ÏÙ…0¿½´´Ä™3g¼K—.|ì±Ç¾õúë¯ÿÅ©S§ÞÜDE8Y8x°?ñÿÑñ=½û;xtÿ~’£;‰R9ÚI -H€m£#EPZ¢úúI–žý.sÏ?Oif†ÒâåjºÒú*,~>ùYxr#‘³.8\°c>7 ié&®Ö´´ÆESyõUl­°“ r¾‘Í"Ó{Ðcã0y 17¾ø6ÁÎ} ÿØÏ3ü#é¿í;_ýøÃ_þë÷=öÜ‹¿ðöÜ>Sæ9 ÞyòãÇ:räÈÏìß¿ÿ¿¹ûî»w>|ØÀq”R(­"€0„Z¦ç2¾õ˜ï&x¼Oªå¡ýÚ–aÙÛFX–%AZ`Ûæ:b@ôõõqâĉä-·ÜrÇÝwß}û‹/¾ø³ÿ÷ÿ諯¾úÏ<óÌ÷Í#ìtányÿ°üÙûo?ös?ý‰o›xè§d¦ÐG)¢(ZZ`;ÛŽ‰ày ÔO¢~þQ¡¤Eà„ZqâÆ®•ŠÏu]qù>¸gînkÀÒK),4¶ˆ_ë¥Eôü¶%±Ü"™D Hà5õ Ú¶¡gä¾cLÜóPòÞC»¬H5'¦+^i±^Ù¾}ûè#<òOâ'~â·~øáG>ö± îÛ·ÏÊårËú8&¼D±tZ‹KDúªkÓJqñ3Ÿáò£¢‚aDo̽Šü°f×û¶‘û‘ŸDl¿ ìhµÅSÇ¢Ÿ0Šõ¿ñT^þ>sßx¯Z‹Ÿ}=, L’"ÛhLžþ­ÀëZ?wg¡°D©4Œ"ê]' 1@К bI %mãQEGit¤QÂÆ RkRé¤ù«S‹×4Õ±ê¿Ù8°’)’CC´ŠE‚J9&Œ”4§§™ö9"Cü¶FJÒìùÑ1öüÿŠÌ?ΎDŽߔøæî5 4XØÚ²@Æn§Š"JÏ<Åü×¾ŒW®¬¨â¶øRR’ïï'ÝÛËÅÅÅ3—£hжýÍ)Ï÷ô ¤––pµ¦qñã×Ö„QDàû„a‚P)B¡%±¥CØ?Œwçƒ8‡n%‘\‰Ë qƒ¤{ˆ¿l8ɤm/‹zo~ÖÒâ*Û 7ÖÑŸ?Êö_ú5ìýF gË\¿Zµ™›‘V<,‹¨QgéÑ/0÷wŸÇ«Åb?0._`ž½‚|¡@ßø8 ¥‚t}ößÇmšSÞpû|«U»Ee£L2IÒ|©-Ú¡„Ò"‚@iB!‰,›ÈMàíØEóG>Lâ–ãËÄ_åÃÿÞ„”$z{I !\×Dõ2ç»Y—£¿°ÿâ7±ü8 뉿†¥kÅfg˜ÿ“ÿÌüçÿ–V½AÐf8½Z'“IúFFÈ Q¬×/«Õ§›[¨Ó[¸:-àÑ)˽##d¤Äi¿S ˆ„EhÛ(7r]"Û!J&ñwïÃøc¤ßŠëºÆº›Æá—³vz wÿŽ“Ë‘ÂÄÊd–л¡NÀØ}±[wÃb'€æ4sÿñ·Xzìï¼Ö²¾Šû5HÛ¦g`€¾íÛI%“XJ}é­g¶ZU²éöÙ¥¥K Z?‘%ŸÏ“2ûƒe$ B) m›ÈqQÉ:›CçrD‡nŸü$éCG°—}Ý­%a0B’ÿC(;²“IúŽ!»cÇ2 ÛsXïÝ¢£7RFÍo>ÎÜ¿ý×”Ÿxœ Š–™­Sì·/ÝÓÃÀø8½ãã4…(M]ºôä§V‡žo ¯C©\­~¶–HÔú'&Ⱥ.Ž1@ ‚ȲQŽ‹N¥P™:_€[áüÌÏ“;| VGzu ÌuåUihMrhˆÞÝ»—Ë‹t3€HÜ)£«jþÇ,üÚ?§þÂóÆ£ò;Umd:EÿÈ}Û·“ß»ÿüùo¿Õlþý–…ÍVüÒ•+ÏaøÝÜØ½¤ –!‰¤‹ûD•Ê@6‡ØwÔÏü,…[nÅ’rËú>æþ•RC^Éh–¥?d Ü{/™|ž¤4f|¢¹ [”QbmÄKº|‘Úÿñ(þ¯ÿŽæ… «ˆ½ÊÞ2#²²ƒCô1tü8(U?}úô+.Ë»¹x f^8sæ1Y(x»wSÈfc) %‘í Ü:•Fd³X»v“{ä“ô=Ž#%Ò`M1¿–Ü™ÔÕûE;ÍûC¦¿R }øÃän½·¯­ÔÛÏ^»ÕWž€ç~óIjÿÓ¿ úgÿ¿X$1×·9ßïÒý8½½ô1°?}G2÷Ío¾eÕëwM§¿–ƒ¯4;37÷Vab‚þñq2Žƒ´,”ã “ID:ƒ¦ðñO0tân\Û^3óÖYi³%±øÆè°r9vþʯ޹wdåy ¥É8û¹)÷‹eI¢ß>MøÇÿÍßüušßyš ÞX!´ ¼ù¬¯L–Âè(ƒLüø£¦¦¢Ëo¾ù—¿«ÔüµV¢ly Z­ú®dÒݹ}ûœTJzå2^B*E2›%ÕßÇðý8;?úãdÒiD»JglÝIWI¦ ), ·¿Ÿæ¥Kˆd©| ½ìºc%{…úøqf´åÅcn¾úEÔ§ÿÿ‰¯ÑšžÂ«ÖhE-mÊ’uÇ0ï› |Ç%=6ÆÈÎì¼ÿ~FãäŸþékž{î߯ È×rðk Ož;÷èÄÄÄ»o÷îÛ‡ŠE¼sç¨;"“%×ÝìøÈ‘Éd@H“ð¹Aq»–—,þa¨Äè(#?ù“,>ómd êg/’?zÝ» ݬ"&߆¹+P«Aµ • ”+P,Áü"zjš`f–V¹L«V'ÃU¢Þï-Û\N_½ããŒ9ÂΜÅo~Ó/>ñÄ_üœ»f t­_ø“VëÒÔ•+ÙP*Ü·Áñq2©©]»Øñ±Ñ7<ûù޽¡‹·ñÿ_Ãl“Üm·‘Þ·—Ú’ÇâK§O~Âba*&~¥ •”–`qæ`v=;KP,ã7øµjœUÕ« ¿  |- —#;:ÊàŽìüЇp€©Ï|æÕg‹ÅG'¯c>Æõ°hôÔÉ“Ÿ¯‹/dÇÆÚ·mÛØùÑ2~ø02RÇÞ”û·b£'oÏ®3®×Ðh¥°³YòÇ3ÿìwxí ßaþÓˆxã9˜Ÿ„Fš ¨×¡Ö€j*5t¹JT©áת´ªüF_i|#æWq¾Ñùž†ÐuIÓ7>ÎöûîcèÄ f{¬õʳÏþÍïÀ™ëÊw\Ï—^‡Ò­Q$÷9òP²·×qd×G?J>•BX™L®d÷Ú±þBжëÓ!ÎWôú*o««ž£ëÃî}›Âi­±ô–€`årˆD‚ɯ=Nu®ÈˆžÃé?ˆEµ‹ÿR–ʨb ¿TŽE¥‚†+:ðˆ ÞM-iá Ñ»k;︃ÿø‹è¹9NÿÎï¼0yæÌ¯ß½qqíÍÀ‰lö|>“¹oð¶Ûveî½—Á‘D¤°²¤m_­¯…X—øëå„è"°ÈËibݱºtl9"µÆèRiÉíÛ [-.=ù ¢´ÈP d®ju¨Tcâ—*¨b‰ X«”ñ*eZž·lèymƒO­Mòy²ŒîÝËÁG¡g÷n.ÿÑy'¿ò•ßøíF㻥ëg× €§K¥Ö‰‘‘zúðáŸÚy÷ÝÒ Cd"aJÀĆ!¾3€¢ƒóÅjB¬% 6Ök£@weߺݴöunE ƒPÛ6éýû©œ?ÏÅï½F¦Q¤/“Œ‹éJe(–QK%‚R…V©ŒW.ãÕ´”^6ð–`$@CÅÿ£dŠÔ¶m íÞÍ¡œ‰~Æ÷¾Ç ðßùÂÔÔÿùí0¼î )7b¦[_•ò€Ø»W¦D\3/‰U\ª•ŠË«»:[Šˆ8Ø®¤YI­ügù]C)S`©Öt«Ñ*¾^­:ÎÓþíîÑ9µ¬}]Q„ÓÛËÞ_û5’·ã…Ó L~ûY8{ªut¹BP©âW«´jUZõ:¾RW_ÅÄoil{püø8ã·ÞʶD5ÌüÍßpy÷î‰Æ# ÝP<ãz¿Ø××·÷='Nüâ-GŽˆ¨Ñ@&’H7óœRèйy•蔫¸x} Ä„ÓHÐQL¯v±\'ÚåÂLì]¶3:§Wª…—ÿu~.Q¬°Ò›XZ)”ÖDJ¡¢†¤ÆÇÙ÷k¿Æ«¿ù›<óú~Ô‹%~­ŠW«âÕj´ŒË×)ê š:mPä dFGÚµ‹}Ÿø™ÑQÿöo)W«~xbì…~q||üääädë ëðáÃÿýÃþðîNooü•B5*è(@H, !Ìd Ëî ¾µ¦!§µƒ@ C‘‚(.Ÿ&j[#„™É­ÕJÍ6%2eÖWQ3 Q~„ï[DA„ö}T¡£†+â]ˆxRˆã€ù/\™H 'žSnÊ¿£("Œ"Ò;v°ëW•“¿û{<ùö4÷×ö1RÃÔ{Œ‹ßz‚âÇéyX®K__Ÿ}ßC=tç“O>ùì;€l6;qüøñO;zÔ +•˜°É$A´8E´8—M ¹¬û…e­Ñ*Š'>Џ­ÑQüJ|IQ•YhV é¡+.4šÐh@«Š`¡j1¡CCøÂØß..Âä%˜¼Œ^¨ k-X  ¥ÐZPK¤¨æ4¡(.Ïài}ù‡ˆ„ˆAÐBR¢ŠE")Q–…r]´™çŽc êíeÇÞÏÔÓOóÊüºì k5d³„T Õ€@µg§@Óƒ™i˜ž„é)˜›C×üX©ÖõJi¤ÖøRPÂz-žåkÆ2÷³Ò+fùµñûIÐþYVüÚ²ˆÚcq‘èâEt6‹;2‚;<Ìö»î¢ñÚI.LO‘´\zk¨7VT€!~èºd††ܶ‰`ÛûߪT˜û½ß㵋™`dú2é1¬T ghˆááaqîܹGŽ=úé¯ýëgß1!ccc?ûžÛo·U-ž° “I„mÌ^$œ»s  ®‡§Ã ²A±)3CFÇb?TPœ‚Fݬ!Ut9D•¢VD³ÕŒ ïGqåÊe8÷6Ì/@¥F›Ù¬:\]@¢ˆÃe-ßG±RwØûP]R@w€AuŒHÊxŸe-K‚Ð!¬×©/, Οgh`€‰ñ1¬T’3““L;.}©Ér™Àâ°”Øù<=½½ 3|ø0j~žÒ_ý¯~ýëœîïG+IT+á瑉$nOétšíÛ·ï›=.¥<§®¡AÂ5 ··÷¶ßûÞãƒ}}33!É$:h\xí5⊠£ÈD÷dìþi{Ž:vï∊%‚W„JªUt³µ ºV%* (7°[³È¨‹ür.^„·ÏÀb¼0Þï‹Ø²Rk»p- Þ6;Ý<­7Ì´‰¯;€ :탵$‚ƒ¶,‚V ¿RÁž¦¯¿Ÿž‘¦K%.».‰LŽT¥‚®Õ‰<gq‘V©ÄüÉ“œüÜçè“’¥d’ÇÆhØ6 M/$_ž%ÊôÖë¸==ôôô8‰Dâßwß}>óÌ3þ;€mÛ¶}ôèÑ£ŽÖÔM¬„‹•L.ÍÎ\4¾aØNš¯ªo’ضqóŒÅï•À+£«KP®B½ Õ ªZC-‚Ý\DF8¡rñœ;3s±gÐYèU¹£N´¹?Ò땉 RHWe0õJY8BÄ.¤”±i¡;@`[n  Zé4 ¸É$^½N=‘Ä*ø8‰ Àò}dRfS)Î ²˜Hà*…/´Põ"A¥HXîÅÉåÈd³LLLÜvöìÙ=Àïzî¼óÎã;'&œ¨ÙDù-œBlýûçN¡êÓÈÀ‰#€ÂLo¶lD2ƒ°t,ú£Ð4pc—¯U¿ —Ð¥ÔjˆJ™¨ècÕX^=3ƒxãM˜‡f`¦Ä°ò_mÀi'Yô&ùÁÍÒBk¿œâŽ¢åØR.Wø"%®eáD²‚€Z£Ï“êéA…!~«E=•µƴmã9‘ea¥ ¿^Ç®.ûÈe³¤R©áB¡ðÑwÙlö¶C‡î ˜šŒ³`™,Qy‘àÊÛ¨–‡P.–íƒ/þÈd!`§âÏÂ&„-ˆ<ðªèÚzaŠe¨TPå*¢æc-̡ϞE\¼Œ®{ˆ°ƒðm%­Wˆ5Ý4_¹Šx›$¯«fAëxê¸ Œ!I¥HDQl+„!QA½NjpT_ïã{M¥bibl§•y‡é8h!i5}ÅY‚Â0N­†•J‘Ïç{öì9600XXXhÝT8pàÀØØØ¸cIµØ‚¶Ói‚K§ç§WRar9Þ/aÇ¢^${@:&„ÆAžÈ‡Ve(-Àôlœ8©T¡RC^º±Œî,†WŠy.]UÊf¸_m¢ç×"üzŸé­$Û+… ­5 ) MÔP›ˆfET}·§‡ìÈn.‡ßjQ¢LâLØ6¶ë"]—(Šðdôº±]­¡úúèííEJyÛ®]»-,,¼|3>xðgMÐ IDATàñÃGŽX: ‰<é8 Cü³oÕ*q.@›2n"ÝÂ=ád—‰¿RV‚ß‚f][€ùôô4¢\ƒùExû,LÍ@#DwŠû‹-£`Ùˆ˜[Ù·ž:Xï¼íësµ&c<Ž@k‚vBÉ„ž‰"¼ùy‚FƒìØÉÞ^œtšÐÄ'„a(«#ZR–‹0VE5(Ï#Nã8ξ={öì{þùço,ËêËd2÷ Ôjè0ÄÊæˆŠó4O¿A`¦0 ,§…“¨aY}7g ­äêoàÅïý&º²‹3èéIô•ô•i8Qª­Ì‚ˆ:D½^y¸[áBeÄ¿ÚȺ߂4Xïýz€èÜR@†xòl+ŠðÛ2R®„±m›°Z¥tþ<©j•´™‡(ÛFk¡ˆÛÕDJÅY*!ª:‰òö¢ ¬¾>†‡‡“Õju‡IõoÞR:xdd¤wdddW>Ÿ'¨VÑQ„t‚Ù+´ÎŸF>Ú÷°í*‰d !Œ‹xaÇÞ@›ø*¿^ ]œ†â,L£/_B¿ö:úä›è…ÚíǾ|'®EWkóUïE¿ÞÄðÛŠôX žÖ¥Q·— øX <ÚÌ ¥K—âgq÷²öð}T!^+„¥sÐj¢›MÒ±@¹\¾ß¾}…›V088xàÈ‘#ÉT2IP¯£Ã!Þß'¬”P-›2I§—D+VqY4ÊôÕQèÊ\,1ê%X¸ 3èËo¡_ý>úÂ$Ôðc‡¡Møk- ì$†×e6tr¾ÚÌï¿¢w&€¬ÍiDˆ"DƉ® ßÇ[\¤táB<%½ÕZÞ߀ò« ž‡-4=½= öi­7 ÙlöPOOÔaˆ â(ŸnyxçÞD{Mœ°ˆåƒn…ˆV€nùˆV ì$D!záR|Ë–­Ì_DO_@¿ýœ}–JFbèj­aämua‚Φù­.§Amz *`+ª#aàwkªuÝ4ah´F˜±\‘$%J)ê33D…©\Ë4ÑRQDËó ý+š'òwàA>Ÿ%›ÍºçÎÛ¼y3`õõõæóy¢0@…!hMëÊ9¢Ò2ò°½$º™·…Îxˆ†‡NTaö¢oˆ8ûG«‰ž> “gÑç_G_:Çð½¨]´\£©×°¦×“ë"X(ër»Ú@=¨®ï^+8 nðßkˆ_b¥olg{#i~_hl·¿5%uBJÃ8Q«‘Ìåp]ÝjÔ›¨dˆhÎ!®„d.‹”Ò.—Ë÷$“É'<ÏS7˲²ÃÃÃé\>WÊDwé,a£Aš:²–DÛ¬:U‰/S $ºZŠÀЇræ.£'ÏÂÔôô4Ô1Aåê€Îõ,C²–ÿ®AÄõ¸}3»àZ= 2ÿKftw%¦«É”ÆÒ©5±`þGÕ*^£AäºÈ Àò[D–FÔJØC- ™J’H$,)åÞþþ~999ycp]w`||<™J&Ñ*Š=‹ÖÅ·‰ulÛË-©ëh·‚²2HeA+Ç4Wª•ai½8 s“0})ûêøîµ-P–)ïëâ~½Áû ~×’ë©‚­Ø[•í÷I`ØØ ‹Ä=Û£ $›c¼…0gB¿¢ZŽŸDD­VК(áձ܉„ƒmKÒ©$©Tj```@LNNr£Ø–N§ÓÒD±´1Xü™I´×D&j© ‘D×=@z!ªZG¤²q]`«‰®× ZŒÝ¾ù)t¥?Ò{p*ÐÝÓ6¶Lün/ -Ö"¬º è-‚¢ý~€å¶í,°öÌ a€’#îðí²²º†Õi½j^…¤Ö± §@4’©€TÆK’J%Éd2…žžž7“Éä°eYi†qÖ«Ù$(-¡C…´$º¡ü%ÄRŠt±‚Ìõ@2wÚŽ"t³Õ”Jì 3ÿ¿ÍõI ¾±_-^@ÐÁq›I­Ú[Uq¿ÞpÞH€VáS$½†ó5pɨ ÙÅB¯0†ì(ž"U°qÜ8=H$H§Ó‰B¡ n®ëf\×µÛbH+EP-6HEœœi—ÚK kàkt¥÷Í2žíÕÍZœ¢]!®ÑJįˆÄêð~wïÀ­H€öç‘ ÿª-`3q«ê¡ó}/0f¸~Žxñ$exÆØ½óíûšfXÖŠ+Dfõd¶ö~;~äˆÒ…–ר¹®ƒmÛ–”Òf“…¯6€”2!„°Ú“9µR„õ:aÓÃ1¡6Õ.Í—@¨P~QkÄÜ/!U׊¸íêjˆ”@‹õ»‚]K ¦hºu°™¸x`œ¸k÷CÔ–áöã:]€n¯Htp¿\CÈ.¸FUdz ØŽBá:Jk«V«%ØdѨM „peÜãeyZWP¯zM¬vÉ}›øQÇ•:ŒD²£œ.h±²¨›¿Ú˜ר ¾–Ó¬Áýz‹öÀõˆ=À„áþEó8ö@8ëÄ+¦;la<Ù†NX¬, áØ©\Ò’ÈHcIŠ"«Õj%nX!,­u<‹Î&"Ï#òCS­ÑRG¶ãŽä !dGffYt:À„ÒH ´¯×ÍömÕ TëJ]#ÔÜ@Û?oŒ¿žŽhäzUHE#þYCÌ[]R sŸ?.Òù,‰tÞ$N2¦“l4Î @)FQ¤ÐÚ”w븘!T„*n«•±ReÖÁª`ËÄËq@$!*¯9esË`Ð`3n½V×p3©° ØO¼°Fc Äoîou<—N[k~í‘RÒ½yÜtnyÞ¢RŠH)eYVxÈ¢(ð}?öÔ,+ž<†D‘Š»V.«ì8 D‡¨_ ÝqýeõaÔÌÅrS‡]êâlÑQÚmâÆ©k4úÖ³ Cü÷=_íðý7ºÖ%cõ‹5DüZ¯E‡øO)×"·wG<%?ˆÐZE!:@p Ñl6­tRšz?-$¡O@N¶9<žícª V‹øöKÝ¡äji™б4»F7°[¯†›ˆí­z ËøïÛŒž6fwÑXÿ± o DÕ•°ºôüzû2@6›"wÛþå‰7Z)‚ $Š¢@k]¿aø¾¿Ôh4|­–cÇ“9„$ÄÂVàÉxކk®>žÓ+VMÈ]a@Ð.n†F  d^Öõ–‰¾V¥N§`—ízlŒ5?hܹ~ó^›¸ÿŒ‘mKk‡äF µÆ&xÔ³owdpy²l¤4M¯…×jEAD7 €f³9[«ÕšJ™²Ò)Id¦2·ÚÖ­1•ÐH)VÄû í&kc Xˆk×—P]u$z‹’@m’j¯Ê1bˆî}?`^×A·Ðá­µ…k#×Ýķ͹ –¤ÿÁ}Èljy´RÍf“z­æ•Ëe}Ãð<ïB±X¬z^7—#ÑÓwþDEJ¨Êø!H½BL¥:@СÚ±€UO¦ËJI,@¸ ¯É ì<&Zà ¼^)Ю,’†Ë·ý«6`@Ð2D2ÆŸØÀø+ !º\?± Ú†a>߮ù3€± 1Ì»¹1ZG$G\U)~ÕgÑ5¸{Ý¿í;€½æá·±Þoâý‘1æ¦Ù|MÜö±þ~¿µŽøï–ù„ÍÈûöbïé5bÕ-Èb¹¬ëµÚåJ¥rS «óóóH)Iöõ¡Si’n‚tŽŠ,™ÖñÝ ÐmtwiéF{Z»»‹L DV\s ~#ÀDë&ÚÄ ÌÂvæî;¢zÚpô”ÿ=ua_îÚ·‘øï&¾Œíé§çG÷B.NÊ -? \®FÍfóV«¥n ŠÅâ…ééi àf2¸==„é ý  5 Åξ k`-Ž_m)`÷ƒv· é~­Cì¤HçëvL¿ èè.âšX5ÄŸ6Á§ÍTTà ± ñײ$OÚì|ä6ì‰Hæâ$ . ÁR¹J­V mÛ~…›´bˆZZZzqrr2°S)’ýý´ÒŠ %“³%.]º¼T¯×/nõš¶ U©TνôÒKÕr¹Œ’C‡ÈlßN¨a.Ô\RpIì‚„‘Û4¤ÚM@Ôj¿_u€@«.ƒ±mX’ˆôÖýy½‰ë×i#ô™"«#Ú7lö¥:‚<Îop}‹Wù] kÑŸöæ8øoî'qlxÅtÓ ‡A¸ ~¨¸xe–éé™×<Ï{õf€F£ñúk¯½vjvv! gçNz÷Û¡¥`AÁƒ`Êd GLhèÑ`ë«»¸¶]>Õ¶ :ìN(cLZ H dbcDk¨¼„L‡Á';À0`Þ×±wî¬ýõ ÀhË¿›ûsÀB’ÿä8™ÛÐ^hòÄœˆ‚Y˜CP¬x¼õÖYjµêi­õäM€ïûg§¦¦¾ÿì³Ïê(ŠpSivÜ?‰þ"ÍPSU0©á‚ŠÇ¢ŽEy«„¬fU‘^Õ×Q¯ƒÝÁ"µÒ)ÖN R£ánm‡ZÇh¿·ˆÏ™"Žm&à“1>ý’áø· ‚ë$~§´°6ˆðµÇp(i³û'’¹"î–¶ÔD7‚¸›šµ#.žqG’™¹*¯Ÿ:]©T*OOMM©›|êé§Ÿ®Ô „%½ý=ô8´Ü´Ëb£oÞH‚6"®‚‚‚^™‰ VB_­:>o†vFËE¤k€Žœ€ZG hÃù;Mç¸Ñùtø÷gMUo™ë_^¢sâñüˆ¿?å0öàNÒwŽ£«>j©‰ZjÆ h™ùF„%h¶o¼u‰+W&§jµÚ“×rm×Ô-¼^¯?~òäÉË'OžD (Œ3ñÞ÷‚ëÆµ¦•o¨ ¢ci0¥ãQÓ2©¡Ç‰y£íúEFt†«Ô…›dF2¹~ºV¬ãÐÖ­¦€c‡1ò,#î猑÷¶A“ÛÚÕ=¢Kÿ¯%ú“Àî„Íðíc¤o†F€^lÆc©‰®èÖ8:4Õ^RP®ù¼ðâkÌÏÏ?U.—®åÚ®u½¿ÙlŽ ?pï½÷;‘@Úç¿ùMKE”G,#ï"±rƒ¡0B±bÇ$Dlá&`ù;+˱›š‚vë™®±¸Ï”ÀJ –& V«€ölœŠù Û}Ø ×N£®h~Ùˆûæ5Ö#¬÷€­Ž€RÑüïÌìÙÇ ¥{ö ’™èEZre= ÎM@þ0!J ^üþ%¾ð…¯×Ïž}û×[­ÖùwÚó¼’mÛ?}Ï=÷¤H 0wò5f_}u™ó\¹2•)eˆÜd¥/®+Öq%Ñq¬ÓÉ% 7ˆ«£…–NF鸗´Ö+ ÍoŒšîAà€AÞœ³aôüŒ1ðfM`GÝ ×‹®®Ý»ë3[ÀЀààÉ`¿ ^¡A¢ã4»Ò(7{25ÔfªMÅ{Žo|ã[O—J¥?ðöN Q*•öìÝ»÷رcǰ7Ÿçôc_$lzñÍ -VæÇåÌ Œ;Õ î騮ÚUÑaÇDÝ’BˆeIáŠ8ùäˆøXHÙÍr6äZ±Ñoté6Ãñ}æfÛáÛšd;Ž?göEÜøÖYÚewH€Ð@uÞ6LLH±(ô\ÇÇŽ"´'‘@#âþXÃ{p¶¿gyœ:3Ïg>ûÿõ×_ÿýz½þÔµš*×€V«Õ’Ífóƒ=ôP*Ÿ/îïgþäIfOBQï 0Ü¥s5àX5x@C¬´J÷ÅjC ZàšßkKŒ„‰ $%¤R‚tJTq“ò@Ç|˜4ÆÜ£ßÛ娋¬tã ¾Ý%JÀzXìÚ-I&W WáøH»†ßT}‡V*CêèbåzãétJÍ'ž9ɾðØ Õjå·Ã0,^ŠºvV뙥¥¥÷ìÚ½ûÀñcǰ l×áÌW¾Œßòc'Žˆo2Ûq¢Îu ˆM#š€X^<Ù€£ÝžõªŽh÷ñ…Ð… +h:p%€—ØèçMgÚüfŽ›¿.¡èàv»K·ÛæšÛ* ›„=»$J–\=ý+¾’­–ÀÙw7©Ç"®¸ ¼5]á¯þæKþÉ“'ÿ¸Ñh+õw¾ÙçÚПŒæ=½‚Tl[¬,K¸ÎúR¬ÙEpGÆ ºTZPôï î—ôí”dN*>OÀêYRë­±úÇI>ðI¬Âàò5x(^˜*ó—Ÿ{´üÖéÓÿøöðFi­'ÏŸ?ÿÀîÝ»Gn9r„ôà ºQgæ¹g L;OCFòk°ÙZ„_k~_¬/)ÄJ§Íé 'â®öé´ ß#èédòÎJÒH¦®+p\ã€ãÄ žÙ6$JÆßÍf…^AÏ  oDÒ¿]0¸[Ò7!H÷K)e­æê-@kd*Gòîcï8²J-žkÀß<ù]õē߸l¿Ëê¾?pÌ7 ozzúwß}·;:>Nnb‚òk/³xöB욫쑂ÄA 6A×dÁuAÐawˆù$ì:Ÿ%ÁM2YÈ$ùA¾WPèôö z}‚þ!ÁÀ XÐ?,éôŽz†Ù>A"#°OGv´ui‹ù°£ìlí¡–MâèC8·¼7n±Óv[#ÁW^»Ìg¾ðÅ s³³ÿÒ䩸aàÜÌÌÌNß÷>ðÀFGIöõ2ÿí§h”k˪À×P±{¸&ôՆᆒ¢[lˆ®—¦±ÎÊ œ”‘ë­Y©!cεpAÂ$’‚¤+p+’Á¶Í²¬Ø«ˆ)Xnð´–X[ œ½w¸ûˆDÚÅ¡©ÏN×ùÔç¾Tõ•W~Cký¥›A¸›€–Rê .œ?zì…‰]Då%¾÷,¡Y¦©âPq¤pCk#è«ÝHÁÕKÒ¶ßyb¥óFËŸ‹uÎk–ºZnÐГ_Þ'ºˆ­»öu€Ž@×UŸýööC$ïÿ$2×»|æ;§«š¿øê·õO~ã¿´Z­ßc“Î?h,5›ÍÅ·Þzë½ÊîÙ¿ŸÂ¾ý4Ï¡væLCÁ×Þ˜æSŸùüå³gßþWÀs7“`7 xyjjjdvvöö{ï½WŒ:Lj`âß?ET¯/ß|KCÀ`-ÃpC‹ÍAÀÊj…(c¤M+¢Î¸ýªÚ{q5Ë•°–è—›¾s{ BÙÉù$îýiìñý«úV#ÁÓ—ÊüÙß>Zzå•Wþ7¥ÔçnR¾ê€¯µ~ñܹs;Ëåò¡'NˆÑ£Ç°Si*ßûÚk­A]CRRb®Xâj=½áź¯ÅrÊ3ÞHÊx¢[·ÂÊ.Â/ÛÄ3äD–bmîgcC“Ó ÍùC»bâo?[”渆<7Ûàþæ±Ößç;¿ïûþpýåˆ?PT£(zåÍ7ßksÖFúªY5BÄëˆiC4«ƒèW©±v¤n•U¿Ø@´§¬ !±Ç¸ç§±Æö",¹|¬§ß›mò§>~ë[Oýq£Ñø›eôý °Á©Ó§OßR©T¶Ÿ¸ï>Æî<ZQ}édÄ3Ōި(u Wtp}QÝù¹XçX)ÀGàîÏrµáÖýÛW«€Õ!Ún€Êuß ÐPk”å`ï¸aT‚kT‚ÍjQ¼a×ú|&`µEÄÙÉœ¸zÎÝU8×PI«uÿj›€®LÞš К0‘A~/î?†50‚+Äo(Á÷æ<þü±o…_ùêWÿ²X,þ[âúþkÀ• ^>yòäþ©ÉÉ]Gßs{?ð!ìTŠú©“ÈfËô m•řĄ‘«ô±î"Ðb¸»Á¢+KÇÙB1É©××F¿'ÖÁšÄ_u¬FäáöâÜö~¬|Á,­ktf(øÎT?ûâÁ×âS¥Réß¼ÓÄÿAàÿkïÜ~›<ï8þyž÷àc'$@2Ê¡  ô*Zײ®¥Ðíf»ÜÍî&íbWÓv7iÀ4Mk5©½X/Ú±n+¬ë ”hRH(§4 ¦$1˜Ø±c¿¶ß÷ÙÅó:±CMÝ¡þJ–,Y²?ß÷ù¿?€D±X<144Ô~~x¸³»§Gt½°ƒPK ™3§™4¦PXÌVè² ²~ÀBëâÎãÌ÷^2ûô—¯ä—’u(¨[ÌÄ½Ì óGò.$˜û9J¡ ‰ênF>÷ ²c®«rZ“Eíí¿öÎ{Ó‡üûTjòWÌjG>¸áºîá‹—.ÕŸ\ß¾b…¹qçË4¬\E.~79­\ö´„&Á´Ão 3¨–M­ŒÅçÓØ-¬‹n")Ga!n?ì;Ùü;%w¨Ž6Äœ4´R µ$ŒÜÞ…ù͈æ.T~©þÛýÍq_æà½¡Qþøö»7{ùÍt6ûkî./¸` zÞâÐÈȈ×ßß¿Îó¼G¤‘*IDATȦ—vѺe+^6C>1Š©\"Ê#XQšud­çüåÞïOrlð³Ÿ?¾?91ñ[`»kH­ PF3ðýP(ôÃÝÝÛv¼ø¢½}SíÓY²ÇzÉÃsò¾$½‡,呎ƒÊqó¥‚CÉ)à:Ž^ÏÎlñÌu) ,¶f@`ÆÆ" sisY f[Fk³­Ù܈´ æ®61`®`0|­žûr82œú|èoW¯^} 8ÀW4þÚ Œ6à[Á`ðÇ®^ÝóäO,Úñøãt6ưϞ»tâÄžã€áßí¾Ä˜^Áêï0v‹zA3 aÛÆ°¡ 2ÅŠÕYájÏ#£®Ö*[ˆHTÛæÌ2p1HeáÜUÞõÁ¡ cŸŸJŒ¼ ü/sù;ʈϘ¦¹»¥¥eë£+W=¶}ËSrí²o°lbœØT 19I)1ª\J„© !¤@!Â4‘‘0F$‚Ž`D¢ÈH#Ũ b5McÖÝòU¯gÌyuƒ :V‚Œ‚›©4CWÆ8~z2×÷éØÀÐpüh6“yÔ ÷ØØU#À l6…ÃáíMÏvwu5­êXn¯Œ†ÅÛ"V(J§Éq åi‰{Ã'‚ebD"HÿeD¢ÈpX AXvÕ^–¥S ò®âVÑ%YrIdsœÿrÄ=yñR!>2rízâúûñø½@?z qÁ`¡  ¾¯°Ü´¬Ý±ØSËÚÚêB¡–¨‹š]—%@“”4JI½M+ ‡0CúeƒˆP ᙦ?Ÿ¨È)È)EÅ”‚)Çq¯O\¾|ùÖñøx>Ÿÿç­dò@nzº,š[ˆ?âB&ÀÜ|†‰žùÜ‚”›%¢I „ö#–›°4 Áº)ÔDO0Ï$–€œdõû)àBÄâ¦Òi„1„8RtœÓ̦¼…þÃ=,¸ÂèaàVŸA¸ãjâJa±²TÐ(z¢Û¡†j¨¡†j¨¡†j¨¡†>þ ŠŸp¬äIEND®B`‚stem-1.7.1/docs/_static/section/download/pypi.png0000664000175000017500000000736313157571677022566 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs ð ðB¬4˜tIMEÝ  ߎÐÖœ²È¹q}m‘sqU糃OÌÏg_ùý@C5~m;:ÛšxÚáÿ‹ã§F˜Ás|cO²÷îìÝÕ!ÀÃþ#„ß¿DÝù|À'ŠJð³> mmÅÁž[D`ÇŽ¾6Ä|2X_>¿;€à`Ï­B°bÒDϼ6È>q|BLÁÏü~wÇO~,<€Õ»ß¨ƒõ•èÙq‚Zø*J!M¤qì­aD†®ÐƒŸý™Y `!8<ôü{è¾y=>°ØWŸT§yŠnoöãÈ7¶ÃW™+È„#Ÿà±¿~`À™Ï18 mkÃÁÝ;ÄÀâþõÀ÷U–ê‚¡Îë°÷Îv ·Í|b)3¿3)ž µØÄŒ®k mY§ ~ÆznÛÀ6¾«ÆtŽ™â¸÷Ì'‚´–˜™×è`¹#»o4Yü•eêtÀp)3È:Ž ÆDHkÑXÂPÝ£±šŠR.êø&ç 1='<µ€ß/MQ5Ñ7<Æ|b |€ ™`eANÞM@Ž\0=3±½SHÃÄ,­Ô×ú/^°î –Õ½hl‡ÂéžÒ/MâÐ §íGïÄ$3È&µ—1€eð3½xü­!HãÓ8º†ê«cï$zá4’3óÜ¥]ó!Â|¯\0ß»õ6ƒˆ¢/õïÎdzÑô$Ü’vY3/ƒïiЀŸ/i×ø­º—$øfO ¾}Ç|"<€ÅÐ"ø.ª{zž„è}&`Sâ4wÏðf‹4°ÐÀgŒþIvš¿å-[Qì;„<òä+ˆ Œ‚UÚÍÍñÍÁû×{…ðpÄ Mi—JàaN<ÌF€ üb‹’3óˆ ÇÑ¿´VOŸÖˆ‡Ü®Élž¦ÛÖŠÆ .MØv­Ä'K6ù,0wNý¹ÖufÚªèÊš€ê[€’ï Üw½g/£÷ãQäeʶÛÒ®ð`î<0ûQøYm(_Óg–}w{€Ò&ï r.ŽÇOœQÜéZS¶£o¯K»¬äÑóZ´$ȼ&^R§€Uû€Ú»òK€äÌ¿ø1Â} ;ØÒ®àkœ¯•hY?sòb =Ì_VíÉ’3 xäwï ›²>7i—‚XvÁ×R÷¨Àçè”çÇÿ ǵ_´„a‰;àÛ”vœ²M3ý‹|B ¾ XÀϼÆ~ ̹K€ü±O~î”*¢_Ñù¶t}§‹:¹×Ê>upià ´Îý­{8~ê<"ÃWØÃ©¢á¯ë‹ó yÅÙç¥>&ÿé<¤‰4žyu ×µeoÈ@,v~>fíf]+Ñßî:0y€¬kŠ?ï<Žþk@žs§3k×¹ œµk]ÝcˆOTà›€ä’hf˜tŽÒDᾋŒmêeóîâ0k—8:ÄÐx¢zÖû9Ÿ)Οp޽gG-‚Ï9€£b¸êúv‡PxÿUõ¬ëÈñKÇSo:G€pßFi—ð‘vŸ²MÀ%>1ƒëWx-×®E­8!ëœÅ$Ó0@M€äÌüRÚgc7ÂxwqU÷i—Ð_¾ê u‡.&5À7‰hã/@My{6«Ò.¡S÷<©ë¯Ä0|hiôgƒ†uÒ:›à@ò}þRpôê¢L!í2Å.KÖ\G>‰˜ õ`8.¤]‹à@—’é3Οi7=À—ï i—:3PÛÎÍЬ¯èKº<À' öTC€4‘¶(íÚÂKÒ®eu˜ÎúÝ}çæåƒ…QE”îø €ŠQiÊeðmœ¯ž3ê=øí-ËoÄŸ3×õyÔæ$~è—&ví¨{4à;-íÂüàúÕØÚ®ûOS¯8> ËJ臯H»nèú„ øOø |UåòŸ¦€±gèŠ:¦Ò0¥YLr"ÀxÊCÒ.ñ¦´›•ò©À€±§—Ç~³¢Ž©4LC"º8€jH¦çùpžžµË_d™¿ªûî݆ž;6«?= L¾Ì®ëç û|=Ñ/Bp7ðú¬]FuOéîïÝq#B·Þ¤¾ë߬åìá>À÷9>J gívn\‹àºFøªÊ4°Ñª¾é|‡èœ“sm¹Ê^pýê\Ð3c¾ôS`úC‚< ðaì­Øà!i·sc3BÛÚ°sÓuðU–Ó6ñ79Ý[L9᳴ëàän4çwn\‹}÷lÆ–¶µÞýÓx˜ø»™¦O3oÈ.×-ðÜË)Rñ €ïê£RÝ‘v5Á_¿ǼžWÁçÈÛ±º í.ÙÁ‡nSƒ?OËÀ«w®›íжWÛÉ‘6ž¡g‡¯´»{§"×_“S=®Ì |t}žàƒnüævnXcAÚ¥?ÐXƒö–Æåfg^ÒYe|9º+u(kð(ê•|UßÑ"²p¨ò%@°¥N<~³vwnº^ýÓ'uî0ðhVÔÀ¬“µÀ7b¥ x<㕆nΠ­ÉÑY»åØUÚÕêÖ;Œ5>ph±ø…&=$DÿyÆË™Ïº€¸àºFõø­äâùH7vR+üÔ ¹¡:kà±!2(‹;çÁ¼qµ>‹Xsä0ßÁT#Èš² ƒœ˜Wçx|^×WjÚ!@¨«•MÚe™µ«UouÛä|^×xˆR6´·ÔËÁšc»qd—á=èò>m{M÷9GØ»«#×Å3ïÆAø‚ïö›¯X¬5÷+}Î ´µÆjŠ4Ï”m=âÁs¥¨C«K¥¦í^ÿMV8­íø£žü§lk‘ÀrÞΣ¨Ã²R‡a±†•¢Ž©.±äú)sÛØÒքж üÀ×›½b¹¨c<7Š:ʦ©t­8.õ­ZÒúV±ØŠàºöÝ8,oµsìu¬HΔº>KQLjD™ã?J}îÀWY†#ìZRðtØÍº sQ|‹:4º> x¦qCQÇ0>XJûVÝnF{÷U–áÈþ»±»û&{íjy—‹:¼Às+Ýlý°áQ;Ú#€L‚r|÷mxâÛ_BçÆfû{í©ÅVÔÑ;¿® èx hÙc>~ŒÙÒ¶Gö߃X<‰×Oའ‰é9D/^A"=KW=¤¿˜Š:™ïg&wÔv·5A^°yôÁ‘S¦þäø×ÿ¨Þ„b5?:î¹ë"¶x™®€_Ü$(-8ðy‘ ó½ËO+ªuÔG㚆nÝ"{ßL{7þFÀsî?³Žk=A—I@ôïTWWêXì‚ç´®Ï~±=<Ú1ðy-Ö° ¾E]_€ÖýÛÏ…¸ ‡ŠÂßã1€Ãº¾cà›\‡ ƒ Û¸çK×÷oÖ<ÔA~oV®ü¸x´àÀ/G]?ûû«¾ |æ‡êë¬-ËÄ8»¿àHPâe÷¢ŽòûåÍÀúïè_³¿X÷pÁy€Ï{¯Tôš4ŸqÛÜ£O¢ò€ ýUÕ,w¾WVêTQ¬¶Yé—=ÖuUz“ÞŒÊ[½·XƒIÃÐhg¥Oxj«ê`ón,Ö˜î7¿î…0Ñn§v« “ùïâë,-ÖP¼ÆŽ›_³t ºSÑmLÜ,NÔßïÎcU u}Åñ\ zLÿzSýÀ…§´UK‹‹6Š›­@Ãýpü±*šÊŸNQg, œý0þúòß•€Ož>üºv»+}––l¹eÞœ˜±OSÀÈ÷Ù!ç«Âu±†Ækð'Ì+v´H03˜‡¢Ž^¼qm€_ÈàÒ/€Ä¿ù?Vʼnt³Ô//Øð8ø…C€ŒÅOÿû½œn9ðë¶Êàsœ»/ ´Å;Œ¿Ä<»$ªÈÁ^Üõ…M€ŒÍ_–I0ö`1‘¿-ß뺀ÀÏæù×.”6õ&0ù†ü£EÞà×u ·Ë {4¿/.(-=$ûä‡'§ûÙ˜=¬ôÕíòº¼º.êM˜¼3¤£²`3'ÉÀ&"‹$@UPÞh!:Ö«‚ ÒJD& L@˜ €0AaÅdÿ•xÿ;½»úIEND®B`‚stem-1.7.1/docs/_static/section/download/openbsd.png0000664000175000017500000007571613340051401023212 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËbKGDÿÿÿ ½§“ pHYs  šœtIMEá 1´ Íó IDATxÚì¼w”éUæû{ß÷‹'§Êª *U•¤R+¶ZR«[sr;›¶=6àábÀ\.ë3w"ð€l`ÁÃàÁxÀ0Øn·ÝtjwPwKjå\¥ÊáœS'齜RÛfàbc†~ת?ªÖ:çÔùöóíýìg?ûƒ·Î[ç­óÖyë¼uÞ:o·Î[ç­ó×ñí ©·bú??Ûßñ@§“ÎìLõôÄÊ33K`RRë¼€Ú?˜ï)Pÿñ}åqó{ùþA¥r ^ë?„µÚ½ëoû×J`Ù±¸ëZv䘦i¼•þ7žŸ¹ó!qrîÂXa]onó}¥ó¯¼ †t°¾ëÏÈvÞÔêpRD³‡šs‹†›p]CúR"ß÷C@ÿ àÉ/MžQM‘Ûí7ªû—«Õo¡µÔ†£µ $$¢ÿå—¶,xÞ_æÙ®[ù«Õš†\oÄS)m©ÐÞ²k{á–·ÝÛ{ÿ?dAèJCÝá7¿ÛX)þB"Þ ‹%ã}›7¥n|ÛÞ‡Þå¬] £Yªt†éƳٜöýÁ é)‰8‘°-˵ºvl³þ!t?°$0ˆ¼£RÈÕ¨åím,tdd”a&;úûT–ñ/j+åmjËÒZjõûWÏMÞÔï4 g˜±\×àÐzÑòÿ“_Z=Ð?1n_Éñðç»,Ã.¸2²RI'ku¯ëޤˆ‡D–å$'Æ×Dz…¾ýŸþϪsëH…”ñ7‚ w|ÐÙ5îl»åj§M\”’R !„x ðØãGúX̵3©¸}s"™ì¼ÐNg2…Ð÷»›«ÕÛ+Ë+÷=üJ% ƒ³:À÷2¡çíܲíÚÖJ1zA·¡Ô‚lú¦ÜdÚÒbS‹«Ê/-§G»¥¹{ÌŽ‹úŠ('n˜ÊŽwå6G+«?U;uá}=Ccñ¡¯0ݘ“%e)l ù¿Ê[ïÞï"¸¿Ymü*°¹lÎqlÛ6 eüïˆÇ´°qÇŽ¾˜{óÙÄ SÈ.­Ö[åÅ©ËÕ¾¾­¦2n&ˆ¼u£.HÇÎây[L¢‚­ Çwœ°:»06šnz}2¬5¶ÕWV_¯.Õš{î½C{ñèûzâÕöm6Ó)N^nÌϬ2›HZ+›ÜS/¯lîܹíþìó{LØ‘H–fç}-J*%´4D… Æ éÝ•…âÏÕVV÷†~øh*–[öª¾k)ˈ Wû^C¿‰åløŒÖ¢°ebѱt#mû½y— ùô„2c‰…˳S•Ri&Œ‚=„ÑÝBÙµ|wg1›´‰Ë(§C½ÓÎ$Ǫ ˲>·Tñj5‚;Zºâ6„^/–WöPmvŽ9ôèo†ò¦¡«7mr2éõ nQ–Ul­VEmváŽé—_½?××ÕåºV6ÓIü²©uðW²À®;öÞT_(þRcµv‹¢Ïæ¢Õéå$–, DRD–#„Rßo.ñ÷® ü×|IÙtÊtcÖæ­W¯¼MˆP£û÷É~õ¿ê Bßü‘®dâîåÎtPP–Þ2?Í‚L/ú:¬VµQ-—WG]wƳ¹˜·4ŸêK£uh.OׯÒý}÷£Œ×Z•ÆhP.nj…º÷š¿¿K‡²eÓÛîØ›woÝßÅkÇË¢¿Ã_´X¾OXŠæòJF˜ÆJéÄ™>#•¾^‚1ùâ«®QÞ«ÕËcãñ|Ê•Ac–ÅÉåÓ‹áøþ]Ù Ç.ÞR-®î‰ü°™îH«ÍVÊV:6„DGBHC„-Ó4š¾J­uø¶<ó™?A•›{/¿tèO>÷Ìõ›n»åT½ÕhF +±ê+§vmزuôÚ_ø—³G>ûß;ÝÝÔMïÖCÎà¶MÉøÅ©ZW¹!ÓB©‘z­1Þª7㵊—^š/Ž{õZO>%Ômº9üƼ¹´Pé5u¸]û­¡òÊjÊ’¤[‹¥‘ÊÙÉí×l2:ßuoFæs¿På«OΘ“æsÅù•Bت[™ šV6‘/?¿/‘MÏNütma¹Ù±e“¸Þ2eÔlÍœ:v~ù§õ'S'_;õa¯ÒüHÔò R©Y7‘|L׃%$9@"hI)ê–%›¾ïûQé´È¥3=­RéõÅÅÛ‚rÅÙòàÛ/<óÇ\ïéé~ëß$„(}湓KO—<2nKÞ´¯  yÓ­T¼ÞJ©9h›:ÙÓa‹}Û³æ7çã…t¨.NUùð»ûÅɳY*æy盳κÅÖ±Œ¸iwÜ}Ç]ç®› r|(FIVÛŒD_^Ã݆³¤ šÍTm¾8\[^MY¦hÙÙÜ) ÒîËß[>uîCÁjõtcvõu7íÏ=}òÝ•…Êå\Ʋ‹æ'žxѯ4”Ä5ÂÓš*ø«a4<Ï ´Öúm ðªÕㆡ¾6Ä.Bý`ãÒät*xòôÅù ›F¼Õ —þÉï}׆ôÈ äk/Œ*KÉB‡É½yÆ7¤Üsë~ƒ‘›u}.®+xå5“••€³WyÇ=]=Y!Ÿ•<ôþd=$ 4REؘ†¦ÕŠðüˆ][l6­ïAhŸ–°ºÊ 3^êß||JlÜÖÉÑ ån¯î_›è_l,Î_†­)?ŠŽtíÙP˜›Ÿygëè»3á¦ñÉJKêŒ_j6‘"øBÏð¼V+ ÃðûJÿ^f€……¹Öú±^Üq¶dÎFSF[=wäød*“ª¦1\ž[x`åòÜå7ûî½µÃܲÁqWPÈZ¬ï·réïqH&®cÐð5¯/“N˜Ü{{'ŸÿÚ4¾r㞺²†)R£uÄì|? q]‰eHqA"iËX v¹4ý–8~¶Á-ºY­6• ¢BX^™º°Ôèé›’¦}jaa底Éù÷ ¤ƒ¸3©z;¯žjͯ”äkVÕ$€:‘XZ/†åF£ÖÒúI  C¬1Þ7YïGç·²?õ¿ÛsAkÃ׿™X&õç==ésÃéh{W\üÐðÖ‰íu?œòÁoT›Ñj¹w϶ŒsÕ¦´P¦‰çIü Ä04–% |A­ A qlƒr¹E2a_çrÓþ“sU¾üõi|! BAˆÉcϯräd¤?4[ŠH›T<ÉÁ×ë8ܸ/E¤#>r>ûSïÊt챕_ªlZ­4~du®ôîáÈý×%Õ½7$ #ÉÔ¬nÆ]ËÐBçu¤#D«Â¦ý¦ô£Èù¾ÇäûRv¿íNerúæ ×í[òáØ×ã×ka'–4š K£—ýŸùø¶Ο½ßrÝOüöoýù+Ï>zrËÞëŸíéèÙ1Ôån(—­íÈÜ»fš—üJ}ËèPR_»+Í-7ô°a0†ÐšH‚ ÒDZ#(C ‰¨Õ„†Èà½÷­çÙo,ñØÁ9Þ~ß ©6HæVšÌ,7±“& Ç/ÐJ£Ñ>Qåñç*Ø×A2.)•†úlnº¾@¯ÃËGW³§fZ{*KŠk6xß]q,¦—4V:M<”ÒS–¡M×z•2æRm֔ޱÅ€"ÿ3á¶ô ®·½JùÇšÅ凪ӗ ×øÃµzƒêÒÅÓ†m%¬0¬sfaÒî]w§Wo¾}éÒõÕÚù³G_[Iç»3©­=y•³,Õ{êäÂèöÑDχÞ7dÜ}K'#qš0 ÐD @©!Ú³Z©4ÊÌ.{¼øÊ"®ëd}W’ÎÎ8oœ(qäx‘LÒaóDÛ,=yj†®Î;6gÐZ#„$—,–Z|éÑÂ>ö#C¬VZ<ÿR™†p÷yú:MvnvÙ<¨¸v‹Ë×ÄY×mrè„ÇWVX(kß²%¨Š%Öy‘·/òü”i[Gt³µ"ÌHJe e„:ÒÖú{?nþ¾ mˆ‰#áC­Êê-~­6šL:%ÓM¶j‹‹BD¾Q]¬MìÚé{Mo°º¼²'nYݛ︳Øvoeµ±o¼×Îl»*k¾ql.6¶>)ォî>¯ÒòC„ˆ˜œnÒlE$ e@¤A(ЦæZ\š,óà½ë° ¦ æž|~‘SgÊÜvs™‚͹ -~÷ÓçéÌìßG”*¿°Ä™óu>øŽulÞdyϾXb¡T禫s˜¦Ä4=‡>!áÔÅ/<^åéWÊø(b©˜ö½–ë­^«e _?+µ:„ih”…‚ ŠÂï}ø¾`iyYïùØÛÏšcTgç¶ëfcg&åö'²C8ñJä…Q£QáØ+‡f¶Þrs­U.ð+µ{…P}­f°¥8·²µ4äþ=ºº]Nœ.1·PaûÖ<–¡u„m†<ýÂ2ç'ä²é´ 4}ÍÌœOo‚Í£q¢0D‡ý6ç/6ðûwæéèMñØS³<ùü< G²k[–Ž.‡f=äåë<òäWoIsÏ-=ø^D"fòâ‘"K+-®ϰ®Û¢é…´ö+§Ïm©/-derê@«Z·ïœ›:vHYH7¨—š¦›žœœ®îêïu{>øÐyçÍ=ØÝÉÝ·÷±ÿš£âä:L”ák´|ù‘sÜ{Ûq+"™³eS†JÙ§Ù èísqƒR1" ÅR lM£TH¤Û†)BiBŠD€i›>VæåWf¹÷þ~LCqy²EOw‚޼ƒDíôŽhw Ñ:b]¯E:í7!æHþô«ó9µJ_·K&m?и¶bã°C"fÈW^¯$˵f§‘° hj‘¾!Ôª²æûx„®M„ú ýÙg8ô;ÐQ¾4uos¹ø£:w¯Û8¶P¾4¿bÆRv³Tµå…ùÀÈ¢0Ø’tÍØÈxšB§‰«À±‘Ö4ëQ 1” æ…<õÜããi††S´ªq×`玻¯î#—pq’/¿¼ˆ†ttÙ,-ù¦M.Ÿ$wÐFš ”PZ·¾ LƒßûÔ)®ÙÙËÍ·öÓ 5ç/Ö@K×%pƒÀokVZGh¾i%4•$›1ˆÅL¦f=>ñû§X)ܰ/O¯ƒ& qGÓ•7XZ Äù E»¸Xí ñ·ûa0¨…áZq³iúA9f(SKCµý­RÉïɈà{€Gþ—ôþËÿ»R:©­VnïNÛëLNdÖõ¦íÎ.oáÒ¹ª! ѳaP•–ÊûûûÒù­ãi–¦åkÂ+w«H©†`n±ÊÉÓ+ÄâŠíÛrD¡&ô#L%0 %"DÂåÜ©™ct,ÃÀ`Šç¾q™f+`ãö.t3% B‹É™&±¸Àv Ûd©èã‡[7gè-Øtçcœ»Xef¾ÎúÁ6y´L0-MD†z-E B`&ŸýÒ Ÿýò-Ó¨DdÓqr‹dL $„!Ä\“ŽŒbn)àâ´Ç7u©TÒéš¾¼¼ÍGì‰LÃR Ç7m˜R ¤”ÊBR‡Áßm6øž‘Àçþð¢-7Þ²A«³;54 Ç\éïœ_òºÂP_´Ý˜ß31²­¶TÚ³g{.»cKÛ¤ÕÏ I$ ‚ DKŸ¸+8yºÌí·‘‰9-ª}áµVha X¦â‘GÏ‹¼÷Ý[8~|™ÇÊl.̶`a¡Åó/ÌPmz Žå¡ M>¯ì‹a†&2åPoÌÏ41•Aw§ JpqÚceµIooŠÀÓo ·¶O=3ϯüæqn¹e”îãØ™*ø§çyýx‰ž®8cÒh©BMw^Eoœ®pÇMþ忺“]{7A½‘-/ÏoŸ»\Þe%bëØÅ°¥µeÚB†Ð Z§®¡ïi0õòë­L÷Ð9»·Ïk,-îÛyU:–0äKæš8[VçJ÷÷8CÞݯ6 ÇABÍ‹xü‰)ê2}Ã)ò)ýëRôu'Qrm| DkªŸáÔšç.•‰ÇöìíclHhåyíõc¾/RÙô¢’æRèùž"ˆ&Újù¸žëÑßK4´–ÿå㿱còÙçîÀ½#>¶w÷ÂsŸûÜìÀ¶ÝÍéÉÒ`q¡Ü¹ms‡¼çîAê<òÈy^~yDÌd ?•wèê‹£\žjR®Ôë –ŠuF&:1DÁ7«€¡†e •Dû~O¤R6†”h-@ RiZžæÉ§f¸÷îõœ=]fi¹I.çH´•¼vMi—eÎ]á¿}æÏœ'›·Ù¶9Ã`g (~úççèèr¸íöQbŽÙvzÙTDi±ÂÌ©Y.›åµË<ûJ‰SZÌ.K Y‹‰Q‹/>ZâÇ?ú1Þû¾÷²{÷^V–W˜™›¡R­EÈ‚’ªøhêÝ ­Ð¯/ð‹?ÿózëu7t6KÅ÷{¥ÕwT.LmŸØ·×îںɯ­”7^>;Ó¿¸RWwß:Àõ7¬#7¹pa•C¯ÏsæÜ2!½=.ÃClËey©N¡Ãå“¿÷1צ0E,a¡”|³EöE¥¦Q®$›SdÒ–e¢# J Ú:;Í–æ _8ÇÔÌ*?ôC›:àÐ+³Œ¬Ï‘I¹kÒK{”l˜&ŲÇãO^äÌ™"×î룷Ûe~¾Êž†ˆêBjÊÍ/ÿ§—xûƒlÛÞ‰a˜`("pòä"Ÿùôküæ'ßàµs9œìVJ•ËKËìÚÞÍÛïÈÓ‘5yêà4Óó-èìè`Û¶mÌNÍpöÜK:f-‹•æWª‘ *tÐôé£}ý÷ÙÑ,׸úÖÛ«^µ<¥LÓ®..ßW/•vU¦·Çdclû–d|¥ÜõJÀ–MY¶í̲aCŠþ$~ôvÄééqpm‹'ë —Krö|‰o¼8E܉‘ÈÄp&RFÌÎ×ùÊWωˆÁá4¦Rе^¿MÕ…‚ ,/6èëO²sWy‡Î‚CowË”oVU!Ò”ÔêšÅeþ¡7ßÒG£æ±\ س«Â™€^Zⳟ=Åí7¤Ùº5‡°\æ&Wø½O>ϯýÚó¼vÄçªwñCúIî{Û»caq αs“ÍÆ YJeŸO}ö0§NdïÞ½\»o³³Ó¼qô¨]ªÕãÂv´åº%©õrÔhÔ¤azBÊ0ð›ßÕ–òw€;?òO;nýèÞñÏÿ™|öþ°º|ÈÃÏ<åÅ·õ_È%;N´*µœßjl.Î.Žvdì#Ú$Ɔ <õÌ$JhÆF3ôöÇY—d`]š®Î8é¤ÂvÀv¥R“©ÉUn»u”‰mÝœ;»À×¾~‰tÆ¡§'ŽpX]õøúcç9qb…u½Y =Ùö<8б¶´%@’BÞad´€k),%éêŽã$LmKB"d4J :;bŒnÊKš—êä²Iz»R( ÒT¼q¼Ä³OŸãŸÞkÒ¬5øÜNòûtœc'$ƒCûxàmïáxˆ½{wÑÕU`ó¦M˜–ÃW~ üwî_‡ãJ¾øØ%‚Èáž»ïfëÖ«hz¾ÄòÂl<ôZ¹–V1á&+ŽÔËZh_J)e„Qä}ÇÞï?÷ô#É™WŽüøå×ü䥗^Þq÷rëíwX=ÛåâÅÉЫW£ÙçÅñ_Zìß¼yÉvcã+3ó#÷Ü>$î»s=›'òœ9·ÄÒR“t¡³QR³%™Œ‰©4Q¤±EÃÜb‰7\Oq¥ÂS}…Û®iòáû³ôf"ce¹ÕuyÞë©7B‘J¹ DhP´( b:Ò,ïp÷'~UÏ|yQÁ!eè×ë£~eõê Ù¼6j6®V¿Ó+WÇu«uK½T½Éð*Ûî¿}À½å¦^a)^@G_ŠËÓ«4C)²i{Í‚u%m eXÄ㯼2ËøÆùŒ‰ŽhËÄ(„ŒÅóÏN±8_aÓD~qñb•žž,ù ^ÑÖܵ!%ÂvxéåY¾ôås˜BÑ¿>ƒë*#XËo.þj’i„lßssKuþâáóL͵ˆd–Ÿø‰çÆ×ò­O’ÑhlËfpp7ÑÝÝí9Äb IDATØüÉŸ~0¬qÛ ¯‹sül‘—^»Œãf™Ÿ_anòuî½NqÍ„ÉHŸ #k¨¥bرP;«Í@…¡öcq·©#IÃÄ0*¡ï7õÿ_^ðàñÿðËÞÉ矿pï'~éE3“=5³~­®½j5æK]qöw[Û:3r"ïë÷ïÉ»o»wPtæL¢ $ BŒ¸IÌV¬JÑÕa¶/4¢­Ì Ù¾ò )ÉäbÌL×ï$_Ä„í B­xé•i¦/—¹åæ ÜtÓzܘ"3È&Û+wߺt'ÖÀ m‹å%óV©×|jå&™¬K¡ÃP¢Tu[g–|ˆ¶©D9^KоÞ8^3 •*°uÛVâ±Ø›Ÿç8ccc\}õÕttt¼ù><ò+‹“Ü~`uÝ…'ήòÜ‹g˜¾õùÆW¿Vm›“™¾Þ“n&3c8®7‚Þ[öu7îÉòÀÝÃÜ}× ¹‚Ývè`Xá$…¼ƒkƒÖa»_ þò&…À° úzd³.†Z „ ]»#0l—f³Åº¾$Çòtt»ô÷ÇÉlô·8«Ä·(‡hTßxvŠ ÔìÜÙƒR&RJòùöx™P#¤ RŠr#d¥XÇq,Lt!…RWïègÿu;6Å_>þ:;w^ÍÈÈz‚ Xû¼vƒù­(•Vyü/gyá"~ߦöéƒPë­ µTB‹²i>¡Ž”ihË7"?hý“£ïíñ¤t˜Öjêò‰£µ•Kse&?ÓÐf¢¼¼šÞ<žïÚ‘G(¿Úž¢Ë jžF*ah¤m·h·_B€0$( h"ÕZBã$ )J"”BÓvÞÒÛgÓ¦ɬMäG„>è íÐk_JÉ•±ªí,¿¼ÐÑápÕÖ]=)r‡¸£0ÐhÒ6(®z<ûì§N•èésI¦ð4±˜¢PˆÑµ.O©´Ê£fq±NDLMMqáÂE&'§¹ti’••eÂ0$™L°¼²ÄoÿöoÒ×ï× †ÇÐÔ[ŠWŽ®RèŠñ÷sûíëßÔdž‰>ÎÌ¡׋lë-‹Ø“3­Þºç9Ét²µ¢š"žŽ„VÚÖ©À£ñw¿pÃÇ~ÖîܸA,žŸ‰žûø/·‚0N,µê%ö؇ú¯Ù];³-ÿî§O½x0Éø¦ºí~â𱯼¾Hg·ÅÖ‰ Ã)R CZ(@ˆˆHø>ˆHèˆo¼8ÃÉ3«ŒŽf¸öÚ~LÓÄ0$B·­à‘¡L“0´ÿ&×¼ámŸžDíÁ‘ aØ„š‰«rÄ3M6+¦…4¡¢”Â÷áÌÙŽ™#—ŽQ¯øPÑÊhK’>„¡O«é“ÏÛÐÃ#ü/¼ð ]]êõ:Žãb™&õ†Ïõ×ßÈ}÷ÝG¤#|?À²"4!Bh‚(ä詯²øà‡w°kû(¶Û‹2R€æÎ;ÏñÉO>Í#/žã¡[þŸÎò‹PÌ<þòêm0p•iTE • ½TÓ^jÇJx!õÈoýU‹Ùß:ì¸í¹óÎ{s³7êJi‹é‡ùdÏhPÇ Ç‘ÂnyQ&•¬¤»{’ —f¯Û¿§ÓìO!‰P “H*޽1ϯýú3|ñ˧¹xa•–'h´Úe=@sî\‰ÓÇ— IWoŽårÀŸþÉQ¾ðù38†Ãôå2År„a ⮉e)–êœ:]$ô5Ù\ !U;MË6Š«>ÅbÛµ0”\“}5¶- lÇRG†m’'4ÒT\¸Xâ¹g'ql‹-yz»b¸Î·Ì!D›aœ<]å«\@ë{îaßÞ[·ÄxÛ݃ìÛb¨úº5‡¼ÂW~’¯|åIŠKs\½µƒwß×O«á¦ÿýóì=ãŽ;6OnDD½´šD.=Ý)J•:/¼0Ép>âÆ6©„âè™–1_Yñ[¶ë±žÎŒW«”B¢ÈŽD¡¡ƒ@ßî4þ[g€uÛw¬›9tô÷•W¿®1{Îs;z¼„uóŽ /Å\g¾8»¼l$K^yŢ֎ξ„éEká}ÌP°~C’ÿëg¯fl,Îoýö7x쉳<òõÓŒu00¦ZmaYŠTÒbbK'ÆslßÞÉ»Þ>ÊÏÎ`¸—'Ë\¼¸ÂütŠ[nÄv]š€O}ò(…‚Éìjº»ÒíŽBÔš'?Ç‘#—¹ùÆn¼ia„DÁ•ÝÞºB.Þ$šîÞ>¸…L&†iùH݇H¡ ˜1›l.àgz;n›ä€kA˃° †!”–Êü×OŸäWë-¿Éö-Ý(i’Œyz}•bÓgýHËê… MͳRœBŠݽ½ôõu ­g& š1®·øà})þÝT³µrðN‘IÜÑš¹¼b§b¿iÄœWÃFeÁPvÕ´ìf(ÏpWogƒ¿5îÿ¿¾ô #ãt& óªíÖÆqK¨˜q[£Ý·Ý:Ä;Þ³™}ûûxä«8úF‘‘ñ;wvQ-×™š,14œåÀuý–€P²a´ƒ¹ùA ~ògP«UI$md€h‘É(ö_7ÈrÑcrªN"æw%R¯7XYma˜1t`RZ©‘J»oö„B¬µu¦I†mòGÔ àvZ(Ñî^d¤ˆ´D^iY‘øµ}©AËC" MX­ #4DQˆ!™¸âG>°S¯ÿÞ žx~ŽŸøÐ0BI¤²˜¿Ü Kaª ¨U^;ø2/½xŠ×¬§»7$áÖ°c§.H ŒVÄ]ûbâÏo‰Ã'[‰R½’p zNòGRù®NËI<µe‹ºpìÕÔØPuâýo¾úþ‚þ[—€/ÿüÏû#×8a¦² µ–öÏžZÊ*­Ý›÷wËïîW7ßÐåìÚ‘ÈŒv™Ž„NŽxõõ9j¼þÚ­¦Ï–M9 “˜¥É¦mvìê#ΞZ •0¸îº~®½n=ë‡ò(í…JA:cµXçs~‚nì%_pÑk~;e(jµσ±ñ,ccilK"‘%i4<.]lðŽ72º1K2é€þ™xMÿ_Z^å/™¢ZÕttÇP†@hµÖ†h-Þ”ÛÞ|Œ¸²Ò)С@G’(|SgB ízC¨#"_ã(ÁÐË…ÉU}b†][ ŒlJñ•GfIwݽD* ,ò—¡Úl±sg¹\’C¯Nò_8ÅÖ &Û7H¥1¥¢ÜмzÊgÛhœw>°žj]wÍÎÖ&ÌŽ|ÆŽ; éyõZ±Xs::êËÇ/h'—ý»)—¦O{™xî`”é\8y®æ>p6yäØŠÛhDŒ gÙ½gwÞ;Êuû»¹çÎavmËó¾÷Œpï}LÐÑe¡$è¤-H±~ ÏôT•ão,‘Î8ds6´|´é˜H ¯½:K£±i¢Óh+;BC,isæT…(ˆI`šm“‡ÐÇ5Ù0œ&_p0v ÷?Ò!a™L].qèОÒÕ'™0¯t;ßrz­»¸Ò©ö ñ[ªH{¦¨¯4€h"„nw-ZB,aàX&GO¹x¡Ê½7òèÓs„¦æºë{ˆÅL.^:ÏW¾ÄÈpŒk÷çPªÉ“OOñ䳌÷ nØéR«·—ac1ƒ?ýz…Û¯Éó¯þíµ\wÃfÙ¨6âÎÌ-.ÕFÍt:׿}bØvì7šåÕV«TþÎP]ZÔ^³I,Û-ì|®ä7½ÓåróäbC×){ä\ìõ×fIÇ:;ã$/¸¸È(Â44: AK„h+nJC¡+F2ëpôÈ"¯¾:Ë@šLgbmä«‘Râ:IrÝz .J^õÚm£× ±LI:eaª5ö·ÛnL‰Þl ¾í{ C"„$•Ž3±µ‹žêµ­â5=ïÍ—´ )Z´¹ƒaKtèÓþµUÚú¹"kóæ{´[“6H¸&§Ï¯ðäÁ>ôÐ8Ÿúóó¼ó=96mÊáûu>õÉó\8ßäž{×±®ßä‘GÎò›¿qš#‡+l0¹~—KH«žà™WëNŠkön``C£cÝ¢3ï˜óÓ+O_Þ¾<·¸½83]lV*oÄ3Ùà;Õ4 w½ý”YZùp®#ý`¢#£-7V±ÜTja¦˜?sv^üÆÇO®P¯ †’Ø üˆ(Êa¬O#…D‚DÒÄ4 ._*S-×Ù¼µ´•74˜JQÈÇèîMb›òÍ»³}Á#’IƒlÎÆ2å7ïÆµàbXè0¤Zõ±] ¡D»¼rWG!Že˺¤&êŠ7@ðÍϹ"&­i‹È‹“lWcÛ&"ZS0] eJÔ~ÚþYS/ÛâVJqìè GN”ùÊ£3d ’ÿ‰^LYã?ÁoüÖq¦ç¬VžzbŽgžZ¡XÔTëõZH.¦²ÍBž{½Å…™€w¾m#¦í‹ÛŒw±c{·Ì&…ix•D­ÔØ[óu¦ëÌ~7B¾æ‡XŠZ¥Ë«7¶´*Õm~±¸©¾0?à5ë¦øb¥Xçcó¼ôò%ŽŸ\&²éîu°Þ¬¥í;1é˜HeÓÙå°aCŽþÁ<‰d[ꓪ½oweçßT⯪ÝZc*‰iÈoSÜ„€z=àСy¾ðßOS¯UÑ‘&—O~KzoßÉ‚¶ÉS®ùÿß,ñ†Bš ¡£7_"S²°Ðàè‘Ejõ€®žv»‹ò™[)•Úý½¡Úî¡6ü&h-Cã5[|íÉy.L.síþ<ÕrÄ'>~Ž¿|´D>Ÿ"·9öF‰Ã‡+LléáÇ?º›ë®ezÎã©ç&Ù±)E>ÓnaÿâéV\·¿@gÁfqÙãâd…ÅùU2vB¬!ffkÎJËéOæ²Æwõ€»³³RuÝ/Õ§gÛ©ä&'»}uzú.¯X´Û1éïs‰Ù&Ï=?Í¥É"·ÝÔÍOþÔ^C!Öê°RŠ3J¼xh–d*ÎŽÝtuưÝ8ÐBØÐB ˆÂ¡åÚ4ï¯æ%ýM…ò[9 !!Ó3«,•|}A:ƒ(hŸÖjúuðÊÃt:jß¾AR¯H4ɤMè‡í×F‚TÚ¡£#A:­ˆ¼aHü–—ëœ=[áÒ…e\;âÆûËÒ(úoŽ›C¶nÉcZ’ZÃçôù"ž§H¤»ø¡¤Ø¹³@.ç䉞zbš=ûz¸ãÎT+˜ªÀ¯üÒ"_xºÂ;oŠÑ‘1Xßcðc>‹çf™u ÓcþÒ§NY]®súLù𣓙ä²òƒúw€?zç;B`XHmž8<Ú?Ülr"–p'®ßßÏM7õÓß›À0$¾öyúé),Û¦Y°WUŽBZ-OóôÃ'ùä'_¤§7ÅÞ=ƒô÷$8yªD,fóàÛÇÈd͵Rª¿íο’â!?hr¯ nhÈ £i::¬_Ÿ¡ÐáB]IÈ\¡l(ƒÕ’‡R7¦B"´¦ºÚâðѼVÀíwA¶‰]‘p 6ç1­CFh-‘ ¿×AJÁ…‹+œŸ\eb1ËØH¦-LEkG¶ýŠC}qŽYœÕ¼ï]ýìÚÝEww†L:‹RŠm[{èºj0?›¢£c”ë¯w9v|НùI2ñÿä¾Ý]ŃEÞ8¾ÀɳMÆÆM*ÅS+¼úF…Ëó^¤œøë)Sÿ‰W©=ù7àG_}Aܶc¯]ó‹ÿöߥ6Ýw·Zºx±rþäåxrxKí™?zLǼÙ\Ê_ê®Ì.Ç,íîÞÝÃ~h Û®ÊcÛ&ZøG21–Ç÷51×¢]Û šÚèíŒqÏ]£ôô%øýß‘¯<|š••ˆë÷õ†í êR©N.›þöÔ¯AX&HÁôÔ*~ã«+†›4ÚL?j_lKÂèH¸ \Iåß a*ffª¼üòãc96Ndˆü¶j“(2éìŒsÒ*hN£ˆTÂ@#‰¢(jKÏé´‰çk6ŒdŒ3<"lúß6J”2°­¶a}µ"Ù²¥›‰ÍY Q?QP@5®Ú&9{f‘……&ñ¸A6ÓË 7læóÿýyÎM«MOàðµç—i¶–Èl“Þ…’ðV²l:ñ˶iýšö‚/†aÔü0èXú?þÂ/ß½râÔ=N2iM½p°&5¤ épõÈsµ;0 .êá@º'9º}sº÷Ž[zÙ¾£FD~ˆFzMzºbkiº½Ö%Ðh¥}k)ܾw÷%éèpùÂçÏ2?פ\õxèýÛÈç¬öbçÿà}šÍ€“'—yéÅi®Éý¬K%×б–!4ÄläÚ~ÖÚ@‰pÍø±Fë )°LÕÞ:Ҵ뱸bó¦ù¼þ7äye)#½6d߬EF±yc†\Æ"“x ¡%ÑÚãlÐ’dÒE)…Î_\æSŸ>‰í\ÅæMY„Ž££aBOJÀðð¼–‰ïHaÒQ(°®?ÇÔü%&çb,¯øi†ÓËF1¡š^ñÒn*ÓYŠÅ¬K–ä5ÂðQé†Bÿˆ'’ND#BÉía«ÕW™žI#vk•«&ò ¤üL b¦ívv¸lÏÓן$ #<ßJµ}¶a+DF–¶k¯i‚ÔÊušž`ÛÖ>† |aš×^æäÉ"×í$5Ák~»T+5J ½t™o¼0ÃþýØ1óÍè!@JôZÊnÛ{ îkÊ+Uºz¨µzLQÈ;ì»¶ËRè ÝÒé Ä1Áé´‘h®ì¥\‰³–ß$¨è5W¹Ö„‘ 3H§Ú³‡01mEäk ÝýõF‹V°a8˶My>÷ÙøžæŸý³뇖‘z‘0ì!ÒH$â¶¢Õ²ñ£C™ŒoÌóg‡NS¬h¦æš–]ŠÇSgC¢(4ω»«JÉÃaÓ&ôýÃh½r…Äþ]ÀM?õÓÑêÌå¥D>ý¨åŸBK?Œ|Œ¡¤3СÔĈkÞvSc;;I%,üZ@èG 5† 1cÒQ A˜/Ô´¢v [hròä"ŸŸayÙ§·/N.gp0K­ÒâŃÓÔë>kï°Ý< ‰FcXµZ‹0lúÿx{ÏhK¯ó¾ï·÷ÛNo·×iwú`€Á`• @R$H ¤liQ¤[‘%ѱ”ı㒕x­xYŠcy¹„IËÉ&ÅP,{A`0ÀLÃô¹enoçž~Þ¶÷·÷Ì€´%Û¢•|¸ëÞw{î:û}öóüÛs`í;‹8vÂû,¢H¿§!@`,‹ÅÅ€Ûsu*})<׺{Ÿ sp+Á z@‚ѽÉ@þÈï‹»…æ=íÏoÒ$Œf¨Ñº~D»’ÉXIC+a­Úæs¿s‘O}bŠ¿ý·Ž²¾ÜäÔ™%¢8bj—M¡¡µAÅb5@‰"Pñ&­ö,§Ï^ãú•uîÛ“æ‡oµV~Áb™Xm8–µd¢h6îúßW±>‰-~¿úV€ÿíýw€ó ”.þÂoýÖñ[ßúΉ4ò>Ýl8ñn÷àÕ­‰w¯ÔúV7ãìÃdždÿ@:U¢"ÑÓ-Ì·™_Y%[LѪvi6º4}ëeé4––꬯·ð<‹'žHãQDʳxìÑ RžMµÞ“Ì¿a7 XL!Dòñø“Û9p`˜n'&5ÆKä «+m[>»v—pQ ,‰ãH††rÜñÍ{ <«YȞĢPãXüHÃ]iØÝŠÐ»rdïÐhcRš™™.Íf—‡Ž•A&9õ¦!è{h„m»2üÿú ŸÿÂ5þí^c`Àá3¿(Èz>¡ßBÅ£è8laÉšf§7ٿãZÇ‘9žÜÒJù :J©*‚!åUƒîA‘=™ÛÒ s9¡×köù³Ø7òùÂf*9™™ÝÑÊd]ymýÑ3WkA%= ™]„e#-‹0[Ú!˜žî°}²ÌøhŠx½Ë¶a—_ýK»yõõM^øÚ iž|<¤Ph Y$Ž0m6kËœ>{“­µǦ,V«mßê=Ñ@˜ÐSC˜U jƒ1Ú`i° Jêÿ4(Ø„abü¨”H9EK‡1VÚNGó¹B)-T²ív9cƒÃyê?Œ(•R¸¶‡—²ù…Ïäç~þVèÊázNoÆwZÙkô~øâ ×.78t`¨gzã{/¸Aé¤áë)?-›¤[îËÏ»ØFüXShÙ`zâa‰G5Ø{H¤¤ÑTœ8±ÂÙÓKLnÏQ,º …,“§ÿöLiÙxi“ô ˆd|#¬CŠ„(l¶gpmƒÒŠ8Ò|ó»ó¬®×ù_Ù…ßÕÄaL¹œ¦œw¸v­Î_^Æ÷5Û¶»¤³-ºþ2‹Kó<ÿ ¾ø…ËxºÅûî-ðGßkèNd/¥=gÙÓB¬˜Ç˜­Íf‹Pt¥±Ádc:Ú: t»9­¥2ñð½;Ëžm¿_tßµ…¹OAº¶¶%ÓK=2ÄÀHޏ#´b ßåÀ=|èCÛù¹¿xlЇž Н¿>Ç­››h­)—3¤Ó‰þþîE ¤Är,6]æZT7›Ë)J•TÂÍ߿ōwMrÉ]lÛê•s×üu#‚Hà¶Eb4½óš¶ Œ ÕÍljm9rmI›Öš×_[Ár•’‹-{W€4t#èúIÊhap,0š(ÒX®¤¡cþé?;ÇãðèC#DAŒR "Åþ]&&²|õ[s|íë·i¶Qd˜mñÚ+«|åÿ¹ŽnÔxö‰,ó+Ú¼|º éy‰¨ ¨#V„aÉh³ º*¥Z¾M'^1ݶOý™A£EWu£®?°o{A×Úžå¦Þ»Ñ‰æV»Š…þrªïÐÁAv@·CŒ%ˆ0F&1M™¢ÃØXއa×î2gÏ.óêË ô÷e™ÚS~ï”I¯c“²Ù¹­ÄÎeR)¡}•T¯òã°¯øQÆB%ݽ1aiÂX†q"Ù6I7$\‹óÖ¹qk‹RÙ%“sæ=ÌÞqFÇŠìÞÓO©œFGƺmÍf5àÖl•NÛ°kª‚ÝËž`úf“ÙY׳Èå{‚Òm‘œ=¿Á׿5Ï_xv’½;3„A€AF1)ÇPêËpáZƒ³W¸p~™W^^äùf9sj™Ã»\>û©~vŒ¤øÂ··L-rê9/=c M›– ,EƬ·ºíVè7Bhþç)‚î4¹—¿÷úuàº[êó¬@äw>pðÄÖêzÐl…SÝf(èø8ã€$ Qóqm—Œ•Æ4(Ô÷ß?½‡'øö7gY^êðî…S»sx)‹È7lÕ¢P1¶ÍÅø!#ƒFG @kŒ’?&7¢ß MÏ "‰´ËÍë5 möï·“Ù»×Ìõ÷§¹ôî&»w‡ô÷eï‚DÉlâÈäŠP] ÒJ¦³0»Å•Kë<ðà.L¡m’ŽÐñX¯û\¹¹A'ÈÎ ÐWJÔTÂ-h4oÚ èvyàH™( ‘Â÷àé(6ÌÌÔ¹ty‹RŠÇŽö1\±Égƒ}.ƒ1•|Èwß Ìôš ¹ü"±éCL[@S ÓTJtrcè˜?7Qhr±YÂñë¦ãÇ¡ÐÁV1]­GKs‹µ126‘2{«ÉÌ|•å<4ÂöI )’TDƒÆjk¬Œàé޲8ß$Œ ÓµðÒYV7ª¼öê<;v•Ïöd¼‰ÚBþ{dß׬­µpS‰çO‰,E§Öá³ ŒŽg9tÐFÇ#’9d(Í'?6E&-þ]Ù\â, `$ “÷žË¹9:ÀýGÛ2h¥‘¶ÍÒl‹ÛÓu¾ù+rPÊ¥ïáÉä†Ò$‡(eèÏ;üÿÍ} ÷§"#,„I$)À2‚ŒëòÔ£ƒü¿:Î@^pc¦M 5—nH^y˧^ÌxÉéAW !ŒèL[Ú–Ž¥Z©?GU0Àûÿû¿kþà£VñØTëËÿ+ýùá¨ÙÈcžÉ%nÏ׸re‹‹ï®°s¼ÂƒGF:A¼¤ÈÞªFÝIÛš©Ý„å²¶ñ­o^ãêå*•ŠËÞ=E„¥ðDü dÏùËqX˜©sõê»÷³Ñ*m¡µäöígÞY`jßQf¦ëLNï‰1XÂ"›K®(s'üéÎw©ß³‰^D1¨(ı-0àzÄ€2ŒŽ¥yòé1*ƒÓ×7ÙÚimtȸɭdŒÂšýÔ(}ƒ4[J´‰Fië9A—ÑAÉ¡Ý9<×beÓç[¯Õ˜^hóég3\xçzS tªÕjl·-§k!Öµ2¾P&D'7O± IDATFÚÝdÙíŸÇxâÿÒƒÍõÇÄÆrÿùßùµñª}éLiÄïlìÞ\oåÏë€àóçØÚŠ/ð7~ý(Ï|`鼃ö#„I$Ú¸6«ËOR*ÛHa˜Þä;ßc~¡ÃÃOpÿ‘a*}tÔĈ÷7âGÑŒ;NŸXú/,póÆ™t†‰mŒŠ‘Æep ËSÏlgnvƒÁÊ FYIn„e£#Fõ¬¤Éœ|—R–£“¯Ä¬dÞC|{Éèjzz“®ftÐcðÉžxh),#z¹B¦wõr¹$+ŽB„Të6Z)JíND©’¡Ýñ°…M.#01 T$g¯(¾÷F—›³qŒ±·ãw}¢¨q8›Ídmá]O+–´,iy[E±Žã—Bý™À3ÿÝûÀí—^ùY)÷»!ùœeî?ìâØÆÊçíýûÈ…Sì/2¹½HÊKÒ4M%à2o½9Ïk¯,ñìÇöRâí3üÖ?:Ή“ ìÙÓOÐ °1,¯tس»H±ä¢Ã„Â5"JÔDÚºÛš[04šáð½Ã8–G.—BE:)§„ôõ ž~jg¢'KÄ`ÙÌÌuÈŠ.•ti§0©lr(‰ýKB×÷©Õ££Yˆõ]s‰1½áQ ¤°0:Fé¤b˜Ð µ…+Ýž%„Dw\Pɤ¢u¢?ˆT‡ÿåŸÝdd8Å/ýÅ1F ;w¸ ëë1YOòÐ=9là'›œº¢âlep#›vn‡~Уcg¤+ÕZ¡ÄZÛ¶%mÛ¶U«ƒ½þÌ‚{žyzÛÖíÛï‹»Áh·ÓÎe3 Ú§\öÑ£CrÛdžÃ‡û9tÿÓEúô{§òXnBR¥ó:47ů|z’GŽUøÆ‹«üÛo,ðÑ'ÊLM:~Ä»×Úœ8»E·RÊË„+·äâ¹z¹ÓaOj¨Ï2‚­ôºÑfÁQ3†Xk[‚Z‡BÜ(ÿ¤à+ÿn<ö7ÿñùpæôt·¾5²±XÛ.a\1f§3ûË:vëÄÊŽWÞXDJÁî©?6ÁO?·‡ý;³haøá·oò¯~ï<®m¸÷àF vïÊ3>ö]|Çõ›.»PîÍìJõ1ÁÂí-Î_§o`ËIaÙii„•X·VÈ;‚ Ëó·«<ÿüUÞxcŽÍ6íZ@Î xî™{' ×gÛœ<±Ì±îäè1 Gjòy‡û 2µ«D:í&忇4h¥™kqþÜ,µfÄV=`p +&28¶ê)Œ,H9r„¡à7—Éf`rgúF‡•ÛÕº¢TðСä¡c”´xóõ^øÞ*>˜grÄA:šnl¸pÓgz®I7Œ®ÂNJ5Šífs$å¤ò&&|´ &6FE–%(­5?ÂYÿ„Màë¿ý·вpÖréLdYÎZ׆ï=0›)å½Fsk¼Yí8ҖܼQgu¥Í¹s«lŸHókŸ½ŸåUŸþ¾"ûöf°=ÃÚZ›±á,:–4𤙒=³è{Ê gg¸tiš……ßúÖ îdïþ2¹¼¤Z ØX‹¨TRô ç—xõÕYÞ9»H}«…Љ‘4Ç><ƃ‡óLM D«Ê—^¹…7Z¦ÜŸ°‰&R…¬K1ï%a=Xü޽¼TL³Uípc¦Æ'føÈGö°mlÇ’t;ŠåÕͦbû®ï h+N¼¾Àµ[u&§Ê8–àÝku^|s“RÖ¶`n¡J_)Ã¥K5ªuŸùUŸŸÿH…#{,Ç Á7^ øá©ÈÄn¾64˜[T¡‘ŽçÂÈÀ`ba øB(_k„aGQ¿'KþÏEZvló¬Wu}?•.FòÃ}ýºÝ΢ ¥bšçg?¹Ø¸uk“µÕ€5Ÿc÷rÏá,l©QÆ¢”÷ztkàI©?2öé^g®Ø¾£H©ìÉzôUB±RQ·E=%‹ùsÁîù«ŸÒƒ©L©zùò#*Šî޳=Ú¬îëÖêS~×w*‡§ß?Á'>±”¡VõY] (U,ú]dÚK¸H%lÖ˜H÷H“ÄY£ 8žDEqÏék0HDpð@‘˜éT¯,÷:ïRÑ£ÏpûvÏ}îuÞxcš¿ôé{ù¹¿°‡‘±Zh¤e“ í*ŽÙ\õyõœÏû?t€GÛ†›òÐQp·P !zò½³¨{j!!“Û LŽf9°¯ÂÒ|‡äqm›C¨T²ø¾ae­ËÂR•Õ.ÕMŸK—Öùk¿6Åþ©"ûv°¿cY},¯ÔYXêððÑ g/4XÛŒ8#¤œ·(%"˜N7ÂÒNÆB ÙPÚ@˜- nm¡MG *åßÙ>ò燎ÿ•Ïj¾ü…”ëºee[Å8 µ Â9+•jZFKGË8Ê¡5´º”r¥),A¨}üUŸ”kc÷¤Ö¢× ?b~±C¬ ï‚0¾Ë_'¸®ÄIy8ºgv½£ì XtAzüñW®ðÊË7yäÑ1~é—ïgd¼ q£5ZÇ m¬”Ë_¹B®ÔÏG?v€BÞ¥ºNÒ=×ðÔPm,l[ÇúÇ©q«‹À¢RISʸ¡{À‘ûF8‚!ê†l6º\½±ÉæF›ë77yõÕ.ý}‚>2ÂİG£€4Ô6…B†#Éþ)ž:Vâú­õF„DQ¯G̯D4Z¡Uè뻹]¤m1omƒn!ZB?ÖqÇQü§Hýľ€ë¿û;fÿ>K…i툋ÝvûŒWê{-»mÛÄM[ÚNì÷}ôƒ»1*&4&2H;æÒÕ5Î]Übh8G&¤sÑ£Q]X^osüÄ2fÈý½·þ^é5nÏvˆÃ/íü˜áF¸6ÕjÈïÿþ.¿»È¯þê1r?:î•Õ{Š…t\67|~û䨱 Žáæµ –›”Ê.éLâ_À¶X_ërs¦I«'‘$ ¡0 “Ìý$Ha"?B‡1Š|Ñbûö»Çó xä36JAÉc ÏJL©R13×åüÕa7Ä6Š”g(d Å4d]ÃürÈ÷N¶ÍÓ÷ÙN«íç•6È*Bl:)gEǦÇq+ŠýPëHýiIí?=üÃH!„Þó7ÿEæúoÿFçOúçó7@Xí½VXß~ÀP)¾ÿúLkϵ«5öîÏ#UŒp,H^|yž(²xäÑ DJ"ü8yb´Û¡ÕÑ=¨6Ë]õJûK8š˜ïÿð‡÷q_)…g‹^i6€ÍÊj¹ÛU*}ivíì:Œ°,‹÷\^‰Ðàô™MnÍÔØ±³ÄüÌ_þÒeÞ3È¡ûŠ€dc½C­ÞåæLÙùcã)Ò˜(ºëÂÐ",e%j!£îö/‰\kC°Òl„JÏ}r’`Œµj€Œ#¢PabIÚ±Èf`n¶Æ['»üÔã&ÇlZÝ€nWa£YÜŒ¸½1Úgóè!Ox–ʼq)Ú³Ñ2N½z±UÊfò7ŒtÎÚ~Ër„FI)E¬”ÖÝN÷On1òŸ6×Ó¯~î÷Gïÿ̯mÛùàóÙ+¯Tö>ñìŠÎgëq³ÕH÷™vê¶ Þ™½4^?«·èZ!Âuìœã¥\egœ h·Ú«QÌw_žcï}G #óÓ3MΜ©òé_ØO:#¨·š@6íb;I>_«²¹Zgû¸ÂÁˆ8‰m׉PKA­Ö¥ÓéØ`D¤{•BP¯u¨×۔˩žŒ;ÑÞ½gÌÒÉ ïÇœ{g‘Á ÷™àæÕe®ß\ãÀáJ2òë›mÞ>µÂµ›[ds’Þ4…Ôw¼‚EÌ¥K˜Ðæ¾û*82±‹™»Ó X–`~¹Ã‰·7ض-Ç“f‘ ŠI¢()aAFû]¸·Ào½º‰ÖŠŸù@‘\V#-E«­¹:0¿Ô!Û|û¤ÐB‘ÉX&gØQ­ù;|#’R.Á—Ý\ê¤PÜ2QØT&òÃ0 ùVàîø'ÆXÏþƒ´³9{û‘`yá!³¹ú蘣ö¥‚fd©85hÍWM£jÒ9]­×ç:­à¬ŠÝîá{VwTr-C®ž»–GUvdÐ ªÕBÐéræÜ Õ啲Ëüt‹Ï}î‚PòúksÜš®2>ÖÏ#30L7nn°Uóyø‘I7Žd³Úa³ê3ПáâÚ.Û¶é´‚0"ãÙdÒ›F½K£î38˜BÊ÷2“¹2é…:¬-w9}fžš@Z’}‡øõßx˜RÙ#cK3µ¿Œv$®®±9Q.å4RZ`õHÚbæVƒwÎÖØ¹¿Ì@V&‡zˆ A¦%ÂÙÛ5›Œôrð`–ÆZ$•¤”ú‘B+ÅÑ>üÔ §/ÕøÎñ&Ýã±mT²º2»è?4ÑJËm¯¾+Û­PdóŽ_*§T¾€¥5N§Õžt³©ç<‡ŒVׄ֒2úŽAM']pï<÷wÿ–óùÿÌ>Õlü§SûÅñ’êøá4G÷æpS)–3Զꃗ³ ÜŒa±«ZU£o´-®8^j:ß?:—ñÊÓAdþVõž¬Ðû<¸7 ßy†gz¿ó»gùã¯^äÃÙÃúZ›·ßš¦Ù yâ V£ÌÀP†Í­õÍ;w—Ø9ÕG«pîìçέ°¸Üæ¹`|²L£©X_«óöÉ æÚ<òèGŽ’"¦¯/ÅèHþŠÅhŸ ‘Â%V‰ÝX’ê²Ïù +ÄQ̮݃8nЬðēےy?6Da„ëÁî9þâ'v2s»ÅÆV‡Ár­bMŸF+d`0Çà€ƒŽ ­­ýÙôݸ;){£lhص­ÌSOŽóÂó·8ùÖ÷mO3"…F!e²( #1|ä±ýEøƒ¯®°°Øæç?šeyÃg¹&âÜÈØZ_y¾³Ymx}qÃvÝvÐ ›Ùt¹&magÒ¹:®Õ§ÂhA‡*¡]cY"’2Š´Ž5`ì¿÷å“{åK/ü”inþú¨×yâ£8<}¬Èø° “³ÀJ¡ŒÂò²¤¼4QèÄ’«³Aî;/-9Ý?²°6GkkµF&»½Ù ‹)1õð¡Rá¿øôn66|¾óÃiŒp¸1Sãoÿc=:ÀÀ@_þËûX_kby‚r1Àµë›LÏ´¸÷ÐàñÍ.ð…/œ§ÑùÐ3;¹çH?/ýpšW_áÜÙæÐÑ ¥²‡Ž# C … “cžLîÿFKiI¥ât4¶ Ïϳ±ÚâÞ{ûH9MLÜcEBK ¿-4÷Þ3È=‡ð<‰öÚAÄë¯Ìsc¦Á®Ý%¢(&W,.6›È`9’ÈWllµ±¥¦Rôps.‡–¹önž¹ÛmΟ¯qïÑV€@#¥E'æÔf+@ñØóW^z£Ê¾ cÃz®ˆâ¥æí…%¤ „%k‘ß­ ¨]¿£”nY–éFïèIˆ0–HÇ6ÏÝn,c¿ùü÷¨ÏNÿ—e¹õÈÇeø…g\riŸš‚K×%ÝFÄží†|Á£ëH,[c;ÇîÍðÀXÙÜœiqòÜZéíw6K«Ù;Uæ§žãÁ£YÖ×Ò©]tÈ_úÌ>ŽÞ?B¥/ ýˆ¡J&©CJ¢Úšó§ ˆØ³»Äÿþ¹ã|ï»·øð‡öðk¿zŒLÁ¥ÛmsýrññÿÕgfßþ>OàyNO(bÓlŠ9‹Ã»ll§ÍæºbzѲ5•s7;lm¾ÿÊ ùJŽ|!ƒ%,! ÂIX¾^‚ˆÇ[$¹F ò9É“OM‘Ê-±Ymñõ¯Üäô¹Û¤ó†ƒ‡ú(\j[ßùÞmff69rÿ ï{xˆÁ~—§žåÅ,ñíW9°¯ÆfuËç{?\"“²˜²`E¥`xö±)¡ùÎñ&n¶°s…îÀP±Û]])ZƘ5+F˜5aLÃ’"m¤Ô­#aD×h é)×U¦Û ’1°P,ý_›ó‹­Äò“ϔطݰÙisy:fnESÌŒ 9‡F[ssI!ìäÍE¾&í vN¤yôáAßO<8ÂsŸdïÁ2"ŒI¹°c"Ë®öì#íÂf€4iC¬„ ó6×gª¼ôâmŒ‘ÄJsþÜzzŸþÌ! y aˆ‚ÀøÐ‡¦(S4[]Š¥ –éÝËÂâk_¿ÌÕs׸w»KÆòXÙhrêì&Ŭat$ÃF-àùo\ã+|…d7v?ž¥1F¡-جÆ4›7mcYЬD¡&•±= ´ÁŠ©½9Ý7Ìý÷²¶Ù"ŸÎ1ÜçÒW²ÈxÏ•DFóÎ¥M¾ý––ºìßS¤Rv¸z½Æ@_ŠrÑæä™UΜ¯röÒ'Ï5ùÖ‹«¼qªIµ®é«XÜ3•¢’lÔ"6›&ÒÆª:Ž]Õa¼)¤\5ÂÜF›e¡Í**®ÆZÔ4 ²%cÓ–‘îÄ‘Õmuuèû•lA+j7?E±ZXWê•“›Öùë1'.("•æ£Hîß-Øhh^:ÕäåÓuZ-,XäÒ2Ù­£!Š5Q¨Èx6}Â@؉âÄ “¨,¡¯ˆ!M_sê\E¹â`¥N¼>ÏïþÞEN^!Ÿ…O~bŸúôÁdU2hÃøD‰á±<§O/òÅ/\æžÃý+i6'ß^æóÿúmJf•gò0"ÙòÕh‡ŒØè¸Ãÿø÷ßáåã3Œçø?ÿŸ¡RñÐqŒåH:-ÁK?Xä¿r™ )—Rœx}‰ëÓ5ÃÑ]X &ŒqL¥ßæ‰'·sx‘Ñá4Bit1<œâÞÃ%Žd¸?ÏÛ§VùÃ/]§Z)÷§‰B‹b:âðÞûwVxüXž°D£qüT•¼¶Æ+'ë,¬DdÒš‰+´³²¡ßJ5m¥nk­Ö¤ʘue¢š²Âf'ˆÚŽ­Û º]? Ú¡ëJ„ÆD!4ïŠÃ¬í<°sxÿ¾¯Z¹Ì-ß+ù—n†å·jvÆkKA‡w®kæ²ì²˜³r°œ^s#4ZÄÜÉÌP=®\Ý[°˜¤oI©Âàû†l1…–‚ÿõ·ßd|¼Èž©<‹sþåïœg~n“¿úK÷ñÙ_½ŸŽB¤Ðaòš†D@!Œ@¸/<“”—âž{(–2„AÌïýÞiN½q…Ÿ~<Å‘}9ÖÖ‚v‹WOµY[íðü·fø£¯M#DÌoýæÓ¹gµ•éžÁu»v¹rm³ç™™®³¹é³_‰mÛr˜Þ®¦„åU 4JâÒBMÙX‘x…J¼À‘°mÌåÁ£E¶æ8w¡Æ÷_œåÂåùŒbr8‹k ,"t°k›ÇîYê-ÃÕ™&ç¯ÕÍù[±Y^×ÓÂê+Øùf˯¸ÅRlrÕT*³Ô !ðcTàwu…Ý( ýX©(Ò¦AKA÷Çà`«84P«^¹ù¦¿Õ¸íeÒ Ž›ºÑ¨K×f;ú{o¶³'/žRŠ'•xôþ ý%›$Ý#ë ,» B'êÞ‹ÞI =òD¤qöl¥%}}. Ku¾þÍ›ä2‡îÄ÷cÖWš{hŒO}æ0“ÛËD¾å%|cîxýzÁK®Ë['¹xq™'Þ¿ƒr9ÇëüÓþ:º¹Æ½SYŽŸmð¥ïmqâ—Þ¬òÒ‰µ–ÃÁƒý|êS‡ùå_~œ¯~õ:ÚH†úÝdJŒ5N6ÍèH²xúøñnN׸÷È(»÷ ¡º]„ÐÉ—ÑhNJ£iwb.\ÝDIE®`ZÐI,ŽŠ"2ÃÔþkŒÁs%~¨ÙØ hvC´cxýµy¼„½» ¤-ÁÁ}ƒ<òÄ66·|¾ñµklmŒMp ßÉäëm ³mþàÿ>Gÿp™ÇŸ%—uxóÍ%VÖÚô–¨«¾5Èö½»Èôõóä“üõ_˜Oþì~¶O¨m„lßÙÏéÓ‹LMJ!{ÈžÔŠBÁb÷® ·çê\½¶Î±cÃìÝ“ï‰Rîh L²¬Šäø‘æÿó³Œç’k — ˆ‰’ïZ³±æsüUVV»üüÏL05Uâú­‹×¶xß‘Í3Ïì`i±Á­[›Üß =6ÁèpJÞ%ëI”6ä2ù¢‹T ËäsZÄü“ß~›x'÷ß7Œ-ô]ß¿ÑÉÏÒ<öî-2ÔïáZ½iK€%9svƒ×ß\`v¶I±àÐ7š¢Û ØÚô™Ú[ _±qLŒŽuâ*¶“×¾z£Á•ë[”‹6{wzxvÄØ€ƒg <ÇÍhW¾ôíM.ÌY¾±2·£WL¬ZQ˜% ‹Bˆ9¸…”×R©Ì ©Å8ˆa‰X B‰lW†­µÒòIt•цHƒÆqG+»mDÔ‰Tª£ÛNÜîn¤\¹ä¥R³‘ÙXÙˆœ­F4:=݃•ï¤Ì¶a‡8TwW«&DkM¬ – éŒE«møÂW®b;.c#®]]ãø·)•=àóë¼òÊ,ï{tœ§>°—™› Þ8¾ÀÄDŠTZ R’«Wüàs¬m4¹uk‹C‡úyßãär.„ £b¶ê!Þm²¸Øfûö<ø Ç¿²ì“rÓø]Å#L29â!ŒÀÊÙ#eb “JáwV7ZtZ1鬃í%?בôxx®Å¾;Û§nóø#£x¶de¡Ë`¿G³æ3=ÓÀ±}åDÀG*I4¹¾ÅÒJÄå©×ÞPcIÅf-æ+ßßäÅ·šFæú¶RRÎÅA°•ob¸mŒ™GëU!ÙÒÚZ®‡~·%¥…1>_":AFA(þ”¥Rvè‡QlEÚv!Œ§ƒŽ60hà–€´Le_‰¸úqÇñÃfibtÓDÑÜrÛ]»|}ñé|Þ*~äé~RŽ@ ƒ±4­ ¤Óô—ÒtÄDA«0\±I§*ô9z_Ï~d;†ˆµ•SÛ˨X±´P'ð#Ɔ³ÌÌTùÂHï=7IDAT¯‘M;£Â;•áô©E.^ZÆñ¿ðóyàÁÑ„ZZ¤cpÒ’Ž2?WåàÁ<ýå+k-Þ|k…Çã7þÚýú2¡–Å¥wîøDÁ>‹ÆF—W^Z!øÅÏìÅD1"”blУÿcH¥ùý/^âë/LS)¦Ie%+Ë5‚ æÅ×–q,øØ3£Ü!›–ìšÌ24âÊ6ï\Üb|È%"R¶¡Z‹øúk|ãå*Õš/*Ù(²…ˆ1¡²) ª…X7°¢[q¨CŒ%%AJ:Â3FH¡”6FûÂADZQz`õ:w£b¥TˆL²tHhii-„‰” ŽUM¿#ƒîÒÐÞÝsÕÍ-ÑìÄå…Ån®ÝŠåÎmÜ”ÍÛçÛø]Ãèhš0HîmÕV\»Ñâ÷ÿ膹1çëJ_Ú²R<öð¨xäÁ!Ê)´¼}z•Å¥ï{ß8'ßZbi©ÅÏÿÜ~F†SI¼K ù'ÿøín‡_üÌ~~ú£»)=t¨ÐJ÷’9Àuœ}~¾N½°g߯½6Ëòr‹‡짯â‘òæôlf¦k¼}ªÊù‹d3†áÑ,íŽâÜ… T¬xä‘!t'¡zÑÅØŽaçö<#®_­rárF3"å„LMe‘N¾µÆk'WÙØòé+Ú 8Ôš>—¯7YZíòÈýy¢0¢Ý<ÿÒ_ûÁ¹Œ ¿( Cmº]KZ›¬YC°f#2¦Öl´ü0Ì­B„òµŽ»üÈÄ¡Ò*ÖJëŸxcH„2A™( µ‘Q¤t:jû­ à:Ʋ—¾\¹>Û)ßœnŒI~ ¹t¥Ã`ŸK¬ Qhp›P%aË«!ÿê®ã”F¶¶ÚVë­3Žˆc{ ?M¥Ï£Dœx{•™¹~ 8svO~b7ïÿÂWi¸9Óáµ×æøäs{yú©ärÒ¨1l$ œeí–WÚ,Ì·ÏòÒ¦Ù³»Èþ}%b?†8Jܼ 9—tÎåĉÖWìÚQ¢®\Û¤¯lsøÞ>dlP±B 6š0ˆ±¤ar¼ˆ0šw¯TyûôQòÀ‘ ë§Ü^hqöâÓ³-ú+.SÛÓLÏ68q¶Î÷Á¾{|‹óÂ2k›>þd‰÷ß—"Žbg~5ö"ãT3)gYÇjæ1¦D¦GõJ)GEQ#"ŒbE~7ˆã0ú~øVEÑ ­”‰-·¤‚ÆŠòbS¹Ö±œpy½3píz½8¿Ðq‡ûmìËqíV›¡Û³‰TÒgs¯¾µ.´]\IeóKÓ·Vãå•vªºÕuJEtÆåÄÛË|ãÛ·˜Ÿ¯qè`™_ý•Cx‘!ì*¤-˜Ÿo30”æé§wqùbé@¹h#{ýF¢ÈÑX¶DaXZl³¼Ô¥ÑðYšoñÓÏíHöþ…!Z ´€86¤›ª TÄÜLĶ-®^Ù ÛòyôÁa_cY¥ô¼)¢Þyg‹F3bj{š+W«¼þÖ ãÃ)LeÙ1žáàžÂÀñ·7˜]ì²gGžœ'¹v£ÃôBÀÜ²Ï /®«…Õ@¥Ó¶è/J±Ü"ïI¹²eº±ŒítjÍ ÖuÕm[[aº‰ünÛ€o@›8ÖZÅwñ×ÿèæ°Ÿ@cTÛà(˜L¼²4ÓžœX‹+«]ws+˜LyÊÉe=R)‡C{Ó4»1í¶Â¶ ÝÓ—,Wu½½Q[pm±àùï¼³”Y]h¤ç/®qîüÃYþÆ_˜ûŽ â7B”IF¿4ìÙ]¡o ÍïüîE y›ÉѶ”ÉUcÀq,„•¬š¯VN¾¹ÊÕ››ŒŽæùÐG¶7‚^гLÔHT¨q,Íà€‡”6ׯ5PaŒ4†zµKŠ«7j¤SPÊ'¶3¡Aó¥ç§ùþË‹üâ/ì ”wùê·fñR2{b(d;ÆÓ¨Hsêܯ5Ø¿+O%oó‡_[âí«Sk»[™”·âå‹ÙW[–Ž"!£HI?T¹PØÚI¥«RëM£Uh[DZ†ÊïþäëcbM Ž1ž«L&+Zëí@lT§·Ú»ÞQŒœ9³4¶²ÚyjÉa‹…UŸÙEE_ѦÓU|í;s¦# ͨÝ]×ÎJ¹¿¶ÖƒÅåzåô™Åô¹ +h#yò±I~ù/"# Û‰Pt¤É¤¥¼‡ã8¼}f‘Õõ6÷—Ég“n–-éúš…¥ÂJèÕ?úâ»\º¶ÁÇžÝËö K—¶Hel²9j¤î=0,[P*gX[ñ9uj•n'fçŽßçåã·Y\hsÏþdå|jÒ)8~b·N¯ñèCÚ“ca¡M£²k2K¥ìP¯è8f´Ïe³ðû_™# "Ž.°²Þ¥¦âT®x[úÁ|_y7»°Úq×ê"è2üÈ #Õg„•qR©@H«vöFjŒ­”Êþ{0ïÿ练£H¡òTÆ´hF{y°)l·ë·Û#:ò' ›{sܸݥÚÐLÚ„1|ñ+·DuKoÙR®£ëA«³Pì+ÎZ®¯7Æ‚ $rxìáIž{v¿Û%'Z}­“´®(ˆ¹5Sçø›ËÜ_?C9t¬°\ÃK¯-ðÂ Ó ôåÊrâÄ7oÕùkŸ½©5ŸÿüURÉÄx©5Z%ªÙŽ9iÏ•LŒ¤9uz™o~o†={r|êç¦X[øþ–±„bpÐÂu ® gßYçêõ;Æ2ìÝ•bçhÏv®¸ä3’n£µÂq¡ÙQœ8»É»7[¤Á¡½ih+ªù™ íw7ÂV§®»Ý%Ñí\uK•›2U¸ÒîF ÝvÇ€·Sî€ã¹+a­µ(lWÛ±ŽS:KGÆí±.ÛÃCº 0ëÓëÁäÞ=kZ/¯ÖݸµéåÓ–\Þ”ÜáÐß'¸2Ýâµ·¶h†2 Ž1fS+µQî¶ê[{üvk›V”Îe¢J_†|ÆÈ¡¡4錋ö!6´"Rš\Þãõ·f¹ôJLŒÈf,6«>_øòU®MoñÁ§·3Üï±´Ô¤Ó¿þ+ɧl^>¾ÀÊJ›|Áel8KDX6Ìηøƒ{LFòð#T×ê¼úú)׿#š`Ïî2+ËM^|õ6ëÕ€÷Ç!JÃï~á»¶å™ÏPÎI¶§(,T£ãˆÍjÈéóMÞ8U7k56c·»¸Ô–{'™µ|g~5Ž‚€ª´­M *„Xªõ٨ݙõçrÊõ.dË¥yÛsÚ~«]ð"¤ˆCäéXùÆÕ1]ýÿû¸Ó$ƪ«k7¯µ&ï_#•6kkíÑsçV+ƒ}~¢?œ8³Åw_ºMid|ChVã0¬[–=߉ý¡v«þØÿÛÞ•õXv]åoí}¦;Õ½5tW·íîv»=&2Á™Ü@"„ AB¤¼ ž@BBð3€§bC €1@ÄîØrˆ;íŽ{´{¬®êª[·nÝáŒ{Z‹‡²1$ÁmÑŸt¤óp¤#íýí½×Z{­oEqœì?zï+½;]¾q3w_}i¸d CÝ~ ý a/3z).]-ðåç×qßÑ<ÖF«­ñÒ© ÿÇË8|¸OþÂ}pÆaa!ÃýÈQô» Zïu{ùå._áýïÛ°Gœžyv ç/Žðàý}}—®ÍðÉ_|í£œ7èvc €ºôX=aí†Å3Ï]Å‘Ã-ì_ŽÑ[èàÄó7qs³Àß¿Š;–2$ >´€C‡:8°¢Qç5:1âHãék8ñåMt[1î?ÔF18ñoC|è½ XìE˜N ÖÖK<ñì6þè³ëøâóÛM,g ‹»««Ë—CQoiRüÁÎÖÔ­d‘Ϧór¹·µÆõ`̈!SQ4a¡‰(š‰ø<„PCÇ–µ ܰRMR±kdä;ì þVPÏf¢ËíéxÔ\·Gå“Xèì«%>ûùâÁò–v|>Ì!˜ÆYv³˜Ž ³´¸ºzï±ÇC^¾XìNpà¤EYKÓÅ4~òé-üýç×°9,¦]´—€¯~m„Ó§G8t¸‹_ÅÆV…¿ü«s røÄÇïÆêþeUÂ.À˜fFšiXëqêôgÏoáC®B)àɽÆßÿýô»@5oÐm+,÷cçá¼ xALŒÏ=µ†“§wðƒXE1¾rjû—bä…ÃãOlâS~O¿8Æ•}¤‹…¶`8“&mu7}U—™pÀk¥$¯Ý ®šŽ³ì³N÷‚x?Á"!÷¡.µ–JD7Á«ZLk|0Ö:ë¬øÿ²è-ïúßz@Èç¥xއÐê/†³ð“Ÿý—­l6-Q„³t#ØrÎ" û0‰Úi»ÕY^H{½Ë*ŠOm_~uÖ]^]aÏ›œ7/=ä7~fµ5+->õØ¿ÿ'g𙿻,Ç?x€··sµvsNMåPÛ g/ޱq£Â£ïßë]˜¼†X†(À)'€Û­qôp†V¬ð܉-œ93ÃG¨‹ Æ0aÊ ¦VpÌpNA Ã{·×..ºý€GÞ½ˆåÅ ãI‰zj=°ˆuñ‡Ÿ¹‚ñÄû¨Ó7ÖPr`IÇ?úH ?ùh†Ï^Û´IY4Hâ¸fïgl'JÿSéôËNe‹u”ãÝ¡ Š¢ÌZ)@¹²œ[‘y¯Tœ©Ä'´ æït®n `R1ì×Án]¾¶uöég'ç.šƒIàî~÷ÝPV×J€¹J¢œKm[c.GùÖÅvgÐK¡¢tŽ4áù…ñÔ¯þÐ{ÚòÔKm\Ÿê ‰â^šö‚祼0ËÁ6ñîšÁWNl`s{Ž¢YÁ¹KsߨîAh@€ɘˆF>¸ñôÚÍË®±–ëy¥ …@¦Óï×¹“Áx8Œçë3uq2 —ñ4 ð¢RÊ‹—<íõFíNtìùÛì­ïøÐêFIå“‚»Û_ŸõO¾²›=þ…˺ÛÍÐmGXìt0XNѸW®ð!`4,ñü‹[Öãä׆øò ë.ˆ„ \U© ÖÉ^ „¬ÝãNoa«žç׺K¼5å}»3s?ë´•LØ{CDã*´×¯Ï|“]iÞ•7^-¤žírùæÈëX+XHÙºö•R¾V:.”RšY‚W"Þ0#Äû–á–àÀO§ž~vÔL«ç:ƒ¥M[V§Ë­. wÁ P‹ÈHD†Þc:¾±›VZY‹Ek†-‰³è¾;-eóäõÝf¦uA[{IJR“økeNïšV»3#ÆÒÙ,IOÇJyRÜÓi”Š’ýÖT÷ÕyµÜ‹c¼v¥ÄüŒѱè8›µË ΋/m'YÁ8 ;3µÓí´v¢D»ÀaÁk>¨Ùµº+ÅþA„;\…FH¶‚±ÓX©Òº¶[T„•H%J‘žÈÁ¼ÓŽ’+uH×Ï­ÓÇçóú‡ ov¹§È‰< ,‘ YDΈk¼÷‘R± ì}cC0Ž™Â[=OúVàÄoÿ¡,=|1}mýB¤£s;¯]õ€$BÄDT2&‘ís¹wìHI,ìïÙÍvÖ«N¿·`êúç¶wŠ%§–>MÆí‚I `¨T´÷»ÞæùGÆ3³X7òÅ`ñ2±¥V´Q×ã8â‡%+?û‘vöÑ÷¦xùU+’t‡í¤õj’¦Ã€hºº’vqé¼¢9©ìr¢£5%j¥‡Q’NcMñ½±ðK`^(:{-±Ž.¥ðŒ”¾Ò˜Æ9ï ‘UJU -¹Ù– .Z•Lïß]•Õ I’‹Zë`mCD‰.4uÓTõÆ k­µÎÕŽùõ†Æo1n© pö3…¤µ¸?(»Ï•†”̽·…±U0 ¿ÞViŒqûézœÁµÕ{ïxegr¾CJ¬C[V£c~T_ûò3“ÙN»ýÍ4¡]Û4 Š´™±ÇÌk±yPg‰ –S»XÅ—#`‹·ÞŠžæH“f‘ ["t“9)5"}®òÉÚpÞ|¢pÒk¥JzíV!‚Š€ŠöäYvÓ¸ý…ÆU÷ÆY"±NnÜT€"³z–ºŸk-ôVütU—ïZè,½`ªÊ‚@¢µÖJSÌÛª Á7otº¸¥€8ŽUÒi«LM±"Š$@mŒµì9¼Y÷Õ|ãœ3éè4ÓI«wÙ'c' U 0)›É¨jêaŠØù%aél*@D€°kÚÊë0ÛÜῺ¥^Û¬©ñÈãXmz%MDÈ7¶*SsgåICÅA& Ù¥À7ÓÕa®ö=ñµæcƒÀh(G \˜‹”â‹!M¿§™VL×=d K‚FGâš|6ì,.>¦ýÇáx©ˆt Þ«~ð!!ëSlúÿ yŽïY8ç¸(*O„:Ž#—¥)Y ìá‹k-ÿ÷Í*¼‚IgßÊéÝ«Jµ‘=IÞà<Šcc›òf{yi;"+V›v–×D”“ ÁˆH¶‚åaU…§^¾„÷.µ(`®µÚaæ „*éZž7¶.¦?µ²^§›­ô.[ë@4eáQaæ(ÎÎ\—ã¬p_GŠ…ÙÈ.ªR&iö{cÁ²×Ö‚C£¡|STÆ‹ëƒcwý3Òìšç³=ubª™ÅJ8”„· úíø 3 3³s>૪òÞøŒÿÙ}ø‘GÌt¾œ&Ùó®¬F Ä´—·V…Cê_{òÏgž8áz‹Ë_áÆ]®¦S!E œX&”zÉT8øÙÜÿlÕpVúè|¢â³Ââ™+¢5ìÄs¸WÇI+ŽÓ“ê{o‰0‘±æ°‰,Ýò‡òÜÝS7l“îÂv~D%@»¢°‹`oäÛåv8"Å 7n³­\åËݼ‰|4eÙ@“©&_)-ÆÙ™ç7&o1ÔÛD4yC” išùö\™Ÿø½ßQƒûî9~ü¸±¯0³PH Bš²,ýG<´âÇÎüë3Ÿž?{„9»"¼+æ¡ æ·ÖþÖôWk•ñg¯l–¤T4–í½æ ˜ FÀÙÞâÒ?¶þ†@/¹ÆŒL!˜(=BàÖDé¿×úfQ7]¥0& '¡"^$°cµa’Z¦,næÄTk•uð’%Öû¦TZÏ$ÐFfÊrS×ÎVáíÚ"¼ƒñ/¿ú› `òú“ úû—"/≅˜kj`b•ȇöÊL§Ýé¦Iˆh†’ Æ_…`í¯´?$÷$ŸOvŸ‘ºù°V‰3±rnbQ“^{álc]S1iZQòºî~¥#Š­a³p×_¥$ú:ÅÑÛª†L„D Ä‰ÂZ¼e[¢B»›¨ê²FØ#°ß”ÁEN¼J¼ ©Òu*‰Äl ð· ð¦mJ+%™Râ*ÚÍBäò±aÁƒE€X¸ŠÉ[åÁéP1[*@gÿþik49YÍŠ)5¥(*%x† „H%qLÃ+£›¤•ÊúÑL  JÁÀ[gv„åó­N+‹’8ñµ›€ К£H(ËJ) fÓæ[wÂo ,¬,¹Â6½Õžw„ ð¿>?Dà¼ÇŽu¦½m*WUµ«QÆ7õïËØÙŒk|‚7!s,ÁM€ÖÁpEÙV„}Ì\#è—öZ‘K ¢Y˜ëÀF§DsЫ…0UÖx“s ›²e#Žâ¼Ýë­ãç`öÜ\”λª1ƽ¹|‹<ër<(äV[üß³ø¦1)lB{"Gò­¹I@É{×öõäˆæ߈±Xè÷ëÎ`0–Ó¡±5˜ •Ê5qbÓÌ›™·¦ñ"pÖ$6Ô‰m{ã*4o¸fXî¯Ô‹Ëû¯›y9 Þ98(ݰpeŒjœ•×W÷;ßKø¦`ðw¹RLQb:5¿÷£Ö íI¦5ð¾$âª1ÖyëÁ{<×Þ¡öª7ý·ª̧à(†gëµÀÖγ¶5òNTÂÿOhMKív'NcE‰  š: ÔÎZçÝ·g„A·ÛY¢£8ò>ÓÖ¤ÞûÚ³·Õ»M€ï|þ È’¥¥8jlK¹FÃûÜ ÿ]좴xì¨ßXùr›ïp(EĬ h¨ù»\µôæWÜÆmÜÆmÜÆmÜÆmÜÆm¼“ñï dGiÎÒIEND®B`‚stem-1.7.1/docs/_static/section/download/gentoo.png0000664000175000017500000003756513157571677023107 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYsÃÃÇo¨dtIMEÞ Žµ, IDATxÚì½w¼¬g]/úý=ÏóÖ©kVÙk÷ìB EäØ@å¨(î=×®÷€=4¥(EQ0ê èµ]‰ŠâAB ©B -J²{]kíÕ¦½å)¿ûÇ;³ö¬Y³ö^ »$è|ö|fÞwÊžõþ¾Ï¯|åþóöŸ·ÿ¼ýǽQÿ 3ÓSþ!âS½çÛáï<×J}; {ÿž=Ááy˜¥ì[ ‘ ç)iâŠÈžóÝc ÙÿÄST y¿¸åúå­Y‚Kr󬣺s4Æ 3Ey €,2"taQHjJ‰Y%é!Ï7ýè‹/nÿGCÿZ>%Ðÿ±·ÝxßT«i$Ëèbmå v0Ó3˜i‡c"f &‚„êýYì¶Ä B—ß$Â#RðQßÃAå¹;ËÕü«/øágéÿ`xÒ€ˆøÖë¾"µæ±$Å¥ÖÒOäš¾ÓZy¾aÙp,³ ABH$@D+‚'"½G Ñû“Ù­³éµ•àƒÊãG¤ÄõžÂg”'œÿô(¿èÓüí†'%ú?êÓÿþÅ(Íe^šfâ%™VSŽÕ¸cé9'Á¤ Tq—JA !$<_Àó”,àÃ†Ö ­œspÌpŽÁŽ!¤„ÖjX‚à /{Òξ"%ÿ‰ ºÇ.ÙºôòöÛ O*ôÌÝwÜã;æ.ÕZüd®åOj£vöf JùBqì¡\ñP.ID‘„çS!tÌçPܹ÷èÖyÎÈs‡4±H‹$50ÆÁ1@‚0ذ3dœ'Ý’çñ=ž‡ðºóE/Þ¹ÿÛ-b:§`„ f¾®ýßÝçd™øAãäod¹·Õ:Ÿ |ˆãccÊeõ1…ñ†€Û4÷¾Jèëß¹÷£Z-ƒN× Ï ²ÌB€ÀpÎ΂`ÙW–=Ÿ•‚ÿ¿(¢/ýØ‹w<øT“DÄ×ÿÛ[’Düt®ÕËsí=Û¸$¢\‰19`zÚG£!àûÅO´öBfÀÙ0Ès‡N× ÓΑfÎqqqØÙ€`à)g|÷þ>ŠéºþÑmŸª@8§ "¾ý¦;½åüx–ÉWçÚÿí‚2#„çEˆË%ìÜbËÕª@Žz_¬ö€ðíàûíí`{Ú€O"ÏijÐí´;9œë¡ f  ßãŽçñãˆ>EâÃ/ø‘-í§Îvó<ôÙÍY*^›çÞÏç&ØnAzâ¨ÌÛ¶Å8o—ñ ‚ïì@=•ÍÎú‚²C‚·ƒB¶£ÏÙž¹°ë˜„þ{ÙÆ2²Ì¢ÝÖèt5œµ(HØ@’…ï¹¥ àÛ£PüçÑ-?ô£[²§ Î:ˆˆoøøí~·+žm­z_šùßm8 @¨Œ‰É _xa€Í›‰=ŸŠŽPqÝÙ11ƒœ£á²[ ; ƒïµ#´ÇaÁ XËÈ2‡f3C–kA˜-ÀžtøîxÑ¿JÞW¯‰}ßó¼iódÂYñ'?zkUõ?òÜ{C®Ãó G¤¼ªõvíŠù‚ Je0Fýîý#f3h]a­þU¦Ã–GhŽAs0‚U@H-š­ιâê±ÁÂSÎF!?x_Šÿ¯/Ü<÷döΈˆ?ù/·Lç¹÷Æ<÷~93q)BT±iºÆO¿(,V½‡þÿ\pnv´àí:àåG ›ƒ¿ûZ„Ñéht»9òÜ€{Ú€à É! \øü/QL×¼ðE[ny²‚àŒ€™!„àO|ô–‹òÌ{Knü—æ&D ¥r;Ï«òÓžî¡Ñè)úÇ@q!Z#à@8%ìú¡$»ÕŽ"3åÝŽF7Éa{*ƒá È“QÈûWW«òcÏÁ¦C:·¤<ñÜÿ¾ÿÀ³´VïMóà…ÚŪµzƒžva™wíˆãoe+p ;$ìUÇëÁpÝ­À®0<Ì7 Î0²Ü¢ÝÎ玘]Qt}× Ü—è=“ÁÝ—]Qÿ€[o¸ Ý??˼?JóðyÚŤü*ã \üÌoßþ¸Tþ†€°b¿íh08WÄûÎ Þ®c†Ã!íÐÓ>`´qHSƒN'ƒ±Ü{A_± }÷X\¢÷—«Þ?=ïùãÍ'í~ÚpÇ-·Ðò<}gž{ïIóàùÚ•Hù5LM5pñ3cÞºXJœ ÀÌLäF`Eð°ëù n-‰dÌÀ*sÐ?Ç»ž6è¾ëy•DJ:„¾kE}$ŠÄûè…Sß|²Ðï§wåß1»»òœ*å~àC@ÀX‰\+ÙêˆËº]þ‡…yóêÏÞ17!¥àsi ÔéþuÿvóXžÊ+3íÿ˜v¤*cbr_ó–­qö`bb$H¬Ž0¤\G0¯ø‘OЧ‚O,æâKú» ŽŠ·8꣯ø° B()$…6p΂Áà„¶ZëÞj­»ä¶›gßAD»Ï•98-&à¦k?¤‰yW’ø¯ÉtY@”16>KžUãç)›¿±PÔY¢Á¨À˜Q¨ã‘¯—Y0 ýã^úÖ1ÒT#IrëzœC Fà[Ä!.émÕºúÜw}wÃ>åLÀm7Þ!òÌü¯,S¿¤u$@*Õ1<ýÂ*oÛN8WÂïÿ‘B€¥è™ƒžêï«ÿQf`å>`Ö¨ÿ“ÑWÿ‚Ö…6ˆBårßSB°N ÍÚ]ñünÙ\²/½óŽã1ŸE£ ¾•ÕEDœuí òL¾Rë°æ!ˆªØ±³Ê;v øþ“!Ü„`’=_`ƒ—CBíƒb={žÍÇÐk+ç1xžày¥RˆÀ÷ €cÜ(tñ´v›ßÝn»ß½õ¦™štÖ ð„}!úÚÛ·¤müFn¼ -‡P~ ӛǰëï['yN£‘#A,bQØvà úÂf°8ñÚŠŸ0ˆA¡'{WøŒÚn W ”@)A”#×E¨è˜¡-À)M8v¯wŽ'>}ýÑ+‰èèÙð ž°¸å†Û"ò¯j-ÿ›1!AD¨Õ±kWÀõ'áµrõ…Kìy€ï÷ (¥<±ÚÅ`D Ö׃ŠVÔŽ!­Z8„8ö…>¤ `°N"Ie©›Ð«t.®¾ùÆc—l¤Ñ圀ˆØd¸ÔhñK¹ñ(BW±}{Ó[p6=þ“f ¬aä#MAiÒ93C*F‚ã¸\WkàZ EC¶}0ü«…a5ß_p44Åk„ ðŤ”$W@fŠº©øÙ4¼áú#Ï]ÎæŸ\Qñ-Ÿºm2MðÁ$ñ~&ÓUÅæ­Ó|és+wç€,cʲ¢¦À÷}›šå nR@DWàû 8.4ƒµ`ƒ’h6AZ&‹ÙCæ!Šx;¸º¶`0ô\)G3¶!X°+˜CA ß³ˆBw¯Ø·—Ëâúç=ê´jƒ'ÜöÐ#_¥},>Gçô"m0ùˆËÞ¶=@­öD2{§ï¦5hyd4!.K¥¢èÔZP«ã0·¤ÑM •K "’Dð¨kUPAÈ—ˆ˜:‚s=g’Nøƒöž p û>ÄS¸â? ˆRI‰8Ь¢±p Xfä`à¹1ðÞ6\é3Ÿ™ý·¼`“>Ý~Áã€Î5ösaÂ9ü¡6^ÙÁ‡R1ÆÇ+4½Y°”çNþ:fg™´!žÞÄBb"6 ûÈñµ¯/б™ã¬„£R ”b“SUTª!Ú‰¤Å&¡ƒ'DQÌ<½™¸Ùdš?NHÓÂ`Š>1D'È @ 8}ò¨¯gûŽ% £8fH!‡>’LCkfÇÚÝ„.Š˜ÞCpå[o;ö÷D”ŸN<.mà,~Ühq±c Q\Âôf£xëgïæ07,,;w2‚@r <²;§Ï}á0šAÅ¡ÄÌì2 Xgì Q¯V°yKõ±ÕJDÝDñX¨1ÔjÄžfç@öÀG„}f°¯«µÀ°`Žƒ”=ÐÆÀ9†s„¤Øàm 'o»ý臉è´ÕnÌŒýØ Þx¹þSÆÊ’ƒ!Ôê&§¤Ðî= VËÀWq`aò6Øuál:[ÛˆÛ˜'Dª‹F™Q­0’´‰´³„ÝßÜC‡ç°Ü&: ÊRP¦6ÃȸDvÏ?A¬„ž„0ðàû^¡n@=H$©œÎSñ{ñ+n»uVœWãÚ4,v2+RÒC©ä¡T9W–uVϹ¢´Õrtôãè`¬ZC¹,¡ó.¬î‚m§›°zÖ,Açó`½ˆÀKÑiÏ¢¤¼yÚ\öïÃÂrKËÀ̱¢7¡Tju¬.¦xO+Ð(€ k²ò]|ßëw>S:–HS¹I§ò Zãçn¾ý°:+€H\Æ ó‰Švl)¢Hs¾¿ÈÁÎ9hã µCÒq(G1ÆUiÝF–,@ç‹€[l-À“-°]Bsic% ¥2(iu[Ø»{:Ý.ff,ZM”àJìûàU«] ¬ô¡U?(l ?~_**@xð¼Þ¬ € ;t.ßf3õ¢[o?$Î8¤§ž)¤Ü¦”O)(A+µxçax>Á1ÃZm,òÌ él™žFûð}†µ@‘’eÖ Ö28ÓA°m!I°yRbiñ8æãðáÃh·›È²œŽ±pT*åò8JÍcHÕ zÕse¨g<¥zsz Ð’²L^èŒ÷f«½çÞpçƒgDÄÿôÁ÷z ž¾/UàÃ÷$„²Ìññ9A¥Ôë) ÌÖ8äÚ!K tæ`-AHg{Œ3˜ ¢T€!È@ë.ZÍEXÓ»$eCÏ'X›ci!£,+èá0äÍ32[8ì`„VÂðëýsRa1Ð˰DnòL|—Õêíܬo"¹ƒ i€©©©øøÜâøüBä)ø‘Ï#¤‰ÆÂ¼#mÎ-˜œ`Ž# f†uÚ:¤™C§•ÃS%d9÷Š41.:Ï0ÖÀèÄÍ¥EÀuá\àŒî™ÝnŠn»p¼•Â*ŒrAë;‹ÀhqU:yP 0PPª˜‚ÂLEî È2ù#’‚wú¦#SIbN?âRH÷¦ýûŽ@³€"Çs39æçgÏ1 ¦¦““¾'™™{þ£Ó±¨×6CkÅ$ˆ³,×ÎqÆÌ9;6ƒDòŠq2VkÀeÐyig&kÃê ¹Öè&Å'Öd‡B±vecˆF¦>ÀpMÁ éPRÀ÷¤@ž ä™üIrþëï¾wÙ{<š`Cd¥1Þ4öÀ|Þ\£ìÆùO¿‘ï#Œ%’$ÅÁ’<ÏÃØ8XˆsÆ1x×. ÓñhfÆ!×Ü+\QعýÙôècw]8~ü#gTž(9ÇxJ>'ŽäyJˆ1ATj6[È ÁY‚AŠ©É*Ê‘‡<ÉàHÁ^¶ ³Ä„PŸ Æh€)äþã@Íúu‹EG*Áê\”9ƒ&&€óÏ´öy~ÞQ®5Œe$)à{u\véçBØG¤ÊozÑo=T)A¼ò×ÞâÏÎcKÊŸ |ü@7ÕÏéhžR,±¥QÆæMè,G7a(Ÿ!z£hŒ)²}À÷ßg@n5#8(Ü•ßÍùÕ` ¦xæyEI™fîe´²ÌŽ )^æ‘w/}a#Lá†cHcí—¬qû­î^e‡Ía”KUì<ï<„qˆv[ÓÞ=@–*LMƒƒðìk!€;ˆ‰ˆ{,Äì,å–™LÓí CúáSÇÿ1ŒÄßÿ_ÇöJ¢=Þõ³ÿý§ßWÛõsYªÙùÞ0*EŠb´Z¹ö0VQ­ $]ZaúhÈë'Z-Àp€æç¯ÿ=Àjöp•Xí˜#ðUÑíd Ç€6 ¥q©RxÃgîX|õFªŠ6NîK’t7È^@HÛGîE«ÕÅÓŸqê•òÌáÀNGÑæ-‚+µ¢çlÒÄBÛ·ƒ_ ":6£$y@ Ý5Jeög|?ÔíÚ¯~êã3|êGeØûÒ<Ù/¤¼aߣ_b£õyã-t’Œ àlÙVE¹Bh5AI= x•Èåaƒ9¬Í ¦ Ö€'4Æp£è?‚Âéu®pç,¬¨’x‘üÓ·ß9óÿž*{¸á‚Û?õÏtýM¾O[ñjÏ«xʯ ^CnXV01µ Û·mÁxm V;Ä‘ä©)A“SÄatö3ÌÌ­&èÐ!¢‡ Z-‹,3…çO€³ìrHÉ‚»`>¸y°Ëˆx   ´vUã‚°„;+¸ø™”$^XeÙèÁÃÆ«º‡xm±ÈpH¿œœ‡Wÿà9Z bæynz'”´<‡RÙíö#~é|ÿØHSð¸[Ȉßôº·ý—f+ÿ¤A'!TÊã¨TjÈ4¢„¨TÅ…]€Û¦¡ @¨T6M Œ1+Ÿ@tvóFZ3—€Ã‡Assí–A®‹*Ž¢Ã×``ÛUTæ«L¢Z-aë¶;¶K!Ðlµ#+„F ›Xõ8,øÞ9àD{z †šWú}Ija¬ÒÁQä—Ü5~À¿þ}ß7¶¦!õ õ¾ùõ ÓTl~)ù?­“T©ŽC[ "~PEWÆÄ8.½ôbL6Ž ˆP­¦§‰+5†§è¬jf°1 N‡qìhaÑí’Ô"Ë,¬-ìhqU¤ Ä±ÂØ˜Âø¸@­Fäº('ÙO8ÔTºÒC8Ø^>¨Á€Õ•È?¥ƒU¾¢ȵCšYXç PÂÁWå2/{¡ý©óŸ.nÛ¶¹Šo×}âFÜ~Ëç^ÖêdªBO¢ÕZB“—!ÈC©TCW1^iƒÅV Ç9Òã],-.aæÈ,&¦Æ1½uQ¡ÕUÔnsÇ“„Ú8‹îÞ3ê' ]TZGå¯ ’¡”ïJ}àpv1Dö¯f‡KCÿª^ƒ!mày€òŠºBcÎ$ˆT$¶|KLà(\íÍ>uím¿£5ÚK­îK=Ï«NŽ—Q#tº… æÏ"*UP«O`ª^†qËíi®ëÍæ2fŽÍb|b[¶M¡—ÐɺÑ\Áñ5€0¤³¢Næ‡Ð¨T.„ ä¡dР?к[}~°t|0I„Úbð«Â°(T©ÕV8>)@QãÆOÝí3ƒßò€"âßxå›âcÇÛ¿—Â߬–Ã]j%ò<ƒ” ÆXäÆ"Ï¢¸†ju ¥J ¹‘èfŒL ˜\ ŽJˆ¢SÓŸl ^¯AB–û>@83º€{³ˆûÿ`ÌöébvÄdò àHö¢ ÚþQv¿ÿT)`bh4ÀããÀò2èÀA@[€ÃèäæC{î{ÙÏÿï=ØÓà§g×°Þ—uüÉ/¾ôu6Ûék²,ûÑZÉJŒsPR¢\ `C‹ñÚT0 ®ÜAO«È©Õu€§²Lƒ ¦ÁÏõJÓ ðô4P«•bò}À¨ ªE·½\M³¼àài1#@À×üýû®ÉK^÷3ý"8{•/Ý”,J娥R€jU ›h,-ÁòÒ<*Õ:*Õq –H3‡¥ÖŒËíK°8¿„±F“Ó¨–ËXj t:LDàñ‰ÞPé³è®©ÜY§´{¸ÀC „uý¤ù£j0l†MÔ–-Œz½?އ àŒ‘vRtš‹ ÎOŸ0 =“°ÿe¿òÖ÷2ëëopœÿØÒòr­Z-#ä†Á9#ðÊå²Ì ÓšCky¥r õ±ID“>Ò,C«›ÁºÝn ­V µz“S ø"ÀÜœ¤±†b!g£¾z¸°sX#ð0¨ÆWˆ`­o0\2ÊÖž `Çp½Ž•YL Ó€¶ŒÙ£-˜¤‰–òÄ…0hu€¥‹#‡ÐZ: ÅË,Ð:óÒí?ÿÐ?~äë_}àZH¼$ÏÝÏ9—}g±ð Ö2ší.”ˆ£ãIjÐjΠÝ\@µ6ŽÉ©Íð¼JTÁˆQ«óe—×11)Î>Y´žÀGu÷*‚Ök]å 1ƒƒ, Æç@ÿáæÍàÍ›‹•?¨Q–ZŒÃ‡r>|p™8„vó&jÖ9s–0礔Mzõ+ÿS>»£k6 Õ÷ú ž’ÆZ´:]H!ø>ÆÇ"t»9¬é ” ¼r¢Z«ãÙ—az³:3Âß`ŸÃ`!(Ÿ¡Îm…pCN]_ ƒ+ž‡LÇ@ÏéÛºµ °5R7öï³xì±9Úà(æçgzÊe_ÜßÕg…³#5Âúµ_yómãÞóI»ÿ+ÔÇ¡‚6ÚZtÓB4“˜Þô M 3!ÊÕ:?û²qìØéñ¹ƒ¼Ñ†—Á@^‡¼¡!3C£I'^S"4ÔI|‫UÆöà Xmÿr ìÙkék÷Áî=‡¥Ë(Ç@䞢¹4ÉgÎ:Ö1 xø5¯|ë¡æÄ¡üå Pω•¬iá‡eLN\¢Iä&@¹RÇe—ã¼]gVøüx)âaÕ< tÁ'&ˆ®Úñ:Þÿàÿ3Œ¡r‰qù´éIDATÞ.â8^}¬ï?`è‹wƒï’ãc3ǖѨ†Ünµg?ø—¿Óæ{ÎÉîá@8øk¯¸êÁÉ íŽþ®0T¿·uó¦çLM],©!3!*µ.¿b‚wìTgeâè©Vþ*îkãÿUý}nô¬âzêŸÅj&pM¸Ï@€wì\+|çÀ[úÜçÓíFƪsss0y `¿Û\ní;­Tði‚#¢¹÷½ÿ¯oØ6¹+`ü6åš¶êcc|écؾýÌ ÿd,Ÿ„Z¥Êiuñ­³ûÑð_²†ñ;âxÇp¹<$|qtç]Gèþ‡v£R¨W<ÌÏÏayqcdyþX’d×=éЧ’o¼é mËŸÈsùžn¢jÆ…hL6pùåulÙªÎ|³ 8€C%Zë"«m6ÑhvoUI#rB<œ0øP‚·o[+|fð̬£Ï~þîûÆnTKŠrìß?ƒv{ãUÊóÓ\w®{ÿŸýÎ#έ¥ûÕ9\ýBðM7~¡”µÕÿÌSñÖ$õ¦-"žšnÐeWÔxzZžÅP¯ÄÖÔç ùÌ#ø^Íú­"~hc©ÜQq>#ð–-àJe„ðçÝñ¹£tß7ö Zp&Á¡£ÇÐé,a¼æ¡\а°´¸7ˆÄ_®—ë9gBðŸº{,mËWæ™xmšy“oÙ6ŽË¯¨òø¸ÀY>3˜VÕåm”!¤ÑéÝáêŸán˜æúï ð¶màRiÈ*0xfÎÒgî8†ûÚJ t;mt“&wѨ)Ô+>²,MœÓo¯ÄO™ó8Û[ÇÞøÉ{§MN¿—$â%iîW!cÞ±s‚.½¬Äõ±³WÂ…ü‰“µ´f ™Q•><êxT¶o(ó7\Ù{2ß#î©vø˜ÁÇf,ÝþÙcôð7—9:&Hh(e´P}diƹ¶ÿEÞ«Þ~åÿj¯W~Ö5ñ Ÿ¼÷¼,Ŧ©üÙ,÷Cé—°ëü zöe1—Jg¹({ÛÏ1mˆ¥Áy(2Xåë =´ºëgÁS<½™8 ×zû‡úÌggðØžC¤A»Ó„ç[Œ7btÛK¨Ž×Ðn-C›ü!½_HÑ9ÙâVg[ø×}üžgæýI’ÊÌr_ùa^4‹ŸqͼgÕé‰o ±ŠOfØ­FÇ Í;*¦ï·ƒ —ž•+àÉI^Cò8Þ{ §ÏÜq”™Eà,//¡\&ŒÕ#äi ‘tšdI:KoÕÆÝ÷¶?|ùÉMñÙ|Oø?¨sñánWýp¦•j¸äÙ“|ɳ¢Þ IõRP:áý—goÔ@oÈ4FO äWmP!OÜ¥7mZËðY |óÑ”>}Ó~™‡ ­Ö"ªñ1°ÓHÚm´[E ÷~¡øæÿçêß:埡ΊʿñNÏvüå™üã4S—äÆG¹RÇ%Ïnð®ó}öýs6cúÛÐò‰ áˆ`°ð'ixZC÷( A@} Ã0ßÁZƒî°CŸûüA´»åhw—0>棜n#O»H“V’j£?¢Bú«w^õÛíÓÚþDo7^ûÅÐvÅ/ä¹x[’ªÖ…¨Õëxöec¼c§·’Ì8ëÂâýWÊ´qrµ¿nh8‚Æ:{ßJqp¥ ò p–‚¾z_‹>ÿÅpÌgȲ%LŽˆ-!OSè\#ídÆ{yô®w½ûu ÖÚ ]Wu&WþM×ÝS²F¼6M寧©Úd8ÄØø8_ñulÙ*ÏÙ4‘¾óÅýÕ?Ô¢u²Á(lu‚Ãtú†ª‰ú¦ßó€Fƒ9.k›˜v‡éž{—é ÷ìe!9Û»6&|it¥]°Ò$åÜè/Aòëßû¾×4ÆØà¦ êL ÿæîËüfšÊßLS¯îbrº`÷¦7Ës›Ëï͇ê [ã2¯¦ «ÿõˆ!¬NëbDä…Ê¢Õ¤130¿`ñ¹»ŽÓ—¾²R2y|•¢Vñ¡£ÕœEÒm `r kí½Bâeï|Ïoïy¼á¼:3+ÿÞÉ<Åï§ ýr’z%¦SÓã¸üŠOm¢s_È•?ZøXÛŽ}2`eôËÐj•ÔÀQ Ôk€¬~Å9ð¡#šnûÌ!|ãýð<‡( P-3âPÁé.–—çÐé,à­6ùƒüÊ-Û¦z"\Ž:j*Où­i"_–f^бyë8.»¼Ê“Sbh"ι1ü£J´±ysÇkøi­¯0Ñ—K@µ¶ÆÙƒ6àGw§tëí{ñècÉóz­ŒZ…àÉ6k¡Õ\@·» g Ä€sú>&÷›ü®ßúÊ%òÔéþÝ›t†«’Dü\–yDŒé-¸üŠ OLŠSøÉgÑüõéh„5úš7P+xRƨ÷¨¸\a”Ëk5`7aÜ÷–¸ãóûpðàQ”Ë “1je6m¤íet;MdY` ‚€có°eóª+ßýÛw}+,îiÛ:öÓ×ÞSÓþ IÄK²ÌW16m™ÀåWTyb’ÎéV2ƒt;аÀ¼¾`iáN£Â>?`®T{M„Uö~q™q÷½óôù/îÁââÊe‰­›+(…:_Fž4‘v:Èu ¥<°4ë¯[˜×|«Â?- "¾ùú{ê&Çû’.ýBšyŠE„MÓã¸ô² Oœ{á`b&f*úÿ×ãìV§†O?Ûw1"b@‘Í«V R­ˆsÀ‘£w|þ}åk{¦TÊ„];H‘§m¤eäiër„A°àÔttN¿ôÊ«~ëëguÈõ„Ë wWò ¿—vèç³Ü‹˜"LL6pɳª˜˜$œs‡ût‘sÌÌ«iß5­Z85 8èýÓPÿ Å*ÁqÌ(•hÕ¦ÕfàGwgtÇçÐ#‚ãÛ¶T1Ñ!"O›H»M¤ÝÌa@ÉÝnçcò×¼ý¯ýúYß2f”ðo½ùîJÞÅ«³ÿ3ÍTì¢^Ã3žQæiÁâÜîŒ~‚©c&vf¢•-ÜÜ:Ó8†s«~MЈ­b™‹Í(£ˆ¢5öž—_ùê"}ážCtøè1TÊ [6O  8› ÏÛè¶ÑmÂ""²iÚ½ÕÙìuϺìÂÎÙ¦Qƒ·Ûoÿ¢—µø'ò”~#ͼ†Eˆr¹† ž^Ç–m‚¥Yq–y^;3N×bhhÖúkúñFNð<áE‡.{ÞêèÏZàðQMwÞ5C_¹ïºi“¶l*ÃWÎtg-4—Ðiua¬FIPy–v?ÑIÛ¿ÿGï|ýÃçtÛ¸Uÿµ_øN“‹·¤©Úl ,cÇÎvìP|gþ „zTÄù£&s`ÄÄ®¡pÕ¦Q6 (†IEqAìôU~Ÿ LRÐCwð™Ïí§=ûfÁȰckš%r8“!K–1ü8:í:Oနq’¥éßi¾ûÞùú}Y–Ÿökªžˆðo¾î‹;tÆW¥)]h¬©"LO7°}‡¨t­ý‰äN±€!äÂ?%û×ãùÝ€Ã7üaO⻈ zù¼°Ät÷=Çq×Ýûhfnõºm›ÇP‰À9ئè´07;4É‘gHi¥®µö¹ÎþòÊ«Þ0ëœ;#° ÖZÜtÃ]U“¹7f©üÞ\û€P«aËÖµzOé;¯T€qÚ]Áþöõ+ß¾ïÕ_ oß:àÝ»uòükúô‡Aà†ø~b¡T‚“j•Êç\ƒÔtç]Gð•ûöR®SlÛR–é2”Ð`›ÀšbƒŠ¹¹EhmaM !4â8<Îà«rýÕ•W½¡i­=cmÐ J)þôµŸÿY“‹—äZ)QTŦé2Æ'¨hy¶ ¢Ê€úBê×ZÒi1 +ÝJ%õTþ!cèq]›?jß­;HÿJY”j!cP:ŽÁíN‘Âýü]{±{ÿ>㢧5P++€38“˜–1?ß*ö=ŽrÃà€òwAü±+¯zƒ9Ó¥zkTì§>qÇ3„UIºêŠÌD YÆÔ¦)<íi1&'{±.Ön¦Ðû_x]6ssÿ›†fê1ÖÚøõèÝ5į3©£é]ß/øüž£·ŠÎ=6ãèË_›§{¿¼ó ‹˜šˆ±yS¡Ïp6»:ï`þø–—xž€VwAÄ_ø-Õ1yóï¾éug–}¼5Ÿüä­¡‚|mnèÙÆ)⸌ñF„r…V¦iŽœšAý|C¡Ó úl´nXŽ+5{ìPø6¬îG½¤íÕž=¹`.V}Ã,;rÜê€Ûˆ/}å(îh¤tص£†©ñÌŒNN&mÌÍ5ÑigB _9“[€ÿpW¿ó=¿{§µî¬9Ðj£h¹ößnû þ!c¤rìA¨¥rŒjM@ÊbnÎðØ1bGÕqóŠA]câVgãhm¶n};BÐ#°ÞJÅÀo p=Õ®oИ™utÿƒËøò×öãðÑYŒÕ|l®! g»°¶ ¶)Ú­ŽÍ,#Ï ¢P@I kLbþscôŸ¾÷ê·ì?›ÕÙñßÿ×e)ÅO:-wY[¬~ßQ©ˆ¢ÞÈt>Qû¶Ò1K'µ6‚HYÌYïùº8ÙsŒÈ4¸Û7õ; Å~Q\`UÅ­cï^C_ûÆ~ðáÔ¦ìÚ^C½¢ ¥ƒÑ Øvá\ŠÙÙ%ÌÌ,pXç¼Àν%Óù?_ý§o]>ÛÂß°ØuÁùÏ!È;+$ @B!C”ÊJ$‰=n§ÚJmXè§rp×­©€!¡âd¯ ù{ýЮçZ²q(oµ>È5pl–ñðÃËøÚ7àð‘ãT-+ì¼ ÀgÀe°:»iÚÆ¡Ãs8~¼O¢x‰¡¯±sowp×]ý§oÕçBøÀÕW}@‰‹‰Åf & )<ߣ•3Ø=s[©*½ºžð‡p2 ¬™¸=P®5XÊÕïºñøxì\­úÇ¥‚(Ú.•÷ÃpD‚HHHY8Î í–µÎÚÀF@€NÝ:_¹IÁ#B1KµŠÉC’aìߟâ豚Í&¬I15@¢` AΦ°¶‹…ùEì;pÆ:lš¬ÁSÚè¦uâvîõ7tœsOáŸDÄïúýwªÚ¤Ü×H ) ¸ x¶+ÅÌ@.ÎPÁðˆÍøäÚàd•º:Ô}Êã•äM¸âÌœ£}{r8´„f³b ÉüÀBI枣gR0§0¦‹…Å&fç>êUÀpšš‡µvo÷½ðÚ|è-'Ӫ߰hu´‹­z\í š¬B*éËZ[ä9CI*„Î#öÒŽ†cÿ!jøTS9ù$ñÉ^g.úñ<E}ÇMrf@Ç»wwhïže,,,Ãê ¡a¡<†TÎæ°:…5 €FgXn¶Ñlu‡>”’0:k§™þtžé+ëõêׯzÏëÝŸ}ðÍOJáŸaP»Õñ=ŽMÓÛ „„u«Z$‰E©¤Vb18q8Xïñ¤&`TáTæU<žWlÇ€'²Ó˜_r´ï@>²DÇŽÍ#ÏÄ‘@à<¯ø,³Fž$Ð:\!rh£ÕN‘$)|%Á äYº;M³¿m¶:qÍ?¼{áɺê7 € Üîdy«Õec¡ek t;º(YÂhÊWÐúŽß¨0ðdNàHŽàgR‚ã¨(ÏR^¿ œ¨“ÇæhÓž=ÇqäÈ"œÖð¤E9*Àø ƒ<-ø{çRxÊÈ‘¥nŠ$Õ°°Vs¦óÏè\_yl~鳟øøŸhcì“^ø§³³ ^X\˜Ç‘Ã3¸ð¢1¨ÀÁ9B®-Ú­qÉGÊ­R °Cfa°›v=`¤ wíö„@©øaAç2„éѽ)<ÐÁÑcM:4 ßð|‹0bÄ‘„YÖEÒiCgø¾…’ì ²\£ÛÍÐmkd¹ccLÓÁ½«“æ»æÃW>º‘ÌêSÌLW¿çœ$:x`?jcS«×á€#Ër4—S(C ZëüaÄñ0p œJø«æ0àyÅ4­(KÅpLXjÚ³¿ï_ÄÜl­vÝ´ƒRàÃ÷¤°ˆc‚ïyÖE·ÛB–t@ЈC†”Æä¹A§¡ÝÒH3“[v_dØw—ßy͇¯JŸJ‚ß8ïümÙþýs„kRÜÿ0½y3.~úEðY€Ù¡ÝÊ*e¯Xz«ùt08=n¬ˆU›9r1V% ‹6k/º¹ÃÁCÌÎ'8r¤ã3‹ˆ"( $]dIÌÊ#DA’…ÎsäYv„Rjø>ƒ1IWcy)C³A÷ GüQ¥ôßþÍß^uô©*øÇ€þíeoüy_¥(É*Õ:&§·ãi=ÚLf‘¥Ö¢0@©ì# %„¤UûìaƒQ@ßî[{b“¦¾9è‡f^À¡“:Üľ˘iÁè‚¡ÄPJÂÚ Æ¤ð! `çpVƒØÀ¹bìŠï9á †Î-Ú ó´;ù²þM(þëg]|ñ¯ûg­Ýð†';6T þXÜêþ@©T‡Y²ˆ/ßûeì8ÿìÚ±qÅGžZdyŽ|Ñ@)‰(òÅ RÒ€& ‘«œz4¬ÖÅ}ÐþKQ„qÊH141:)cÏDZߺ‰ÁòÒ2¢P MdÚ`¼Q‡ åXBçlfàœs9Øæ Ê‹â r=ß@çËÍÇç[¦“诠wI…;®¹æ]óO5ÿ[öú·W¼üõBz­òÕ•ÖÊ ×Q¯!É´ 161ç|Ç¥«Ö`µ…Nm±“5DR„B¬äKm™©WµS¼&d± šìÝ…b0,:iŽ™™&ff–1;»„f3Ã!Š$ŒÖh·;P˜š(¡Vñ‹Õ®s£Á&‡sÅ] ƒÀg(0[kaE¦—77ß<”åæ/¤ ^þ½S{ßðš×ó·àÏîáDįyÅ›ŸÖI²k¬Å÷x~ )#€BÄ¥*¨„ñƶmßé-›x>Øœq°ÆÁZ×+êìmnÜÓóBôïB¤,*‹™ë ŒÍ‘åÍv‚ƒæ0sti¦‘ƒ4Ë È R ÁhZIa|,±C’tatÁÛ3k°Ë!„AÂ@p°ÖÂY Ë@'1XXì™]hÞé¬}Gø|øïþX» þ n¿ñNüË¿^ûÞJ9zõøD)°ÆÃBÓD„(¬äƒYbjz SS“k4†!¤ò …àm{ÅÞ¡±ÆhkaœEž´Z)–[h6[HSƒ4Õè$)Zí¬³ð}Q7 ¨V<4ª!< £¡³ ¶·ÚÙå`6dáû(üQ¤z-zÁÓÜ¡ÕÉ—fŽ7ï]ZnÿùD£|ý/üßÿGþ¼ïû|;ß7ˆˆ_ùò7^ÄL_­ÏšˆÅetS m= ÙvhwB?ÂØX q©ßP©TP«• zœ¹um,Ò4GšfHÒ i’#M ²Ì ͺp½ NÚX@rð”Czü‚«# I ­sXk Ö$0&XÃSß—ð}Ù !˜ŽóK šíôÓ‹KÝÎÎ-ßxÃu8úíºâ¿%'°ŸÇB<ò«¿üú?Ÿ_ì^l剡Æð¤‡8˜_t86³ãrTóØGɃc‚± ©|¤I ­ „”Eç1”ð= g ¤`ÔÊ¥’B*„€§œÓ0¦XကïY@Z“Aç Ø&PÂA)‚çIAp½’™±ÔLÐêfwÌ/u?vìØâ ×]ûÝߎÞisû·,Ëñæ7üÿí]Kh]Eþþ™3ç>ò¸yXÚlÜb ”Š Ý*ˆk‹ W.D**‚„Š(´‚êJ).Z©b@µA\*iÁúE1bÒ¦IȽ¹ó˜™ÿw1çæÞJ j[s80ÃáûçÌ|ÿÿ¿Tk¶ÒW½È©ÉªÖØÌAiSBW‘K0Sc5D:F' ê=.U`L U ’Š@Da0ûÞîd‘ Žb…l[bˆoÙÂP$ÅŽÏg ò,³…Ö„(Š u ±€fA’Ùtm½õãF£óZ³^^Ú\19nF‰ uÛ#cë.8„_´C¡öƒÎÀ®þÂ2ïÝÝk `K«“_PJ¿)‚/—ê?œ8ùò·Ûý§ ø“Ýw™Ý·NŒEWËêncâˆTwKÄÂù#ºœËÝk¨@gê><øÜú$·þ7›ó—Iæ?uΟ]Yï,ÎÍm €ÿ Âgž|~$ËíÞ±‘òÁÚhy?jŒQÜ+®D} ÞO,ïÃñ±ó¾ã½oÔNß®7³ëùÉZåûz#K/6tòÞÜ‹nú5 ý|ìšÎ Hv‹ÈþØè;L¬fµ¢q@0,@¥ ¸ˆ0 aé0sËZ¿™Y¿šY>Ï, iÎ?繬(EíD*îäñçdø5*W[èÆ›ÔwÞ¾gÏäxi¦\R70!úõ9Ï6w¼as^ÝØ´>ù|qiù§·í@¥ÿà þÙ1ý:€^ÿãwwÉ}6à@JIEND®B`‚stem-1.7.1/docs/_static/section/download/archlinux.png0000664000175000017500000001575013157571677023601 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ-{hhIDATxÚíyœTå™ï¿Ï{Ωênh Á^@QQQi\Àݸkòq‰Jâ5jÆKqbn4so&FÇdf2ùd-èÄÄñª ï'“˜˜8^‰" («D K³6t7]Uçœ÷¹œªîªêÔÞ9¿þô‡®S‡³=¿g}Ÿ÷=#FŒ1bĈ#ÆPÇ„Úöwõ·Æä@DeÝrjæÖp—n; Ÿ…9nvìýG7­JÒÞþá£TÖ-?¸fnýì˜C›ï¿‰ƒæ,,¡*§/X•#ĽIWîŒ 0„qÌúÈ÷;Ù;-øV9hÎÒR°ŸU9}Áª«c Q¬œ™|Úc@ÒÅ1Ü Œ -%¾Õëc aT×½Ýö·U%XP¾ éÀN;å‰ÕgIJp@¤íSc&¸8<‡–&䂘CUs—‚ZPÍ'ÄUˆŒÉ}ÊXÂðòSž\sxL€!ÉÓül(0 µgä"°–ŒÕéž«'ÄB¨œ·¼HóADΦäo ¬â‡ ÖÞtúþµ4&À´I= gª—ï*¤C‹`®HXw|L€AŽZU&,W¬Ø(ÐÏZ7àà*ŠÜ@*ˆŠD¾ß|OL€AŽzZ_©'¿Pv^­±b¯‘nHŠ*ŽÈ-Ó¬+‰ 0È¡H¢·¾R? ¸µ "T¤ `’bï 0X1fBÛ ÀHô«È¥"Tv™--AˆUÑÛÏúù[NL€Áˆë©þA=F¢Øoó7¯A0ð|BHVèäʼn-‹U¥šæá7Çd8ä‰ 8ndþ8äŸkr¦޶E?F¢}òÉ*´P1è&€ Õ«™[ëD7˜óöVåçFôŠÜ†ÜöüXPQ¬B¹ç0®ÜC…FøÂ>7éÅØ ¦´;Ëò ä0#z¾ähŸ§ñ"y¿Ž-Aˆ¢ˆ2ZC»€A„ê¹oá9ƒ ™y#:Óˆ”…‚§Mð…daOÆâAŒ9çì§×L‹ 0Hà:^6øSŒ@*ð+=Ç\l7GˆHØÒ–%PD#Дs¤8Ü Ô>·ÆÄਘ³×HAPç:ÞåF˜˜#DôEÂɳyVÀd¬’³®D¹¾"4Õ18F&G@Ä »2¦Ü5r±Js„0ù~¿`›Ä 4¦‚è;#SÜОzëV•˜ãžÙ‰hˆˆ*adRŽw„‹r„.|~á¶v« ,µ971{S}«`€ÂÛ³ GÀ˜lAgä8W4¼ÈÑ9B´ý ½« €ö#z®ß¸åؘõfÔ¢ö¬0½=ÛF;Â-9Bšü\!¨“ïò¶©B«¯ Q,`Ãà;1¦E <žɉŒú—:FÆçkw>L[0˜ý•ÂÊ`ŽéÐ’5[5“O]ôÌÚc $üåm©«Ç´-Ê÷Œ|+Ÿsýù„È·¹Rq`•T4Bˆˆ ¢ÿ`€¡<é˜ò=©ðxÂø|B´ÿt ‹ÉPœ´dEÅ gžõÔ{'ÄègWñ{ô]X0(&>îúókÔ>±šaŽ´1V€Ò¤÷ +œ—mÿ¶g‰@D†RA.4"g«h™‹ü¦Ô›ð³ Üíá¬üýs(®ÿç´¾í;ò÷þM‡Êˆ„“%‡Œ-uXºnÑÜwc ÐÈ-ÜWái¶Û7ÒȾLtE.Í~ì²Á3«á§8È¿ayKð×kÄè×A?ÐŒHÞ\éXêÆUä¶[…]éG×H™+zÝ)/¯ˆ Ðx 8ãÉÕ8m¥Úè§ÂÓÏ9ÂÑ…<Ývû–rœ‡þÔÀßšM60çtˆh‡(¿2tìÊ›D’±d²s<Ç™1fXòؘ=€‰_†—¶™>"Ð0ѹÊHÞˆ~gcþt:ÈcN(qôeÏÓGÁùߢ¼i è2å+&wïJÑBÔ¡rßY ×'c|ÜÊßÔéyÚï/}Ë”¸\h„ }$Ï?wm² º~àd‘ði5"fC[ÙEþŸoL'b*°ì ¢áâa s™dÒ'Æø¸¥J±í­Þ‡N^áˆÜ•#DÁ(_þ´¯6"HáxžàLû¾'Ñ Ôä÷™ÿÂó´7›äöU 9m±VI¡,áÌ8¸ºJb|HTUŽ aL[§oôkg8FŽÉÂäzû:iðl¢}<¿Ø:Å Òáûüabº^Îí› •Ö0ºÞ‘IgúôŸ®¼jcÃV° 6µÿ’…«pÅÔîEÌU[ÿDµ`ÐFéì»®ö-Þ§x¼ ÷}ágívßG¨,ópCcÊ_óËÏN<:¶§?¹Oœ‚àËb¿*Øê>¾ :ooãÚ÷€nêÿÝU ‹HŠöm •T­K<2évö‚Õ·ÆØOTN¿€Q%í]`gªq¸'Î?v—–FçR@Óí€}”|»=_Ǻ#Qï Uʼn1eέ<ôfIL€ýÀ¶Å¿áœ§ÞÁËó±aTIÅCF(ïNðù+ô¤ÓQÀÕ¿¶ib]•º<_aÝÀªÒ˜ ¢>EÇL¾øÈ‘7ÆØÏ€¤¼$‰1íZµ;™ì ×ä"¿Ó§¸ÛÇtÚé›?ÿ_ &‡š¢Ÿ.¢|é$›(>_.óˆÖRöúÏ‘²á sÍ)O¬­Ž Ð ¸xáÚhÀ'O3ËK’³Œ‘ªîÖöÙWë—tbòã'¿ý[Š‚ „ºsŃK»RÑbS —óÇŽpΊ ÐþîÊ\“mõŽøÞ€Sødöã>»}séaèž Ñ ¢Ñr0-Ë®TÈÎÖ]­!Û[¶ï ØÑÒ” IQˆfIgö@ZU[CJ]ÑpöùϽ?z =òµÚÅ'?=°D™?<÷³ÅæÊ+O¹Ò²«þ¶§l¢r°Üâ-¢…ŽÅØìú¡U| Í™½e¯oi lvÞŸt›'ó GHºB©cHfÿN8ÒvœÜ1ZƒVß0,áži N~×òpù”a°wõ:J\Ó–Ë7…L-}É©î*çÎÏûóóùÜâ™PI‡–fßÒ”iö•½~˜ýÓÙªñûï¶ŠjžÊ3a‚“X½îó ÇT焬ŊŸ¢UÚFyŒDM»S–挥ÉiÎØ¶™½QaÏñ>¿_ PeO:lkO:B‰kØíEë Œ.u'ÕìÜx#ðXl€¿÷yîµh%Ži0@©«ßuq µ­ãd ÇDkü¯Þ™bIÃ^64eØ“‰æï~úKÃr×ÐXþº;M&´••ã“ߌ-@W>¿–¤ÓÎÅ=¾wÜ×_¾¯«K‡–÷Óliú]Ðû «0®ÜcdÒÝÒ˜Ö“êoš´ù€´W¿¼;²‹Öt [“&ýhg—¬Ùßë[ÖíJó§-lDÂ'›v64ø¡Tž¯ÐàÐ'VsÊHGÚ'e5ûáÃ=÷g ¦ØŒ6e,[[|65û¤‚¨O`°b˜ç0v¸»Ö7rå×MZq@Y€¯f}ýÉ#ÝÜŒðzcà•ºÎ×ò‰é¤²¦þí­¼·;MÆê >@‹Ò˜ ò¬½¶æû¯;œøÔÓ«^êekþJS&$á:7zÂÃÃr6aSs†M>{}‹eh½áÂ5ÂAeîÆ‘ÃJÎûã5G¬9 b€²²¨_Ò•U;ÒXßäÂu"2Lšü7·ìeõÎ4-¾Ez¯7ñ­Ò”ÞÓ’ºá´ç7öKM¦_N:ã—[Hµ4±'ò^c†L¨1zäy¨½Ð•õi6ìI·öAªæ)DŸ)…Å5ž‘ûü]-ó-ê7î@PSÑsÿÄQÕ£S-M3÷dB“#DøøfµkÖcÕ"T£MôJùƒû*+Ø“±‰á‰ô7;†t àyPþcÅk¬/0é#JÜ«}.Gˆ>¸¨—ž4aøË-wŸ´ `Ü+ F¥ØqÞT9è•ú³@>úE`x_<ÇiëOÚ1ëäÕCÒLlQÖ EÂ÷GÕ:{ëÿ¥}üWlY°íï§oËmû£ lº9zWtõüwáUgg⿃Q©_ˆ˜€×ÛZÅïûÀ¥ÎÓ%|o± P½` 7TRýH[²ã¶š»€»¾ß·j«B?ýâÖ¯L »ÛslÝ2¬Ú¬Šx ýŸ¢rZW¯›íA´•Ë6ßUû»!•4ܽ©Uý-í£#^M© ßîuŠ€èM2îè_ìKø‡}ã-6ÏœÒ~I¿Æ`níƒÙ¾Rb ßRiàqÙ¢OÕÃ+)ŽéÕßò]”Ò^×,ÕÇlè<»iFÒîk×÷<)"íÌ©äúz¬Úe÷»{ùBÕª^þ™!C€¹y÷6Sx«&yœ Ÿïu͇•ˆ|oÛìã[÷÷¿Õ,lŽ”?ã“·TØBgŠûzá¢G¡ö 5sêG P]·¬ãmÚÌ}½a«fy¼afíÊóß¶\3œêo>ÃŽ{NFó^/dü¯ƒör®® z‘¹hH òá¥t˜D%æàâÞ?¿l šeÎGŠ[¾u-[gÕ¶F¹ w—"ô~ì, ÐÛjæ¯5è `Ô4ëYCèõ@U¯úþh„ñ?vÜ7%Õ–¤»è#[{w :²6HbÐÀ¹ü‹Œ¿réTö 5ÓP½®×m› wý÷)`%’¶ëwéƒ,Ý ÿ\3wybРâ‡K_ü1ªAAO–q“¥¨ ${=òyaÝ©ž8T^P2ñÉ}P@ÑÉ`otØõ¥ha ÍÎmWœà D®î‹àFBûã³f¥÷$†ïù¯¾¸…o™·xä !À‘ÙU=oÅZ¢¡ý÷ö{ÉÿKrØ+=u¸×Çi³fNiEÕ>šÜ¡¹¶äAC€u" «[u?¨‘¹ ôø¾¾ª¾Z2ãÈT×¶ó9ض6ÄqÞì³fDÕkÇÎY~Ì qà Lf³¸V¿ÓG ÞX_Ù³ãyńز®oÀAVì×4Æý<šé4vÞ;çÉà DudŸ<*IJ¤§kƒÜ‚ä± >HÓÞŒÒÝ®ôªº·Ï°ØôéHClžÀñŽ"*ùš¾²³¶§Û0óØ‚tÖa°ñ£…ÄGd5ÈA^þ¶ÿ0^¬\Wõý7¼ëªêêsEŒvÍ ƒ»€úÖè¶Þ'š¿høèé &P& àu1ÜÜ†È t5è$r­xe'HŒ}ìƒì0I»F¨ÈtЫPíÃæSi5¸aïºÃ–9:¨.è™ ³Õòbd'£ÆѳUä.ùSÑùG£áícÿ 1à¦w˜HSZQ"Êu ‡ô¥ö#4)Ú;(Na…–:r˜¦VJã†ÅK6ºâ͵©¦ó Î)‚üß¼óßd›0ðÊ+8øŠ¨)ÈûÃôΣÛû¢bV(# TDûèd>={ƒ¥(ŸÔŒ_à_ϸ#CU»XárÇ$&‹ ù·A€£Tñ›v.]V îÔZGÔÜ ÚçK£EœÞò8}’÷+À(±, ?Ò„7±aV-¡Í¬m˜5õ³b9Õ‘Uu+¦÷;Öfˆ9Èpé²3ûdÀ§³Ç'8ªa/IJŠ a蕱áÜrÜ€ïÿ¶º®þó¿Å«ùá:¶ÜUûZìÚSE¿_ 0á/ْùœ»üyý8§é«ngé §‡¢ú£„7|¾õ÷¶eS ³¦¾Ý¯X?M÷H}G³¨ÌŽÚ¨ûm}d/´ÖëéƒNœó>¢Z ûêÝ@èÍê‹5ó–M0i`Tói´ãÉD¾N?ÃѰÇgn*͸º:ʵ#ûôÆ„ijõÏcç.;¿ß P5oE%¾ :¦¿  È =_÷I續r„(Wß§®NTË-öåê¹Kï©|ð%¯_0æÿlú}Ç‚2ƒ±ò˜œ6î©­ÒÓêWÐÛà§G!rd?ºº35?©ùþâCúœ^ãö‚¥ƒ1Õ.6¼ô°þ“y”˜¿ä•M×Wõ¨d2G‹É{Ï€¤P} xhí—{V®S7±¨º®þ´ÊköqOlÂ6m/XÑKgšZû_(cúV#d+èK`^Sñßœí¢ºm¬¼}Éìd¯^HůU¼5ˆcµRÐJÄ9ì©(€ß§ÏAd“¢wo9õ?{5‹ZÙò™Rjæ-ECi[±ÉQYb›¶ÏUÕ[úBÍ6ôY5²HŒ»R¿ÕJYzÛ̉¶?”pŠ*˲™PUÝÛIö6'ͰãÀ\F^«ÂÉ}cþ4t\9|Óµë5 Pvßó”RèöÄáD å­¶%¼z¼""Ø¥†gÔè¼mwLo䨜ó6%ec*üÖ]_T¸8 Ô¡—"GY´ufíg{œÕ®§á¶ T?¼ l»¢5m\gÊ9òe”s{ø^RÀfDêQýIì©/0ˆQýƒw@2X˜nDn9´èñ4RsúÖ/OùS[€Ñß]WÒTùcÌ ¬]”‹Šzàú·ƒ,} Ç}¾áËÇm`ã°×”÷ÏŒÍ핟=_Ö†d.CÌå gzð”n˜5õ´#ÀØx…Íß>—ꇗF‘Yø©%^IÓ*ÐC{Àƒ­U‘…¨¾Œ˜?7ÌœÒÂFùB¥lÓ›¨ç!–“ó °3Pz åK|Dok˜9õñ³UóßE‚¢‘OÃw°Ü÷1ó¶7ÕèwMÀkâ&6ßyŒÏGõüµ4ÜqTD„Ÿ,†ÝJ©W‚d25êyG‹•»«>^!rŒwé¦;'ïì™ niA!DÝÄQø¿ÿR€%Ñp±¼zAzÛíS•ÓÛÊâ[ª"k;g Íê;¥^É1bù6ªW|Ä´Ðå+[fÕÖ}lT×-ÏÎïËý™r;ªÆï7#²Ë?6ÜUûkb`£ÛYÛAÑ3Ÿ³4zÿÚÉ¡˜.Êö¿p' ü?5æs[¿|ü™U®@2a{Få}§£öÙ¡ý;@^WìÜ­³NˆÿaÜEÎòZ„p"— ûs Àm61â‡Ûn;¼K ÛmÝÞRð"VM¸%’ oöCøÒ„ðŒÈy¨ºdO5̬½aŸwϯØô½OQóð24¯ä+¯?!zÚï"2)`"ßk˜Y;?Mßâ”W•7ÎŽÄWýp}4Ûq.&´!LFuXþþNÜÖIa PY·£‰\bänµ65ÏåÏ$ÅùÁû3oŽÅ1Üœ7ã! jøVoÎÌ“ñofM½hŸ¨ž»,â‹øi¬GÑÄÐí u¨]Ðp× ëâÇ>ð0vN=¡„~•o†(3=hÅÈß5ÜY»¨Ë, ªn)ˆ¢"„ ëiøûé-ù' á‚ÌÙÁîíÅÂx8ô¥È5o¾«5•ÄVù¢|RÜ â¡Ì¬ž·td×u“€Iǰõ‚\ƒÃÒsA‡+RkÖ¯Üþà§ýøQL|pI»1ßvGûB,cê–o0†ï©Õ§ô!kå2à©8|v’n¼;¦úe5ñã:S·|Lõß÷â'#FŒ<þ?§_6¦±}IEND®B`‚stem-1.7.1/docs/_static/section/download/redhat.png0000664000175000017500000001152013157571677023042 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsBIT|dˆtEXtSoftwarewww.inkscape.org›î<âIDATxœíyÕ}Ç?¿žcµ+íîì!t€$t²D@Ù€“"N8ŒÃalŒC‚‰Á.Å©˜#c\¶16&¶± 0æpŒ‚ RH„@:ie­vµÚ{v¦ùãõìÌîÎÎÙ3³R÷§ªkº{úx3ïÛïø½ßûµ¨*>ÞŪt|*‹/ã Àãøð8¾<Ž/ã Àãøð8¾<Ž/ã Àãøð8¾<Ž/ã Àãøð8¾<Ž/ã Àãøð8¾<Ž/ã Àãøð8ÁJ' \ˆÈlàd`PÔ§,©ÛA`+°xxxYU£HvÉ‘ÃqfˆÌÀdöÉÀrçsj—ìž~ <¯ªCE'r‚pÈ @D0üLf/fŽw|5¦µæS§¤ll>Ù ÄÆ^¢¸ ø¾ªÆ]ú〈Ô'b29‘á IwüàXÐãgÑÙ㜆8ðð4ȳ m#¿~ ¸QU_Ìÿ—L&ŒDdp¦¨ng©ïüjà8`I2Ãu¹gv6X ò-#¿zø¬ªö¹t«²RqˆÈ¹À×€Ós9>`©²Ð¶9t pè| PÊ„:(ð¸#„ýÉÝÿ\¨ª{ËW©¨Dä$àU ”ØW4 fцä:MÀBÐÅ¡“ªª`T±{{!–¦¶.!=À¿<š,d¶+Uõݲ&¤H*&©Ö-õÀM ‚Ž[ÆG8L Aª«°»»±»»a¨< õ@îqþÅNà/TuuYnî•ÀÀ*€oƒ^`J׬(êõ`«®«¾«º4‚èêBÝIx~ r ˆs‡nàTU}§d7t‘Š@D@+0ý£ ÷¥Éü!Œ5¦¤p–AŒù²jì¢u˜.^½³O&MŠD46"ÕÕho/ñ®.#ˆþ~pñ·¿|¬³¹X®ª®Ý DTJ+g~ zfŠú0æ·- Åâ‰þ~´˜.B¸¶«±‘@c#Vm-:0€ÝÛ‹ÝÛ‹öô˜Ï¾üóV$€}àOÜœ, žΛ趂J àà²#€—ÀNm½woƒô`Zn5íÀ4àHЙ@eaM™’¬2êë±êê@{{Õîé1ÕÇ(Aˆ˜üµjk Î+ÆF¡÷™gÔîèà› $EðU½É¥ŸPÊ.§ø?Lù è­iŠÿLkª#‚žA¸õ85G9bhL&«¶+1UG$‚U_/ ˆY,ˈÀYwt0¸q£Æwï'}Ÿy%)‚KTõQ—’í:•ÀRLëŸAOÏÒø³AZAØ.¤©˜ z¦”aOpD!“&!UUßvOvg'vWטë> ÖN³¹hQÕn’ê:•À À½°ì)yžgŒF¢Ø_æ‚¶Áì˜k¿I·ß£ª_*2i%¡ø9pù"à7.<À12 ¢Ž;ÈBøGߘª ,SÕ?™$ש„6‹.½­øv CŒ= ½.ˆ£€€Våy^;pXNÙÿ?ÀŸi¥mï£(«Cˆ˜&ô0^¥ „iÔ%vQ t´ º1]Î\höƒœ:-´47‚ÞiJ3€«€‡ò¸DÉ)k "GbþO¾º¢%@6[:$ªþ,çÎþ4Ï4Ç¿Ë Ø ­ªù¥ºt”Û%løÁŸ5Þ –t`'a9lr¶Æ)zÌwÃXÀ¼Ví4§×?(ü¸K¹K€+Ÿ¼ vuºc&O&8}:±¶6´··liKÐOR ½˜\«Á¦˜^Áå`­7«Û€EÅBXn¯à¹`þÌt™ gzxáBB  “'—)i†jŒGÊ\ŒѱÀÑ—ùŸK–ó€¿*òr®QnÌ82ËA±¶6°êë ·´Z¸°ìBp›‚.HnÞZ¹”Œ¤"%À¸õ¿ƒööß· ‘@€@CUÇg„0%_ÓÑÄ@Q ,‘s*™žÀQ9km5cøÁ hn¦jɪ–.%8gR[lÁ\^.žÜœ¥@Ù "U8îÚ³s9Á¶‰¾ÿ¾| û—#™<™à¬YTpUË—š7«®®¤éwƒ pM²øsg\¤¢”­àxýnxô´»T3sÌH' ÔD§®F£Ä;;Ñ´¿ßŒ÷÷÷—Í=,ú3Àr¬’ÿ®ª7V2=å´ÌM¬dk¤ß³‡¡@@G‰`¬pU‘êj‚ŽoàoŸx\íþ~#Šþ~4Ui®3¼ß»×UÏ¡jà\ÐÇL³àr¹¹’3Ê)€y` #3ò<1ÖÚ €†[Z$‘ÃjÈÃÛ€Âatt5‘á\ûàAnÚäjæ'¸8)€f`%ð¤ë7É‘’ À©û/þL# ÿýØŽ`Yni!] 0îv>¢Q%ºm›Æ¶o/I惙Çv$ð¡Ù¼’ÃQ"2 ¸ÞYŽHì?¿û샰;;µjéR±ÝÁ4=Þv6ÑÄ÷ïס͛±,4‰9!ÀE ?0«ŠHC¥H]o:-Û¿Ç<õáÄþ%ÀU çƒ=ƒ' ¼x1¡ùó‘ܪ Ûvw·Fß}×Ô÷eb;pn²v½ªÞW¶›§àšœ'þLƦ¨?ôJÐe®Üe$VSá ̘!dnÐþζ‰ïÛ§±;‰íÞ]²â>—€µÁ¬®QÕœ¦Æ¹MÑpÆø? |ãkIð×NÆOÏt²[ƒgÎ$8{6ÁéÓM©`t7qÿ~··Ûµ+op·ùÈmɦÉBUÝRî4%Y Üqv \ úÐñ{JN0ˆ„B`Y ‚8Ÿ£=Å:‰¹Kp XNìn(g·°`ˆÈWÁ©çOn»Åµ¤þ¼\6Ö» ó¿þLUÝpzÎHÞ¦`1Ü ü+®¾ úË ™ÃÔw)¾òžç °Êùÿg)6áyÀÃÀF¹¸ÔéÈ«p&u<ˆé»rp7ØÙ ;aUÀÃÀÅ+œ½“r<ñuŒ3&(ðÈÇÀº äõ<q(²øgç÷>ëÄHõzŒÕŽL0Ʋ§Á¾4å;xËq«sœªù޹r%èÝysÎkT€%B¡¶m›Ö9fˆø*Ћ 1±71¦~af’©iÿ8ØÇ¦Ù?„ BqïÈÙÒ¿®s#$MV8‘¹ÞæÌž;×'Œ_þ’4%MSS---lݺ•îînúúú:iYúqàLÐú<îUiºÕ Ï/9q dÎøσ=+Ã÷ï·€µ9¹«cAüUÁ &7|ÃÜ=#O[~+°b”,ËâÄOdΜ9ÄãqvíÚEkk+  CCÄ1N™ç9÷]ÄÄ mjcúl¿yd¦>‘ßœ·`=ØÙºHCÀwéç).ÅŸWÕ‚Œ "@ºôÛ 伎™$™ê=eÊV¬Xe¥o‚tuuÑÚÚJgg'Äè"ˆ ¸Ì‰¶t¥va‚V¼ñjÙÒŠÉì*’mœB8 ô¡<þÛ7€[ÁÚ‘Üõ&ÅØ©ÊYÈö@ŽÁ닎âÅÛùD"ãf>@}}=õõ¦ðWUºººØ¿?´ ðt4*O Ñ78(¶mSƒ±A7Óós£³Ýdmrމa¼rúF~Jb;±¯çå]'£ãÎ!˜j-•b2? œ’ç9K'Á¾äW&I§/ˆÈ9ªº?Ëé#È&€3Àü‰…Îå‹06ÊGSSSºCÓ""D""‘óçÏÞF9xð ííí8p€þÁA¶F£lŠF%Æü3 %£x!èg‘ªbŠðÑuw)ì³1àä®IÀ Àý&éË€—Däcù4sÀÒ"ÆðÓìrÁG/ÓÜÜLsóÈÉÛ¬[·Ž¾zÊ]p$àzÐåE\ãf§;þ]#‚ãß‹È Uý0—ó³ÙŽ‚µPš¯Œê6vttqÅÌ466²dɪªòÌ]^˜jõï\˜ {è-Éë<."9Ùx²t²ÏšÍÆ5 W€&Š›îînWJñ˜9s&555%»~1„œe•3jêÖu¯ýròzË/är^6ìÓá,–U ßÁ„~êëcÍš5ô–pòg(Ê~P™±€SAŸûŠL¿4ePéNç½ YÓ” ×ðqÐßý)Uíïèà•Õ«yû­·ÆzëFXÎ2 ¸ôǘÈd¥@€¯'ÃîÕa<´²¦/[^wB¬¸ÁdÌðñ:°ïîïש[·ê‹/¼À6l »Û½@ZýýÅV\ő腜åôñŸ»1Ž®NÞçR9>ÓñÙ A‚1ió5ÐO—èôcB°ÿ"¢­¦Fêë™;w.õ Ãó¡³³“5kÖ–ï5?¦KÅd¹ Ÿ,—KÜ(z€å`9ÖÈ¿UÕŽwl.¦àÕÀógÜ Ë—‘æ>òR(Äöª*é ‡ „ÃÔÕÖ2µ©‰ÚH„êêÌg¯¾ú*mm£‡ŸÜc´A¨ 3<~¶ó)Ùsg%XÛÌêTõóã—‹.ÃØ›¹ô¬2c£Ù ¼²V„÷ªªØ J4D,‹@b ƒC!vïÙST ˜nZcÂdúLàÐ…˜ynóqûŠù?fàf§ÌOY¯ª'w\.[€ÙÓ€_ƒÝàjR c؉-|¤ËYoǘfÛ] 1#u1LÝÆXÒñ‚ªÍ¢Õ˜6Jµóý4ŒtžÓp;”üÙ¾â‡zUuÜ  Y×TuHD®~·¬[@î­ôŸ 9dRñáÛÅÈÀöäê¶LÇåd-RÕ—€;^yðÐz<Ɇd½–é¸|\ÂnV| ä1_–?bªG‡W3›³œ°fŸvÙÀ*ÿðE0!ùz2_bÀ ™ŽÍk^€ª¶g[¸䇾&O—´DžÜ¥ª;2_ÐÌ ™‰y%Êb0óÿ)/aŸÒÐ|,grû&`©ªfôW)(H”ªîƼåóM€GARâáúT€÷0ÓÌœÌ×dË|("J˜ªîÃTƒ4¸,¿]P~^¹¬=f3Žqÿß\Îu%>€ˆ\ €\ fdæÝ½>¥ÃùfÒK¸¸TUŸÊõnˆ˜1/c¨¹ô‹‡ÉD‰ÆÀ×ÁÚ”ÜÕŽyqNO~WCÄ8fã¯`¢`NãzƒãTŽ—;îìîyb¤£ë+ÀÕ…˜(I HÇåàjœvÆÑ•‹üÞBA´?ż¬:eÈ1“v.ôU4%êøÜ ¬Hì‹—:¾GŒ{¦O‚uÀO@^9ÈîÃL?PÌõË*VDÎÇT g&ö1S¾>=ÒÍØü—3écÓȯ¢ÀÏ»Uõ-7îUî7†,n.Å™qfœ}%æ ⟠Ê´aÞBþÈŒñ¼Ù‡yâ¿çÆŒàT*õîàÀ Àu˜©ÃÌÆÌ_‰yyãáʰX ò"ÈFÒŽ[¯~ü´T/šªˆ†o.R \€).`”s͘÷õê|Êv…AàMµ˜z}HšU` ðð˜ªî,uº**€TDd2pF çaœuF0#„S0oôœñÜ™(Ä1±Þv‚lÇ Éît¶w2îÜÂL¦?ü§cf/F©ˆH&$ÊÙÎ’.xæí# 0ïãY謙 \ »C Ó%Û’È`çsxºxz0ýö—e­ª–Ï}yR£‘©˜Á§³%k[Q€zŒÇn£ùÔFLÃ<±Që£?cNX–Äv¦±–ãûÞâ}lq–͘'}ýDye"ˆÔcJ…ãF-¥št3C÷»-i–*ù"ˆ\9$0"Ò,´§¦ùœŠi6 ¥Y¢9ì2,„-Àމô4Âa%Ÿü)÷kã|&¾<Ž/ã Àãøð8¾<Ž/ã Àãøð8¾<Ž/ã Àãøð8¾<Ž/ã Àãøð8¾<Ž/ã Àãøð8¾<Ž/ã Àãü?\Ód#š¤›IEND®B`‚stem-1.7.1/docs/_static/section/download/osx.png0000664000175000017500000000711413157571677022410 0ustar atagaratagar00000000000000‰PNG  IHDR€€i7©@gAMA± üasRGB®Îé cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDª#2 pHYs  šœ EIDATxÚíyp×Ç¿»–,Ù’¬ËàlÙ–‘m0cØ%Î ))Ó É¤$i:MiÓ 4à ù#“i)Mœ(tB3mJ†` I“”1„„4Lì„#ã[¾À§,ëÀZûú†pYÚ•Vhø2üxo÷÷ûì{¿÷{ûžž€;º½EEÚn2cgÐ ‘Š"¯,‰´kUnd༾‹Š xaòê¢àÅ0Ž S7hú³úäö~µ>PÇñC°·7£x¥$qW)YÝ3 Ȱw%Úa‚kiÌ꯺ ;/è°ÝK”¡Lýá|Çή´° Ãè¾4Á•v¢²qþ°Úê:ç)DAú}@tUíêÖR;n6FÓˆGÊ÷€ˆ3ÿ­öÉF¸¦HPh$³úï/e\V7À7e~&±Ž¯§ÖøÂS¡ó¥Ožh;¥ûÒ%lö.”ѵc Ìí·Œ–H¶iìÂÞY•ýÆR‡ß¹Ñ.Ù—°÷EŒÆÉ¼# Fü> -˜†³BO_EÑúÐ_Ñ©ò_†‚¶¹°ÎîúÞ"0ûSßfúoÙ¤USG2¿»ÄÉë—[ˆß2QÐ6›¶,ÃÝE ÷qû£¶¯¦âñ`ý_:Âq÷ˆhÇiŸÜ¿ûÑİ۽æý°Ü?â¡|Úê÷ùSXÌ.Þê±…çõećÁŽDf)ëç9Ìs½’Õ®··nc¨azÙ©#È`¼šõªÏ. " €’ÏÄFM=ùÉõU¤mr‡¯¡F¸ ¸Tº572ä³Eçþ¹‡M£ÐMF¼7sž†–”Ž.|cvã5„Õ‚`p}nK@A ÅÙû¾NX?Û:æÖ…Ù‚ˆW‹ ‡º5í‹9›rºN³„ÛýˆQÒÉ@ gÓapX7,¬k©•ByU©~xÁà»d9K@ ^Ýp¢ =8‹‚ÌÄ ÌE&ˆ¾Iy«~´¶[O@CzîàúöêD-–Lþï(lhÁ´áêqéeš‰_; HE1;d‹lýhC4HJƒh¸A !… *h<Ô‰otƒÁê1å=E•çýñ ŒÁ  £ø;ÖÎí‹“BAñ•}€ã¶K ‡ ³ZÿeɃ¡Ìi^ £+L'ËO)Ó_QZ`…v0ˆ… J$!ÞÑ·¡Ð1§ººµZÈ®ÔtÃa4ÔA=ùi7NãÝ™UõtÒº±ô~Xà»:_!„è G<{é£ûªC T| A/R¨ó4Ö}•nÎÅ’ÁɵkêÊ¥Éä_’ÚÌÆE]ÖM9ìGd fÜÐüºñþD×À°úLééDùÊAXA@ÝÄH€… :h,Q>È&oÒtcß´›…@~Z}÷òÖçNçÉÆá=å XDC“v*a»ïО·ÇË¡Ÿ|êÃE-~®hN”o?¦n7MèlpßÔõkÅPB‹ä³¥_G¯Ï°¶¹M·€ Õ0OT~‘8 pq¼ ƒÌ™=‘sn`}9«;UÉè0Šg0PpX:ã¹Þåz†D#Ž”ŒÎ}ÃXae4¼œ @2LŸßÛ¶®Ãx1¨úRX#ÛÓ¥Ç(ú•©/w){)oD›ñú}Ç6Ž´¸ß•Ò1=†Â«%C)ñ[‚³OúFfS‚èç×KéJ=0ÛoÇ…‡Ùtñ§ƒ×Ù<×Ö± Ââ«bÄMƒ”ø;Ųžõ œþ#7ìà’Úø°ç#¼|˜Kg7OØâÈ@˜Í™-Ó% ˆERÍÝÃöð ì¬a«zš´™Ä°‹ê¼ú3fòOÐÎGþµóžÓʶ¤Ôˆj,Ç¢ÙfåõÔ¡îÚŒ'-¨®ì]™Äi(Á1g«é††*ƒŒÈȵï7ywèD,>h8 u>ƒò!Ý~n&Ñœƒ÷Ôf2â …)QOëܦ®Aø¡„|szEœÀ'< %IHÚRø×HÔƒñ¥m-µ‰ñkd d)¯æ~0BP Èr¦½`´‰/PÈdï«s7s¯lWöô¿›±1EdÖSðîìi<ê €‚–]Q·°U!ªÑ@Ž2§æ‡O ƒy1¨#†g3;Äs"#‹ùlÞÖ¿cÕBÍ¢@ŽjžIø‚AŠË¸avßßi8ÁS§—Ãâ99ÿѼjgø¾¸ Àý€}Æ3yGU2ÜeYö©ÃÍ“Hˆ Ò¡6½FQrmyÏûv/ ¢nÈm&|­ÚŸ%7G2f9L¿éÙ£ ª®v/ÌÝõŸä4ðŒdò(µ¨+ÿfAñ>]ŒB²eÆšÒ÷º‚ÜÒËii,°+êêøTç‚Î!²ÔHB’-C•8Ž8‘ÂSðaÜY i–䵪=²0HÛZí#€®sëÑ'¿¡—”‘T2»«oÓD!*h¡²(>LÙ;väa|ÀfÃÿY—~lõ1ªŽŽ_WŸ~!W¶ÄqÐÀS;§±¬‹¼~’]òéãaXñïÄ—Xµ²>ñ8.`r$# ó‘=ðvU y]Ɇa㦞r3Zà@#ÙÈ©þ¸µ jAŒÃðcU^°“‡*³ðÁ‹ø%oƒ/u‘¾Vw«ìä ë…ÖKÞwtGwtG\õôscop%tEXtdate:create2015-05-06T08:57:54-07:00bBÙÔ%tEXtdate:modify2015-05-06T08:57:54-07:00ahIEND®B`‚stem-1.7.1/docs/_static/section/tutorials/0000775000175000017500000000000013411004021021244 5ustar atagaratagar00000000000000stem-1.7.1/docs/_static/section/tutorials/resources/0000775000175000017500000000000013411004021023256 5ustar atagaratagar00000000000000stem-1.7.1/docs/_static/section/tutorials/resources/windrose.svg0000664000175000017500000001456213157571677025702 0ustar atagaratagar00000000000000 image/svg+xml stem-1.7.1/docs/_static/section/tutorials/resources/riding_hood.svg0000664000175000017500000014134413157571677026334 0ustar atagaratagar00000000000000 Little Red Riding Hood image/svg+xml Openclipart Little Red Riding Hood 2011-10-15T18:09:37 https://openclipart.org/detail/163771/little-red-riding-hood-by-tzunghaor tzunghaor basket fairy tale girl hood jump red skip skirt stem-1.7.1/docs/_static/section/tutorials/resources/tortoise_large.png0000664000175000017500000006464313157571677027064 0ustar atagaratagar00000000000000‰PNG  IHDRú¹ "ÿsRGB®ÎébKGDùC» pHYs  šœtIMEÝ £’p¶ IDATxÚìwxTÕÖÆçÌLf23™ôÞ+!„:"]ADPš`ï½p­ßUÔk»Þk/Wá *"`ã"  HoŠô@HïuÒ&ÓÏ÷ÇIb¨¦Óæ}ž<Ìœ}Ê>ïÞk¯½Ö»\8†—ÉõÿDAÀ$I˜´úŸ-Àr ÔõØ\páüGð0° šþ(U‚äì&ù‡ª%ÿPµ¤3(Nø:àE@ézŒ.´‚ët8€Ç›% 7…B K_âSôÄõÖ¥Áà«:å Ú*;ùÇÍìß\ŦïJ©­´| Lq=R\D?àW? ß ˆañ@è -›˜«+ì¼ó@Y‡M×+:ñ>4@T½Eáõÿw´M~k3`ªkýo#P¹õ¿³ë¿ç‚‹è,Æ ŸJ>AQ®$”äË<Úð´ 2Ìà7`°»Þ pÁEôsŽÿóðQr÷?cˆï­o_óKl󀌮F`8n 轕ÄöБ¨%$ÆX jD…€$Aa¦™Ìƒµä3“¿º‚‚ 3å…Ööq´"Zƒ•›€ Ø,NªËm!V‹Œ=ÉØ l¬ÿ½°»^;Ñ;³€ÿ3øªøÛ¼#ÕíÚ¸±Ä†¹ÖA½YÛô¦ã‘ƒ„©e‡`O=±½tEj$È9jbÍçEû½–ô}µÔVÈ'µ»HdW-þaj<ýTxù«ðôS¡óT T‰¸iD”nòÀd·J³¼¹Ö‰±ÄбÄFE‘•ò"•%6ŒÅ6œN锋W»‹¸{(0UÛý,uΉÀÄú…§‰_€Ÿ€5­x6.¢»Ð"ï*T¿×î$øc£±áŸß5ãë À ÀÌúY…R ¾·žîC<é>Ä@P”æ„,uNl©dÿæ*l­¢ªÌÖø™Î ¤ûOb{èïâNp´;‡÷6XÑŽú36ÀXyêÅDÅ…Rœc!/­Ž¢,3åEVŒÅ6ª+NŒ4:*µ€ä”¯ËXl;á;nj­AÅìÔÔU;ÆÕ[)Ô¯ó—×?£Í€ÓõjÖ?W×#h< ¼2åÁPÆÜØîÛ­Ï]ˆÒ<‹Y’FöbŸ m=±ïR”*äË<é7Æ›îC h´Š°YœìÛTÅîµìß\‰Õ,óÂ]¯ ëºö7Ð¥¯žcs[t½áQ!ìß\IÚ5¤ï¯Åb:•o_^J”nZƒ§̵lV'å…ÖË)ƒ€Ú]Ã!a³8Oð%hõ êjØmRÛ]ŠÄ·À§õf¾‹è.´ñ! Skqÿ^ו[û;¨ú¬ˆoÞÎxxओ€{% ƒ @—¾ôëCÊ(/´ŠSÚË:lbóòRv®® ®F&”O }®ð¦×0O [nÒ²ýÇröýZyÂLí ª·´„ƺ£aÝשÍjsØÄxÊ ¬”æ[É>b"ûˆ‰üãfö?M|­A¾?SÕŸƒÖCÍÚd0HGb0y{ÏEtZ  ,¡ž9'´{ãÙGL¼zK*›T.IÄåõþŒl˜!‡Lòeèd?|‚ÜNiÇjv²ýÇr~ý¦”ì#òöµ§ŸŠ~WzÓ÷ oòr Z|mñÝÂØþC9Û,ot̹ë$ 4Ð}ˆø=k—¥¶û3|e©{ª9¸µŠ´½5³¸ÁG…F/R^`mü›ÖC!{ÿåÁÁ‰¼=ù>°îR2í]Do;€œäË <øN\»6\]açåP–o˜| L¯'xèÒǃa×ùÑ{„ ¥pZ'Þ†e%üúm)5F;¢(ÐmË'ûQ][Òº—ÆæÍ¦ïJÉ8P €J-’2Ò‹Aã}Ø»-³Ó; ©w$»Ö”óûz#v«„B)×KÊMàÈîjìV AwSµ£áÍ?ŠÄkÀ"äÀÑ]8+DJ<}U>ÿ\ݽMA1MQ[eç»ÓÈI51räH³§§ç¡•?® ³Yl¢B ÿo®¼1°x÷Ó_’káÇÿ²cU9v›„ÞKÉÐ)~ ›âÏÝY­»¦=ë—PUfC!¡·ƒ&ø™–wÞtFpH0›–—’{´Q!2Ê‹À ‡¶U‘q°¶Ñê°šåY^(”$þ ü¨qÝ…³apóMÏErÙDß67f,±ñÞCÇÉN5Cuu5%%%¨Ý ™äËèð v;í±…™f~üo!;ªÀéŽÑ0jF‚ÚØºÙ2%‚Ÿ³yyf“w½‚a×ù1üzVyþîfuëÉÊyd2!*FNógàÕ>lÿ¡œMËK±˜œ¨ÝE$'X-NRIâ¥z›]DwátˆºëšG>Œ'²«¶Õ ¥ï¯å?ËÀXbÅÝݺº:Tj‘‘ÓüsS z¯ÓZYþA>;V•#9!²«–«o¢º¶uÙ­q~lúºŠ-+ÊpØ%|Ý9ßÒÒ¢ ªc’zG²ìJó¬xª˜ñx8ñ)z6~]Ê/_–PUnCé& r Ž /IüXx1­á]Do?Ü ¼¯Ñ*¸ç_1tàÑ¢ƒmV'?Ì/dÍgEŽ$¥JäòɾŒ»5O?Õi³˜œ¬ZXÈÚEÅØ,N"ºh¹æÞ`Œ•%­¾‘Ò -ëËíÇh¸ê– ÒS/lgµFéËÚEÅ8ìC&ù2ã‰p¶®(gå¼*Km¨µ"v«Ôà¸Û <lwÝ…“q7ð>âàñ¾Ly0Ÿ³Ç$9»ÖT°òãBвÍkü~c¼¹öþÐ3šè’¶~_Æòò©,µáé§bÒ½!8•­¾xs…«Qc´ã䯄;ƒÉJÏ»h:gèøx>~2ƒÂL3á]ܹëÕR÷çP–¥m,µEÓíº‘ŸU.¢»Ðc(w½‚!“üHéEP´A‰Ó)QUj'/­Žý[ªØ»ÁHy¡ACO£’´L<œ˜îº3ž uw5_½‘Gvª µVdôÌ|"ZŸñiððgÉë9”å[ÑŒ»5è‚3Ñ[‚êBö¬«@kPðÀ[qäçÔ¯ë#äåÏò¦»‡Løzsþ>ä¨;Ñ]1þü{W¯^ýþÊ•+1›ÿôë¨ÜD §ãÏ€Qq:üTL}$Œ~c¼Ïè¹7–ØXüj{7D<Á—áÓ<ÉNkÝ:¼[Ÿ–¼žÃÞ •²Ãjº?v¡ü’è#?¿@¾y;•Zäž×c(¯(nüÌ? O_È¢,ߊÎSI]µ£!ÿ“zs¾ÆEôK‹/NR({Édbûöí:tˆ’’*++Q(xyyQQQA^^‚(0bª?“î F£SœÞL—d3ý«7s1U9ˆé®cæSád¥å·ú:M¥¬œW€¥ÎIlO7<Á¯+]R}ʧÏg#*à®×b¨ª9ѯ‘µ×Mß•" 5(©1ÚAÖñ›†œ>ë"ú¥Š¥K—.¦žéóM›6±`Ájkk OÐ2ûÿ"ˆêvf/}Y¾•E/gsp[n‘kî AãÝúåbd\ žÍ"/­§’)†‘ÉöWRïH>~2Q!ðØGñäf!èëÀ‚g³¨,µáä&GÊYs7Ë\D¿ñý÷ßkM&S%§É ¬¬¬dþüùìܹ•›ÈÄ{‚¹â†DÅé»@r†¯KøöÝ<,&']úxpãsÙ›Ó†µ©žï?.Àa—4Þï°:L5¶K¾ßbÃøäï™è½”Ì™—@Ú¡Ü“ƒ0æ=EúþZ<}UÔTÚ<ó/Ϲˆ~‰aÙ²eý%IÚqòß·oßÎüùó©®®&:YÇ-ÏGž’&Ú¥yV>y6“´½5ht ®{8´Õ/ Éá|òl&jñðQ2ëéˆ&i¦.øxðí»ùGk}Ëéw:2~S±yyjw…JhðÌ ÜÄy®ç"zû½—$I¿7üßl6³`Á6lØ€R%2þÎ ÆÞxÆY`ï# çfaªvÐý2Of=ÑêU‡É“¯ßÊÃjvÒk¸'=FªÈ>jtuÖi`1z²meƒÆû×ÿô–Ž­Ú“¥ÿÎA©ñòSR’g¥~½~5Pè"zûà 9s äŒ.ãy@t$IE€!33“·ß~›ü|y–¸ãåhÂÜÏx¬Ý*ñÕ[¹¬_Z‚B)0åÁPÔ^mÛº=ô«‚=ë*ÐèLÿ[Øy“~¾"u‹’‚ 3·¿ÅQvÚï¨>—… €ÈD-éûkAV·†¬pë"z Gvr]ƒ,hèwÒçfdAÁ|dÏè1à(²ÀàÑκȥK—¾¹jÕª‡¿øb6›!“ü˜þ·0Ü4gÎS/α0ïé ²™ð uã®WcÚä ‹Š å£'Ó)ζ4†¬û&ÕÅâf`øÄ^šu^dÒÃgv’êÜý˜ÿtN'$¤è8²«à0â|$û…@t?à!Aà~I ÀÃ[I`¤ƒ»MÂTåÀXj¥²Ä†Í*®*d!ÁõÀêzS«#â˜õ …âS‡Ã1Ù]¯`öÿEÐ÷ ï³°g]Ÿ¾¹ÖAÊH/º oÛe 6/¾|-›ÕÉÐÉ~ˆZ—™ÞbSÑÀòò¹üZ?¢zŸ9ƒÕÛ+€;ލHHÑs`kUÙ‡qž•Ð:߉þ° ð’$¡õ P1jF)£¼ð=³&[m¥â\ E™ ³Ìä«#ó‰ÊÒ?×\õ™J‹³ÎöµÓµ& k•%…'¸s÷¿bÎz’¾}/Ÿ>-Bé&pýÃa(õ•mº€¼Cj~YR‚Z+2ëéŽÉu±¶ &|a¦™g¾H=Ÿ‘ˆèÒ׃[ž<­4R[à°Kìß\ÅÆoJ8¸µÑáõrxcKmÝ'WJisÂ~½ÿ_8ï?rœœÔ:"“´Üúbi[ï¬Mìλ§0ÓL\/=ƒ'k\^õvBñ1-‡vTñø' äž½²÷¹±ñëRz ÷Älrrdg5È 1w÷¢8Ïžm² °‰Ñ3¸ýѧ7l+DQ (JÃÀq>tl }¿‰ê {Od½ðoi^,³rÎò£zO%½Gʨ³¯Ç3ÔòÆÝi”äXè3Ú‹¾W ”—´>l:26„7îJ£¬ÀÊ ñ>øDÔRYfv1´0zF[–—Q]n'(öìßõ tPY¤ uW C§øSšoÅTåè”»\DÿlF"hÜmALy(´Ýd™Îï@7†Lò£$×B^šÙÙ£¿¹dñ™àƒ\4àê ~OxÂÙÅ&~ûÙÈû¤c®upõíÁDôh›EÄ[÷§Q[egâÝÁ8Ä 3Û¹Ç+ÐéôÜVÅõÆQVtöíα³¢Øú}‡wTqÓÜV…Ã.6!kÎ_òDw¾’¯œÈäB;õä¢B ÷o²›(ζ„#{NžáëaÀ w·Az/ Øú}Ÿü= A„[_ˆÂÍжýqƒÞŸMÇfu2ãñpÊÊŠ\¬ì ÊöäŒ>ƒ¿ã¬ß--¬$ex0»×TP”mfÚßÂØ½¦BÆ×ûœjÏÕ}ˆçÉóü;04i€É†œg…³Ÿ‰@ŸÈ}gZ#°H4Þ‡ÞŽÅ]ö±rý²>}> ¥›ÀýoÅbq´- ÔËÓŸžHG’$n{1š‚¼;lÏ$(JÓHö¿‚ÙVÆÀq>ä­£4×Êø;‚‘$ü5 ¸”‰'<îå¯âö—£Åsçô Pᢹ^ÙÉè+lB"bôÌnžuÖPV€Õ ùòµ4:¿GYiÛâ(üùÏãHÜùj4i‡s\Lì 烩ÚFÕ<áÏ5h V|”Ïà‰¾DuÓLF–ê¾d‰þ®$ávý#ag>ìÔµŒ¬~²›¤ °^’ð›toS ûKÿÁwïåóí»ùè<•<öQ<ym ƒ áýGŽã°IÜò|‡~w%¥tú•Å@v®nÞ¬^V\ÃäûC±˜œ|ûN·Ì¬ äC èR$z/`l—¾ôã}Î;ÔfqRšg9à¡“X%èg=Á¸ÛþºŸVÎ+`Õ‚B<ýäʪYÇÛ¶Gî çÿÇRçdÖ3®™¼“±vY*QIº¦[±½Ô‰NÖ±{m‡Ä5÷„PÙ9ïR$ú#×Þr^tèïë+X´Án¾R(·Û_Žfè¿¿lcã×%¬øOÞJþ6/¡]¢Ó~ø¸ŠŠ"WÌ $;Õ˜r.Ðc¨»MB«n¾nÿµ÷‡ I°â?ù\1+€˜:ËW½”ˆî'LNÖU±³`©sòí»y `¯wœ\,pS‹âïÄþeÌ:ÀŽUå,~5w½‚‡ÞkTm ”’7Ç~«!i€e.Æ#$ 2°oSógõ’â"ºôñà•ä¤Ö5uö¾ÞÙÜ;—DŸ$Ihúõ>/:ré¿rd™ ‰w€¾T(ñ¾7cI`øËã÷mªäÓç³P©Eî}#¦MznM±â£Tj‘Ÿ‹p±íbÛšãè½”ÞÙ²­Ñ‰÷#IðÓ§E„ƹ3x‚/@2pó¥Bô1I ç¼×.*bóò2ÓY¾Qˆ‚òî6¯CAº™yõ)‹w¼MqaûìkwíAY¾…Bཇsp½‚ƒëÛ¦"w¿s¹­?]{EpÙUQ.6v0b{ê0ÛHìÞìc ó éÒǃ½ŒT–Ú¸æžTjAà%äšö‚s0ó±§ŸJÓÙÁ1'cÝâb¾z#NÇW\ñCZÚ±¹‚€û­/FÑgô_[æZoÞ›Fe‰YÏD´yŸ¼)J +Q)ÜÉI­£ªLÖ)³Z$*Ь”YÉ=VÇÑ=5ì^SÁ¦oË©)SâìIò€@J *]Ìlg„EûpxG5QI:œÔ5û¸¸~ìZSÖCAË=qØ$Žî©Ñ#ËOmêŒk?W›Ö 2¶§Ž'>érÎ:î§O‹øöÝ<´Z-·ß~óæÍ£®ÎĬg"¸üÚ¿v¼I|ôD:¿ýlä²k|‰éÓ¹B‹Qq¡”äYÈI­#ã@-éûk1×ÊÑ[Zƒ‚”‘^ žàËÎõé.–¶ú æßwcøõþ„w·´l öN¢^ù>›EâékPSa/–$"é„¢ŽçjFˆNÖ5ËÉÕÞ°š,x.“u_£Óé¸ÿþ˜7o555L}4ŒSý›ÕÎÏ‹‹Y·¸˜ˆDí_¦2vŒåÕØì&Ü=m„ÄC·!nŒ™‰ÁWEižœ–»eE’MCÿÑ!”—T¹ØÚ¨ÔðÇz‚Ð.-›#ý=Ù¿¹ŠÈ$¡qîØ­GvUë€,:A#þ\­ÑÝŠÎ7(Šs,¼zK*;WWÁܹsYºt)UUUŒ»5ˆÑ74«²¹z©ÎSÉ=¯Çœ7/caA!þ1&ÆÞ©æÉ…]4Þ—¼´:æ=ÁþŸEƒ\Œm%²Ñz((ÊnùÜ0¡í^#' ¿Þ7wà±Î¸ösEôB€ª2{§ÐéXóyÏO;LîÑ:Ì /¼À·ß~Kff&)£¼¸æÞæïç/y=«ÙÉu…ž·QjyÙÄõ·ñèÇጻ5s­“eÿÎeÇr ïs[ÀH E-_¢eË#0RÍ¿Vb³:Ñy*r/@"påÅJôRÀTšo锓e1ñÊÍ©|ýVj•;÷Þ{/>ø «V­bÛ¶m„Å»së QÍN‹=¸µŠ?6V×Sߦꥅ‚#¾Q&&ÏÑ2mN ¥À·ïæsh£‚®½\Ûv-#º,Ûò ¯¾Wxc®u4FØœÐðÎ=v±`MY•¬ŽóC”å[ùä4;•¬C&Ìo¼É°aÃØ³gË–-ÃÃ[Å}oÆžUúéd¬ý¢Q!0ó©ð îEu3Tqí£Z®˜Hy¡•ç¤SpØ!ãâ\,n of¶|’ê>Äc.ÂÕ 8W+Ñ?øîÝö¯ûe,¶±äõ\þ>ùÛ,'*2Šgžy†‡zOOOòòòxï½wQ(îþgôkŸå…V諸ë2Ž^¸á¨A u<»¤+ÝHÝSÍ˳RÑ(}]Lþ Ôg7Òk4/»NÁaYf €AW7”&`æE;£Û_odõÂö)p‘¾¯–yOeðÔ„ü²¤?_zè!^yåzôè€ÝnçwÞ¡®ÎÌ´9aħè[ÖYiuH„ÅŸZŒ!®Û…åè:v0—”±ðÀ;±xú+Y½°ˆã»T ›ïbô ÷–7ªê+«¶]úè)Ë·R–/+ õæÕ`MÎîÈë>×y¡· Û¾}7ßP[é`âÝÁ¨Ô-{ò›Ù³®‚Ýk+(È—IIIŒ;–~ýú!Š'¶÷å—_’™™I¿+½v_‹/8 \ƒ †¯JД˜ª{ײ|üŸP(ô^JôžJ|‚ÝŠR®!8ZCQáùS½Çh,aü}îÙ¢g×O¼<+•I÷…PRRèböIÐyÈ”©¯»Ör¢÷õà_+9²«šË®ñEí.Ò{„;V•'!gs~H’¥Õi7þôY‘v÷:#—Oò%i °÷Säí6‰’\ éûjIû£†ã{k×øš#F0vìX¢¢¢N{²£GòÃ?àìÆ O·nI©fÖÓ¬^XDu¹­Ao°ZJ·?¯×f‘¨1Ú©1ÚÉO¯#ïxû771¥Dàh Ñݵ$öó@¥7QSyn…/sÐsh4‹_Ëæ«7séÒ׃Õ.UÙ&ÐäÝTݺ=:YNàÊ8PËe²×ã|رªà†Ž"úy!÷<þüƒ+V¬HZ»v uuæF"x¨p×)p:%ªÊíMµØP«ÕôéÓ‡AƒÑ«W/ÜÜμֶÛí<ñÄäååòȇñ$öóè´û“œòÚ¾(ÇLQ–…‚t3Y‡Lä55¤Å"ˆÑEK¡žô»Ò›cÏ]ñ…侑,˜›É‘Õø¹qï1lþ1ÍÅòzlXd'¾·ž×¶nå»hn‘]µ<ýY" Ë?<ü,uÎ4 þ¢$úwß}çeµZ˱®®ŽíÛ·³ÿ~rrr())¡®®…BÁ`À`0BBBñññDEE¡R©šuž+VðÅ_pÙ5¾ÜôläyñÂØ­9GMÙ%•ÈØ_ÛHü°xwúõ!.EAAι™Q R5¬û¢µ»ÈÍs#Û%íöbÀÆÅv‚¢4Œ¾¹uõÖ~"¯ÑßÝܳQŽìýGŽó‡\å%H¿èˆ~r©áŽ@uu5>ø¢›¿KBgPž—/ÅääÀÖ*v¯-gߦ*l' ¥@¯áž ìOii竽*œÞ,z9‡MâêÛƒ©©+¹ä‰¾c¹„»^ÁÕ÷jZuü‘- výTÁsK»';u7|UÂâWsîþÓÞ×|Î5ã‡WGŸcÅŠ˜LuŒ¿#è¼%9€Z+Òg´w½ÃëzpÛ?¢ˆí©cÏ:#oÞ{Œu ¬ˆŽÎÍ pˆ<öŸ<¼U¬œW@M‘.´ áò]IîŸ[tMÒµ;$kâœ]¡Pt(óÌf3?ÿ¼ÿP5îó¿`^µVdÀU>Ìù8¾IbÄTÊ ¬|ú|ß¿W‡¹¢óòøós xfQ"añîì^[Ay–ÎÅÖ6À/´èÖÈïªFM8ÉÏ9ÑNg‡æPnܸ‘ÚZ£f4(¼^pŠÒ0ã‰p^ý!™ñwc3K|õf.+߯«W§\ÃÝYŒ˜­"ª›–}›*)>¦u1¶•h¨²[/DÚˆ„=’„y›íâ"z```6XqrëÖ­ˆ¢p^¨Ì¶z/%ïæ¥Ýw[¦jŸÿ#›µŸXññéœ$•˧)‰ë¥çÐŽ*òj\¬m¼ƒdryщ¯}dRãàÙ÷¢#úˆ#ìÀѶÕjåèÑ£„%¸ãá­¼h^­‡‚I÷†ðÒòn ¿ÞŸ¢l3oߟÆõ"Ýút|’Ê É"‰ý=8ö{ Y{Õ—QmVç 1-Å‘½òîÅÉÙ›ÑÝ—D.:¢‚ðZG´[QQÓéÄ;@uQ¾p_3Ÿ ç™E‰Ät×ñûz#ÏN9„­ºã×ïýÆ $_f ã@-…©î—ÑíV w]Û4[Tnâ)q!a î ËËvŸÑÏ‹inêÔ©Û—.]úðp;6köññY,¬¬Ã&·ì#&4Z5•öƈ5ùÇÃîÄbrb5;±YO-¢ªP‚F«ÀM#¢tñðVÈ›š4 IDAT¡­^JôÞJ¼ÜðôSuJõ×Ó!¢‹–'taËÿÊøêÍ\–¼žKB=7=É‘?:nï»÷¨­ÔqdW5ž~>¸û^ü 6 ^@)š6]ï­8%^^©ïâNæAS §yå»/¢×ÏêI’¤îlcSGAX`·ÛçÏš5«0Klþã†#zýJ7¿7|CÜŠÔ«!4ÎX ­¢ž ™äK·A>ûG·VñÂŒÃÌ|"»Ðq9ócïÐñÍ¿ììXUÎØ›ƒ0ÛK/j¢'ôJë‹k:Û°üRRQtªÀdHŒ;™M"ì¼èˆ>uêT'p×Ò¥KW/Õßh³ IÒA¾•$iéôéÓ÷ôñ߀mÀ5õ£¤(NHHÐ5ê^N‡F£A­V£T*Ñjµ'MÍ&“ »ÝŽÙlÆb±P[[Kuu5•••TUUQ^^NII ¥y%fšO(Ý#²×<:YGL±=u„ĸwØìï¨âÁwâØ¼¼”¥ÿÊeÁsY žàKl¿Ž®¬©4óȇñüó¶TV/,䆧ÂÉ˹x+¼6$0¹ëÅ6½¾»tÂnPƒ°מD?/÷›$IbÉ’%ƒEQô"$IòÁÅ’$Eq°uêÔ©-šF,X qwwß/B\{_wEEùùùdgg“››Kvv6YYYX­ÖÖÖ]û{4Ð@ò`>3Þæ¯ã£Ç3(Ì4ëνoÄt˜)Ó%”Þv‹ÉÉ£ÿ‰g÷¯§òl¯AQ¼u_WÌ (¡õIHÛ¾u’¶·†·7ö<¡ôöžuF>z"à9à…‹nF?ÉŒØZÿÓîÐjµÏטí~Ý>>>øøøœœÜøw‡ÃAFFiii¤¦¦rààv¬*gǪrDQ ¾·ž”Ñ^¤ŒôÂÓ¯ý‡¡±î<óy"_¼’ÍöËyyv*w¿MqQû‡Ò¦§æqç«Ñ¼ó`óŸÉ`ôÍ:J j/:¢7èÅy¸Ñ*ÍMfôvÕAWp‰aÙ²eIÀ¢Î´fDQÄÇLJ¸¸8È„ñèׯØívŽ(`ÿæJ~^\BÆJ•H`„º]jÅ+U½GÊâû6W²cUÉ”íÿ’ÖÕÕéÍ-Uˆ‚­·íâ{ìRw×0d’/6G]«›É=,Q^håª[‚P¹ý¹ù¥vW°jA!@0ÿ¢žÑ;xYðçx[Q¢¢¢ˆŠŠbâĉTVV²sçN¶oßέÙ¿¥ƒ'ø0rZÞmŸåÇÜHP´†ÿ>“É¢—²™xw0ž!í?ãúE›ˆë¥çÀ–*¦ô ¥¬¼è¢zftO¦È$VkEô^JjŒöv ˆ¸¤fô%K–$ ‚ðÎùv]†ØØX† ÆðáÃÑjµäf°[ –•Rœc! \Á§m„ŠÔ4ÈÀÞ FöoªÂ/ЀÁßÑî÷3vV$Û~(çÀÖ*¦=OnFÅEó•dŠ”äY˜pW0%ù­/{•±×Ae©ñwŸš½eE5•vm{®Ñ/)¢_ýõÏÓÁíì? [·n\uÕUDDDPTX̾yüúM)yiu„Å»£÷j½!æå¯¢×0/ömªäжj< z¼CœíK†‚JŒ açêrÒ~¯Å/ÒyѼCé{8ì±umjçøïªËíLºïTÙèß×)ͳ ÀûÈõÙ\Do.æÎ+úûûÿ¸ R¯A ,,ŒQ£F‘””Daa!vå±ñ›RÊ ­DuÓµz^磻ïhoöm®äðŽj žx·ïÌn±šðôñàà¶*z Âl¾8s©Ûeщèžm£ÎþV”J‘±7žòÙ-Uä7|޼ËÔv?Ñ¥BôÄÄÄ8à‚,OÒ­[7^xáüqÂBÃÙ¼¼Œg§â—%Å8Rëfö~˜@@¸šÍËKÉ=Øþ1ë‘=­xx+ùa~!cg$^ðïÐqq8‘mOæ©­´7*Êž ƒoã-à œ‡,—¾9š4ÄEô†EŸ ýúôéÃ?ÿùOn¹åIÍ’×syyv*¹ÇZgFzªxô£xüCÕ¬_ZBm‰¾Ý¯yò¡XÍN–¼ž{Á¿C9©òsïÒöØ~»MÂÃûô>—†ðZ…Bqrr° ø¸˜ ¼ ä¯S_Óðt¸d¼îf³yŸZ­.ü@ÞÛ.//§¬¬ŒÒÒRŒF#555ÔÔÔP[[KMM ’$Ï–6› ¥R‰(ŠhµZT*ÞÞÞx{{ãããC@@¡¡¡¨ÕŸÉ%cÇŽeÀ€|öÙglݺ•—oLeòý!ŒšÐâˆ;Ÿ@7z?Ž×nIå»÷ò¹õÅ(¬Îö«ñîTVÓCÇÞ Fx'–ý;³.ØwhËÿÊ9· ÂØú0ô.ÝÃg̨T»Ë“ššú'ɶ!á×s¨'WÎÄÃWIÚﵬü¸@,/²ÎúWn]/\W"‡Óöõõõ½\«Õ6555^ Dn/ †ªððpSÏž=Å””¯°°0·Ž¾¹­[·2þŒ˜šûÞˆ%$¶åëÈ?6Vòáœttž žþ<‘C¿µ_•ج?Üøõ›Rî|5š£.<5ÙÔ­J ÒÍ<øNƶùÇ/âÁwâN;7}âĉ™+V¬8Œ¿÷ß±ôîù×ýÿy_¿•ðwàÑ}€ÉÀA`´ToŠ»©Eºôõ ù2]zyþj˜Õí¬û¢˜Ÿ—c19føÛh’ŠøÑG)===GÓA¸h•TÌîÝ»yóÍ7q:Üô\$ƒÆ·lì0×:xiöв,Ü÷F,U5í£åŸÆsSÑs˜'^açÿ¾ú¨É]xùÆ#XLN~?Ž’’öñ[ì]#°s%¯¬L>m%ߢ=Ú´nÝ:mT7O}Ú¥YV¨Íâä© ©.·•K¡ÔgÞœÏDwƳq’$oEiH¾LNïŒOÑŸp! ¶Òβ7òض² 䄿ÏpRró²eË4ÀtI’n†¶ô<ûöíã_ÿz›ÍÆ=ÿŠ¡ç0ÏŸyÐÄk·¦¢õPðàûd§µ Äo«àÐŽ*þ±¼k—¥ž×}uh£‚â S CíÙ~ê9«>2S]aç_{–¼ DOHHàèÑ£<ðvlcmõæà‡ù…üïÃ|k¹-†ó/2N†7‰ÑÉ:Ř™õTWßD·AüÃÔ(ÞÊÃM#WÏŒé¡#uwµ`®uzߋׯ¾úÊþÕW_íýúë¯Nž<ù;Q=wš5²ŸÀ–-[ø}½‘ØžºÆÚÞÍW€ …Rà_+©.sÝ>÷äËžuFôžJ,VÓyÛO…GÝÉ:lbÈ$?ü¢Û÷:w¬4çÎÐɧ¯æ›—VÇo¿©­­Aï-2óÉðSÄPÎï¿,)‘Ý °Ο€™ àyA XÜêª6L¸3˜|×§>í¨ø†¸q± Û ÿ·(‘È®Z€Iõ÷}Z±ô™3gî›6mÚl§Ó-IÒ;4S;99™{î¹›ÅÉ¥ŸP¤9sS ±=uìÝP‰^ë×.÷m¶•¡Ñ)عêüMt1•8²³š„>z¢SÚW‰<2.É ÁÑg^f:ëý}f³…¾Wz·8]Ù?LMX‚;Œmx§Î5Ñû_9À³z/e؈iþ<¹° /ý¯î & ââ•6øª˜3/nƒ Ïâ˳õÉŒ3r§OŸþR©Œ>£ZFC† aæÌ™ÔÕ8øÏãØ,ÍO0EYÏD P ,y½ý¶Äz\îIa–™aâÏ»>©*гsu9Á1FÝØþE* Òe€˜3ÝR÷§g¿kÿÖ•ÀŠï¥y¹Û÷\] LGÖqÛÌŒHÔ*o}!Š×~ìÎŒÇÉé~é”üQ»‹ÜózLCÝì‰È{¦gÅ”)S²§M›v“$I½AøKž‰'2pà@rRM|ùÏ–64Ö+fRQd£$½}¼ÎÉòÀÆ-ç—jly–Žß~6ÑE˸»´R¯>ûˆF{ægYWãlhã{·.,¹I1ˆþMt=ðdýìý¥B! ì{…7O|Ò…g%2ðjŸ6‰â_ÈpÓˆÜÿV,þaj€ûáÍ9núôéû:t9ppָջロÐÐ6//ã-Ë£žpg>Anü¼¸¤] DxX8¸íü!zÑ1wömª$ª›–a7(±ZìržãûjÎ:™Yêd¢û…ºµZV:(ªÑbèÚYD× À+Zeи[ƒxùûdî|5šØž®‚}ÞJn}!ªÁ ;¯þ¹ý%æÎëœ6mÚ|§ÓÙXw¦ï¹»»óàƒ¡Pˆ|ñju5ÍüP©E&Ý‚Íêä¶]áµ¼¸¿P5ÏýÛЫã9¸^ÁáÕħè¹|ZÇÆ]d6©9«¦@U¹ìh˲µ‰HI@G] Ü)Þtsý&ÜÌ++»1é¾v‘GºØÛSÇÐ)þ g)ÝÛ’cg̘‘?uêÔ+AxŒ38ëdéªk0[ùöݼ]Û€«|ˆè¢eûeÄ%…µù^#µXLNFLJ8gÏ;®k8¯Þ’JIž…á×û3pRÇÎ{AÁAØmq½Î>¹‹dkÂ'°õÎgg£%àÕ‘DŸ.¤)UbȘyåûd&ÜÜæ ;&?‚ÎS‰ ð-Ì.©S§¾át:G…gXߦïÊ(ÌlþTáÚûeñOŸ¶=p$,^^£æ­;'ÏÙYçÅüg2œpóÜH»[:üœÇ÷Éoq½Î¾î®®‰®5´Wڛ轀-À—¢Bˆ1ÕŸ—¿ïÆ”‡BÛ$t)Á]¯`øõ~HaÈÑ€-ÆŒ3¶*•Ê~Ào§˜á*³gÏÆéøî½üµÛm°È®Zv¬*oóZÝ'Hž­N®(ÚÑè9 Š}ëD~ý¦”€5O,HÀ!vÎV_Ú^y©×óìD7UËDWªZOÏ&K³šö$ºx=ÀàîCS.ç¨<€ç´•èJà5`#1îóã¹¥][SíÂÌäA††þÝ–vn¹å30XÑô‰ÄÇdzë'#•¥ÍŸU.¿ÖS•·6¨s5„/·£öÇ)ˆŒ eß:‘ïÞËGTrZèM*r3;¿6ܾMòVbÏ¡gçGe‰ GýLn,i½µsô7Ù0{öìȶ=9dóqƒ¯J|øý8nx*¢Sª†^2DØ8ò_ÕÖ¶¦NjÕjµ3A8¡hßÕW_Ýædã×-KX<Ñ…Rà×oZŸèÒ‘ æàzŸ>ŸEu…q·qí£ZT•ç¬?ÿØhDé&4 àgDi¾¥Ñ—’“Úºûºl¬"""‚>}úŒl-Ñ{»€!‰ý=xöËD’\Ìlg„%¸#ʳ^J{´7aÂp5Öð·þýûc0x°uEY‹ˆgðQ‘<Ø@ÚÞºöjS®¶J6Ù›lµ £&wA£ôe× XòzÕF;coäÿÇáyn“gbº„RV`%!ŵöì”+Í““þþþKl­òa¬œWˆÕì`ذa1_ýubK‰>\Ø"I„\9;GÞo*MëB;B¡ð•=ÓíV rêÔ©¥‚ \C½x B¡ ÿ”Y·~š‹Þ#½$øí—Öy¬k*äõ§Þ³m»1Qq¡äÒð씃¬^X„Ú]亇C¹þ þ1u¤,<ç}ùÛ/Æf™í%yòŒÞP¤s÷Ú–=߬C&~^\Œ··7#GŽÀáp n ÑCo$ ý O…sÝá5ž]èÔ{g54C·»d?$IÒ ÿ4h{Ö[ÔNÏaž(”BãKÜReÉ{øMª‡6 ~Á:"¢C(Íвy™ƒ…s³8¾·–äÁžÜõZ Wß§Áݧú¼êÇí+ËB³Ô~Jë‰>xð`ÜÜTüüe16kó¼ï%¹>x,§SâÖ[oE«mŒwïÝ\ªŠÀ—’„Ïø;‚v¿‹…€†½fdÁËvÃôéÓŸ$%%¡Óéø}}Ë«3(‰ï­'ã@-Áá^-¾†-úð„¿Îë58 µÂ—ô]n|óïJ>{1›[ªŠÔpÍ=!¼ô¿®ô#a²”žw}DIž…n Ͳ~KreÓ=""‚1cÆR^håüµópϺ ^¹)•Šb+'N¤ÿþŸ ‚×\»i04¡žñw¹ØIP©Çáv¯¬`·ÛS*•ãDQ êÚµ+»wï¦$Ï‚hógØ.}=8²«šŠ‚–¯³S÷T£ÖЬÿßÑþ>pT,™‡jÉ/Òxú©}éºý%¹–¼žËþÍ•ˆ¢È´iÓ˜<ùÄ8+I’šCô8^Ô¸+¸íÅèv©ÙíBóà¦i$z»+nÜpà ÆeË–Ý#IÒw D?º§¦…D—ÇŸ£¿ÕÑ£ùç‹ ¦º\–‘²½)ͳP’g¡²ÄƆEÊK)U‘]µD'ëèÚß@umƒv]5©ûª/ˆ>ܽֈ֠hÖ¶³©Ú±ØFB‚,ç£Õj™3gÎêÿûß“¾z3—Ýk+è=ÂÆb+G«áÈ®$§DLL wÜq111§kZߢÿ ·ëu%¢\d˜:uêò¥K—®KJJ räÖe}›ïKÒ¡R‹ý­šˆÍ‹š®ëëµóÐz(ï¢%"ÑÈ®:¢’´dg4D­Yšü¹Âsm#§4KÛ°a;-**ªñoݺu+|íµ×øì³Ïؽ{7j›šä$&&2räH† ‚(žñÖ¿"úuÀÐø=—Oös1ãÜ¡ÃÜž’$=¾GEòZXÃMé&çNæáÚ!1¦ÿ-ï@Þnäd6 CµF²3Œ|§­]TŒB)påìæÕöl¨íÖ”è‚ ”0gΊ‹‹IMM¥ººOOOâãã hVÛ5g#º×E¦Ï ï‚.4 …‡ÃÑ!mOŸ>ý·%K–,ó÷÷ŸZ˜U‚ä¤E»)Á12ÖÜìˆ3»PÊjLP“yqö™`óÂXRÅ ñ¾Mªg'z}ØjtttÓ8§A2  ¹Ä>y0O?[—Þ‰DÔà‰~íR=Ò…ÖcðàÁIÙ¾$I¯„†ÊUOË [–M'¿ Zh.Èøá¿…"Œ½)°ÙÇd®C¡ oøS1gH7n‘9(ŠûÏDt ð”ÊM<¥ › {ýþiLLL÷Ž<ÏŒ3öêõú\ ÅJ±AQ²ó®%¹í;ª t”å[¹l¢Á1Í+*b³8)È4†JÕè KE1½Íï‘Ýþ㙈~»$4tŠ^þí뀫.·c69\oC3Р’ØÑç*++Û 4­×,4ì W•Ù]$õcÕ‚"4:×Þßü8§Ücu8ÒÉf{º¿¿ÿê«­´f̘±ïLkô{J±7¶ºõ’\ Ld¬%çhå…VŒÅ¶Æ(ß7Bc݉ﭧßïf¯c.%4øûû'uô¹Ž=º ˜ÞRÂ6è 4ɾ¤±ì|¬f'×?zÆúç§Ã±úX€¸¸"ž3GŒa_¶lÙVI’F¶ÊW ¯ ‚pZ©¢¡@RŸÑ^-$¹Æöï¿ùígccÌnTn"^*4:Q(È0³/¿’}›*ùîý|ú^áÍÄ‹\ǽ¥hÈGÖëõÚŋ̜9³¸£Îe³Ù ås¶Œè /sÑN •¯.:6o~_ŸET7-#§·ÌiÖ@ô®]»6][¯ÿçR 5DÿåСC‹9CÏÜ0lJóÂ\í6‰]?•³æóbòÒäíµ»H÷Ë<‰JÖÝMÇm×¾B°ëN9ö¥ÿ%sxG5[¿/cçêr~ÿÅÈ”‡BO[Jö’œÑ«‰Ž õÎ™Ž‚ÀfmYþ¨B) P õ˱K—è]z„óâÌèÝEn{1…²ùÛT’i¿×¢×ë ûSxÓáp4¬Ï—/ÑI’²%Iš=wî\ç鈀ÀuÁQâSÎu)9aÓw¥üøßBÊ‹¬¨ÜDŽó!e”ï?z¼YóÌ5ààe¸ý¥h¿š#§Vعæ—°²Ì†^¯G¡P IR°û|¼N7ˆÝ&]Ò}õáœt,&'³ž‰hq¢N~zµUvúöM<¡Æš››[:ÀÔ©S«–-[öwI’>lîº\¥R]5eʔƅ“q7#¡~ýÙgÔœÔ:^½9•E/gS[mçêÛƒÙ}|)Û~(k6ÉOÆüg2xra<|”ü0¿ ÅIìV‰ª2~~~ fœÎKü±V /­ŽWùœ±pâYÍöz5˜ÄÄ|®v‡Ã‘ÛðŸë¯¿þ?Àü¿hÊ*IÒ ‚ ô›2eJnÓNžÑ§)UÆ9ë÷e|ñr6«“>£½˜úh8_µ¯]سSb5wåµ[RùúÍé›·óøé39¹ÿŽ—£ùø©ôvpÿ¸á0;W±vQ»×VЬÏ%ù•ÈÎÌ¢K’ÔÑ2>zÙ¿Ò²U’d颶¸PQpDÃÆ¯‹ñ rãþ·b›&!56‹“#»ªñöö>!ôU’¤S¤ºë‰ÿÖ?þøAUUUŠ ~N§³ÐÓÓs߸qãÎéÔ”èãz\~ú÷éÛwe’{ªxà­8žŸ~¨Ãàýsf±~éü¼¸ä’%zY¾Üo¾¾¾#zà @ëÑ2‡Z]µì0t÷¸´ôó©ùe‰LòÇ>ŽoÑVZSÙUÍâ¤÷e½OècQ?Ó1õ¤ÞÞ’ó4‚®è>äÔtº _•°za^*û(¡CI0±ç¿ˆNÖ‘y¸¶Q[ìRCƒA```gÒZ®áfª'z{i¿]Hݪä—%%ø»1çã„¥öžŒí?ȵ1SRRN²”¤½íyÍ Dw® ŠÒ4Tôüs ’jâ«7òÐè<òA¼ì)ïÄõÒ#9åm‡K¹ÇNLYt:]zÔW&lËf¦†ØøKÁt÷ гåk;W—«aμüB[ßEY~_oD«ÕÒ½û‰QÎ6›­Cˆ>D’О,E+9áÓç³°YÌz:‚g§ì´‡Ú#\QwI='µ}£é.ŠbG×.Šð nÙ‹[”-Gg^ìN|þ\)éûjI¾ÌÀ“ »´øYìÛXôr6v›Ä 7Ü€Fs¦JÚ¬Y³Úu`o¾ûà ÅÓز¢ŒœÔ:ŽóaÞÓéú`=¼"®:&.Þ锨*µ£óR4K 3QUf£²ÔF÷î'l·t´fqœ( øµÐ mH‚ ˆPc’xŽ IDAT¼HwD‹»³hî1ÆÞȤûBÚ¬´´ý‡2RwWÓ¥KFu²Ùþ[{ßCÑûD5!ºä„•ó pÓˆÌx¤k§?\µN&Ÿ¹ÖÑfBç7“y°–ôý& 2ä¸ûÊR;N‡„( „« ×е¿¾Wx·kËÖÎæMÍö+¹ƒOã¨B©jÙ Ü ò©¹èˆÄâWsÈ;^…w Š[æF‘Øß£ÍíÖí|õf …‚;î¸ãG«(Š›:Šè)jw‘Àˆ?͇}›*)/´2öæ ½¹Ó²Ã.GZ)TB«Ž=¼£šß~1²wƒ±>»É ¢ ŒTË]V‰ÂL3…Yfö¬3òÕ›¹\>Ù«n jµ'µ­È>¤ÓéìÈð× @ßRó[rBú¾Z<¼•ù#ç¢!x\· Vý·”E«dáÊÁ|™úhX»L’Ÿ¾EÑε×^Û4÷¼i_ÿÚD÷bþ¿½3‹ºZÿøû;3l3ì" ‹ n©Xdy]Ê´¬Ìm@-Ëö=­numv«Û­{mÑÊêff‹ ©Y©©y»Jš»›‚€ì²Í 3Ìr~  lÊ6¸ñy½æÅ ˜ïvÎù|Ïsžó<Ÿ§ïe#e‘íkN!É`ܬó#!U£³Å ¸¸¶½q Õ’Ö•²íë’†ºUnÞ F^ïIØ¡ƒT¼uOz‹Ç.JŒæÈN-;¿·¿{C9w¿Âkº¿–\nZs¥•JeÏJ#àtÍò¶¢ð„½ÎÂã<ëEOð>}=9¸ÕÀê×c2Zé;À…9Ïn+xÙ%øù«bþØ¡!<<œ™3g¶ô•Ê´´´£ö ú€à§Íöj­™Ô=:B£U<{Ó‘óÒèõYTm©äa2ZÙôYÿýæ†j ®ž ÆÇõfäu^üë¾ô6]o‘:ÔÀ˜þX ß/+äƒYÜûPb&zuë³;T‡‡; ùÌUu%•ì…€¨ö èŒC6%Öð¡*@wÑ<":ˆ_VŸbõëy˜ŒV|û:1åÞ>\u£W—Ffÿ£ŠïÞ/ÀÕUÅÂ… Q(ZÛ¿Õ'¢t5ÑÀFÛ){tX­¢Õà™î@Q}%г›“GvjXõæIÊ jñôu`úc|ýFn§®½ni> DòÁ“™¬x9‡Àp—6+…t…' hËMÄÆŽÌõ¼uBA¦èá.­:ÙÖPÀ–•ÅH2‰ëçúòóWÅ]výw=†¶<”/ç°ni>¼ÞM³¹­í££iMØù²1.®rz·£¦}M•…ô:¼ýÉÍ*¸hÈí yóÇ›‚ɨE&“>Þ“ñq½ãf—kÖTYx÷‘ã”Ûª¨4 ŽÐh4¤¦¦òÝwßõæ¿y]IôOßÓ"õyåÏúâ¼uHÞ1=J79^-b˜kËþšÅ‘<}xè_aüc^Z—ßÃg/e³g“;É¿j(È4nÿYýèo¶íÓ+®¸âÌ?Û31ðªj—ÒïÑß´˜kz…ðAd¦å]Äöòôåøá*ÒèÈ>ª§>î¨ï®ºÑ›+'{w¹\Z£±j,{:‹“ézbbb˜={vc‹ôÈ6nÜÈáǶ’¶Ï aE°XØ„WAM‰^’kDé.'Ä;ö¼tÎ?~LE±‰+Æy4|f“à£gl$¢bÅÚ×øKä»ÝËwù“ºWÇ/«K¸ýù`»>·¹VºO‡¿¿£ÐWI’RíxÙ¢¯jßlv`«­Ê§¡ÚÂ"u  ß`'üCœñ qÆ/ĉ>ýœÉË)ì–16 ÒüZв œÌÐs2½†¢¢ŽØ2™DØPCÇx0ì/ݲ³ZŸÝa6 V¼”Íáí•„„„ðÔSO58ß¶oßÎgŸ-Çh¬%ê*7âžêÛÌZ¼á?~ø¨€ŸùßÃèDДpwRÊœF½s­hæí^ðA$kßËo8þSÈ—¯)™ñD ï>r¬Ó”²G×àä9û6Wðëw¥ø‡8“u´û ëE såÈ.[\=E,ÿH²EœÄÄÄ4î$…Â^DWãܽ úìm…‹«œAW»sfØ´Ù$(Í7RxÂ@qŽ‘â\ÅÙF*Kk©(2Q’kìòððq l¨ ŸG|œð q¢ï%aÎçMËÀ¨·²ìé,Röj æ…^@©TbµZY¹r%›7oÆÑYÆ/‡´ZK’`êCèÊÍ$­+ÀVèôïéhç3D¦8mFÖcʽ}Ø´¼ÎÒnyÇkxï±ãû½?휹vd—¿§Fޏj™UÿÌÅÁQÆ}oôëÖŽëæÌ‘] ³ v#ºÕ*8ðs%žž 4èÌé§OŸžk§G›(£cÝ»¤ÂAÂ?ÔÿЖÍâj­Í)3º 5Ujªl3uMµå¬J7Ûìﬔ㬒ᬔãáã€O ã™g/TUšYòx&ÙV3pà@žyæT*&“‰%K–°oß>z:ñðÛamz¹ÎZÄát妧„àm ªÃDwr‘52y,Ñãžî˦åEH’-ª§UÛ[hÓò"â<û’ðïŽEJ=ôïpŒz+1ç¡ÿðq!z…™ ùûì”ní¼úL{¦Ìf¬B[f⦛®i)IR†sÑg\1Þ³{ÚÑ]Ê]\šªX9)z>~ö¥FFŽÉ‚ pttÄl6óÖ[o‘œœLßJžXÞ¦Zé`‹âœ8×—µKòݱÕBü¼#÷&ki ¹z*Е›Y²íZ¾{¿àÜ$oXKÚÈþÝû|±;¾CµûG[u͑ן|šR¿®+Å7؉oßé~ïn½âNM•ý OìÛlsn]}õÕMfzë!;]RL·)öºÓƒÎá §xóž J ŒLž<™§žzªä‹/&99™ˆa®üõÓÈ6“¼±S&½¹½?™¸:61¼üÐU˜Øð…-P´CàS[¤Úª··ûfÞúi(Gvi êïÒ(ó×ïJ1›S 8/X/,WØÇL4ê­ØZAß¾}éß¿ã’ÉvÙ鱯ÞCÇx\pæïŽÎÂÇÏžà›·Nâ wbáÂ…ÌŸ?¿^¹—eË–qèÐ!B©xlI8ÎÊö;=|ð v‰ké ¦¶ 0[›0Ù?Ä!`ßOåZ»IìßRÑîãv~_ŠÕ";çÑÚ5i])î½øä¹¬óÒ™õ3y{âîÛ5›o)Ç ·0aBs~³Ù¼ÇN°kÉ¿j°ZEkÛ‰?WðòÌn« 44”7ÞxƒØØÓ[Ò«W¯fçÎF¸°àýˆNŸˆá® p¦.d½#D¯¬×ýªG}^º¦ÔÔ®ÙüÌY½¼¨–ä¼5í:nÇšRœ”2®ºñôú<+¹šÊûiÙ¢Ic_¹¤¤µ¥8::0vìØ¦ÿªÌÈȰ—Çý àý™<{ãQÖ¼›ß"ÛƒÖQVPËÒÇ3ùä¹TW fΜÉk¯½FŸ>§klß¾õë×ãæåÀcï…wzkÏ–OÀ莮Ó*õ:K#Má°¡mKnÞ³[¢/TUšùiE1;¾=E­ÑÊÀ¹ÿþû lô½ÌÌLþóŸÿàè,ãÑwúd§æ ‰·~&ºÅ,0ÖX©÷¾‡ Q¡tS4ùkñ½{“””„——-³+22’ùóç7ú΄á÷·ùF¶~YŒ\!qÃuÌëãî—<~ü¼upAV Jw¹]B%7¯(F’$n¹å–fÿ³Z­ÿµó£YmuO¥R9'44ôƒÔÔT¾_VÀ÷Ë ðqæŠñŒ˜àEH´é2”Ù×ë,üüU1ÛV¨·àëÛ›Y³ÔŒ3¦™h„V«eñâŘÍfî}%”~ƒ»&ÅÕ³wÃË"¨ÃD›lo=Ñe2‰acÝÙ½¡Ü¶wÞ‚ù>iÒ¤’ÄÅÅqï½÷b±X$ðòulshê/„Pš_Ëè[z5{ûå¯iž{>PYbbÀÈ®OxÈMד²GËðá#Z P([»ó1?ÿüó,!eeeìß¿Ÿýû÷“’’ÂæÏ‹Ùüy1ŽucÐÕîDǺŸ7aŽn{Ágø_â)öl,ÇXcÁ»—7óæÎ`ܸq-¦˜Z­VÞ{ï=ÊÊʘß»K¥Ê½ü8ÜQ¢—h+L5úÖ^6¢·²F7™LMFX­Ö†5úÈväpÿøq!r…Ä”{ýý]Wn¦¦ÊÒ(W¾»ñпlYkçªE×lø¤!`êÔ©-ø9DÖÌ™3»ÕŒ±Z­%I¢W¯^Lž<™É“'£Óé8xð û÷ïçèÑ£ìÙXΞ6'mßþJv§ÿW†ªìæ¬ìNè*ÌüþK%û¶”“qÐfM3iÒ$ÆŽ‹ƒCë“ΦM›8zô(Ã\™¹ ¨KïËÑY†“R†Qoõí(ÑSÁ&=<à4¡úpÃ'À‘Ò‚Ú÷Ñ7nÜHNN!!!|øá‡!$P8ȸ~NÛîgÚ£hJMŒW÷n&5] âêÙò̱àƒHR÷ê¨Lrr2'2N›®ç§ É$ú91\Eø0W‡©:¥wÞ(9i$u¯–ƒÛ*É8X…Õ*Ëå\}õÕLš4©Q)ãÖ ÑhHLLÀY)çîWCÛ­½×¦þéĺI(É54h0éN?¾~ã¤äMLøªª*bcc™7o¹¹¹$$$@Ý á¶GÚTíÍŸ†ðÓŠ"œ”2¦ÜçßÜùQ§2ÓÔÛ=ïÅ~ü¤ÊS³cÖ.É盫ܙùDP—DÐ¥îÕᤔ>¤ëˆ.¬y/I’˜;·åI’¾íÎÁž˜˜è/„zÖÁ¢PETT³gÏF«Õ’’’Bzz:iiiädg“ŸYÃŽ5¥uý¦ (Ò…À#œ Œp! ܹC{É]fµX…ÙrSõ¤í¯"ý€®A›^’$Hll,±±±xz¶}§gãÆµÜöH@§´ÞÏŠN¼;@@Qvó„ƒknõaãò"´e6ÅÔ¦d/**â­·Þ:}ÂörH|»mᯉÿÎè·2sA îÞ-˜D¢ÉO`Ä/~ÿ_åYB©{u¼qgù™ýXþ‰7΢ÄhŠr ŒºÁ …c×½¡n« +¹šØØX"""Z\¦¤¤ìëN!njï1îîî ¤0dff’––ƱcÇÈÌÌ$ý€¦Á*ªŸ@z8áê„—¯#^~ôê㈗¯#ž¾xû;v¨†YSÔTY8•oËn++0Rœkädz yÇj0Ood¨T*FÆÐ¡C5jT#¿S;–Ö;¦=<<×®]6cÆŒ¬Ž}pÿñß«Z$ž·¿#÷¿Ñ¥Oç“¿@&èpËÈë¼HÝ«# Ü™Ûés/°Mž¨ä¤±S5Øý·^hß1Iël¥1Ó|º¬£V¼”HÜÿýgÛ¦YÞÝU&“!ÌÝIö¶.œœœÚå;())ià‰½Pï˜vuuÅd2ýhÑ맪$یӺIu•w- Åb|ðdsžkß¾ýëë6Ø•C¿T<@ÉÂ#ÛTó,$J‰©ÖŠõ+VFÎDVrûx^ÿ~0ÉI‚"]ºD¼_[±Êò¢Z¦L™ÒâvZ}«º{ ªÕêX,–@àY;ËV]Š0äçç—Jv ª(²í0ùøø IÒv¿Ìë~晇«)Ë4Å•“½xôpd|óæIÅzðêºAç¼ÈŒÇƒx%>•V3l¬O‰‡OÛ¢Ý"®87ѦM›FQQYYY¬X±¢9{*Û'±ee1V«hÕIØ^ü²º„ÃÛ5DDD´ê€«ÃGjµZ{>Fëœ9sJâââÞŠBŒÞÅþzò5$IúA1L£Ñä qºŒ˜=PŸoQWÔ#¢£kt€Õ½å¥#»4gÍ|;/®È—¯æ’²WË˳RX=ʃÁ׸ãâ„»·½…Syµ¤Ðqd—½Ö‚Ê]Áíÿ×—«oîÕ®tµpöíº÷ß¿ÁÉr×]wñé§Ÿ²k×é4îÖnZ»ãÙ½¡ o?G®º©ó!Œiûu¬}¯•JÉO<ÑZu€Z…BñÞ…0€ãã㟮BÌn¥ƒá—— ¶ !ž‹‹;p†%†Ao©SбÑs=´3Dÿxißæòs¦„ötbá²HRöhÙúe1©û´¤ìmy"òösäæ{ûpí´^ ”ð t$ Ì™‚V¶õœÏ,]d³""½ß¶‡Ð~öö/˜M‚ëo÷íttSþñ–=…ÕwÜ1¤¤¤Öêm!„X5cÆŒ J]­V[ë–uIBˆÇb$Iš&IÒMBˆ+.3r[$IZ¬V«›V-[ȶ½ˆ^¿­àÝ¢gøûûk““JÜ Õ–F©¢-›-4¨€V›Hݧ¥0Ë@U¥'¥ ÏÞ åFH”²Óµ¤¯æCââ–9`0øý÷ß>Ü&‘l±Xس§±VC[÷Á__?˜ëKñôuh$~Ñ¡5U±‰%eRSeáž{î!))‰””FŒAXXXÓ¯›e2Ù¸™ p îó|bb¢¿Õj IÒl©®þ—(ÁKO$IúX­V·&Òù0ódz]R™­ÁÉôüüüêS™;Et|xÛ¶mÙ½±œñêÞm>‰—Ÿ£oée·–޽ɛuïåcne t×]wñÅ_àïïÏ+¯¼Bzzz#룭[kë?,ÀbÜú@ŸNÉ+é*Ì,yü8%µLž<™n¸WWWRRRرcG3¢ !>‹‹‹Ë¸˜F¿Z­.Âæ8\%„à›o¾*“É®•$i 6q„‹Ù̯Ö !4Ͷxà\Nž}9©zFMêú‚œ¹i5ôb¯lˆ¹WvŠèS§Nýn×®]Ù²²˜1Ó|ì˜ß¸z*¸æ¶^ 1ÔM‘œœÜ´„’dûÌý¿¾mºÆÓŸôçÀÏôéçÜ©—–¦ÔÄÛ£ð„ØØXî¼óN†µ…‘ge5Û©’Éd/_äN)€äºÏ‡‰‰‰V«u40F’¤`0p¡ªPZÃÀv!ÄFóKÈݘè挃:»ØíõUk›Ôãë8Ñýüü’'MšÄúõëÙ³±œkoëuÁôĤyþüú] ‰ZƒõœÊ´2¹Ä¼ƒyçá¶”øú ›Ã/þ¯};,ü_^\Ë;§8ÇÀ˜1cxøá‡Â+]]]qss£¨¨™#û_u³ã%µZ]¬©û°víÚ`³ÙŽ\7ÛV15ê*7 2 hJM-~wà(7f.äÕ9m+Y6õ¡Š²mÉ+QWuL`"7]ϲ§²(+¬e„ Üwß}Íb¨FcÓ¤‰\I’Þ¾\¼Y3fÌÈŦS·éÌ¿'&&ú[,– ™L$„’$©oÝÏ`À·Îpo£ÉªB”J’TZ·¾.²…™2™,Ël6gÌ™3§Ä—€àÖ}?U4ÓUè tåfR÷é Å××÷Ì¥Elj>cÆŒ¼„„„¼‰'mذõ0kaÐ3PnyÀŸƒ?W¶OÇ#ï„#I¶·]yQ-ŽÎ2üC6΃E³Úžžúâ7QlZ^„Ò]ά';ö¬û·T°òï9Ô¬L™2…;™ÄPEEµµµŠ' !î‹‹‹«â2GESTçèk‹-’EFF6˜ÿ...ŽƒÁ*„0×ÖÖæÏŸo8±N’(ÿ_Â)ûvYØôŸ+°Z×\sMSBlj^7ø’fΜ9gÏžÝüwÕ)F^çÕf±H{ÃY)çž×BYüÀ1–¿Í3Ëûóó׫‰¾ìé,Ì&Á¼—ú¶[Îj|·´€­_£P8ððö¤äj[Äí³eŽ9²þOŸÅÇÇo¥mF]F_åz{!xG[nzuÇšSL¼Ý¯Ó'~]_Š$Iˆ.IR»Û ÙkG&“ípqqáÁBX±(Ç®JÚ‹È®Ì\HM•…%ç•ouèöYrÓôŒ˜àÉ=¯†¶}·6^ÌksÒ8q´šQ£FñÆÿ$<<¼Õc¾øâ ÊË˹å–[pww· !æÏ;·²‡—´Ó§M¯Õë̬|5§C5fs+üðQ!’$1kÖ¬¦Vwn§‰ŸV¢;3¶_ÇGÍ:k|w㶇ˆÿk_Œz+KŸ8Θi>ç,‘tì]&Äûòï2(/ªeâí~Üÿf¿6;³’«ùçü Ö-ÍÇÙIÉã?ÎÓO?‡‡G«ÇlÙ²…mÛ¶áïï_/ùbÉ~éâæ›o.‰ŠŠâÏßlQ£ÅöoO‘¼†‘#G¶¤B”ÙÞ󵸴zõê7$Iz ººš×_ÌÌLú VñÀ[ýðös¼`6+¹š•Ï¡ð„GCƸ}•;>ލ<TUš)Î1’¶_ËÑß´˜k½ƒœ˜÷Rp›%œ ³ |÷A>‡·kˆåî»ï>+Á6oÞÌ矎‹‹ ¯¾ú*AAAëÕjõ4érG¿L˜˜øgQQQôsÏ=GMž»_ mTy¨-È;VÃ?ïLGÂ7ß|³Q˜:LŠ‹‹ÛÚi¢'&&B©ÿ½¦¦†¥K—rðàA\Trn¼ÛŸq³|Î&Û]°˜û·T°õËbò޵ž·Ôß…îðãÊI^mÚ+/Ê6°ùóbvo,GXÑÑÑÌ™3‡Èȳ/, ‰‰‰¬_¿¥RɳÏ>ËÀ $IzH”ššúÑyŠêA÷}‹↴´4þñ×±XÍÌ{1øÌЍgEYa-oÝAEI->ø ãÇoNZIêÓÞØ‹VG{BBÂlÑLõë¶lÙBBbúj=ŽÎ2Œt#*ÖÈ+\é;À¥Ã&]‰¢l©{uœÊ3RSmÁ~C¾ÿIDATE%§W€#ѱîôéwî8d«Upx»†íßž"}¿! ´_(³ãg7‹¾k±£ÊÊX²d iiix{{óì³ÏÚt55>>þ‡Z\z8Ó>tèï¾ûFc-ãfõFýdÐYEFsRõ|ðd•%µÜvÛm­¥4ÄÅÅv‰é^wà $Iz§éßu:›7ofÛ·QYqڟ䬔6TEäp‘ÃÝè7XyÑ”ãµZÇ~¯â$ ®¤¢¤¹\FLÌ(&MšDtt4ç2·…lݺ•„„ª««:t(=öîîî-½‘P«ÕS{hqIÎè3… RÝÙÙÙ¼ýöbŠ‹KðöwäÆù~\9Ù»Q±‹ŠbÿK<ÅÏ_c1 ¦NÊìÙ³[s«ãââfwÑüñG¥^¯Ï|ZØÙÙÙ¤¦¦²{÷nNœ8Ѩz‹ÂA"$ZIØW›¶w¤3ý\ºT6¹3Ж™8ö{5$UräWmƒ&—§§×]w=×_=ÞÞm3·Ž=ʪU«ÈÌÌÄÅŵZÍ7Þx¶—Cn\\\H-.=¬ZµÊG.—rFŒŠ^¯çûï¿gË–ÍÔÔÉ%zõqDé&GWn¦¼Ø¦+ïãÓ‹»îšÏ¨Q£Îv‰‡âââ>ê2¢×½žBœ3}rݺu$$$0yòdBBBHKK#--•ââÆ‘†2¹„_ˆá.õw!0Üß¾Nxù;ØUÔ¿Zk&ÿ˜Vsâh5ÙêDûm ìCLL 111DGG·Y`0##ƒo¿ý–ääd$IbôèÑÜqÇmÒ‹‹ëñÈ]¢HHHØÜÔ’5üË/¿°oß>rss©­­E¥Rɵ×^ËèÑ£Ï&LR·´´ö={v^—ý«¯¾rwppÈΪD¡ÓéxôÑG±X,¼öÚk kÒòòrNœ8Annnç°°‹¥¹ÊY%ÇËÏo¿:!?G\½($”nrä N.¶¼.«Î¨·b1 ô:3³MáC¯5SVh¢¼¨–²B#e…&ŒúÆ?J¥’°°0¢¢¢ˆ‰‰i¶†>GC³ÿ~6lØ@F†-³tøðáÄÇÇ·ç<åqqq½z(qÉšï· !¾´Ã©ÄÅÅêÈRnún!Ä9•IwîÜÉÒ¥KñõõåùçŸoU³Ül6“——Gnn.'OžäÔ©S ºÞ••-¾: ¹\†·w/|||&""‚ððphïWaa!Û·ogÇŽTTT —Ë‰åæ›onIHâ\HŠ‹‹ÛC‰K–èŽBˆL:Xâ¸U²JÒSjµúm»]Á·ß~û“bò¹¾»råJ6mÚ„‡‡O>ùäÙÔN[-5 ¥¥¥TTT Õj1 ˜Ífôz=f³£ÑˆÁ`@¡P P(P*•( œqttÄÕÕ•Þ½{ããプ—W‡u¾…œ8q¢¡|ðÉ“¶4V///ÆÇĉÏ©K~<·¤‡—4ÙB,ëÂSÌfsŸŽFT¶iZ[»vmÙl>r.`Íš5¬Yc‹P›4iñññ¸¸¸\c2™HOOgÿþý8p€ÒR›Ð…““Æ cìØ±Œ1¢³%|Š$IŠT«ÕU=t¸´gu«Õú§$I]tÊOâââè°5ÐÃÍÀ÷´6ÛGå“O>¡¸¸•JŤI“¸îºëðññ¹ :£ªªŠŒŒ ÒÒÒHOO'33³açÀÍÍ#FðaÃprê1I’æªÕêU=T¸,È+„ØÕΜk6—$)¼NÌþD¯»ñ»êÖëç¼ñÚÚZ¶mÛÆ† (++C’$ À¨Q£ˆŽŽî’âvíAYY““Czz:ùùùÔ×—$‰ÀÀ@† BLL QQQ]^ÞGñ~||üc=¸|pfM'&‡—Õjõß;uŽö0X ´©`¸ÙlfïÞ½$%%qäÈ‘†Ây*•Š~ýúLpp0~~~ õ¸ÎµÅÐ’É­ÕjÑh4hµZ´Z-¥¥¥äççSPP@aaa£Ú]ŽŽŽ„……1`ÀHÿþýquuµgŸ'úúúÎ?~¼¹gø_V³º øV1½ƒ$ß×»wïk:;n:´—»jÕªh…Bñ!Äèö§Õj9tèþù'))) kà¦P©T(•JT*ÕYgýšš*++›‘¸ICáããC`` L¿~ýÎVÿ¬«ñ‘$IÔé¤÷à2\¯ !6Òþеy …âê®ÐûïpІ‚„„„[e2Ù#Bˆqt@àO£Ñ““Cnn.§NjØjÓétTWWc0œ]ÈÁÁwww<<<ðððÀÍÍ­áwÀÑñ¼eÛ$IzB­VÒ3Ü/o|üñÇ Å’$=ÞF~eÉd²IjµúxW\¿K¢³]­VëµÀu’$Ft‹ÅÒˆì2™ì¢ñàû,Ëü9sæ¤ô óœÁ•[…¯sFÂXK_sppx¨“Ê´]Oô&ò½âÖ˸/Ë…KKKû´'µ-aÑ¢E²¨¨¨[ÀB¥$IåÀoBˆ•ñññ‡ºúš]Nô„„„{ÿ\†ýW¼+IÒ¿ÎWEÔô 5tye I’¾BÜ\y™´a‰$I˜ÍæçÌ™SÚ3¤zp!Â.Tß|óM¨L&Û‹M|ÿRÅ!Äòššš¯Î³žxzp~ˆ^·V°Z­[$I »„Ú+X'IÒ µZ}´gøôà²'zÙ½…ïó.â6: |'„XŸÜ3dzÐCôVðI’^BL¸Ú¤¼Î,ÿY&“­W«ÕÙ=ä=DoßÚ=F&“Íf^@ë÷ãÀo’$ívΚ5+¥G޹=Dï“^&„¸'IÒx!Äì_;»@’¤4!Dš"U&“¥G/Å’Å=èÁAô¦B°nݺ0³Ùÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ<ÿýÿ<ÿýÿ<ÿý ÿ;ÿü ÿ;ÿü ÿ;ÿü ÿ;ÿü ÿ:ÿû ÿ:ÿû ÿ:ÿû ÿ:ÿû ÿ9ÿú ÿ9ÿú ÿ9ÿú ÿÿ&ÿþ  þ ÿÿüÿ#ÿý  þ ÿÿûÿ!ÿý  þ ÿÿýÿ ÿý  þ ÿÿú&ÿÿþ  þ ÿÿù Vÿÿý  þ ÿÿù" ÿÿý  þ ÿÿø .«Gÿÿþ  þ ÿÿ÷ 8²‡ÿÿý  þ ÿÿ÷;²²3ÿÿý  þ ÿÿö -;²Ålÿÿý  þ ÿÿõ <;²Å¥'ÿÿþ  þ ÿÿôB;²ÅÀSÿÿý  þ ÿÿô$B;²ÅÅ’ ÿÿý  þ ÿÿó 7B;²ÅŹ>ÿ ÿý  þ ÿÿø @B;²ÅÅü{ÿ ÿþ  þ ÿÿøBB;²ÅÅü¬-ÿ ÿý  þ ÿÿø 1BB;²ÅÅûÃ`ÿÿý  þ ÿÿ÷ >BB;²ÅÅü$ÿÿý  þ ÿÿýBBü;²ÅÅû½Iÿÿþ  þ ÿÿý )BBü;²ÅÅüˆÿÿý  þ ÿÿü :BBü;²ÅÅü³5ÿÿý  þ ÿÿüABBü;²ÅÅøoÿÿ  þ ÿ ÿý BBü;²ÅÅú¦(ÿ  þ ÿ!ÿý 4BBü;²ÅÅûÁU  þ ÿ!ÿü ?BBü;²ÅÅýK  þ ÿ"ÿýBBü;²ÅÅþ.  þ ÿ#ÿý.BBü;²ÅÅýà  þ ÿ#ÿü €ºÔ,Ôû½ ÿÿù#6q¯Ô1Ôõ½  Cq‘5‘þ >ÿþÿ=ÿþÿ=ÿþÿ=ÿþÿ<ÿýÿ<ÿýÿ<ÿýÿ;ÿüÿ;ÿüÿ;ÿü ÿ;ÿü ÿ:ÿû ÿ:ÿû ÿ:ÿû ÿ:ÿû ÿ9ÿú ÿ9ÿú ÿ9ÿú ÿÿ&ÿþ  þÿÿüÿ#ÿý  þÿÿûÿ!ÿý  þÿÿû ÿ ÿþ  þÿÿú/ÿÿþ  þÿÿù*h"ÿÿý  þÿÿù>+­*ÿÿý  þÿÿøf+ÒW!ÿÿþ  þÿÿ÷|+Û¥%ÿÿý  þÿÿ÷4+ÛÛ?ÿÿý  þÿÿöc+Ûò†#ÿÿý  þÿÿõƒ+ÛòÊ0ÿÿþ  þÿÿô&‘+Ûòìf"ÿÿý  þÿÿôP‘+Ûòò³( ÿÿý  þÿÿóy‘+ÛòòãK ÿ ÿý  þÿÿøŽ‘+Ûòòü—$ÿ ÿþ  þÿÿø =‘‘+ÛòòüÔ7ÿ ÿý  þÿÿøk‘‘+Ûòòûðv#ÿÿý  þÿÿ÷ˆ‘‘+ÛòòüÀ+ÿÿý  þÿÿý-‘‘ü+ÛòòûéY!ÿÿþ  þÿÿý[‘‘ü+Ûòòü¨&ÿÿý  þÿÿü‘‘ü+ÛòòüÜAÿÿý  þÿÿü ‘‘ü+Ûòòùˆ#ÿÿ  þÿ ÿýG‘‘ü+ÛòòúÌ1ÿ  þÿ!ÿýs‘‘ü+Ûòòûíi  þÿ!ÿü‹‘‘ü+Ûòòý\  þÿ"ÿý 5‘‘ü+Ûòòþ8  þÿ#ÿýd‘‘ü+Ûòòýï"  þÿ#ÿü„‘‘ü+Ûòòý½  þÿ$ÿý&‘‘ø+Ûòòk  þÿ%ÿýQ‘‘ú+Ûò1 þÿ&ÿýz‘‘û+Ó þÿ&ÿüŽ‘‘ü{ þÿ'ÿó >‘‘ŽnN:Jz  þÿ'ÿòC;D{½äååÌ  þÿ$ÿø#2i°áååüÌ  þÿ ÿø ".[¤Ûå åüÌ  þÿÿø!*M—ÓååüÌ  þÿÿú'B‰ÉååüÌ  þÿÿù%9z½äååüÌ  þÿÿø$3j±áååüÌ  þÿ ÿø #/[¤Üå"åùÌ ÿ ÿø",M—Ôå'åúÌ ÿÿú!(CŠÉå,åûÌ ÿÿù&:z½å1åõÌ "Hyš5þŒ >ÿþÿ=ÿþ ÿ=ÿþÿ=ÿþÿ<ÿý5ÿ<ÿýZÿ<ÿýrÿ;ÿü+tÿ;ÿüZtÿ;ÿüŒtÿ;ÿü©tÿ:ÿû2©tÿ:ÿûf©tÿ:ÿû”©tÿ:ÿû!©©tÿ9ÿú:©©tÿ9ÿú p©©tÿ9ÿúœ©©tÿÿ&ÿþ#©©þtÿÿüÿ#ÿýC©©þtÿÿûÿ!ÿýy©©þtÿÿû ÿ ÿý¢©©þtÿÿú)1ÿÿþ'©©þtÿÿù,7m#ÿÿýN©©þtÿÿù`9³,ÿÿýƒ©©þtÿÿø 9ÙZ"ÿÿý¦©©þtÿÿ÷'Â9ã«&ÿÿý+©©þtÿÿ÷QË9ããBÿÿýZ©©þtÿÿö›Ë9ãû‹$ÿÿý‹©©þtÿÿõ"ÏË9ãûÒ2ÿÿý¨©©þtÿÿô;äË9ãûõj#ÿÿý2©©þtÿÿô~äË9ãûûº) ÿÿýe©©þtÿÿó ¾äË9ãûûëN!ÿ ÿý”©©þtÿÿø+ßäË9ãûûü%ÿ ÿþ!©©þtÿÿø`ääË9ãûûüÜ9ÿ ÿý9©©þtÿÿø©ääË9ãûûûùz$ÿÿý o©©þtÿÿ÷$ÖääË9ãûûüÇ-ÿÿýœ©©þtÿÿý FääüË9ãûûûñ\"ÿÿþ$©©þtÿÿýŽääüË9ãûûü­'ÿÿýC©©þtÿÿü ÇääüË9ãûûüäC ÿÿýy©©þtÿÿü3âääüË9ãûûø%ÿÿ¢©©þtÿ ÿýpääüË9ãûûúÔ3ÿ'©©þtÿ!ÿýµääüË9ãûûûölN©©þtÿ!ÿü'ÛääüË9ãûûýi‚©©þtÿ"ÿý SääüË9ãûûýO¦©©þtÿ#ÿýääüË9ãûûýøG©©þtÿ#ÿü"ÏääüË9ãûûýÄc©©þtÿ$ÿý<ääøË9ãûû|‹©©þtÿ%ÿý€ääùË9ãûJ¨©©þtÿ&ÿýÀääûË9ÛI© ©þtÿ&ÿü,àääüÁ`© ©þtÿ'ÿóbääà­rLX†7™©©þtÿ'ÿòbORˆËö÷÷Ü:™©©þtÿ$ÿø&6r¾ó÷÷üÜ:™©©þtÿ ÿø%2b±ì÷ ÷üÜ:™©©þtÿÿø$-S£ä÷÷üÜ:™©©þtÿÿú"*G”Ù÷÷üÜ:™©©þtÿÿù(>„Ëö÷÷üÜ:™©©þtÿÿø&7s¿ó÷÷üÜ:™©©þtÿ ÿø&2b±í÷"÷ùÜ:™©©tÿ ÿø$/S£å÷'÷úÜ:™©tÿÿú#+H•Ù÷,÷ûÜ:™tÿÿù)?„Ì÷1÷õÜ:i%Nƒ§ª5ªþ—>þ =þ=þÒ=þæ<ý,ñ<ý€ÿ<ýÇÿ;üÞÿ;ü:ðÿ;ü’ÿÿ;üÍÿÿ:û áÿÿ:ûIöÿÿ:þ£ÿÿ;þÓÿÿ:ýäÿÿ:ýYúÿÿ:þ²ÿÿý"%þ×ÿÿüµ@#ýçÿÿûCü‰!ýlþÿÿûŒùÌ þ½ÿÿúÍñåZþÛÿÿùåíñ® ý+ëÿÿùZñìýÛ9þ~ÿÿø¯ýìÿéþÆÿÿ÷ Üÿìÿ÷Ð!ýÞÿÿ÷:éÿìÿÿålý9ðÿÿö‘÷ÿìÿÿñ¼þ‘ÿÿúÐÿÿìÿÿýßIþÍÿÿú"åÿÿìÿÿüì ý áÿÿúnñÿÿìÿÿüûÖ-ýHõÿÿþ½ÿÿþìÿÿüç~ þ¢ÿÿýàÿÿþìÿÿüõÇ þÒÿÿýLìÿÿþìÿÿýâZ ýäÿÿý£ûÿÿþìÿÿüï¯ ýXúÿÿýØÿÿþìÿÿüýÛ;þ±ÿÿý/çÿÿþìÿÿüê‘þ×ÿÿý‚õÿÿþìÿÿüøÐ"ýçÿÿýÉÿÿþìÿÿýånýjþÿÿ ýâÿÿþìÿÿùò½½ÿÿ!ý]ïÿÿþìÿÿûßJÚÿÿ"ý³ýÿÿþìÿÿüì±ëÿÿ"ý Ýÿÿþìÿÿþýÿ ÿ#ý>êÿÿþìÿÿ$ý•øÿÿþìÿÿ$ýÒÿÿþìÿÿ%ý%åÿÿþìÿÿ&ýròÿÿþìÿ ÿ'þÀÿÿþìÿ ÿ'ýàÿÿþôÿ ÿ(ýNìÿÿþûÿ ÿ(ü·ýÿÿþûÿ ÿ%ú"oÀÜëÿÿþûÿÿ!ù\´Øçþÿ ÿþûÿÿù L¥Ôäúÿÿþûÿÿù<“Ïâõÿÿþûÿÿù.Èßðÿÿþûÿÿú n¿Üëÿ ÿþûÿÿù[³Øçþÿ$ÿþûÿÿ ù J¤Óäúÿ)ÿþûÿÿù;“Îâöÿ.ÿüûÿÿú-€Çßðÿ3ÿøûÿ ŽÒæñÿ8ÿýþÿ=ÿþ ÿ=ÿþÿ=ÿþÿ=ÿý@ÿ<ÿýkÿ<ÿý‰$ÿ<ÿü‹7ÿ;ÿü‹qÿ;ÿü‹¯ÿ;ÿü‹Ô&ÿ;ÿû‹Ô>ÿ:ÿû‹Ô€ÿ:ÿû‹Ôº ÿ:ÿû‹ÔÔ)ÿ:ÿú‹ÔÔHÿ9ÿú‹ÔÔŒ ÿ9ÿú‹ÔÔÄ"ÿ9ÿþ‹ÔÔþ,ÿ%ÿÿþ‹ÔÔýTÿ#ÿüÿÿþ‹ÔÔý˜ÿ"ÿüÿÿþ‹ÔÔýÌ"ÿ ÿû ÿÿþ‹ÔÔþ0ÿÿú ÿÿþ‹ÔÔýcÿÿù (ÿÿþ‹ÔÔý¤ÿÿù .Yÿÿþ‹ÔÔýÑ#ÿÿø 9ÿÿþ‹ÔÔý7ÿÿ÷ ,<¨#ÿÿþ‹ÔÔýqÿÿ÷<<­M ÿÿþ‹ÔÔý¯ÿÿö $B<­Žÿÿþ‹ÔÔýÓ&ÿÿõ 7B<­¶ÿÿþ‹ÔÔý>ÿÿô @B<­Å7ÿÿþ‹ÔÔý~ÿÿô 0BB<­Åsÿÿþ‹ÔÔýº!ÿÿô >BB<­Åªÿÿþ‹ÔÔþ)ÿ ÿü )BBø<­ÅÂ)ÿÿþ‹ÔÔýHÿ ÿü9BBø<­ÅÅZÿÿþ‹ÔÔýŒÿÿû ABBø<­ÅŘÿÿþ‹ÔÔýÃ"ÿÿü 4BB÷<­ÅÅ» ÿÿþ‹ÔÔþ-ÿÿû ?BBü<­ÅÅýCÿÿþ‹ÔÔýTÿÿü -BBü<­ÅÅý‚ÿÿþ‹ÔÔý˜ÿÿü :®ÅÅýªÿ&ÿþ‹Ô Ôüp¦ÅÅüÃ)ÿ&ÿþ‹ÔÔóÀ 'S–ÁÅÅ[ÿ'ÿþ‹ÔÔüÀ  ø ,Kÿ'ÿþ‹ÔÔüÀ  ù ÿ$ÿþ‹ÔÔüÀ ø ÿ ÿþ‹ÔÔüÀ  ø ÿÿþ‹ÔÔüÀ  ø ÿÿþ‹ÔÔüÀ  ø ÿÿþ‹ÔÔüÀ  ù ÿÿù‹ÔÔÀ " ø ÿ ÿú‹ÔÀ ' ø ÿ ÿû‹À , ø ÿÿü~ 1 ø ÿÿý  6 úþÿ=ÿþ ÿ=ÿþÿ=ÿþ ÿ=ÿýDÿ<ÿýtÿ<ÿý“'ÿ<ÿü–;ÿ;ÿü–zÿ;ÿü–½!ÿ;ÿü–å)ÿ;ÿû–åCÿ:ÿû–åŠÿ:ÿû–åÉ#ÿ:ÿû–åå,ÿ:ÿú–ååNÿ9ÿú–åå— ÿ9ÿú–ååÔ$ÿ9ÿþ–ååþ0ÿ%ÿÿþ–ååý[ÿ#ÿüÿÿþ–ååý¤ÿ"ÿüÿÿþ–ååýÜ%ÿ ÿû ÿÿþ–ååþ4ÿÿúÿÿþ–ååýjÿÿù='1ÿÿþ–ååý±ÿÿùf(nÿÿþ–ååýá&ÿÿø3}(®ÿÿþ–ååý;ÿÿ÷aƒ(Î+ÿÿþ–ååýzÿÿ÷&ƒƒ(Õ^ ÿÿþ–ååý½!ÿÿöNƒ(Õ­ÿÿþ–ååýä)ÿÿõx‘ƒ(Õà$ÿÿþ–ååýCÿÿô<‘ƒ(ÕòDÿÿþ–ååý‰ÿÿôj‘‘ƒ)ÕòŽÿÿþ–ååýÉ#ÿÿô-‡‘‘ƒ)ÕòÑ!ÿÿþ–ååþ-ÿ ÿüY‘‘øƒ)Õòî2ÿÿþ–ååýMÿ ÿü!~‘‘øƒ)Õòònÿÿþ–ååý—ÿÿûF‘‘øƒ)Õòò» ÿÿþ–ååýÓ$ÿÿü s‘‘÷ƒ)Õòòæ(ÿÿþ–ååþ1ÿÿû5‹‘‘üƒ)ÕòòýQÿÿþ–ååý[ÿÿüc‘‘üƒ)Õòòý ÿÿþ–ååý¤ÿÿü'ƒ‘‘üƒ)ÕòòüÙ#ÿÿþ–ååøÛ&ÿÿQ‘‘üƒ)Õòòüñ;ÿÿþ–ååú5ÿ z‘‘üƒ)Õòòýÿ ÿþ–ååûj>Ž‘‘üƒ)ÖòòýÇ ÿ!ÿþ–ååý°D‘‘üƒ)Öòòüë,ÿ!ÿþ–ååýá?‘‘üƒ)Öòòý`ÿ"ÿþ–ååýF‘‘üƒ)Öòòý¯ÿ#ÿþ–ååý{q‘‘üƒ)Öòòüà%ÿ#ÿþ–ååø½R‘‘ƒ)ÖòòýFÿ$ÿþ–ååùä=‘ƒ)Öòòýÿ%ÿþ–å åûL)ÖòòýÑ!ÿ&ÿþ–å åü|Ìòòüï2ÿ&ÿþ–ååóÏ /f¸íòòoÿ'ÿþ–ååüÏ  ø !6\ÿ'ÿþ–ååüÏ  ù ÿ$ÿþ–ååüÏ ùÿ ÿþ–ååüÏ  ø ÿÿþ–ååüÏ  ø ÿÿþ–ååüÏ  ø ÿÿþ–ååüÏ  ù ÿÿù–ååÏ # ùÿ ÿú–åÏ ' ø ÿ ÿû–Ï , ø ÿÿüˆ 1 ø ÿÿý 6ýþÿ=ÿþ ÿ=ÿþÿ=ÿþ#ÿ=ÿýJÿ<ÿý}ÿ<ÿýŸ*ÿ<ÿü¢@ÿ;ÿü¢„ÿ;ÿü¢Ì$ÿ;ÿü¢÷,ÿ;ÿû¢÷Hÿ:ÿû¢÷•ÿ:ÿû¢÷Ù%ÿ:ÿû¢÷÷0ÿ:ÿú¢÷÷Tÿ9ÿú¢÷÷£ÿ9ÿú¢÷÷å'ÿ9ÿþ¢÷÷þ4ÿ%ÿÿþ¢÷÷ýbÿ#ÿþÿÿþ¢÷÷ý±ÿ"ÿüÿÿþ¢÷÷ýí(ÿ ÿû ÿÿþ¢÷÷þ8ÿÿú-(ÿÿþ¢÷÷ýsÿÿù"`53ÿÿþ¢÷÷ý¿ÿÿù( 6rÿÿþ¢÷÷ýó)ÿÿø!PÅ6´!ÿÿþ¢÷÷ý@ÿÿ÷$˜Ï6Õ-ÿÿþ¢÷÷ý„ÿÿ÷;ÎÏ6Üb ÿÿþ¢÷÷ýË#ÿÿö"|ãÏ6Ü´ÿÿþ¢÷÷ýö-ÿÿõ-½äÏ6Üè%ÿÿþ¢÷÷ýIÿÿô!_ÞäÏ6ÜûGÿÿþ¢÷÷ý”ÿÿô &§ääÏ7Üû”ÿÿþ¢÷÷ýÙ&ÿÿôFÕääÏ7ÜûÙ"ÿÿþ¢÷÷þ0ÿ ÿü#ŒääøÏ7Üû÷4ÿÿþ¢÷÷ýSÿ ÿü4ÆääøÏ7Üûûrÿÿþ¢÷÷ý£ÿÿû"oáääøÏ7Üûû ÿÿþ¢÷÷ýä'ÿÿü*´ää÷Ï7Üûûî)ÿÿþ¢÷÷þ4ÿÿû SÚääüÏ7ÜûûýUÿÿþ¢÷÷ýbÿÿü$œääüÏ7Üûûý¦ÿÿþ¢÷÷ý±ÿÿü=ÏääüÏ7Üûûüá$ÿÿþ¢÷÷øì(ÿÿ"ääüÏ7Üûûüú=ÿÿþ¢÷÷ú9ÿ.¿ääüÏ7Üûûýƒÿ ÿþ¢÷÷ûrbßääüÏ7ÝûûýÎ!ÿ!ÿþ¢÷÷ý¾eääüÏ7Ýûûüô.ÿ!ÿþ¢÷÷ýóTääüÏ7Ýûûýdÿ"ÿþ¢÷÷ýUáääüÏ7Ýûûýµÿ#ÿþ¢÷÷ýˆ²ääüÏ7Ýûûüè&ÿ#ÿþ¢÷÷øËxääÏ7ÝûûýHÿ$ÿþ¢÷÷ùöQäÏ7Ýûûý–ÿ%ÿþ¢÷ ÷û[Ç7ÝûûýÙ#ÿ&ÿþ¢÷ ÷üˆÓûûüø4ÿ&ÿþ¢÷÷óà5_IGv¿öûûsÿ'ÿþ¢÷÷üà8•©©øeEKiÿ'ÿþ¢÷÷üà8•©©ø¦ƒO%ÿ$ÿþ¢÷÷üà8•© ©ø¢zD" ÿ ÿþ¢÷÷üà8•©©øœp:ÿÿþ¢÷÷üà8•©©ø•e1ÿÿþ¢÷÷üà8•©©øŒ[*ÿÿþ¢÷÷üà8•©©ø¦ƒO%ÿÿù¢÷÷à8•©"©ø¢zD" ÿ ÿú¢÷à8•©'©øœp: ÿ ÿû¢à8•©,©ø”f1ÿÿü“8•©1©øŒ[*ÿÿýft5tùrZ5 þ =þ=þÔ=þç=ýò,<ýÿ€<ýÿÇ<üÿÞ;üÿð:;ÿþ’;ÿþÍ;ÿýá :ÿýöI:ÿþ£:ÿþÓ:ÿýä9ÿýúY9ÿþ²9ÿþ×%ý$ÿýç#ü<º ÿýþl"ü†üJÿþ½ ûÊù’ÿþÛúUåñÏÿýë+ù «ñíäÿþ~ù5Ûýíï_ÿþÆøŒéÿíý²ÿýÞ÷ÎøÿíÿÚÿýð9÷iåÿÿíÿç?ÿþ‘öºñÿÿíÿ÷•ÿþÍýFßÿÿúíÿÿÐÿýá üžìÿÿúíÿÿã&ÿýõHü+Öûÿÿúíÿÿðsÿþ¢ý|çÿÿþíÿÿþ¿ÿþÒ üÆõÿÿþíÿÿýÞÿýä ýXâÿÿþíÿÿýëOÿýúXü ®ïÿÿþíÿÿýú¥ÿþ±ü9ÛýÿÿþíÿÿýÖ ÿþ×üêÿÿþíÿÿýå2ÿýçü Ïøÿÿþíÿÿýô…ÿýþjýlåÿÿþíÿÿýÉ ÿù½¼òÿÿþíÿÿýà ÿûÚIßÿÿþíÿÿýîa ÿüë°ìÿÿþíÿÿýý´! ÿþýÿÿþíÿÿýÛ!ÿþíÿÿýèA"ÿþíÿÿýø—#ÿþíÿÿýÑ#ÿþíÿÿýã'$ÿþíÿÿýñt% ÿþíÿÿþ¿& ÿþõÿÿýÞ& ÿþûÿÿýëP' ÿþûÿÿüý¸' ÿþûÿÿúëÜÀp"$ÿþûÿ ÿùþçØ´] ÿþûÿÿùúäÓ¦L ÿþûÿÿùõáÏ”=ÿþûÿÿùðßÈ‚/ÿþûÿ ÿúëÜÀo"ÿþûÿ$ÿùþçØ´\ ÿþûÿ)ÿùúäÔ¥L ÿþûÿ.ÿùöâÏ”<ýÿûÿ3ÿùðßÈ/þýÿ8ÿûñçÔ!ù 6 ý ÿÿú 1 ü ÿÿü , û ¼‘ÿ ÿü ' ú ¼Ô‘ÿ ÿú " ù ¼ÔÔ‘ÿÿù  ü ¼ÔÔþ‘ÿÿú  ü ¼ÔÔþ‘ÿÿü  ü ¼ÔÔþ‘ÿÿü  ü ¼ÔÔþ‘ÿ ÿü ü ¼ÔÔþ‘ÿ$ÿù  ü ¼ÔÔþ‘ÿ'ÿøD(  ü ¼ÔÔþ‘ÿ'ÿóTÅžN#¼ÔÔþ‘ÿ&ÿü&ÀÅÅü¦pÔ Ôþ‘ÿ&ÿý¥ÅÅû²8?Ô Ôþ‘ÿ%ÿýnÅÅú²:B+Ô Ôþ‘ÿ$ÿý3ÅÅø²:BB-°ÔÔþ‘ÿ#ÿü²ÅÅü²:BBý3oÔÔþ‘ÿ#ÿý‡ÅÅü²:BBýA8ÔÔþ‘ÿ"ÿý GÅÅü²:BBý*ÑÔÔþ‘ÿ!ÿü"½ÅÅü²:BBý&¥ÔÔþ‘ÿ!ÿýœÅÅü²:BBûAdÔÔþ‘ÿ ÿý_ÅÅü²:BBú9ÿ1ÔÔþ‘ÿÿü+ÃÅÅü²:BBø' ÿÿ"ÌÔÔþ‘ÿÿü¬ÅÅü²;BBü=ÿÿý™ÔÔþ‘ÿÿýyÅÅü²;BBü0 ÿÿýVÔÔþ‘ÿÿý <ÅÅü²;BBû@ÿÿþ-ÔÔþ‘ÿÿ÷ ¸ÅŲ;BBü6 ÿÿý!ÅÔÔþ‘ÿÿøÅŲ;BBü# ÿÿý ŽÔÔþ‘ÿÿøRÅŲ;BBü;ÿ ÿýIÔÔþ‘ÿÿø&ÀŲ;BBü, ÿ ÿþ)ÔÔþ‘ÿÿó£Å²;BB?ÿ ÿý ¼ÔÔþ‘ÿÿôjŲ;BB3 ÿÿý€ÔÔþ‘ÿÿô3IJ;BA ÿÿý?ÔÔþ‘ÿÿõ²²;B9ÿÿþ&ÔÔþ‘ÿÿö„²;B' ÿÿý°ÔÔþ‘ÿÿ÷ E²;=ÿÿýsÔÔþ‘ÿÿ÷#ª;/ ÿÿý8ÔÔþ‘ÿÿøŠ9ÿÿý#ÒÔÔþ‘ÿÿùS0 ÿÿý¥ÔÔþ‘ÿÿù&ÿÿýeÔÔþ‘ÿÿûÿÿý1ÔÔþ‘ÿÿûÿ ÿý!ÍÔÔþ‘ÿÿûÿ!ÿýšÔÔþ‘ÿÿüÿ#ÿýVÔÔþ‘ÿÿ&ÿþ,ÔÔþ‘ÿ9ÿú!ÅÔÔ‘ÿ9ÿú ŽÔÔ‘ÿ9ÿúIÔÔ‘ÿ:ÿû)ÔÔ‘ÿ:ÿû ¼Ô‘ÿ:ÿû‚Ô‘ÿ:ÿû?Ô‘ÿ;ÿü&Ô‘ÿ;ÿü±‘ÿ;ÿüs‘ÿ;ÿü7‘ÿ<ÿý#ÿ<ÿýqÿ<ÿýDÿ<ÿý ÿ=ÿþÿ=ÿþ ÿ=ÿþý6ý ÿÿú 1 ü ‹ÿÿü , û Ëÿ ÿú ' ú Ëåÿ ÿý # ù Ëååÿÿù  ü Ëååþÿÿú  ü Ëååþÿÿü  ü Ëååþÿÿú  ü Ëååþÿ ÿý ü Ëååþÿ$ÿù  ü Ëååþÿ'ÿøT1  ü Ëååþÿ'ÿógòòé±`*Ëååþÿ&ÿü.ìòòüÌ{å åþÿ&ÿý!ËòòûÛ*{Må åþÿ%ÿý‡òòúÛ*‘=å åþÿ$ÿý?òòøÛ*‘‘Q¾ååþÿ#ÿü$ÛòòüÛ*‘‘ýp|ååþÿ#ÿý §òòüÛ*‘‘ýGååþÿ"ÿýWòòüÛ*‘‘ý>áååþÿ!ÿü*èòòüÛ*‘‘ýF²ååþÿ!ÿý"¿òòüÛ*‘‘ûCkååþÿ ÿýtòòüÛ*‘‘ú} ÿ5ååþÿÿü5ïòòüÛ*‘‘øWÿÿ%Üååþÿÿü#ÓòòüÛ*‘‘ü†*ÿÿý¦ååþÿÿý •òòüÛ*‘‘üiÿÿý\ååþÿÿý JòòüÛ*‘‘û:ÿÿþ1ååþÿÿ÷'âòòÛ*‘‘üw ÿÿý#Õååþÿÿø"±òòÛ*‘‘ûLÿÿý ™ååþÿÿøeòòÛ*‘‘ü‚#ÿ ÿýOååþÿÿø/ëòÛ*‘‘ü`ÿ ÿþ-ååþÿÿó#ÈòÛ+‘‘Š1ÿ ÿý"ËååþÿÿôƒòÛ+‘‘pÿÿýŠååþÿÿô>ñÛ+‘BÿÿýDååþÿÿõ&ÚÛ+‘} ÿÿþ)ååþÿÿö"¢Û+‘Uÿÿý ¾ååþÿÿ÷UÛ+†)ÿÿý|ååþÿÿ÷+Ñ+hÿÿý;ååþÿÿø#ª+}9ÿÿý&âååþÿÿùf+jÿÿý³ååþÿÿù/*Bÿÿýmååþÿÿû! ÿÿý5ååþÿÿû ÿ ÿý$Ýååþÿÿûÿ!ÿý§ååþÿÿüÿ#ÿý\ååþÿÿ&ÿþ0ååþÿ9ÿú$Õååÿ9ÿú ™ååÿ9ÿúOååÿ:ÿû,ååÿ:ÿû"Ëåÿ:ÿûŒåÿ:ÿûDåÿ;ÿü)åÿ;ÿü ¿ÿ;ÿü|ÿ;ÿü;ÿ<ÿý&›ÿ<ÿý{ÿ<ÿýIÿ<ÿý"ÿ=ÿþÿ=ÿþ ÿ=ÿø 2Vmo5oýeÿÿú+ZŒ©1©ü™8—ÿÿú1f”©,©û™8Ûªÿ ÿø9pœ©'©ú™8Û÷ªÿ ÿø !Cy¢©"©ù™8Û÷÷ªÿÿø$Nƒ¦©©ü™8Û÷÷þªÿÿù)Z‹¨©©ü™8Û÷÷þªÿÿú0e”©©ü™8Û÷÷þªÿÿø9oœ©©ü™8Û÷÷þªÿ ÿøCy¢© ©ü™8Û÷÷þªÿ$ÿø"N‚¦©©ü™9Û÷÷þªÿ'ÿò`DAc‹¨©©™9Û÷÷þªÿ'ÿókûûò¸p?F`6Û÷÷þªÿ&ÿü1õûûüÓ‡÷ ÷þªÿ&ÿý#Óûûûã8Â\÷ ÷þªÿ%ÿýŒûûúã8ÊäQ÷ ÷þªÿ$ÿýAûûøã8ÊäävÍ÷÷þªÿ#ÿü%ãûûüã8Êääý°Š÷÷þªÿ#ÿý!¬ûûüã8ÊääýàV÷÷þªÿ"ÿýZûûüã8ÊääýSó÷÷þªÿ!ÿü,ðûûüã8ÊääýfÀ÷÷þªÿ!ÿý#Çûûüã8Êääûáit÷÷þªÿ ÿýxûûüã8ÊääúÅ/ÿ9÷÷þªÿÿü7øûûüã8Êääøˆ ÿÿ(í÷÷þªÿÿü%Ûûûüã8ËääüÓAÿÿý³÷÷þªÿÿý!›ûûüã8Ëääü¤#ÿÿýd÷÷þªÿÿý Lûûüã8ËääûÞZÿÿþ4÷÷þªÿÿ÷)êûûã8Ëääü¼* ÿÿý&æ÷÷þªÿÿø#¸ûûã8Ëääûãxÿÿý¥÷÷þªÿÿøhûûã8ËääüÍ7ÿ ÿýU÷÷þªÿÿø1ôûã8Ëääü—!ÿ ÿþ0÷÷þªÿÿó%Ðûã9ËääØMÿ ÿý%Û÷÷þªÿÿô ˆûã9Ëää°&ÿÿý–÷÷þªÿÿôAúã9ËäàhÿÿýJ÷÷þªÿÿõ'âã9ËäÅ/ÿÿþ,÷÷þªÿÿö#¨ã9Ëä‡ÿÿý"Í÷÷þªÿÿ÷Xã9ËÓ@ÿÿý†÷÷þªÿÿ÷-Ù9Ë£"ÿÿý@÷÷þªÿÿø$±9ÅYÿÿý)ô÷÷þªÿÿùj9¥) ÿÿýÁ÷÷þªÿÿù18hÿÿýv÷÷þªÿÿû!*/ÿÿý9÷÷þªÿÿûÿ ÿý'î÷÷þªÿÿûÿ!ÿý´÷÷þªÿÿüÿ#ÿýd÷÷þªÿÿ&ÿþ4÷÷þªÿ9ÿú&æ÷÷ªÿ9ÿú¥÷÷ªÿ9ÿúU÷÷ªÿ:ÿû0÷÷ªÿ:ÿû$Û÷ªÿ:ÿû–÷ªÿ:ÿûI÷ªÿ;ÿü,÷ªÿ;ÿü#Ϊÿ;ÿü†ªÿ;ÿü@ªÿ<ÿý)§ÿ<ÿý„ÿ<ÿýOÿ<ÿý%ÿ=ÿþÿ=ÿþ ÿ=ÿú ‘Õèòÿ8ÿþýù-Èßðÿ3ÿýûÿù<”Ïâöÿ.ÿüûÿÿ ù L¦Ôäúÿ)ÿþûÿÿù]µÙçþÿ$ÿþûÿÿú#qÁÝëÿ ÿþûÿÿù2„Ëàðÿÿþûÿÿù@—ÑâõÿÿþûÿÿùP©×äúÿÿþûÿÿ!ùb¸Ûçþÿ ÿþûÿÿ%ú(tÄÞëÿÿþûÿÿ(ü¸ýÿÿþûÿ ÿ(ýMìÿÿþûÿ ÿ'ýàÿÿþõÿ ÿ'þ¿ÿÿþìÿ ÿ&ýpòÿÿþìÿ ÿ%ý#æÿÿþìÿÿ$ýÑÿÿþìÿÿ$ý“øÿÿþìÿÿ#ý<êÿÿþìÿÿ"ý Üÿÿþìÿÿþýÿ ÿ"ý±ýÿÿþìÿÿüë·ëÿÿ!ý[ïÿÿþìÿÿûÞPÚÿÿ ýãÿÿþìÿÿùñ¿½ÿÿýÈÿÿþìÿÿýãtýmþÿÿý~õÿÿþìÿÿüøÑ'ýæÿÿý-çÿÿþìÿÿüè—þ×ÿÿý×ÿÿþìÿÿüýÛAþ²ÿÿý ûÿÿþìÿÿüî´ýZúÿÿýIìÿÿþìÿÿýàa ýäÿÿýßÿÿþìÿÿüôÉ þÒÿÿþ»ÿÿþìÿÿüå… þ¤ÿÿújñÿÿìÿÿüúÖ2ýJõÿÿú åÿÿìÿÿüë¥ ý áÿÿúÏÿÿìÿÿýÞOþÍÿÿöøÿìÿÿð¿þ’ÿÿ÷6êÿìÿÿãsý;ðÿÿ÷ Ûÿìÿ÷Ð&ýÞÿÿø¬ýìÿç•þÆÿÿùVñìýÚ?þ€ÿÿùåíï²ý.ëÿÿûÊñã_ýÚÿÿû†øÎ þ¾ÿÿû<ü‘!ýnþÿÿüºH#ý æÿÿý$ %þ×ÿÿ:þ³ÿÿ:ý[úÿÿ:ýäÿÿ;þÓÿÿ;þ¤ÿÿ;ûKöÿÿ:û áÿÿ;üÍÿÿ;ü”ÿÿ;ü<ðÿ;üÞÿ<ýÇÿ<ýÿ<ý.ñ<ýæ=þÓ=þ=!ý ~‹5‹õ‰k@ ÀÔ1Ôø¯r5"ÿÿû ÀÔ,Ôøº€=$ÿÿú ÀÔ'ÔøÄH&ÿ ÿù ÀÔ"ÔøÌ™U) ÿ ÿþ  ü ÀÔÔøÑ¥d.ÿÿþ  ü ¿ÔÔø¯r4 ÿÿþ  ü ¿ÔÔø»<"ÿÿþ  ü ¿ÔÔøÄH$ÿÿþ  ü ¿Ô ÔøÌ™U( ÿ ÿþ  ü ¿ÔÔøÑ¥d,ÿ$ÿþ  ü ¿ÔÔø°o5&#ÿ'ÿþ  ó r=&*0@BBÿ'ÿþ ý7BBüAÿ&ÿþ û¨'ÿÿûo–:à÷,÷øÙ•G)"ÿÿúo©–:à÷'÷øå¤S-#ÿ ÿùo©©–:à÷"÷øí²c0$ÿ ÿþo©©ü–:à÷÷øóÀt5$ÿÿþo©©ü–9ß÷÷øÌ…<%ÿÿþo©©ü–9ß÷÷øÚ•G(ÿÿþo©©ü–9ß÷÷øå¤S*!ÿÿþo©©ü–9ß÷ ÷øí³c." ÿ ÿþo©©ü–9ß÷÷øóÀt3"ÿ$ÿþo©©ü–9ß÷÷øÍŠPJ_ÿ'ÿþo©©ó–7‰XFl¦Üäähÿ'ÿþo© ©ü`¿ääüà/ÿ&ÿþo© ©ûJ×8ÎääýÅÿ&ÿþo© ©úJûß8Îääý†ÿ%ÿþo©©øzûûß7ÎääýAÿ$ÿþo©©ýeÂûûüß7ÎääüÓ"ÿ#ÿþo©©ýG÷ûûüß7Íääý¤ÿ#ÿþo©©ý¦Nûûüß7ÍääýY ÿ"ÿþo©©ýƒjûûüß7ÍääüÝ)ÿ!ÿþo©©ûOr÷ûûüß7Íääý»ÿ!ÿþo©©ú'ÿ4Ùûûüß7Íääývÿ ÿþo©©ø¢ÿÿ"”ûûüß7Íääüã6ÿÿþo©©ýzÿÿüGèûûüß7ÍääüÌ ÿÿþo©©ýEÿÿü%´ûûüß7Íääý•ÿÿþo©©þ$ÿÿûbóûûüß7ÍääýKÿÿþo©©ýÿÿü-Íûû÷ß7ÍääØ%ÿÿþo©©ýq ÿÿû!úûûøß7Íää®ÿÿþo©©ý:ÿ ÿü;àûûøß7Íääfÿÿþo©©þ!ÿ ÿü#¤ûûøß7Ìäà-ÿÿþo©©ý–ÿ ÿóSîûûß7ÌäÃÿÿþo©©ýfÿÿô)Àûûß7Ìä…ÿÿþo©©ý2ÿÿô p÷ûß7Ìä?ÿÿþo©©þÿÿõ2×ûß7ÌÒ"ÿÿþo©©ýÿÿö"’ûß7Ì¢ÿÿþo©©ý\ÿÿ÷Eçß7ÌV ÿÿþo©©ý,ÿÿ÷%²ß6Å(ÿÿþo©©ý§ÿÿø_×6¥ÿÿþo©©ý„ÿÿù ,µ6gÿÿþo©©ýPÿÿù!q5/ÿÿþo©©ý'ÿÿú3)ÿÿþo©©ý£ÿ ÿûÿÿþo©©ý{ÿ!ÿûÿÿþo©©ýEÿ#ÿüÿÿþo©©þ#ÿ%ÿÿúo©©ÿ9ÿúo©©q ÿ9ÿúo©©:ÿ9ÿûo©©!ÿ:ÿûo©–ÿ:ÿûo©gÿ:ÿûo©3ÿ:ÿüo©ÿ;ÿüoÿ;ÿüo\ÿ;ÿüo+ÿ;ÿýmÿ<ÿýVÿ<ÿý3ÿ<ÿýÿ<ÿþÿ=ÿþ ÿ=ÿþÿ=ÿþýÿ8ÿøòèÖ“!ÿûÿ3ÿùðßÉ‚/ÿþûÿ.ÿùöâЕ=ÿþûÿ)ÿùúäÕ§N ÿþûÿ$ÿùþçÙ¶_ ÿþûÿ ÿúëÝÂr%ÿþûÿÿùðàË…3ÿþûÿÿùõâјAÿþûÿÿùúäתQÿþûÿ ÿùþçÛ¸c ÿþûÿÿúëÞÄu($ ÿþûÿÿüýº' ÿþûÿÿýëP' ÿþõÿÿýÞ& ÿþìÿÿþÀ&ÿþìÿÿýñt%ÿþíÿÿýä'$ÿþíÿÿýÑ#ÿþíÿÿýø—#ÿþíÿÿýèA" ÿþýÿÿþíÿÿýÛ! ÿüë·ëÿÿþíÿÿýý´! ÿûÚPÞÿÿþíÿÿýîa ÿù½ÀñÿÿþíÿÿýáÿýþmýtäÿÿþíÿÿýÉÿýæü'Ñøÿÿþíÿÿýô†ÿþ×ü—èÿÿþíÿÿýæ2ÿþ²üAÛýÿÿþíÿÿý× ÿýúZü´îÿÿþíÿÿýú¥ÿýä ýaáÿÿþíÿÿýëOÿþÒ üÉôÿÿþíÿÿýÞÿþ¤ ü†æÿÿþíÿÿþ¿ÿýõJü2×úÿÿúíÿÿñsÿýá ü ¥ëÿÿúíÿÿã&ÿþÍýOÞÿÿúíÿÿÑÿþ’ö¿ñÿÿíÿ÷•ÿýð;÷sãÿÿíÿè?ÿýÞ÷&Ñ÷ÿíÿÛÿþÆø•èÿíý²ÿþ€ù?Ûýíð_ÿýë.ù²ðíäÿýÚú_äñÏÿþ¾ ûÏø‘ÿýþn!û‘ýHÿýæ #üHÀÿþ×%ý'ÿþ³9ÿýú[9ÿýä9ÿþÓ:ÿþ¤:ÿýöK:ÿýá :ÿþÍ;ÿþ”;üÿð<;üÿÞ;ýÿÇ<ýÿ<ýò.<ýç<þÕ=þ“=þ!=@@€€Haloÿ     I÷€€J5€€J+Wjd®qð7 6 6 5 5 4 4 3 3 2 2 2 1 1 1                 0 0 0 0 0 / / / . . - - , , + * * ) ) ( ( ( ( ( * , / 3 6 8 : < þ > 7 6 6 5 5 4 4 3 3 2 2 2 1 1 1                 0 0 0 0 0 / / / . . - - , , + * * ) ) ( ( ( ( ( * , / 3 6 8 : < þ > 7©6©6©5 ©5 ©4 ©4 ©3 ©3 ©2 ©2 ©2 ©1 ©1 ©1 ©© © ©©©©© ©© ©© ©©©©©0©0©0©0©0©/©/©/©.©.©-©-©,©,©+©*©*©)©)©(©(©(©(©(©*©,©/© 3©6©8©:©<©þ©>©7þ5þ5ú4ù4÷ 3ö 3ö 2õ 2õ 1ô 1ô 1ò #$0ó  $(*0ó $*.00ó #*/47ñ '/5:= ò #+4;ACò '09AGK  ð "+6?GNQ ñ &0;EOVYþ ñ )5@LU]a ûúð "-9FR\ch øùð &1>LXcko ø  õ ñ *6CQ^iqw ÷ ó ï ".:IWdpy~ ö ô ì &2?N]lw€… æ  î )6DTcq~†‹ ô õ ï ".;J[ix…Ž’ä  ï &2@O_p‹”˜ò  ""á    *7EVfw…’› Ò  #&''&%#  %/?>=:73/+'%##ð&*/7@M[iy‹š¨´ºÀÔ %,38>BDEECA=962/-,-/38@KVdsƒ’¢¯¹ÁÅè #*18?DILMMKIDA=:88ð:=CKUao|Œ›ªµÀÇÊÕ  '/7>ELPRUTRPMKGEDDFKPWalyˆ•£°¼ÇÌÏÖ #,5=EMRX[]]\YWUTRRUX]dmx…’ ­¹ÃÌÓÕí  (1:CMU[acffëdcbabcgls|†‘ªµÁÊÓ×Úê $.7AKU]cimppqppïqsw{‚‰”¨´ÀÈÑÙÜà×  *3=IR]fmsx{|~~€ƒ†‹‘˜ ª´¾ÇÏÙÞâäØ %/9DP\fpx~ƒˆ‰ŒŽ’•𠦝µÀÈÏ×ÞäæèØ "+6ANYfq{ƒ‹‘•˜› ¥¨­´ºÁÈÏ×ÞäèëëÚ (2>KWdq|ˆ‘˜ž£¦ª¯²µºÀÇÌÓÙÞäèëïïÙ %/:GUcq~‰•¥«°µº¾ÁÇÊÏÕÚàäéíïñóÚ #-8ETbpŒ˜£«´ºÀÅÈÌÑÕÙÞâæéíñóõõØ #,8DRbpŽ›¦²ºÁÈÎÑÕÙÜàäèëïñóõ÷÷Ø #-8ERbq€ªµÀÈÎÓÙÜàäèéíïóõ÷÷ùù× &/:FUdtƒ’¢¯ºÅÎÕÚàäèéíïñóõ÷ùùûû Ú !*3>KXgw†•¥²¾ÈÑÙàäèëïñóõ÷ùùûûþý×  '/8CP^l|‹š¨µÁÌÕÞäèíïñõ÷÷ùûûýÖ !'/7@LXft‚‘ ¯ºÇÑÚâèëïóõ÷ùùûûýýÑ  %*18AKVbo|‹˜¦´ÀÌÕÞäéïñõ÷ùùûûýýÐ "&*06DJOU[agmt{ƒ‹’›¥­µÀÈÏ×ÞæéïóõùûûýýÿË #',06;@FLQX^dipw~…‹’š¢ª²¹ÁÈÏ×Þäéíñõ÷ùûýýÿÌ  $*/49?ELRX_flsy†Œ”𢍝µ¾ÅÌÑÙÞäéíñõ÷ùûýý ÿÌ $*/6;BIOV\ciqx~…Œ’˜ ¦­´¹ÀÇÌÓÙÞäèëïóõùùûýý ÿÌ #(.4:AGOV]dksy€ˆŽ•›¢¨¯µºÁÇÌÓÙÜâèëïñõ÷ùûûýý ÿÍ $*07=DKRYahow~…Œ’š ¦­²¹ÀÅÊÏÕÚàäéíïóõ÷ùûýý ÿ 7 6 6 5 5 4 4 3 3 2 2 2 1 1 1                0 0 0 0 0 / / / . . - - , , + * * ) ) ( ( ( ( ( * , / 3 6 8 : < > þ ÿ  7 6 6 5 5 4 4 3 3 2 2 2 1 1 1                0 0 0 0 0 / / / . . - - , , + * * ) ) ( ( ( ( ( * , / 3 6 8 : < > þ ÿ ©7©6©6 ©5 ©5 ©4 ©4 ©3 ©3 ©2 ©2 ©2 ©1 ©1 ©1 ©©© ©©©© ©© ©© ©©©©©0©0©0©0©0©/©/©/©.©.©-©-©,©,©+©*©*©)©)©(©(©(©(©(©*©,©/©3© 6©8©:©<©>©þ©ÿ©þ7þ6ú5õ4õ 4 ö 3ô 3ó 2ó 2ò 1ò 1ò$# 1ñ*($  0ñ0.*$ 0ñ74/*# 0ñ=:5/' ðCA;4+#  ðKGA90' ðQNG?6+"   ïYVOE;0&  ïa]UL@5) üîhc\RF9-" üûîokcXL>1& ùøïwqi^QC6* ÷  ô  ï~ypdWI:." æ   ì…€wl]N?2& ô ò  ~qcTD6) ä   ï’Ž…xi[J;." æ  ‹p_O@2& ä  á ›’…wfVE7*    ""ð  Ϧ¢˜Œ~l\L?>;82-&  ÒÅÁ¹¯¢’ƒscVJ@83/-,-/269=ACEEDB>83,% ðÊÇÀµª›Œ|oaUKC=:88ä:=ADGKMMLID?81*# ÓÏÌǼ°£•ˆylaWPJFDDEGJMPRTURPLE>7/'  ÔÕÓÌù­ ’…xmd]XURRTUWY\]][XRME=5,$ ëÚ×ÓÊÁµª‘†|slgcbabcdffëca[UMC:1(  ïàÜÙÑÈÀ´¨”‰‚{wsqppèqppmic]UKA7.$ ÕäâÞÙÏǾ´ª ˜‘‹†ƒ€~~|{xsmf]RI=3*  ÖèæäÞ×ÏǾµ­¦ š•’ŽŒ‰ˆƒ~xpf\PE9/% ëØèäÞ×ÏÈÁº´­¨¥ ›˜•‘‹ƒ{qfYNA6+" ïØëèäÞÙÓÌÇÀºµ²¯ª¦£ž˜‘ˆ|qdWK>2( ÙóñïíéäàÚÕÏÊÇÁ¾ºµ°«¥•‰~qcUG;/% õØóñíéæâÞÙÕÑÌÈÅÀº´«£˜ŒpbTE8-# ÷ÚõóñïëèäâÞÚÕÑÎÈÁº²¦›ŽpbRD8-# ù÷ÚõóïíéèäàÜÙÓÎÈÀµª€qbRE8-# ûùÛ÷õóñïíéèäàÚÕÎź¯¢’ƒtdUF:/& þýûûùÚ÷õóñïëèäàÙÑȾ²¥•†wgXK>3*!  ýû×ù÷õõñïëèäÞÕÌÁµ¨š‹{l^PC8/'  ýûùÖ÷õóïëèâÚÑǺ¯ ‘‚tfXL@7/'! ýûùÕ÷õóïéäÞÕÌÀ´¦˜‹|obVKA81*%  ÿýûÐù÷õñíèâÙÏǺ¯¢”†ymaVMD<60*&" ÿýûÏù÷óïëæÞÕÌÁ·ªž’…yod[RJC=82.*&" þÿÿýÌûù÷õñíéâÚÓÊÀ´ªž’ˆ~sibYRLE@;72.*&# ÿýûËù÷óñëæàÙÑȾ´ª —Œƒ{skc\VPKE@;72.*&" ÿÿýûÌùõóïéæÞ×ÏÈÀ·­¥›”‹ƒ{tmga[UOJD>950+'# ÿÿýËûù÷õñíéäÞ×ÏÈÁ¹²ª¢š’‹…~wpid^XQLF@;60,'# ÿÿýÌûù÷õñíéäÞÙÑÌžµ¯¨¢š”Œ†yslf_XRLF@:5/*$  ÿÿýÌûùùõóïëèäÞÙÓÌÇÀ¹²­¦ž˜’Œ…~xqic\VOIB;6/*%  ÿÿýûÎù÷õñïëèâÜÙÓÌÇÁºµ¯¨¢›•Žˆ€yskd]VOGA:4.(# ÿ ÿýÎûù÷õóïíéäàÚÕÏÊÅÀ¹²­¦ š’Œ…~wohaYRKD=70*$  þ = < : 8 6 3 / , * ( ( ( ( ( ) ) * * + , , - - . . / / / 0 0 0 0 0                 1 1 1 2 2 2 3 3 4 4 5 5 6 6 7  þ = < : 8 6 3 / , * ( ( ( ( ( ) ) * * + , , - - . . / / / 0 0 0 0 0                 1 1 1 2 2 2 3 3 4 4 5 5 6 6 7 ©þ©=©<©:©8©6© 3©/©,©*©(©(©(©(©(©)©)©*©*©+©,©,©-©-©.©.©/©/©/©0©0©0©0©0©©©©©© ©© ©© ©©© ©©© ©1 ©1 ©1 ©2 ©2 ©2 ©3 ©3 ©4 ©4 ©5 ©5 ©6©6©7©Í $*07=DKRYahow~…Œ’š ¦­²¹ÀÅÊÏÕÚàäéíïóõ÷ùûýý ÿÌ #(.4:AGOV]dksy€ˆŽ•›¢¨¯µºÁÇÎÓÙÞâèëïñõ÷ùûûýý ÿÌ $*/6;BIOV]ckqx…Œ’š ¦­´¹ÀÇÌÓÙÞäèëïóõùùûýý ÿÌ  $*/4:@FLRX_flsy†Œ”𢍝µ¾ÅÌÑÙÞäéíñõ÷ùûýý ÿË #',06;@FLQX^dkpw~…Œ’š¢ª²ºÁÊÑÙÞäéíñõ÷ùûýýÿÊ #'+059?DJOU[agmt{ƒ‹”›¥­·ÀÈÏÙÞæéïóõùûûýýÿÍ "&*.27;@EKPV]cks{ƒŒ— ªµ¾ÈÑÙàèëñó÷ùûûýýÿÎ #&*.27;@FLR[bkt~ˆ”žªµÀÊÓÚâéíñõ÷ùûýýÿþÏ "&*.28=CKR[doy†’žª·ÁÌÕÞæëïó÷ùûûýýÿÐ "&*06KXgw†•¥²¾ÈÑÙàäèëïñóõ÷ùùûûþý× &/:GUdtƒ’¢¯ºÅÎÕÚàäèéíïñóõ÷ùùûûØ #-8ERbq€žªµÀÈÎÕÙÜàäèëíïóõ÷÷ùùØ #-8DRbpŽ›¦²ºÁÈÎÑÕÚÞâæèëïñóõ÷÷Ú #-8ETbpŒ˜£«´ºÀÅÈÌÑÕÙÞâæéíñóõõÙ %/:GUcq~‰•¥«°µº¾ÁÇÌÏÕÚàäéíïñóÚ (2>KWdq|ˆ‘˜£¦ª¯²µºÀÇÌÓÙÞäèëïïØ "+6ANYfq{ƒ‹‘•˜›ž ¥¨­´ºÁÈÑ×ÞäèëëØ %/9DP\fpx~ƒˆ‰ŒŽ’•𠦝·ÀÈÏ×Þäæè×  )3=IR]fmsx{|~€ƒ†‹‘˜¢ª´¾ÈÏÙÞâäì $-7AKT]cimpqqpïqsw{‚‹”ž¨´ÀÈÑÙÜàí  (1:CMU[acffëdcbabcgls|†‘ªµÁÊÓÙÚÖ #,5=EMRX[]]\YWUTRRUX^doy…’ ­¹ÃÌÓÕÕ  '/7>ELPTUURPNKGEDEFKPWalyˆ•£°¼ÇÌÏè #*18?DILMMKIEA>:88ð:>CLUao|Œ›ªµÀÇÊÔ %,28>BDEECA=962/-,-/38@KVdsƒ’¢¯¹ÁÅå  &-38;>??=:73/+'%##ð&*/7@M[i{‹š¨´ºÀñ "'-1588å51.*%!!&/8DQaq‚’ ­´¹Ò "'+/1331/,($  '1LXcko ûúð #.9FR\dhþ ñ *5@LV]a ñ &0;EOVY  ð "+6?GNQò '09BGK ò #+4;ACñ '/6:=0ó #*/470ó $*.00ó  $(*1ò  #$1ô 1ô 2õ 2õ 3ö 3ö 4÷ 4ù5ú57? þ ; : 8 6 3 / , * ( ( ( ( ( ) ) * * + , , - - . . / / / 0 0 0 0 0                  1 1 1 2 2 2 3 3 4 4 5 5 6 6 7? þ ; : 8 6 3 / , * ( ( ( ( ( ) ) * * + , , - - . . / / / 0 0 0 0 0                  1 1 1 2 2 2 3 3 4 4 5 5 6 6 7?©þ©;©:©8©6©3© /©,©*©(©(©(©(©(©)©)©*©*©+©,©,©-©-©.©.©/©/©/©0©0©0©0©0©©©©©© ©© ©© ©©©© © ©© ©1 ©1 ©1 ©2 ©2 ©2 ©3 ©3 ©4 ©4 ©5 ©5©6©6©7 ÿýÍûù÷õóïíéäàÚÕÏÊÅÀ¹²­¦ š’Œ…~wohaYRKD=70*$ ÿÿýûÎù÷õñïëèâÞÙÓÎÇÁºµ¯¨¢›•Žˆ€yskd]VOGA:4.(# ÿÿýÌûùùõóïëèäÞÙÓÌÇÀ¹´­¦ š’Œ…xqkc]VOIB;6/*%  ÿÿýÌûù÷õñíéäÞÙÑÌžµ¯¨¢š”Œ†yslf_XRLF@:5/*%  ÿÿýËûù÷õñíéäÞÙÑÊÁº²ª¢š’Œ…~wpkd^XQLF@;60,'# ÿÿýûÌùõóïëæÞÙÏÈÀ·­¥›”‹ƒ{tmga[UOJD?950,'# ÿÿýûËù÷óñëèàÙÑȾµª —Œƒ{skc]VPKE@;72.*&" ÿÿýÌûù÷õñíéâÚÓÊÀµªž”ˆ~tkb[RLF@;72.*&# ÿýûÏù÷óïëæÞÕÌÁ·«ž’†yod[RKC=82.*&" þÿÿýûÐù÷õñíèâÚÑǺ¯¢”†ymbWMD<60*&" ýûÔù÷õóïéäÞÕÌÀ´¦˜‹|obVKA81*%  ýûùÖ÷õóïëèâÚÑǺ¯ ‘‚tfXL@7/'! ýû×ù÷÷õóïíèäÞ×Î÷ª›Œ|m^PD9/'  þýûûùÚ÷õóñïëèäàÙÑȾ²¥•†wgXK>3*!  ûùÛ÷õóñïíéèäàÚÕÎź¯¢’ƒtdUG:/& ù÷ÚõóïíëèäàÜÙÕÎÈÀµªž€qbRE8-# ÷ÚõóñïëèæâÞÚ×ÑÎÈÁº²¦›ŽqbRD8-# õØóñíéæâÞÙÕÑÌÈÅÀº´«£˜ŒpbTE8.# ÖóñïíéæàÚÕÏÌÇÁ¾ºµ²«¥ž•‹~qcVG;/% ïØëèäÞÙÓÌÇÀºµ²¯«¦£ž˜‘ˆ|qdWK>2( ëØèäÞ×ÑÈÁº´­¨¥¢ž›˜•‘‹ƒ{qfYNA6+" ÖèæäÞ×ÏÈÀ·¯¦ š•’‘ŽŒ‹ˆƒxpg\PE9/& ÕäâÞÙÏȾ´ª¢˜‘‹†ƒ€~|{xtmf]RI=3*  íàÜÙÑÈÀ´¨ž”‹‚{wsqppqqêpmid]UKA8.% ðÚÙÓÊÁµª‘†|slgcbbæcdfgfda\UMD:1)  ÔÕÓÌù­ ’…yod^XURRTVWY\]]\XTME=5,$ ÓÏÌǼ°£•ˆylaWPKFEDEGKNPRUUTPLE?8/'  ðÊÇÀµª›Œ|oaULC>:88ä:>AEIKMMLJE?81*# ÒÅÁ¹¯¢’ƒsdVK@83/--./269=ADEFEB>93,& ðÀº´¨š‹{i[M@7/*&##ã%'+/37:=??>;83-'  å¹´­ ’‚qaQD8/&!"%*.1588ï61-'" в¯¦šŒ{kYK<1'  $),/1331/,'# Э¨ž”…tcRC6*! $'*,--,*&" 廉˜Œ~m\L=/%  â  #%'('&$  Ï ›’†wgVE8*    "#"  ŒpaP@2& â  ï’Ž…xi[K;." æ  ~scUD7* ä   ì…€wl]N?2& ô ò  ï~ypfWI:." õ ó  ïwqi^QC6* ÷  ô  îokcXL>1& øõ îhd\RF9.# ðïa]VL@5* üïYVOE;0&  ðQNG?6+"   ðKGB90' ðCA;4+#  ñ=:6/' ñ74/*# 0ñ0.*$ 0ñ*($  0ò$#  1ò 1ò 1ó 2ó 2ö 3 ö 3õ 4õ4ú56þ7@@stem-1.7.1/docs/_static/section/tutorials/resources/mad_hatter.xcf0000664000175000017500000010443213157571677026135 0ustar atagaratagar00000000000000gimp xcf file€€BB gimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ‹­%Ž€€ New Layer#1ÿ     3€€K¡€€gY‘>ý±¯;ü©®x:û¢¤K8ù•šŒ&³7ø’i 7áú5ö€…†Aqúÿÿ4ùy~Y¯ÿÿ2öglqc$k°èÿÿ1ñ]dU)=Òÿ.ª¾2Ûÿ-÷ý±¯;ü©®x:û¢¤K8ù•šŒ&³7ø’i 7áú5ö€…†Aqúÿÿ4ùy~Y¯ÿÿ2öglqc$k°èÿÿ1ñ]dU)=Òÿ.ª¾2Ûÿ-÷ý±¯;ü©®x:û¢¤K8ù•šŒ&³7ø’i 7áú5ö€…†Aqúÿÿ4ùy~Y¯ÿÿ2öglqc$k°èÿÿ1ñ]dU)=Òÿ.ª¾2Ûÿ-÷ý;ü†:û'†ÿ8ù<®ÿÿ7ûU ×ÿÿ6û5Øüÿÿ5û‰ñýÿÿ2û3“ßÿÿ1ü)ìÿ ÿ.úF¬óÿ ÿ/üIÙÿ ÿ0ü yéÿ ÿ1üšôÿ ÿ2ý8Êÿ ÿ2üBÞÿÿ3üFéÿÿ4üQôÿÿ5ýlÿÿ6ýŽÿÿ7ý ÿÿ8ý Ìÿÿ9ýåÿÿ:þ6ÿÿ:ýrÿÿ;û ‡ÿÿ;ü ÿ<ý¾=þÿ‰ýnh;ûua#9ù{K ._7÷m#™ 35õJ" ÎÿªGb3ú(H9 Åÿÿûy $1ú6t6 ¿ÿÿúû4cU/ú›“0Éÿÿûß ).ú¢—+Óÿÿü«6-ú¨™%Ûÿÿüe-,ø“%ãÿþÔÿÿûö& \+÷ 9éÿÔÿgôÿÿûÓ8)*÷vûÿÿíÿ¶»ÿÿû!\)÷ÿŒÚùžäƒ©ÿÿûþ??)ùÖ©dô†ÿÿþúÿÿûã O(÷Vè2i¶ÿÿøÿÿý‘æÿÿû§8'öš­$÷ú»ÿRëÿÿýYýÿÿûXH[&òýOÆÿþ<þc­¦ÿÿOÿÿúï&2%ÿôV¾ìlÿÿ\AEéÿÿú¾XQ$÷ÿøÿÿÇ:îÿÿúý{Ùxÿÿûr E$÷òcðÁ¨/kÒÿÿúî­Vs‡ÿÿúø) GR#ø³oâfkæÿÿúäöuz÷ÿÿúÑ+4"òYËò—Ûÿü½ûÿÖÿ ÿû‹:8ú9# :ý#:‰ýnh;ûua#9ù{K ._7÷m#™ 35õJ" ÎÿªGb3ú(H9 Åÿÿûy $1ú6t6 ¿ÿÿúû4cU/ú›“0Éÿÿûß ).ú¢—+Óÿÿü«6-ú¨™%Ûÿÿüe-,ø“%ãÿþÔÿÿûö& \+÷ 9éÿÔÿgôÿÿûÓ8)*÷vûÿÿíÿ¶»ÿÿû!\)÷ÿŒÚùžäƒ©ÿÿûþ??)ùÖ©dô†ÿÿþúÿÿûã O(÷Vè2i¶ÿÿøÿÿý‘æÿÿû§8'öš­$÷ú»ÿRëÿÿýYýÿÿûXH[&òýOÆÿþ<þc­¦ÿÿOÿÿúï&2%ÿôV¾ìlÿÿ\AEéÿÿú¾XQ$÷ÿøÿÿÇ:îÿÿúý{Ùxÿÿûr E$÷òcðÁ¨/kÒÿÿúî­Vs‡ÿÿúø) GR#ø³oâfkæÿÿúäöuz÷ÿÿúÑ+4"òYËò—Ûÿü½ûÿÖÿ ÿû‹:8ú9# :ý#:‰ýnh;ûua#9ù{K ._7÷m#™ 35õJ" ÎÿªGb3ú(H9 Åÿÿûy $1ú6t6 ¿ÿÿúû4cU/ú›“0Éÿÿûß ).ú¢—+Óÿÿü«6-ú¨™%Ûÿÿüe-,ø“%ãÿþÔÿÿûö& \+÷ 9éÿÔÿgôÿÿûÓ8)*÷vûÿÿíÿ¶»ÿÿû!\)÷ÿŒÚùžäƒ©ÿÿûþ??)ùÖ©dô†ÿÿþúÿÿûã O(÷Vè2i¶ÿÿøÿÿý‘æÿÿû§8'öš­$÷ú»ÿRëÿÿýYýÿÿûXH[&òýOÆÿþ<þc­¦ÿÿOÿÿúï&2%ÿôV¾ìlÿÿ\AEéÿÿú¾XQ$÷ÿøÿÿÇ:îÿÿúý{Ùxÿÿûr E$÷òcðÁ¨/kÒÿÿúî­Vs‡ÿÿúø) GR#ø³oâfkæÿÿúäöuz÷ÿÿúÑ+4"òYËò—Ûÿü½ûÿÖÿ ÿû‹:8ú9# :ý#:‰ý,+;ûÁæ(9ù·ÿÿº 7ý µÿÿý5ý µÿÿýd3ü‘ôÿÿýd1üxéÿÿýZ/ü VÞÿÿý¿1.üWÞÿ ÿýß`-ü méÿ ÿý¿@,ý„ôÿ ÿý  +ÿý *ÿý¤)ÿýèc)ÿüô¨(ÿüé~ 'ÿüÞV &ÿüÞW %ÿüéY$ÿýÆ=$ÿüï #ÿüßp"ÿýÏ"ÿþ@#ÿþr$ÿþ™%ÿý²%ÿüª+%ÿüº)&ÿüÇ''ÿüÞB(ÿû߯O)ÿû¿\**ÿýŸ<- ÿýž. ÿüåƒ / ÿüÌR0þÜÿÿúå²Y1ýNûÿÿü™*4ø‰ûåŦ/8úY2:;@@€€ New Layerÿ     S€€k%‚€€‡´ 3ýü*[;ü\™™8ùT˜™™6ü&˜™™ý˜•6þs™™4ü&‹˜™™3ýˆ™™1üT”™ ™0ý&ˆ™™ý˜—™™/ýU—™™þ˜™™-üC‚˜™™þ—™™+üC|–™™ý•™ ™*ýG˜™™üzU˜™ ™)ý>˜™™û‘T2‘™™þ—™™(ýC—™™üFe—™ ™'ý—™™ý“b™™þ—™™&ý2’™™ü˜m–™™%ý>–™™þ–™™$ý&‘™™þ˜™™þ˜™™þ˜™™$úk™™•’™™#úY˜™™Ž™™!ù K–™™˜™™þ˜ ü”˜™™!þU™™þ˜™™!™ú˜™™˜˜™™þ—™ ™!üM™’™™þ˜™™þ—™™$þŽ™™þ˜™™$ý2—™™þ˜™™%þz™™þ˜™™%ý2™™þ˜™™&üP˜™™(ýC™™*þM™™+ýC”™ ™þ˜™™,ý&Ž™ ™ü˜™™,ûƒ™™—™ ™ý˜™,ù>“™™—˜™ ™.ù“™™–˜™™þ˜.úU–™™˜™ ™0ý’™ ™1þ‘™ ™1þ\™™þ˜™™1ù[–™™˜™™3þ=™ ™3ü\˜™™5þn™™5ý&•™™6ýL—™™7þG™™7þ™™7ý‡™™8ýŒ™™9þ†™™9þ†™™9þ‘™™ý”˜6ý&†™™ý\4ü\”™™S:þ8ý764þ1ý  )S9ý 8ý764þ1ý )‹û>G6û&L&M™™ý–&3ú&n”™–™™þs0û&TF‹™™þ-ü&w˜™ ™þT-þ•™™þ˜™™þ…-™þ–™ ™ý”,ü™—‘™ ™þ=,þ–™™ý}+™þ=+™þp+™þ“+™þC*ü™˜˜™™þƒ*ý˜—™™þ’*þ—™™þU)™þ˜™™ý˜<(™þ—™ ™þŽ(™þ˜™™þ–™™þC'™þ˜™ ™ý”&™þ=& ™þ˜™ ™þ‚& ™þ˜™ ™þ—&™ý˜C%™þ|%þ—™™þƒ%™þ&$™ý†&#™ýz"™þ˜™™þ="™þv"™þ˜™™þ ù>‡Ž\™þFüTˆ™™þ™ý—Cý2€™™ý’™þMý>—™™û˜™™Ž™û&>˜™™ûˆ™™Ž™ýs‘™™ú•“™™‡™ý˜™™˜™ý•>™þ˜™ ™ý†&™þ˜™™þ•™™ü—n& ™üba•™™ü–v2™ý‰M™™ý&™ü˜…p™™ý‚&™þˆ™™ü‹P™þ˜™™ý˜>™þ—™™þ˜™ ™þk™üˆ=™ý™þM ™þM!™ü”T"™ý–G%™þ˜™™ü—k&& ™˜™ý‹>( ™ý™™þ’+ ™ý‹—™™ún\\'™ý˜•™™ö˜–™•@`——Z'þ˜™™ý—’™™ön›™™™h'ý—˜™ ™ü•>[™™þA'™ý€™™ütM™™ýƒ'™ûqIl˜™™úPW‰™™þO(üFz”™™ù’H+2k˜™™þ5(æ;6 þ  ý   ý þ þ ####!"""""" "')/ þ;üÒæ;6 þ  ý  ý  þ þ ####!"""""" "')/ þ;ü˜;;;:;:;8;8;6 ;5 ;6;6;7;7;7;7;8;9;n Æ;::886 5 66777789n5þ[™™ýMU3ýU˜™™ü’™2þM™ ™%üþ2™™ý—™™$ú&z™™Mú‡™™–Œ™™þM ú>Š\2™™þUý—™™û=>ó™™—™™˜™™—Tý&“™™úŽ+M™™—™ús&n™™õ—†w‹~™‰™™™þ˜™™û•>|™™ù†2&_˜™™þ&™™ý”˜™™÷‹CNO…™™þ_™™û“U–˜™™ú\™ ™ú -G&ún™™•§™ ™÷•zszp2z¤&ú&†™™¤™™ù“—™™‘úf™Ì¸(þfæ&ss3b”ˆs`&ƒ™—C²™¸fzÌÌzþÌ'ïf}M&f™™Ä¤ÂÌÌʼü(ÊÊ'üfѤüfÌÌô¬¤²Äf8´ÄÈ ýfÌû(ÌæÓñ¤¿Ä¿ÂȬÄR¿¡Äù¬ÌÌȤ(üÌÉ(÷(fÌÈɬ(ü(¬¤ð̸ÌËʸªÇz(fz(ù(#i²£(!(þÌÌó²ÌÌË£¤¢ËÌz¤ý¦w"îfÉʸfÌÆÌÌËÆf̲ËÌÌøfz¼ÄÆÊŠú¤ÌË̲ù¼Ê̬f(ûÌÄ̬ù¤ŠËÌȸüfÌÌûpÊËfüfÂ#üÌ¡ûfHÌÌüÆz ý€QüfÌÌT™þf ûf(bf(ú(¤ÊÌ™fôʪ¤¬ÌfÊÌf'ïzÌŠÄ̸f(²ËÌ˸ÌÌþ¬'éfÇÌÌʸ»Áf¼ÌÌÊÌÌRÅÉÊÊ£)ì™ËËÌÌʹFÌËËÂÌÄ(R8(+òfËÌªËÆf»Ä¼¬2ûŠÌʲûf™Š¤4ý¼Ê-û>‰‹G þ(-þ’™™þb9™þ˜9™ýp7þM™™þN7ý˜™™ü—™M5þ™™þ4þ™™þ=5þŠ™™þ5ý>—™™þ“6ýY—™™þ†6þL™™þ26ý&‰™™ýŽ16þ2™™þn7ýf˜™™ý—K8ù&`of; mþ  /þ  // 1 + , þþþ%%"!þ%&(+ ¨þ /þ // 1 + , þþþ%%"!þ%&(+J;;;:;6;6;6;7;9;9;:;:;;;;;;; ¢;:666799::;;; þ—™™ü‘d‘™™þ–™™þ5(™ú˜kn˜™ ™þ*(ø™“e&”™ ™ü˜\(ýv&þ™™û—‰Œ™™þ0ùG•˜“Ž™™ý’>*ú‡ŽŒk&üw˜™™ýp+™ú‘Ž>™™þ5û\Š>™ü‰˜™™þm÷&L&=™™‘ü™‰•™™ý‘\™™þ‹ ùW”™™—™™þ™þ™™ý—>ú>Ž˜˜—™™ý˜™þ‘™™ýz&û&__Ž™ ™þ—™þ—™™þgù&s™™•™ ™þk™û•*55þo™™þ—™™û–<™ü—\™™ý–—™™ý˜h™þ“™™ü˜Š™™þ˜™™ý‹”™™þ™öŠbŠ–™™˜LU™ ™ýD™ü˜~™þ˜™™þu™ý•™™ý•‘™™ýŠ™ý_Ž™ ™û˜„r™™þ’™™ýƒ&û™†&ˆ™™ý•”™™þ˜™™þ˜ ú|&>—™™þ‘$ý&™ ™ü—‘•™™ü‰Š>%þN™™þ—™ ™ü’\'þ*™™û\™™†™™û˜™‘C*õ\’™M&`nnúy|L&üf¸f;ûÌÄff:úΗ¯9÷äëñàżt6üÚëÔÌÌþzûF²²FýRÉÌÌõÆ’’‡Q88û¥ÖÖ“ýZÆÌÌûÇÌÌ‚ú2§ÇÇûfÌÌËÌ ÌúÄÌšÌfö&svk–™™—2ÌþÊÌÌþþz™™ý—CÌþ(þ>™™ü—‡>ÌýÄþŽ™™þ[ÌþÃþ—™™ý{ü^¹ÂÌÌþzþ’™™þ*#ýZÊÌ ÌþÄú™™—$ýZÇÌÌýÄRûŒ™™g&ú3½ÌÇÌÌþÂû‘™™O+þzÌÌþ›û™™a+ýÄÌÌþ&ûU•‰2,û3™Ìfí@@€€ Backgroundÿ     &=€€&U‰€€&q7ŠSPnGüÿûýþûüÿ9ÿûýÿüýÿ;ÿþýÿ8ÿüüÿþþÿÿþÇÿ5ÿþÿüÁ'ÿ1ÿûþÿüþÿÿûÞH¢ÿ1ÿúþýûýýÿÿù9¡ÿ¨Vÿ1ÿýûýÿÿüf/Nÿÿýknÿ4ÿõ¹Bÿÿ°:^ÿ3ÿö¢ÿ‚>„ŽVÿÿúûùüþýÿ ÿüûÿýþþÿÿówÿÿ¹ˆ ¥~`ÿÿúüöúüýÿÿùýþÿþüýÿÿñó¹ÿÿCxmYžÁÿÿûýÿÿþÿ ÿüýÿüÿÿü^(ÿÿøy+§X”iêÿ)ÿüþýúÿÿûáÙÿÿù/M‰<ðÿÿþ@ÿÿüüýüÿ ÿþþÿÿü5JÿÿùM«y˜ôÿÿü“!ÿÿüüýüÿÿþýþþ÷ÿýÿÿû.ßÿÿø¼†V©÷ÿÿü<œÿ"ÿõþùþúüÿÿÑIÿÿøÚ#&d¥ÿÿûvöÿ$ÿóúüþÿÿ¦Qÿÿþ$ý6Âÿÿûï‹ÿ%ÿýþúÿÿó‹³ÿÿ°hy¬®~ÿÿüt1ÿÿü#ÿêûÿÿ‡ÜÿÿœGlyR˜ÿÿh1ÿÿùþüÿüýüÿÿçþý÷øûÿÿTäÓw>©Lk‡‰ÿÙ·ÿ&ÿüþýûÿÿïŸøë;ai¬P€~ÿÿ$cÿ(ÿþìüÿÿñ.¬r^m€yp®ÿ„0øÿÿüüúþÿ#ÿüîýÿÿ.>Átrb…¦¿Y«ÿÿúüúúùþÿÿþþÿÿüÿöMO£fm~¥˜þÿÿüÿýþýÿ$ÿñþÿ¤'Å‹zªÿÿüýÿþÿ+ÿõ.›{®[EŸÿÿþþÿ)ÿôüÿÿWÿ«‹µ”çÿÿøþüüÿÿþýÿ(ÿþöÿK©aÚÿÿ÷þýýÿÿüüýÿ(ÿþþÿÿî“GÿÿŒ#âÿÿþýÿÿúýÿ)ÿñûúýÿÿšî…±ÿÿúüýúùýÿ(ÿñüúûþÿÿæ"’—JhÕÿÿýúýÿ+ÿþþÿÿ÷ß~ÿÍeµÿÿþ+ÿéþùöúýúÿÿó7¬ÅN™ÿÿû÷úþÿÿüþÿÿüüýÿýÿÿýýþÿÿþýÿÿó÷CºÒ{ñÿÿüûÿÿúþüûúûÿÿùß ¢—ÿÿýü÷ÿÿüþüüÿÿøù˜Ú7Àÿÿþþÿÿþýÿÿõÿ¿¸ÿÿþÿ4ÿ÷þè wnÎ÷ÿ"ÿûþüþýÿÿù¾/¬™¹ÿÿþüÿÿüüýþÿÿó{¶³±ÿÿý÷üýÿÿþþûÿÿô“3¶’­ÿÿüýþÿÿýýüÿÿõPS¿Ÿïÿÿýþÿÿþüÿÿ÷`V‹áÿÿüÿÿþþÿÿúѤÿÿúûüüþýÿÿýûùÿÿùþÿ ,¹ÿÿþüúùþÿÿüÿôí JºµÿÿþûûýÿÿýûüÿÿôºÙïÿÿýþüýÿÿýúüÿÿõûs}•úÿÿþüÿÿþýÿÿõ¾q£qÒÿÿüþÿÿþûÿÿõð+ÿúÿÿýþÿÿþûÿÿ÷†+GŒÿÿþÿÿþþÿÿù^ÿÈêÿÿþ ÿþþÿÿü)àÏÿÿýþüÿ ÿþûÿÿú艃ÿÿþþÿ ÿþÿýüûÿÿöùÿÿîcêr´ÿÿþýÿÿýþûÿÿúRÿÜÿÿýýûÿÿþüÿÿø†D=—‹áÿÿüüûþÿÿûþúüþÿÿöÍ€:çŸnÿÿüøýùÿÿüýûÿÿþýÿÿø•úÿ3züÿûýþûüÿ9ÿûýÿüýÿ;ÿþýÿ8ÿüüÿþþÿÿþÇÿ5ÿþÿüÁ'ÿ1ÿûþÿüþÿÿûÞH¢ÿ1ÿúþýûýýÿÿù9¡ÿ¨Vÿ1ÿýûýÿÿüf/Nÿÿýknÿ4ÿõ¹Bÿÿ°:^ÿ3ÿö¢ÿ‚>„ŽVÿÿúûùüþýÿ ÿüûÿýþþÿÿówÿÿ¹ˆ ¥~`ÿÿúüöúüýÿÿùýþÿþüýÿÿñó¹ÿÿCxmYžÁÿÿûýÿÿþÿ ÿüýÿüÿÿü^(ÿÿøy+§X”iêÿ)ÿüþýúÿÿûáÙÿÿù/M‰<ðÿÿþ@ÿÿüüýüÿ ÿþþÿÿü5JÿÿùM«y˜ôÿÿü“!ÿÿüüýüÿÿþýþþ÷ÿýÿÿû.ßÿÿø¼†V©÷ÿÿü<œÿ"ÿõþùþúüÿÿÑIÿÿøÚ#&d¥ÿÿûvöÿ$ÿóúüþÿÿ¦Qÿÿþ$ý6Âÿÿûï‹ÿ%ÿýþúÿÿó‹³ÿÿ°hy¬®~ÿÿüt1ÿÿü#ÿêûÿÿ‡ÜÿÿœGlyR˜ÿÿh1ÿÿùþüÿüýüÿÿçþý÷øûÿÿTäÓw>©Lk‡‰ÿÙ·ÿ&ÿüþýûÿÿïŸøë;ai¬P€~ÿÿ$cÿ(ÿþìüÿÿñ.¬r^m€yp®ÿ„0øÿÿüüúþÿ#ÿüîýÿÿ.>Átrb…¦¿Y«ÿÿúüúúùþÿÿþþÿÿüÿöMO£fm~¥˜þÿÿüÿýþýÿ$ÿñþÿ¤'Å‹zªÿÿüýÿþÿ+ÿõ.›{®[EŸÿÿþþÿ)ÿôüÿÿWÿ«‹µ”çÿÿøþüüÿÿþýÿ(ÿþöÿK©aÚÿÿ÷þýýÿÿüüýÿ(ÿþþÿÿî“GÿÿŒ#âÿÿþýÿÿúýÿ)ÿñûúýÿÿšî…±ÿÿúüýúùýÿ(ÿñüúûþÿÿæ"’—JhÕÿÿýúýÿ+ÿþþÿÿ÷ß~ÿÍeµÿÿþ+ÿéþùöúýúÿÿó7¬ÅN™ÿÿû÷úþÿÿüþÿÿüüýÿýÿÿýýþÿÿþýÿÿó÷CºÒ{ñÿÿüûÿÿúþüûúûÿÿùß ¢—ÿÿýü÷ÿÿüþüüÿÿøù˜Ú7Àÿÿþþÿÿþýÿÿõÿ¿¸ÿÿþÿ4ÿ÷þè wnÎ÷ÿ"ÿûþüþýÿÿù¾/¬™¹ÿÿþüÿÿüüýþÿÿó{¶³±ÿÿý÷üýÿÿþþûÿÿô“3¶’­ÿÿüýþÿÿýýüÿÿõPS¿Ÿïÿÿýþÿÿþüÿÿ÷`V‹áÿÿüÿÿþþÿÿúѤÿÿúûüüþýÿÿýûùÿÿùþÿ ,¹ÿÿþüúùþÿÿüÿôí JºµÿÿþûûýÿÿýûüÿÿôºÙïÿÿýþüýÿÿýúüÿÿõûs}•úÿÿþüÿÿþýÿÿõ¾q£qÒÿÿüþÿÿþûÿÿõð+ÿúÿÿýþÿÿþûÿÿ÷†+GŒÿÿþÿÿþþÿÿù^ÿÈêÿÿþ ÿþþÿÿü)àÏÿÿýþüÿ ÿþûÿÿú艃ÿÿþþÿ ÿþÿýüûÿÿöùÿÿîcêr´ÿÿþýÿÿýþûÿÿúRÿÜÿÿýýûÿÿþüÿÿø†D=—‹áÿÿüüûþÿÿûþúüþÿÿöÍ€:çŸnÿÿüøýùÿÿüýûÿÿþýÿÿø•úÿ3züÿûýþûüÿ9ÿûýÿüýÿ;ÿþýÿ8ÿüüÿþþÿÿþÇÿ5ÿþÿüÁ'ÿ1ÿûþÿüþÿÿûÞH¢ÿ1ÿúþýûýýÿÿù9¡ÿ¨Vÿ1ÿýûýÿÿüf/Nÿÿýknÿ4ÿõ¹Bÿÿ°:^ÿ3ÿö¢ÿ‚>„ŽVÿÿúûùüþýÿ ÿüûÿýþþÿÿówÿÿ¹ˆ ¥~`ÿÿúüöúüýÿÿùýþÿþüýÿÿñó¹ÿÿCxmYžÁÿÿûýÿÿþÿ ÿüýÿüÿÿü^(ÿÿøy+§X”iêÿ)ÿüþýúÿÿûáÙÿÿù/M‰<ðÿÿþ@ÿÿüüýüÿ ÿþþÿÿü5JÿÿùM«y˜ôÿÿü“!ÿÿüüýüÿÿþýþþ÷ÿýÿÿû.ßÿÿø¼†V©÷ÿÿü<œÿ"ÿõþùþúüÿÿÑIÿÿøÚ#&d¥ÿÿûvöÿ$ÿóúüþÿÿ¦Qÿÿþ$ý6Âÿÿûï‹ÿ%ÿýþúÿÿó‹³ÿÿ°hy¬®~ÿÿüt1ÿÿü#ÿêûÿÿ‡ÜÿÿœGlyR˜ÿÿh1ÿÿùþüÿüýüÿÿçþý÷øûÿÿTäÓw>©Lk‡‰ÿÙ·ÿ&ÿüþýûÿÿïŸøë;ai¬P€~ÿÿ$cÿ(ÿþìüÿÿñ.¬r^m€yp®ÿ„0øÿÿüüúþÿ#ÿüîýÿÿ.>Átrb…¦¿Y«ÿÿúüúúùþÿÿþþÿÿüÿöMO£fm~¥˜þÿÿüÿýþýÿ$ÿñþÿ¤'Å‹zªÿÿüýÿþÿ+ÿõ.›{®[EŸÿÿþþÿ)ÿôüÿÿWÿ«‹µ”çÿÿøþüüÿÿþýÿ(ÿþöÿK©aÚÿÿ÷þýýÿÿüüýÿ(ÿþþÿÿî“GÿÿŒ#âÿÿþýÿÿúýÿ)ÿñûúýÿÿšî…±ÿÿúüýúùýÿ(ÿñüúûþÿÿæ"’—JhÕÿÿýúýÿ+ÿþþÿÿ÷ß~ÿÍeµÿÿþ+ÿéþùöúýúÿÿó7¬ÅN™ÿÿû÷úþÿÿüþÿÿüüýÿýÿÿýýþÿÿþýÿÿó÷CºÒ{ñÿÿüûÿÿúþüûúûÿÿùß ¢—ÿÿýü÷ÿÿüþüüÿÿøù˜Ú7Àÿÿþþÿÿþýÿÿõÿ¿¸ÿÿþÿ4ÿ÷þè wnÎ÷ÿ"ÿûþüþýÿÿù¾/¬™¹ÿÿþüÿÿüüýþÿÿó{¶³±ÿÿý÷üýÿÿþþûÿÿô“3¶’­ÿÿüýþÿÿýýüÿÿõPS¿Ÿïÿÿýþÿÿþüÿÿ÷`V‹áÿÿüÿÿþþÿÿúѤÿÿúûüüþýÿÿýûùÿÿùþÿ ,¹ÿÿþüúùþÿÿüÿôí JºµÿÿþûûýÿÿýûüÿÿôºÙïÿÿýþüýÿÿýúüÿÿõûs}•úÿÿþüÿÿþýÿÿõ¾q£qÒÿÿüþÿÿþûÿÿõð+ÿúÿÿýþÿÿþûÿÿ÷†+GŒÿÿþÿÿþþÿÿù^ÿÈêÿÿþ ÿþþÿÿü)àÏÿÿýþüÿ ÿþûÿÿú艃ÿÿþþÿ ÿþÿýüûÿÿöùÿÿîcêr´ÿÿþýÿÿýþûÿÿúRÿÜÿÿýýûÿÿþüÿÿø†D=—‹áÿÿüüûþÿÿûþúüþÿÿöÍ€:çŸnÿÿüøýùÿÿüýûÿÿþýÿÿø•úÿ3zÿüüÿýÿûûþýÿ8ÿúã‡i|êÿ6ÿýÇWü›ÿ.ÿþüÿÿîùƒ #‘ÀÿÿCÿÿþþúÿ,ÿò7~¸ÿþùÿ ÿÿýüþÿ(ÿíÖÅÿô«Xqÿ«QjÛÿüüþþÿ'ÿívùÿÑ{a–ÿÿÚ'VÃ5[ÿÿþýÿ'ÿíØÿÿUk„Œ˜ÿߥ‘ ÿÿþýÿ'ÿìÅD)|˜qÍÿÿ诽'9u–ÿÿþýÿ'ÿìV‰…Sx¦ÿÿº±»Š |$Fÿÿþþÿ'ÿûqCb¤ÿÿð~·¨g®x7?1âÿúÿ(ÿý• ÿÿîyÜÆŸ„—Ç rÿ"+Aÿÿüÿ'ÿýsÈÿÿðCÀ¢ŠX†ÿh4Ý@:* ÿ-ÿí·."…¹ÿXÚê&Ššÿÿüûþýÿ%ÿåHÁT"½ÿ4²ŽÅÿJÝ9'ÿÿýùÿûýÿ"ÿã›) Ç'ÐbYo¯j£ÿ„­1Ñÿÿþþüþÿ"ÿã}—Q†iKGTwöá_Ýw—­ADQÿÿûþùþÿ"ÿäë_…F¤b¼O{LzÿÅkÊŒ¼™'v$ÿÿüÿüÿ$ÿä4cn}Xdé…ÆOÂÿ|Ý1ƒÿÿýüýÿ#ÿä”\§!v'ªH(~†ì¨nàCAƒ,ÿÿýÿþÿ#ÿä•H§bÄ]ªPÿŸBÿ²,„AÈÿÿüþÿ$ÿ傌ªws·)t…m–ÿþ¼yª?Cÿÿýþÿ$ÿå´™{G/;e”V vÿ~‡âuT°02åÿÿþÿ%ÿé•4ƒ´®k_x‡JÒsµ¦|Î>œ] 2hÿ(ÿéþJŒ€nt)Ë2ÞpÿŽÀû*'ÿ)ÿéä]\‹‰~}ŽClz«èT¶ö @`sÿ%ÿþþÿÿ꨺RÍcS„}õRÖÏlÿ`Œcÿ%ÿýçûÿÿiˆµ:gR{Sñ¬\³´r)&¹ÿ%ÿýþüÿÿë™–ŽŒ[dM£Ó¹˜É°P·Qÿÿýûþÿÿôþûûþýÿúþûÿýÿÿæ8ãpÊÉSžÈw©’ÿ†ˆ0„ÿÿþöüÿÿóýüùýüÿÿüÿúúûÿÿë§G˜±»YW‚ÆÍdâÃ>}8Wÿÿþúÿÿùýÿýÿþþÿÿüýüüÿÿç¢_â |p7^\ÿmµ³EEroÿÿýþÿ#ÿèþÿÿójÂOÔAžÐWÊ UɱȋÊÚ ÿ ÿùýq'Láÿÿäþýÿÿ¼ZÁc:¶P.•‘ýDz]|«>Xÿÿþÿÿúf0übÿÿþþþýÿÿþÿê÷G³Zµ¨¾qªáÚ«tÁÃ:q°ÿÿíï-g”ÔÿÔÿþüüûÿÿÐþ÷ýÿÿÑ•Ëz’„wѧc¸£©i$ ÿÿí. 5nl=nˆ§ÿà¦ÿÿýýþÿÿþþùÿÿáþ¶gÄš‡›„W¡Á’Ãÿ­»|B>”<2m*Íÿÿ÷¾×ÿÿýùþÿÿýÝ÷ûüÿ¹`êÀUÒMr̳¥ÿȹ }fJO8% Êÿïÿÿ÷6ÿÿýýüþÿÿüþüüÿÿâîwº|Àû[OÝÿkÀR¿ªZd >ªÉÿ…M¡ÿÿ÷ÿÿþþûýÿÿåŽÁ‹Õ«c^¥Ú—wŒ‘òZ´B:#¼ÿ¥G{ÿÿü Þÿÿæäj¸™†úˆ¤™L ]ÑæÐÕ­cI`9×#~ÿÿü <ÿÿæþÿÿ–4ŒÿQ™ÿ]™ÿ¸±¨‹£'Ùÿÿûç`8ÿÿþéÿÕ÷ÿP§ào‹ÿ–kƲê«îcŽÿÿúû†ÿÿþþÿÿéüÿÿÄqâ›–oÀr’VÞ¿çJ:7ÿÿú†4/ÿÿýýþÿÿýýþÿÿâüÿäÏ¡nîͳÆ%Ejpõ%«8ÿÿûþÿþýÿÿãýüú÷ÿÿòÁ̦‰œ¶[P^cIŠ™w&q!\ÿÿýýüþþþýÿÿãúÿÿ©ª:ÊzàB^e½ÕxFW3lŸÿýúÿþþþýÿÿýþüÿÿã§c¥c¡9N„·ÿò2d(,;Nÿÿþýþÿýýÿÿæûõýüÿÿì‘£[˜8wáÿÿ—•J@&R<ÿÿüýÿýÿÿûþÿÿþÿÿôªŠF²™ÿÿ®W.,÷0ÿÿüýÿýÿ!ÿþúÿÿõŒ*1oÿÿúÉEöpŠïÿÿþÿÿùþÿüÿüüÿÿâ´l_Æÿÿ¿b  uaŒTÿÿþúÿÿûÿÿþýÿÿýþùûûÿåùk<šÿÿÝW^P+it¹{pZmZHÿÿüüÿøþd½ÿÿûýÿÿüúüüÿÿãé,Zãÿÿj`*bQŽ4[@KtKqf9µÿýÿÿöž,Bÿÿøüÿÿþûÿÿäz„ÿÿžZ,ŽÚ–`? ÊpY’}ÿÿ÷Xtÿÿ-²ÿÿÜÃ@2²ÿÜV=% wux4µ¤i[1)¤Ÿ'#`ÿÿ°3Þÿÿý×ÿ ÿþÿ܇OJI|ÿ¦ˆpº¨Q¬:„HiQTy¥>vÿdÿÿ kÿÿý2Sÿ ÿþûÿÿÑ–I49'jà¦g'ÙÿÌ ˆ4uŸ“}^r‡d;=ÿÿE0ÿÿôûýÿÿž$ÿÿõŒCn9Z‘~¾6åÑÿØÿdJ‡G bu5li4yüÿÿåÿÿ©ÿÿúýÿÿ;‚ÿ ÿ߈oqš¾JC_´‹pÿøÚÌÿN›nd`SG”>ÿÿö²ÿÿüýÿÿ ÿ ÿÞJX–]gКˆ"p\ðÿ¬©£ÄÿKX\•&–":vÅÿÿïûúúþÿÿ´úÿÿþÿÿ ×ÿ ÿÛ³Ž'_ÿ¸X³S/êÿË¥ž¦ ø´VSÃ{yB†•ÿÿýþþÿý€ÿÿüèÿ ÿÿüüÿýÿûûþýÿ8ÿúã‡i|êÿ6ÿýÇWü›ÿ.ÿþüÿÿîùƒ #‘ÀÿÿCÿÿþþúÿ,ÿò7~¸ÿþùÿ ÿÿýüþÿ(ÿíÖÅÿô«Xqÿ«QjÛÿüüþþÿ'ÿívùÿÑ{a–ÿÿÚ'VÃ5[ÿÿþýÿ'ÿíØÿÿUk„Œ˜ÿߥ‘ ÿÿþýÿ'ÿìÅD)|˜qÍÿÿ诽'9u–ÿÿþýÿ'ÿìV‰…Sx¦ÿÿº±»Š |$Fÿÿþþÿ'ÿûqCb¤ÿÿð~·¨g®x7?1âÿúÿ(ÿý• ÿÿîyÜÆŸ„—Ç rÿ"+Aÿÿüÿ'ÿýsÈÿÿðCÀ¢ŠX†ÿh4Ý@:* ÿ-ÿí·."…¹ÿXÚê&Ššÿÿüûþýÿ%ÿåHÁT"½ÿ4²ŽÅÿJÝ9'ÿÿýùÿûýÿ"ÿã›) Ç'ÐbYo¯j£ÿ„­1Ñÿÿþþüþÿ"ÿã}—Q†iKGTwöá_Ýw—­ADQÿÿûþùþÿ"ÿäë_…F¤b¼O{LzÿÅkÊŒ¼™'v$ÿÿüÿüÿ$ÿä4cn}Xdé…ÆOÂÿ|Ý1ƒÿÿýüýÿ#ÿä”\§!v'ªH(~†ì¨nàCAƒ,ÿÿýÿþÿ#ÿä•H§bÄ]ªPÿŸBÿ²,„AÈÿÿüþÿ$ÿ傌ªws·)t…m–ÿþ¼yª?Cÿÿýþÿ$ÿå´™{G/;e”V vÿ~‡âuT°02åÿÿþÿ%ÿé•4ƒ´®k_x‡JÒsµ¦|Î>œ] 2hÿ(ÿéþJŒ€nt)Ë2ÞpÿŽÀû*'ÿ)ÿéä]\‹‰~}ŽClz«èT¶ö @`sÿ%ÿþþÿÿ꨺RÍcS„}õRÖÏlÿ`Œcÿ%ÿýçûÿÿiˆµ:gR{Sñ¬\³´r)&¹ÿ%ÿýþüÿÿë™–ŽŒ[dM£Ó¹˜É°P·Qÿÿýûþÿÿôþûûþýÿúþûÿýÿÿæ8ãpÊÉSžÈw©’ÿ†ˆ0„ÿÿþöüÿÿóýüùýüÿÿüÿúúûÿÿë§G˜±»YW‚ÆÍdâÃ>}8Wÿÿþúÿÿùýÿýÿþþÿÿüýüüÿÿç¢_â |p7^\ÿmµ³EEroÿÿýþÿ#ÿèþÿÿójÂOÔAžÐWÊ UɱȋÊÚ ÿ ÿùýq'Láÿÿäþýÿÿ¼ZÁc:¶P.•‘ýDz]|«>Xÿÿþÿÿúf0übÿÿþþþýÿÿþÿê÷G³Zµ¨¾qªáÚ«tÁÃ:q°ÿÿíï-g”ÔÿÔÿþüüûÿÿÐþ÷ýÿÿÑ•Ëz’„wѧc¸£©i$ ÿÿí. 5nl=nˆ§ÿà¦ÿÿýýþÿÿþþùÿÿáþ¶gÄš‡›„W¡Á’Ãÿ­»|B>”<2m*Íÿÿ÷¾×ÿÿýùþÿÿýÝ÷ûüÿ¹`êÀUÒMr̳¥ÿȹ }fJO8% Êÿïÿÿ÷6ÿÿýýüþÿÿüþüüÿÿâîwº|Àû[OÝÿkÀR¿ªZd >ªÉÿ…M¡ÿÿ÷ÿÿþþûýÿÿåŽÁ‹Õ«c^¥Ú—wŒ‘òZ´B:#¼ÿ¥G{ÿÿü Þÿÿæäj¸™†úˆ¤™L ]ÑæÐÕ­cI`9×#~ÿÿü <ÿÿæþÿÿ–4ŒÿQ™ÿ]™ÿ¸±¨‹£'Ùÿÿûç`8ÿÿþéÿÕ÷ÿP§ào‹ÿ–kƲê«îcŽÿÿúû†ÿÿþþÿÿéüÿÿÄqâ›–oÀr’VÞ¿çJ:7ÿÿú†4/ÿÿýýþÿÿýýþÿÿâüÿäÏ¡nîͳÆ%Ejpõ%«8ÿÿûþÿþýÿÿãýüú÷ÿÿòÁ̦‰œ¶[P^cIŠ™w&q!\ÿÿýýüþþþýÿÿãúÿÿ©ª:ÊzàB^e½ÕxFW3lŸÿýúÿþþþýÿÿýþüÿÿã§c¥c¡9N„·ÿò2d(,;Nÿÿþýþÿýýÿÿæûõýüÿÿì‘£[˜8wáÿÿ—•J@&R<ÿÿüýÿýÿÿûþÿÿþÿÿôªŠF²™ÿÿ®W.,÷0ÿÿüýÿýÿ!ÿþúÿÿõŒ*1oÿÿúÉEöpŠïÿÿþÿÿùþÿüÿüüÿÿâ´l_Æÿÿ¿b  uaŒTÿÿþúÿÿûÿÿþýÿÿýþùûûÿåùk<šÿÿÝW^P+it¹{pZmZHÿÿüüÿøþd½ÿÿûýÿÿüúüüÿÿãé,Zãÿÿj`*bQŽ4[@KtKqf9µÿýÿÿöž,Bÿÿøüÿÿþûÿÿäz„ÿÿžZ,ŽÚ–`? ÊpY’}ÿÿ÷Xtÿÿ-²ÿÿÜÃ@2²ÿÜV=% wux4µ¤i[1)¤Ÿ'#`ÿÿ°3Þÿÿý×ÿ ÿþÿ܇OJI|ÿ¦ˆpº¨Q¬:„HiQTy¥>vÿdÿÿ kÿÿý2Sÿ ÿþûÿÿÑ–I49'jà¦g'ÙÿÌ ˆ4uŸ“}^r‡d;=ÿÿE0ÿÿôûýÿÿž$ÿÿõŒCn9Z‘~¾6åÑÿØÿdJ‡G bu5li4yüÿÿåÿÿ©ÿÿúýÿÿ;‚ÿ ÿ߈oqš¾JC_´‹pÿøÚÌÿN›nd`SG”>ÿÿö²ÿÿüýÿÿ ÿ ÿÞJX–]gКˆ"p\ðÿ¬©£ÄÿKX\•&–":vÅÿÿïûúúþÿÿ´úÿÿþÿÿ ×ÿ ÿÛ³Ž'_ÿ¸X³S/êÿË¥ž¦ ø´VSÃ{yB†•ÿÿýþþÿý€ÿÿüèÿ ÿÿüüÿýÿûûþýÿ8ÿúã‡i|êÿ6ÿýÇWü›ÿ.ÿþüÿÿîùƒ #‘ÀÿÿCÿÿþþúÿ,ÿò7~¸ÿþùÿ ÿÿýüþÿ(ÿíÖÅÿô«Xqÿ«QjÛÿüüþþÿ'ÿívùÿÑ{a–ÿÿÚ'VÃ5[ÿÿþýÿ'ÿíØÿÿUk„Œ˜ÿߥ‘ ÿÿþýÿ'ÿìÅD)|˜qÍÿÿ诽'9u–ÿÿþýÿ'ÿìV‰…Sx¦ÿÿº±»Š |$Fÿÿþþÿ'ÿûqCb¤ÿÿð~·¨g®x7?1âÿúÿ(ÿý• ÿÿîyÜÆŸ„—Ç rÿ"+Aÿÿüÿ'ÿýsÈÿÿðCÀ¢ŠX†ÿh4Ý@:* ÿ-ÿí·."…¹ÿXÚê&Ššÿÿüûþýÿ%ÿåHÁT"½ÿ4²ŽÅÿJÝ9'ÿÿýùÿûýÿ"ÿã›) Ç'ÐbYo¯j£ÿ„­1Ñÿÿþþüþÿ"ÿã}—Q†iKGTwöá_Ýw—­ADQÿÿûþùþÿ"ÿäë_…F¤b¼O{LzÿÅkÊŒ¼™'v$ÿÿüÿüÿ$ÿä4cn}Xdé…ÆOÂÿ|Ý1ƒÿÿýüýÿ#ÿä”\§!v'ªH(~†ì¨nàCAƒ,ÿÿýÿþÿ#ÿä•H§bÄ]ªPÿŸBÿ²,„AÈÿÿüþÿ$ÿ傌ªws·)t…m–ÿþ¼yª?Cÿÿýþÿ$ÿå´™{G/;e”V vÿ~‡âuT°02åÿÿþÿ%ÿé•4ƒ´®k_x‡JÒsµ¦|Î>œ] 2hÿ(ÿéþJŒ€nt)Ë2ÞpÿŽÀû*'ÿ)ÿéä]\‹‰~}ŽClz«èT¶ö @`sÿ%ÿþþÿÿ꨺RÍcS„}õRÖÏlÿ`Œcÿ%ÿýçûÿÿiˆµ:gR{Sñ¬\³´r)&¹ÿ%ÿýþüÿÿë™–ŽŒ[dM£Ó¹˜É°P·Qÿÿýûþÿÿôþûûþýÿúþûÿýÿÿæ8ãpÊÉSžÈw©’ÿ†ˆ0„ÿÿþöüÿÿóýüùýüÿÿüÿúúûÿÿë§G˜±»YW‚ÆÍdâÃ>}8Wÿÿþúÿÿùýÿýÿþþÿÿüýüüÿÿç¢_â |p7^\ÿmµ³EEroÿÿýþÿ#ÿèþÿÿójÂOÔAžÐWÊ UɱȋÊÚ ÿ ÿùýq'Láÿÿäþýÿÿ¼ZÁc:¶P.•‘ýDz]|«>Xÿÿþÿÿúf0übÿÿþþþýÿÿþÿê÷G³Zµ¨¾qªáÚ«tÁÃ:q°ÿÿíï-g”ÔÿÔÿþüüûÿÿÐþ÷ýÿÿÑ•Ëz’„wѧc¸£©i$ ÿÿí. 5nl=nˆ§ÿà¦ÿÿýýþÿÿþþùÿÿáþ¶gÄš‡›„W¡Á’Ãÿ­»|B>”<2m*Íÿÿ÷¾×ÿÿýùþÿÿýÝ÷ûüÿ¹`êÀUÒMr̳¥ÿȹ }fJO8% Êÿïÿÿ÷6ÿÿýýüþÿÿüþüüÿÿâîwº|Àû[OÝÿkÀR¿ªZd >ªÉÿ…M¡ÿÿ÷ÿÿþþûýÿÿåŽÁ‹Õ«c^¥Ú—wŒ‘òZ´B:#¼ÿ¥G{ÿÿü Þÿÿæäj¸™†úˆ¤™L ]ÑæÐÕ­cI`9×#~ÿÿü <ÿÿæþÿÿ–4ŒÿQ™ÿ]™ÿ¸±¨‹£'Ùÿÿûç`8ÿÿþéÿÕ÷ÿP§ào‹ÿ–kƲê«îcŽÿÿúû†ÿÿþþÿÿéüÿÿÄqâ›–oÀr’VÞ¿çJ:7ÿÿú†4/ÿÿýýþÿÿýýþÿÿâüÿäÏ¡nîͳÆ%Ejpõ%«8ÿÿûþÿþýÿÿãýüú÷ÿÿòÁ̦‰œ¶[P^cIŠ™w&q!\ÿÿýýüþþþýÿÿãúÿÿ©ª:ÊzàB^e½ÕxFW3lŸÿýúÿþþþýÿÿýþüÿÿã§c¥c¡9N„·ÿò2d(,;Nÿÿþýþÿýýÿÿæûõýüÿÿì‘£[˜8wáÿÿ—•J@&R<ÿÿüýÿýÿÿûþÿÿþÿÿôªŠF²™ÿÿ®W.,÷0ÿÿüýÿýÿ!ÿþúÿÿõŒ*1oÿÿúÉEöpŠïÿÿþÿÿùþÿüÿüüÿÿâ´l_Æÿÿ¿b  uaŒTÿÿþúÿÿûÿÿþýÿÿýþùûûÿåùk<šÿÿÝW^P+it¹{pZmZHÿÿüüÿøþd½ÿÿûýÿÿüúüüÿÿãé,Zãÿÿj`*bQŽ4[@KtKqf9µÿýÿÿöž,Bÿÿøüÿÿþûÿÿäz„ÿÿžZ,ŽÚ–`? ÊpY’}ÿÿ÷Xtÿÿ-²ÿÿÜÃ@2²ÿÜV=% wux4µ¤i[1)¤Ÿ'#`ÿÿ°3Þÿÿý×ÿ ÿþÿ܇OJI|ÿ¦ˆpº¨Q¬:„HiQTy¥>vÿdÿÿ kÿÿý2Sÿ ÿþûÿÿÑ–I49'jà¦g'ÙÿÌ ˆ4uŸ“}^r‡d;=ÿÿE0ÿÿôûýÿÿž$ÿÿõŒCn9Z‘~¾6åÑÿØÿdJ‡G bu5li4yüÿÿåÿÿ©ÿÿúýÿÿ;‚ÿ ÿ߈oqš¾JC_´‹pÿøÚÌÿN›nd`SG”>ÿÿö²ÿÿüýÿÿ ÿ ÿÞJX–]gКˆ"p\ðÿ¬©£ÄÿKX\•&–":vÅÿÿïûúúþÿÿ´úÿÿþÿÿ ×ÿ ÿÛ³Ž'_ÿ¸X³S/êÿË¥ž¦ ø´VSÃ{yB†•ÿÿýþþÿý€ÿÿüèÿ ÿ ÿôþýþÿþþÿÿýþýÿÿýþüÿÿô"ÿÿ–ѵ+Vÿ!ÿüþýüÿ ÿðüÿÿ>䜨ŸŒ§ÿpIÁÿ!ÿþþÿ ÿþþÿÿ÷É~¿q¡VÖÿ)ÿûˆ%LÛÿÿüüýýÿÿù˜Ÿn¢ÿÿþèÿ#ÿù\¥·IÿÿõýþÿÿGñÕrÄÿÿý~ÿÿøQXX/õÿÿü8çÿÿúÒH‚eÿÿûsÿÿøAßœ5uÿÿüWÅÿÿû-TÂÿÿýé\ÿìi/GÁÿ¿%_àÿÿ› ôÿÿ"ÿÿõÏ‘91]*ÿÿÞ°ÿÿÛlJëÏ€{ðÿÿÊI¹Rb,H %Kb:ÿÿþýÿÿýy)ÿÿåˆq’½p—Øÿ¤…'Š\ 7E "qÿÿÙûÿÈ9‹ÿõ”…ƒåÿò()E /»ÿÿ«?eãÿÿGÿÿü’õ+ÿ« O'+œÿ ÿý“ÿÿý¢ÿÿûÝÎ9TÿÿþàÿÿÞúóÓÿÖÿÿíþÿÿÿÿÌç’Á|†®Ñáñ¿ÿÿùë’÷ÿÿût°ªEÿÿçþÿÿÆÿƒMX7]T/6ÞÿüÿÙ]ÿÿýkùiüÿPjÿÿìûÿÿLÿÚˆ°xJˆ©Ç®Åý1ÿÿüç®ÿÿýŸ4û2<ÿÿþþÿ ÿúþÿÿ}ÿÿþîÿÿýÿÿú£¤ÿÿýÿÿùÓQW9Lÿÿìþÿÿùÿ…`sÿ§ÿiÿÿ°ÿÿúÖÿÿûÿÿùÕ—Œ˜sÿÿæûùÿÿÿ2ÿó ÿ)ƒÿÿé´ÿÿø¬o/Y%ÿ ÿþþÿ ÿîýÿÿÿ6+Íÿd Ê8mFÿþ=ÿÿö×¥/3mÿ]ÿÿêöÿÿÿ©oR`ÿÿGÞ÷d5nQäÿÿòäÿÂC„¸ÿÿzheÿÿíöÿÿÿÿh®"ÏÿâFÿÝEL‡ÿÿ÷_i‚O‰ úÿÿýZÿÿîþüÿÿäÿs°UIÿÿxÐÿûÿÿþ[û|¸Òÿÿý¡4ÿóþüÿÿ;4ÿ¯±»hûÿÿñõ¤ÿÿ<6öŠ]óUû&)ÿÿöþüþÿíÿÿùÿÿùƒQÁÔÿÿò…'f[Š[[Žvÿÿþþÿÿøþýúÿÿ¦ÿÿýÖÿÿýçSó'Cä9týÇC ÿÿþþÿ ÿþýÿÿõûýþÿÿi[ÿùëÿÿüñ£DòO6OZºÐþéÿÿ3ÿÿýþûÿÿùþùþþÿ×ú 2V5ï$o+e T«^Üÿÿ¸_ÿÿýýþÿÿùýþþÿÿ¿ÿÿ î)?]T€¬…“Óÿ¥§ÿÿôüùþÿýÿþýúúþÿÿþÀçE8O‰´yw][p6Š_ÿÿøþÿüýýúþÿÿþ…䟤Tÿ,[³ÿŸ„v(‘zu©EZM ÿÿûþýúûÿÿîÉ'„R™ÀTÿÿù*UUâÿÿñEi›œªˆTõÿTZAIÿ ÿþþÿÿüûýþÿÿîVÏætttj†ÿÿŽ+ÿÿ÷‚Š„³ÿÿû¤µ) ÿ ÿýýþÿÿýÉ'Ý€ƒ;7„’ÿ^M;vzbÿÞT’Ghåÿ«ÿã5ÿ ÿþüÿÿþþÿÿÖ¯&O8î3q;XHBc‘³'eq[’D3H:»=ÿ ÿýýüÿÿÙŠ u:]©ÿƒo5{ÿ¤6Èyv\ j‚Žuz1wµ{ $6ÿþýÿÿî¼ÍUO>áÿÿHu^)€ÿÿï6fƒØÿÿÛ 73;üH;ÿÿöö‡ÿÿF»ÿÿû3›Âÿÿöþ?çÿÿ¯~V þ<ÿÿý9ÿÿüLJÿÿý‚ÿÿúŒ°ÿq(÷ÊÑÅÄÚÔóÿÿü`ÿÿ÷Šÿÿ‰7* ÿÿû¾‹ýÿÿúyýJåÿ ÿþåÿÿ<åó=8<¥éÿÿàFb¿SŸZzßÿ ÿûûÿÿüÿÿãüÿÿׇ5\_w58ÿÿQg’–°iÿófº7JÿÿüúøüÿÿåƒÛ“&‹#q!] ucD6OÄ>O¸ÿÿþ ÿþÿî(Q^ÇL”miI‹š‰C&þÅÿÿýüúÿÿýøýÿÿæ;évºÉ„_ouŽq`B×4I¹ÿÿùúÿúýÿþÿÿþùÿþþýÿþÿÿêÊdÿÿ1ÍŸ¡ÿP2Ôÿ[(ÿÿùûýÿþÿþÿÿýÿþþÿ ÿîáeti$ŸÿÿFŽh"ÿÿúËÿ=ÿ ÿþþÿÿý/ô¼hï;9@.ÿÿúãzoÿÿþþÿÿå…VÿcEß» ÿ¯Wóÿyïÿÿí=*ÿ$ÿñ6tñ‰œ‹áÿ#_ÿ%ÀÿÿöCæÿw1Ïÿ$ÿò:ÿSMŠà®¨;>ÿÿúÿ%ÿó+ÿGÆÿ‘)c@|ÿÿý•%þ‹ÿ&ÿûÿ»núÿþÿÿþ-ÿûÿQÆÿÿüñ<ÿÿþüÿ)ÿþÿÿþŒ5ÿò¡P¤ÿÿ4:ÿÿýÿ1ÿð2øÿ÷;oÿÿüûþÿ0ÿñjÞ/Dÿÿüüþÿ0ÿý–ÿÿû¨S.ÿÿù2ÿò¼?F[hXÿÿýþÿ1ÿõtkÀØjóÿJÿÿýüþÿ-ÿïüÿÿÿÿ›sÿÿÿøþÿ-ÿýüþÿÿû=˜ûšÿÿûÿ.ÿñýüüûúñ¸nV‡»âùüýýþþÿ'ÿ ÿôþýþÿþþÿÿýþýÿÿýþüÿÿô"ÿÿ–ѵ+Vÿ!ÿüþýüÿ ÿðüÿÿ>䜨ŸŒ§ÿpIÁÿ!ÿþþÿ ÿþþÿÿ÷É~¿q¡VÖÿ)ÿûˆ%LÛÿÿüüýýÿÿù˜Ÿn¢ÿÿþèÿ#ÿù\¥·IÿÿõýþÿÿGñÕrÄÿÿý~ÿÿøQXX/õÿÿü8çÿÿúÒH‚eÿÿûsÿÿøAßœ5uÿÿüWÅÿÿû-TÂÿÿýé\ÿìi/GÁÿ¿%_àÿÿ› ôÿÿ"ÿÿõÏ‘91]*ÿÿÞ°ÿÿÛlJëÏ€{ðÿÿÊI¹Rb,H %Kb:ÿÿþýÿÿýy)ÿÿåˆq’½p—Øÿ¤…'Š\ 7E "qÿÿÙûÿÈ9‹ÿõ”…ƒåÿò()E /»ÿÿ«?eãÿÿGÿÿü’õ+ÿ« O'+œÿ ÿý“ÿÿý¢ÿÿûÝÎ9TÿÿþàÿÿÞúóÓÿÖÿÿíþÿÿÿÿÌç’Á|†®Ñáñ¿ÿÿùë’÷ÿÿût°ªEÿÿçþÿÿÆÿƒMX7]T/6ÞÿüÿÙ]ÿÿýkùiüÿPjÿÿìûÿÿLÿÚˆ°xJˆ©Ç®Åý1ÿÿüç®ÿÿýŸ4û2<ÿÿþþÿ ÿúþÿÿ}ÿÿþîÿÿýÿÿú£¤ÿÿýÿÿùÓQW9Lÿÿìþÿÿùÿ…`sÿ§ÿiÿÿ°ÿÿúÖÿÿûÿÿùÕ—Œ˜sÿÿæûùÿÿÿ2ÿó ÿ)ƒÿÿé´ÿÿø¬o/Y%ÿ ÿþþÿ ÿîýÿÿÿ6+Íÿd Ê8mFÿþ=ÿÿö×¥/3mÿ]ÿÿêöÿÿÿ©oR`ÿÿGÞ÷d5nQäÿÿòäÿÂC„¸ÿÿzheÿÿíöÿÿÿÿh®"ÏÿâFÿÝEL‡ÿÿ÷_i‚O‰ úÿÿýZÿÿîþüÿÿäÿs°UIÿÿxÐÿûÿÿþ[û|¸Òÿÿý¡4ÿóþüÿÿ;4ÿ¯±»hûÿÿñõ¤ÿÿ<6öŠ]óUû&)ÿÿöþüþÿíÿÿùÿÿùƒQÁÔÿÿò…'f[Š[[Žvÿÿþþÿÿøþýúÿÿ¦ÿÿýÖÿÿýçSó'Cä9týÇC ÿÿþþÿ ÿþýÿÿõûýþÿÿi[ÿùëÿÿüñ£DòO6OZºÐþéÿÿ3ÿÿýþûÿÿùþùþþÿ×ú 2V5ï$o+e T«^Üÿÿ¸_ÿÿýýþÿÿùýþþÿÿ¿ÿÿ î)?]T€¬…“Óÿ¥§ÿÿôüùþÿýÿþýúúþÿÿþÀçE8O‰´yw][p6Š_ÿÿøþÿüýýúþÿÿþ…䟤Tÿ,[³ÿŸ„v(‘zu©EZM ÿÿûþýúûÿÿîÉ'„R™ÀTÿÿù*UUâÿÿñEi›œªˆTõÿTZAIÿ ÿþþÿÿüûýþÿÿîVÏætttj†ÿÿŽ+ÿÿ÷‚Š„³ÿÿû¤µ) ÿ ÿýýþÿÿýÉ'Ý€ƒ;7„’ÿ^M;vzbÿÞT’Ghåÿ«ÿã5ÿ ÿþüÿÿþþÿÿÖ¯&O8î3q;XHBc‘³'eq[’D3H:»=ÿ ÿýýüÿÿÙŠ u:]©ÿƒo5{ÿ¤6Èyv\ j‚Žuz1wµ{ $6ÿþýÿÿî¼ÍUO>áÿÿHu^)€ÿÿï6fƒØÿÿÛ 73;üH;ÿÿöö‡ÿÿF»ÿÿû3›Âÿÿöþ?çÿÿ¯~V þ<ÿÿý9ÿÿüLJÿÿý‚ÿÿúŒ°ÿq(÷ÊÑÅÄÚÔóÿÿü`ÿÿ÷Šÿÿ‰7* ÿÿû¾‹ýÿÿúyýJåÿ ÿþåÿÿ<åó=8<¥éÿÿàFb¿SŸZzßÿ ÿûûÿÿüÿÿãüÿÿׇ5\_w58ÿÿQg’–°iÿófº7JÿÿüúøüÿÿåƒÛ“&‹#q!] ucD6OÄ>O¸ÿÿþ ÿþÿî(Q^ÇL”miI‹š‰C&þÅÿÿýüúÿÿýøýÿÿæ;évºÉ„_ouŽq`B×4I¹ÿÿùúÿúýÿþÿÿþùÿþþýÿþÿÿêÊdÿÿ1ÍŸ¡ÿP2Ôÿ[(ÿÿùûýÿþÿþÿÿýÿþþÿ ÿîáeti$ŸÿÿFŽh"ÿÿúËÿ=ÿ ÿþþÿÿý/ô¼hï;9@.ÿÿúãzoÿÿþþÿÿå…VÿcEß» ÿ¯Wóÿyïÿÿí=*ÿ$ÿñ6tñ‰œ‹áÿ#_ÿ%ÀÿÿöCæÿw1Ïÿ$ÿò:ÿSMŠà®¨;>ÿÿúÿ%ÿó+ÿGÆÿ‘)c@|ÿÿý•%þ‹ÿ&ÿûÿ»núÿþÿÿþ-ÿûÿQÆÿÿüñ<ÿÿþüÿ)ÿþÿÿþŒ5ÿò¡P¤ÿÿ4:ÿÿýÿ1ÿð2øÿ÷;oÿÿüûþÿ0ÿñjÞ/Dÿÿüüþÿ0ÿý–ÿÿû¨S.ÿÿù2ÿò¼?F[hXÿÿýþÿ1ÿõtkÀØjóÿJÿÿýüþÿ-ÿïüÿÿÿÿ›sÿÿÿøþÿ-ÿýüþÿÿû=˜ûšÿÿûÿ.ÿñýüüûúñ¸nV‡»âùüýýþþÿ'ÿ ÿôþýþÿþþÿÿýþýÿÿýþüÿÿô"ÿÿ–ѵ+Vÿ!ÿüþýüÿ ÿðüÿÿ>䜨ŸŒ§ÿpIÁÿ!ÿþþÿ ÿþþÿÿ÷É~¿q¡VÖÿ)ÿûˆ%LÛÿÿüüýýÿÿù˜Ÿn¢ÿÿþèÿ#ÿù\¥·IÿÿõýþÿÿGñÕrÄÿÿý~ÿÿøQXX/õÿÿü8çÿÿúÒH‚eÿÿûsÿÿøAßœ5uÿÿüWÅÿÿû-TÂÿÿýé\ÿìi/GÁÿ¿%_àÿÿ› ôÿÿ"ÿÿõÏ‘91]*ÿÿÞ°ÿÿÛlJëÏ€{ðÿÿÊI¹Rb,H %Kb:ÿÿþýÿÿýy)ÿÿåˆq’½p—Øÿ¤…'Š\ 7E "qÿÿÙûÿÈ9‹ÿõ”…ƒåÿò()E /»ÿÿ«?eãÿÿGÿÿü’õ+ÿ« O'+œÿ ÿý“ÿÿý¢ÿÿûÝÎ9TÿÿþàÿÿÞúóÓÿÖÿÿíþÿÿÿÿÌç’Á|†®Ñáñ¿ÿÿùë’÷ÿÿût°ªEÿÿçþÿÿÆÿƒMX7]T/6ÞÿüÿÙ]ÿÿýkùiüÿPjÿÿìûÿÿLÿÚˆ°xJˆ©Ç®Åý1ÿÿüç®ÿÿýŸ4û2<ÿÿþþÿ ÿúþÿÿ}ÿÿþîÿÿýÿÿú£¤ÿÿýÿÿùÓQW9Lÿÿìþÿÿùÿ…`sÿ§ÿiÿÿ°ÿÿúÖÿÿûÿÿùÕ—Œ˜sÿÿæûùÿÿÿ2ÿó ÿ)ƒÿÿé´ÿÿø¬o/Y%ÿ ÿþþÿ ÿîýÿÿÿ6+Íÿd Ê8mFÿþ=ÿÿö×¥/3mÿ]ÿÿêöÿÿÿ©oR`ÿÿGÞ÷d5nQäÿÿòäÿÂC„¸ÿÿzheÿÿíöÿÿÿÿh®"ÏÿâFÿÝEL‡ÿÿ÷_i‚O‰ úÿÿýZÿÿîþüÿÿäÿs°UIÿÿxÐÿûÿÿþ[û|¸Òÿÿý¡4ÿóþüÿÿ;4ÿ¯±»hûÿÿñõ¤ÿÿ<6öŠ]óUû&)ÿÿöþüþÿíÿÿùÿÿùƒQÁÔÿÿò…'f[Š[[Žvÿÿþþÿÿøþýúÿÿ¦ÿÿýÖÿÿýçSó'Cä9týÇC ÿÿþþÿ ÿþýÿÿõûýþÿÿi[ÿùëÿÿüñ£DòO6OZºÐþéÿÿ3ÿÿýþûÿÿùþùþþÿ×ú 2V5ï$o+e T«^Üÿÿ¸_ÿÿýýþÿÿùýþþÿÿ¿ÿÿ î)?]T€¬…“Óÿ¥§ÿÿôüùþÿýÿþýúúþÿÿþÀçE8O‰´yw][p6Š_ÿÿøþÿüýýúþÿÿþ…䟤Tÿ,[³ÿŸ„v(‘zu©EZM ÿÿûþýúûÿÿîÉ'„R™ÀTÿÿù*UUâÿÿñEi›œªˆTõÿTZAIÿ ÿþþÿÿüûýþÿÿîVÏætttj†ÿÿŽ+ÿÿ÷‚Š„³ÿÿû¤µ) ÿ ÿýýþÿÿýÉ'Ý€ƒ;7„’ÿ^M;vzbÿÞT’Ghåÿ«ÿã5ÿ ÿþüÿÿþþÿÿÖ¯&O8î3q;XHBc‘³'eq[’D3H:»=ÿ ÿýýüÿÿÙŠ u:]©ÿƒo5{ÿ¤6Èyv\ j‚Žuz1wµ{ $6ÿþýÿÿî¼ÍUO>áÿÿHu^)€ÿÿï6fƒØÿÿÛ 73;üH;ÿÿöö‡ÿÿF»ÿÿû3›Âÿÿöþ?çÿÿ¯~V þ<ÿÿý9ÿÿüLJÿÿý‚ÿÿúŒ°ÿq(÷ÊÑÅÄÚÔóÿÿü`ÿÿ÷Šÿÿ‰7* ÿÿû¾‹ýÿÿúyýJåÿ ÿþåÿÿ<åó=8<¥éÿÿàFb¿SŸZzßÿ ÿûûÿÿüÿÿãüÿÿׇ5\_w58ÿÿQg’–°iÿófº7JÿÿüúøüÿÿåƒÛ“&‹#q!] ucD6OÄ>O¸ÿÿþ ÿþÿî(Q^ÇL”miI‹š‰C&þÅÿÿýüúÿÿýøýÿÿæ;évºÉ„_ouŽq`B×4I¹ÿÿùúÿúýÿþÿÿþùÿþþýÿþÿÿêÊdÿÿ1ÍŸ¡ÿP2Ôÿ[(ÿÿùûýÿþÿþÿÿýÿþþÿ ÿîáeti$ŸÿÿFŽh"ÿÿúËÿ=ÿ ÿþþÿÿý/ô¼hï;9@.ÿÿúãzoÿÿþþÿÿå…VÿcEß» ÿ¯Wóÿyïÿÿí=*ÿ$ÿñ6tñ‰œ‹áÿ#_ÿ%ÀÿÿöCæÿw1Ïÿ$ÿò:ÿSMŠà®¨;>ÿÿúÿ%ÿó+ÿGÆÿ‘)c@|ÿÿý•%þ‹ÿ&ÿûÿ»núÿþÿÿþ-ÿûÿQÆÿÿüñ<ÿÿþüÿ)ÿþÿÿþŒ5ÿò¡P¤ÿÿ4:ÿÿýÿ1ÿð2øÿ÷;oÿÿüûþÿ0ÿñjÞ/Dÿÿüüþÿ0ÿý–ÿÿû¨S.ÿÿù2ÿò¼?F[hXÿÿýþÿ1ÿõtkÀØjóÿJÿÿýüþÿ-ÿïüÿÿÿÿ›sÿÿÿøþÿ-ÿýüþÿÿû=˜ûšÿÿûÿ.ÿñýüüûúñ¸nV‡»âùüýýþþÿ'ÿÏ =ÿÿ8X Âÿ鈶ܛª²ÿmD‚vS;C™ÿ›sÿÿýþüÿà876ÿï™ÿÿù^Dóÿúÿÿà©93-áÿÚµ­ž©¢Ûåí¹9¢_ZLbkÃÿÿÖÉ-ÿÿóûÿÿd¹ÿÿkváÿÿûÝ +ÿÿåÚW4ÿÿô²°À§ÐÑ¢×ÿo‰d>c‹ÿÿí6ÿÿþÿÿì)ÿJ{ùÿÍÿýÿÿýkŠÿÿýT ëN”ËöúÒ§¡ÿ¿^”µ*2çÿÿý†ÿÿèûþÿÿ>žá¡ÿ Gÿÿüüþÿÿê÷ÿÿßU^ ÿÿ]ÿ¼ÿ:›IñgrŽÈðì€ïÿÿüÿÿóá#ÿ’ÁÿÄðÿÿûûÿýS¯ÿÿâ"4TßFÿÿJñªTZaj\W×ÿÿýWiÿÿï¨_V“ÿÿûÿÿûýÿÿ0éÿÿå †G?.ÿž.Œÿ9 ¥ÿ„ÿÿñÁQÊõ-¤˜ÿÿ?j&oÿÿöüøÿûÿÿ€*ôÿÿÝGmÄÿÿ¤"§ÿÿ6_8ÞÝJÿÿøFeÿýó„}€¼ÿ®xjŠîÿÿýþûÿÿý4iÿÿüqLlÿÿþgìÉÄ‚œÿLT4´ýRæÿ,ï^¶_»¥fÿÿ/@?%ãÿÿþýÿÿýÏ(ÿÿýLóÿÿÓš`ÿ×<OÈñÃó83DNc#hp„‹Uc½TTž,M&«ÿÿûù‰ÿ ÿÓTm~ßïp>àÝÈëTA.AN£T“…T/V ³Ô69ºÿóxÿÿût7~ïÿ ÿþ—Ý_ÿ4?ËÅîõ—#!… V/'Æ1zueYÕaÿÿõO§ÿ¿!VÿþþÿÿýýþÿÿÞÓM»ÿ”ÁRheŠW7d.~Ao=qH¬w“ÿÿþ€ü ÿõÿÿþùÿ ÿÝ,>ê€1~[C;[¥a}¤Rj“ªuW°cŽp?­ÃÿÿþÚÿ ÿþÿÿþêÿÿðÎîÕæÞ”ò˜¥S3Oë(5> …ÒÖáÜzwxÿÿý%ÿÿú×DÿÿTôâÿŒÚs“fíÿÿø4ê¢r‚Ðÿÿö¤ÿÿûûþýýÿÿýQÿÿì»ÿ÷\úz3Áo‘Bÿÿæ‹ÿK-&&KVZŽÿýþÿÿ£Q\ÿÿþýýÿ ÿó«aÿÿ²3ÿÿ×B;ÿÿùŠÄÿÿûÿªÀÿÿýønÿÿý±ÿÿþþÿ ÿóÝÌÿÿ¬>ÿÿŒ;ÿÿøÉBÿïÍÿÿòÁ‚Éÿ°dš‡Ÿ‚gÿÿ÷ÏGé0ÿÿþÿ ÿôêÿªÿß~ÿø^ÿÿùâÿÿXÏÿÿêyCªŒÿÿîç·§ô >9'ÆŠxwÿÿô¼yÿÿøÿ¢üÿÿþôÿÿòL+ÿÿýÿýTlÿ99ÿÿ÷êøÿÌdÝÿÿþiÿÿý•ÿÿý{åÿÿüc)žÿÿùÖ¾¾>ÿÿüúþûÿÿû"ÌGÿÿø÷ÿÿôÿÿï°‹ÿ‘ÿÿ”eÀÌÿÃÿÿzù«ÿÿþþüÿÿú­fNŠÿÿùE09 ~ÿÿçhÿÙÜ]qÿðÿ¶#ÿuúÿ*œÿ’ÿÿþýÿÿù­‹‚v ÿÿ鑵Uÿÿñ}l=•ãLÿ Žôÿ>ÿüb=”ÿÿý'Dÿÿø»ŽÉb¯ÿÿþþÿ ÿô(Î…e4üòJ [#åÿÃuÍÿÿíîdÿÿÕÍ‹_O‘ÿÿûÿþÿ ÿ÷<>5b;ýVyþ>ýšáÿÿðó\d$B÷ÿÿýþÿÿôBW,sÿÿˆ-³ÿ ÿþþÿÿþþÿÿøwm*ÿÿýùþÿÿøh:qÿ ÿùüýýþùþÿÿþþÿÿùŘàÿÿôÿÿüýÿýÿÿúF`’%ût5cÎÿÿôýÿÿûÿþÿÿøýùÿÿþþÿÿþ&þõÿÿûýÿÿ÷ÿÿø# {ý-ðÿÿþýÿÿýüúÿÿóÿ]ÝÿÿýþýÿøÿÿêL/$0XO«æÁdÿÿüþùûÿÿúÊÿUÿÿüýþþÿÿð;=$,L þÿÿó69Uÿ¾ÿÿýýûûÿÿé7G32/B 4 SDÿÿð€$wÿœÿÿýÿþþÿÿé%W"12%nJ´£Q9ÿÿð* ÿÛÿ›#ÈÿÿüÿýÿÿÚ?S—¥3/.L\–Ó¤ÿ`×Éàê[ fyhÿ[³Ï”ÿÿþþÿü2 þñ¹¥µQht—a¨4öTÿÿæÿÈÿÿÙ_' />t´k”õ1‹ÓÿC}ÿ‡ßÅÿÿüÿÿÝ#LB]ƒ9!_ÓùbBQ®¤Ï¸~Ü ÿ5£)Âÿšÿÿý— Ü !S©|[y\)ÂÿjÿŽºÿÿ»ÿÿüÿÿþÿÿþ‚àp…tD¢?7(B3("OmÿÿüüøþÿÿþyòQ "¬.’–HGÿÿ¡*ô"ãÿÿþþüÿÿþýÿÿýÈ2ù%Z?…ÿÿø­ ÿeÿ(ÿôÄQÿÿüÿÿ÷½ÿÿÏÿþÿ(ÿþ´øaÿÿûÿýþÿÿûGÿÿþÿ*ÿüEÿÿùþÿÿâ5ÿÿþþÿœÿÏ =ÿÿ8X Âÿ鈶ܛª²ÿmD‚vS;C™ÿ›sÿÿýþüÿà876ÿï™ÿÿù^Dóÿúÿÿà©93-áÿÚµ­ž©¢Ûåí¹9¢_ZLbkÃÿÿÖÉ-ÿÿóûÿÿd¹ÿÿkváÿÿûÝ +ÿÿåÚW4ÿÿô²°À§ÐÑ¢×ÿo‰d>c‹ÿÿí6ÿÿþÿÿì)ÿJ{ùÿÍÿýÿÿýkŠÿÿýT ëN”ËöúÒ§¡ÿ¿^”µ*2çÿÿý†ÿÿèûþÿÿ>žá¡ÿ Gÿÿüüþÿÿê÷ÿÿßU^ ÿÿ]ÿ¼ÿ:›IñgrŽÈðì€ïÿÿüÿÿóá#ÿ’ÁÿÄðÿÿûûÿýS¯ÿÿâ"4TßFÿÿJñªTZaj\W×ÿÿýWiÿÿï¨_V“ÿÿûÿÿûýÿÿ0éÿÿå †G?.ÿž.Œÿ9 ¥ÿ„ÿÿñÁQÊõ-¤˜ÿÿ?j&oÿÿöüøÿûÿÿ€*ôÿÿÝGmÄÿÿ¤"§ÿÿ6_8ÞÝJÿÿøFeÿýó„}€¼ÿ®xjŠîÿÿýþûÿÿý4iÿÿüqLlÿÿþgìÉÄ‚œÿLT4´ýRæÿ,ï^¶_»¥fÿÿ/@?%ãÿÿþýÿÿýÏ(ÿÿýLóÿÿÓš`ÿ×<OÈñÃó83DNc#hp„‹Uc½TTž,M&«ÿÿûù‰ÿ ÿÓTm~ßïp>àÝÈëTA.AN£T“…T/V ³Ô69ºÿóxÿÿût7~ïÿ ÿþ—Ý_ÿ4?ËÅîõ—#!… V/'Æ1zueYÕaÿÿõO§ÿ¿!VÿþþÿÿýýþÿÿÞÓM»ÿ”ÁRheŠW7d.~Ao=qH¬w“ÿÿþ€ü ÿõÿÿþùÿ ÿÝ,>ê€1~[C;[¥a}¤Rj“ªuW°cŽp?­ÃÿÿþÚÿ ÿþÿÿþêÿÿðÎîÕæÞ”ò˜¥S3Oë(5> …ÒÖáÜzwxÿÿý%ÿÿú×DÿÿTôâÿŒÚs“fíÿÿø4ê¢r‚Ðÿÿö¤ÿÿûûþýýÿÿýQÿÿì»ÿ÷\úz3Áo‘Bÿÿæ‹ÿK-&&KVZŽÿýþÿÿ£Q\ÿÿþýýÿ ÿó«aÿÿ²3ÿÿ×B;ÿÿùŠÄÿÿûÿªÀÿÿýønÿÿý±ÿÿþþÿ ÿóÝÌÿÿ¬>ÿÿŒ;ÿÿøÉBÿïÍÿÿòÁ‚Éÿ°dš‡Ÿ‚gÿÿ÷ÏGé0ÿÿþÿ ÿôêÿªÿß~ÿø^ÿÿùâÿÿXÏÿÿêyCªŒÿÿîç·§ô >9'ÆŠxwÿÿô¼yÿÿøÿ¢üÿÿþôÿÿòL+ÿÿýÿýTlÿ99ÿÿ÷êøÿÌdÝÿÿþiÿÿý•ÿÿý{åÿÿüc)žÿÿùÖ¾¾>ÿÿüúþûÿÿû"ÌGÿÿø÷ÿÿôÿÿï°‹ÿ‘ÿÿ”eÀÌÿÃÿÿzù«ÿÿþþüÿÿú­fNŠÿÿùE09 ~ÿÿçhÿÙÜ]qÿðÿ¶#ÿuúÿ*œÿ’ÿÿþýÿÿù­‹‚v ÿÿ鑵Uÿÿñ}l=•ãLÿ Žôÿ>ÿüb=”ÿÿý'Dÿÿø»ŽÉb¯ÿÿþþÿ ÿô(Î…e4üòJ [#åÿÃuÍÿÿíîdÿÿÕÍ‹_O‘ÿÿûÿþÿ ÿ÷<>5b;ýVyþ>ýšáÿÿðó\d$B÷ÿÿýþÿÿôBW,sÿÿˆ-³ÿ ÿþþÿÿþþÿÿøwm*ÿÿýùþÿÿøh:qÿ ÿùüýýþùþÿÿþþÿÿùŘàÿÿôÿÿüýÿýÿÿúF`’%ût5cÎÿÿôýÿÿûÿþÿÿøýùÿÿþþÿÿþ&þõÿÿûýÿÿ÷ÿÿø# {ý-ðÿÿþýÿÿýüúÿÿóÿ]ÝÿÿýþýÿøÿÿêL/$0XO«æÁdÿÿüþùûÿÿúÊÿUÿÿüýþþÿÿð;=$,L þÿÿó69Uÿ¾ÿÿýýûûÿÿé7G32/B 4 SDÿÿð€$wÿœÿÿýÿþþÿÿé%W"12%nJ´£Q9ÿÿð* ÿÛÿ›#ÈÿÿüÿýÿÿÚ?S—¥3/.L\–Ó¤ÿ`×Éàê[ fyhÿ[³Ï”ÿÿþþÿü2 þñ¹¥µQht—a¨4öTÿÿæÿÈÿÿÙ_' />t´k”õ1‹ÓÿC}ÿ‡ßÅÿÿüÿÿÝ#LB]ƒ9!_ÓùbBQ®¤Ï¸~Ü ÿ5£)Âÿšÿÿý— Ü !S©|[y\)ÂÿjÿŽºÿÿ»ÿÿüÿÿþÿÿþ‚àp…tD¢?7(B3("OmÿÿüüøþÿÿþyòQ "¬.’–HGÿÿ¡*ô"ãÿÿþþüÿÿþýÿÿýÈ2ù%Z?…ÿÿø­ ÿeÿ(ÿôÄQÿÿüÿÿ÷½ÿÿÏÿþÿ(ÿþ´øaÿÿûÿýþÿÿûGÿÿþÿ*ÿüEÿÿùþÿÿâ5ÿÿþþÿœÿÏ =ÿÿ8X Âÿ鈶ܛª²ÿmD‚vS;C™ÿ›sÿÿýþüÿà876ÿï™ÿÿù^Dóÿúÿÿà©93-áÿÚµ­ž©¢Ûåí¹9¢_ZLbkÃÿÿÖÉ-ÿÿóûÿÿd¹ÿÿkváÿÿûÝ +ÿÿåÚW4ÿÿô²°À§ÐÑ¢×ÿo‰d>c‹ÿÿí6ÿÿþÿÿì)ÿJ{ùÿÍÿýÿÿýkŠÿÿýT ëN”ËöúÒ§¡ÿ¿^”µ*2çÿÿý†ÿÿèûþÿÿ>žá¡ÿ Gÿÿüüþÿÿê÷ÿÿßU^ ÿÿ]ÿ¼ÿ:›IñgrŽÈðì€ïÿÿüÿÿóá#ÿ’ÁÿÄðÿÿûûÿýS¯ÿÿâ"4TßFÿÿJñªTZaj\W×ÿÿýWiÿÿï¨_V“ÿÿûÿÿûýÿÿ0éÿÿå †G?.ÿž.Œÿ9 ¥ÿ„ÿÿñÁQÊõ-¤˜ÿÿ?j&oÿÿöüøÿûÿÿ€*ôÿÿÝGmÄÿÿ¤"§ÿÿ6_8ÞÝJÿÿøFeÿýó„}€¼ÿ®xjŠîÿÿýþûÿÿý4iÿÿüqLlÿÿþgìÉÄ‚œÿLT4´ýRæÿ,ï^¶_»¥fÿÿ/@?%ãÿÿþýÿÿýÏ(ÿÿýLóÿÿÓš`ÿ×<OÈñÃó83DNc#hp„‹Uc½TTž,M&«ÿÿûù‰ÿ ÿÓTm~ßïp>àÝÈëTA.AN£T“…T/V ³Ô69ºÿóxÿÿût7~ïÿ ÿþ—Ý_ÿ4?ËÅîõ—#!… V/'Æ1zueYÕaÿÿõO§ÿ¿!VÿþþÿÿýýþÿÿÞÓM»ÿ”ÁRheŠW7d.~Ao=qH¬w“ÿÿþ€ü ÿõÿÿþùÿ ÿÝ,>ê€1~[C;[¥a}¤Rj“ªuW°cŽp?­ÃÿÿþÚÿ ÿþÿÿþêÿÿðÎîÕæÞ”ò˜¥S3Oë(5> …ÒÖáÜzwxÿÿý%ÿÿú×DÿÿTôâÿŒÚs“fíÿÿø4ê¢r‚Ðÿÿö¤ÿÿûûþýýÿÿýQÿÿì»ÿ÷\úz3Áo‘Bÿÿæ‹ÿK-&&KVZŽÿýþÿÿ£Q\ÿÿþýýÿ ÿó«aÿÿ²3ÿÿ×B;ÿÿùŠÄÿÿûÿªÀÿÿýønÿÿý±ÿÿþþÿ ÿóÝÌÿÿ¬>ÿÿŒ;ÿÿøÉBÿïÍÿÿòÁ‚Éÿ°dš‡Ÿ‚gÿÿ÷ÏGé0ÿÿþÿ ÿôêÿªÿß~ÿø^ÿÿùâÿÿXÏÿÿêyCªŒÿÿîç·§ô >9'ÆŠxwÿÿô¼yÿÿøÿ¢üÿÿþôÿÿòL+ÿÿýÿýTlÿ99ÿÿ÷êøÿÌdÝÿÿþiÿÿý•ÿÿý{åÿÿüc)žÿÿùÖ¾¾>ÿÿüúþûÿÿû"ÌGÿÿø÷ÿÿôÿÿï°‹ÿ‘ÿÿ”eÀÌÿÃÿÿzù«ÿÿþþüÿÿú­fNŠÿÿùE09 ~ÿÿçhÿÙÜ]qÿðÿ¶#ÿuúÿ*œÿ’ÿÿþýÿÿù­‹‚v ÿÿ鑵Uÿÿñ}l=•ãLÿ Žôÿ>ÿüb=”ÿÿý'Dÿÿø»ŽÉb¯ÿÿþþÿ ÿô(Î…e4üòJ [#åÿÃuÍÿÿíîdÿÿÕÍ‹_O‘ÿÿûÿþÿ ÿ÷<>5b;ýVyþ>ýšáÿÿðó\d$B÷ÿÿýþÿÿôBW,sÿÿˆ-³ÿ ÿþþÿÿþþÿÿøwm*ÿÿýùþÿÿøh:qÿ ÿùüýýþùþÿÿþþÿÿùŘàÿÿôÿÿüýÿýÿÿúF`’%ût5cÎÿÿôýÿÿûÿþÿÿøýùÿÿþþÿÿþ&þõÿÿûýÿÿ÷ÿÿø# {ý-ðÿÿþýÿÿýüúÿÿóÿ]ÝÿÿýþýÿøÿÿêL/$0XO«æÁdÿÿüþùûÿÿúÊÿUÿÿüýþþÿÿð;=$,L þÿÿó69Uÿ¾ÿÿýýûûÿÿé7G32/B 4 SDÿÿð€$wÿœÿÿýÿþþÿÿé%W"12%nJ´£Q9ÿÿð* ÿÛÿ›#ÈÿÿüÿýÿÿÚ?S—¥3/.L\–Ó¤ÿ`×Éàê[ fyhÿ[³Ï”ÿÿþþÿü2 þñ¹¥µQht—a¨4öTÿÿæÿÈÿÿÙ_' />t´k”õ1‹ÓÿC}ÿ‡ßÅÿÿüÿÿÝ#LB]ƒ9!_ÓùbBQ®¤Ï¸~Ü ÿ5£)Âÿšÿÿý— Ü !S©|[y\)ÂÿjÿŽºÿÿ»ÿÿüÿÿþÿÿþ‚àp…tD¢?7(B3("OmÿÿüüøþÿÿþyòQ "¬.’–HGÿÿ¡*ô"ãÿÿþþüÿÿþýÿÿýÈ2ù%Z?…ÿÿø­ ÿeÿ(ÿôÄQÿÿüÿÿ÷½ÿÿÏÿþÿ(ÿþ´øaÿÿûÿýþÿÿûGÿÿþÿ*ÿüEÿÿùþÿÿâ5ÿÿþþÿœÿ@@stem-1.7.1/docs/_static/section/tutorials/soviet.png0000664000175000017500000001110713157571677023324 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs Ö ÖoyœtIMEÝ ]µNÇIDATxÚíyt\õuÇ?oöÝZml—˜Ö „*Ž9a+qPà@iMâÒ’b1 §[H ”¦­èIO[ÒšÖi qiiƒq±± N ¶cð&Y²6kI£Y^ÿøþd¤iFz#ÏŒÞ=Gì‘ß¼÷»ßw÷~ïòW\qÅW\qÅW\qÅW\qÅW…XN]h'¬®Ö«€zwy•Nà °ØÒ?Ë ì„ ÀF`µ«£•}Àc-ðÔÀN¸Ø\äêâŒÊVà®ؽ`Ø 7ßüîúg…„õ-ð\Æ`”ÿ¬»æY)7¥ +Må_¼–Óo¾–ìHÞZ‚µélž4¿`S®›}oT~¬üܼüFG8ãíç´Ãg…+¡î“à¯ËÛmà"£+Ç-ÀÆ\_ (ý-(y?”¼O€ÈSÙè( É“óq¾§Ê/«Ê> –•·Xmt昸*×WdÂü­bPzA^o)ë,U¬É‡)mX%çæõ6°ÆI¬ÊõÕðÊücAlTÛAÙ…y½ ¬r9رÀr(>"}pò‡`CY økó5™àrÛü×Áè;ÐýŒ·C`ço4àË{Ø)þx&Ì¿†_‡ÑýÜžRX©_kQ¢$Å_oÌ÷,š±m4)ö ÀÐk‹Âà6¨¾F~@Y D‡S ,YŽHŸ €3ïÔ•@ý-P¶Ö8rvr»fùÀ[ Á7`ô þ.ø&Œw@Ñ9pöã`ǘ–¸ëÙaè{Nü}~Y€œÝÆAÛ_BßäÑûêÀW+EÛaˆ…äèÙãp ü¯Þ^ ‡ÁW!ܱ±¸ß ¾j]ÏW§7¿ëhÂù€”‚ Y¼ýY¨¾6@áÙRvï ÷ßYƒx¸¢ƒqÛHsJ¢RzÝBå:YŽàèx^Õç¹$-)è7ç0!Å«¡éóP~©R½}?†Ž§`ìèì:ñp%ï3׸ĘüÌ5Z,žt¹ˆÀ_©·wÉzðUÁÈ^™íÁŸƒÅŠ\·A`%Œ·Aç·¡g³H£\•E€x‡¯âRhÚ(Þ?rºž†ÎÐþ>Í ®ÐïÖÜžbÞÇÿ†wç~Ü— ò޲#Ðÿ_pènܪ=½âr9Š Ã *óy1œüO8t í"¯“y €SQÂÑÓûðNˆôOßóBí0òK­ÄØQïÌÍýÞÀ)¨ƒ’ó!ù3¡ô¢÷@ÝÇ¡ Q‡Á×€”­_)‹Jò6bþK!tFÞV!hÕ°òoି€•åkô¶ïPôë %m9Nnx CXC;õv7o„åŠù‹Béaå£PÿGâFöŠü)kY\[€/Ê_ ¥{LÊ^þ5Ä¡çY9‰µ¿æ{-„»e:ÊÖB×÷r;ü[Ô°â÷Bà,ýyɈíoß»¢£0¼êˆ3¨¹¢ý@T`(\Á}‹Ãä,”âõ ÞRzE„Ðð›ú; )¼ã)îûW|®>óW«r8¸ÏõrÑ5R ^ˆ‰:| ½1=¶·#0ð?â z7¢¨@Û€·ÐÝrÓüO~l?´ ú_ÒÞ?“9…c_ÐðÇŠ –ªzÈr[æ¿´E `ûã0ú«ÔÿmlDÎßÈhúœœÈÑwòßäU.ÀS(Œ¼á¾¹½½6ª ,ƒhGsW¹‹2„…3wëÔu²ùGÙYv7 ÈB#áS”`ãŠo1>´·T¡b¤_y‚èè⢽ˆô«:¸ò£°ü!Õz˧EÈ?'0MK°ä“Jžï‹Š ç‡EXœQ@Ú(€ªuÐü%Õ ¾ ]ß…¡ª°\ä9Œ”¼–Þ¯4q´ú~ ]ß1dí`Ql³ ù‹Py… HÆA×?Aï  æž5ÈxUü §ñ0³…EUÐx,¹ ¬BÕô¿húÞu=Þkê>!Óü¥*zÆÉÃEæO14|êo5ie`ô´o’“˜+ôpÞÀ @ý§ qƒZ¼‰*õ;~\q}p¡Vµ‡Ùsƒ€ú›Íw”è‘“J/w=£ä‘ €3¤ü†[ á6SëoÇ=‰ù±ÃräÆË: ¿©78|Bž}ªOcù5S°ñóêF5ö|ÚŸ \,ô›‹Z¸&)?Ù“yô;vH5'·À‰'åÐ¥ü*m¼ãts‰ƒþŸBÛ£šËÈ&ÐS¨}9%åc>1':ƒ¯@4MÓmCçwÔ^fO8›T]¥òòÀ²ÜŽ|<9£ü[˜ýŸpx;¾·Ï-¦·C¦ ôqÿÞ†ŠËržœPþg þ³úÿ”hŒ_ÿKpäÏ`dÿüÂÄè°é4Þ·j¶ZÉ—Þ¯‘5.2¥üϤ¯|;ªBÏc_±cÎpã]p|„ŽÄ­\ */‡¥wƒ·Â€³ÊÿìÜÞüXH4nëÃrþœbð,Ä7t<©žÃS¶ êjù(V €ùßT‘ªsëoO =åG‡¡ã[ÐþØäq0NJß8ùüd‡Óò©É¤úw\8§üÂô•ü›fD[»¢!è|ÚPÃqþ€·Táb.Í öd¥ò?æ›÷&ÆÆ3OÕZˆvî~öth8á–CÃíš<â Må7Þ6?å{Ë`é=P{àÍü=÷ýXLã¤UŒAÅ%P{½ €ô”¿aʯZ¿ ‚ñ£³Ç§XˆXò (| €”Ä[%ç)ýšVœŸèîcJé6 –|ŒŒ–½Z(;8z`º¬Pg²ås0«„{ õÜ•ây4Ëgàe³[I@p·@I%„{ ï%}çTkTu…ZÕm³ËÈ8úeµcÍxWsi{ßk±hbxË >ž¹câl4‡0Ü=ål§¯¾<^©‘,¿s—ˆô˜Á?Q‚§ýqèù73ìÙJà–CÓ]Ú“3 “vÞ›øž+/ÓðIé€à ð(ÿÞö(œüÑi_!:¨Á޽›§LüŽ·¥Y·>3 ˆŽi‘éß]лH§X¦|ÿ&ô>?}¿öë³¾fK éN¨»93tmp,Ò4+äUX8QPâ ]K° ¢Ðþךݛlbwä¤Ù¶˜ü·UÚÕô9•“9  •Ÿ…Ž%XÑ®RÅq6:ƒY¤œ²輿þÿfÖqíáh}DÊ­\— ¤´UäÙx»þØù´rýNH¤_¾@ñyÓ¿Ó_¥³‰²qîPVG©šò‘Τp'´~]uý¿Eå3yƒ1n6&z˜D~ˆ_C(³±¯ /›CCíÐú5•€%|BûtÞ¡a"Ýì@88v8ù±ôeÎ| €TC³68ö m›…*69Uj6_R¨ÛX“¯º¯Ò™ïpŽÂ±u@R”znÜpº dÎáàH’4´ñ=2EF¹˜É‡8¤pûgAÔÝ"¿`® °ùO¶XÞì<¦6ïDÄó Á=3ƒ þSâ E+ÉŠÚ‘$D• €Á~`ä­ä °ü:s¨éNÕ¤½˜…I=S§˜Ì:¸X ßF÷Ï‚õ¢ŽÓ¯êôŒâiþÁ`â3‹\,4ö˜RñwfOÄæ/(™”ª®L’z¶De;Â7¸˜¿ ï6 843joÒÀˆI‡K&[H¯rÿ «¢¢Šq}€ì‘¡Ðú EÏ‚MÓÇ, ð׉îMdþíˆÀ–¹€E Ð â­é È¤ ðBÍïÁÒ{µÇ'‹J/0=‚±éæ?:½ÓE5^m<Þ1 ~×€ zú¯x‹Tþe&^áÐ1Víæ²QlèÚ¾aÎLT_KïÓ¡ñoÙ¡ìÂ${¼­ƒ«2Õ¥´¸`9TðiCß‹ÐöˆJÎfA͵°ì~ð/‘ò} ½å öKE"CÛ²·0Ô“Ã/.¥ç›Í,°­ "mB¤79°tÐôÒû¡ ^ýIß~šIƒ{³wÄ\Î ‹öUjaM°ìÏåy–©¬|üø/Þ=ªI`–_%åÞÒ$JžØ‰AÏs¦_ÀÀÜ¥úJõú3…œßÖ%¦ca—?¨á‘]Ï@¨cîoŸî5 ¸39ǟ̳Ü*Ç2Û%k@µZ×Ü Å[Ɇ™9}Szò¼*ðøµMP{ÝüΰÃÐõÏf"Hª<¾%Ú÷ÄßiïÏzŸ*ko¬LU:EçL1µïwäOä.½Ï0t±ÉCÉy*ĬީiƒÛT5lÇf· §fOzÕØa˜àTšW£2ýÁ=¹1\:+à-×q®Õ×2ýô.¯Žx ×(wO4}q Œ5ð üb5c‡Äÿ½.Z6Ü­q¯ñE–W¦Þ¿ŠVéÚ²µP°Ìz¤bJ<ú¾¾Ÿ87œ*ÃTÊì²P“Bm Ð Ç«úZCòÄ‚µczWômûf^¯WäLó=R\RÇÌlvH– Ü©ÿFÕ\jùöùj”ØñךmÇ&ý,ž%òçØWaôÈ™Anеd¶›¿ešòæ[ïÚý=ýŒŸ˜ò6z òR…m…«RPØÔÙS§Iǘÿ{ 4ig3ÜDj®††;dÔ¬ÓC»ÿeú4Žx)^ wBÅ¥†œ‰-€ý´gÁvS…ôîÂ[‚¬€ Ôª9£öcf,ûåÛayá'¾=e S’ëùÊaÉj/hž¨™çÛmG!Ò­-cÒV•àw‡_W‹ÛÈFõ(<[)ÖŠKâÈ)w×»YéÚèpz *^­%*.KáÆæ¯xЄðÞÍ:I¤îf¨¹~–•ô¨ÉõØjzµ\(¼;ë+*¤H–H ¾‡ïPÛܬ‹'%¿)'±ìâñÅY;…Õ‰;ƒ`¼McizŸ‡‘}rJý5ÊV_3;x†wÇpÿ"€¿V<¬AË ;~͘#÷ÁÀ¶ù½16ª× œekÖýÔÉ÷°ü è0[ ·CŠFö‰GÚ¡ðÓŽN¾'ÿXö§JÍæß„c_V™z†%Ò³ö"¥ÊtŽÍîºÚ¤P£‰!i‡Ôµ;øÚüÍ¥…6vFCÏHaf1â¬uîØaµzŸ0•<­†3O 0øÆÜÎ1JS¦áÖÌ*;dÓòÈÔv<‘ùC™â¶÷Ó{…ù™öYŠ× W‘éà«$r5ðó£‰w8 €-Ž…~ú¿)éZët¸ÔúuS ™ƒbc­ÁÐö¸Õ5ÏÜ­$Ñ5ˆlIõžS’ð6°Ú'°NiÛŠ‹¯Zª^Öˆ÷±Ãä…ž­g,ý„{õ|ÿ¸`¬à¾x¯ÓØ<éX$P'4hHäÐv3e+¤è9}#{•¸š‰ÅtXno§€Á+ÀEN2 â1±ç²Ðó“­-òdÂt BîÂNî™ä±ò™ƒ39O ‘´Àn`=®d«¬7:"S€x¸ÉIKàŠ#oþMF7dq X lu×þŒËV`í\”ïÈök¢ƒN…ˆ®¤ê¥êíg q@X\¬Vá`îÀ@ù˜ƒˆáÛÒ?s—ÄW\qÅW\qÅW\qÅW\qÅ•”åÿKæMÖq‚.IEND®B`‚stem-1.7.1/docs/_static/section/tutorials/tortoise.png0000664000175000017500000003455413157571677023676 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDùC» pHYs  šœtIMEÝ 8<(ê IDATxÚí½wtœ×uîý;ç-Ó 0è½°‚{)Š"©JK²iK)¹HŽc;¹Z¾Nì\;qìÄIì/Åùìø‹ãwG")«YÕjT¡hR½°€Do3Àô÷=÷€  %}³AÌà³÷Ùgïg—ãÇ8Æ1ŽqŒcãÇ8Æ1ŽqŒcãÇ8Æ1ŽqŒcãÇ8Æ1ŽqŒcãøÿÄûô¹Àt)ÅN¯\êpÉ:‡K+Ú±>kW¼ßú%ðóèÐßgÏ+Y—ü“òÉîMšã-­šæÖ *œ8=Äú¬Òãûc¥/Ü×>§qOxøß߸ ÀÌ®W ˆQ èz²?K¼ßNŸíúO•Mt}õÊÕyUs–E°À@j¥Ô_,ŸâÆá…?ûúñ5é¤z°FyO ð5À4Ýu¦SNrûôš@žr¸4§áNÛÆˆ÷[2±d"fÛ©„mÙ6)¥TBY$q;’NÚg¤&N Á1+­Ž+ÅQàXV9€W€7 øÌ”¾o}ôîÒ@õt7P6ØÖðuU\> )…+ó¯aïUÌÓt±Ä—£/)¬rÖW9sóËLÓ4HÄ,zÛÓô´'éíL‘Jظ½’`¾Ž¦ ¤®xÔ¦¯;Mw[оžôÔ+e§„¤GÑ‘NÚû„¯Û¶ÚŽb7Жµ"ã p ˜Y1ÅýåÛ¾X¨¬sg„~ýd[Š£;úIÆí-@:ûã°P7ĹEæŠÊ:÷„Ú™^wU]´5%8±/ÊÁ×"覑&¿Ü¤tŠA*•Äå•è†D Îæ4©˜†è”„;S n¿$T¤S §& Û&?•PùBˆ©Rò1” S¶¥¶Ï)ÅàÔ¬Ó¸œƒëg/VULu¸ã‡âRи·Ÿ×žéÚ<”#¸ÉŸc|¬ºÞ=¯n‘?0ežH§¹1Îîͽœ:CH›ü2Ú¹àË•HMG) „#mÐ~¢íDŠh$é”Xv”¢*'¥S¡¨…nJ@JÚx|4iÐrt¶$xòç¤ÃÁ]R¶¯)¨0o«[ä›2{yШšæAÙŠý¯DxòW=DÃi‚E‚ óÀ—«£°2–EXX– Ò -Çáöétš¼2‰'”F3-„[õ! p@a`ºX$È«Ì>—ÐIô›ô¶Cçi›dL™BŠ)©„=¥¯'}‡•V‚ß(ÅSY§r< <kæ¬ þâ_«pûr ìó•@€‚–qîÿÞiŽmWª¨Ê™˜´PšsVe鉘Íî—zÙ¾©‡D"EQ¤°JCÓml[¡RJúº5NìNÑÝ–"T¢ãʉeþŒ¥üÝ7‹x¯ƒÎÓ`˜Á|ƒÓGb4‹Ç“I{«€Ÿ*Åc@︜…ß0å¿/\•s× wj…NDÆC)E¼ßfï–0Oü²…þ‹…«rYxc%5NÒ)ÅW"ly´‹x4IÅ4œ"š²ÏY!w(š("]6þ|…'79Dðo7z[LÒqƒéKüDºã¼öt/M©X:­žBñ=`ó9>ÌžÊË å|£¨Úü³‰ ¤^6щ”’¶“Iön Ó|,FÝ"?W¯É§|² )'DyùáNÚšb×BaµDêjˆà¥&H'4w¦i=‘ŸÂËç¤Ç#:§4jg9É+œØ“f÷Ký„;Ó­ÊV?UŠ-ïdxõ¾ÀÖ­[ .ZXZ0骎c¦l|]²ýÙ~Þx¡ OPðÑ»KY±6ŸP±I4lñâlZߊ7W1y¡†?L(®Î96¤FË1Å¡mB@AÓwy#4ÝiÈÓ8}ÀF AíI~¹N:)½}ÝÖ¥˜¥‡€Óh¸îºëÊ¥”ÿRXX?¡v‰DŠ3‡Yp‹Áê»K¨œêFH8¶«Ÿßÿ¸™¶“Q¦.1 •Ù€=Ä„kš Ù¯qè‹ÖãirJ,Ü9Iö»B×i,Ôh:hc:¡r›Š)NCv7§kÓiµ4«‡ßnBéŽDöoX€ý–ÞHŸ"ÐÒÒ£>B{b;×ÿY€‰³ ÑtA[:Áùñi‹ý5eÜšÓ#I%l¢‹ÞŽ”Ýy&™n=™÷´%õ´§^I§ÔcÀV ïïëB|ªb²ç×ß™W<{yN†­SptW?øU+¦Û¢z–Àt1t×g…‹À‘×V‚%ItÓN¾GÐ~̤¨Æ¤lªÂ¶R´5J¶?#µz"é¯[–úÑÛ!¼ Pç èßYxCεË ô‚ º.2¼Jö,Ka¥‰¸Mû©{ûÕÞ-áð¡í}OÅ"Öw€WFòþ¥&¾2}±ÿó7®Ø[UçÎн6ì|¡—çÖ·R=ä°FaYÃYU© }:¯?Å›# %ÞóþŽÄAë1ÉÌ:ši †©ÇwÙÝ‘&·ÛÛO%þpß{Å œèËÑ|ã]E׬út‘ äƒfíܯNIn¡Iõt˜¾Äï äÓ΋-ŽF¬m@ó9ï[åpÉ_|Sè®}±ÌU\ã Rl~¨“ÍwP3[PP¶mH ÷wëì~!‰7×&P”âý……ÔQ¶F ÿìÚ $é¸Jz„3£ë5 éÝVŸé”ÿzÝ' o¹öã9&Òd@)L‡¤ªÎÔDÁW#¶mñdöTžêñkÿ¹òö‚ßü¹bÍÒAA*¡Ø´¡Ý›{˜¾Ì P Fü{R "{7' •+ø>JӋ̺´Wä—K¤6-€?_£í„Ea…3Ô×®HÄì§þ·â°½U|dÆÒÀG—¯ÉG7Ä%3fJ‚êé\^m`sü¹úOnütÑõ7~ºH¸¼(HÆmžúm+^ 3s¥‰+`*üX¯Î¾—SÖ wœ÷=‰éô¶Ÿ¥•ÓiQ5]#•PL™ï_!5ñ¹·²‘ߪäæšw.»5Ïí èo‰.í<“$µ r ŒŸÜòù’+W®+Àtd1T<·¾ÆÝ}Ì^é@w¦†9{»'Þ/Øõ|œœbaÄx¿ÂpYt7Ûˆs¶ yå é6½¦Þóy`ñ»¥ó'Ìò̯®÷¼iZHèiK²å‘ŽždÜ>™Shþ¿¹»tîÒÕyƒŲ/=ÔÁ×ÂÔ/7AOŒ,|2I¡ã»,\~‰ÃŸ ¼ŸŽot·Ø¤“篙¢lªFÛ©8³—ŠÝ>íÏÈ”­]v¸ªv†×çtÉ7-üþÞ4Oü¼S{ÄÉ@Èøð-Ÿ+ž»hU.B;›uÛõb/o<×Í´¥ÒHŽ*üŒ“©Ø´žHrøIãvžÓn½n¢=RèHM¾÷•Ae§šDÙÆ°c3¯°ÒÞ Á”ù¾×\n"Hº¼ZmN¡1À²\Ú‹¥ «5Á?k§uo9y‘É‹>æ7¯¸)!³ç „Sc<_;5³$N_ú‚ÂÏDi¦.Öˆ÷  I‰&-Ç$û N°ð <9º3=Œ&~OiãpAGS’¢Úó2’Ò&T'öG™}Žÿðö¾OEºÓÏ\ªCøV@“šÐ5ýÒ¶’™sìÀëa6ýOŸš‚av2yŽ«>š‡¦‹Áï·Ù´¡âZ‚J…eMvxÀé9×*%© ’XDÒÛ*hi„Dü6ž )èx)‚”ÐI`vêOêc) *tv>gá9L˜å]¶}SÏ|àùËu¤b}Ö™pgjÌæ^ˆ mûØ7óÌOsj?ŒÓé"wR;+Ö"„ìß&Ü• xÂØ…?`>Ïç ”á œ^›¢‰6õË5ª¦ëôuj´3¶cм¾gN¾Ža8r¸¨¤ná ZO$˜½"˜k:åšK•©öVж¹iò\¯ÓíÓ‡m !3¦Þ¶­'üñ±.^º7IОËê[ÖÒÑÞΑŽM|äî|9C5ÜJ+žÿ]ž _žBJ‰m©¬³)²Õ;™ïêM<· o.UéèºÎéƒ6é¤Äå³Þ;þÓeë5 •B c9c}6Ý-Šù׿pðµ>oGêq2ý —…:ÓÝ’ÎëjMÎóåjÒåÕÑ´Ì.NÄlÚNÅ9øZ„ïïf×t¼ÉY\·â£\uÕU´µ¶ñĦ{Yõy?%5îag»w÷³[?MÓ´U4´8µ?Íéƒ6ÝÍ‚dT'Òm!…ÄtÉA+3fPÚ—9E’îfˆ´8<©ÙïKÐס‘_! ¡sÙtè´6Ú̸*@WK*ظ§;°órøÑ»ÿ×ÿþy{{Ûºç¶3?%ÛÐI”¨¤‰fûð9+™:¹žÉK&SXX€”’þþ~žxê÷̼ª§BJMpÍíL_@ÐŒÌn·­ !éJÓ~&AÛ‰ÇϤ‰GS„ŠurK%|6¶RcRÛR8}0c¹Aë1Áá×-*êÜ(-ú®[;©éIa[&š9\¹.E¸;I_oš)ó}úæ‡:®KÄìÿaŒåæo9¼dÉâ€mÛ®ÞÞ«imm#"…Àår‘››K0'€®ë(¥;x^{íuÒž£,¸¡ø‚»ÓÔ™8ÇýWl…mC_Oš¶“ ÷ös|o”ã»Rä•IBå§GeÖL]ÜØÊ¢ “ïZ8}&þ‚Ô0Ó{åO"ž&—ƒGßðbãp ºš“”Np’_æ˜Ñt8V œ¼, `Y–€Ÿ`00ÈZ \)5$QÓéã/³p·O¿`¿R .Ò øsuyf{ˆ÷Ùœ<e÷æ0û^êÇÊ&._FaÆâ mæ^ïdû31ZJ jl„|—”@`tŠ]Ó¹…&§“L»ÂOa…³¶éplòXàíÈ´ý‚¶, ˲°m{XÏž”’£Ç±]ÍL˜éE)…ÙAfÂ)Ïþ[ˆ±±wJe̸²Áá–LžëcõÝ%ÜúÅrB…>ö¾hqrô¶® ¿Ÿ ÂHP·T’æÃû]u Ô¨y{!Áéô´§Ð IÙ$—˜q¹|ÈTø¼Üzq“&T[[kÜô¥\B ú{-R ‹tJa¥ÏˆŒfë†ÄpHL§Ätȳœ¸ÈZ˜Q„bÛÅ*सº˜S¼ô`';ŸMPY/ •Òiû¢Jàô@ýrƒ=ÏCë(žtùëÆ„hš,ƒéŒöÅVÆ .©q¢›bV:©$c¨¶zË ÐÐÐзaÆoÀ’Q"‹>àˆâñÓM§ïßþâϾv¼,•P ]zR¦²å9}œ !B·Ñ iX˜‹@¾¤ ÜAA¹ƒ@ž?×ÄpÈlÜ?<-¬ìŒ©¬sS\ídûó½l}¬“Þ6Iédnª ÆýJÓ õËMöL—À;†%óç ºÎ(ý‡÷oíïnÎø9Å#+¨ÐÝba§ æ¬"|­Oß}Øý5ð3BÆ»Òîõz½ÉdrB†GÈœ÷V:}6|Ìj¿”M×1 ÃЇð ç+ÂÀÏB¡\®¹f%sçÎeÛ¶m<ñƒMTÍkåÊÕ!yÆÙó>û³–RðÌ=­˜N`‘º O`ÛU3û6KB¥NRéw¶ÜÌëwȨQ›vÔá’ƒy_ʶ¬Ou¸äŸ»¼ÚôXŸµ'³ìx·À¼ŸøøU·Ü|s¯*Õ×ßkôGÃÄQ‰)+J!„@× œ^·¿/×***NUWWé¡PnÊápH¥”c4e\ýuLŸ6'ÿð8ëÿy'×~2HM½wØNš¹,@2a³ù¡vf®pàð¤G­pR ¼9‚âZ–c)Bïà LÂ]i&/4G=ž„x¼n¤Ô Ó¥‘—*îlï©ñ䪯\[°´î ?‡^\ýÜúö+»Z’ ¼v9Ž#.’8ÝÚ]þñ¥‚*>Ÿ0ÖÚ¾F‡§¬YÖ…©šgÒb›º¥‚©K“)*g§È« ç¶Ò›:*›vË?nÙb½²uû鎶ž}¡ÜÜW½>o'™©^Ž‘ˆ­@0@]Ý4RaÏ>¼ä¨Ê5Œ`*©vë³Ù¿5J¨LŽèqa ó4ÚŽéÍxûY")3TQ•N¨ìÂLhçiA0ßAíÌLU؉}1:޹ÎôÅzç¬hÈû؇þ¤ˆP‰ƒšz¦SÙÙW˜J¨'ø;a@5‚…—\Ì3•MtU׸ü%5NQ\ãÄŸkàòj˜Îs¨¾Kç¸Öqn¬"1K‹t¥´Æ½áÚ/>Zðø?l|ÃcÝóWõ¥Ý¥e¥³,ËZ ,"3J„”‡ƒ•׬ //Gî]O"ÚÉ¢U¡Lx7èÀ•«CtœNpäµS¯Ô°/Pƒ 5‹’‰:­'lüï@¿Aªß…aZ”N>mÈ‘”†ž¶“ç˜!Pd:‰,Ë^Z3ÝãXvk>šžIÉ  Wårx{ߵ۞躸ïíR (E°ÄåÑn,®q^Y5Õ]Z]ï1+§ºÉ)0qyµlf†|QƒñúvÚyÿg8$¡y¥Nf, ú½Þ·ì™{Zgýå—¿ø3+­þŸgŸ}ö“«zÀXÀÙsfát:ùÝÿB7»˜]îPÒÅ%¹öã¬ÿ·&:N BåbÔüe+‚ÅŠÓ‡äÛköD:5z[ÒÌ\ab8­‹ø$ŠHOŠœ"sÈ1ØÓÛU²ôŽ ¹…Æ /¢T&š{MŽ{÷˽«£aëÑ·ªN`Žá-¬pÜX3ÃSS·Èﬞæ!X`dË»2Ò~[úðª{PIý’e]Çþ»å [éÌ_¹rå_;~ó›ßì4 ã—Bˆ›OsͶm¦ÖMáÃéÛyà¾_E˜<ß7¸ÀʆP±É²[óøÃoZðæjÙ™?#?‹á°1Ý6ñ^'Î@üm~FÇIÁÔÅî€uQ’J Oà hƒkm¥l wœ‰³½Ã¶—RŠÊ©.òË Oì‹V¼YËÝ>mmÕ4Ïò™W ê®ð“_j¢›r§¿ØD¯·ª ¶R Vß]¢Û¶Z÷òC-–¥þöŸøD’L?ý6lØð(ð)à³@…mÛÔ×O§»ûÃ<û›ä•:•˜ƒ mÛ0e¾¯öÑt JÍì ziלڟÆx«g¾ Ü!h?.˜¼Ð  B\tÓ]mi. _Ž>hLã1{Øç:wÝ< gî‰}ѺKµ_^`µ7¨ß;ÿºœß~ê• ŸùVUÁÊuùU9šÌÊ]6¾Ü·_ãCŸ)Ö'Îñ~Xq9Õü3°x‚lGíâÅWPž³€îïÀJG6‚%·„ˆtR1côŒ¤Ócîzk>€®k¤ú]tžÒ˜¼H§¨FŒÉb )èë²ñ‡t\^m°þ1±gó$#8°¦Câ ê. d¬ `+Ý>í׳—ý©oTÞøÉoTzæ^›ƒ/GǶ¹¬BI BE&ËnËyú]€ë<%°¶wßWJõëºÎu×Þ@ëÞ Gw÷ !Š” EU&ÍõÑt`tšxÀoæ;ßd¦/3BîÌ!Io̾ÖAQµsaª²!–TLvŸS‡ý=iÜ~mTÅ4 cQ€JMÿ2q¶wýí_-_}×7+½³—qº3Ešï•*Z¥Sø¨œê¾:ëüDU· !þø{¥TOAa>óf.ãµ'"$ÖÐ̈€ÙËDº2¬ßhYͰ1’dÔ¼¤³^I_‡Îéý™b–úåoî¥õ(X)Aw[š’Z׫ë¿ðû¤’ŠX¿Ñ%/âÙßÈ36\÷ÉÂ/~æ[Uy‹V…pyµÁ¹zï%(¿FÍ OpÅh¿·fÍšðÀ7ð¼¹s‰¶äÑt8SÊvîîÊ/sP6ÁEÛq{Èÿ [( R û¢©5)3‚G ÎÔ‰…5&/Ô™¼P"uû’¬¨îTøsLòJÌÁP1•´‰†ÓDºÓ£RÇý½i"m†¼õ£kLyXþO+¦¸qûWË~øóÅ"·Ø|O þü3±|’ Ýó¹@µSCCCJÓ´*¥¾Ì ¦&VÎdïË}#T0 ¦.ôg;tµ „b #×§g*›+îæÌ¾ɤyNf®Ô Ù—ÖópÎg ·‹L<¨ 6Óô÷¦±:á6A¬/=ìB°gK/!×D÷ª›nX0Ú"Ý>i®÷Ÿ?ùõŠ¢¹+s2#ÙmÞðçxƒzY6D·Þzkøž”òwSë¦sæ$Ò“²`¶R”Mr!¥¤§mä~;-IÄlÞÔ`ytCÃNi$Â&͇4ZêÄ"‚ sMf¬ÔÉ-±Ú›ßPVJÐv2ÍäyÞAÂLA¤'…Ï“‡SsðµRÚC±ï•^Ìbé’ø|ÞÙ#…s +½úîÒ@Õ4Ï;ʽ¡¡Ã-q¸5¤É5¤”®¯'Çbáü+SO®ÿ•rù4³¤ÆI4l±ã…^m6XqåǘZ7Û¶KÏW¯Ã%¿¼|MþÄÚ™ï3ág™C)RCkžãÖ[oÝsÏ=÷ü ?TúÝ“v™µ3|çQ¾‚Š)n^~4Laíðýb%u”-9}P¡”  BR:Á‰éVäH4ÃFê¶¥°Þ¦ì±R‚¦CijësðæèC2œÍIr‚ùÌŸ?¯3§^üÅ–rœ½Ø “âÜY|¢ájªª*£»ó?Ѫ) |7-\•Ë¥÷û¾WBJpÊÌ-.GuuÍýØZCg“uÕH¼{¨Ø["¥†m[COo®ÍòÛ= -lÛB7Rfv¸ÊJæmÝHú»!‘ÌZF ·4&©))Ã0Œðu×]›Z¸p!Ý]Ýø|^rrsÐ4í\+Ö}®ëËÑÿtéê<¯/8|ÚÇÀ9"51ä\‘š’Ty—e²—7çC7\ë뮸bQë™Ó-÷÷÷æ•­ðåê˜ø×B³z!-4=ŽZï`x¬Iɉ=“çù((w ñÍÒI›î3Š‚Â"„@g0 ¦¶š¼ü<¤”ç;º;ε˧Ì÷]1yžoè9—íÕïëIÓÖçô‘gâÄ"¦KR\ífÒy%Žwlªö¥¨@*eáuóçÌ›]øØ“ïë+>¶kBPõ$ã*h˜g­Ÿ"Ã4* ¶p¸ß½Ï˜©þ¤b oÌѰÏñ Ú“¨„—P(¥Ô^À§”ºj”lbð»pº¼ÚGg/z\^m0uhÛÐ|4ÎŽ:9}ÐÆAˆ’ŠJ×.Çï îïäÕ=àþM§™²Ø`ñM!L§|÷”@dú Í㪨(+¾”—Fú;ÛcQ_ÌJ«à0º×‘¹‘,³È¬ú»óÙ”¥säõWÞ’G^éPž_HAë©9„B!”RdºƒÖe)ü!® ð¥Ôc PW6ÉuõÄ9^”­"i6?ÜNã®Ë®¸‘?ýê*æÏ¸·×Û$¶JK|™—¶=ÁßýãWH%ÚY¹®ð]m¯Ž÷Û˜º×wɾ•=rê} Sé]ë`¥`ïK *§ø˜yup„Å™#¨§î§àIDATqJ *q8L[)uZñ´Rj=p'™ê/E¦“ëçÀw×®]Û? Ë&Ïõó Ðz<ÁïÒDY¨žÿ×»¹rî-Úð¼¨:g7,[‡nÀW¿ö—Ô-ŒQ:Ñõîð Âiþ\4M3/ñÕRÊQjPn ‘ïŽðí´àð«n“kn/À0‡÷ ¦’Š{“,›9!D—RªyÍš5± 6| ØC¦]ì ð$ðjCCC’¬Vx¼A}É„Y!5A{S‚~pŠÙ3ðý_‡&Žé)—-Z͹¿gïÖ)›èVÌq9`+EOkŠÜÜÚ@—ÉØá1ÒiäM*™qêº.癟N mK#…ƒ[>_Œ/¤Ÿ…,¡ídŒdŠŠrÈL[mÊrm÷Þ{ï÷…šeYÖwÜ1äè@E~©cNI‹dÜæ™{Z©›8oý‡&Œùa é¢nÚ6>þÉ„¡F/” ˜î¡ …Ô[6±¶¥è8fÒäB¤”—ÚÕãôhÃ!†È83hÚBn¯6x9Ôe~BgïË ¼~'7¶xäü>™ªàמé¡$oyy!lÛnRJµ üÿºuë£ –ÖEÕÎ/WçÐëúÚ\|íÿù’„?HÆt¢‹tÒÆ0µ!f*ÛåL2fÓÓž¢åDŒî¶8ñ~·_§´ÆCé·|sLJ€XŸE"ì ”—ÇÅXÀPäËÑ=æy£n…„»RØJá ¤­ä;.x!$mÇÇw'™8ÛÏò†|¼A}Äu‘Rpð0'^ws×í×Äù{Ö®];¦Õéù¥¦OJÁŽº¹å–¦TÏy[?"ÃPíÞÒÍÑqRý:ùy%T® ×Ôè=ÝÁ¦-[ÑÝ]\¹:—šúKŸy(t·&¶ÜÜeÛv×%Å׺¨È)4¤bèL]Í)R‰ïäty‘Íöw Nì±°’’kÖ2m±?SZgB w$ÙtOWÌý(eå¥(¥ÒdK¾Ç¤N6%¿Ü!ºZDÚ nºöÞlµxØÂé–™Î~¨þ‹­Oträõ4õ“óùO]É¢Ù+ åÉ dŠê“é(Ím'ØxÿoùåÀªÏ0y®ïÒÂI!hoJâ1Êðû})˲º/áÕ.‡KN-ªr ;ãmKqò`”ÂJóm÷k2N¥ „¾NAëqE¢_Q·0Àœkræ£g`EÆ7yæÚÈ3æ°té•™AZ¶ÝjÛöÁ1+€áå9…&MGb–RVZõ¦?PÇé8þŽé”Ùh"Î#ÿ}†|ïd¾÷ío1ÎL}x’ÎÔÝT–Lå/þ×7Ð ØøÀ(ŸäÆå{Ìm[Š“âTWN@×õ°mÛ=—ðèOPŸZPî*d‘!Žìì£f–ž ‘E–ùTgGÏ\PQ3ó*³¦=3h¶vZ£³9M¤CÑÓf 9©[àcêB9…ÆE i•¥xñþv:÷óé;W‚;v²gïní¹gŸ]ø„`›R¾YD×uQäÏÕ9}¬Ú’äxK°ì$‡N¼F[K.ÁÔ sñ]$¬ŽÄÛØq`…5n¤.h9ç¡t°bq_ü—ÆMèÒÁ'>Ïžz‚c»ÃÔ_3ï·h= ‹–×"„h'Óš>VL+©q–Œ¤?×Äö÷¦qº5¿šäÈ69…þF*Àá’¸<¦Sb8%zvdÆÜ¥ŠTÂ&Öoï³1ÂÍ)NðøMÊ&¹¸úc^Škœ¸<Ú_ B6¼üH'ûŸóðñ†;‡ÃlØø[úµ#”NE+?éû›/Ørlwÿ7€Ÿ^(­£ë¦Ìqº5’1 §ÛA[×)þå»ÃC÷?AG[/N—΂ųù«/}•«Ü2êsuwF8}º…úyˆ÷Y<ñ‹Ó\5ÿcüÓß~Ã{HžŸSÎŒ) 9vèA¦/[©­”‚31ôT>%¥%ضݞU‚±b^ÙDWÐí׆,¾²!¯ÔÁ§¾QAw[ŠHWšÎæ$§ôuIúÚm”=ЗhMH pÈ}-BÇt Ì<ƒšé^­r[d’Shb:­Ô˜ª€Ó)ÅKv°ç)·­þmíí<ñìFê¯M±pU^¿BP·È_ø«8ñ×M‡b¯pN/àp0„CHš¤½ç$_ùúŸñ«?†Ê~ž0iÝøGŽü3~õ ê¯ñ^Úú$š«Ÿü²v¾ØË®ápIÂ@°À ²=•Vc›é£G¶÷S^<ŸÏ‹Rê¤b¬Q€ÏÔ—M˜•)¬8ÿœ"3­Ì—c Þ.60$R$¢É„"´³cn” S¢›‡;c%d¶XD1¸Ó•͘| )‘îÏ®o£yG>·ßv---<½y#+?íbúâÜs†c(ª¦yXtcnÕýGN¯Vö@J¡ ^¿É¦'Ÿ¦³%1(üsq`ç~ñ«Ÿ2ÿ;× Îs#±6|ô·T×;Q6ìÙåî;ÿ†ê’oÊ—(/Óù/ ?œæän¸yÙÌÅݹfÍš±“S<m^^‰9˜á<°„RŒÈë†ÀêCwþy âÀë¿+.É™ˆ¢ŽïëãéßtáIMçÎO|ŒS§NñôæÜð97Sçû3éçó^7qŽ®quoGÊË(—rÉtZ%í¬©ë8#Ü™<×A ¤¤‡#3Gwû¶t…‡_`yðàA™vE€3Ç¢èVåKoäÍ"±pº5¤vñÝ/…àèÎ>\v•U•(¥bÀ®KÑ·ÎæäžõÿÖÔ÷Ôo[9q°ŸTÜΤº¥¸h^ãÜYÄþԛÏ(coGŠg~ÛÊï¿§®øfîüÔ]„{{yìé ¬ø”“)Yá{.[‘S`’Wj–å£Z€TÂ'ã¶«¨ÊI Ï Ò}–0ºöÚkù§ú'~ýë_óÿñ$SqRÖÐù8–â6üœ¢‰ŠüR;_ìfVÝ ä½ièiKÈ3ÎZ‚ ·Øù|”YÓàr9±mû8™6ÇŠWÒIuëÞ?†¤» ÿâà‹ÖuÎÜ3TÖÔÎð_æÄÐ3SºFFõö’@™ã¡»-Éž?†Ùû|š³Ž;n½Žêê*ÚÛ;xà÷ë™{“Eý’ÜQÆ4¶7¨ÉthïQ¬´êŠF¬Â‚r“çùh:|VÀõõõÌ™3‡ƒ3aåôY“(Öyƒ»_á…—Ÿâ–»C ÝmIf×W!…­,Z:ŽÑ‰áöåU£Ë 7QtöžæØéL^áÓ¹xtw‰¶êWÕ˜éÝBˆK¹IK]¿ûÝï6%“ÉÛ{zz9zä(÷ïç‰ç¢y;È-·¨žî¢¨ÊI0ßÄã×ÏZ§“>pj¨± ;"Ьg¯èëMÓÜãà«}œÙo’ëœÄMW_ɤI1M“D"Á£þžü©m,úPÉ…ë/˜N‰Ã­¹É´òlÒIûDwkrê„™f]`ëã]ô÷f¬ÀC=D äñÇ£´ÊÏío@г5$½Ñ¾óƒ¯QVgSRë"´IÆm<~ƒÎžVþë§ÿÊC?@g[/<'ºé>{×_PU\?êÂk`ë}÷ݷͶíÿÌZ„%À¬PDf Õ;]–"SÕó °1 ¾ôÍoþæÏÕïŠt¥g•T‹‹’I™:†4"塨¨ ÔØØ(G;˜3kÁîÆû¢ÝmIwN9H`„ŠMV¬-"³HÅmtCfnãg‰ŽóIO@cÖÕoïö‘H„¯ýëÔÖN`óK›©˜dÍdž:“Ý‘f~ñË_0u¡›üRsÔ®Ö]›{xéÞ4·Üðq>ÈöíÛ©¬¬D)õGàá·kõo»í6ôÛ€mëׯw…Bˆ:`VÖ2LJ³ á|‹Jae°f2s•_PJ=/„82P»ˆX¿½ÿ̱ø“çùÆä6‹S7§ËéL&“£+Àšµ·Øxßÿtï|á”ûê5ùC)L¥2ñ¤S¡3/„YWÙöD7íM R ›gžy†ç6=ˤúþöïþ3ë®ò¤þ~'ÏàãwVŽ(xÛÎìüÍë-V­XËüóèèlçÌ™3d)Î644´¾SÛqíÚµ1àxöëñõë×;…9Bˆ|¥T-0¨ò¼ì÷ ™Aúy~yˆ¹Ø©…Ì(›#d 7(¥Ú²o˜HS û¥c»û?·øæ\ÏÅêÓi›ã»ą̃ªÅ0 ˲Fö¨u€Y³f´œ9}úÔÏÿ¦tÒÜ¥µî¡ç•º„{˜䕘,_“ÏKµ±òCs(ó/ §ÐÉ5W}„ 3‘âì50;÷máÿûÑ¿på­!ùúyµîˆÚ¼ô`;û7¹¸åºÛ™5{&–eÑÓÓC(Bñ€Rê.#Ö®]ÏîÖæÚùÞ{ïBàB Ì-4•R¦8>¥8;K9ô !¢—·ØrèõÈΓb‹'Îòfr£EI'â„Ïx˜°lJ©ÈHà D"‘ÈŒ™õoœ¢4%ÀªU«Òº®o[±reÒìŸÆÃ?l¡·#õæûþ²4äwá.èáÏïþS¾ÿãä…W`ÛÞ‡xfó}üÿý%_üòŸ˜ØÄuŸ(B×Ïööv¦Ø´±¾¡Ìq Ÿ¾ó³T×TeH¦Ž|ðAª««;ª««¿yË-·ìæ„/|á íª»ŠîoÇJ«aÉ*)'ö÷sh‹déÒeèºpR)•º`²aÆ!Ä“===|èZ£o0s…“Ê©òJ™|¶vi ‘†ÃÛ#¼ñ\7½™¼R òËLæ]›KUM¤SŠ®–û¶†Ù·Ù"ä¨cÙÒÔN¨ìh=~ü8>ø |ä#Ùíõzÿ-™LÞ{Çw¤?( pÿý÷¯9v¬ñW÷nü¹³öÊ®úX>.¯>¸ñÎ4Æxð?Ú™U}×ßpýï𙆆†ŸzdqR)õt0œxûº;صs¯nÚÊ6aë-”NrP>ÉAA…ƒœB¿Ž¦‹¡·wªáW´é†`Ú¢“çù‰t¥HÆmœ oPǶg4ŠrdGŒ®ã.Š‚õܼl!'MÀáp ”"³uëV^yåfÍšÅÊ•+q:õ¶mÿµ®ë/'>( N§UVVtßÞðé⇹Ÿ{£nqfLLGSŠ=/¤™^}+¯Y9Ð Ü ¼]p6lX <J)I§Ó=rŒŸÿüçT×T£H޵bË>4WŒP©N~™‰?¤áòi¸}:W¦6NÓ%RËпé”M:¥ˆ÷[D#i"]ÍÇ´·°b^|f “j§1uêTŠKŠ ===ìÞ½›W_}—ËÅòåË™4iÒ`Ê4K’,khhØõAQ€ 6øBˆëûûûÙµs7»öì ‹Ê)dÞ¼ùLž<éÜ9¯«:.fPJ½*„¸øß¶m )%'M`ñ’+hll¤¡¡ÛCgW7Ý]]´´¶Ð¶½•Æp7Ét?J&P"Âa¡°HP( a›H¼øÜAJK˘1¯œÂ¢ ò1ÍÌh–H$‘#GØ·oÇŽÃãñpõÕWSWW‡Óé<ÿ:ºölHõACCCxÆ *¥Vx<cñ’+XtÅÂÁV¶4üÜ5zNJÙ9& °qãÆj¥Ô=d¦n&"yäY¾|9õõõx½ÞAÎÛ¶m’ÉÑþ(ñDœtÚ"Nc[š¦¡g/}p{ܸÝnt]¼ $ÓÙÙIkk+‡¦©© Û¶©¬¬dæÌ™TVVbšæh\ù÷/744¤>HJ°aÆ"`pÕE~µøpCCÃ+cV€ìX ü˜6 ©TŠ;wòÇ?þ˲¨¬¬¤¶¶–¼¼<|>.— Ã0†$DÎ9·H$ÄãqúúúˆD"´··ÓÜÜL[[Éd]ש®®fÒ¤I”——ãõz/Š/w544æˆ 6Ü@¦Í»øÑøw…_Y³fMú’ ûæ_Ë&F|™CF9vìäĉ¤R) ÃÜ庮Q€t:¹&{£h:FJInn.EEESRRBNN¦i^Lèì%à/ÞàŠ7J¥ÔÀ·Â~åRÊÏÜvÛmMÉ]PËÙDÈÀmaàœI¥RôööÒÕÕE$!‹‘L&±mMÓ2wþhN§·;cþƒÁ MÓÐ4íl‰ôØ íz€{€ï4444òÇ=÷Ü£išvð—d.àrg×èqàŽ^4T¿“ó×À·ÎÍXn÷Ê:˜ƒßÕ¥WUF€Ù¶ý̺uëâŒcëׯÏBÌ&“ºnv644Œ©/âR øçcae¹ö€À ½ãâ~{qIÓ|6lØ0ø{à&ÀóaËsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÞCÒåT IDATxÚìyxTåÙð“Y2K&Ûd²od ! ö}G,* P·âR­ZëÒZmµVkëg­¼öÕ V)*¢P@DA@°„5!!$! Ù÷L&ÉL&³œï0ÇLwT|Ûûºæ‚ÌÌ9óœç¾Ÿ{_$‚ ü†»Ý.þ_*•âp8pssÃf³‰ï»¹¹áææö£}FÙÑüù •J]þ®¯¯çí·ß¦ººNÇý÷ß^¯ÿq?¤ð_øB8zô¨°|ùr_³gÏÿÿc·ÿ´Síp8›Í†ÝnwaóNèëëã™gžA©T’••Å‘#G¸ãŽ;X´hwÞy'#FŒ $$€§žzjàaB¬Vëf?$ÿI:€S†Ûív$ɰ²{üøñ?~•JERRz½žÈÈHl6‡©TJii)ÙÙÙxxxÐÓÓƒÃá¢;¸¹¹!‘HþKW+ „ââb&NœHGG7Þx#Z­«ÕJMM •••¨Õj²²²¨¨¨`ß¾}DFF¢V«9þ}šùóçÓ××GMM ¡¡¡¸»»G]]£ÑHcc#555„……aµZ‘Ëåÿ5HسgóæÍ#::š3fPUUE~~>MMM"‹wssC.—çr}^^gÏžeÅŠ˜Íf ===(•Jt:Ÿ~ú)#FŒ ++‹wß}NLj#Ø¿¿¨€ö$þ—¾Gn0}útbcc9}ú4'Ož$00ÐÐPd2‰„¦¦&<<<ˆŠŠÂßß_¼~çÎÔ×׳hÑ"º»»1›Í´¶¶âëëKZZ‡¢¥¥…Y³fqðàAÑ`41™L?®½ú>` ÅÍÍ A¾–‚4Мs8"‚ËÙßüæ7üå/àÎ;ïexkk+jµ777 ÝÝÝhµZÒÓÓ]®¯©©áСCX­V4 V«•®®.233Ñëõ„††òé§Ÿ’‘‘B¡à­·ÞÂËË‹„„Ž?ÀÚµk¹ãŽ;\žÝi†^Já÷Bv»¾¾>d2™¨ÕÍp"Ü©Ø9ÿx½¡‹/&((Èå$+ FމÕj¥··—ÐÐP<==Åï¼óÎ;øøøÐÚÚÊìÙ³),,¤²²­VË”)S aëÖ­¤§§ÓÙÙ‰¿¿?ìÚµ‹‰'²ÿ~ ‰„êêjqí6› …BÍf»*#‡²ï‹%«T*Sí›(xR©tˆ\½å–[ذa¾¾¾\ýõ.2Ül63kÖ,*++Ñh4ttt0aÂq-.\   €ÞÞ^ÒÓÓÉÎÎF¡P P(ˆŽŽ&$$„K—.aµZñ÷÷Çh4¢R© ¤¡¡€€ÚÚÚ°Ûí477Ó××GAA)))¢~á|æ«Ñ2¸êu§yg·Û]4ëêêj"""X±bžžžâg[¶l¡½½ððp©®®fÞ¼y( —{øá‡ Q«ÕÔÖÖ¢×ë9wîQQQtwwãp8¨­­eĈxzz’žžNoo/'Ožd̘1£ÕjQ©Tœ?žÄÄD´Z-[·nuNËàj#‚ï…8ƒ/‚ |mÍØ¹a‘?vìXNœ8ALL 3gÎt±ùwïÞÁ``Ö¬Y´¶¶¢P(˜?¾Ëõ………9r­V˲eË8zô(R©›Í†‡‡Œ1‚ÂÂBôz=nnnxyy1vìX¹xñ"#GޤªªŠÐÐPŒF#‡ÂÝݵZ͹sç\Ö/‘HJ¥W%¸ªü<çæ ô¨Ùl6ââ⨬¬dåÊ•h4ù  ¡¢¢‚#FLöÙcîØ±ƒÆÆF¦L™BBBíííH$¼½½±Ûíh4ÐéttvvÒÜÜŒZ­Æl6ÓÐÐ@ll,gΜ!%%…   êëë¹öÚkÙ»w/;vìà™gžá‰'ž׫Õ;xU‰g,].—‹J““cššJXXóçϯéììdïÞ½´··£R©P(LLLŒø½ãÇ“ŸŸ»»;+W®t!Šõëד™™ISSáááœ8q‚¨¨(ªªªÈÌ̤¤¤„®®.±X,H¥R©««£©©‰Q£FqðàA ?kh„ F‘8ÿMôŸÿ(àd—‡C´ÕÞ}÷]nºé&"##™3gŽH,ï¿ÿ>âõŒ?ÞE»·X,¼÷Þ{ôöö2~üxRRR†üî˜1cèíí 88˜ˆˆѦoiiÁn·sôèQq %%%”••±hÑ".]ºDoo/QQQÔ××SUUE}}=Çgܸqb¬øu8€Ífs‘×/¼ð<òóçÏ',,LôèÕÔÔÐÚÚJFFv»Ahkk###C¼öرc Óé¸îºë†ˆ@Dʆ HNNF&“áááAKK ‚ PRRÂŒ38zô(ááḻ»c2™ðññaäÈ‘0jÔ(êëë©««ÃÏÏ¢¢" cÇŽ%;;{ˆ9û_ø§‘“=ÿùÏæ±Ç4œf[ii)z½žøøxš››©®®&==Nô§t­_¿€™3gí‚øÈp@uu5===twwÓÒÒ‚ÉdB.—ãããCHHÍÍÍèt:²³³IMMeܸqœL&íííøûûãííMyy9„††ŠÈ?tèÅÅÅCN½Óœt"|pÄ0<<œ¢¢"jjjˆŒŒÄÏÏ»ÝNkk+^^^œ={…BAXX±±±;vŒàà`úúú(..&&&†#GŽÐÛÛ‹¯¯/•••òÇ?þ‘W_}uXÏå4p"¤¯¯O4“œÈ¿á†Ø¿? .Äl6SVVFSSIII”••BWWjµ€Ñ£Gc0xÿý÷\ÄÅ×]ÓîÝ» Ájµâp8P(`6›7nh4&L˜@gg'mmmL˜0‚‚üüü dãÆ( A ³³“«ÙÕòƒk%2™ wwwùëׯgË–-¬X±‰D¡C‡0›ÍøúúŠ,»¯¯…BÁèÑ£=z4›6mâý÷ß'>>ž»îºkò¿êÉ“H$L™2…¶¶61”ŸŸR©äµ×^ãôéÓ(•J¨®®F.—3zôhöîÝ‹··7þþþ\¼x///üýýE¥òá‡þÏ}ÞisЧ©g4™MØ%\i v â°`ÁÚÛÛñðð ®®ŽÚÚZ"##Q(x{{Ó××ÇáÇ]l÷&ßp¦Ýç%…dùÎï8ã jµšÓ§O“ŸŸÏÎ;™6mÚ+%++‹òòrbccÑh4èt:L&F£???L&¥¥¥$&&R\\ŒÑh­‚Á÷ÎEì\‹sœ„lµZ‘ÉdØívd2Ùñ,~e+àJk°SµßyçvíÚ…T*&Z­–¨¨(šššhooçìٳÞøÄ9˜ÝÖ?p=ÞÞÞQ 4ŠÚÚÚxùå—9{ö,[·nåÅ_t±½gÍšEnn.F£‘_|‘Y³f±oß>nºé¦!Þ»cÇŽ0ì3­X±‚믿žœœ<==‰ŽŽæðáÃØl6Ο?‡‡¾¾¾b­@hh(r¹jjj°X,¤¤¤0cÆ ±öp÷îÝÔÔÔ¸(¤MMM.YOë&¾®Jçömä÷`·«ó$U3p0ûìÕR*•”””ˆOcc£¨ ç–H$( ¬V+;vìàý÷ßgùòå¼ùæ›dee YÇÏ~ö36lØÀ† P*•Èd2þð‡? >>>äääðî»ïŠß7™L_è}{õÕWÑét”––rîÜ9¤R)­­­ãççGUU111øùùÑÑÑD"¡»»[L9ŠŠÂh4òñÇc³Ù˜?>111"Á¿ñÆäææ!gáÍ÷*œŠ‡S›¿ÒNÈÈHÑ„Z¿~=$$$°}ûvQatr‡ÃAGGŸ~ú)ëׯ'((ˆ3gÎð÷¿ÿßÿþ÷äääpàÀÒÓÓ¹xñ¢xíöíÛEâH$“Í_þò8@II‰¸­VËŒ3˜3gÍÍÍCÖëííÍ;ï¼CQQÕÕÕ¨T*‚ƒƒ‰ŠŠ¢««‹´´4ìv;Z­…B!Z5J¥FæM›0 ,X°€ÌÌL—ýÆo`³Ù˜4i#FŒ¸:£ßUêóo¼Á£>J[[¿øÅ/Ëå”––b·Û ¦¥¥…“'OÒÐÐÀäÉ“yôÑGY´h‘xý¸qã˜;w.yyyR[[+²z‹Å‚»»;‡æðáÃ|øá‡ìܹ—gûýïÏÍ7ßÌ®]»hllä¹çžv½=ôÿøÇ?˜1cµµµ‰¢òÓO?eܸqbàəغlÙ²!–ô'«^¸p¼¼<ÆÏÑ£Güáào¢w477Coo/™™™bžÕjåСCLš4‰§Ÿ~ZÌòÅÅÅ<öØc<òÈ#ìÝ»—믿žŽŽF̓>È_ÿúWòóóihhà¹çžcÒ¤IÜu×]Œ5J¼GGGà½÷Þ#,, ???~ó›ß »^‹ÅBZZ555¤¤¤ ×ëéííÅßߟ††BBB8vì˜È]–/_ŽN§sÑä% UUU|òÉ'"wq:„®T„Vö]"l`@ã[G­$رcóæÍ£¹¹™ØØXZ[[Ñh4Œ=šºº:GÑ@HLL$**ŠŒŒ ÂÂÂgݺutvvâááÑhäwÞA.—“ŸŸÏ®]»\-§üŸ?>ÇŽC.—óË_þò =›6m"##“É$š¯z½ž’’Î;'²ñ¸¸8¼¼¼\_XXˆÑhã ©©©bDt ìëpæá¼¥ß™èü¡+G0}útyäÊËËÙ½{7ÞÞÞ‚ *…³fÍr©lÃ766@||<7ndÕªUìÝ»—^xääd<==E­Ûn·³ÿ~l6!!!TUUñüóÏóì³Ï¢T*¿p­)))üéOâܹs( 1ǰ³³“””jkkIJJsššš8xð k×®¥¸¸XDþ²eË\?Сôub/Ãáá;õ8ô›j¾žyæ1vPTT„T*¥§§:;;™={6]]].×”””°bÅ ± Ôétjll$##ƒ²²2ŒF#wß}7‹/¦¥¥‡ÃÁ¯ýkÖ®]Ë’%Kĺ…o>>>b"OOONœ8ABBãÆ£°°­[·’››+r '«_·nï½÷Þ}L»jƒANÛô»wþâ¿àÚk¯¥¢¢™LF@@‡ƒñãÇS__Ïܹs]lçøøx&NœôWúÜsÏ=tww‹A¦çž{Nlÿêçç‡ÙlæÌ™3lÚ´‰qãÆñ /|-bÞ¸q#>ú(“'OÆh4rìØ1 ©­­Å`0P__ONN&“‰x€™3g’‘‘»»;ãÇG±¯Ñ•”ûß«'ð»,‡Ú¶m·Þz+;vì °°ÞÞ^A`ܸq\¼x‘E‹a6›‡\g2™ÐétÆa?饗˜1c.\S?ÿùÏY³f _%t"ÿ–[n!55•ªª*š››©¬¬D*•ƸqãÐéth4êëëiooç½÷ÞBƒs†¼¯¤Þþ½¸‚¿K"xóÍ7 ¥¡¡ÐÐPJKKéèè`öìÙœ:uŠ%K– qéFDD’’Âc=ÆÒ¥K‡ÜÓét £®®NTÞ&OžÌ§Ÿ~:Ä 5þô§?±jÕ*¦M›Fuuµx¿„„|||HII!<<«ÕŠB¡`âĉäää°páBôz=3gÎoµZ‡t¹R-g¾s3ЙÎýe›öm¬ ‰DBDDÕÕÕøúú2~üxBBB0™LìØ±ƒÉ“'³}ûö¯ÜºíèÑ£4551uêT©­­E&“±oß>6oÞ̽÷Þ;l‘©Ífãî»ïfÆ Lš4 wwwNŸ>J¥B¯×£×ë £¯¯O>ù„Ù³g“——‡L&ÃËË‹ÜÜ\d2 ,àƒ>Ÿo`ÎãàÄ׫ž|“å7±6Μ9ƒ‡‡‡Øî­¦¦µZÍìÙ³ÉÎÎ"K¿Ìf3kÖ¬·½{÷””ÄÙ³g±Z­C¸JWW ,à½÷ÞcáÂ…8NŸ>MPP'Nd̘1„……qþüy”J%iiiTWWsáÂúúú`Ò¤IØl6ùOúÀ¸+ÉQ¿ð]öîÝËÂ… ‘Ëå,^¼¥R‰B¡À`0°}ûv1ùãËà“O>aþüù”——süøqvìØÁƱX,̘1ƒììlÌf³Õ«««cÞ¼y455‘œœÌÅ‹ILLÄl6“˜˜ô·©-//Çápàáá!šxA§Ó&*ŸÛÚWVéS'|ðE½ù¯4DDDÐÕÕENN¡¡¡466âçç‡J¥ÂÏÏõë×0¤ž`0DEEaµZ)((àî»ïfíÚµŒ3†ÚÚZL&sçÎ]Ç{öìaþüù˜Íf¤R)øøø0jÔ(ôz½ŸpžvƒÁàCpww'44”Ûn»ùóçóÖ[oñË_þ¥Réåü®G¿sð}·E9pà7ÝtóæÍ£¦¦†ææfâããÅl›C‡±uëÖ!éXƒ¡®®Ž9sæPTTD}}=÷Ýwiiiüö·¿ÅÍÍ ³ÙÌÃ?Ì«¯¾Jpp0R©”ÈÈH|||Äpqcc#»víÂËËK +1þ|¦L™Â}÷ÝÇÝwßMkk+III;vŒ-[¶&&~î™0°|þJì÷w^õuòÔ¾ Œ3wwwÖ¯_Oxx8 ,ÅP\\]]],_¾œ vBHH \¼x‘˜˜þý8q‚•+WÒØØHXXxxx#†w/\¸@XX .¤¬¬ŒÖÖV~þóŸ£Ñh˜={6999tuu‰úÄ¥K—P(Ì›7Ý»wA¨3~à> ‚ÀwÞÉ7Þ(¶ÃýºJâÿ¹™A^^^Üu×]@èöĉ.ò6==ÈÈH,X@iiéÞë¾ûî1ÎÓ÷ôÓO“••…Éd"""Bì‹D"!//öövz{{ÉËËcûöíŒ7ŽŸüä'ÄÆÆ’Í† xå•W˜6meeeSQQA@@ááádeeññÇ»(Ñu¨7ß|“Q£F1kÖ,¶oßîbÊ~]7ñ÷ ü!:c(•J, K—.K¶´Z-J¥‰DÂîÝ»ñòòâäÉ“_h¢655@ii)+W®äüùóøùù V•——Àž={ ‰îÅ_dÑ¢EdffòÜsÏ‘——Gee%Øl6´Z-Û·ogãÆ455‘‘‘\.§¥¥…§Ÿ~Úe-7Þx#›6múKÎÿßÿûbÌáÙgŸeñâÅß½øMÒŽ~pÖæoݺ•ÿûߨT*zzzD÷´³ƒ¨³VïóÀÛÛ›¿ýíoŒ=ZL‹‹ÃÓÓ“äädŒF#ûöíãÈ‘#TT–Ñej¥ËÔ‚ÆCɯýkxã7ˆ%""‚Y³f1räH,X@LL ^^^”––’ššÊéÓ§y衇X³fKòë|€››eeeTTT ‚ˆ|€÷ߟ{ï½÷ûó|Ýâƒ+ úªÐØØ|VîíT¬œéS³gÏæ¯ý+–€þçþ‡ÈÈH~÷»ß‘‘‘ bÞDDìܹÿ,3gòOž1Ь‰(Õ2ÒÒÒ¸xñ¢Ø\úÌ™3âl¡wÞy‡ÈÈH’’Ù%Q IDAT’(**B¡PÀ£>ÊÅ‹]dýOúSî¹çNž<9l&PBBz½Þ¥UîwFN“î«rùN×k@@íííØív:;;ILLäèÑ£"!èõzÒÓÓY¹r¥}+**âÙgŸ%22’Ç{L"qþüy¼¼¼ÆÇLJÜÜ\ªªªè³wSpþ>þ Vßq ã³²P((• ±›ÙñãǹãŽ;ðòò"33SŒ%Œ1‚ôôtZZZx衇ÈÉÉ!77—)S¦ðú믋Ï3~üx—ÀžžÑÃ:08–ŸŸÿµ÷ê©æ_Gž_N Ïó‘ûøøNAAF£‘9sæ`4]”ÂK—.1sæLÚÚÚ¨®®& €ÀÀ@BBB(++ÃÛÛ›øøxz{{éî°ææfÜÕ PÂõ×_‡¯¯ŽNƒw¥;çÏc6YÉÉÉáºë®#;;›¤¤$Μ9ƒN§cÆ dffÒ××Guu5gÏžå¶Ûnãü£¸WÎ|G€Õ«W³|ùrñoF3„ÿóŸÿäæ›o¾:ýÎZ÷ïOêxî¹çØ¿?ûöí#00˜˜¬V+ñññ¨T*AÀl6sðàA1@c6›ñöö¦²²»Ý.•èèè ??ŸÞÞ^JH›LVÖìv;ÝÝÝX­}øùéywã&ÒR&’™1–ÐÐPÎ;‡Éd«„rrr3f ‹/æ™gž!..Nì4úEiÇŽ¢¢7ØÁ¦Õj‡ä@|ç~§Éñy].·{ý>`ào¹¹¹¡×ëY¸p!éééœ:u A˜={6 H$±PLLŒÈšccc©¯¯'22‹ÅÂ… Ðh4œ9s¹2'Œdܸ±( *++.§8ð¼Ü˰­Åˆ7JJJ(//'++‹5kÖðË_þ’^xØØXRSSIKKCä;k&—ª©;wrë­·R__/<»~~~\¸pA,ù^‚ANÄ;O¹Sö:O¾s‘_Ud|]åòËNŒ $$$ •JIOOG*•ÒÔÔÄîÝ»9tèÉÉɬ^½šøøx±055Uìèáåå…B!‰ƒs…gˆ‰áλnfòäItvvrñâEúú¬Ž~ËÈO¯§ºº‡f̘ÃáÀl6“’’ 7Ü@MM 6› ¥R‰··7gÏž¥©©iÈž W2·páBŒF#úÓŸ†Å·ÝvÓ§Ow¹ßw*‡)w²X¹ûU½RÎDÒoË1¢££©¨¨+ÏŸ?O@@===:t…BAGGYYYœ8q???®¹æ RXmm-^^^44Õ ¸õ¢PÈ™?A˜ÍfJKJðÕùâååM}}½è[ˆˆˆàŸÿ|£ƒŸßuÅÅÅL™2…îînÊËËilläܹsdff²lÙ2î¼óN^ýu.\¸À /¼à²oÎ}¸té+V¬÷ûôéÓX­V±/¢óá³á³fÍbÛ¶mxxx|鳫®W°óõuˆ` ÜŸ:u*999¬ZµJìåg³Ù°X,¨Õjbbb8yò$mmmb»w'TTTPTT„L&£±¹† P_æÍ›‡‡‡;;±]#—÷7k @&“!•Jiiiåã?&>:•îˆO?ý«ÕŠÑhÄßß•JÅŠ+˜4iПªÞÕÕÅêÕ«ÅâÐÁþþ;n¸Aì0&‘H¸÷Þ{Ñh4<ÿüó\ºtILru>Cjj*ÝÝÝ$%% u¼ª]Á_GgÜ''//OT° ØívqžŸ3Í*##ƒ¹sçŠÈ7™L¬]»…BACCCÿ÷#úíjl¶þçp8P*ݑɤxyy£Óéhjj¢¯ÏŠ»»’}ûöaµÀرY444 —Ë©­­% €ÄÄDþþ÷¿‹È9r$ãÆsa3°¾¿­­ÜÜ\æÌ™ÃÂ… àñÇçÅ_‡c9ƒLNñé¬@iÓ¦¹8Œ®z0ž~úlxk=±±ñ¼ü?wÉ‘sjÀƒƒ˜Íf&L˜ þÜZ“ÉD~~¾Ø¿g Œ3‚àà`ÁA@@ íímÄÆÆ¡R©(--#ÀߟºúZv±qq4Ô׳ãÃ\wÍÍŒ;–#FðÈ# T*ùè£ t¹ÿsÏ=Ç“O>é¢7 n7uêTn½õVfΜIDDÿú׿¸ùæ›y饗xüñÇ™ÎÞN¨®®¦®®ŽÛn»—_~™ƒ2eÊrssyðÁ\Öï<Çï£×ëY¼x1»wïæÚk¯½:9ÀÒ¥Kùh×vFŽÇCíMsSÕueüìg·»lÈžÝ(Ì/£¡¡aÈi:wî)))bh¶»»›)S¦|.â8Ð_³ïÞïÈAî &SÖ^ C.—SQQÁ˜1£‘)mŒNK!''‡ °{÷.BCC‰‹ÇjxíÿÅu×]B¡`ãÆøúú²dÉT*¯¼ò «V­âÃ?Äd2±téRžzê©/4ÙV¬X¯¯/¯¼òŠøÞ{ï½ÇŠ+¸å–[0›ÍLžùÄe8æU£lÛ¶¨˜ÆŒIÃC«Àb5 ‘À©S']Oø‚™LŸ9ððPŽ9âr§\&“4ùf³™ýû÷³víZ6oy––fJpWƒÄ ÜÜ$ôYûðñõ@é}Žvb™0)“³ùgé0´ñÉîÝÔÖÖýE&=Ý=8r…‚ãGO#ý«.\€Z­ƒ@Ï<ó o½õƒ¾¾>6mÚ4ù999,]º”'NÐØÔÀ©³¹´uVóØãŸ5šv¶×h4œ={V¬pv>»ÝnÇb±ˆ &píµ×2}úôaÓÙp ‘H;q$MM¨UjF§¥DC}=9‡@zF:Ÿ Œ8rø9ÙÇ•>úè# ¿`ôšk®aÏž=ÜqǬ]»Vl„ÙÒÚˆTv¸¹Á¤iØíä29Üû‹/aÛ¶m,]º”ßüæ7F"##éééáp©bvvMÈA333ÉÌÌtá(?¸àÌ~ujÆFc'…ç ÉÏ?‹^¯gÉ’%ôôtSRRŠÃá 55•„„xqÍ3\,­åw÷ÇÌu:¤¹¹Y´ñË+Jéíë"l„/ZOT*ƒ‰ôöZèëë#44 ¹ÜFEÖ€¦Ð—.]BÞŸú‡ÑØ…§Ö“¦ÆFÌf3h.Ï+J!++ ¥RIQQO=õÜpà bPgÔ¨Q¢I&—ËY·nëÖ­C"éC£3≊Ayy¥¥¥øûûc6÷ÒÐPOÚ˜þ^@wÝu©©©;v Aؼy3ÞÞÞ¬^½z v½¯[·Îå€|¯"àó<|Ç'.þ³¾¿žž^L:ùó “Ê8sæ b³Y),ÿüóÌ›7 .ü0V€3¯íøñãŒ?ž¬¬,–.]ÊsÏ=‡»ú3¨¤¤¤¿áC`ñ ¨T*úú,TTTpî\!ÞÞÞH€ÊªJÚÚÚ±Ù¬ä̧¾¾Žú†Z’F&³ôú…Œ@eE…EEh=´L]>ÆCTÃBC™Y¡û<¸téJ•;écÆpêôiºººðõõ¹¼^+V«ƒÊ²F&N˜Âš5k°Ûí‹.”¡Öº1fÌZÛ1›L¸+•b$² úú¬´µµÒÙÙ‰·—7ååDFF’‘‘Iá™þ•õõõÜ~ûídee±gÏfÏž-ÎM>uêÔ|€Gy„C‡1wî\.\¸0ló‰ï…œì(//‰¦Ï˜Ìo÷2¸IŠö°õnnýŸ9§v¦§!==ƒÊŠ ¬62Y%ƒ773 —L%.¾é]¦ÏL«QQŒÔYúÓÅÂ#¿tÝÁÁAä\îÈpêÔ)¦M›†^ïGKK+ÍM-Ømð׿þ•ºº: ìOÐðeî¼iÈþ• Aî.¡©¹‰ð°0jëj±XúèîîÂn·3jT ¹¹‡ C«ÕÒgé#""­Ö“ÊòjòòòðôôD§ÓñøãóÀ¸ø>–,YŸÿügRSSY±bÙÙÙÜ~ûídffŠââ;‰~]ðööFî­†~rÝ\ââF¢Vihmköû]Fcÿœ€ÜâÍìD¨³h0tww‰ £xŸ.ãeÄ«èîêâæ›oæÝ ÁÛÛG”›ýFÇg–GBb"äÈãÒ¥jJKK‰á'?YJQQz½ž‚3eŒ›‰ÎÏ›´´ÑøøúÒÐTÔ©Y44ÕaµY/»jÃÇÇ…B‡Æƒä¤H ‹ Ñéü¨(/G.“c³Ù1:™8’cG΢Vø±`^&û÷~qK˜íÛ·ó‡?üo¼Q”óëׯç–[nÁd2‰³•~0?ÀÀˆ Z+á†å×R×PƒŸ¯? …‚‹ˈŒŒ¦®®¿ÏÛÛOOO wÜ Z[[Ù÷é>~úÓ/NxèííeÆ ¨TJƤ!!1©ô3:?~ìØ.\(fÞ¼y¸¹}õ¸Ã–-›qww'3s,f³™mïïÅ] ã'ô³óÖÖ6ÒÇŒÁh4b2›°Ûí466{¹Ø´Æoo/*++Q«Ôxûx£R©iii¦»»‡éÓfóÒ ÿ@*•rë­·’””Duu5gΜáþûïÇßßßÅ¥<ÊÊʈ½zB€\!áþ_ÞMs[=õu Xú,ÔÔVâãå/6‡´Ûm—'rõ·Fõ÷×ÓÜÜÂ7®@«õDH$ntv8sæ Ó§Ïpas¹¹‡)/¯C~÷‰'àæ&å“O>A£Vs¾¸;DÔ>#&3Je¿^!WÐÐP‡V‹ÉdbóæÍ¬Zµ ‡ÝÎÚWÞeÉu3 ãâÅ‹:t˜3fPYYIwW UU—\¹ \ޱ³_/ÆÎ.úúú°Ú¬hÔjLf3‡ÀoéÏò•Édh4¬V+o¼ñv»ýë_tttðàƒ~n“ª«Šz©$ ‹-"aT(”—_ÄÜÛ…\¦¦½½ À ¼¼½Q«U˜L&T*þþ¬[·??K—~6 Ðl2ñÖÛo3gÎl"#‡&K–––PTTDKK«Kâ„ÉÔƒÍæÀ××‡ÆÆF¼¼Ý¥mËÀµÆÅÅׯv´·sòäIܤnH¥n455ã®P0"2’ʪ*—ûöôtÓÞÖvÙ·n£¬¬™bcc˜:u§NäÑzx`s˜Ø³o'-­­èõz‡A€ÚšZB‚ƒ‡ ¿  Ÿ¥K¯ãÕW^ãµWßB8ÍbFƒL&###ƒ|pHs§·ß~›­[·Šy÷xðpÌ+–v%‹:žxâ þöòþ’îî®nTj”––¢V«ˆŽŽaãÆweݔɓùdÏž!÷ eëÖë¤n½ ¡¡¡Øl6ôzâââèì4àïOeUdêÔ©—OS`ÿÆÊX¶l¹‡ÓÕÕ…››™™cÉÌülžP~~>ÆNÜ$Î]vö¨TJèSøÙw HIIeåÊU¬\¾ZüÍ`±XxôÑG‡=ÅÎ9|ð˜bîÄÑpçŠÀ·g3g…Bqy¢fÿû•••Xz-tuw‰@·lÙLtt r™œÊÊJ4j5icÆq9¤ÛÛÛKss3ÙÙèíµ\6…>; ’a¨¿²²C‡¡¬«Î—ÂÂB|||hii%iäH–.ý [6oc挙Øì6;2ù È\}=C{·47S[Sí·ÞF_Ÿ„~¤ÍŸ?ÔÇÐÐÐ@RR-ÍÍ466s8÷S§Nåƒ>`çÎŒ;–¶¶6ñóóãî»ïæÿø‡x½³SØÜ¹s?~<£GÂù¾îaýZðMEÁàà„ÓÒrs“ VyÒÝÓMkk+~~~„„ô·y™6}Gr`î5óñÇ‹Q8§–ÈâË©\Oó· ­­­äçŸÅMâF@`V«•¶¶v®»îz8€\!Gëé‰ÝÖïø ÁÏOOpP°H¼ÇŽ#..–iÓ¦y6µZÍÂE‹ú‡B;Ý«n½ µFíâq´ôY¨­©¡¹¥ooors9f2K–,aÊ”)X,Ξ=‹Á`àW¿úAAA‹³Þ|óM  ößþö7æÎû­¹ô×"€o# ,Ë€áOý磻¤ “¨¹X¡¢¨°©Ó¦1eÊv}ü1“&ObÑâEäæÁb±päÈÜÝݱX,ŒˆŒdÂĉCä`ww7†ÆÆN:E]]=Ri¿N¯×&F>„L*¥­­¶Övl}°sçGÜu÷hµZF_îÅ_QQ.&gˆ›&•a³÷ëšË¢BL¦nüü}¨©­&>þ³hŸ¥ÏÒ?GØØ‰··ÑÑѤ&õp`Žø§/Þ¼yâ{F£‘––<==qwwçÔ©S—•ÛR^ýuqxæ·rÒýA á23ˆŠŠæÔÉ3Œ9’ìƒhkkE§ócÊ”)¼{O=šC‡Ñe4’ššêÂöœL&C­VsòäI"## %66Ž˜˜˜!rtBÖDJK˨©©æÃa1õGáúz!÷ða&Nš$*®ýœäH$ŸÝÃf·qâÄ ’’F¢VF„*µêrщd˜<•,Z´Hœàl å„Áƒ!INp°¸û©©2?ñª%€<öþò&Fƒ€‰Ä ??=yy'˜?>üüüÄ.áóçÍw‘íöï§l@,`̘4üýû7+##__ß!’’â2ÊËjqØa8]ÉÇËŸ“ÇÏ3}ú ú¬}¢ÇñèWOÜ¥ª*ÜÝ¨Õ Åñ.¸IÜðôÔÒÚÚ‚ŸŸžÆÆFñööAp@Ks 9ÙDZZœŽ¥-.ù ŸÇi·nÝ*f:?ýôÓb±%H9†½{÷qíµKúûæw¶‘˜˜@ee%‚ÃÄÍÍej§Ýá ª¢\Ôô»º»qssÃÏOÇâE‹),*"?ÿ,ùgó‰Å×LJüÓÅääÂM جýH‹‹Ǻ^¼x‘iÓ¦ÑÒÒ‚J¥¢  » êj[Ðx]FŠœø„xÜÜÜèèhG"q£¢²Ṟ;räqqq( ÔjµuuLš<™ãÇáë«cß¾}Øl6þñÊ?ùxÇA>ýä8¯¿þ:?ûÙÏxùå—¹á†\Rê§Å;ïìgèííÍÆ]I]õŽ £% ííí„Ðq÷Ïï¼,“{P©4C®;sú4­­­$Ň~ˆ‡‡†ùóçããã;ìïœ={†ÒÒ2šê X-Ì¢E‹èéé!55U,žÜµkO<ñâTÒõë׳cÇ4 Ævx¨mÖ¾>ò ðôÐQRzŽè˜hRFæ£>dî¼y¼ùÆddf˜˜ˆL&çÃwpÍ5Kxíµ×è3ƒÕ·ß~;eee,_¾Ü¥”;!!°°0±Ù@Ø·oçÎcâĉ¼öÚkìÙ³‡ÚÚZ¶mÛæ’ã÷mü4Wœ†[ŒÓAa·ÛÅ"µVœ¹3ˆŽ‰A&•ÑahG«uMà4:hjjrQ¨*bž|´ó#Î;‡ ôo´·—R©ƒÁ€Åb¡¶¶–n¸‰'’˜˜È­·ÞJ^^O<ñÇ'44”7²k×.ªªª8sæ §ND¡‚_þê^NŸ:ÅÁÇô£¶®ÁÑ¥”) 9y¤8âMá®`äÈDòóóñÓR[ÝÈùóÅÄÇ%pøðavìØÁŠ+†´²ïèèÀ××—Õ«W³nÝ: ¿¥··—ýû÷SXXˆÁ`Oüš5k¸ÿþû]<¬W”¾­×o¸&EÎ$ÅvêOo¾‰Òò&MžˆÃa§³Ó€nØ{*ä lv–Þ^ª.]âbÙE.Ö ‘ã©©©Ô××Ó×ׇZ­¦¹¹™]»váïïOJJ ---bBˆR©$ …BA[[›8UÌÙ˜áöÛo§¤¤Ä¥,Û©ˆEGG»øà§L™â¢Ð­]»–¹sçºl|8cúN¥Ïn·³`Á”J%ÙÙÙ\¼x‘3fðÑG‰¢çŠ® 8Ájµû¾Åb‡àp8A„ââbA*CPiû_29‚§BððFˆŠ ÆOJ’FR ¨=<|ú_r÷þ÷A­V ÉÉÉ‚F£&Mš$( ÁÛÛ[ˆŠŠÒÒÒ@¸xñ¢¸–Ý»w  èt:A«Õ ~~~Bpp° •J@x衇ÄïÿùÏF%|øá‡ßzo¾ì½_ÿú×Â}÷Ý'Œ9R___ñ9ƒs?¿-\Q°Ûퟻ(çg??pàÀÐÁ°/‰‚B‰H€( ±±± „…… áááBTT”,„‡‡ 2™L„sçιÜ?**JˆŠŠt: T*…   ñ»€ðàƒ~«½°Ùl‚ÝnŸ{8„ þ;77WøÇ?þ!TUU‰ïuwwÙÇÿ~[¸b:€sŽ\.µYg'§üwš:ƒÙÖÁƒÅ¡ Ã’œ$gk÷ñãÇ@vv¶Ø³O§Ó¡R©èííE£Ñ •J1â(¶®®.òòò€þ†’ά^çp ‰DBoo/J¥Ò%ŒüðÃsðàARRR¸÷Þ{‡ k(ò†“É‹E¬Oh µñññ.]Ëzzz†$r ü-çZ¯„Ò&\i10øôõõ Ëž}öÙaOû›o¾)¼ýöÛâßÞÞÞBPPøwrr²°råJ‘-¿ùæ› Œ1B ÔjµÈâââ„øøxÁÛÛ[„””Áßß_ bcc¹\.H$A.— €àææ&r—áÖ6jÔ(Á`0|-®8wèëëså|Þrañ£+…ÐÙ#¼åByyùîé¼WooïÃ×wBN¤§‚ ?~\ËåB||¼0räHÁÛÛ[…°°0¡¸¸X”s/½ô’ T*Eyxà 7ÕÕÕCî9aÂôz½0bÄaĈBBB‚œœ,Ì™3GèééA®¿þzaáÂ…‚^¯w‘û‰DðòòT*•ˆ …BP(.D+Ìš5K˜7ož°yóf¡¾¾^8xð °zõêÏÝ‹Å2ìžäåå Äi…Ä›&Ú©Q_*>¯ nAV«õ ueË– €••%¤¤¤ DFF qqqB@@€0{ölÅH*• þþþŸ«=ýôÓÂÃ?,‚———/~w°òööÛo }ô‘˜˜(h4T*• ÕjÜÝÝ…B!(•JÁËËKä €¨' |oðëÉ'ŸüÊ{8vìXaTVš63Içûƒæ·Hµñåò¹{Ž$<Ï“<¿ß÷ýûûþ¾2™2™Œ)))BH’DFCµZÍ´´4ªT*Fúý~z½^&%%‰ç+,,Œ;n¹¹¹Te™XQ[ÅEk—2y²•µU¼£|> 3¬lnn5ÎãeõÄ5WEJ´#Ö}´E[WWƒÁ€… ¢§§Z­f³}}}ؾ};<‡ÃP(‹e8øc6›ÑÞÞ.–6½òÊ+°X,0 "QÒÑÑÊÊJTWWãÑGENNÜn7º»»…Ç P(pöìY¼ûÃðx<ÀܹsEçí‘­åt:øI’àv»a2™ Ñh‡qéÒ%±Üª¿¿_ìb :9NdeeÁb±àóÏ?>[[[ÑÙىŋC¯×#« ¹ù?Â{Àh0Àåt¡½­YžL\8щ«Ö£¨¨Hx ãÕwñºx#©rïÞ½‚›ZZZ˜——'¸"°µµUœ{÷ÝwN',XÀœœ>ñÄ£ôc0¤Ãá  ;vLüÿøñãB<ëõzZ­VQ£Ñ°¸¸8®Ž6 Bÿk4Êåò˜@„ë£ß+•Jú|>úý~šL&¦¦¦Òf³1##ƒ‹…>Ÿ/ÆxŒ¨³Èqÿý÷óῬcEm‘¥ãâõ ¿¶ª †ó' ãâ\¼xQ÷ÜsÜ¿ÿ˜F¦Çã¡Ñhä™3gbTËã?. Êk=t:-‹Ðõ …‚jµZLx´¡'“É„  Óéh³Ùè÷ûéñxhµZév»YPP «®®Ž‡¦Ýn'IΞ=›8uᬨ­âQJdéø»??F(d|ÿý÷ãª×ë‰qIGrÓÑ1¥ææf455¡¦¦&nÝêêj<ÿüóqûùÈd2¬X±~¿v»UUUصkWL‘£ÛíÆŽ; V«ÑÛÛ ’HKK¢?²¸3åå娶mz{{¡Ñh T*a0ÄŽZ‹===¸|ù2ôz=l6Ôj5ÚÚÚ T*qñâE|ýõ×èïï‡Ùl†V«…$I…B¢? A’$¡j.\¸€—_~mY§Ë‰üü|¨““ñ§5›€AbzTqêDî«8.7oÞ,Þ×ÖÖ2--&“‰‹eÌköíÛǺº:¥JÖ¯_Ã¥u}ÌŸ?_Xø×ŠÓ§Oó™gž¡×ë¹·$I"@É-ø|>ÚívšÍæ˜x€\.§B¡ ÙlINNŽh•••$É'Ÿ|’õõõ„[#,þ6¯$2644ŒÉý×Ãê¿.*`ÆŒœ1cC¡ƒÁ - u:}>°££Cœ{êÔ)‘ìHMMùÎ;ïÐív3 Òl6S’¤˜®Y³†'OžüN¿-Úw¾ÑZ]]C v»‡ƒ6›M$‘ôz=½^/ÓÓÓ©Óé¨Õj)IRŒgár¹XZZ*Ô\vv6333©ýa=³'S0pæÏçÅÄ5800À¾¾¾ ™üqs=ÊŒŒ –••Q£Ñ077—V«•6›ƒ>ŸOœ;gÎz<‘¸ÉÊÊ¢Z­æòåË ™ŸŸÏÔÔTjµZÁmã‰p8̾¾¾o%ˆÕ«W’:&“‰r¹œ*•Š™™™”$I-“†ãw,,FâÂ÷"€^x‡ƒÙÙÙ\°`³³³i4év»iµZiµZ…¨w:ôx¥»mU€§Ÿ~•k‹Šß?(>;q⌺»º ìŠÑñápƒƒƒ1E Ü¢*@œ )ñ³‡~…÷>xgΜËåBr²„$Uþ}äæä•`÷ŽÂ—M ˜0\Ñj[ùàÃøÛÖ¿"ÅlÆOï½Ó§C¥Rá'EEXR±{î›*Gv‰Ø ÜÂ1ôêêê ìŽ|ø œL&#RS-hii\&úECG`¸>º{e79â-ø™w/))¡B§â/WVPáÖ¶dB¯$2>ûì³c®ÂMàæÇ˜6ÀÐÐáß,Á¥K—pðàA¼ýöÛ8{ö, PXXˆI“&Áf³rÿ¶À­ÿ+9˺ÂI×IEND®B`‚stem-1.7.1/docs/_static/section/tutorials/mirror.png0000664000175000017500000000565113157571677023334 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ8¼¹¬ )IDATxÚíÍŽãXÇÿçÚNœtwuÏP¦Ù Äì@bÁž KÞe–#v¼kžcvó â% $ÔÝÌ ÝÓ©Äö½‡…íÄIUR¾ñý´}¥î$åÄUöùßßù¸æ6éF†Ï'šió87sM¨šG¢ZÃçÖÍ£˜…`Äð @` `Ó<7"‚Ô°r·/rüèåÓäSÉœ÷P zèD½W)uîfÝÿÜ™3_¼Þ‡ˆÃ!¾ð¾sì~†%ˆªx÷ê­ü#€·A%€´éù·?{_}z›ýn« jŒ°@P}©ísj.]´cŽ^ jÏèpÞGßËW¡N5Æg"0Ü ‚êä5sm•îkÆá=ÝsÔÎ~F1@D‡cn³bûê-~ÝP`kJÂn¶½\î° sÞn³y}/_˜v­¦ýs —Œµãåb‡Lpäa2yùµí]û8-ñ4‘ís “v3M@´>,¡Z)ñܯh7I…›T¶±ˆ0ì²­à>ˆñÉriŠ€¯¼ìg‰ÄGieýïs’¢eÄødY4ß«-z¾J^¤%@bÙB©«{° …_>ßâù2º>Üóg'‡éÊSx}|_bŸÙ(ŠXôøíaö>:=lñÚ„·@z4:"+輂¿yö<ýñÏõzŒö¯·sbÓ‚þðþ=žÿý˳¿ÇfeU¢s!§ÑðÍOßüös7ðï¿ý ¯>ÿòá{H×gÞ]Yê1cjyž#MÏ÷Ã¥°GHë`ALÌM<Ï/v z¬#VÐá"\ùç˜Úz½]À# ²e¼ ¾ùðÛr¹D–e#T$V]¨Ý4€…e„ mEQ8ÿB¬V«þ®4æ:@"Â¥ÀÝÝ‹Epè? *»µ+×TUu4s'(ôwš’UÄi ”-ƒL‹¢Àrév`Bý` Rˆ;€H‚K·ÛíÅôË7ú». d»·Ïº ­û+¥@DÎñ¯‹~ঠw%P© Ýn>ú]þm¶À²Æìv» £þsé_Ô.€¥ "`f(¥$Iðèß»+>~Œ–G²ts~×6~iùþY„JåEQ\Ý } ÿ! D+yâĈÜ_¤”Î0ýã ›µQÜíIêô7›M”è…@Mç÷D€ªª.N¶ýã!À½ÀÐÝ)ŠÂyÚ úÅÀñ2hWðQî ýNp)‚µ )¥—roLèwF>‚ƒä£Ü»X,¢B¿3Tއ|Õú×ëuo×4¹Àû™Ìì¼Ü»Z­z¡·ÛyÉJ‚€Mywwç<ð[,½2v,bò°™ò¹öÁ:è÷Q R¶‡|”{û¢ßG=bR.ÀÇH__ô@Y–ÁfÖÐn g«•eé<èÓEÿ“'O¦›áxkÃ(ËÒ9^û¢¿ª*çâ ’§Ñ°©¶ÝnƒF¿šDø1€Á ˆœ–^ujý>â’8\€¡æ£w­V«^ã ¾¦žGå†,÷Uëï‹þk R>fKyH‡}^)å¼ÜKD½q¾Ûí®®FRšKGÆ6ä|Œó¯×ë^8gfH)ˆ“Æ%€£€Ÿú¡^óQQÓEßúÀ™(sdxàù4PJét0EýfÆ"ÆFƒ.ÀÇ`J_ô†Ê½42wJÁ\@Y–·QuÐz¹×0PØRJ§¾_ý¾¦žÇ!ª÷Jº#B¬ÿ52¡FýmÚêPoŸ–ºîüÌaP–eZQ¿Ñ¸ÄC `Ÿ]§×¤ÂõNãìL=YØ^R÷²X–†j æ§õ­õv R4¶,`¿G‘Ñ5âeY¿YY–õ_ðµÉTt.€Ð~‹&PqwJ)ã£l:è÷5õ<â4ÐìV¡ÃjíÃÑêìÞh²€¡Æ7së ?äÙ½á  }ÌlÔ÷ë ¨‹>1®ÿó+C;Ú¨¸é¢ÐHßT]€‰à߯ön:è÷11¢ Páx‹ˆë|¿ÉÈ_ýî|?Œ()ë'Wºnßè<ÉC×]މÜyÆWÝÞ÷Xèw=õœÇ&€V×^–é´Oýcªøy ¯µ¾ŠŸïZÿ$ƒÀk `:ðÓA¿©çã$Ré“ÀtÁåš‚—r¯‡¹Á­]2]íÓE?oåÞñÔqÔ¿÷™D¯ú½752tÝGܦGútÑï~JNÛ˜Žüóa&€qô›f¶1Yu8Í.À,úmËÆàUkxâˆ0|>YôÛ0–µ­`Àþœ@þ_ý¦e¥çŸÄQ!¡ß†±¬øþ/µ °~Z¿ic9ÙÂònÛQ ÏóÞµµÁ”Íù‚m!m. D‹Ó?k2ËqT”ÐELßiKÄH AC:£úc ü†ñ@ý¦åz³JÛu€¨pMÔoÒX6V(?FÉèƒ|Eý6ŒåzO@fijÕ D#]ô›6–ʽ(ÔÁ+OYºè·ø¹ž_Híÿ1¸F?ã†bf?ûP-~›q@ðÐE¿-yiÒ‚wcÜ–E;ó˜ªtÑ?:ã·©ÀKÁišŽj?¾«EÐl­;¹4pêè¯c²´ÉF”˜:úþß~œfô»Í‚ÀŒþû¶ŸL0£ÿ~“<$I2£ÿVZ‚@¬_»fÿ4Vt«««ÕjFÿTƒÀ$I&±ß  pÌ3‚fô_®X€_ÌèÌO6àm8øý»øú¯ž àõ¿þy! ´ë¼ àÉ_¾ÀWŸ}1[¿Éõ:OÌ CÆÝò8%À– T¦8ºß ð°ø©ë OŽuSÊýy.|nPÖ©Èí—íÝ[¶Å'Ÿé¾ŸÏ˜ˆŽÞS¨ÃYl9À)ðÿ-÷—)Z£3C4;a‰ŽÕ=¤ž#_«·Nc ù @ÌõôiªÏA-Þ:¿C·©fe&s½É3ÀíkcÍ_ Å­@ê×íþI$ïU\/ ýá¢@.ÈòKNð®Jð¦\ì vÖ5Ç1¨+joã™ ižPss…¨»Í±+mÕIoöÜg‚÷kÿ…À^ ×1Á›rd%nR·¾­R¼)²Æ€ç‘eÂÇh +ÚãµáIšit ª€ânÖòd­]eÓŠB¡³•½ã–6TcÒȲ”,Q°¬… ðºX@r‰gI…Ú퀔@ýEÁoÊ ßVÙ£žL¨!¥û¨®Ñ ²¾qŠYV òH"0T½×~ÓÓ•ªÏI8^^ÅsJ(¹¾^Á@©[Uª‚ @ Tªèëb*#hÛŠ ›(7¦E6þÀw_¿ÇWˤø½ä"gŽ=ÕäG^[ŽJŠ”ð_ol`pó52L“5€7‹¹Ö`ĵV¾ð €ï¡ Á»ÿÄ,c±UKØÂ¤°Qe³á­ ¡uµs››™öÆO{MÚìIEND®B`‚stem-1.7.1/docs/_static/section/tutorials/cauldron.png0000664000175000017500000002332713157571677023631 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs Ö ÖoyœtIMEÝ #IWU¡ IDATxÚíY¬eÙy×ßÚÃïXÕUeW»ÇNHÚÝt·¥–±ÁC$„°ˆ‚B¼"…< "ž@!Ä BD"%QL!ˆL(!!íNlìvÜîîšúVÝñL{Xëãa­sï¾ûîsî9w¨.ÛwI[gÚÓYÿÿ÷ÿ†µ÷ÚpÕ®ÚU»jWíª]µ«vÕ®ÚU»jWíª]µ«vÕ®ÚUûÆorÕ—×^}õUS–e(^ýõüŠßDí…^øÖ²,ÈZûZÇ¢(úO"ò¹7Þx#{’Î3º‚êâÛÇ>ö±çŠ¢ø»»»ŸÝÛÛ:ç^iµZŸ5Æ ?ðüÖƒôI9Ws×Å7Uý›Ãáð“»»»ŸÛßßÿÌÞÞÞ?ÇàGs’ÎõŠÜ^zé¥5çÜŸÇXk?Üϲì'ó<SUo©êw_àÛúûÀuç\¡ª[ÖÚ-àݰʷ\»vM®ðÛZ"ÒŽã8‘@’$&I’8ü¾¹±±?)'û¾žÈÇ>ö±XU_PÕçDä«"ò…7Þx£8m»OúÓ²µµgYYkcUMÃ’¨j $ªš†ÿ—ˆH¾7""ªzŒø"âDD”"RP9PL¿SÕ,|gsVUË»wïVƒº5cL¿ÛíšÑhôÚh4ú™7n<—¦é‡EàÙ(ŠÖ€‡ßÔià /¼ÐrÎýpY–?¢ª×’$ydŒùwEQü‹ƒƒƒØpέ«ê†ª^SÕkÀ°©ªëÀ*к@èi°À8d8ˆDĨª‘Ð<悪bŒÐ@çœs"b1NDl>2cÌDDÆÀûÀ®ˆì¨êÃ4M?”$ÉXkÓápxWUÿy·Ûýdš¦ßEÀ£²,¿û _øÂï~ÓàùçŸO:Î_Ͳì_noo÷˲d}}•••2Ïó/nmmçÜ:ÐWÕLÝU°"ªï—y]dU=\wº8çŒ1ÇÖ-Š‚8Ž«ß+ r9cŒ„}Ykí?)Ëògœs‹¢Ø¹wï^ö K€O|ârÿþýµ,Ëž/ŠâŲ,_‘®]»öêÞÞÞÝÝ]:7oÞ$MSüm<ÓjµˆãçEQØ$I¶s_vÎýºµöJkçλï|]·Ÿ~:UçþâþþþMÆã×ò¢è9çŽuL«ÕÂ9GY–‡ TUòóÌ[Õ_x÷wʯ ˆêdãñ?ìï÷­sˆÂŽuJš$8ç@¬U\éÿ£1†4I°y~¼C«Š0§ã¥ U¯ •×Ðñ'>K5Ƙ~®m»èë¬ó4ÓõÂwq»}ôßTI£h%‚ï—åkêÜÿ°O2ÌÍ›7¿+Žã¿ëŠ¢µÄSp« B»ÕBEÃô¦NŠEˆª€ÏéÔY8özF©uÖ×…Ö ÿ·›$‡ÛÕõ<Ëþ¡ˆ¼¡ª¿þ$àÅÉdò¯ÖÖ֞ﯮ‚s䓉÷ã•?Ãúú:ãû÷¡(AN¢hÊ¢@i²À9Ö>“ª§Êµ,°–sÙýÉQI‘ÒZ¬sˆ17×ÖÖþÆõë×ûÍ7ßÌž8|æ3Ÿ‰ßzë­¿û2ÚsÀ§ÎJ€¥ÂÔW^yeSD>}še/¢ §¹„êûº[˜·þidœw~‹žï,²¾Oî$þÜíÛ·Í¥+€ˆ|øè<+=«*Ìr Mþú<’¿HP¹Dœ8ŸyǽDUùx'xpÙ.à`}ÐO“ñepÖ(ÿ4÷ñ˜Ài$Ì·g<¼:½´~i]FRgÉñ²Ö¿hÐüuÛ' ­/¿qixõÕWW]¦uÌKóæuúã²Þ&õ8K@zIíå˯O/âE,ÓoÑ@ï,ÁÛEÈúÐ>zûöíîeàMþÿq)Âi.çým– {ÌíƒÀÚeà&þþ»ÇÞ.»C/kÿBÖEUDu]T7.-PÕ§D$y?pѾµ¾¿sí¿~ÑIX¦—ɼíf¾ 9*­‡¿yöÒ²€³UàÏNãèZý¸õÑÀúÂÑuzM9ÝFª†T>Ÿw‘e ×p)ZCKÏâ–!@ÿ¼·H¤,T.˪Üp ÔÐ)s‡^+€¹:Îù}8wä™À‡«€$lwЖ³#*piH—$©\oê:áÂJ¦`WÓ¬ël"@]‚µ¡óO€œ‚ª Xù2j ¤¬º‡e—ÅVI.ªqõ†*x3çŽHPý>­•ÏR%Á”á_¹JT pìBÏ9`ÕÉ1ÏÒuÆ:ç!Â,4Kùä”8aâK#€øN9U‹n^ªŸ§$¨àØUº5ÿ^õ׳|¾Ö:þ4U9ÛKþf©Æ¼ýë ‹^êîç“äPÎpóè2 0‘†™3ŽÝa{ ¦—ZKårëcÀW¬^ëuÔÂé5³ä†ÕÒ&=E ªëžfõZ ìNs °P( îï4„ÄÏkti 0l”ó)ê$h_j* M$¨¡No@-& á} fZë kmEH U×µ UËrqA /S¶ Iú«ÀÖ0üCßW¹®þùDzWþ)š¡ ” ˆZ ÎAŸf$uÀç¹”¿#Ï?-ÀÎÙ½LØ D’ºÕW MÑ|å}t©C‚?S<ÑYñÀ ·0ý,uا •mªä’Sefœpš,CŽ“û¡º{™ p_`ŒjB-zgèSÀ+ÔÒ¼C…¨ºƒ&ð$3Ü@SÐ(5Pµ^Å›aíÚ´Nƒë*鿥} Ƨ´`ûòàÜ}`G`õX°W­ 4 éµ ø¡ì×]Àc±@“[¨<£t; Lmr îENäi8I¨»Ndïò\€êªï"òì!èM ϾIòëþÿX\U‰9—~Í ›ÒÆ&`êïg‚× '¬†ëYÖÿŸ_~ãѣѥà·ß|óàµø QýT£å7^ÉõOD÷ÔÓ9ÐXFzȇ~½É̼êÇÕà”÷§ ͸ý|b„=üÞYȵ\åȹß~@ŽÀ¦C©põKºæ¯MÖßÔO Æ4¡V~Î"‚6åðMjÐô~ÑÀo™8àdº¸§"¯_>TØAu³ZªOÒ0Kþ™•ç7X¿,àÿ´‰ 3ˆ sˆ ~ÿ¸‹’ ¦Ô~»@¹¯··PýÊ¥@TßÕ/Ÿày¯§tœôIǬ²–ó꜀p–[zP³ö*è'‚¿èÌ!Hu:Y`Äó,u9©Žÿ'‹ã‡—N€ßzûíO<ýô¯|¢ê»N¡® Xþ\ƒ_$uªes Òø1bÔýü kgFê)Ur±î¿DºX"òßßxôÈ]¾ ðì¿¡ú·V'Sœ#õCɵAŸS)1ËR¦`ΰzj œJ‚Š›‘zºWÙ·ÌòûõÿrQ “ÆñGÀÿ:c‚±<Tõ÷DõuàSuŸ/ ïë*É ,›ÿÎú®éJŸ: š GRQ©Ëü é?”ûÊ6R›ƒh¡²îùâ‚_Åñ;¿y÷îî'oÝú9QýÔ ÿ\›[—97_4AÎbù3QAoP‡zzY šü}=¨lR– ÉóO'Ç‘Ÿýüö¶{l'ös¨þ ð|ðï«à7ý¡êuD€FK¬gõÀp†œøm^Zyʹ^„ä×äÿ7íî:7Š$y3L>'ðw¯Y³œRäXä2³ÖXg Éò›À­úû™õ„&W0Ïï/YÎ]rü¿Dä§~ëà`ÿ<8ó…럺~ýU£úŸÎþ–~YY¬n‹ŒfH›j §Õ.«Ó›'¨üM+ò—~c0xï±+@ÑjýßÖxüÓ¢úÃÌ™g·ñOW¯)8KÇœQË ÐeN Y'E}ÆQ—^^U/AŒBáßžüs)ÀŸÜØxÁ¨~NàÃMÝTç¿°œx–U/1ÌTˆY÷ÌIÙn&Æ’™€Â/—Æ|߯ ‡Ûç%À¹&‹~{2Ùz¶Ýn‰êŸjý¼n‘Rn­~žW-“¦\ºáR«Ú-RÇö-pâbÎcëÖÞû½zþÔnÅb±Û¶ÌëQߦù8ûΘ¿÷«£Ñë\@;÷”•ªúïê_øNNI…bEX¢tªõ¢ÐÇ:q‡Ðœ:Â\ë}ÉtQEÞ°"ù—Çã/_¢‹ØÉ­^ï­ÄÚ®¨~U9’û“RG]fkrÍ 7qʱó×mú¾få Éû)粨Ü/´MýX"NäGÿÇdò«\`»¼;ë3iúù}q-v½ÞòS¹Žf_ÝÔñ D93à3È%µBΉã,àÛOyÆ>ÎI§"?1‰ãŸx»(ÜEàÂõZ<´oþhsEíFW£ûû†?ÜŠÙÍ °4Wå´û«¾øêêUÙ—Ú~Ï3`s¹ý¿ÿóNäŸýÚpXpÁíÂ9žîªûxÛÏÂNÛ86MAJc8( ™ÊL@if Î#È|õ±y‚.)è”^ ›¥´ðh,Ÿ8ó~i2¹”§_FoZå§wG<neŒsesÅÒi)÷ÊÖ$ÂjCw‰5KD÷ç &i¾lK.Ȫgo³íøè åékÊ$‡{òÿöÊÁ/æ\J‹.jG¿gÉ7r¾6ÉØyV„ÎSk˜g®ÃjG) ˜äÀÄ(EôôX`á)RθMõÁ•ËøisÎcÕsÿH•ÊZKYï*Iy {>øð€ìé’ßþÒîý{\ @ôy°ß®üá5a»“ðÔzÚ)”%´#e=õQ2r+Œ a\ ¥ž_:ÏRQ[hÿç°êEŽå‰ $(ÝÒHyoîmƒu”£ 7ÊÙt~á“H€h«>œÃ·YXÍ- &>Õ/ ( eµå ‘ÄPXe"ì…ÒÁĤ”¥K«ïC~é"PÓ襱VâQK¥—Àz’MpV¹Çü|?ùnÆàI‹¦3RôkÀ3xa¶BÛ*L ?GD„«ßQÖ»ÐmUè¥ÊF[”Q)<Øö3Á «^œÎ(Ÿr)\B~™Î1@9¼‰J±þg´bXïÁzÏ{ƒ´hÅèjÝìSNJ&†ìoçdod„§jR²ÀÍS—M¬~??ÝsÀó|t7sˆÄ;8-,2)<ÛE|‡$1ë;!%Š`¥+öüBAé”Q.䥟%Ī_H#Hcÿ>/!·'‰²ŒÜ 2PºãÄ8«ŠÄâí¶ •(±ñç>)„<‡^K¹±+e^FÛ)ôÚ€àF%ÅÖˆì‹t_óŒ…x~2½ù> øàð-øéc_¾ øP ×W ¿‘¦Æ‚f%êbƒD”Ö„EéI‘Æžq‘@'õÖÑoAj”V¤¬´=èÖ ‰ÀzGyªkByf¤9CgÖ;°ÙSŠÒŸßt½è h$ÐŽaµ×úp}6V<رuÐiÁjדõçÐïÀJIc”_pðûì¿[ ºÁ覉åè9•Mhð¿x!ذÐA2PìAA)*ÍJˆ Ò1Qf¡e¼µµ‚…$22&ÞøÖû¾S:!Ne”ù¿ì¬¶•õŽW ga0??JEçgßa|< í¥ðÌ5Xëy™¾·ãϧTF&³\‘‘£]Gxuë¶ ßõdn·Ž:ž„ÚIp‘EÉ¡kp~B$—¤ ¹¹§òÇ.Á?%ì6ðµ°ÜÅß < ná± 6ñS“¿ |G8©5 Uˆ&àv!o[&ƒ ã j­C¯k•• zôZGVŸ&ÞjÂÓaM¼5¬õÂD^™ïàØÀJ[Q…nêÁG½I¤F!†àzPç;Õ:/½ÕàËH˜|*|ßoÃuXíÁ£xoÏKøZÖºþÛØr¬ŽaicãÿÇáMRxâÄÆÿ/ùßø (‰=!Z) Çp0 ‘vžì òhD²=ѱ•¾DQ‚µkøgÜ ¯_Á?%ä>°ÖØ ^Rú{À‡‚å~žúÕ@ P€Û†Ì"±±tKG*È(E†]çV¯—*·â`YÁï&Ñ‘õX à <Ú÷ QZÈro-yéןÊguˆ½¼ºtAØ®€qî×™—ïk#YjrdÅI”(i7׃u‹÷Õ¹õ¿k˜­{ [±wJ¾Èø) ²uá¿¡Û†ëkÐiÖÀÎÀï{’ÃAìÿÇýv2ÈœK0ÑSø Œm3,«Á¿ƒŸ X–ñ’ënÏùÿP|@,è@¤(Œi[kû0F¢42Û=ÌÐZÛï8GÏúì`R@œ{«e0ë D˜vE+M<8–'H”CÎÇ\þ` ÑÈï·  ôZÞ²[‰ÿý½=û#¬Iá­6 Áj'õ¤ê¶¼Rı÷Û“Ü/Iì·vâ÷OÅ%ñ`î`o…E³ÂûyãÉÐnÃ0ói³ªGúžvX¡‘iЇ×NȾúøØ`Šã6K‹–š(2¤{ÏÙ?þÔŠKU«"…><¢Â¹k6ŠÊ$ŽíÃ"V hM¼Õd…ïüáÆ™ïä$ößã?‹ñTHˆú ßÁ¥ –"ènÛ? ¤²ÖÖ ý¬¯ø×vêI6ÎakÏ¿/ ¸µáåÛ–< îéÆ:¬tý~&ìüñ;©'€Ÿô∠Fà`ö¼[Ãøõœúýæ¥'zb¢ÜBfá@„û‘a›R»SZ;©í2u¹ ÓÀÐ7°ËÓÅÅK)~ºø§f_âE‘:çDUqΙ±µéA—»&*¶J—Dcõ²y__–ønÇwj‡BRˆð§~"+|ç'‘—öRýºQä—iJ7•ò(øÝiÌ‘„Ü<1^æ“8È´…§Öüb¼½ on +! Ù\ñ0ÆUÄûï8òǰá“@€ÈÀ óÖ=)`­‡lôCÄùÿ0Êü:ㆆ\o;ŠÈ+sYš\N“˜^ Dˆ„˜„€púª­QE~Ò™à{üˆ´Ë² c5þ\0rÎìÅñžZVËÂFO…TЪï°Õ`íQä;Ú©·2玬¼zKÝ@î+«mO þ: ¾<™zŒ ®§(üzO­Ã¦ƒíŸMô;>ÌKž*–ßO '0Ž=˜Sk–GdA¡&…5À»~VÚ^¡v>ÖÙÏ`ì`KáKÀWM)ôøõhÕ‘l2²kÁò;;¡NP^44`xjþ霳ÖÚ÷¢(JʲlûÍö¡5Ž"3T倣m%V˜”ʨ´Þ‚¬ó–smÅËü£< ûcŸ*ÆáìÆ¹ßn\Â8R”δäÃD¡ ßjVB¦aŒÏ†Ø9ðrœ*üñMçMNަFBÚÆQMcªT„šÄô»±O!#9ŠòÇ%ŒJØ)á-+Üq®:öC±_EHýßÈôä‰R ÌÛø§¹<Ü©„N€"°l+óT@UË(ŠrcLË9'Q)"2ÊónÚj1Ž":G¤Ê:«Ð³eʈc!w0É”Žõ²Šñ‹ßYe¡Lœ?+޲€‰ƒ±Uz±O­©äÜI╤Ûò ¶R°"¼·¯L ï&V;pmÕÿ¾}㣠oœ‡È½€ýIH+CÚ9ʽWýö¬x);„G9|e_-aGAå"¢QXkwsù…Çiaîz¨Ên¥ž,ââ%¬Zм‡wU+Á5’À9çʲ¼oŒÙ3Ƭ¨j/ŽãÒZ›*DEQøÇ«ûÉ \&bw¬M¤PF‘ ¹&*$…²áåF±Âv& ƒ(¤cyv:>P8/«¸P3Aذ¤TŸ!C°Þ%8ëc’N0¿NÛ¤²vG°µëÕ(²ŒáÄÇ&Ä9ž(UØqÊ®zå3#_лö,Lœ‚+‰ãxú euÎíE1X`(B*Ö˜5|YؾZÉ¢ A³H`s"20ƤeYŠª&QµŒ1ëeY¦ê ÿ6™ì‹$N {¥âJ%Ñ!DÖ¢ˆ»PX b 7reU¼¼·ÓPfåÈÏ­/¾´&A~v %Qá–*b¼[çÁœda_­ M|œQ–ä¡/­v½’Œ3O€Ìrè&&ÀH„‰Æ;ûq4ÊELž¹¶µJ©G~t:î`­%IŠ¢0"r3Žã¾ªîXk³%b´8,r°Aþ¿ä¦z­F‚CÞêÿàTÎ&"2Úªšy) °’$vR‘8wl”(ØÁÑ" CŽëk€ ¹úzˆ®ñ˜íà ‡Q)Á „‰*­©ë(K% AÜ8‡ý1ÄIÈÙKx¸çÂ:Øx’”at³ø•ž—dêÝÒžSF† CUJkÛêÓ"Êò¤kž>=ÝZ‹óéN*"IEà å§Í¥Á@'•".#œ„Òã+ » bNŸèZB\³o|él¢ªƒ¬,sÇù £a'Óh£A¢ˆÒZvD¸#BK+(&ò’Ý é a72¨…,w¤Æ 42 6³¤!ÓÈ­Îr)lÆ>“ˆÂïãơĒ[Ÿz-#ëÓ¸!p žl´Rò¢ (K“$ q{lŽsŽ(Šˆã˜<ϱÖV3)«ªÅà»p ûÁ5ïw}áiàTöƒ Dáàyˆ@¯‡˜ ™£G;²ö@Dªzø<ˆÒÚaE™µ¶3c’$¡ÕWª ŸKIDATj‘—%_³–Êζ ܰ°Ú&¼› 1¨ÀÀ)Q©dÀ¾IDb!),iè½1ÂP•‡êƒ³ab mçh9e+ôh ÈÅ0@©ŽÉ–ø;6'€c¬1y>ÓûТ8ü"rè÷§¤qªZˆÈ£9ò_µü2`rx; ¿  rAÂ~nš2dƒ@‚›!6h7ø¢¦Lá˜R8ç\Çé4=Ú5Š"e®s”eIòž­¾XBo½T"öJt"FT-‘s‡¥² Ã{ÎáÄ ªŒD|E„ cØ7†LSf$Á÷u» l‘—%±1ÄÆ”ÎZSªIJç(óÜuDQMÿ/ê›"ä"2‘vÇ L¬µ£²,'ιrðUË?Ýð¥€ÉRåàó\ •°o…ño ¯.¡ &ª]9÷¸q·1·œsVDJUíªjÇñpÖZâ8N³,ëêŒëø£(Ò´ÕšEÑŽDç0"XU kI[-lQMç9Œ"²¢8,XEQäKÇq¬ªªEžŸx¾bšúˆÈ˜ÂY{'ŽãU…ͬ&åSü¼SÕ÷‚çÜs.µ~‚ÎrŸZ«ÇäÁòï_~øü¤ ÏuU° '1 0uŒIøÞqò2~9Î9«ªι=çÜ1f""ûeYî”eyàœˆH."+ιÆ_ª‘1%PZç¢Ò9)œÃÄ1Išæq»ÒÚh‰;N>F¾Õj9‰ytëÇšlbÌv^ûN5&ƘÂ#ªW”nÜ!"»eYî9çÆªj+ ÎºïEk딡Ϸƒäx=(À{¡ÿy¨ÊÐ$`?¨åA8É,ün9ùø™}}åÎ×ÃËšë°qwsix®°ªª?šÇQ´]Å–snWDFƘ2LokTõµv "}U5"BEcˆã˜8Ž'ƘmU}X–ånØnmZÌ:vqD’dι÷‚ßvÖÚ‰µvÇqaŒé·e16Š¢ÂSãPà9uÚƒšÅOÝí^Ä¿ü!ððf°üñ²ÃÁõÌT©ÔVC5êVX>^¯…Á¤•°^â„hFaî¹%IÒnyÚ™"2²ÖîTRÎÃËúŒ1‘1&µÖNŒ1‰ˆÛ\À=O šÈ`*„Hk¤èTÔ¢[Y:•¥U‰¦„H*ĘG 3C1æÉwݲëÖ]TŸpt™Öøa…à ØãJê\rAwÿ<ɘGS±ê¤n«x»ò¾Us­"ĵlcÖÍ?³µ*àSЫÀO-=¯ŒÌM°“Êû¬R0Ë+µ{Y–þõB€Yçg*nÃÔÆ¾ã ÀIÃ7,ÕýÌË4fY}Y#@ÝúóÚç¢fÕemaËsRGB®ÎébKGDÿÿÿ ½§“ pHYsYç2tIMEÞ âpø IDATxÚíw˜TÕùÇ?÷ÞéeËlïË.»t‘¦€ ÄnTD£±Ä‚˜Ÿ±—$±£Æ ±FI5(Q‘¢ôÞ–e{ŸÞîÜóûã}Yv–e!î~ŸgvÙ¹wΜ÷{ßóž·èC¯†Ô7 ÃtðÊŒ@ݯZ`%°XÄúð¿0 8%þiS”´,“‰,“‰L³™,“‰ì=~6Ë2¡XŒ ¦Œÿ[³Îïg­ßÏ–@`0¨ê#Àщà"à&•ÛíÎã’’8.9™!NE9è <1•Æh„&5Jk4JT€Iƒ¦±Ðíæó––瀟öàèÂ`à.»¢\:5=Ý8&9™QN'Nƒ¡Ý7Ç„ IPP R£F¨‹F¨‹†hÚ~ïwH  Š•?VV£B¤á>jþÁ£ñîK²³¥ ³²ø”G59mM, ºiˆ†ÑºðaI¦Í¯Rá Ž¾é#À‘E!ðÖ„””ñ÷––’r€§}'Þl­ãwS·|pHÕ¾3•Ó7×ùûpd,úiaaé¥ÙÙ„…@&è/!ñIâú­´©ÑîCpóúzÿGjä^*|ðKsrJ/ËÉIÂ(I˜e‹¢`S슂CQ°Ê2fEA’$\²¡»Ç‘¼>0Óþ@é#@ÏáÏc’“'ÞXP°K *’„,I(ñ—A’0Ê2VEÁ©(øDŒm‘àáÒÃW ʲ¿9J÷ôà0ãž<³ùЇú÷G–:¿Îq7"ã \äϲý¶‡çXeùÁ'ÊËI2t^7«¾ñ»wýžšä Åé8ª`Æ t[NÊ$˜u_i©Tj³%táGî&4±ûùÜ¿˜ÿô0gLÝÝc4kù†>t?ìÀûWæå%Ÿìr%ta@‹ñ¥¯m¯ÿ;iÌÒR’xêg?áí§ÉÉcA’ºgC% Fô´¤7ॠ))Cgäç'|á·±Ûåc0(œuâ¸]¿//áùûn¦±¥/¿]ÅWKW±¹²†ªú&Bá.8ú„Èï#@÷â–"‹å’ú÷ï’º[â÷ìõû‰Ç 5iÿõ?ՅS&rᔉ»þ¯±¥uMTÕ5°£¶õñŸëilnkר”$¶ô û0É®(¿ybÀìJâÛ쀦±6èÛõ»Íjæ¦ËÏïôõ®2\);¸ÿ~ûjá2f<ü{„Ø‹›DL¾·ÏèäÊðÎýûŠ,–.Ý`YÀƒN%Iâ‰;fP^Ü=zÂø‘œ:x $üáØ6øAv½ðú&ïÆ>:ŒÀ;3òó³&¤¤tù&K»Õÿ­W^È©ãŽíÖA>ùÀÍ\UD“'R´¡>°îsP{z¢”ï)~;!5uúýúu9ØÒ4^m®AHpópýô³»ý5pØm¬]ºVÚ %ôàÐ1-Ïl~ê™1Ëò!=ý+#ž¸c?<ë”n\‹ÇÇWË×ÓØê!/ÓEn¿…ƒmÀ¢{JJ†ž“‘qH7R%(¿ïÇddººmpo~²€-Uuüìª`h‡œOßý,?ûï×ሦ•5}K@âxåÜŒŒÉ׿º•ž\–Oñ©wóúƒa^üǧ¼üÏyü}îB¾^¹$»¼L×~žÁHTeúäãQ”ö•®A’X¾xµ¡*–€ÿô 1Ì,·ÛñXYJ7¸dÓŽ-'yPñAŸè§^ÿñÃ˹ú¼S¸ôô ¤§$ñÂûsÙRUÏøáå{ïI3R;t§ç¦³þÓÅ|ÓÒZ ôXTðû°Œv*ÊüW‡ 3ç™ÍÝròkÏÁ5²¼CCÎí Ð/7³Ý¿ !ö¶§µ™¤Ô´?÷/¿Ì]³ÿKS$2 ø®'&ïݘ&Á»÷—–v›ðÅGd]I\Iï~S} ~¿×Éd9(rŠs)±ZiŠDNï)ü/ïdàõ+ss '¤¦vŸ)Ù)ÕÙ-÷JMÏÄh2“‘S@ÿ!òí$pzOMâÿ²¸ÿ¸¤¤©3ò»7xæ(Êî>K1[TÒé÷ÇT•‹£$ ‘xú4@û¸2Ûdúåƒ ¦uuNýg÷ø—‰ª1üÁ0Íõ-(’D¾Åb&ô-íã|—Ñøòï ’RÝŸCy°õ¿; i‚Uõü{e-¼ÿ ùgΠ®V/È2™†÷-ûã§¢¼ú»•‚NFø<ªÚùü?Yžà„1š:6@#Q•uuê‚ Jr&Ååƒ6ºŒa€2g9ヌÝj¦¾®€LÃú°fàñ~VëÍ—•í4”ÚE0CŽçø»U•ÆH¤Ó+ŠÅÔéAÕWW²½¦‘1£Gíµܸ£ž­­B¦d\¹Å 6‚ã2ÚÍõ*--eÜP}ËÙPÛ„dô`/œ*ÁÏÍÌ,»µ¨K¯ªRÓ?žôÙâJ`™¨p{ÛÎþ@°;’‘ìQ~òÄ+Œ{üøS ñåFUUÚÚÚ°Z­  J;A ¶Šu|ÓZEeeíNÕ€I×t–Ã=Áÿ ®`8(RÑS¼U (B@=z+–>92%Ûd¢%AõðφÖùý¤¤&ñè“·‘“ÞékWm®dA£‘™7ÞD,C–åƒ.%kÖ¬Á±õsî¿ãiÜm^\&™ñ1¿Q[Ke(t,°¬· Ü`W”ßYŘc6óhYé >éúV,;Ç~{)©I¾Þ óu³…©çM;¸jóûù⋯øì? H3™Èˆ÷Ū*Z¢Ñr`SCJ\u^+Á¹KR™ÍÆ™ééL:ˆËø¥ª*š¢»m®â’<~ülvkB˜½¼9³”O= Û>UHÌýÏ'¸Âulš7Ÿysw÷ˆ(²X°* [þ^_ÿ9prßpè(Ž:--mÐíÅÅ$`[øçª*š£{Ý%ý ¸þ'S>°8áö#,«h¦¢ÑMnNNƒFªÂaPøóso³bù†]ï5J;KÖÞª«£"<øWº×—ðëT£ñöÇËÊ”áÎý>¯ÕÔP{€jž&ËåWKVvz—àóøô? yû9„‚{N®ÙL’Á@C$Â+ÕÕ›€Ð¥.4}8&›eùýGËÊœÇï“2þfm-Ûã6@»[&ƒÂ™gObÌøô/ËÇ|½¾‚ºšF¶lÙÁ’oV±pÁr¢Ñý3¿ŠB^ü^ÿjld­Ïw#ð‡ž˜ŒÞÚ"f¤A’>z¸¬,ëÄ=ì‚÷êëÙtêƒË³ùÑEc0Û˜¬vbZŒ¿ÿs9P D ¡µ¹@ Ôá},ŠBÙŒ"Il y»®n0öÄD(½”a 6~ÑÒrÁ`‡CÎ?}Û‚A"‘NÝ ¹ÕϨáùH"JÈï!ðQ·¡š¦ 5(¾ Æ`›@/I“$LqÿÅž…`E!ßbA‘$šÆÛõõ"¢i@ÏÕöF\ëT”/ò-–‹SŒFù“¦&†8d›ÍH’Ä:¿ÿIÒ=s¤$8ãýƒBÞf“³Ù€Á¨`³›Ùº¶n—j5HívT!x·¾·ªîj9“b2‘c6#ÅVïÔÕÑ>¼Ò““ÑK€ŒÞfuzŒ;°¢÷Ëýø ½îz õ0×ÇúÛlw=5`ÀΈõÑ(6YÆ¡(¼ß H’„CQH‰{Ûsê(’„)îvÎ+Ï`Ô„R¾‰Ê-z+¹› Süºæh”ßmßNe($€¥²$ I7mU…4í6àÙž~7¦O¥Z†ÈKbP–§Y!ÉbÀ ËÔzÂljò±´ÒKk0Jk@­×„X ¼ºq,wp:{zÀl(q«*ª|ÑÒ‚ˆ ø€k·,Sh±ìJH@ˆrìär¾øp ™#)û8¡"šÆËÕÕ,r»g¹q¯¦8"ýŽ‘à‰qÅ)S.žI†£s!Ö`Tcc£Ÿµu>lmóø"±×âÖð†CO† U³† 3uÔÆ«ª´Åbx£Q6܃$‰b«C; Ze´(EaGv:Ñ`ˆ°Û·×{^¨ªba[Û,àŠ#½JÝ|¯IÀŒ~iÖK®+»¬]¾YHÕøï¦f¯m û±‹ÂØ®;--íÅ_÷ïÐ7î‡ñ«*š¸U¯ª‰G%IÂ*Ëd›L–6ZͤJÁ Ç’^ZHóú­,~ê/{ûb1~¾i^U½ x­ ßljÞëÐÍ!Vw ÀOYº­,Ö?¹“A÷싉%©pÿ<éJÚòëë/2ì|æ--]^çRFJ­V ­VdIÚ«cèŒH¯ªR³=@SUJl6rÌf"¸6×læê¼< ¸jß•È%Ôl\EÈïA–÷×dMmÞ#@IAŠå¬Óu5˜­Œ¾ü§HñZø±žÅêÿ.Øï}Ii˜vÚêwû@®B¸(M·ñ÷õûMøð<IÃ…ÀCè!S€AÀ ¥ùÙÛþp÷5·Tüûy˽×NÃ¯Þ ¸ÝD‚‡[ ¨*ë|>6l ©© …¨ …¨ ‡Ù ±Ùïgs @MX?M¤Èj!0ÆŸZ_ˉØMà=±ukuƒîxr$c±·ŸÔØêé2M ½òÌÁéR‡5ø|Rß~ô%©9™¸r³8a ÿ~òíkŠ‚\ZkëIË×+rú·~JNªqƒŠI)ÄàþEXl6 “‰üÑ5ÒìÅëîùzåÆ{–­ßÖ4¢¼(ý®+ÎcÚäq(quýÁçKø0a*€¦Ñ¼iÙC‡îµ~vmÑ(‹<à0ôÏ)þ$ÉF#²nºcˆNŠÉ„OUq ¨šFHÓÚMm÷Çb ç5î‰~n_  GLÙ¥i©ÙÞîø¶Õ4TnH6“rÕ¨‚ŽsäÌ™¥l]VǪy/Ð\]»K½Ü9âT쮩)8\)X<ͼõ‹GZjêº=8Ó]Œ™yWOÚîgœ–WÈi“ôv­þ`8Ýnݽ}þí~þÜ|³jÓb3 I»ø:$«²’‹‹þÿ­_Ï%YY¸ŒÆ½b²#,ªñ,$o,Ö.jô<„%;§¸g@QÎÏg=x“ÁjÖ?SQ øÚšp¤¤ãkiÄáÒw6ë+ª‰ÇR+N]˜ThR:~‚&üxçܯWÄ M£µ®æÊjþùÄó8Ó] 8a4F³£Ù„ÁlÂÝÐDÉq#sþ8RSˆƒ<5ýz í\ŽýNá/Û°Ÿ?÷Ÿ,\±øðA&þîCï8G®¯¿cRZZF{Ù@í!¢iܹq#[Ÿ´´”ÿ_ü€‰„ý{hLw4º+ñs÷6Y0¿­M‹{;Ïžú¿éSKž¸éGzš÷?åºóOÅ‘šÁÖå É8‚æší4·4óÕ¦¶TÕ7›7.íŸÖñ–Ïž–IjáîrhI–qåfãÊͦpØ Ì6 ']9}¯k*W®Å•›Mf±>¹f» ÛƒÅ•Egؼõ©×øÝ›sª„÷Ç]«;/œLÙ5Ѱåö Þ:-=ÝpVz:ƒ;(6iŒDøME«|¾w€+—ºÝ_¼o2¹0++áIN3›i ‡q™Í»ŒÄ=£[àQÕ&àÕ!%Sž¾ýJ¦ŒÎg‹WqñÏŸÑšÝÞϼ9{d²Ã†"Kß°µº6¯¿=køQº˜>–r³“:¶ü3¸œÍžšLÕÚý» ÚS’Ñb»­$YÆ’” þƒ[ï|¾„gÞ˜ý%zä1t·¿çÅú½W_Õ{õõ3gæçç]‘›»—sfS ÀµµÌmnnR…xx½<ëì76~•i2•OL°!…A–‰îa̶ìC€5UUe§gþêúéS®8ëDdYâé7fsç3³ZbšvðñºmÕ'ù@sÜ%¼ðu‡¿³0ç„Ö”ô hÛ?îp¥ ïíÁ4Ù¬(+ø>¨/¿[ ðN'„¿ËGßA¼ü§ªªÍnj:î¤ÔT¶…BlôûiˆD¶Oaïpt#pÚ+ÕÕ_Yd9trrÂ7MdI"‹Ò44ŸoUc}>îþý£d *AÓ7<úgþôÞÜï€ ÷0î¾à0 !XM¯ÿ–ä÷傤æfµCŒBU{·ÅKÎL#T‰F¢Mv´êN®xzjv„BgϪ­-V£÷åé¨GßvS^¨ªZ4ÀnOJ䨙4‹…ˆ¦aŽk›š¦& Ûô²¿’ &“1¨„p$Êe÷>Ë{óÍ.èŽ'¼;ý¦¨Ú±$äñìÛþ|· jHÍÍnW3hª¾ÄÔõ[*Ð4Áﯸ‰µËuÃ6³xÑ"*++÷»>Ë• z1HWÞûÐ?¤s ׫B¼¾ØíN8è¢î17a› -ÞØªßNÅrÆMðÞ¼Eïg÷„ðÖ‘˜†Åx`Î|ñÆ~w̓d–’UZDVIY¥Åd—Q¿¥‚â‘CÙ¼xîú&?µ›¶òÈ—ñ˹ïÙ¯‹Ã¾ëïË×P¿u;c/8s·^†P#QL'Õu ˜öÙ~þû“ϸᙷøjùú:M³zxÞFîÓ¥D,†OUñkZ»1ƒl“ Y’Ø³ÌŸÓæ=;Üæ}ãH?Q,Úܸt|ñ—ÛÆÕKp3™› W¼ªÖâ°cOM!%;“Âa÷·ªV®eè){Á"ÁI.<+3yÉf4 ZB*áhŒ¿Í[ÆêZïÀï8‡,#\q°5 ¨(xUýl›,Sd±`SLq—°1~ ©C–1Ê2˽^„^ö}MXW÷>Ž$@Ç•»£,…öN¤Ø±zE#ÚÏÈñµ´íŠì¹3HJwQ·n5#rãÞG§ÅÀö– «k½ôô0õÍ›)‰°xûvÂÑ(Y¹¹”ÚlZ­$u"ïàºü|²M¦©ÏíØ±Ö£ª·Æ·±G‰ì–Uµ†"þHÇöIâ÷눽cÍ ‡ jß²´íŸ8j4›xîÊiniÙ%|Ðs WÖzÞ ‡VØ÷½ÕÔ4÷E¯7Ö`³1%-¡G§„¿sGpnf&o ž;%-ímàK`䑸"‰¤ÉÄWä²4*R\ ’žü¹GpД’‰”YЦ ]¸Ÿ¾8‹§DViÑ^7Œ†Ã|òü«„ü<ÍD‚!VÏ[Àâ>¢|âPŒ¡Æ½¼tBÀ«Kj„/»œ#”G¿‡Sh–á)“G%%ué&VEá—‹!GÑ Ÿï:_,68îø9jÏ ð´ø#—•¦Ûð„TZQ‚ªFò;ƒÆêJAKÞÿ˜Ú-ˆH˜žû #¦žDÀí¥µ¦ž«7°ü£y|øÔ‹Œ¿è|Í­l[¶šïfJcÅÎýÅ 6Î{»qïáÍÝÐÌŠ¶9ñµÿHãD œ‘ŸŸšh„p_X,\™)e™ÍC+C¡nU=hâ0wÙ©}ÿâ[N*:ÎbwýG¡ËŠ5þ»lk 1núL¼-~6|ú_‚Í­ô9›‡@›‡€Ûƒb40öü39åÚKwk„¨Êâç²ùó7±Çö¶7}9Qµ±Àò#(øàñNç´› ; (uðek+¯×Ô°Êç[‡~vÀ߀ðÑ@€q©vãW3Ç(;S"¬F™¢ÔÝk¹;¨ÒÖ8ëÖ‡øëõwqù§ÿðØâ¡Ûp8ÊÖ5›Ðd{j2²,£i‚ÊUkiøöchܺ÷¾xâ³m¬«÷ß^ßô1z=èaÁ'w& ·ý8/Ï6-+«Ý’°Ã‰-Á ÏWV² ­-‚žùDwy »š¾°Ù5Uµ…'ŽÈuêÙˆ†Ã¤`ˆˆ6£B,¦±uÝrÒsrHÊÌ%¦ „™³ÉdÁ CÓúoÙðö3X¢}ÛØ²=2ìÁy·7%éÝ‹srN´¬Ì8*)©Û»“w.£‘©ééŒJJR¶…B“#‘qÀ[ÝA‚Cý6—*²ôò•cr-YNŠ$Q˜jŤì¾ms J“/‚¬ròé„ý^6-šY¤&Y° 0ößFT—U³h»{.zŸ@Í· ¸N†_œš––;³ €î<¤;pïæÍ|ÚÜü$pç‘&Àà§YùÁ©Òä!Y²“LX Y"¬jlo ¡i»5w’Å@n.åÕµ>^[R#}‘ç€;èBÉS`®’áÞÉii…WçåQlµö¸pcqçLG‚ ÆbüxÍ*‚Á Ñ£™G”{ZÇWgÛMʈ—Caª_$ƾnñL‡ —mÿ8'Ì¿W7²°¢mGü^Ÿöà$KÒ½SÒÒJ®ÎË£«‡M z¢I–Ñâq…Žò *‚A®X½ÚÑ´þñ-ã'ÀžÈî’%iƉ¥)ö‘ùI˜ 2’¤¯ëƒ¾k$=K¦Öáíeu¬ªñ®z6Îë‡kÛ³§¸F–¤;¦¦¥ý8/Â# x€P¼Å}¼?0QM#vFøÓ޼ZSópûÑF€]ö p pp"’f7Qâ²Ð?ÃF'Âü--QM0]ðŸôÀ|Ÿ\¡HÒôÓÓÒR®ÊË£à Þ«ªH€Ý`Ø%ˆRUìÈ6 jÓW¬7F"éb]@Oš´2PŽ^ënGD5¢—F{{Àys9py‘ÅRzvFgfdvŽœé |ñœÀƒa¿-e[4º_k™ŽðQSlÙò@·ÇŸÇIDAT0íh'@OÃL®¶*Ê„É.çddÐÙš€Ã5ÞuĦ(´—PâŽFq ~*€k׬aÏw*0¯0¸¸x¸Óé8'#ƒÉ.VåÈvÄóÇbÄ„8 aç‹ÅP Kã\ãóqíš5«…QT{#dàRàæ4£ñ¸3ÓÓ9;3óˆXóZë’„åÂU…À£ª Ÿo°'ز…ššn&ÁVsß¼sŒÓyÑrrŸ’Ò-Hw×ÖÎoiì`LÍÑè!Û#M‘ÓW¬ð4­ hèìu߇N¡ ,–'_<˜R›íˆ¸j;¾£Co_ÕoW”C&­MQ’d^êñ¤“@G5ù{@€p #¬iGÍ€bñŒà$ƒ¡Ã Ž ´Gÿ€CÅ¥ÙÙäšÍWÅí ^£ªƒšüGCÃ$«,†ts|>QD5 Uˆv#Ý×6p¢êqG’õ†Ò§--ÐKÛzÕ. øüõaÃú—v¢àá@HÓˆ ¡78˜ÚÒ4÷öhB°=dk0H ^\+õúØÝ=å{¿ìÒÀ{ó¡С>ù>@Dˆ. ¿&æÓæfVû|»„¿“ÿinx®7-{bÁ ¯wºËdJd·÷¨ƒ'š€ðÚ†Q–6ü"B°ÌëeßOlŸ›&ÿhh "\üLœù¾@ðÁ‚¶¶)*d×ÅlÝD ¾¨¦ujÍß ·ªâHÐá#%[ù´º®Ýæ•Á sšš¨ç¡»„ý½U€^*þúr¯wLm8\2!5õ°m …D⧘&‚[¿ÎÂïd½jk[÷2þÖûýÌnlä·{“GUïDÏH(qæû 0¯ŽKNþá£eeÝî BÒ´„↑v.à#qp:Öùüõ™ÿì"Ïz¿Ÿ%n7nU]‰Þ溘ö}?4Jž`·ßöÔ€Ýýk‹FI6ž@o,†èÞ­›%,crP ’¨nRyøOsØP¯Þ¿ÖtÇõÜšm2=ùÛäîØ"¶©*Î.zïš"œ‘¸áè·U… -¥%eßÏÍ·œÍABâ’g?«·×Ýün.…ïMÇÆkS”7éßß6.%¥Ë7ñÆb(’„­‹[¸ªPˆ^/Q!˜USCu8¼=¾n‡Ðó"jóW?{Ù ËÍ.F^÷è"ðî%¹à_Xì„Û6n¬z»®®KÅ!MÓ-~¹ëÓ¦ ÁP§“šp˜êpx ÐŒN®HO¶³ J)s2³—mXp¸&¥7`¹&ʧ·oÿú'ëÖí:)¼³Û=ª’zˆvD =ùsƒÏðL;ûõü‚ìL9½ I–™óÕ2ØÝA´Ûa ÷¡8q™Çó³ËV®¼u|JŠkJZ]©X¤öŸì…Xåóñ÷úz†9ŒOIaTRÖµ$oÕÖ²È㙞üº/ õÓO‘iõøY´zÀâ,ߢWKÕs€¯ûÐIM <â·_¶¶^³Àíþý××ÏÀTUºÃ‹VçCÄv?˜u‘Q!x©ªŠúHäÖ~¿ò^}ýFYžxŒÓi:>9™ÑÉÉ”Ä[Ê·‡ ~?¯×ÖòYK‹?&Äãñí[{Ù;…y™zÝá—®&¦iÍÀÖ}Þ3xÞ #Æo²~ÐOX»9‘-ao%ÀN„¼{ïeØä &+Î䢇ÞbNq¹îtâWU¾s»©D^Ž«m€ßF5;Äí>y‰Û}p’E–°ÛåÁv;™f3šhB°Èíf©ÇS‰î£‰Ž[»¦§èy‹[ªê÷Uÿ)À£¸~ Hå{xòúƒô ÜX«w5½­Ã½ÓNwê¤Ñ#h««¢¢ÉÇ™÷¿²6‰^Y “ç67Ÿk”¤c£B´Æ·`·îs½½¿à‡q#ѾÂë=v…×{Ž.Œ(z'ïè\óã܌݅½£¾yOœ!ÁK%;½ø¾‚ünzƒl_:ÆIƒúåÝÿʯnÀi³òïo·qÕ¯^ÚœŒžRµx,*„Î'ZúÑTÏ?„q¹Òw  `ð‚fŒÒ`£4ÛõŸ×“@Ó©ÞJ€Ì$»íÍ÷s‡ì´YY¸r#×?ò¢8—ýóézºUêÎ% ¡Åð—b0lGX­è+€þãKè %úŒÀƒl}ÿöÜÝWg,Σª¡™óïøŽD/£çN@è( q‚yϘfK\èUººYø'°’>t ÷\zú!–¾#ü_ÍÇì'€{Ž¢ñmn™÷ñÆÏÁ®×y tm¿½IÄ >Q&ŽIýr3U÷¯ ±ôqñiÇ‹¸qw´À`P÷»7\¼—ð'°êä“íØ}8²³€bƒ¢TýÊCB,}GJ»ø¾¦„]W¤Ÿ/Aü¬ÒßpøÛÎõá( ¨;Ä4f]ä÷MKïÑ—åA–=rÖgªêuï!Àm;§ª×ÿù¤O̽‡SóaèβxÝù}bî=¸çÓ/€f=;öë>1÷\RãwêîT½x²­O̽€Ü»çÑ”}ê¿S0|äO‘½¼X£¯¯õ‰¸÷`"ðz™ÔràG}Srpü?ò±JHÉzIEND®B`‚stem-1.7.1/docs/_static/section/tutorials/windrose.png0000664000175000017500000002564013157571677023654 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs¯¯±}tIMEÝ %"øÜ IDATxÚí]wxTE÷>sËöÍnz!´º -€H/éŸQÁ(‚Q,ØÁBWAQü Š HQ:H¤&´ô¾½Üöû#Ùp÷î½»ØÅ™ç™'Éfï½3ó¾ç33gæ"¨åI«^ƒxò³å¹†õ7×—q®_L–‘\mnì_>ªÊˆ¢R£4·ÏDÜ£Ö%þI~åïd…J†9­€ñ­¾òw$øìܧÖïiùõF*•&œÿ™˜ÔfÀþE à–ÍÖ©I¯jÔ¸©Êlš$öCÃ`ÿëZ~eƇáXã–­Ûicâ4ÃÜÿçI„Úªÿ&Àx?q„ÈT zõ@¥V¤.øÎ¨eÖ*AÆæª!mŽCxDdÃ\•»þ/ÕÔFÀþ–/~ÀíÎå<9Ôõ¥Gº÷ µ;—wà©€°+x ÷©õƒPú+27œÀÛ†¸®ëÞ籸ºªá<à_µY°õ À:`Xݪ/6nÖ”J¬Cåÿ„$¨Õ*€ÕbàA„MŸÖbXx¸ð¢˜¸:á4}ZË#&q¯¨áò/ôü1 ¸“ÚØ…ÀÛ† ¯ïÕw`ƒ6wáWà x{ÖÔpùÇ*-›à8ûPOV/èÜ£"&†º¾'1'ð  ¸OÀ‰þŸDµÀP¤ÇEqñõ@¥$[)á@m$APƒ¼Id—W‘Äð‚¢F ,Z'uq½„Ýõ̃$Ñ9Þõ,Ü^ ê"ѽn;â^^ì;ªÈ²¯¨÷OQûºÉÈaR÷Ií?8ì🠻×yЕ×1‚{r®g©ü>¿H"`AßëâŠV½É¡ò˜ü‚ËH’ôºõ"£˜‚‘€¨#¨6»Óv«Q¨°†1 fkšÌÇI´b"‚Øô-Æû°úi%o  •FQŸçŠÍܵC(R__÷®úÜlM“™,cE,P–PD6 âõVûS=¼‚¼­ï„Ã?þßIm«‹aõB|ݯY‹–!Nj[]@w;ô¼_íe²í ¨h3Bšœ@)AÀºj‘“Ch>Ë2;ä!¯|Ì0YˆÏÅ»eH)B‡8à4sª7A¤„úºÁ£‡j´÷Œîz8èÃâ}µr/}„Xçnh¡Fõµ­FtÂJi«v“š¨EFƒ!-$êë¿,Öé±"ǯœ¤¼ú£>VþÜ@Ž5õÄñæ>ÁKy¸ Òê=Áû´°ßk‚z /à‹ ³ØfDÓò‡9Êô²>2j©Z™¾³èyDPi¯crÝy )%E‘kgްZ*KeV³’òBòrŸ+”*Ñ©cDü€j9‚r–.š)òÿ¨ãBŽ©4Ê&ú°Ð cÚËvF5 ¬*Ž'pörJªð¿Ì”LÑkè€Å·½5¬(»ÕsrÙÞ5œÌÿž7¦#òO8œk›âx#¿•i×áaÍųk›ÊeÃÏxéªæ|Ôß>¾êNj“×ýµ,¢Y×ÞTÁyF¯’™/Ÿ.ªQ%p‚ûrÿh •Ôªyù”Ù<lŽïß—A¿A—àOƒã€sœYŽ*¼âOÿN^”k–#¤±ù1àDü)Uò ¶Íñe]YXþІý_nÚ¨£ìꪉe ü_èOÎ,Îm4^!FRѾH!{Úâ(£Ÿ¿¶eAQÂÈÅa‡Œ({¨c'ù—[v´Lî,߬Ôô:j¼~váÆ)GÂÈÅ¡‡Œ(ø|ó¶˜'&==3$úÝ_Ô® "]ƒ7Ùwkp–Ë~”À[««[·©}ÕQ±%úAHɹ‡ÊLŠOí gT³~®Óyð[m'ÿ €àꪉå_®[zýÂDZ?÷o"`öA›r^ º'ËÁ˜uò[Y›>¹Š0\$()ȇ'§NÓ|úÓšÎõ›ŸØŠ+> 2KOÜ‹3ånmœ=™þåoJlÚ”*:YD•¤œWa™‘zÈ@æÄõ&£oK¿¤ký>ÿÕ8MÅ.ðõJµ¾6ýª©hüÌ{‚MïÅ ˜Z•1,Žq–F;·rJ¾\[I‚‘å%ùРYsX¶ko|¯¡mh#?\Ȳ¹PHô‚Gólža:Ý8Ï!ˆ‰Ñ±lžöNž-¼‚es5ŒòƒùáÉ·{i}¼:¶)8EUàÇԭ—w]7ÇÒCc®F@D‚8±±¾R‘vÝVTþåÝËÌ$X¤w‘€”Éà•ù‹ô¯-ž;8¢Þw¿3ìÊ$W£¹¬F¢{ ¼ô¯r'õG · ¹ÓºõèûX[SDÈ(ö\áóeü:Pôª–òÍïŸxsh³é1BV~ú$ƒ üµË¾6eý}ë¥â•«ÞæD\?±,¬.@trGFÍú6÷Àg,ù—GCIA~Å4l^ø²»Úõ ¾S…Î}‰ã(eeò‰ !¿Ñ«2Ëæ§âx«;ö¡»õJ•GE•§ ïëdzå¼r+ÙgÓÔß·›öKBx³®8Üí*]LÝús- ~übñ9‡qÖR?&ÇjVÀc¢¯Ù=Ž5u›ø÷Ê´–¡\$ÐñI Ñéáã5¿FŒŸùßñú˜9k(jO=PVfä" îúLq;SÄ¿üMqñõ@©æ¹ßÓãyÂ2(\å¥èýñŒê½5õúŽšÐê¹å„ªb.ª|£ |†¦aÖ¸§o•ævœäOÊúƒírbc|ùh©£\1ëʺ÷Ê@”ž~F±pㆤÄVgW“ª¯†€ª2+YÁoô*«c²¢r·•¨× ~ÃdEI=G¤<*PÑøWCe±Ç~j5éÛä¸N£ª‚Pyà‡ÄÔ­Kg½Y–wƒû@F,̇ÕúJ/*À ³¦ï,½pdo饃Œ; Fù$ˆ­W–îØ=pl§×µ‘s3ìÍP È F 5EÿÙäíþ¹Ó”:`PNè ñ~T fØìpFùÑ¢¨ŽÉo´Kû9Z^ÜÁÁÄÿÌ_‡è?7n=À:¦ok«`Zÿ½T>`‘uüÌ˿κIÛŒp› C„$À0 &ÎzOóþÿ–tm°:ð_®$4¼ßUüßY.¯;Ž'áw[‰NÝzâ¡¥Ýy÷>«ª üÒÓ¯\Ýü™º5øªa¸ø?h]à[Í&øøÅ)7 …cfòÛF øš> ªH ŽÕµ±†„—ίz©Øu=&> š·k–ýùgGú)g«ÃÎà8»®²ñ]9´Us\¬·ð/ShX8hBðXÞs´nÏÐpœ]GËL×5C·{ù—:ºúmÜÆ•à›ùàÌžôߢ›1Óq<ÑÂo@0¬?( àGWÀ@EÄ-MãÎY³ ÖæùÙ. vâÑf! JÌúæ;]Ú'¯ô×ÇÍÿŠ¢4®^ÇFË0—êbXœ*PujÒ¼¹Ša.Õå=ÃõÌšÎHä4s¿j4tÂÀ–Ï,Ðá2÷ÇòÀ×ðÁßùë/¶sÇ.ÿF`ÎV¶ãK‚~/f¥üÜ9}Ñm_]µ—Þw,Ј‘ ÛÀ!äÒ­¿7hÙñül¹&ý?<@t £™c)ÑV¨ ô8@+SœLá?BrÕ0E½Œ9m^\Ù ªÕc¤ðº ð'[„àçå²>Ì´•O[èø÷ÍL /pÞ¥‘kêþÒ¹ïÓ 8Žõ$ÁàÑ1„EEÃâÍ›õ£^ì>L1ÿu–ÍsÃ09É8Þ<`õIy¸ „„%»îϲ±Œò³×⺷ûO›)?èe!žCÍÛà¯TóÁç8Þ76¿8çáWR:]íà‹ÁÚPs¯¶†Iú@ËÈ>¹ÎRù—YÌ7ó/’ëc!aÔõÄÁOZÅH0zêTùܵËë4þ9 #÷¶­IïOø—¿I©RƒN/׀ކ½m°°UÓ’žÿ¬q½^DR ¾U>ÀйŸ˜n]¦–ÉȾÙ<à½õý÷Ÿø19Ä÷ HvÊÆÂãÛOnœâ­SÚ(h|Áãa­©í^Y£SG7IðWM±-Y÷ƒJþÕsg¸M+Öœ¥íS×%h6Ø“>ÿ¤H)[—€,O½uqõëùŒÓ=ê™G› ’„éóç):¦¶Ž'ðÖ¡xt@yöIñMG¼£ÀpÒøö%ëW*£ãë¹ýr8àý Ïå G½%!ù÷Ôòÿ xÒÀàx##mLœsñ§7 ‹+I œ8øI» ²3sŽ'¼ðÉmÚƒœ.“\V¬ÿEÇ’õ+Bðæ½üryÁ­øÏp¼±AÄòE‡|µ‰R+ZJ C£2¯í/:³’ bâà11° e…v¨Nø—¿ 'ÐÊp,#¾sÉúr1ðïØFÙuò bÇdxqö¤Ú©Vù „çä/37ÌÏsšŠ@œóäq IpáDXŒñA«D‡öíÀtó´øÔ’õ+dbàJK`áŒ7r­åÿýÒÇPóÑf÷$6s ?Á ¤¢YSïOÏ}ÿR¹Øý+I ›8ø)ŠO‚]ë¶‚ÃÒ,hÕ³WopÞ8$*½dý R |€wÇO(+Îî:! åÅ\m"zEwQ–~ìz•Ú† *ŽH¢sž£H±íæîoÒ$˜KNüí"Á™C'àN¿üM‰M[St‰>³dý÷„øë–}cÏLÊò]îá/ï†@DZ:Ÿ;¼NûVq¤£…(qx¸cèÙ«7$6m U¡ /ž:,¥ÏøEš9ïÏO†~Cžð üGƒ¥ì)ÀPÄmkg³A¡¾JíuÐGÊ ^ãzÜámÇò(ë+¿"„ÀÈËæÊl{evVÎ '‡¼Ír>HÁù« è÷gžèV-ð ŸvÅÒ¹"kÔ ¡™³ äò3í´ú¢¤\×¶CŠüÑýåÉmÚNH WuHà/Š `ä Ñ`.uß31À°™@Ó§ “éà VçA´Í ð¤ë•à[ÀZIGe¦DH 6KÈúA†jù ¼?N·=ïxn‘âT*æR Nê¨+ë¦Öâ1Íj©ì;p€6åá. TUoc¿$ð‡þƒ/¦É`˜‹@Ó'L,{Ëå#³Ÿ$ºüEàÍóy àÊ4/³¼ŸR¡b¬Ÿd$òxo}º”7/¹d {SËrÛ:DDû(Ul£ šÔƒB:u뉇†…ßuí |ànÀ%g†9ÇPÌ #˘׽CFö;†cu"$SÆ2°HÁ×)Þϰñ¸ð,gP:ë’#£KS**9&.V×ë±þÚn½RåqÞt°Ià_t´ÀÜrÐô)#Ë•RœÅPÜ™løi él"D¨!ÄH"~ÝÀ=¬œãhÒI­k¦ »Ù[­¡ ëÒ³—¦Gj_5ßq fŠŽ­«[Q-Çð^€¡Àˆ>r’è ‘,{«ÍœJµ;¾0sœµêŽ'î’‘Ã/ DP>ÔAŒHd˜évÚ©K$_­&âÄa"cY'õG}µæï^Z½£gˆN“Ò±“ºw¿º¤Ö)^·`')%S€{¾ïär(æ²…ãÓì!ðä=2rà5?Ôñá/p„Ä´-ÌŽIH;IÑû#Iòp÷°Hº¿J#¯ß¼e’öÑo…¦<Ü)”*¨)É_%¨9àà€cM—5Ñ€ŽGÃ\lMÓ㬶·M°7¨þ ‰.{I²{a%N´ »fx*à~؈ð2”󟦇0°¥KL, UªÈæõ&èRL ëÔ­¡ ƒšœ|‘ f/6^—·BÞ* Â8ÎTŸaÎu¢˜ŒR§m»8î Ùo2²ÿ’è`˜(òX„CZõLBöq†¹*·;—wŒ««®P`bëć÷ê;0´s>Š`9n÷²;`Ø+ðþüdhß©[ß?‡²挦—±\I)@kå²§xK»”£È'Èl}19&Nû¸R%O ˆŒîÜ#Uß½Ïc!›µ„Ú’\$0%ÃŒ÷ZÀ×_¬¾¯Á%{ h椑fN•sœ±ã˜Ôo*Å›§1,¶Š@™ Ñȧ*TÊÞjµ&"±isUr›ö!õ&†ãP[SyY |òÎÀK„B ö&X&öŠ‘e³mØJ¨À០…[,€—qXÎÍlt`—0ÌåWÔÎÄqVÀH8˜ñ^hCtµ~†›7ÔpþT9ºz¥Y- æ°q„ÕÂ[À²y˜Õ>; €†‘ŠPH'ë ¼mH0-î=øå û^H{æ¼™º¨‹°fS:DDEך:^¹xöíÚfÜ¿{[yIQa‘ÍæÜQgZïÑxsiæ¼Âáü¡#7:`(<Œ Ú…âx²ân^¨ ৯_ çÏœ„×_88ÞÔaé÷5 r³oÂÁ?wÚwmÝT–—]f·³Gór,¿ÊecývÅNÚvå }Tç¤þèœóq@Ð ÃbBH¼}Ž?Db'î½?&.vmݯ¿pâฒûŠåe¥ð×þ=ôöÍ¿•^˺j²Yè‹…ìoeßT‡.Çmû¦?Gr v£Ùy޲' ˆvW¡…ŠFi¸¾È#Çœø bd`}Ì+%ŽÜ#ˆv× ¢])å8ZOªæoÛ=$6'k2–2`·$€ÃÒ øeuÀ¯Nòæ\½ô7ìÙ½ :‹hE$—süt ɾº!¢ŒÆJЭ•¨1aá^Ãt¼Dæmcˆ˜óÈ‚ø®a¡ÀÈ}ñÝ?öêÂùÀa³Á™¿Áîõ[áüÑÍ`5ËÁRJÍH_¿* à I0ràhxêÿ‡cÇOBAq)M@ÖàÐ÷Ÿ ZR€(˜Vœ±§©…•nçe‡àw§ˆ1ˆY=x±tQlüÙâWœÿFÕ T‚åuxîŠqu .‹pŲydlü™^Ó>ÝYuì‹\©„ö={Cûž½àÆå‹0±ß`îÉgŸGÁŸO›±|óÕW\‹ç¾CñÇÄ$}UQž9²;SÒü ŽÅ;ur«Ÿ„õ³àû¨xÎVþ¤j/÷™,#9~2z;&–Éü!އ÷¹jÌ{ß/Ó‘2™hyJ òá•§¦0-Ÿ_Nž9ô±zHx!|³ýtsÝ»ŒÓX(NŒ€‡ž¯ç”«ÆêéOŸ·(_½‚^ð¼B„ þClxÃÈ5?ôöü¨øM›I‚?qкáèÏpUT—[‚O€P€ºaÉúïñÌôi´ ”õ¡nÏ'âhbyªXÝÀ¿sE%ÿn8ÄÈàC¤áÖ•Pô_1u;ú=95Mî|ªá蹄BWQ™ˆÆpõÒßAŸe³!éáÖU'–¬_Ad¦§I’ ¾Û3 e —JÑûâD$›­FûHµ/Ô(ø(¨7¹»¬Dx3Þûßw:iðŸt6=—t «ÿìÙ½+hP¨/B¯aUý]A‚•DfúTJŠ-ÇÎÅBþœÎqfRÄ?/ª Á>¨ðâz›W¨š3P‡}=iò³â£c¤Àw4=OÆ ¤~k8r,#h•P…Ü„íÚ»}VA‚ÈÌô©N‡¡ÀãR ‰ÃfÆÑ²%“Áý ^Ž…¹WéŸ8$J8DtŸ(Ân“Ü©Q÷’àÛŽž'‚ïr¾Œ6šÆú„FÊE7¸T’@–µ:Í!F‚ˆ=ÈÐ&Í:;ÙU) ý ¼„÷2èOêíÙUKË sM—ùÆëŸ©´­áèy 1ð]‰’‡sçN<ül&Ôm/)Õ$g­žj#AÓïëIýWæŠÜ—ÓÿQ"Üë¨OäeŠ˜ÐE¯þà%Kb‚íà•à[Žž¯”Ÿc¸²þcû­¿Žçnßô‡#ЧéSŽÃ[Žæ.zm¦]Ja*H°J‘µzªMHŒ”Có§çÆqªôAüÄþ¾”úþ oÂÈŸCRµtPŸáýÛ´Hi$ÀWIo+¾óF”³m%ÙkOd·\˜kvÊöêÚ­«Ë·>×3µ<çZ–7(³V¿h’@[§Šé8(‰Â ÷€¼¬#âþ‰.Àx (jOlL=NjϿý®ÆüQoàgXe?õå‹™LÉˆÏ x4 †2‡Án³ЃugG§fܺüøçiƒžÌüõë¯íÒ$HWeýø¢EH‚†}_ÔÊ#¸‰Nj[<Ü> óÒÜ aý¢àsEFÔÙ¿èýïWFñ7¢”äÃÄÁ£Ì £ªÅÀ§,epjé³e·¶ïÞH8^›ƒcñ9`ƒ±<ülÆ‘ƒ´þ‹€auκîcñ9æ’sV~ºyãKC‡–JKÄI°.]íA„à¡g?Æ´æqœ]ž¯¤}Kù}qP¤ËíûÕa‹&?õò´ÄØú <ÁµP#×Çz/üI_0ê†õZ“Y=~ TÀä:Éà°·9¾}ãï¦Àõÿ'M‘rœÿ 0:­Ï®9s°Á¬çz¥Þ8´}+%M‚)f> äºh8 ­MΛæø÷•xéû…^?Á°+[$>3rÐØq wðGšÄÀgi'\øñõòK?-ØŽY^žDÝ.€©S%8&o~ýâ…óëX6ÛJàͯóŸáz&It»hÈŸ6鳩ïoŸý¤r§Ý.´žø IDATB‚ÕšÌÕî$ˆi7D©iP¨“ú6ÉM° ‚/5äÃgÙ\EdÝ›‹Þ^¶‹ ôÙóæª<ßF~OH€Yú¥ÓE7{Ú§ŸÖÓêC…à‡¸Ïqp}Û¦sßN=Ì–=ñ´ {j%(ÁgÖ²’°ý‡÷íaî¾ÿ?Ç ³*‚9ÄžçŠð± vÌþ¼kß~}ô¸Ãÿûd¶‰ã8! ´|àr 4õa]NõÃð~llÍïüþªŒ+öêØ»sϽúà·Áa‚ï0ÀñÅ#ós÷ï[@8Þ}ÇòÜVåúÉφîtdûw[/Š9n”]ÀíH~æGùXÀ‚ã -%o¿°ö«í &=Ú;¿(7G„“.„6êH„'wëâ€Oú‚çTî•TUÈIí Œs~öñ\½;ø‹u|ð Nl²\üä9{v³±$›¶Fº+¤ŠZÅÿÜŽãM nd]»kpl‘Ç›H=GP–*bÐö©k.Ÿl¿Ñ)Av Á)*ÔíØ·kÇO ÓÌ)†Eï\ìùï{UeFHa±f~rt‡áù =º_;}èÍ#ÎEUdCˆï1>ÉI¼3 |¼7 F)€„çïA›ýózñ áÓÆ¤½¬á¯—ëcci¸òÛ‡e~˜¹…3Œ,#'œX¼°Ái‰ÌÿŽCÛ³m‹ñ.`$É~ÇÀ=t›òãÙ”@ì6ádÑÍQƒ>x~ò–ů¿ZÆÐ´ êv«QÅÄwcÇ÷ó ûìa2r`¾l ¼ï€õöBj·7”å‡íØ»s›åäß‚¡:;À3f_j#&â‘Ï´ NP2r`¾¹øƒa?,øzþ´!òä …‹eÚør}ã”A6ê.Eõƒ{®¢…p8׫¢ãåËŸû½ˆ‰CF”&Œ\jʽè8¾àñóÆ+–a2úý/$œ)o/TöÖøœ°áå²ÿœ9¸g·©ú8k’ËþsF¤,œJ¾([¬®ã¬ÏOî+ö|Ÿ_={ƱtýO¡™é/”5웥“}nw,×‚çæ™€©APðª{bÙßý¬AÚèq¥ †Ï ËÚ2¿°ìÒ‘M˜íù™JECZ¢}mzÞÊîù:Z¤±•”° ãÿ±w,pœ¥!ª·iCX&€ÛÛäøõtç+¯\*͹Öcî+Óç´ëöÈ E?­ˆJ5¶¬Ñão5¸´æÍåà€á¤IÃà”º7‡wìӧׂw?.î1EöÛç2‹N}–tÎyÇ:À÷6hÖ÷¶ç ÊòÌfòÈÙj„‰1l& Pñ-[þlÎôgcŒ[ýq¼¡ÃZúáË{~;ðìëOŽÈš1ç]ÁîE†ÈV}»8±WÆÛ·F;ÛŒH]„ö³CûO0Dt+üâOonuÅwQ’³÷JxÑþï‹tœ„Ó†’ø]»·üá÷h€¦p¼Ñ. ðÙj–ÉßR 0ÌÞ›}%¶ógÓ¦nížÚ§rO02}øûf딸`¨@«¯ê“¢ëa¿•jËšœ›ß‘±óÒI¹¸R€ï]¯«"qñ•'XÈÈá3Ž|e¿Nƒd˜+&¥bæEÖ_UF/e³XÎÇ$RÈÇ—›K`øŽŸ_ù>ewjä:ÙoŒ=«=Ž'ôÓVN©õƒÒ¢’$s¹1Ë|+·‹Œ÷Hr õêô»Ù ãá‘#DÐåe¦B‡ÝæÇåNà8G!B-1òð+ù±KÊÛV1XÊòÙWNßìŒ3–kenF“ çÕ¨.@XA«}l—¢ÜìW9L¹ ³Oî Q}‘íÅcöêìù<ïÿÞ—ÚTNî9~ôÏÆ£™‹ÂÔ{Àý¤I_ÄŸ2z)''ÒnÏÒ¨¾È6Oj¯V+—QæÂÉ&Û˜¾B© `¶¦ÉXŽz›CØ 9»xŽ'°^†IÞN¯º›JIÉi‹¹Åîí7”úîÿ3J ¼Õn® x3/$ðh#O`)Ë¢iáp¯™­“5Æ tUŒãŠë§¢U¦oõá¥ûÜõz Ò~@ÿŸ?ës>€e¯›ddÿ^ú¸S¢Vcµ¨Ï¡V¦oN×ãŒõaýsM–‘œV½æªˆƒ'õšx¸›†ô6ü”PºBl7 åe t•QH7àÌÀs¤¯¹+Ö׋£(ÙnÕR;\ ÔfÑ€uòÚhAÜõ*ædÑ¥…ÄíßCK{ÿçhª?@ú¸–€&/õ÷Ùn5m(Ålfá „|ùÕiïöß7”ö4,Jì>s¬”$»íõ§ÿd=$Žà¹'m”©à`íe¯Æ|„¨@]‹nd~jQpl”w-òÑÿµn÷ºíjã+A8©ù ¬Vç±01Ž+Žc/@Å"ÔøŸ«mU[ß #æQÓ@ççÁ†ƒî°{ŽÿOÛRlÿÄñ{@€ 'ÃÁªµ|úíßµus©'N”ÊÈûAú ÆšÐÅ= @5¬, ÐÑΘ—“]â9þ/.!ˆvF‘á+6gñ€÷_7P5°Z™ŒÌËxàg—žý{@€®ð¦L^¶uíÞ[·åÿ¤­ßÃúk“ü×vXy“Ëž>r`Ïö²Û8U&—=}¤ãýàÜ¿*à1" ð–öâ¢ÂBŽ­À›ãŒ…‚W«I®P> Àý«nÑ8V‹}çë™ÀrÀqôNû«õ©VÀ8® ϼþì‰cF†É4ÐëAz®ÖZÿ¿M܈ R¼qæÊÅ¿­,›cU)Þ8^â(Àý¯ÃB ‹e-S öRþ»tÁϘ¿Ú’ˆ‘xÄìÛ¬¶]4¾_ÁpŸª€`™˜OÎjæ>¯|+B¨íÖðÿðÛpr»RýzIEND®B`‚stem-1.7.1/docs/_static/section/tutorials/train.png0000664000175000017500000002323713157571677023137 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ85¾lغ IDATxÚíwœ]eÿßÏ9çöé½%™ÔI! „PRI" ¥IQÅÆêê"ºŠîOaUEÝuíÊŠ‹‹¬¢,%$R ! !m2$“Édz¿en9çy~ÜÉ´{§ßI¸ß×k^sï¹§<ç|>Ï·=ßç9”¤$%)IIJR’’”¤$å½%"ùΞ¬Ú¼Ê—¸ÖÄM(±¡ªPêˆÕ”V! U¾}ÚóUI¼‹ä&u“VsÌ¿Fq‹Rê: gˆC‚BP¡å(Ê…¦Ž!U¹Ôeùöë’x‡€^Wî]e q‹@Ü0 Ї V‡QbDµåJR´…Ë÷Lߨ‘$À9ýôQß*¡‰[€„>l Cæ±§òo¯ÜQþï#9ÎHB7Fõþv`¥ÜRs̃ÐDÞÙ¼¾Buh;7´7O‰¶À*5#=G’£½¶¢s%JÝRşÎv#"Ö!QQßbTÔ-”«Ærª$†ÕÕîÓVTìZnIqKM¹ÿg¿ øD«Ÿöæ©Ñê››¨Ó& 0èK½¶\qå¯Ý(…(çÂcŠXG´Š†­¢v¦\>h“IŒôeå¯/EÈ[8öÚ@J}WYÐÚüor *Okö϶#(’`T //ß¹¡Ý¤Ž½v#‚¢s™V…v¼¾E+¯_@ĺôl\ò=O€eÇ^Û¯„î¥Á®?çÙ#  jí7ÅSy¢É7ãlßRÀyÐÇoh 4À>1½2e¥v¢¡I/¯[@ؼx$Çj¸ÛÀŸÙEÛ$Æ$ÀÝë{^Ô ÷(f Ž(Œ®ÿi]ÿG*aÑxKªÎÑ:JÒaÛw¯ÂÓ.pø@Hðe%5À˜E€©†~FqH#£¾‚:C û€g²Z?ÞØ¤ŽÔÎÕ"æ¢O¸ÚAˆ˜Æ' 0f‡›`WFÈTì‘DŒ*¤Þ<Øaî ½ž©¤hOçhõí%@ÉpñÒ,…«Càn{à=î¬:¸*%¢»gÊ^Ê»Ðm¹J…´¥hÒpjR“†røl¦ëÍ¡žýíŠÜ8ŠK»†UDFûÝQD5/£ÓvS?‰i«ÄÔèç/tcÖOh¢Å+õ­GÏICìð´‚«C ä{Ø \rôƒE†2î2"žO†¶"„W3^W3Þø‡\|qÅÁqŠ;\šþXsÚáû_™ùBÓp‚¯¸ˆÊTáù8Âó{4¹èÄ4ª0m•DŒ“˜F%¦Q XqT‹– GºT|á‘Ù®8× ¿ã ðñ½_úí N|Rja-ìÙýH[_ú±4|AX¶/¬9|ãÃõ¥f>Ñ1Hò$ †™Ì×” {¤ {¤¬×3`U´§ý kp³Ñ«¡àöF=y‡ ¥2Ä)ôxø3bƒ¡Mà7oÞœñ䎧þvÂSñ)%Ì1·Ki&!=x‡j×}ê>cà0œ1)[¡lØ"Ó} @Øâ»½Y ßèÀO¤hüó”®ö§[©×¸¥+¡çNµ¹f»f®ÂŽq¹)}Âô­‰M€Í¯l^¥tõ 0Ù)|¢å&òÍÜ„~çbVie?yå•W2’) F€M[7­QJ­ºÁÉ7sù|Ó?ð±Ö뙜…CÙG¡–ÓÃSøhÛu\¸€t·mš¦‹¿=uð©x'ëè9îì¸DÂJDüšÛqΜÀ—^yéb‹—@@Yh:e¡é(¡¨×›¨·5Ò¡ùðj~:t/A-Ô½¿S:H‘2­4òÍ\&…‹º‰²EHìûʼּß·õ½–ê6Ã┑šxç`ëÖ­çYÊZ¤ §7˜¹ŒÒ,˜¦I0Æåp ?ºù•ÍU«W¬¾·WGòËàŸ–ôrøfXÂÚÐ[í§(¥;1t·ÓðõM/oú\/`ŽËu5‘$@üøU^g·¤*‰‡ñ¸ÜØ ñó—¶¾tM©žLàÙ¡Ô{—!_è7ÀYý¢”Âß@Ó4Ü.B Á“/½òÒÅBŒ<{6vˆh˜¸`ú'<Ö®]Fð½³N¼H˜P$ŒËáÄnØÜ(ÖM–¦½kâ7)Í O§î| hhô;ØQ™…Tãk3¥R:;Ñ4 §Ãˆz~7w\}®¢yU‘È$T24°,]º4ü'@®'ÄžªLÚTÆ[µéãzÝ`8D8FÓ´îÁ¯æk°ºóLäÛ…·ó­‚ ›*\‘æQ_K$À¡’!ât žnuN~»c*¬ŸÃцÔñÑ–Ä× îÉ!ìt¿Ñ=„¼Ø^Å4û[Lw`møn:¸Œ®d^ýï@%p|V% ÀêÕ«›€Gfæx™–õ_ê}¶Wf'ЄS­nªÛ\(ÁPP8ŒR …zf·çÀÛgö}+RBC¸Œºð,Ñìš‹;ÒÀ…µsIõwGþp)Q󜦾t¥ÿÈÖç®,«ãWMÓ8R—Š%ºÖÓU×§òü¡Bæäw0=ÇO¶;Œà±›8m}s«GR9Ýáät«›ò†T:B÷¬.ïöºÒ¨a%Ô=yeº4øª¿„óyÂ08¯d:Hû_Ôýœ…u?cVó“”çÜB««lBôÜD)‘sJ€Ë.»¬â¥—_Ú¬š“ïerf€ªV7ASçxK 3s¼½œ8AU«›ªÖ¾Ã®_]SNIF OÿÃkSð‡{n-ËfRF høðå+/?¾ôظ͟Ã<ÓÝý4ŠåÎÊLáõ‚»˜Ü¾žÌÎr¦¶>7l¨¤8LuˆxäÌçÓ{ xÕ ¥¹"§÷¶Îëì>ÀE“[úΚ ùC÷8¤XŠïs\à¬D¡S‘u…¾í#x²I'pXâ0OÓ5"w~q[·:?X74æå{c¦CoJ釃bIiK_Åk×® \Ý™>Ý9@qý4{=Õi«H %&¥“¨Fá]œs,]º4ˆâOv]²¨¤­Ûô†·P³óÛc¶Uô#À¢v2ÝáÞçkV®Ù žºIûPGúG:Žî¥ÔÞ„×1‰žŽÝêÀfù☎ùñMÇ;ŽQû.Ÿ<óyIiOì]ÝÏÞ÷ͳ(fçûblE³§l¡¸bv}ï]ª°è ½zõjÀ©çe ÁƒC†«‰‘þ;šÒ¢DŠ8ž"d?0¼ÜqtU‚†A€›o¾Y"yºÛi›µÙÕí§fçÅj»ý§{2‰6Mqõ¼ÚÞOì±5+׬ïÖ:ëF†1$í@ã6{)¶¨Î•ÆË´eüÆœ»hÍü>~÷³DŒãqE‰VÓ y’¢µD¼{ 4ñçnç®0ªf«Ûž¤;;/v†Àþš<ßWVO¶§»—Ö…má»û\OÉ©ÃmÛF.wôÜÓêJÄDÛáKù3-Y÷a§‡ÿÐGèªEœÐ^u³ yÓDÂA†[—o}™èÌ\òSB䤄h ØQqî4Óî6g¤¦ÝE£Ï@nJˆËËúØþ;¯ZzUŸP@q`ØÉ¡±T›@J8rV²8Ò4Nƒ†éàËŽ?à]C€ûÄ}R¡ºUô¼‚”øÂ±w=· Výï9•Ñíø}lñIl=±Ö£kV®y¾ÿþŸîÜÞÑ´94Ò"íÕè\söµ£ÉñKæ‡R µêfB[!„]ãûÜ'T¤Pâ;òÖŠ\:‚6R&šèyèóúÀ’»NFÇÞ?»žÒ¬îäP•²¾Ô«ãi{ÝETBû<µÖ•­ĘR…çÚY¸WMBÏé‰ ”%‰k¿á8Þ§aù:)1ì”à#ÿ¯oóø¿M¦¹È>´ºØ´A :3À´ŸÝg>¡`c½‰)mFއ!ñuåzÔpšdFޝŸíOÃ2˜œàÊ^ª_qçW\ѱ;µh¶¦´[÷*nU*zé`ó¤—öŸî¡å‘=4ܯápyHÿ?c“î žÖ5={Æ?_ýè1~óï¥?ß3˜_{—C×™>äæœ­J3¡Ö+W®lˆ7Î==Û×'¬8CŒÞ²ýD66CrûE'{Ú}g\uÛù{<Å{5)£Ô·@•œXQÈ– þöf"-1à÷O»É?}îmf½>òÄ/ êf)Z‹!äI øBßÑèŠo_ìŽõsü„-mPûßàuPÑ”ÊõçÕ›ç×[ÂéwÜý1…ø¡€aMÑ6ÚÅß·3é_í8 ï±!ŧ¾|‚·C#ºÇ°¤žø.¯”~Ç@±éÌçÒì¡~óDçö%À–·s™_ØÆ²iÑ$!î‡~aÁQûÊ®¿ˆË'¹ãë•!'nŸø#‚®…>—ï5ºæì—fø±z…9)!r==½Í6¨hHåÖE§º·ÙŸ]qðèYmsQE«©%@^j’#•-þPÅ>›!ÉM èýo?‘ÍGUá¶GíµVÛ€óÑ?Ÿ“v_öD©-ýŠróG_㘥).H·ñ¡i\=+‡Å“3ÈrÛÞÝQÀnŠÜþÊ“5ÖÔhâ¥8=×þG,AŠÝì.%C)Ü?ù-":'ív,–=ÝÌ‹ŸÉï±(¹ihB {ø/Mƒ%NÁšyùL™–ƒ+Õ“?:Rïãñݧy«ÖûîÑ{ÒJfìõ”|q§dæÍÎ'Ÿ½¦[íw©|»¡˜‘Ó3ÓÎ¥½ÆùíÏmÄ8p䬵ÙN+‹×­ëÌNZ”äâçZcò*Õ9,VÚ_™‘Χ®ŸÏì…%½À×ѵyá@sòSøÞÕeüóª©8 í©vSäÖÝÚ*u–š¡zECúác½œÂ.;›ÞÙ'”“ÒÓÓµº\áÂIH§‹ÐäiD\™|ºŽ@ûð–»k"B¶Ð)‹uW.ŠJ¦ðȾCÐ=~3*Z2à©«-ø|„틇>@H1Ç­]Ú®s®„br§z2D¨=Â3ŸÜÏuÿµ{é TТâñS¼òøðIl*E¡Ð(ÕznC·,\qY„¡%6,·Ø½pø ÷–€‚pÐDI5>ËÈ™æÎã•è6¼á)Þ¿Él]Ю†ÇtÃ¥“YêÂW¢³uäóî.72Iã;¤Ñœ —›¼¾,}ôÌ*3kŠK¯9§'áS€ª2²ŸŸ2Â@-<‚5õÌN‹ÆÃ£_u#2Žo÷nÎTlX.y}¡ì“ã­Ôv)ƶÆ <‰}­B=:šãÆ¥ëØ„ ó,-†˜¨qþÀ¯_!Ù½ 1ÀŸ‘%hWŠö/¥ %€DS¿ŸøhÄ}—Þ8ˆC$®¨©1K±q…d÷üÄß[*LAnu+òÂ)‰Ìü%3óÅÊ A¥8âú¥¨È¸ƒ¯#p$@ÿ7t¿g„À;€NÁ²éYäç¥Òd*¶T¶±çÔÀë½i …LOµŸ-B¿gÔ4ñ°¨Ã9Â8+/ÈƘàoÈVlX!ÙsžñkØótøH†Á¥«Ëðd‚ AV–å²¹¢™Ÿn­Œ®JÚ?i$ ×JªS×NË›œ=öh@ñ¬ìgGý¸¯è„د9ΊúÏåu²O\oñý»Lv/9ø)nr‹(ø.PíØôµúbVÏÈæÆ…q_Šò!Õ¼|Ëüm-'׎ñQ«¿gä<ÿý1ùP‰¥ÃwúåtOqS¦°å´Ž£ˆæøGJÕçÀ†•{çIä:Þ »bÆì‚(ø]Ý0bý‡í.P¦Üɇò‘F¼A`»@ܳåkõ;¶ûÏÜÏV¬ùsVAiÙ£ê°e»mìÉ£Ëj0Aü½LßµMŠ4©Ãtërá7˜üà®{Îøn³mP\Ö¿pÅ$l>†¡]"§McùÔ¬:4®ßúµ†egÀ?#×þSãÓ–TŸØ¿ù¨loô”ýÏ„ÍÎËrsÿîKDGJ¸ìõŸ/aÏ&³UëPæ¸ôþ÷ #T—«X¿Òbÿ\5&Ð{Ë\Cñá7‹¯š_¥ê«@Ù0åLÅ/rržÿü`ç{æg¹kuCûeéüâÉ%³òõ ”Rmü¿´ìK~!Ä} yÁ¸;øOïõ§Ez Ú8pl¦æüÚ<Ån´øáçLöÎKøYxÒ®»0Ím‘{ƾ¹áu_h|¾3`+;¾·ê«{Ö¿U^SÑ@g¯Rr%• ÂûÜc*Û¤ôœ~–(ðÇ' Ü\êìp˜îãkÌo¦8l7ÏUã­¬¯Û €°1W÷ üºË$fË„‚Þ?ô´žO˜HUÙå ¯léæ/W‡‡×ý0ì>ì9U“ã”Ó–uLš´£…q”„Àïß #ê.Ö½ôÍ>ý:×5~eqb”u|½%Mè\b¤Åh•š|ź•QàÇùÝS„Ó<Í)et®žÐԈó÷µ>~;9î‘Ô8dÕgjðÒ¶‹¬ušâšëÖ¥à4‡e`L=©ž†½—Õ:] X·BòÖ7k09Ë…#ÍEµ7Ly£?nÜÞ_š¥ Ð"4oèb‚¶™ . %@Ƕ¢Y V‚(Ê_¾Ø"èPÜø¼‡Ì°ý–¿~šXGP¦»™©¹Ð»z~uAÔ¹{«L¸ÇO5àCi:‹–N#³ § ¸²9ÀC›ŽSÓ1xaè)‹*o[ $ÜÖì®AÃÐÊôlÿ–‰N€„:š®îŠö5Í·£ð˺®—¼¶Pò£OGðNµq¹‘É=…LaÂÖjL×\\aËb¶æFGP]¨xä“ÚäÀ쑃_¬Ãõ)K.ŸMfA:B¡‰èjñ¥Ùn¾{õ,Ò.¬lRpω@îL¡Ô£U‡j‡HÒp¯[̉N€„YÌŽ]ÅYº”'UÏÁÃ&òã×¾¬þH¯WÄO?©±l·ÆÜr¶hTÊ",ºf t²5{w㪠/^fqh¦µ×Qüƒ[qÑÅ¥Íè™AeÓ?J#"Ÿ/jäWÛûØÞ üL³…¿·åî¶6€§~™æ´Œ]s—ÏœSœï¡þ8=ûù{xHÂàÝQt¿@Å̘ÜÚ(Û;¡2êúiVÄ)§5Šë «M⇮Å@ñ»À—ÙŠÆE`äº Í):¤Ø`W³¢neü3 øpºÎ%×,ì7 '°ŸDÊJL¹‰`DòñÇ÷¶¤Dðß–4¾¹íë51ÎÜS?NËrºN™[|{á´l§ÝiÃ4åq›¡;=çùÇy‡HBа97Åí4NÝ3SBÒMDÐDtJg¹Þl“T % >S¡ pj§v2mídÙ!×9AŽ#ê´u{ØJC’gk$¿ª~ÑÁÅ•³s™uQiuí¡ÿ !óa~ØPñÆÎ­w¾|oã>Þå’'Ðå´}TŸiI•¥”yŽv³¬,ÊRÇîrlo[ÊòÌm\ž¯ñx¥Äg9¤d¸Ȱubª­èÚ|L¹“o\1óçÙϽëÁOˆèßS P_é½íDçTœÚàú9` <;¦ÓxaKË*ÚÍt\:|f†Óv÷À^{Äzµ;ƒ‡PvÞ#2f(Óøà›W3Å5pãjoa¿waÜßÖ5½Ÿš>0౦2x¡1úûûòK³‡G‚bÐ÷ÿ "È®¼@V% 0 ìÌ¿%îè½í/õ70/åà€Çkà‰l{tÞýO|ÙUÊ“ã| ÉÑ',±­±®£ºÓ7ÄR²J|‡÷ŒŠ¾W‹ÏG©û{o{ìôíóÏäÊœõq¾Ïúy·ã·(-VÃþ®úS=aehà¥nJ]•”fñdí­ÝÛ ]‚,Ô(q‹þÝú׿ôµ†ºä¶ò×Ošj€œ¿€Ÿfä<·1I€Á:Èö'š|¢wvï oø·?†!b³Ÿ?ª¼‡ãžõðf§ô]Ó·ÝLgSÓûº¿ŸI€ßËßìžPÏ%ÁœTP‡â.lX¸õ« Ï\û…Æ—ÛêZ>pxûÛ-á`¯I•RI!å·Ó³Ÿÿï1q Ì‚˜Û­ ¬¾xè§ØD„üoÌþåYüwMÏëy5!™âì!lkYŽÕkužSÁI^?ËÖÂdWU“ I_:ò<}þ¤ÑÕ³ÓmðÐùBúMýÿ­¬‰YõáÚ/´lüõ¯[ò[×W•Ì̺8§ ã¸;;ãÅôÌgÚxʈàßQp•B|¡·Ý¿·üAª‚“ùHáŸHÕ½ý´¯à¾c÷aözÓq¾½‡Ö×ïh_Bÿ$’×Líµ¿,ÉØAUgtq¤ãi|âÀïùýüO¤‡ÿ‹IDATtï¯ ¡¥ÙÔo}Û §{ªk¿)nî[˜ñÙÏbBÕÆèß{[†mÚ·—d)x¤¿j±ñ*>^üǘc^i]Áëíu·‰0¥îʘý΀yF<ÂÏ>ïÀ¯ú¹,kkŸïû½ ¹óÀ#´›éýú×ý“ ×y_.È!)c#€.¬ÿѽÖï3õ×ñL͵\’±‹Yîò˜c~sê3}¾—تcÔ?@m¸°ï~öj¶µ.°-«³6“koìEx/à–}ÿÓÇ×è’Ë…Mì ìÌ¿4 ÷( àÝQxÐmÈwµ]Âs5WÑ`FK£o+z"æ˜7½ ØÕvIŸmEöÓLržŠ5-¦§Ÿ]ŠðzËEÝa^ŒÝfÜp3]µqß‘o³¡ùŠþ?M–JÅ·³à+IÈGHµ?ß-à—½ÕõºêËyÕ·… ÀQÇÙbŽ{¬æöXÞv‚4#6“aë뽜υ®×y¹uå€íúԤߑmë»ß²Æ³íµ—ðÀÛßè—PRJüз³pog^^úaÀïÿäAtˆ÷Wo–êÈ$"]ã%×çý5&ôó[64õí…6&]o‹qÏxöýG©4ž«Y;`»Rt_™öpÌö4ÜË­sû¹óÀ#±9Å•(}¿ogÑåIø‡c„øÄ™OÔÜÆj÷F¶zWwÿ|Cþ_bY×ôþ˜Ñ¾B£–tâ1b—+qTÇlûß¶›ø€çYÖ7_9`ÓnÌš«óžë³-¢ì|·þ>nÉx‚{2äú½娿¬ÿ¡(µÎ·£à!µ{â½8k KUvÇü‡:æ¢ ÙuØ©{ãzõÏÔ_³-ßVO›Ìˆ«gìŽÕ<ÒþΠ8ÔP†×xiÕgÞËÜ”C}¶ F›ì“©4„ó¸uß“ìí¸ Î½‹ñ‡ ”$À@ö­OøTd;ÍÉPÏëM®/øk¬Ãh¦²»}qÌö[-Íf)Fì ЪÌ-èq”øCË'ùhÆù·¿8`]z'\ðq§÷¨Õʤä`#wV=ƪ¬-<4ûkœ—úV¿Š»=Kjï~/`Põ'4««g—’”j5ES¯-ÄÕ¹Ïų­myÜѼÉöJ¶ûVàÒc'ˆäØ›X–ùjŒÓv–p¥ãy?ý1>V¿Ô.ÍèàÑùwð»êO²¤>¦ºOpaÚžÿõ(†ùÍ”ÅMu¼ÇeP¤\ÜXçÛ^T‡PÈ{‘€¥™Ûãzô/7Ç÷Üg;Žð\û5Vû|¢ä÷1˜å8Ê÷«¼ê_É«¿ÌÕyÏ‘ik{¼C ñùÉ?Ô¢!ønñײº*’2Ü<@ÏêS©º—ÏLþ Ë2^»÷žŽ ãnŸë<@ud2>–gn‹©#¨ÏäsuÿE­£„_> øC´¿Ä×"AǤ”Kkïv-«M‚?\ ͪ_[ˆ/Ó5ú÷‰âßódÍ­,ËŒ%@»™NegiÌö©öãtJ7¦20åÀ—üöôûÙÖ¶œl[3¥®Jf¸+p룙N&:€gPêI½n£XŒ™„z”p-©«ôî(|XÀ7œZgÝË wEÜÞ¯âTšß‘ýë:>Ðí$$3=ǘé96ªàS¨ÿJûw›ûy±¶"œ„7H±‰ï"|D¡¦q{?À¾öØœ9ÎÃ|0õo¬=±©+NOذM;%â%%ØÚY³S¬Nöôq!€X\ðï(º ØA¯Bøb °Ðµ‡Û«þD›•ÁòÌmLrm[;€7Pb·ÀÚêÉ-y«}IÇ&#šäÝQð9øå@¿dÿŸ¨ VvòõÙk˜—z Óö° õ͸!à@6\ ÞRŠÝh¼.¥Øº¤¦\d²sHÿŽ¢_*Ôçtý”8"G¤…ÒÊ5¥r/­®IB3A  žBóM*ø«@\3Ä®T@T*AJU)8¡ ª¤Fe§ßªJªðw Ôî"·?¢~Ûu†”¨Y' AizÐC îãM ýK±’’”¤$%)IIJR’’”¤LùÿC§)Ú“^9zIEND®B`‚stem-1.7.1/docs/_static/doctor.png0000664000175000017500000002234113157571677017615 0ustar atagaratagar00000000000000‰PNG  IHDR€€Ã>aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ#$È_ IDATxÚí}y˜\ÕuçïÜ·Ô¾ôR­Þ÷E $!°@ „ñlÇû>v¶™dâLâ|±¿d¼„ñà± ñÂ`ƒ1ްâ3ß$Ÿ1¶ã˜Í,bG€„6ÔR·º«ºÖ÷Þ½÷ÌB‚î.µê|_©%õ«W¯îùõžs.Р5èä%£±)fšæ¶mŸ‡e4®T*ÜÀÉAÂ0ŒO›¦ùõP(ônÛ¶/‰D"ÔÞÞ^¶,«X,e‹˜ˆ¨Ë4Í/ضÝoÛ¶¡”Ê(¥6655½™ÏÉår  ú³€ÅD¦iކñç¶m‡C¡<ÏmmmÉb±¸´µµeíÒ¥KWÙ¶ÝS.—XJ5€¡€E¡ÿ…°ˆh£¢‹™ADˆÇãÐZcff†Öœ{NòŒ3W Ÿ;4>~S±X2„í™L¦·§§gU4Ýþì³Ïn«wsÐÀ+“`%ýéàààû.¾øâž±±1a†³mÛ¶}Žë„::ÚM­õ×u?ñ«_ýêöP(”$¢S"‘HGGGÇ)CCC÷=ôÐCã œxð&!Ä_,[¶ì­7nléêê"fžœ˜˜¸áÖ[oÍž}ö™§f2Ãó¼ßJÅ?¼îÛß>ðÒK/=œN§Ó‘Hd9u=óÌ3}/¼ðBŒˆv3s±€Çٻȶí¿\µjÕEëÖ­K´´´@)õ3ÿ·k¯½ö·étêí6¬ŒD£RÞøgúç÷ÀÌÌÌL©Tz¸³³Óº÷Þ{WÜ}÷ÝK ø<‰tI)ÃÌ¥F"¨¾) àŠh4ú©³Î:ë¬Õ«W‡¢Ñ(<Ï{À_]{íµ¿s]÷}‰dRÊ¢ÖúÑÚlݺuÏøøø ÅbñýJ©¸±Xì]žëº_Ý¿ÿãõäˆÏR €w%‰¿\»ví9kÖ¬ …Ãaö<ïçÌü±/}éK÷äóùÖ?ÐßjÛ6”’Ï)é=èfffÆ•RQ,-"úPssó¦%K–¬©§/Ý€OíÞŸN§ÿ˺uëN_µj•iš¦”RnbæOþÓ?ýÓãÁumñx|ÅàÀ@Tk¥ôCù|aÏî7 à‰è9Ó4a¦§§©\./kmm}wõãwøpKKËŸmذá”åË—BGJùmfþ‹«®ºjg͵ƒ]Ý]#-­-BJ%•Vw~æ3ÿJêü?ˆhˆ „Àôô4,Ë2ƒ{5|€:`~€´µµ}xݺu}CCC (¥¼ÀU_þò—gj®XÞÛÛÓ‹Å ¥|IIõÈQ>ãV­õ•žç-)å½Û·o¿¡ž|ó$f~€¶··xýúõÝ}}}¤µÎ)¥®"¢k®¾úêC=ö–p8¼rp` ÉÌPJ=&¥|ñÕ>Dký€O0ó;™ÙÑZ/—Ë=Ûˆžùý>0¿³··—”R”RŸB|÷ꫯvŽðžÁ¶¶¶e]¦RŠ•Rwýõ§ÿæhak­ïÕZß:Ý-4OR梣£ãƒëÖ­ëêíí…RjRkýf¾é+_ùŠw„÷…,ïïïëI$âRN*­ï>†Ï­Û=ó$c~/€uvv~pݺu]]]]Rî×Zÿ-Ýüµ¯}í• >›C¡Ðƒƒi")½G¤T[â˜'ó»|hÉ’%<ÿüó»:;;!¥Ü§µþkÃ06}õ«_U¯òÞ––æå]Ý]–R’•VwÿÝßþÝL'-ð¾L&ó‘µk×v×Hþ§•R·\sÍ5êUÞ°ª¯¯¯?™H@J5­µºs±,ÌÉ€ €÷677ü¼óÎëëíí%)å”Rê3nùæ7¿©ŽòþÖP(tÎÐðP“0 xž÷°’êéŲ8‹=”ðŽT*õñsÏ=w¨¿¿Ÿ¤”9)åçˆèûßøÆ7ŽÆ|0ÖÖ–YÑÓÓm)%µÖêŽÏ~ö² PÿpY,ûÏgŸ}öèàà )¥òRÊ/ÑõÿüÏÿüZ:|bÎèÇãRí×Zß±˜i±j€€õ¡PèS«V­Z1::jh­+žç}ÀµßúÖ·Ü×xŸŽh4zöàÐ@’PZÝëzrëbZ¨Å¨L瘦ù'Ë–-[}ê©§ZD$=Ïû?¾rÝu×9ÇpŸííí+ÚÛÛ )¥ÔJÝþ…ÿñÅbõ­Ñ– !>566¶þôÓO›¦É®ëþÀ篿þú±øD´vdd¨3@)½]iþõb”–ÅD}>Ü××÷æ•+WÆÂá0\×½ƒ™?ûÝï~÷X[¸†›ššÎŒjÍPJÝÁZno ~©À»ÚÚÚþðŒ3ÎhŽÇãp]÷÷Z뿺ñÆ_<òœþþ¾áææ&RJæ´Ö·}é‹_^ts‹pY"‘xÿªU«ºZZZ ¥ÜÁÌsã7>q÷ë ‡Ãk‡G†š ÀRêA­ä‹Ñ[^ °¼É¶í¯X±biWWI)g”RŸ7 ãÎã¼ßKÚ—¬ììì4¥TRký¯ºêêìbÀ‰nÀ©Bˆ=44d2³ÔZƒˆ~pýõ×ÏökFqáèèH·ïüÉíZóÏk²äD@€÷õôôl<å”S"†a@JùS"úß7ÝtÓñLðNoÍ´ž788ÖZCk}›çÈm ÔÅ\ÑÔÔôŽeË–5G"(¥`æÏÝ|óÍÇ;´¡ Àºáá¡þd2 )Õ^ÖúG_ûú5ª€ú{îsC¡ÐN=õÔþææfH)÷1ó?lÚ´éxK®À)©tê‚á¡¡8ÀÐZß¡´Ú‚EL'"À(}pppðŒ®®.Ckí2ó׈è¯ã¾Iô÷/mni&¥T޵þá׿z­Ó@Æû—ŒŒŒD…ÐZÿ Àu·Ür‹z :5oI AÐJÝ£µþ-9h¸0‘H\¹téÒL8†Öú1"úüæÍ›§_§ôoè[¾dI›PJ•˜õÍ×\óÍ|uò†ñÞ¡¡¡Ñææfbæ,}aóæÍO¼Îûž‹Å.M ! ”¾¬îÀI@æ Âx¿¬ëÊŽŽŽµ===fæ„·½Îû'\Ôßß·¼­Í—~­õßüÆuÓ ,< vÀ¤Ë‰ÄÛGFFšlÛ3ßàë›7ov_¯V‰Åb—ŒŽ4†€Rê0nÇIBf3? D.&aüY_ßÀpSSš´ÖÓZëÿuÛm·í|ŸÑàò¾þÞm™ ùÒÏ7^÷íë³ ,¼Ú·$sýÃ\¹o¢‚T:‡D<ôã'žxì.ø.Ž×ó7œ•H$.M‘oûÖ'ô×3 øÍ˜- øÛ@æ90±?‹\®A®”'Òðgòi_ËÕÿixxhikk )¥r`þÖõ×ßm ^T?ÅVƒì? ü€®+V)Yàãn³¶œ×ÜÒ|ÑðÈP ´ÖÿYÿ'Õ(`v0û@‘ÔýòKx;P¾ìÎàø.{…oH&PJøÖ ß½©ÔÀÂ?O@+(þÀX{ÈïË`g¸ø8€2Žïð†(€mm™ úûûBÌ ­õµàûqR=À€ß†•ÅÏ{™ê?Hò.páßdTpì]·`™mÛïé vŸcÆõß¿ñ²€zðúÉEþ ®—_¢w€Ë›µ@€{ê¿ÀÛzz»WwuuJi ðwnþþ¦§p’R½@ª¹ˆ½ +ù½v.=`&þce¾ àM‰d⊑‘á&Ó4ÁZÝà&œÄdÖ óÃ’ ÈJõ8¬VQ=¨þ© ôSÇxÀ¨â]CCcMMi(¥¦|uÓ¿lÞ×ÀÂ?C@ôÊ#xýy°s vªß;v¿‚Z¾bÉ’¶uýý}!PJýk¥R¹'9-4ª Ÿ&Pl=ÈXø%êApñ~yø'uécüàÞѵDöûã‰ÖŒÖ)ås&|ï׿¾[þ7° 1¿= ½ ä!׸`ï^@T¿<ö{ƒ ð‡æ²mÛ`b¢„pĪìO)âøÓÉ ¼Ž_+(z`,?ü.î¶ æ÷ŽAúàÞPürÀ8ßWûÙlÈr7üŠbu4´q¡˜°PÒò¿ðruÅ‘ÁȀ˄ ó#šA‘U û…_öɤîç«~H cûcÚ@Ñ·¢ïpBÁµâ5JjXiÀEß ˆCò /‚K? Ìʱø ¼ñÒY ˜ëŽˆÀ"­ÁõG›±[½o @'(þVÀ¸àkÊ`÷_ÁåÇ‚|‚ÛÐ #ýQm@äR€Ú—{‚m[‡ÃQ!B«ànÄ^Åg³’Pâ Pè}/SýÀòpávŽ#ŸÐÀ$ýAÊ7²d¾éH13LÓD&Ó"Ré–µ†9~70ºjŒÀÛ¿ïÅ6‚Â(}ˆêß”nÔΆô¿\Âöw€ï™ç"¡{@ì"*¡½½ Ý]iVªR.ìRÊs‚{"ÊÏÔŠ_ Š~=‡EìÜ.þ À¾ ¡tÒKÿBÀòfŽ@D?ˆ¶YÅÀPºÐã kH)-`` zzº{L+Ú«™=¥=ÒZF™‘"¢ £¯†ˆ¿~ –!™t8À/ÈáØ²‰<À¨þ}É%»] „o…´Ö{ÀÎý<ÝÅlž999…-=‰SN1zzzÏI&S£ÙÜô³ÅBþ…R©Tr7VqÔ ãÈ¥tó‘D½\ºP;ªáA¦¯¶žjÖÏ/ÅÖ«gõ€pùû X«ÖèÛ»wr¹´¶6#N5YVxM,n®!£×{µDO‚Kß—„¿‘t<5 ¼ Øø1"‚aPR1 ^0 .å²AÑO2‹áb±„R©Œ—^‡eYú!¥‚”Z‘§Øù1¸x€ýð÷dƒå øQЬú€¨âÁB)_ oÔ$}È|3bž'áy¯‰‡ ö~ .Ü`OÝo¨þÖ`$jÓ4@0¸Èñ 3WÔ´W*€» ˆžØ@Æ@ÍEjîyR‚ ?LÊt#ãWO€Ì€`Yf`ÿu,§)•5?]@Á…½ý`ŽæR€A¡Óû)d½ \üà>ÖHøÔª ž& ÒE} `BJO›>³þV­ç;oì=<€b€ÙzÍ?.\¾ÀD`Rv¿Ž4€ ˆ€HÕdf:ëç ±ÓÕºÿ ²G´‚â‚Â;„ùpe¸ðóCì~ƒê ÈBÀ0ÌÀƒç€]¼¼Í«¦9퀵?ÈZÐ!åâ\;?ç`ü²ñF¼_‡°û/|ˆª¨Öúéšp1 ¨ ^Š}0OÃaû\;?çoñ»†p ïׯ`"V  CT5@Õó¯Vû•B ~PìbPøJ?yt˜Í/Ì2_?Øýò<3?jÛvRa¸®[ÖZçN$§s¾5€BðK=”Ò`f° ž%ƒ›;ÖrPìm {Ãáöô¸²Ùõyü›Ëó´ø¡–––‘Häâd2yšišDdY–5U©Tž* ÷îß¿ÿîR©4^ïfhþ}¦Кá8Ö Í†hEÖ‚ÂWæðá* ¨çÁ¥€Kw؉ãë8.M‰DúÚÚÚþ$¿Û0ŒnÏó„eY0MŽãÀ0Œ‹º»»?ÖÝÝýÀþýû¯ÙºuëÏ“T—dÌ#ó£:A‘ c€ÈÏḮ+ç9@V€ÐrˆÄ{@á·Fû=ì=Î_T~0ÿÀ<¨}`ÆãñÓººº®¶mûžç5 !(‰À4M!P©TËåàyž‹ÅÆÆÆ6$“Éâ®]»ž¬×ˆdž}2«Y<¥çàxŸP¢^ˆ–#ß‚³`ççàâÏù4ü}ƒêîÞ\3ß2 £¿³³óó¶m_^*•(™L"‹!ò,T‰…B°, SSSˆÅbK.½ôÒφB¡™;ï¼sS=‚Àœgmcƒ|03¤”𳃱s#Œ#W()@> .ß .ßðŽÀÞŽ7˜æHwuu}4™L^šË娣£©T ¶md<3##BR©„‰‰ d³ÙÌúõë?ýðÃ?’Ëå;YM€ P/(úf@ÔdñˆaáÈ{ùÓ`çvpá{€s€§,M"¯÷¹c¡Phe__ßw§5•J¡··™LÉdUûoš&¢Ñ(ZZZN§‰D „ÀÞ½{144ÔZ©Töoß¾ýÞz‹æKTsÑ ¹sb[ÀåWîxgÔϵʯ•þ€¦d2yA4í«T*èïïÇÈÈ(Z3()Q.—a˜~TC‚‹ÅQ.•J½„ÇÛ‚ÉÉIÑÓÓs €ïØ}² ªFc}¿Êµ P;À•_€ËwªÛgkB<žÇµ‰X‹ÅÆ”RVk&ƒÑ¥§`åÊ3Ð×ׇ|~ÅbÏ<ý4¶>û .¾ä͈ÅhÍdP.•ñÔSO"_(¢P(@ÑN§›³Ùìžz Íy\ÈPø4@4á ¨½`÷ |'Ø{ À^ø[¹E[[Ø Ú$üóƒz Ñ€eZ°m–môlX¦ ×u‘Íåüß[lˆiß4X&*å2 CÄâñxs6[_CÈÌùR£€µÞpx_gÁî€Ëwîã^ _í^›Y}î€f¥T( aïÞqlÝú „ Lì‡V ¹™„lgy¶n}¶m!‘H¢\.c÷îÝxá¹­èì쳆ֺZSmuãÅ€jx;(rþáé\= ÎoWî°-P÷UÆË\ ê¼¢€3;gžy&~÷»ßaû¶mhJ§„á8vî܉r¹­fff‹ÅДnB¹RÆÄÄòù<<)QÈç ÙlÖñ…¡ºÅ}°P…#ª-Ú)ÀÙçæi°s¸òkÏÀ¯×/.0ãk L@ÌuÝò©§žª#‘ˆøñ ˲‹Å°oß>8p Îbzz{öìA*•‚iš˜˜˜Àðð0ÎY½¿è÷¡ÖLÇ;wîJƒÝ‰@ËMßy¾Ûy E`û»A‘K@¡õÕ|žz \ØèGϸ^Š7ÕÖr @w¡Pˆuvvv-_¾<üä“Obûöí0M»wïF.—ƒÖJ) LMMajj 333°, —]v.¼ðB ôÆž|òÅó¦¦Ê«ѪµÇ€®Ö;,˜I0æX»¤ÅÞ2ü¨ßOœ•»ÀåŸx~ñF½Tîêo‡m3‡÷ïß* Û¶iïÞ½xúé§«i_8Žƒr¹ŒJ¥‚B¡×uaYÎ:ë, áÀIìØ¹—îþ̓–išێưF•R‚Ù«š…ckƒ¯{ØZs9Dôm€HV«€<úx+ TõU½ÿ½ÚDs¹\9ŸÏÇš››“íí퀙™d³Y8ŽÇqÏçaY:::0::ŠPÈÆôÔ“0èg·Ý'žðϳŠÅ¢F<žX"Dè4©Ð¬•[ bªõêD6´ :^mš†_¹uþ6€Ÿla=åȃ¬%Úth ¾‹. Y×u#ñx<žÉd¨µµÍÍ͈ÇãˆÇãèììDww72™ ´Öرcçþ]»vmÚ½{îáGžîs*9® ×uaÛR©TØ4C#ž¤~­¼ ª…1ósà÷Àì(Z•~!Xëí z¢Æé«7Ò5j¹úwCk]ܵk×£…Baº···¯µµ5‹Å(£º»éyöîÝ[t÷îÝ7 …{M+ÖË'andF[¹\!)%¤ThjJ†a¬š˜MNå@\ùe  «,øD€dÿ–ø¦Ÿ`&„ ­•ÚÅŒüBz¿¯ž„8¥3H£S+˜¹255õL.—Û™H$š›ššZB¡%„ÐJ©r¹\Þ===ý»b±ø[­õó*Ò+æÒõD¡GAáËûlÏ“±¦¡”BKKZZZú''ôG]7«ÀåjYüt°F'*(ò3Bˆ „I<ÙÁO\‡Ò_ B´q?Œ=˜Í¬®—RJÈf³Ïg³Y7ø.øû{áW%Oò|±Ë\™;ÛA‘u È[”BïôtÐÔ”B2•îšžVPžÌ^9`¾šKs0W†7P,â @‚aÚ¸4ßÎÎq`Wà'U‚N8¬h†bÀøª¶¨Æö¹CRØ2x•ž—ø³âïÑÚZ‘ÍÎñx •Š3TTÞ•¬s{]MŠ•çJPæ2TÑjùៀišÐJªÀãU¨ßz9/`èž@ ³~H‹Pð̕敂W¥Fr¹TÕìfÀP· ž)‰)eŸ‘ÍÎišH$âpçlÏõ6úQM¥<ÑXÿ_4¨Þëõ«R>]ó3„¶0¤R“έJøÑ: ³»š œ@2êy8ef&t:…p8’ž³‘¹ò k'šð‰ °ª ñ|`$€ÔóF]#y¥`­DÀ„j„PM[ËÉ%UMûß_Ú@ñ'@ò+§Åq„B6J%«Oqølpá‰À·˜“\‰˜ÃÅ ˾ ¨ö–!Œp`Ä   ªQAé•.n-vƒÁÎýJ)”Ë•Àa6MuZ0E-2W9›¹d€tÐ9`öÓÀ¦i†„a&ÈW§Nâãöׂ,€=`çA@g=OBkÌ¥ÙU˜'xVuêI €`š–iv ŠZàdžÕ[8fw;Xí­n,{& Àl |q‚@ìj­Á¬ašL+Ô#„‘ÂìÌ?œä pÎ:ëbUŽÉ‰dÿq  ÈÝ•ÒRB¦i÷†½$ð¬Ov6iÍÕ¶¹9ÿÀ¹×ì½èI¿Ì…Ö †aeL3<„ÙÉŸâ$fz0ô’â€HùðÍ€Aéæ°&r.ÃÀ æÕ“`µÁ#ŽãÀu=†5ÌÈr"º“™_Âì°sF÷÷_4sÙ|zbò@·”ªÝ0DĶír:•Ü“HÄ÷0éüÿüÒçæ{W²Ú ÙC £C‚Ö:0:–û0‡{&sœ¨¦T½g{ƒëzv¹\A$†iE–†Ý/¥³³!o”ΫæDskW8jZµé_n½Ü´Ìõáp¨; Ç£‘ˆ‰Fd!_ÌK)wK¥‡V¯¹ô—ú]wOûŸüèFžæûç#½@ø\"# ¤TКV;ýIi¨`ŽÒæs €j6-vžEÆ¥T½¥R¶mÁ4íNÓŠ­’ÒyþÖç‘î¬îBZ äX.§?dÛù·šfyImÄa¢‘0Éx:‹õØ–užÖü‘r¹´å¡‡ßÜÙ³òVÒá={öÜÇs(ù­úA‘óAöêj‹Yà0{€·à}˜ÃN¨ùpÀL@‡kÀŸò…j;•!¥¶¥W|šù˜Ïz5‰J¢”z'(ô½YJ•p]Ç/Æp]•Šƒ|¡ˆ©©,&'§Íæà8®MD½ºÈó¼ §`Ù¡¦Neªøj¦êô“6ƒ ðPü=€ÑV @½.nô³˜Ã¢™ù€_cOÙg0#,„3¥¤”“JU^ ²lÇ;ϯº]Ûc Ô§@ö§5Ï µ†ã¸(Š(Jð<Ϩ“ˆ.bæsM3] …›v¹Î´ó:ïÛ{¿Ül¹`tWs%¾çÏ%pysй'È>ê<û9Jö Cô1û™.Ó4M¥9¥Ue³šªÑ| R”ž£ 0–ƒ’ŸÙo¯Ž¢;”Õ`¯8yÀÍ*bÏOT“€ªmë®ëBk6„ýDt™Rêt2b3B„Ƶ*yxõ½ŒêHœêóEƒglЫ@ñ·ƒ¢WÆ’Ã|'v .üÀ ¾5w%só¡fA@ì•Zûý¦i‚Èhb)UÚÀ= jæ Ug ¡§ƒ’….Áa‡N³;E Ì!vÀõÇ;°3è ˆ L€Hk†çùe[ÛD´ ËµÂ2PÅOÜHHvíËÂìYÉÀÉ©}&TUIDAT *ŒÓ@ÑKA±?…ÖVç%½l­Ø{Øm¯‡_RÂn›ÏØgšÔ€Ý CZë`oÀ ÑÉ Wkg³…"|Ã`Cº÷'ˆC€¹”xÈ> ërÀÅ]àân@å0»}[56 MÀS>H”`˜ÈŸcxåàˆÖ¼œ™.Ùg¡ˆL@VŸ)aËsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÝ $1T({÷ IDATxÚí}Y%7væGã.¹U.¥Z%U«T*-°ì‘T-5z´¡eµ-ÐmøÅïþ ý Ìó¼ôSFÏc?ùQÀŒ§á±Úh¹%Y-H‚TîÚTKVeeefåró.$ç!‚$ƒdðfifdø¸¸[¬<ÏòC0k³6k³6k³6k³6k³6k³6kÿ™b2ë®WMZïΖL Œ¾Ûƒ™–2UŸI›ì¼}ï½÷žØÜÜ|~¿€ !ÔÝ"„H)!¥üvîH;&ç< ÷òœö¹õïê3¥€ç»MÛñí}(¥ „€s¼½!ÑÇl¹GÉ;<}úôÞ_|ñ^ʉk/QjÀÏþósŸ}öÙÛüñ;„Ÿæy¾D)5Nª.\o”R$IÎ9„^F믲ƒcB Ïó €Bdÿ—¦)¤Ès×»½c „dYfÜ¿\¡óØ}:™LÛëßËómÏÏÏß̲쿿óÎ;¿üå/ÿw)ô1€ € @nƒÀȯ~õ«ó_}õÕýðÃÿz}}óóóèv»åˆ 2a º.&“I%¬À]ÿÙ@A¯×CžçȲ,Z³´ un®ÎÆãq”Ðc„Õét@)Åh42´U›æiÆ:݃¨ìë˲L‡CA!/¿üòÝ“'Oþ·_üâÿÀÀ€Ã ˜~Â÷ßÿÙííí¿¾wïVWWÑëõ$I%,¥¾\dŒ¡Ûë"§È²Ìø?f仄K)E¯ßCžå•°l€´ÂõƘW0±@½÷ú=PR¨l%¬¶ãøªZš¦èöº\´SAz½^2 ðù矟Ýßßÿ—ìxPúªåêÔ•ø³ŸýìüÝ»wÿöÆVVV¦)Ò4E’$•*¢”z_,eè¤!*ûåÚOÙuûeOýÖév …„¢úM½ë~‚ŒýÙõêv;²°­úùõmtàº~·_iš‚RZi?ß~¾ÿ\çK’i'E6É ŸÁõ®€ÀC–exðàAúÌ3ÏtïÞ½û@º2¢¡®^½zj4ýÙââ"Ò4c Œ±†p©q)%RVFà(öÞeRÆ …¬œ+ý¸ÓŒ~ýs’0HÉ‘$IP «ÿ\£ÓVÉIR€]õ—¾¯ËÙÓ?ëÿëçÐ~,Wé@îv»èõzËÃáð5ÿVŽþ €Qù®œÂ{{{BJ‰n·‹$I*0Æ¢Ôx¡1XÐ ŒQ϶·ž$ &ä‰a~Úö ýÎX))3ư·…š0Vi¯X³a UJiô]qÿµÆsJ½t0SJ!„À`0è8WÚþÝò5(¿²@·Û­:C@½·@߇±œ'­öÙF¯KIBÁI’L-h/ù‘0H™Ú}ÿÕï0LÝ4~„ jý]iuï¾}TæL!¤ à€ÊÏŠ+€Î9ò<7„¯Â›¶Ž-.”Ҥѱ.!é¡¥ .]0Æs^Ó¥:cCÂXIãbFhH ¥Õ½»€ãSó¶c­|µ%‰ÓW°ïËåŸ0ÆRÇÊ×€>€TÕ½xe¿t§Ì¶1.'Èçù4‡}Û®7K‰Lºrú^¾íB÷éòUŠWÓ4èkLHÜ<·[—Ï`]ÐÓ^i9èIC¸a6-äpŽ8ûÕfÿ}(®—AU¯C9>9†€q©û6'±8¿¥Ä«…B}âû_B·±ïM™pí7ZÊX žY1a! QÄŸÊ©pÁðxÑTy1^¹ŸÀ)Ï#ÃäδL[HÝÇ ®¹½yÿmfÈçXêý\ôi;åºNí3±rÏ\èÑ?Ûži°C%¢5@ŒÓVǼ¶±ÍI,îI@›£çcàªÏ- 8›ì±û3Žº˜Âò7Êá0WL”I}n/Õç9ߟ¨¯³mE³‚å«í±Ts,± #iŽâ@Û;VV °ì‡°ç­<#Àç0Æ_i•i;¶íäÑ4 ¨€œz`úœÜ ðå\…+d•^uâ4Ü€Ë,¹öWªÏwlŸƒR­.‚¦ 6bUp[!ƒöÝź¢¶(¸:h;+¤[X1¦%ŒÒ¹ i¤P¼îƒ¬¦ãº.KTïpû.kâ$‹\ñÿQ Ùs×ñª\e"Ã&Ÿ pSŠBô­ôrL-€iäÔ©Ú6'Q7Y±umý¢¸[ЮÁu°¶8=Ö¬!¸Uÿt6Zj¾št:ƒm qºbµ†jAÓÆ›¸hq½ßôW¬ÍUÿN bõÙfÜž* µê£?c Al[èó|Ú£tAÃøÂ·€sýCKûú–8jqc¸•ië0XÌrŨ•ã§ïÚÞ6äs]Gå„!®ÞÏ÷¿íÔfYŽ<Ï0™L6ûȦ%à§´:Ñ.vO©~ ¨|5 S›•üISVƒ¤iŠ„%EÞÐÇcƒ@B‚¥¬L@E G!~̬R¡ª0¢ºâ˜1e³s“$(;X¯òñºc:¦Ít¸ÊÅWƒÅ³OØá-;›i')‹bXÊL‚ægÁEU“I)M(²,‹@·×EÂ$Œ¢Óé Óé¢Óé ei•Z¬#mE(% ssèõ{UXd²ìûÆo>$ EvÑ餺 ^¦A6U®yL4à[€=AšvÐR6]tR˜J‚ååeM;Ê Á%µmÜç)útyyÙr6íœÀyQ7™ç9&“ ›L€áá“ɇÃC¤iZ¿, #„TH#šøtv»]ôçú8<<Äh4*Õ‰] HZ ¨J×.--b8aB÷1@œ' |“XY^Fžç ÄSvÙ×*w`i………$I‚½½½"7ï¸÷i*„ ×ëaqa;Û;ÈyÜVUNçYŽœµ®:J/”êä9%9É •,üN†QŠ»à<çÑ­M¶èjœP‚Nš Ž¢Ò©±ÿI)‘çyo•Ù <çΪàŸ¨Ar•ó8çȳ<è—!Àyqnžs ATe–—Ò3mtkÑ5ÞÆÚI&uñ¶*W•06ª3ˆkd* „î¿úNŠ|‹îˆùH›Øð¸ô½y•6GõHQ€/äñåÕ]é`_GéÀr ¼qÑe‹€´¦NÓôÂömI &(㵆 '±Ó2ÏWe ž¯MÓ‘@r‡Le®‰ öѧ¶ÐU¸a;ŽÊêO½Å\°©á-VÇR¼±Çªå`ª}ššˆZ³Äù m•ØSùz!¨ú½é®›€4J™§ýn°L?òÃçðÛÍÛíO¿Ê oØ 0” Ž!“Žꣽ­(Ssƒ§ºÉÖÐNÅÖ  „6ÿ(! ª7¨s'/…>>  $þù >^dÚPÐ ¥â]7ÂqhÓþ¶9{ÁŽ.½uUohûÙm‹V…9<Š±Ô¶˜¿MûÕ Š32Û¾«NÍukTªQÏ€Åj ß(øÑb5Aá¦hЦ¾m³Ú*ߌ¦häy^ÙyüiýMg…DÅ¥±Ô«Ï¬7œ??Á‰cìïwñÛßö°±Q;„Œ%X[;†Ñh„ý}]³HÃWP"ÐO‘$ÀÙ³=üð‡À©Sûxûí¶·WqãC[N¥èjDÒ¿¾|€»8D6|*oíÀØR6m(ÔÖæáJ)qêpáÂI"qýzwîÃamÇææ)ÀÁ4l»Kðö¥Rôz‹xë­ .\ØÆot°··äŒV¾H <ÏïךKz’H$Iæb.D}ÏÒ9ï Ž”) Ær­åÊ—4¡å M(hy }uQßèï÷§ŸãäÉ º¸y3ÅdBÀX-Ô$¡Åd“„”³„ì9óÆm\¹Bqüø2.]z€W^ÙÂýû)®]vw‹{œfåÑ0)­ïßµ*˜/ö'xæ™!.^¡ÓÆýôzCÌÍ`ooœç Ðëß³Œc8ä89òœâ«¯Føâ‹H,.ΣÓIÁR†n·SM QëUŒh’ MV×V°¼|¬áš7Opöl†ÿôÒ=ÌÏwpûÎ*¶€“'ý €ÔËÅ/.Îc®ß³èViq%ROGTŸ%€Ûwrœ9›à©ïmàÇïàýz„Ëÿ¶ˆN· hkIÂ@pò䉯ê^Þ¸]çŸÞÇOr çÏß!¢ÔN¦ÕÒ;µÀ¥± 1Jìíûû{{ÀpXD=ÿ÷‘3ŒÇŒ†Cðr†‰ €:ÙÓ œ>=çc\¾œàÚµ=ŒÇfüŽrÂiÚ)fì4l}Óö»H©âýóÏ4Ão qæÌ]\z…âê•¶·§Ï&º„»†U°4ÅÎÖÃj—Ÿî(•øþ÷ðÒK7A)Çõë§ñÿ¸€½½ºz½.æææ±»ûP3j˜>C– ŒÇ£‘ÀhT˜€+W&(0E ÓŠª$Ì5ßßþ.…¹üš¯H¢ß'xúéÇðð!Ã7ß$ ’Dˆ¹FNQ¦fzÇú¤ÛþÛ2âøüsŠ••%¼öÚC¼øâ¾ùæ1üÃ?ô1?šPôQ1=LMVmý/NðÎ;›X[`}}ï¿¿€ë×cd÷û KK)¶¶(òœj ' Ðç9A–ã1Áx,!e‚ýý$Þ t­Ë*IYÌÒ•-•ݶ\¼8¥7nô°±!@ˆ„µàj"ˆ6ÀUoÓ¤}ëBTûYj9à“ORœ>½‚óç7ñæ›[ØØ8?N¹Àyà9@¹°VsQ+`eEàG?zˆ^ØÂ`ÐŇ.âÖ- )…uÝvJ ü¦Sû4…"u:Ñ·2µëæj Og¶ÿ™gr¬®Žñð!ôýº`K®Uëú™Ân¦LžÍMà³ÏVpìØ=¶…ÿ8Ńk¸r…F…†>Û.4íçJÐ(`¦©Ä¥K¼ùæ&(•øòËe|ñEãqºÙ¡ž¹úª ý¸50¤ñÞÖ¨ëf\ˤ´®$*¡eñ\ZDbmMââÅ (¸y3ÅÝ»¢²eúÂMö±õ%]ô›–ÚÚq¯â·o§øôÓöñÔSÛx÷Ý}¬­‰jå0×$Yõr ¨Íɯzœ;—á/þb++ܹ³ˆ>šÃövaÓÇö tå|+»!¾ª`ßÿöÄ!E±ò†$i*ñÜs««#ìî2\¿N1O.)Î#=àiÎZRšFéohÍ!$¾úŠá÷¿_@ñ'òo½5D·Ûnþ¼€¦ lΔX\äøó?ßÃsÏmc¿‹>ZÂõëÔ˜C{hؘðß’ð!ßè Ë Òÿ$Ž—xúi5ú;¸{—¨¿,›ø47m«Bi­`6I|ôÕ+Ç0??Áë¯oáÕW3¯ ùHÕÿÿÒTâÕWGxã Dàë¯áÓO&á=¶K#Ƭr:MFлHTÌŒU¹¬‹Õí3cÀóÏK¬­°»[0q“‰l8jö².ÕtsY›ÝÑSä í(Á63ÛÛ|bee§NíáG?J±±±†/¿¤e¶qºÐÐduþÇÏðÓŸncyy€[·Žá·¿Ãîn“®m˜9a/Ö-5?H6fa™…4h\¶Ð;2„9j›)qòd‘ô¡TàÖ-†»wy%}Õîè”IÛ§ðk-Xæ>µ­nß~ó›>û¸pá!Þyg§O ©T­¨L@ó^z=Ž¿üË<õÔ6ö÷{øä“%\¿n9{Ž‘.„0L€é‡É†ÏbF=Sš€Ð*–¡ú5C”eräÏ?¬®ŽððaŠ+W$&îŠd¨Wû*þªm6Ü¿ ä¹Ä×_üîwó2Á+¯lãÍ7‡˜› ŸËžþ®›ý?JÞxcŒ×^{J._>†ßýŽ ÏÛ¼u.ß=¦ÓÞçèO©Š)d¢vPô…%Μ¡øÞ÷Æ Tâδý®" ×Z½R#ƒ„C*ù¦Z™$‘Ë$à“ONœXÄýÑÞzk÷î=†ú'Vi‚(àXñäÉ'süä'±¼\>|ÐÁ``š$—à]ZÙï×B¯ÿ›Òðù¡<¸ûaH5ˆž{ŽbuuŒ½½—/sd÷äÇýS±5$P3X“4öÑ)Õ¶¶$>ø ÅêêΞÝÃ»ï¦ØØXÁ—_Òˆô8ÊÑ XÀü¼Ä_ýÕO>¹…Á ‡ù—yܼÙ|,Nè ¥“ùl$ Nfꊠ¶'`7¶ƒZ-»V]?NqîÜI"qëVЬ&—pÔïnÓ$#Õ›4XŦ³djB€[· à½÷2<ûì.þôOS  ¸¿mBŠÄ\_€1޹9 Î%“xûí .]Úc_|±Œ>¢à\6êüfÖŒ’Ì)÷€»©IM¸L@[•KÖûw:/¬­MÊÑŸ#ÏECcÔ7EéO!ˆeˆÆõË@5ÛÔQ€{tdðÕWÀñãóxóÍ ?üáC¬¬Hܸ‘TejÍl¤,yû IB1!„ÀÊŠÄË/`uõëëËøõ¯ÝêžOàuðô{òó'Tó¤+=”(œ ÕÁ?žàܹ ’Dâ›oÜ¿Ÿ9øk·Sc£¿:ðÚ® ^3£û*ö(ÜÛ>þ8Á‰ øã?ÞÅË/o⥗ˆ§±¶Ë”ª™FBËeä88èãŸÿyëë¦Ð\6ߥÁ¤Só5͆Iœ!: `Í8¶ýmY@³¸¡ŽÒT≵µ »» —/gÈsa8eº=sÙ÷Úá‘„ˆËð•ZÙªß寘éc‰ Ž>H1™,aq13Š1̲´ú÷4MA(—ëóªsߺÕÃ'ŸynÆï®¸^¿Ö"/P’k¢)|?¨ÀGÐmqn[ysöpä¹À™3O<1!W¯RlnN Ï´ÖTrLn¨;C .875@S°Í‘eO9/:µ°ÇÂ(.UÇþÃÖ×úýÔPùúõé@˜ŸŸG’P¡Ýî®DžË›@·A p.À…hÐò®Â4ˆAT6P¤©×H .º]‰óç%VW3ìì0üá9²ÌF¹„>ÝK·û”ÖŽ¡";ÌJšŽO1ZHÃ1su´É9È`aéÁÄÁtš˜  ˜_` °¿/!7xs_û|ÄøM¿G!d ~=ïÑdPë¾FîÁæd¢ê\ëùJ˜Í˜]€s‰Ó§)žx¢˜Äqí°µÅÁ¹ðªc³F¿¾èb¤Q^“*¦Æhf½Üž±l’ªD’òô¸9¦ÚÈIÚHQ>èRÛú@V_³ÔŠX¥e‹AÅyÍY¸Š]Šz Y™ %<“Q²9.º'ŸXY)FÿÕ«9ÆcîäåMõ-Pê^lÒ¦{]BÓm¦í¹ó T¦oaŸßõn³"¨„ªˆrE#ÒãÿȆĹ¬ÌŸK覠֖ÒòŽP¤?žÅ 6Êœ¸ÄñãgÏ3x®^Úè' ë7oÎÕ—ZpaZ¸¦u)µÙ\̬5¨PØe¥š¾„éd¹¦þ™‚,D„Ó\ùJÕ\z¿è Õ5cÓ!ÔÍ%¼I© ÒT"ËÚíνžÄéÓ––2ììP\¿Î1 Ý.֜ԩs ²2œësÿˆ3“v´ìÇÁ p.`×ÙÛΘ+:±})^Ö´¹´Š ‚0£ö#ð•Æ À £~òNàò2ñÄ¢úMØ+c×¶{m 8{v)®]“ØÙ©í¶^ÌÙ¼b©u­ã!ëBÇ6¡XÚUb¦óz­‚«®ÐW\ª®ÙÖRHb&btFÓEçºÂB{Q9æÄ:i\{8’ÓàÄ ‚n7Åx¼ˆ4e`Œ±âÑ*Ч*ÙX°×#xö"pìØƒA{{ ú}‰¹94bV—·­¯ã¡^t‘¢Óé–󌵨‚|ãz p$`Œbav´`ßwlÔó'ææ5—蛢åšã €O2¡ÖïÏUiá&Pü–çÙ„#Ë&!(ÒtŠ'†$ÉKKÏ>ËÑëS·ú}‰N§(Ú¬³RSZ±`E¹“7nPlnŽÄ+|ÛÎÖd¡]^¬`æÞ—xçúæ (¢+Ër4§•É ºUxZ®œe¹A3ÇÞ³K“ì*ŽYçÜ0y. dYÆ!%5ÂÑVŒÇ9¤Ì@È!(M@!IB+¨ê]s¿ªfMð`³«WGØÜ:J¼•릊¹ –’“ñÃáÐ#÷;¥KÈóÜ:¦  ¬ €¹¹9$ Å`0hä|áiø;Ðív@ú= ÃR˜~¤Û,ã%ïBË™A‘¸Ÿ Ï‹R­NG½ŠºjbZ¡C÷ÆÕ{š¦)¶¶xµ‚¶éŒÉjTûRº…]Ô›,œ@^ñ¤‘ iã\š@y×z.ÀÞÏ•·ð‡†0"'}´úBVPõ>+˜ÐšrEJúù9—àÈ! pL&9&`L|Š$!Ž‘,ß»]ŽùZ†WÂ"^j¯¼yˆ%0ˆWÂ’ v/”w×èD‰› tSŠË©.$ѯÕOÙ!Í9”–|—F ›/›XxþÍb—h¸“/RR¯óÓ(àô6~ï׌.ôø»P"²ª RêöêÝ  ûYÂKüøfù()D"°’ô´;q$‰^(½þ‚^ˆ¢g§ÌHÇä R9ZáLB 4&`˜Âu‡“¾˜[™i1vfǧpÂëÿè*Ò]äÓvç«él*Ü«Y8Ñ꛸™M“ϰٽšÿhj-3_fÀF>êbrìæÅº 7\th¨Cu¨>|ÇVI¦6ªØ®¨µ·7smœ •«ƒÕu~vÐB bBõ"–tuÕ“IÉ2/q¤t0*Õ(%5ªRCœ»Y:.ª›ðH}D“»V%mÊ<ƒôÖGÝ¿YØ`V‚Å¥ÙÜõ þI©\H€4'±¶ñ ¶êGÑÚõv2Èvl›ƒxÊ\€°ThNÕÖOî›Åk3súÈu1w€šr¥Ô­t²{n@zgëZÅU`á+² Qp¢™RsT·aîTpQàÒT²Ñ¯* €[;i@T¶C QŸ¶]—_7;X÷¬UhÛ4Bük~—ªviÓ 5£ WؤŠAÚê\¶Ú}Ì:hVRÅ_—>¦éµlkawAˆéƒ=‚ @å$Ù§sܶÓ&¤n¯dp zT"„* —‘1¿¿N@OÙ¹_ÞÀ7ÝÌã„” –°Ü!e˜]´-<%ƒê|€8 bB Ùðä…Ôgù G ÇEĘóîÝyðP4}8Ö?h¯1p9•½B$>-Ž.Ìp÷_´IDATfy˜÷móz:¸¸GÖ!ïŒW-š‹Li Õêçúi±mcæp(­êv®l>Àžvî`S5»Ï«k=sSûõ…BV— ô±†vahÛ ë t:R-6?;Gn®Õ£f±ªÉ‘Í"ͪ¨_w„PÛ@—3‚~Û®W¹T{íëÚ¦Ð~4HÀ¸jý&Çžé®}Ð5À4PÏ=÷îßßÀÎÎN™-„ -eQÄÁF‰j>¬Ù6ÏQÖ85 VÛ„=zѹÏÖ‡§¤™aXm‹áÍøê\@ðÏþµ 3Â/V %`Œ¶NT<ï~ðº8þ™ ç¹Åæ¹JõpJjÉs »XÁ&+ô°Ñ·2ˆ^Ý¢£»ý°®Õül²¡WÛu6ïIˆæˆÔûÀ,ßòÿ¯_w“èižC÷m4?A QhŸeC¼òÊ¥{››÷ÿç©Sgþ˃ee°+ž–ŽܽÒGì_¤P“RæÔ0ßqÛý‹&ÅÚfßÃ|€4âp}U¯¸ˆ'\pbʧíêš@uB¹·—Mäå‹k ¨kÔ‡¿û»_=¶~üøÚ‹[[NÇccHÿ6UöŠ"a<çÎuò|ûùޝ¾3ƪ'˜6ü½k3iš@‰<çN_ÇmëÝÞ½ÚN­œçyXÓ]£>xŠE:‹"4º6£4•ëëÙðÖ­Á€î¸W~È}%Aöõ×_ó|róܹsÏRšœ ¬%àýŽ’Z$Z@Û9]ÊgHÓ´01bF«ïŒ¥ÕR]…! úâpµVpžóV~¢­RÈîÓ,Ë‚ÚTÏ)nßžŒîÜìØp¿¾€Ã2±üþööÃÃãÇOl !&ÀþÒêjºH+óøÍG²TkÚ&Œ%UJØÞNß6öE)E§ÃŠ|çÎÕÂíë0÷wÿÞé¤¥Úæs‡­oW8\Ii6¹‘HRÇÑ纮ªÔ®ú^¬<ž¦¬\&V:÷c,! @‚›7GÃ>Z_?Ü+…¿Y þ&€Û¥&Ø0*Í‚1Ÿ*°`ÀiçNêÿç~?y~0 +ãq¾ ¥èH¥Eý¨¼Ê¨E Ó˜÷EÇ ) íX¡ã3ÆJ•ÙV3'#¯•TÏXֵʴÊÞ§xf@RÕCºZ’$’@ˆ{÷G(V‡Ø°à€«®•`ØÖ5±4@À"€5g<à g/ÿë•Î#EìCífíÿvS^>/G÷€­·J °^þvP‚DÌ:H^¢C W?àš€t€ï$²R^û¥°7Ê×}Ëö‹òõó²ÜxPî| À€ÎL|gPkÄï–r{XàA)[ÃF9»Zúi9Úç´—ý ê'¥ÍÚwj+-p¨½Fåï .ÀýHr²‹ýEg£ÿ;­”)Ð_\ùÒ¶×Õ„m¿fÂÿîƒÀ~IŸÑ]+Èýfíÿt“кf\¬ gÿ÷ ˆY›µY›µY›µY›µY›µY›µY›µY›µY›µY›µY›µY›µY›µY›µY›µYûÔþ1% rÞØÓIEND®B`‚stem-1.7.1/docs/api.rst0000664000175000017500000000660513340051401015443 0ustar atagaratagar00000000000000API === Controller ---------- * **Core** * `stem.control `_ - **Controller used to talk with Tor**. * `stem.connection `_ - Connection and authentication to the Tor control socket. * `stem.socket `_ - Low level control socket used to talk with Tor. * `stem.process `_ - Launcher for the Tor process. * `stem.response `_ - Messages that Tor may provide the controller. * **Types** * `stem.exit_policy `_ - Relay policy for the destinations it will or won't allow traffic to. * `stem.manual `_ - Information available about Tor from `its manual `_. * `stem.version `_ - Tor versions that can be compared to determine Tor's capabilities. Descriptors ----------- To read descriptors from disk use :func:`~stem.descriptor.__init__.parse_file` for individual files and `stem.descriptor.reader `_ for batches. You can also use `stem.descriptor.remote `_ to download descriptors remotely like Tor does. * **Classes** * `stem.descriptor `_ - Base class for descriptors. * `stem.descriptor.server_descriptor `_ - Relay and bridge server descriptors. * `stem.descriptor.extrainfo_descriptor `_ - Relay and bridge extrainfo descriptors. * `stem.descriptor.microdescriptor `_ - Minimalistic counterpart for server descriptors. * `stem.descriptor.networkstatus `_ - Network status documents which make up the Tor consensus. * `stem.descriptor.router_status_entry `_ - Relay entries within a network status document. * `stem.descriptor.hidden_service_descriptor `_ - Descriptors generated for hidden services. * `stem.descriptor.tordnsel `_ - `TorDNSEL `_ exit lists. * `stem.descriptor.certificate `_ - `Ed25519 certificates `_. * `stem.descriptor.reader `_ - Reads and parses descriptor files from disk. * `stem.descriptor.remote `_ - Downloads descriptors from directory mirrors and authorities. * `stem.descriptor.export `_ - Exports descriptors to other formats. Utilities --------- * `stem.util.conf `_ - Configuration file handling. * `stem.util.connection `_ - Connection and IP related utilities. * `stem.util.enum `_ - Enumeration class. * `stem.util.proc `_ - Resource and connection usage via proc contents. * `stem.util.str_tools `_ - String utilities. * `stem.util.system `_ - Tools related to the local system. * `stem.util.term `_ - Tools for interacting with the terminal. * `stem.util.test_tools `_ - Static analysis checks and tools to help with test runs. * `stem.util.tor_tools `_ - Miscellaneous toolkit for working with tor. stem-1.7.1/docs/conf.py0000664000175000017500000001717313237375570015466 0ustar atagaratagar00000000000000# -*- coding: utf-8 -*- # # Stem documentation build configuration file, created by # sphinx-quickstart on Thu May 31 09:56:13 2012. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath('..')) sys.path.append(os.path.abspath('.')) # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. needs_sphinx = '1.1' # required for the sphinx-apidoc command # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode', 'roles'] autodoc_member_order = 'bysource' autodoc_default_flags = ['members', 'show-inheritance', 'undoc-members'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' from stem import __version__, __author__, __contact__ # Ignore the '-dev' version suffix. if __version__.endswith('-dev'): __version__ = __version__[:-4] # General information about the project. project = 'Stem' copyright = '2012, %s' % __author__ # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = __version__[:__version__.rfind(".")] # The full version, including alpha/beta/rc tags. release = __version__ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. #html_theme = 'default' html_theme = 'haiku' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. html_short_title = 'Stem Docs' # The name of an image file (relative to this directory) to place at the top # of the sidebar. html_logo = 'logo.png' # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. html_favicon = 'favicon.png' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. html_use_smartypants = False # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. html_show_sourcelink = False # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. html_show_sphinx = False # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. html_show_copyright = False # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'Stemdoc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'Stem.tex', 'Stem Documentation', 'Damian Johnson', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'stem', 'Stem Documentation', ['%s (%s)' % (__author__, __contact__)], 1) ] trac_url = 'https://trac.torproject.org/{slug}' spec_url = 'https://gitweb.torproject.org/torspec.git/commit/?id={slug}' def skip_members(app, what, name, obj, skip, options): if name in ('ATTRIBUTES', 'PARSER_FOR_LINE'): return True # skip the descriptor's parser constants def setup(app): app.connect('autodoc-skip-member', skip_members) stem-1.7.1/docs/download.rst0000664000175000017500000001502213411002341016470 0ustar atagaratagar00000000000000Download ======== .. Image Sources: * PyPI Source: http://www.python.org/community/logos/ License: http://www.python.org/psf/trademarks * OSX Source: IconArchive (http://www.iconarchive.com/show/papercut-social-icons-by-graphicloads/Apple-icon.html) Author: GraphicLoads, Papercut Social Icons License: Freeware * Debian Source: NuoveXT (http://nuovext.pwsp.net/) Author: Alexandre Moore (http://sa-ki.deviantart.com/) License: GPL v2 File: NuoveXT/128x128/apps/debian-logo.png * Ubuntu Source: http://logonoid.com/ubuntu-logo/ Not quite sure of the license, probably covered by... http://design.ubuntu.com/brand/ubuntu-logo * Fedora Source: https://en.wikipedia.org/wiki/File:Fedora_logo_and_wordmark.svg Author: Unknown * Red Hat Source: NuoveXT (http://nuovext.pwsp.net/) Author: Alexandre Moore (http://sa-ki.deviantart.com/) License: GPL v2 File: NuoveXT/128x128/apps/fedora.png * Gentoo Source: https://www.gentoo.org/main/en/name-logo.xml * Arch Linux Source: https://en.wikipedia.org/wiki/File:Archlinux-official-fullcolour.svg * Slackware Source: NuoveXT (http://nuovext.pwsp.net/) Author: Alexandre Moore (http://sa-ki.deviantart.com/) License: GPL v2 File: NuoveXT/128x128/apps/slackware.png * FreeBSD Source: https://en.wikipedia.org/wiki/File:Freebsd_logo.svg Author: Anton Gural * OpenBSD Source: NuoveXT (http://nuovext.pwsp.net/) Author: Alexandre Moore (http://sa-ki.deviantart.com/) License: GPL v2 File: NuoveXT/128x128/apps/openbsd.png * Git Source: https://en.wikipedia.org/wiki/File:Git-logo.svg Author: Jason Long License: CC v3 (A) * Git (Alternate) Source: http://www.dylanbeattie.net/git_logo/ Author: Dylan Beattie License: CC v3 (A, SA) .. list-table:: :widths: 1 10 :header-rows: 0 * - .. image:: /_static/section/download/pypi.png :target: https://pypi.python.org/pypi/stem/ - .. image:: /_static/label/python_package_index.png :target: https://pypi.python.org/pypi/stem/ Signed releases and instructions for both Python 2.x and 3.x. You can easily install from its `tarball `_ (`sig `_), or with **pip**... :: % sudo easy_install pip % sudo pip install stem * - .. image:: /_static/section/download/osx.png - .. image:: /_static/label/osx.png As of OSX 10.8 the platform bundles Python 2.7 by default. This makes installation easy... :: % sudo easy_install pip % sudo pip install stem * - .. image:: /_static/section/download/debian.png :target: https://packages.debian.org/sid/python-stem - .. image:: /_static/label/debian.png :target: https://packages.debian.org/sid/python-stem Packages by Dererk for Debian, including `python-stem `_ (for Python 2.x) and `python3-stem `_ (for Python 3.x). :: % sudo apt-get install python-stem * - .. image:: /_static/section/download/ubuntu.png :target: https://launchpad.net/ubuntu/+source/python-stem - .. image:: /_static/label/ubuntu.png :target: https://launchpad.net/ubuntu/+source/python-stem Package derived from Debian for Ubuntu. :: % sudo apt-get install python-stem * - .. image:: /_static/section/download/fedora.png :target: https://apps.fedoraproject.org/packages/python-stem - .. image:: /_static/label/fedora.png :target: https://apps.fedoraproject.org/packages/python-stem Packages maintained by Juan for Fedora using **dnf** or **yum**. These include **python-stem** (for Python 2.x), **python3-stem** (for Python 3.x), and **python-stem-doc** (this website). :: % sudo dnf install python-stem * - .. image:: /_static/section/download/gentoo.png :target: http://packages.gentoo.org/package/net-libs/stem - .. image:: /_static/label/gentoo.png :target: http://packages.gentoo.org/package/net-libs/stem Package by Anthony Basile for Gentoo. :: % sudo emerge stem * - .. image:: /_static/section/download/archlinux.png :target: https://aur.archlinux.org/packages/stem/ - .. image:: /_static/label/archlinux.png :target: https://aur.archlinux.org/packages/stem/ Package by Sjon for `Arch Linux `_. :: % wget https://aur.archlinux.org/cgit/aur.git/snapshot/stem.tar.gz % tar -xvf stem.tar.gz % cd stem; makepkg --install * - .. image:: /_static/section/download/slackware.png :target: https://slackbuilds.org/repository/14.2/python/stem/ - .. image:: /_static/label/slackware.png :target: https://slackbuilds.org/repository/14.2/python/stem/ Package by Markus for `Slackware `_. * - .. image:: /_static/section/download/freebsd.png :target: http://www.freshports.org/security/py-stem/ - .. image:: /_static/label/freebsd.png :target: http://www.freshports.org/security/py-stem/ Port by Carlo for `FreeBSD `_. :: % pkg install security/py-stem * - .. image:: /_static/section/download/openbsd.png :target: http://cvsweb.openbsd.org/cgi-bin/cvsweb/ports/net/py-stem/ - .. image:: /_static/label/openbsd.png :target: http://cvsweb.openbsd.org/cgi-bin/cvsweb/ports/net/py-stem/ Port by pascal for OpenBSD. :: % pkg_add py-stem * - .. image:: /_static/section/download/git.png :target: https://gitweb.torproject.org/stem.git - .. image:: /_static/label/source_repository.png :target: https://gitweb.torproject.org/stem.git For those wanting to live on the bleeding edge or contribute to Stem, Stem's git repository can be fetched with... :: % git clone https://git.torproject.org/stem.git stem-1.7.1/docs/Makefile0000664000175000017500000001100513157571677015622 0ustar atagaratagar00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* @rm -f ./stem.* ./modules.rst html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Stem.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Stem.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/Stem" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Stem" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." make -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." stem-1.7.1/docs/api/0000775000175000017500000000000013411004021014675 5ustar atagaratagar00000000000000stem-1.7.1/docs/api/socket.rst0000664000175000017500000000007413157571677016761 0ustar atagaratagar00000000000000Control Socket ============== .. automodule:: stem.socket stem-1.7.1/docs/api/control.rst0000664000175000017500000000021213157571677017143 0ustar atagaratagar00000000000000Controller ========== .. automodule:: stem.control Exceptions and Attribute Enums ------------------------------ .. automodule:: stem stem-1.7.1/docs/api/descriptor/0000775000175000017500000000000013411004021017053 5ustar atagaratagar00000000000000stem-1.7.1/docs/api/descriptor/remote.rst0000664000175000017500000000011513157571677021136 0ustar atagaratagar00000000000000Descriptor Remote ================= .. automodule:: stem.descriptor.remote stem-1.7.1/docs/api/descriptor/certificate.rst0000664000175000017500000000010613157571677022125 0ustar atagaratagar00000000000000Certificate =========== .. automodule:: stem.descriptor.certificate stem-1.7.1/docs/api/descriptor/extrainfo_descriptor.rst0000664000175000017500000000014113157571677024077 0ustar atagaratagar00000000000000Extrainfo Descriptor ==================== .. automodule:: stem.descriptor.extrainfo_descriptor stem-1.7.1/docs/api/descriptor/router_status_entry.rst0000664000175000017500000000014213157571677024007 0ustar atagaratagar00000000000000Router Status Entries ===================== .. automodule:: stem.descriptor.router_status_entry stem-1.7.1/docs/api/descriptor/networkstatus.rst0000664000175000017500000000014213157571677022600 0ustar atagaratagar00000000000000Network Status Documents ======================== .. automodule:: stem.descriptor.networkstatus stem-1.7.1/docs/api/descriptor/hidden_service_descriptor.rst0000664000175000017500000000016013157571677025054 0ustar atagaratagar00000000000000Hidden Service Descriptor ========================= .. automodule:: stem.descriptor.hidden_service_descriptor stem-1.7.1/docs/api/descriptor/export.rst0000664000175000017500000000012113157571677021161 0ustar atagaratagar00000000000000Descriptor Exporter =================== .. automodule:: stem.descriptor.export stem-1.7.1/docs/api/descriptor/server_descriptor.rst0000664000175000017500000000013013157571677023404 0ustar atagaratagar00000000000000Server Descriptor ================= .. automodule:: stem.descriptor.server_descriptor stem-1.7.1/docs/api/descriptor/reader.rst0000664000175000017500000000011513157571677021105 0ustar atagaratagar00000000000000Descriptor Reader ================= .. automodule:: stem.descriptor.reader stem-1.7.1/docs/api/descriptor/descriptor.rst0000664000175000017500000000010113157571677022014 0ustar atagaratagar00000000000000Descriptor ========== .. automodule:: stem.descriptor.__init__ stem-1.7.1/docs/api/descriptor/microdescriptor.rst0000664000175000017500000000012213157571677023051 0ustar atagaratagar00000000000000MicroDescriptor =============== .. automodule:: stem.descriptor.microdescriptor stem-1.7.1/docs/api/descriptor/tordnsel.rst0000664000175000017500000000012313157571677021474 0ustar atagaratagar00000000000000TorDNSEL Exit Lists =================== .. automodule:: stem.descriptor.tordnsel stem-1.7.1/docs/api/connection.rst0000664000175000017500000000011613157571677017625 0ustar atagaratagar00000000000000Controller Connection ===================== .. automodule:: stem.connection stem-1.7.1/docs/api/exit_policy.rst0000664000175000017500000000007313157571677020020 0ustar atagaratagar00000000000000Exit Policy =========== .. automodule:: stem.exit_policy stem-1.7.1/docs/api/process.rst0000664000175000017500000000006713157571677017151 0ustar atagaratagar00000000000000Tor Process =========== .. automodule:: stem.process stem-1.7.1/docs/api/directory.rst0000664000175000017500000000006513341034346017453 0ustar atagaratagar00000000000000Directory ========= .. automodule:: stem.directory stem-1.7.1/docs/api/response.rst0000664000175000017500000000076213157571677017333 0ustar atagaratagar00000000000000Controller Responses ==================== .. automodule:: stem.response Responses --------- .. autoclass:: stem.response.add_onion.AddOnionResponse .. autoclass:: stem.response.authchallenge.AuthChallengeResponse .. autoclass:: stem.response.getconf.GetConfResponse .. autoclass:: stem.response.getinfo.GetInfoResponse .. autoclass:: stem.response.mapaddress.MapAddressResponse .. autoclass:: stem.response.protocolinfo.ProtocolInfoResponse Events ------ .. automodule:: stem.response.events stem-1.7.1/docs/api/version.rst0000664000175000017500000000005713157571677017157 0ustar atagaratagar00000000000000Version ======= .. automodule:: stem.version stem-1.7.1/docs/api/manual.rst0000664000175000017500000000005413157571677016744 0ustar atagaratagar00000000000000Manual ====== .. automodule:: stem.manual stem-1.7.1/docs/api/util/0000775000175000017500000000000013411004021015652 5ustar atagaratagar00000000000000stem-1.7.1/docs/api/util/str_tools.rst0000664000175000017500000000011013157571677020465 0ustar atagaratagar00000000000000String Utilities ================ .. automodule:: stem.util.str_tools stem-1.7.1/docs/api/util/tor_tools.rst0000664000175000017500000000010213157571677020462 0ustar atagaratagar00000000000000Tor Utilities ============= .. automodule:: stem.util.tor_tools stem-1.7.1/docs/api/util/enum.rst0000664000175000017500000000007313157571677017411 0ustar atagaratagar00000000000000Enumerations ============ .. automodule:: stem.util.enum stem-1.7.1/docs/api/util/term.rst0000664000175000017500000000010713157571677017412 0ustar atagaratagar00000000000000Terminal Utilities ================== .. automodule:: stem.util.term stem-1.7.1/docs/api/util/log.rst0000664000175000017500000000006013157571677017222 0ustar atagaratagar00000000000000Logging ======= .. automodule:: stem.util.log stem-1.7.1/docs/api/util/system.rst0000664000175000017500000000010513157571677017765 0ustar atagaratagar00000000000000System Utilities ================ .. automodule:: stem.util.system stem-1.7.1/docs/api/util/connection.rst0000664000175000017500000000012113157571677020576 0ustar atagaratagar00000000000000Connection Utilities ==================== .. automodule:: stem.util.connection stem-1.7.1/docs/api/util/conf.rst0000664000175000017500000000013113157571677017365 0ustar atagaratagar00000000000000Configuration File Handling =========================== .. automodule:: stem.util.conf stem-1.7.1/docs/api/util/proc.rst0000664000175000017500000000007713157571677017414 0ustar atagaratagar00000000000000Proc Utilities ============== .. automodule:: stem.util.proc stem-1.7.1/docs/api/util/init.rst0000664000175000017500000000005713157571677017412 0ustar atagaratagar00000000000000Util ==== .. automodule:: stem.util.__init__ stem-1.7.1/docs/api/util/test_tools.rst0000664000175000017500000000010513157571677020640 0ustar atagaratagar00000000000000Test Utilities ============== .. automodule:: stem.util.test_tools stem-1.7.1/docs/index.rst0000664000175000017500000000466213411003540016002 0ustar atagaratagar00000000000000Welcome to Stem! ================ Stem is a Python controller library for `Tor `_. With it you can use Tor's `control protocol `_ to script against the Tor process, or build things such as `Nyx `_. Stem's latest version is **1.7.1** (released December 26th, 2018). .. Main Stem Logo Source: http://www.wpclipart.com/plants/assorted/P/plant_stem.png.html Author: Jakub Jankiewicz License: Public Domain (http://www.wpclipart.com/legal.html#terms) Alternate: Source: http://andreajoseph24.blogspot.com/search/label/onions Author: Andrea Joseph License: CCv3 (NC, ND) - http://creativecommons.org/licenses/by-nc-nd/3.0/ .. Source: NuoveXT 2 (http://nuovext.pwsp.net/) Author: Alexandre Moore (http://sa-ki.deviantart.com/) License: LGPL v3 File: NuoveXT 2.2/128x128/categories/applications-development.png .. image:: /_static/buttons/tutorials.png :target: tutorials.html .. Source: http://www.cipherdyne.com/images/anvil.png Author and license are unknown .. image:: /_static/buttons/api.png :target: api.html .. Source: https://openclipart.org/detail/171951/help-by-diamonjohn-171951 Author: John Diamond (https://openclipart.org/user-detail/diamonjohn) License: Public Domain Alternate: Source: Oxygen (http://www.oxygen-icons.org/) Author: Andrea Joseph License: CCv3 (A, SA) - http://creativecommons.org/licenses/by-sa/3.0/ File: Oxygen/128x128/categories/system-help.png .. image:: /_static/buttons/faq.png :target: faq.html .. Source: Nuovo (http://www.silvestre.com.ar/?p=5) Author: Silvestre Herrera (http://www.silvestre.com.ar/) License: GPL v2 File: Nuovo/128x128/mimetypes/gnome-mime-text-log.png .. image:: /_static/buttons/change_log.png :target: change_log.html .. Source: Crystal (http://www.everaldo.com/crystal/) Author: Everaldo Coelho (http://www.everaldo.com/) License: LGPL v2 File: Crystal/64x64/apps/bug.png .. image:: /_static/buttons/bug_tracker.png :target: https://trac.torproject.org/projects/tor/wiki/doc/stem/bugs .. Source: ColorCons (http://mouserunner.com/Spheres_ColoCons1_Free_Icons.html) Author: Ken Saunders (http://mouserunner.com/MRDS_Cell.html) License: CC v2.5 (A, SA) File: ColorCons/Blue/Download.png .. image:: /_static/buttons/download.png :target: download.html .. toctree:: :maxdepth: 1 stem-1.7.1/docs/change_log.rst0000664000175000017500000010220513411003042016746 0ustar atagaratagar00000000000000Change Log ========== The following is a log of all user-facing changes to Stem, both released and unreleased. For a monthly report on work being done see my `development log `_. * :ref:`versioning` * :ref:`unreleased` * :ref:`version_1.7` * :ref:`version_1.6` * :ref:`version_1.5` * :ref:`version_1.4` * :ref:`version_1.3` * :ref:`version_1.2` * :ref:`version_1.1` * :ref:`version_1.0` .. _versioning: Versioning ---------- Stem uses `semantic versioning `_, which means that **versions consist of three numbers** (such as '**1.2.4**'). These are used to convey the kind of backward compatibility you can expect... * The first value is the **major version**. This changes infrequently, and indicates that backward incompatible changes have been made (such as the removal of deprecated functions). * The second value is the **minor version**. This is the most common kind of release, and denotes that the improvements are backward compatible. * The third value is the **patch version**. When a Stem release has a major issue another release is made which fixes just that problem. These do not contain substantial improvements or new features. This value is sometimes left off to indicate all releases with a given major/minor version. .. _unreleased: Unreleased ---------- The following are only available within Stem's `git repository `_. .. _version_1.7: Version 1.7 (October 7th, 2018) ------------------------------- `Stem 1.7 `_ is a full year of improments. Most notably this adds the ability to `download descriptors through ORPorts `_ and the `stem.directory module `_. * **Controller** * Listener exceptions and malformed events no longer break further event processing (:trac:`27053`) * Documented v3 hidden service support (:trac:`25124`, :spec:`6bd0a69`) * Added the stem.control.MALFORMED_EVENTS event listener constant * Added support for limiting the maximum number of streams for :func:`~stem.control.Controller.create_ephemeral_hidden_service` (:spec:`2fcb1c2`) * Added a timeout argument to :class:`~stem.control.Controller` methods that could await a response (:trac:`26056`) * Added a close_output argument to :class:`~stem.process.launch_tor` * :func:`stem.connection.connect` crashed if its port argument was a string * More reliable ExitPolicy resolution (:trac:`25739`) * Fixed cache invalidation when another contorller calls SETCONF (:trac:`25821`) * :func:`~stem.control.COntroller.create_hidden_service` failed when creating services with v2 options (:trac:`27446`) * :func:`~stem.control.Controller.get_info` commonly raised :class:`stem.ProtocolError` when it should provide a :class:`stem.OperationFailed` * :func:`~stem.control.Controller.get_microdescriptors` now reads microdescriptors from the control port rather than disk when available (:spec:`b5396d5`) * Added the delivered_read, delivered_written, overhead_read, and overhead_written attributes to :class:`~stem.response.events.CircuitBandwidthEvent` (:spec:`fbb38ec`) * The *config* attribute of :class:`~stem.response.events.ConfChangedEvent` couldn't represent tor configuration options with multiple values. It has been replaced with new *changed* and *unset* attributes. * Replaced socket's :func:`~stem.socket.ControlPort.get_address`, :func:`~stem.socket.ControlPort.get_port`, and :func:`~stem.socket.ControlSocketFile.get_socket_path` with attributes * :class:`~stem.response.ControlMessage` is now comparable and hashable * Removed the 'raw' argument from :func:`~stem.socket.ControlSocket.send` * **Descriptors** * `stem.descriptor.remote `_ can now download from relay ORPorts * Zstd and lzma compression support (:spec:`1cb56af`) * Moved the Directory classes into their own `stem.directory `_ module * Added :func:`~stem.descriptor.remote.Directory.from_cache` and :func:`~stem.descriptor.remote.Directory.from_remote` to the :class:`~stem.descriptor.remote.DirectoryAuthority` subclass * `Tor rearranged its files `_, adjusted :func:`stem.descriptor.remote.Directory.from_remote` and :func:`stem.manual.Manual.from_remote` to account for this * `Fallback directory v2 support `_, which adds *nickname* and *extrainfo* * Added the *orport_v6* attribute to the :class:`~stem.directory.Authority` class * Added server descriptor's new is_hidden_service_dir attribute * Added the network status vote's new bandwidth_file attribute (:spec:`84591df`) * Added the microdescriptor router status entry's new or_addresses attribute (:trac:`26405`, :spec:`fdc8f3e8`) * Don't retry downloading descriptors when we've timed out * Don't download from tor26, an authority that frequently timeout * Replaced Bifroest bridge authority with Serge (:trac:`26771`) * `stem.descriptor.remote `_ now consistently defaults **fall_back_to_authority** to false * Deprecated `stem.descriptor.export `_. If you use it please `let us know `_. * Added :func:`~stem.descriptor.remote.their_server_descriptor` * Added the reply_headers attribute to :class:`~stem.descriptor.remote.Query` * Supplying a User-Agent when downloading descriptors * Reduced maximum descriptors fetched by the remote module to match tor's new limit (:trac:`24743`) * Consensus **shared_randomness_*_reveal_count** attributes undocumented, and unavailable if retrieved before their corresponding shared_randomness_*_value attribute (:trac:`25046`) * Allow 'proto' line to have blank values (:spec:`a8455f4`) * **Utilities** * Fixed PyPy compatibility (:trac:`26207`) * Python 3.6+ syntax error if test_tools.py imported (:trac:`26739`) * Connection information from proc limited to 10,000 results * Include attribute types in most equality checks and hashes * Cache hash values of immutable classes * More performant string concatenation `via bytearrays `_ * Functions using lru_cache could fail with a KeyError on Python 3.5 (:trac:`26412`) * **Website** * Added `terminal styling `_ to our utilities tutorial * Added `multiprocessing `_ to our utilities tutorial * Added a `descriptor download example `_ * Added a `relay connection summary example `_ * **Version 1.7.1** (December 26th, 2018) - :func:`~stem.process.launch_tor` compatibility with an upcoming log format change (:trac:`28731`) .. _version_1.6: Version 1.6 (November 5th, 2017) -------------------------------- Year long accumulation of fixes and improvements in support of the `Nyx 2.0 release `_. * **Controller** * :func:`~stem.process.launch_tor` raised a ValueError if invoked when outside the main thread * Failure to authenticate could raise an improper response or hang (:trac:`22679`) * Renamed :class:`~stem.response.events.ConnectionBandwidthEvent` type attribute to conn_type to avoid conflict with parent class (:trac:`21774`) * Added 'force' argument to :func:`~stem.control.Controller.save_conf` (:spec:`5c82d5e`) * Added the QUERY_NO_HSDIR :data:`~stem.HSDescReason` and recognizing unknown HSDir results (:spec:`1412d79`) * Added the GUARD_WAIT :data:`~stem.CircStatus` (:spec:`6446210`) * Unable to use cookie auth when path includes wide characters (chinese, japanese, etc) * Tor change caused :func:`~stem.control.Controller.list_ephemeral_hidden_services` to provide empty strings if unset (:trac:`21329`) * Better error message when :func:`~stem.control.Controller.set_conf` fails due to an option being immutable * :func:`~stem.control.Controller.get_ports` didn't provide ports for many representations of localhost (:trac:`24085`) * :func:`~stem.control.Controller.is_geoip_unavailable` now determines if database is available right away * Added the time attribute to :class:`~stem.response.events.StreamBwEvent` and :class:`~stem.response.events.CircuitBandwidthEvent` (:spec:`00b9daf`) * Added the consensus_content attribute to :class:`~stem.response.events.NewConsensusEvent` and deprecated its 'desc' * Deprecated :func:`~stem.control.Controller.is_geoip_unavailable`, this is now available via getinfo instead (:trac:`23237`, :spec:`dc973f8`) * Deprecated :class:`~stem.respose.events.AuthDirNewDescEvent` (:trac:`22377`, :spec:`6e887ba`) * Caching manual information as sqlite rather than stem.util.conf, making :func:`stem.manual.Manual.from_cache` about ~8x faster * Added :func:`~stem.manual.database` to get a cursor for the manual cache * Failed to parse torrcs without a port on ipv6 exit policy entries * Resilient to 'Tor' prefix in 'GETINFO version' result (:spec:`c5ff1b1`) * Added a **all_extra** parameter to :class:`stem.version.Version` and support for multiple parenthetical entries (:trac:`22110`, :spec:`b50917d`) * Setting 'UseMicrodescriptors 1' in your torrc caused :func:`~stem.control.Controller.get_network_statuses` to error (:trac:`24110`) * Closing controller connection faster when under heavy event load * Better messaging when unable to connect to tor on FreeBSD * More succinct trace level logging * **Descriptors** * Supporting `descriptor creation `_ (:trac:`10227`) * Support and validation for `ed25519 certificates `_ (`spec `_, :trac:`21558`) * Added :func:`~stem.descriptor.networkstatus.NetworkStatusDocumentV3.validate_signatures` to check our key certificate signatures (:trac:`11045`) * Moved from the deprecated `pycrypto `_ module to `cryptography `_ for validating signatures (:trac:`21086`) * Sped descriptor reading by ~25% by deferring defaulting when validating * Added server descriptor's new extra_info_sha256_digest attribute (:spec:`0f03581`) * Added server descriptor's new protocol attribute (:spec:`eb4fb3c`) * Added server descriptor's new bridge_distribution attribute (:trac:`21177`) * Added extrainfo descriptor's new padding_counts attributes (:spec:`0803997`) * Shared randomness properties weren't being read in votes (:trac:`21102`) * Added bastet as a new authority (:trac:`23912`) * Updated longclaw authority's address (:trac:`23592`) * **Utilities** * Support connection resolution on OpenBSD using fstat (:trac:`13807`) * Added :func:`~stem.util.system.size_of` * Added :func:`~stem.util.log.is_tracing` * Added timeout argument to :func:`~stem.util.system.call` * Added cwd argument to :func:`~stem.util.system.call` * Added round argument to :func:`~stem.util.str_tools.size_label` * Added :class:`~stem.util.test_tools.TimedTestRunner` and :func:`~stem.util.test_tools.test_runtimes` * Supporting pid arguments in :func:`~stem.util.system.is_running` * Made connection resolution via proc about 5x faster * Normalized :func:`~stem.util.term.format` to return unicode * Don't load vim swap files as configurations * **Interpreter** * Added a `'--run [command or path]' argument `_ to invoke specific commands (:trac:`21541`) * Allowing interpreter to continue after tor shuts down (:trac:`22374`) * Interpreter buffered an unbounded number of events, leaking memory over time * **Website** * Source code served by '[source]' links perpetually stale (:trac:`19521`) .. _version_1.5: Version 1.5 (November 20th, 2016) --------------------------------- `Stem 1.5 `_ is a long overdue accumulation of seventeen months of improvements including dramatically improved python 3.x performance, `tor manual information `_, and much more. * **Controller** * Dramatic, 300x performance improvement for reading from the control port with python 3 * Added `stem.manual `_, which provides information available about Tor from `its manual `_ (:trac:`8251`) * :func:`~stem.connection.connect` and :func:`~stem.control.Controller.from_port` now connect to both port 9051 (relay's default) and 9151 (Tor Browser's default) (:trac:`16075`) * :class:`~stem.exit_policy.ExitPolicy` support for *accept6/reject6* and *\*4/6* wildcards (:trac:`16053`) * Added `support for NETWORK_LIVENESS events `_ (:spec:`44aac63`) * Added support for basic authentication to :func:`~stem.control.Controller.create_ephemeral_hidden_service` (:spec:`c2865d9`) * Added support for non-anonymous services to :func:`~stem.control.Controller.create_ephemeral_hidden_service` (:spec:`b8fe774`) * Added :func:`~stem.control.event_description` for getting human-friendly descriptions of tor events (:trac:`19061`) * Added :func:`~stem.control.Controller.reconnect` to the :class:`~stem.control.Controller` * Added :func:`~stem.control.Controller.is_set` to the :class:`~stem.control.Controller` * Added :func:`~stem.control.Controller.is_user_traffic_allowed` to the :class:`~stem.control.Controller` * Added the replica attribute to :class:`~stem.response.events.HSDescEvent` (:spec:`4989e73`) * Added the NoEdConsensus :data:`~stem.Flag` (:spec:`dc99160`) * Recognize listeners with IPv6 addresses in :func:`~stem.control.Controller.get_listeners` * :func:`~stem.process.launch_tor` could leave a lingering process during an unexpected exception (:trac:`17946`) * IPv6 addresses could trigger errors in :func:`~stem.control.Controller.get_listeners`, :class:`~stem.response.events.ORConnEvent`, and quite a few other things (:trac:`16174`) * Don't obscure stacktraces, most notably :class:`~stem.control.Controller` getter methods with default values * Classes with custom equality checks didn't provide a corresponding inequality method * **Descriptors** * `Shorthand functions for stem.descriptor.remote `_ * Added `fallback directory information `_. * Support for ed25519 descriptor fields (:spec:`5a79d67`) * Support downloading microdescriptor consensus with :func:~stem.descriptor.remote.DescriptorDownloader.get_consensus` (:spec`e788b8f`) * Added consensus and vote's new shared randomness attributes (:spec:`9949f64`) * Added server descriptor's new allow_tunneled_dir_requests attribute (:spec:`8bc30d6`) * Server descriptor validation fails with 'extra-info-digest line had an invalid value' from additions in proposal 228 (:trac:`16227`) * :class:`~stem.descriptor.server_descriptor.BridgeDescriptor` now has 'ntor_onion_key' like its unsanitized counterparts * Replaced the :class:`~stem.descriptor.microdescriptor.Microdescriptor` identifier and identifier_type attributes with an identifiers hash since it can now appear multiple times (:spec:`09ff9e2`) * Unable to read descriptors from data directories on Windows due to their CRLF newlines (:trac:`17051`) * TypeError under python3 when using 'use_mirrors = True' (:trac:`17083`) * Deprecated hidden service descriptor's *introduction_points_auth* field, which was never implemented in tor (:trac:`15190`, :spec:`9c218f9`) * Deprecated :func:`~stem.descriptor.remote.DescriptorDownloader.get_microdescriptors` as it was never implemented in tor (:trac:`9271`) * :func:`~stem.control.Controller.get_hidden_service_descriptor` errored when provided a *servers* argument (:trac:`18401`) * Fixed parsing of server descriptor's *allow-single-hop-exits* and *caches-extra-info* lines * Bracketed IPv6 addresses were mistreated as being invalid content * Better validation for non-ascii descriptor content * Updated dannenberg's v3ident (:trac:`17906`) * Removed urras as a directory authority (:trac:`19271`) * **Utilities** * IPv6 support in :func:`~stem.util.connection.get_connections` when resolving with proc, netstat, lsof, or ss (:trac:`18079`) * The 'ss' connection resolver didn't work on Gentoo (:trac:`18079`) * Recognize IPv4-mapped IPv6 addresses in our utils (:trac:`18079`) * Allow :func:`stem.util.conf.Config.set` to remove values when provided with a **None** value * Support prefix and suffix issue strings in :func:`~stem.util.test_tools.pyflakes_issues` * Additional information when :func:`~stem.util.system.call` fails through a :class:`~stem.util.system.CallError` * Added **stem.util.system.SYSTEM_CALL_TIME** with the total time spent on system calls * Added an **is_ipv6** value to :class:`~stem.util.connection.Connection` instances * Added LINES attribute to :data:`~stem.util.term.Attr` * Added :func:`~stem.util.system.pids_by_user` * Added :func:`~stem.util.connection.address_to_int` * Added :func:`~stem.util.term.encoding` * Added :func:`~stem.util.__init__.datetime_to_unix` * **Interpreter** * Added a '--tor [path]' argument to specify the tor binary to run. * **Website** * `Comparison of our descriptor parsing libraries `_ * Example for `custom path selection for circuits `_ (:trac:`8728`) * Example for `persisting ephemeral hidden service keys `_ * **Version 1.5.3** (December 5th, 2016) - including tests and site in the release tarball * **Version 1.5.4** (January 4th, 2017) - drop validation of the order of fields in the tor consensus (:trac:`21059`) .. _version_1.4: Version 1.4 (May 13th, 2015) ---------------------------- `Stem's 1.4 release `_ brings with it new hidden service capabilities. Most notably, `ephemeral hidden services `_ and the ability to `read hidden service descriptors `_. This release also changes descriptor validation to now be opt-in rather than opt-out. When unvalidated content is lazy-loaded, `greatly improving our performance `_. And last, Stem also now runs directly under both python2 and python3 without a 2to3 conversion (:trac:`14075`)! * **Controller** * Added :class:`~stem.control.Controller` methods for a new style of hidden services that don't touch disk: :func:`~stem.control.Controller.list_ephemeral_hidden_services`, :func:`~stem.control.Controller.create_ephemeral_hidden_service`, and :func:`~stem.control.Controller.remove_ephemeral_hidden_service` (:spec:`f5ff369`) * Added :func:`~stem.control.Controller.get_hidden_service_descriptor` and `support for HS_DESC_CONTENT events `_ (:trac:`14847`, :spec:`aaf2434`) * :func:`~stem.process.launch_tor_with_config` avoids writing a temporary torrc to disk if able (:trac:`13865`) * :class:`~stem.response.events.CircuitEvent` support for the new SOCKS_USERNAME and SOCKS_PASSWORD arguments (:trac:`14555`, :spec:`2975974`) * The 'strict' argument of :func:`~stem.exit_policy.ExitPolicy.can_exit_to` didn't behave as documented (:trac:`14314`) * Threads spawned for status change listeners were never joined on, potentially causing noise during interpreter shutdown * Added support for specifying the authentication type and client names in :func:`~stem.control.Controller.create_hidden_service` (:trac:`14320`) * **Descriptors** * Lazy-loading descriptors, improving performance by 25-70% depending on what type it is (:trac:`14011`) * Added `support for hidden service descriptors `_ (:trac:`15004`) * When reading sanitised bridge descriptors (server or extrainfo), :func:`~stem.descriptor.__init__.parse_file` treated the whole file as a single descriptor * The :class:`~stem.descriptor.networkstatus.DirectoryAuthority` 'fingerprint' attribute was actually its 'v3ident' * Added consensus' new package attribute (:spec:`ab64534`) * Added extra info' new hs_stats_end, hs_rend_cells, hs_rend_cells_attr, hs_dir_onions_seen, and hs_dir_onions_seen_attr attributes (:spec:`ddb630d`) * Updating Faravahar's address (:trac:`14487`) * **Utilities** * Windows support for connection resolution (:trac:`14844`) * :func:`stem.util.connection.port_usage` always returned None (:trac:`14046`) * :func:`~stem.util.test_tools.stylistic_issues` and :func:`~stem.util.test_tools.pyflakes_issues` now provide namedtuples that also includes the line * Added :func:`stem.util.system.tail` * Proc connection resolution could fail on especially busy systems (:trac:`14048`) * **Website** * Added support and `instructions for tox `_ (:trac:`14091`) * Added OSX to our `download page `_ (:trac:`8588`) * Updated our twitter example to work with the service's 1.1 API (:trac:`9003`) * **Version 1.4.1** (May 18th, 2015) - fixed issue where descriptors couldn't be unpickled (:trac:`16054`) and a parsing issue for router status entry bandwidth lines (:trac:`16048`) .. _version_1.3: Version 1.3 (December 22nd, 2014) --------------------------------- With `Stem's 1.3 release `_ it's now much easier to `work with hidden services `_, 40% faster to read decriptors, and includes a myriad of other improvements. For a nice description of the changes this brings see `Nathan Willis' LWN article `_. * **Controller** * Added :class:`~stem.control.Controller` methods to more easily work with hidden service configurations: :func:`~stem.control.Controller.get_hidden_service_conf`, :func:`~stem.control.Controller.set_hidden_service_conf`, :func:`~stem.control.Controller.create_hidden_service`, and :func:`~stem.control.Controller.remove_hidden_service` (:trac:`12533`) * Added :func:`~stem.control.Controller.get_accounting_stats` to the :class:`~stem.control.Controller` * Added :func:`~stem.control.Controller.get_effective_rate` to the :class:`~stem.control.Controller` * Added :func:`~stem.control.BaseController.connection_time` to the :class:`~stem.control.BaseController` * Changed :func:`~stem.control.Controller.get_microdescriptor`, :func:`~stem.control.Controller.get_server_descriptor`, and :func:`~stem.control.Controller.get_network_status` to get our own descriptor if no fingerprint or nickname is provided. * Added :class:`~stem.exit_policy.ExitPolicy` methods for more easily handling 'private' policies (the `default prefix `_) and the defaultly appended suffix. This includes :func:`~stem.exit_policy.ExitPolicy.has_private`, :func:`~stem.exit_policy.ExitPolicy.strip_private`, :func:`~stem.exit_policy.ExitPolicy.has_default`, and :func:`~stem.exit_policy.ExitPolicy.strip_default` :class:`~stem.exit_policy.ExitPolicy` methods in addition to :func:`~stem.exit_policy.ExitPolicyRule.is_private` and :func:`~stem.exit_policy.ExitPolicyRule.is_default` for the :class:`~stem.exit_policy.ExitPolicyRule`. (:trac:`10107`) * Added the reason attribute to :class:`~stem.response.events.HSDescEvent` (:spec:`7908c8d`) * :func:`~stem.process.launch_tor_with_config` could cause a "Too many open files" OSError if called too many times (:trac:`13141`) * The :func:`~stem.control.Controller.get_exit_policy` method errored if tor couldn't determine our external address * The Controller's methods for retrieving descriptors could raise unexpected ValueErrors if tor didn't have any descriptors available * Throwing a new :class:`~stem.DescriptorUnavailable` exception type when the :class:`~stem.control.Controller` can't provide the descriptor for a relay (:trac:`13879`) * **Descriptors** * Improved speed for parsing consensus documents by around 40% (:trac:`12859` and :trac:`13821`) * Don't fail if consensus method 1 is not present, as it is no longer required (:spec:`fc8a6f0`) * Include '\*.new' files when reading from a Tor data directory (:trac:`13756`) * Updated the authorities we list, `replacing turtles with longclaw `_ and `updating gabelmoo's address `_ * Noting if authorities are also a bandwidth authority or not * Microdescriptor validation issues could result in an AttributeError (:trac:`13904`) * **Utilities** * Added support for directories to :func:`stem.util.conf.Config.load` * Changed :func:`stem.util.conf.uses_settings` to only provide a 'config' keyword arument if the decorated function would accept it * Added :func:`stem.util.str_tools.crop` * Added :func:`stem.util.proc.file_descriptors_used` * Dropped the 'get_*' prefix from most function names. Old names will still work, but are a deprecated alias. * **Interpreter** * The /info command errored for relays without contact information * **Website** * Tutorial for `hidden services `_ * Example for `writing descriptors to disk and reading them back `_ (:trac:`13774`) * Added Gentoo to our `download page `_ and handful of testing revisions for that platform (:trac:`13904`) * Tests for our tutorial examples (:trac:`11335`) * Revised `GitWeb `_ urls to work after its upgrade .. _version_1.2: Version 1.2 (June 1st, 2014) ---------------------------- `Stem release 1.2 `_ added our `interactive Tor interpreter `_ among numerous other improvements and fixes. * **Controller** * New, better :func:`~stem.connection.connect` function that deprecates :func:`~stem.connection.connect_port` and :func:`~stem.connection.connect_socket_file` * Added :func:`~stem.control.Controller.is_newnym_available` and :func:`~stem.control.Controller.get_newnym_wait` methods to the :class:`~stem.control.Controller` * Added :func:`~stem.control.Controller.get_ports` and :func:`~stem.control.Controller.get_listeners` methods to the :class:`~stem.control.Controller` * Added :func:`~stem.control.Controller.drop_guards` (:trac:`10032`, :spec:`7c6c7fc`) * Added the id attribute to :class:`~stem.response.events.ORConnEvent` (:spec:`6f2919a`) * Added `support for CONN_BW events `_ (:spec:`6f2919a`) * Added `support for CIRC_BW events `_ (:spec:`6f2919a`) * Added `support for CELL_STATS events `_ (:spec:`6f2919a`) * Added `support for TB_EMPTY events `_ (:spec:`6f2919a`) * Added `support for HS_DESC events `_ (:trac:`10807`, :spec:`a67ac4d`) * Changed :func:`~stem.control.Controller.get_network_status` and :func:`~stem.control.Controller.get_network_statuses` to provide :class:`~stem.descriptor.router_status_entry.RouterStatusEntryMicroV3` if Tor is using microdescriptors (:trac:`7646`) * The :func:`~stem.connection.connect_port` and :func:`~stem.connection.connect_socket_file` didn't properly mark the Controller it returned as being authenticated, causing event listening among other things to fail * The :func:`~stem.control.Controller.add_event_listener` method couldn't accept event types that Stem didn't already recognize * The :class:`~stem.exit_policy.ExitPolicy` class couldn't be pickled * Tor instances spawned with :func:`~stem.process.launch_tor` and :func:`~stem.process.launch_tor_with_config` could hang due to unread stdout content, we now close stdout and stderr once tor finishes bootstrapping (:trac:`9862`) * **Descriptors** * Added tarfile support to :func:`~stem.descriptor.__init__.parse_file` (:trac:`10977`) * Added microdescriptor's new identifier and identifier_type attributes (:spec:`22cda72`) * **Utilities** * Added the `stem.util.test_tools `_ module * Started vending the `stem.util.tor_tools `_ module * Added :func:`stem.util.connection.port_usage` * Added :func:`stem.util.system.files_with_suffix` * **Interpreter** * Initial release of our `interactive Tor interpreter `_! * **Website** * Added a section with `example scripts `_. * Made FAQ and other sections quite a bit more succinct. * **Version 1.2.2** (June 7th, 2014) - fixed an issue where the stem.util.conf module would fail under Python 2.6 with an AttributeError (:trac:`12223`) * **Version 1.2.1** (June 3rd, 2014) - fixed an issue where descriptor parsersing would fail under Python 3.x with a TypeError (:trac:`12185`) .. _version_1.1: Version 1.1 (October 14th, 2013) -------------------------------- `Stem release 1.1 `_ introduced `remote descriptor fetching `_, `connection resolution `_ and a myriad of smaller improvements and fixes. * **Controller** * :func:`~stem.control.Controller.get_network_status` and :func:`~stem.control.Controller.get_network_statuses` now provide v3 rather than v2 directory information (:trac:`7953`, :spec:`d2b7ebb`) * :class:`~stem.response.events.AddrMapEvent` support for the new CACHED argument (:trac:`8596`, :spec:`25b0d43`) * :func:`~stem.control.Controller.attach_stream` could encounter an undocumented 555 response (:trac:`8701`, :spec:`7286576`) * :class:`~stem.descriptor.server_descriptor.RelayDescriptor` digest validation was broken when dealing with non-unicode content with Python 3 (:trac:`8755`) * The :class:`~stem.control.Controller` use of cached content wasn't thread safe (:trac:`8607`) * Added :func:`~stem.control.Controller.get_user` method to the :class:`~stem.control.Controller` * Added :func:`~stem.control.Controller.get_pid` method to the :class:`~stem.control.Controller` * :class:`~stem.response.events.StreamEvent` didn't recognize IPv6 addresses (:trac:`9181`) * :func:`~stem.control.Controller.get_conf` mistakenly cached hidden service related options (:trac:`9792`) * Added `support for TRANSPORT_LAUNCHED events `_ (:spec:`48f6dd0`) * **Descriptors** * Added the `stem.descriptor.remote `_ module. * Added support for `TorDNSEL exit lists `_ (:trac:`8255`) * The :class:`~stem.descriptor.reader.DescriptorReader` mishandled relative paths (:trac:`8815`) * **Utilities** * Connection resolution via the :func:`~stem.util.connection.get_connections` function (:trac:`7910`) * :func:`~stem.util.system.set_process_name` inserted spaces between characters (:trac:`8631`) * :func:`~stem.util.system.pid_by_name` can now pull for all processes with a given name * :func:`~stem.util.system.call` ignored the subprocess' exit status * Added :func:`stem.util.system.name_by_pid` * Added :func:`stem.util.system.user` * Added :func:`stem.util.system.start_time` * Added :func:`stem.util.system.bsd_jail_path` * Added :func:`stem.util.system.is_tarfile` * Added :func:`stem.util.connection.is_private_address` * **Website** * Overhaul of Stem's `download page `_. This included several improvements, most notably the addition of PyPI, Ubuntu, Fedora, Slackware, and FreeBSD. * Replaced default sphinx header with a navbar menu. * Added this change log. * Added the `FAQ page `_. * Settled on a `logo `_ for Stem. * Expanded the `client usage tutorial `_ to cover SocksiPy and include an example for polling Twitter. * Subtler buttons for the frontpage (`before `_ and `after `_). * **Version 1.1.1** (November 9th, 2013) - fixed an issue where imports of stem.util.system would fail with an ImportError for pwd under Windows (:trac:`10072`) .. _version_1.0: Version 1.0 (March 26th, 2013) ------------------------------ This was the `initial release of Stem `_. * **Version 1.0.1** (March 27th, 2013) - fixed an issue where installing with Python 3.x (python3 setup.py install) resulted in a stacktrace stem-1.7.1/docs/faq.rst0000664000175000017500000005510113341474573015460 0ustar atagaratagar00000000000000Frequently Asked Questions ========================== * **General Information** * :ref:`what_is_stem` * :ref:`does_stem_have_any_dependencies` * :ref:`what_python_versions_is_stem_compatible_with` * :ref:`can_i_interact_with_tors_controller_interface_directly` * :ref:`are_there_any_other_controller_libraries` * :ref:`what_license_is_stem_under` * :ref:`where_can_i_get_help` * **Usage** * :ref:`how_do_i_connect_to_tor` * :ref:`how_do_i_request_a_new_identity_from_tor` * :ref:`how_do_i_reload_my_torrc` * :ref:`how_do_i_read_tar_xz_descriptor_archives` * :ref:`what_is_that_with_keyword_i_keep_seeing_in_the_tutorials` * **Development** * :ref:`how_do_i_get_started` * :ref:`how_do_i_run_the_tests` * :ref:`how_do_i_test_compatibility_with_multiple_python_versions` * :ref:`how_do_i_build_the_site` * :ref:`what_is_the_copyright_for_patches` General Information =================== .. _what_is_stem: What is Stem? ------------- Stem is a Python controller library that you can use to interact with `Tor `_. With it you can write scripts and applications with capabilities similar `Nyx `_. From a technical standpoint, Stem is a Python implementation of Tor's `directory `_ and `control specifications `_. `To get started see our tutorials! `_ .. _does_stem_have_any_dependencies: Does Stem have any dependencies? -------------------------------- **No.** All you need in order to use Stem is Python. When it is available Stem will use `cryptography `_ and `PyNaCl `_ to validate descriptor signatures. However, there is no need to install cryptography unless you need this functionality. Note that if cryptography installation fails with... :: build/temp.linux-i686-2.7/_openssl.c:18:20: fatal error: Python.h: No such file or directory compilation terminated. error: command 'gcc' failed with exit status 1 ... or... :: No package 'libffi' found c/_cffi_backend.c:15:17: fatal error: ffi.h: No such file or directory compilation terminated. You need the python-dev and libffi-dev packages. For instance on Debian and Ubuntu you can install these with... :: % sudo apt-get install python-dev libffi-dev % sudo pip install cryptography % sudo pip install pynacl .. _what_python_versions_is_stem_compatible_with: What Python versions is Stem compatible with? --------------------------------------------- Stem works with **Python 2.6 and greater**, including the Python 3.x series. .. _can_i_interact_with_tors_controller_interface_directly: Can I interact with Tor's controller interface directly? -------------------------------------------------------- Yup. You don't need a library to interact with Tor's `controller interface `_, and interacting with it directly is a great way to learn about what it can do. The exact details for how you connect to Tor depend on two things... * Where is Tor listening for controller connections? This is specified by either the **ControlPort** or **ControlSocket** option in your torrc. If you have neither then Tor will not accept controller connections. * What type of authentication is Tor's controller interface using? This is defined by your **CookieAuthentication** or **HashedControlPassword** option. If you have neither then Tor does not restrict access. We'll tackle each of these scenarios one at a time... **I'm using a ControlPort** ~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you are using a **ControlPort** then the easiest method of talking with Tor is via **telnet**. You always need to authenticate after connecting, even if Tor does not restrict access. If your torrc doesn't have a **CookieAuthentication** or **HashedControlPassword** then to authenticate you will simply call **AUTHENTICATE** after connecting without any credentials. :: % cat ~/.tor/torrc ControlPort 9051 % telnet localhost 9051 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. AUTHENTICATE 250 OK GETINFO version 250-version=0.2.5.1-alpha-dev (git-245ecfff36c0cecc) 250 OK QUIT 250 closing connection Connection closed by foreign host. **I'm using a ControlSocket** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A **ControlSocket** is a file based socket, so we'll use **socat** to connect to it... :: % cat ~/.tor/torrc ControlSocket /home/atagar/.tor/socket % socat UNIX-CONNECT:/home/atagar/.tor/socket STDIN AUTHENTICATE 250 OK GETINFO version 250-version=0.2.5.1-alpha-dev (git-245ecfff36c0cecc) 250 OK QUIT 250 closing connection **I'm using cookie authentication** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Cookie authentication simply means that your credential is the content of a file in Tor's **DataDirectory**. You can learn information about Tor's method of authentication (including the cookie file's location) by calling **PROTOCOLINFO**... :: % cat ~/.tor/torrc ControlPort 9051 CookieAuthentication 1 % telnet localhost 9051 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. PROTOCOLINFO 250-PROTOCOLINFO 1 250-AUTH METHODS=COOKIE,SAFECOOKIE COOKIEFILE="/home/atagar/.tor/control_auth_cookie" 250-VERSION Tor="0.2.5.1-alpha-dev" 250 OK Cookie authentication has two flavors: **COOKIE** and **SAFECOOKIE**. Below we'll show you how to authenticate via COOKIE. SAFECOOKIE authentication is a lot more involved, and not something you will want to do by hand (though Stem supports it transparently). To get the credential for your AUTHENTICATE command we will use **hexdump**... :: % hexdump -e '32/1 "%02x""\n"' /home/atagar/.tor/control_auth_cookie be9c9e18364e33d5eb8ba820d456aa2bc03444c0420f089ba4569b6aeecc6254 % telnet localhost 9051 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. AUTHENTICATE be9c9e18364e33d5eb8ba820d456aa2bc03444c0420f089ba4569b6aeecc6254 250 OK GETINFO version 250-version=0.2.5.1-alpha-dev (git-245ecfff36c0cecc) 250 OK QUIT 250 closing connection Connection closed by foreign host. **I'm using password authentication** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Tor's other method of authentication is a credential you know. To use it ask Tor to hash your password, then use that in your torrc... :: % tor --hash-password "my_password" 16:E600ADC1B52C80BB6022A0E999A7734571A451EB6AE50FED489B72E3DF Authenticating with this simply involves giving Tor the credential... :: % cat ~/.tor/torrc ControlPort 9051 HashedControlPassword 16:E600ADC1B52C80BB6022A0E999A7734571A451EB6AE50FED489B72E3DF % telnet localhost 9051 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. AUTHENTICATE "my_password" 250 OK GETINFO version 250-version=0.2.5.1-alpha-dev (git-245ecfff36c0cecc) 250 OK QUIT 250 closing connection Connection closed by foreign host. .. _are_there_any_other_controller_libraries: Are there any other controller libraries? ----------------------------------------- Yup. The most mature controller libraries are written in Python, but there's a few options in other languages as well. By far the most mature alternative to Stem are `Txtorcon `_ and `TorCtl `_. `Txtorcon `_ is an actively maintained controller library written by Meejah for `Twisted `_. `TorCtl `_ was Stem's predecessor and `deprecated in December 2012 `_ in favor of Stem. Though no longer actively developed, it's still quite functional and still used for several `TorFlow `_ based projects. For PHP `TorUtils `_ supports a wide range of controller functionality. For examples of its usage see `Drew's tor-nodes `_ and `Open Internet `_. The following are the functional controller libraries I'm aware of. Dates are for highly active development. If I missed one then please `let me know `_! ================================================================== ================ ======================= Library Language Developed ================================================================== ================ ======================= `Stem `_ Python October 2011 - Present `Txtorcon `_ Python (Twisted) February 2012 - Present `TorCtl `_ Python July 2008 - November 2011 `TorUtils `_ PHP October 2015 - Present `Puccinia `_ Rust October 2015 - July 2017 `PHP TorCtl `_ PHP February 2013 `JTorCtl `_ Java June 2005 - May 2009 `Bine `_ Go May 2018 `Orc `_ Go January 2015 `Bulb `_ Go March 2015 `Rust Controller `_ Rust May 2016 ================================================================== ================ ======================= .. _what_license_is_stem_under: What license is Stem under? --------------------------- Stem is under the `LGPLv3 `_. .. _where_can_i_get_help: Where can I get help? --------------------- Do you have a Tor related question or project that you would like to discuss? If so then find us on the `tor-dev@ email list `_ and `IRC `_. Usage ===== .. _how_do_i_connect_to_tor: How do I connect to Tor? ------------------------ Once you have Tor running and `properly configured `_ you have a few ways of connecting to it. The following are the most common methods for getting a :class:`~stem.control.Controller` instance, from the highest to lowest level... #. `Connection Module `_ Writing a commandline script? Then the :func:`~stem.connection.connect` function provide you the quickest and most hassle free method for getting a :class:`~stem.control.Controller`. This function connects and authenticates to the given port or socket, providing you a one-line method of getting a :class:`~stem.control.Controller` that's ready to use. If Tor requires a password then the user will be prompted for it. When the connection cannot be established this prints a description of the problem to stdout and returns **None**. #. `Control Module `_ The connection module helpers above are all well and good when you need a quick-and-dirty connection for your commandline script, but they're inflexible. In particular their lack of exceptions and direct use of stdin/stdout make them undesirable for more complicated situations. That's where the Controller's :func:`~stem.control.Controller.from_port` and :func:`~stem.control.Controller.from_socket_file` methods come in. These provide the most flexible method of connecting to Tor, and for sophisticated applications is what you'll want. #. `Socket Module `_ For the diehards among us you can skip the conveniences of a high level :class:`~stem.control.Controller` and work directly with the raw components. At Stem's lowest level your connection with Tor is a :class:`~stem.socket.ControlSocket` subclass. This provides methods to send, receive, disconnect, and reconnect to Tor. .. _how_do_i_request_a_new_identity_from_tor: How do I request a new identity from Tor? ----------------------------------------- In Tor your identity is the three-hop **circuit** over which your traffic travels through the Tor network. Tor periodically creates new circuits. When a circuit is used it becomes **dirty**, and after ten minutes new connections will not use it. When all of the connections using an expired circuit are done the circuit is closed. An important thing to note is that a new circuit does not necessarily mean a new IP address. Paths are randomly selected based on heuristics like speed and stability. There are only so many large exits in the Tor network, so it's not uncommon to reuse an exit you have had previously. Tor does not have a method for cycling your IP address. This is on purpose, and done for a couple reasons. The first is that this capability is usually requested for not-so-nice reasons such as ban evasion or SEO. Second, repeated circuit creation puts a very high load on the Tor network, so please don't! With all that out of the way, how do you create a new circuit? You can customize the rate at which Tor cycles circuits with the **MaxCircuitDirtiness** option in your `torrc `_. `Vidalia `_ and `Nyx `_ both provide a method to request a new identity, and you can do so programmatically by sending Tor a NEWNYM signal. To do this with telnet... :: % telnet localhost 9051 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. AUTHENTICATE 250 OK SIGNAL NEWNYM 250 OK And with Stem... :: from stem import Signal from stem.control import Controller with Controller.from_port(port = 9051) as controller: controller.authenticate() controller.signal(Signal.NEWNYM) .. _how_do_i_reload_my_torrc: How do I reload my torrc? ------------------------- Tor is configured through its `torrc `_. When you edit this file you need to either restart Tor or issue a **HUP** for the changes to be reflected. To issue a HUP you can either... * Run **pkill -sighup tor**. * Send Tor a **HUP** signal through its control port... :: from stem import Signal from stem.control import Controller with Controller.from_port(port = 9051) as controller: controller.authenticate() controller.signal(Signal.HUP) .. _how_do_i_read_tar_xz_descriptor_archives: How do I read \*.tar.xz descriptor archives? -------------------------------------------- Stem's :func:`~stem.descriptor.__init__.parse_file` and :class:`~stem.descriptor.reader.DescriptorReader` can read plaintext descriptors and tarballs. However, `metrics uses *.xz compression `_. Python 3.3 adds builtin xz support, but if you're using an earlier version of python you will need to decompress the archives yourself. With modern versions of tar you can simply decompress archives via **tar xf archive.tar.xz**, or programmatically using `lzma `_. .. _what_is_that_with_keyword_i_keep_seeing_in_the_tutorials: What is that 'with' keyword I keep seeing in the tutorials? ----------------------------------------------------------- Python's `with `_ keyword is shorthand for a try/finally block. With a :class:`~stem.control.Controller` the following... .. code-block:: python with Controller.from_port(port = 9051) as controller: # do my stuff ... is equivalent to... .. code-block:: python controller = Controller.from_port(port = 9051) try: # do my stuff finally: controller.close() This helps to make sure that regardless of if your code raises an exception or not the control connection will be cleaned up afterward. Note that this means that if you leave the 'with' scope your :class:`~stem.control.Controller` will be closed. The following for instance is a bug common when first learning Stem... :: class BandwidthReporter(object): def __init__(self, controller): self.controller = controller def print_bandwidth(self): bytes_read = self.controller.get_info("traffic/read") bytes_written = self.controller.get_info("traffic/written") print "My Tor relay has read %s bytes and written %s." % (bytes_read, bytes_written) if __name__ == '__main__': with Controller.from_port(port = 9051) as controller: reporter = BandwidthReporter(controller) # The following line is broken because the 'controller' we initialised # above was disconnected once we left the 'with' scope. To fix this the # print_bandwidth() call should be in the 'with' block. reporter.print_bandwidth() Development =========== .. _how_do_i_get_started: How do I get started? --------------------- The best way of getting involved with any project is to jump right in! Our `bug tracker `_ lists several development tasks. In particular look for the 'easy' keyword when getting started. If you have any questions then I'm always more than happy to help! I'm **atagar** on `oftc `_ and also available `via email `_. To start hacking on Stem please do the following and don't hesitate to let me know if you get stuck or would like to discuss anything! #. Clone our `git `_ repository: **git clone https://git.torproject.org/stem.git** #. Get our test dependencies: **sudo pip install mock pycodestyle pyflakes**. #. Find a `bug or feature `_ that sounds interesting. #. When you have something that you would like to contribute back do the following... * If you don't already have a publicly accessible Stem repository then set one up. `GitHub `_ in particular is great for this. * File a `trac ticket `_, the only fields you'll need are... * Summary: short description of your change * Description: longer description and a link to your repository with either the git commits or branch that has your change * Type: 'defect' if this is a bug fix and 'enhancement' otherwise * Priority: rough guess at the priority of your change * Component: Core Tor / Stem * I'll review the change and give suggestions. When we're both happy with it I'll push your change to the official repository. .. _how_do_i_run_the_tests: How do I run the tests? ----------------------- Stem has three kinds of tests: **unit**, **integration**, and **static**. **Unit** tests are our most frequently ran tests. They're quick, they're easy, and provide good test coverage... :: ~$ cd stem/ ~/stem$ ./run_tests.py --unit **Integration** tests start a live Tor instance and test against that. This not only provides additional test coverage, but lets us check our continued interoperability with new releases of Tor. Running these require that you have `Tor installed `_. You can exercise alternate Tor configurations with the ``--target`` argument (see ``run_tests.py --help`` for a list of its options). :: ~/stem$ ./run_tests.py --integ ~/stem$ ./run_tests.py --integ --tor /path/to/tor ~/stem$ ./run_tests.py --integ --target RUN_COOKIE **Static** tests use `pyflakes `_ to do static error checking and `pycodestyle `_ for style checking. If you have them installed then they automatically take place as part of all test runs. See ``run_tests.py --help`` for more usage information. .. _how_do_i_test_compatibility_with_multiple_python_versions: How can I test compatibility with multiple python versions? ----------------------------------------------------------- Stem supports python versions 2.6 and above, including the 3.x series. You can test all versions of python you currently have installed on your system with `tox `_. If you're using a Debian based system this can be as simple as... :: ~/stem$ sudo apt-get install python-tox python2.7 python3.3 python-dev python3-dev ~/stem$ tox ... ____ summary _____ SKIPPED: py26: InterpreterNotFound: python2.6 py27: commands succeeded SKIPPED: py32: InterpreterNotFound: python3.2 py33: commands succeeded SKIPPED: py34: InterpreterNotFound: python3.4 SKIPPED: py35: InterpreterNotFound: python3.5 SKIPPED: py36: InterpreterNotFound: python3.6 SKIPPED: py37: InterpreterNotFound: python3.7 SKIPPED: jython: InterpreterNotFound: jython SKIPPED: pypy: InterpreterNotFound: pypy congratulations :) Tox fetches Stem's dependencies for each version of python. One of these dependencies is pycrypto which requires **python-dev** (or **python3-dev** if testing with python3). Tox also allows you to customize the underlying commands and environments. For example... :: # run the tests with just python 2.6 ~/stem$ tox -e py26 # pass arguments to 'run_tests.py' ~/stem$ tox -e py26 -- -u --test response.events .. _how_do_i_build_the_site: How do I build the site? ------------------------ If you have `Sphinx `_ version 1.1 or later installed then building our site is as easy as... :: ~$ cd stem/docs ~/stem/docs$ make html When it's finished you can direct your browser to the *_build* directory with a URI similar to... :: file:///home/atagar/stem/docs/_build/html/index.html .. _what_is_the_copyright_for_patches: What is the copyright for patches? ---------------------------------- Stem is under the LGPLv3 which is a fine license, but poses a bit of a problem for sharing code with our other projects (which are mostly BSD). To share code without needing to hunt down prior contributors we need Tor to have the copyright for the whole Stem codebase. Presently the copyright of Stem is jointly held by its main author (`Damian `_) and the `Tor Project `_. If you submit a substantial patch I'll ask if you're fine with it being in the public domain. This would mean that there are no legal restrictions for using your contribution, and hence won't pose a problem if we reuse Stem code in other projects. stem-1.7.1/docs/republish0000775000175000017500000000020313157571677016103 0ustar atagaratagar00000000000000#!/bin/sh export PATH=/home/stem/bin:$PATH export PYTHONPATH=/home/stem/lib/python python /home/stem/stem/docs/republish.py $*& stem-1.7.1/docs/tutorials/0000775000175000017500000000000013411004021016152 5ustar atagaratagar00000000000000stem-1.7.1/docs/tutorials/double_double_toil_and_trouble.rst0000664000175000017500000001747513411002341025136 0ustar atagaratagar00000000000000Double Double Toil and Trouble ============================== Below is a listing of scripts and applications that use Stem. If you have something you would like to have included on this page then `let me know `_! Applications ============ .. Image Sources: * Nyx Source: Oxygen (http://www.oxygen-icons.org/) License: CC v3 (A, SA) File: apps/utilities-system-monitor.png * Doctor Source: https://openclipart.org/detail/29839/stethoscope-by-metalmarious License: Public Domain * Exit Map Source: https://openclipart.org/detail/120607/treasure-map-by-tzunghaor License: Public Domain .. list-table:: :widths: 1 10 :header-rows: 0 * - .. image:: /_static/nyx.png :target: https://nyx.torproject.org/ - .. image:: /_static/label/nyx.png :target: https://nyx.torproject.org/ Terminal status monitor for Tor. This provides a top like interface including system resource usage, connection information, and much more. * - .. image:: /_static/doctor.png :target: https://gitweb.torproject.org/doctor.git/tree - .. image:: /_static/label/doctor.png :target: https://gitweb.torproject.org/doctor.git/tree Monitors the Tor consensus for a variety of issues including malformed descriptors, directory authority issues, sybil attacks, and much more. * - .. image:: /_static/exit_map.png :target: http://www.cs.kau.se/philwint/spoiled_onions/ - .. image:: /_static/label/exit_map.png :target: http://www.cs.kau.se/philwint/spoiled_onions/ Scanner by Philipp Winter to detect malicious and misconfigured Tor exits. For more information about how it works see his `Spoiled Onions `_ research paper. =========================================================================================================== ========== `OnionLauncher `_ Qt interface for launching tor. `TorNova `_ GTK interface for launching tor. `BeagleBone for Secret Agents `_ Bridge with a `bandwidth monitor `_ on a BeagleBoard. `NavigaTor `_ Measures round-trip times for Tor circuits. `TorPS `_ Tor path simulator. `Metrics Tasks `_ One-off tasks related to Tor metrics. These mostly involve using descriptor information to answer a particular question. Tasks that involve Stem are: `1854 `_, `6232 `_, and `7241 `_. `Onion Box `_ Web dashboard for relay operation. `check_tor `_ Nagios check to verify that a relay is participating in the Tor network. `munin-tor `_ Plugin to provide Munin graphs. `tbbscraper `_ Automated website scraper over Tor. `torIRC `_ IRC-like chat client using Tor hidden services. `exit-funding `_ Script to estimate how much exit relays have been used. `torsearch `_ Search engine prototype for descriptor data. `or-applet `_ GUI widget to provide circuit information and an interactive interpreter. `OnionBalance `_ Tool for making distributed hidden service requests. `OnionPerf `_ Measures onion service performance over time using customizable client behavior models. `OnioNS `_ Distributed DNS for hidden services. `OnionShare `_ Hidden service based file sharing application. `OnionView `_ GTK interface for viewing circuit information. `OnionCircuits `_ GTK interface for viewing circuit information. `Syboa `_ GTK interface similar to `TorK `_. `hs-health `_ Experiment to measure churn and reachability of hidden services. `trnnr `_ Python implementation of tor's nearest neighbour ranking. `TorTP `_ Configures iptables to torify all traffic. `BWScanner `_ Measurements for the tor bandwidth authorities. Interesting example of txtorcon and stem being used together. `blockstack-tor `_ Tor integration for `Blockstack `_ =========================================================================================================== ========== Scripts ======= Client Usage ------------ * `List Circuits `_ List the path Tor uses for its present circuits. * `Determine The Exit You're Using `_ Tells you the exit used for each Tor connection. Relays ------ * `Connection Summary `_ Provides a summary of your inbound and outbound connections and exiting usage. Descriptors ----------- * `Download Descriptors `_ Download a descriptor from a Tor relay's ORPort or DirPort. * `List Outdated Relays `_ Prints contact information for relays prior to a given version. * `Comparing Directory Authority Flags `_ Compares the votes of two directory authorities, in this case moria1 and maatuska with a special interest in the 'Running' flag. * `Votes by Bandwidth Authorities `_ Provides information about the current votes from Tor's Bandwidth Authorities. * `Saving and Loading a Tor Consensus `_ Example for writing a Tor consensus to disk, and reading it back. stem-1.7.1/docs/tutorials/examples/0000775000175000017500000000000013411004021017770 5ustar atagaratagar00000000000000stem-1.7.1/docs/tutorials/examples/compare_flags.rst0000664000175000017500000000155213157571677023370 0ustar atagaratagar00000000000000Comparing Directory Authority Flags =================================== .. image:: /_static/buttons/back.png :target: ../double_double_toil_and_trouble.html Compares the votes of two directory authorities, in this case moria1 and maatuska, with a special interest in the 'Running' flag. .. literalinclude:: /_static/example/compare_flags.py :language: python :: % python compare_flags.py maatuska has the Running flag but moria1 doesn't: 92FCB6748A40E6088E22FBAB943AB2DD743EA818 maatuska has the Running flag but moria1 doesn't: 6871F682350BA931838C0EC1E4A23044DAE06A73 maatuska has the Running flag but moria1 doesn't: E2BB13AA2F6960CD93ABE5257A825687F3973C62 moria1 has the Running flag but maatuska doesn't: 546C54E2A89D88E0794D04AECBF1AC8AC9DA81DE moria1 has the Running flag but maatuska doesn't: DCAEC3D069DC39AAE43D13C8AF31B5645E05ED61 ... stem-1.7.1/docs/tutorials/examples/persisting_a_consensus.rst0000664000175000017500000000403113157571677025350 0ustar atagaratagar00000000000000Saving and Loading a Tor Consensus ================================== .. image:: /_static/buttons/back.png :target: ../double_double_toil_and_trouble.html Reading and writing a Tor consensus to disk is similar to `other descriptor types <../mirror_mirror_on_the_wall.html#saving-and-loading-descriptors>`_ with one small difference. Most descriptors are just about a single relay. Server descriptors and microdescriptors, for instance, can be concatenated together and dumped to a file because they're each independent of each other. The Tor consensus, however, is a larger document containing information about the Tor network in addition to a little data on each of the relays. In Stem the overall document is a :class:`~stem.descriptor.networkstatus.NetworkStatusDocumentV3`, and the information on individual relays are :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3` instances. Why does this matter? By default when you read a consensus Stem provides you **just** the :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3`. This is for performance reasons, and because usually that's what developers want. But for writing the conssensus to disk we'll want the whole document instead. So how do we get it? Just tell Stem that's what you want. The :class:`~stem.descriptor.__init__.DocumentHandler` tells Stem how to read the consensus. For example, to write the consensus simply do the following... .. literalinclude:: /_static/example/persisting_a_consensus.py :language: python Our *consensus* here is the current :class:`~stem.descriptor.networkstatus.NetworkStatusDocumentV3`. The **descriptor_dump** file now looks like... :: network-status-version 3 vote-status consensus consensus-method 18 valid-after 2014-11-17 23:00:00 fresh-until 2014-11-18 00:00:00 valid-until 2014-11-18 02:00:00 voting-delay 300 300 ... etc... You can then read it back with :func:`~stem.descriptor.__init__.parse_file`... .. literalinclude:: /_static/example/persisting_a_consensus_with_parse_file.py :language: python stem-1.7.1/docs/tutorials/examples/exit_used.rst0000664000175000017500000000221613157571677022555 0ustar atagaratagar00000000000000Determine The Exit You're Using =============================== .. image:: /_static/buttons/back.png :target: ../double_double_toil_and_trouble.html Lets say you're using Tor and one day you run into something odd. Maybe a misconfigured relay, or maybe one that's being malicious. How can you figure out what exit you're using? Here's a simple script that prints information about the exits used to service the requests going through Tor... .. literalinclude:: /_static/example/exit_used.py :language: python Now if you make a request over Tor... :: % curl --socks4a 127.0.0.1:9050 google.com 301 Moved

301 Moved

The document has moved here. ... this script will tell you about the exit... :: % python exit_used.py Tracking requests for tor exits. Press 'enter' to end. Exit relay for our connection to 64.15.112.44:80 address: 31.172.30.2:443 fingerprint: A59E1E7C7EAEE083D756EE1FF6EC31CA3D8651D7 nickname: chaoscomputerclub19 locale: unknown stem-1.7.1/docs/tutorials/examples/relay_connections.rst0000664000175000017500000000334013340051401024245 0ustar atagaratagar00000000000000Connection Summary ================== .. image:: /_static/buttons/back.png :target: ../double_double_toil_and_trouble.html The following provides a summary of your relay's inbound and outbound connections. Couple important notes... * To use this you must set **DisableDebuggerAttachment 0** in your torrc. Otherwise connection information will be unavailable. * **Be careful about the data you look at.** Inspection of client and exit traffic especially is wiretapping and not only unethical but likely illegal. That said, a general overview like this should be fine. .. literalinclude:: /_static/example/relay_connections.py :language: python :: % relay_connections.py --ctrlport 29051 0.3.2.0-alpha-dev uptime: 01:20:44 flags: none +------------------------------+------+------+ | Type | IPv4 | IPv6 | +------------------------------+------+------+ | Inbound to our ORPort | 2400 | 3 | | Inbound to our DirPort | 12 | 0 | | Inbound to our ControlPort | 2 | 0 | | Outbound to a relay | 324 | 0 | | Outbound exit traffic | 3 | 0 | +------------------------------+------+------+ | Total | 2741 | 3 | +------------------------------+------+------+ +------------------------------+------+------+ | Exit Port | IPv4 | IPv6 | +------------------------------+------+------+ | 443 (HTTPS) | 1 | 0 | | 8443 (PCsync HTTPS) | 1 | 0 | | 54682 | 1 | 0 | +------------------------------+------+------+ | Total | 3 | 0 | +------------------------------+------+------+ stem-1.7.1/docs/tutorials/examples/votes_by_bandwidth_authorities.rst0000664000175000017500000000273413157571677027067 0ustar atagaratagar00000000000000Votes by Bandwidth Authorities ============================== .. image:: /_static/buttons/back.png :target: ../double_double_toil_and_trouble.html Tor takes into account a relay's throughput when picking a route through the Tor network for its circuits. That is to say large, fast relays receive more traffic than small ones since they can better service the load. To determine a relay's throughput special authorities, called **bandwidth authorities**, take periodic measurements using them. The `lifecycle of new Tor relays `_ is a bit more complicated than that, but that's the general idea. Bandwidth authorities include their measurements in their votes. The following gets their current votes then prints how many relays it had a measurement for. .. literalinclude:: /_static/example/votes_by_bandwidth_authorities.py :language: python :: % python bandwidth_auth_measured_counts.py Getting gabelmoo's vote from http://131.188.40.189:80/tor/status-vote/current/authority: 5935 measured entries and 1332 unmeasured Getting tor26's vote from http://86.59.21.38:80/tor/status-vote/current/authority: 5735 measured entries and 1690 unmeasured Getting moria1's vote from http://128.31.0.39:9131/tor/status-vote/current/authority: 6647 measured entries and 625 unmeasured Getting maatuska's vote from http://171.25.193.9:443/tor/status-vote/current/authority: 6313 measured entries and 1112 unmeasured stem-1.7.1/docs/tutorials/examples/list_circuits.rst0000664000175000017500000000215413157571677023445 0ustar atagaratagar00000000000000List Circuits ============= .. image:: /_static/buttons/back.png :target: ../double_double_toil_and_trouble.html Tor creates new circuits and tears down old ones on your behalf, so how can you get information about circuits Tor currently has available? .. literalinclude:: /_static/example/list_circuits.py :language: python :: % python list_circuits.py Circuit 4 (GENERAL) |- B1FA7D51B8B6F0CB585D944F450E7C06EDE7E44C (ByTORAndTheSnowDog, 173.209.180.61) |- 0DD9935C5E939CFA1E07B8DDA6D91C1A2A9D9338 (afo02, 87.238.194.176) +- DB3B1CFBD3E4D97B84B548ADD5B9A31451EEC4CC (edwardsnowden3, 109.163.234.10) Circuit 6 (GENERAL) |- B1FA7D51B8B6F0CB585D944F450E7C06EDE7E44C (ByTORAndTheSnowDog, 173.209.180.61) |- EC01CB4766BADC1611678555CE793F2A7EB2D723 (sprockets, 46.165.197.96) +- 9EA317EECA56BDF30CAEB208A253FB456EDAB1A0 (bolobolo1, 96.47.226.20) Circuit 10 (GENERAL) |- B1FA7D51B8B6F0CB585D944F450E7C06EDE7E44C (ByTORAndTheSnowDog, 173.209.180.61) |- 00C2C2A16AEDB51D5E5FB7D6168FC66B343D822F (ph3x, 86.59.119.83) +- 65242C91BFF30F165DA4D132C81A9EBA94B71D62 (torexit16, 176.67.169.171) stem-1.7.1/docs/tutorials/examples/outdated_relays.rst0000664000175000017500000000137413157571677023760 0ustar atagaratagar00000000000000List Outdated Relays ==================== .. image:: /_static/buttons/back.png :target: ../double_double_toil_and_trouble.html Time marches on. Tor makes new releases, and at some point needs to drop support for old ones. Below is the script we used on :trac:`9476` to reach out to relay operators that needed to upgrade. .. literalinclude:: /_static/example/outdated_relays.py :language: python :: % python outdated_relays.py Checking for outdated relays... 0.2.2.39 Random Person admin@gtr-10.de 0.2.2.36 dobrovich_psckaal at vietrievus dot ok 0.2.2.39 anonymous6 anonymous@mailinator.com 0.2.2.39 anonymous12 anonymous@mailinator.com ... 316 outdated relays found, 120 had contact information stem-1.7.1/docs/tutorials/examples/download_descriptor.rst0000664000175000017500000000200013341474573024610 0ustar atagaratagar00000000000000Download Tor Descriptors ======================== .. image:: /_static/buttons/back.png :target: ../double_double_toil_and_trouble.html Tor relays provide a mirror for the tor relay descriptors it has cached. These are available from its ORPort using `Tor's wire protocol `_, and optionally with http as well from a `DirPort `_. .. literalinclude:: /_static/example/download_descriptor.py :language: python :: % python download_descriptor.py --type consensus --dirport 128.31.0.34:9131 Downloading consensus descriptor from 128.31.0.34:9131... r moria1 lpXfw1/+uGEym58asExGOXAgzjE IpcU7dolas8+Q+oAzwgvZIWx7PA 2018-05-23 02:41:25 128.31.0.34 9101 9131 s Authority Fast Running Stable V2Dir Valid v Tor 0.3.3.5-rc-dev pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2 w Bandwidth=20 Unmeasured=1 p reject 1-65535 stem-1.7.1/docs/tutorials/mirror_mirror_on_the_wall.rst0000664000175000017500000004164313344342215024212 0ustar atagaratagar00000000000000Mirror Mirror on the Wall ========================= The following is an overview of **Tor descriptors**. If you're already familiar with what they are and where to get them then you may want to skip to the end. * :ref:`what-is-a-descriptor` * :ref:`where-do-descriptors-come-from` * :ref:`where-can-i-get-the-current-descriptors` * :ref:`where-can-i-get-past-descriptors` * :ref:`can-i-get-descriptors-from-the-tor-process` * :ref:`can-i-create-descriptors` * :ref:`validating-the-descriptors-content` * :ref:`saving-and-loading-descriptors` * :ref:`putting-it-together` * :ref:`are-there-any-other-parsing-libraries` .. _what-is-a-descriptor: What is a descriptor? --------------------- Tor is made up of two parts: the application and a distributed network of a few thousand volunteer relays. Information about these relays is public, and made up of documents called **descriptors**. There are several different kinds of descriptors, the most common ones being... ================================================================================ =========== Descriptor Type Description ================================================================================ =========== `Server Descriptor <../api/descriptor/server_descriptor.html>`_ Information that relays publish about themselves. Tor clients once downloaded this information, but now they use microdescriptors instead. `ExtraInfo Descriptor <../api/descriptor/extrainfo_descriptor.html>`_ Relay information that Tor clients do not need in order to function. This is self-published, like server descriptors, but not downloaded by default. `Microdescriptor <../api/descriptor/microdescriptor.html>`_ Minimalistic document that just includes the information necessary for Tor clients to work. `Network Status Document <../api/descriptor/networkstatus.html>`_ Though Tor relays are decentralized, the directories that track the overall network are not. These central points are called **directory authorities**, and every hour they publish a document called a **consensus** (aka, network status document). The consensus in turn is made up of **router status entries**. `Router Status Entry <../api/descriptor/router_status_entry.html>`_ Relay information provided by the directory authorities including flags, heuristics used for relay selection, etc. `Hidden Service Descriptor <../api/descriptor/hidden_service_descriptor.html>`_ Information pertaining to a `Hidden Service `_. These can only be `queried through the tor process `_. ================================================================================ =========== .. _where-do-descriptors-come-from: Where do descriptors come from? ------------------------------- Descriptors fall into two camps: * **Server**, **extra-info**, and **hidden service** descriptors are **self-published documents**. Relays and hidden services publish these about themselves, and so naturally can indicate anything they'd like in them (true or not). These are **self contained documents**, bundling within themselves a signiture Stem can `optionally check <./mirror_mirror_on_the_wall.html#validating-the-descriptors-content>`_. * **Network status documents** (aka **votes**, the **consensus**, and **router status entries** they contain) are created by the **directory authorities**. For a great overview on how this works see `Jordan Wright's article on how the consensus is made `_. **Microdescriptors** are merely a distilled copy of a **server descriptor**, and so belong to the first camp. .. _where-can-i-get-the-current-descriptors: Where can I get the current descriptors? ---------------------------------------- To work Tor needs up-to-date relay information. As such getting the current descriptors is easy: *just download it like Tor does*. Every tor relay provides an **ORPort** and many provide a **DirPort** as well which can both be downloaded from using Stem's `stem.descriptor.remote <../api/descriptor/remote.html>`_ module. Listing relays for instance is as easy as... .. literalinclude:: /_static/example/current_descriptors.py :language: python **Please remember that Tor is a shared resource!** If you're going to contribute much load please consider `running a relay `_ to offset your use. **ORPorts** communicate through the `tor protocol `_, and can be downloaded from by specifying it as the endpoint... .. literalinclude:: /_static/example/descriptor_from_orport.py :language: python **DirPorts** by contrast are simpler and specially designed to offer descriptor information, but not all relays offer one. If no endpoint is specified we default to downloading from the DirPorts of tor's directory authorities. If you would like to see what raw descriptors look like try curling a relay's DirPort. Section 6.2 of `tor's directory specification `_ lists the urls you can try. :: % curl 128.31.0.34:9131/tor/server/all router Unnamed 83.227.81.207 9001 0 9030 identity-ed25519 -----BEGIN ED25519 CERT----- AQQABj3aAV7JzKHjSJjocve8jvnMwmy/Pv2HsSKoymeepddNBU5iAQAgBABw1VVB 965QDxs+wicWj4vNXMKIkKCN4gQhvzqG2UxsgmkaQlsKiEMrIxrzwlazP6od9+hi WZKl3tshd0ekgUB6AAKwlvsrxl9wfy0G/Bf8PVsBftvNCWPwLR4pI3nibQU= -----END ED25519 CERT----- master-key-ed25519 cNVVQfeuUA8bPsInFo+LzVzCiJCgjeIEIb86htlMbII ... .. _where-can-i-get-past-descriptors: Where can I get past descriptors? --------------------------------- Descriptor archives are available from `CollecTor `_. These archives can be read with the `DescriptorReader <../api/descriptor/reader.html>`_... .. literalinclude:: /_static/example/past_descriptors.py :language: python .. _can-i-get-descriptors-from-the-tor-process: Can I get descriptors from the Tor process? ------------------------------------------- If you already have Tor running on your system then it is already downloading descriptors on your behalf. Reusing these is a great way to keep from burdening the rest of the Tor network. Tor only gets the descriptors that it needs by default, so if you're scripting against Tor you may want to set some of the following in your `torrc `_. Keep in mind that these add a small burden to the network, so don't set them in a widely distributed application. And, of course, please consider `running Tor as a relay `_ so you give back to the network! .. code-block:: lighttpd # Descriptors have a range of time during which they're valid. To get the # most recent descriptor information, regardless of if Tor needs it or not, # set the following. FetchDirInfoEarly 1 FetchDirInfoExtraEarly 1 # Tor doesn't need all descriptors to function. In particular... # # * Tor no longer downloads server descriptors by default, opting # for microdescriptors instead. # # * If you aren't actively using Tor as a client then Tor will # eventually stop downloading descriptor information altogether # to relieve load on the network. # # To download descriptors regardless of if they're needed by the # Tor process or not set... FetchUselessDescriptors 1 # Tor doesn't need extrainfo descriptors to work. If you want Tor to download # them anyway then set... DownloadExtraInfo 1 Now that Tor is happy chugging along, up-to-date descriptors are available through Tor's control socket... .. literalinclude:: /_static/example/descriptor_from_tor_control_socket.py :language: python ... or by reading directly from Tor's data directory... .. literalinclude:: /_static/example/descriptor_from_tor_data_directory.py :language: python .. _can-i-create-descriptors: Can I create descriptors? ------------------------- Besides reading descriptors you can create them too. This is most commonly done for test data. To do so simply use the :func:`~stem.descriptor.__init__.Descriptor.create` method of :class:`~stem.descriptor.__init__.Descriptor` subclasses... .. literalinclude:: /_static/example/create_descriptor.py :language: python Unspecified mandatory fields are filled with mock data. You can also use :func:`~stem.descriptor.__init__.Descriptor.content` to get a string descriptor... .. literalinclude:: /_static/example/create_descriptor_content.py :language: python :: router demo 127.0.0.1 80 0 0 published 2012-03-01 17:15:27 bandwidth 153600 256000 104590 reject *:* onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAJv5IIWQ+WDWYUdyA/0L8qbIkEVH/cwryZWoIaPAzINfrw1WfNZGtBmg skFtXhOHHqTRN4GPPrZsAIUOQGzQtGb66IQgT4tO/pj+P6QmSCCdTfhvGfgTCsC+ WPi4Fl2qryzTb3QO5r5x7T8OsG2IBUET1bLQzmtbC560SYR49IvVAgMBAAE= -----END RSA PUBLIC KEY----- signing-key ... .. _validating-the-descriptors-content: Validating the descriptor's content ----------------------------------- Stem can optionally validate descriptors, checking their integrity and compliance with Tor's specs. This does the following... * Checks that we have mandatory fields, and that their content conforms with what Tor's spec says they should have. This can be useful when data integrity is important to you since it provides an upfront assurance that the descriptor's correct (no need for 'None' checks). * If you have **pycrypto** we'll validate signatures for descriptor types where that has been implemented (such as server and hidden service descriptors). Prior to Stem 1.4.0 descriptors were validated by default, but this has become opt-in since then. General rule of thumb: if *speed* is your chief concern then leave it off, but if *correctness* or *signature validation* is important then turn it on. Validating is as simple as including **validate = True** in any method that provides descriptors... .. literalinclude:: /_static/example/validate_descriptor_content.py :language: python .. _saving-and-loading-descriptors: Saving and loading descriptors ------------------------------ Tor descriptors are just plaintext documents. As such, if you'd rather not use `Pickle `_ you can persist a descriptor by simply writing it to disk, then reading it back later. .. literalinclude:: /_static/example/saving_and_loading_descriptors.py :language: python Our *server_descriptors* here is a list of :class:`~stem.descriptor.server_descriptor.RelayDescriptor` instances. When we write it to a file this looks like... :: router default 68.229.17.182 443 0 9030 platform Tor 0.2.4.23 on Windows XP protocols Link 1 2 Circuit 1 published 2014-11-17 23:42:38 fingerprint EE04 42C3 6DB6 6903 0816 247F 2607 382A 0783 2D5A uptime 63 bandwidth 5242880 10485760 77824 extra-info-digest 1ABA9FC6B912E755483D0F4F6E9BC1B23A2B7206 ... etc... We can then read it back with :func:`~stem.descriptor.__init__.parse_file` by telling it the type of descriptors we're reading... .. literalinclude:: /_static/example/read_with_parse_file.py :language: python For an example of doing this with a consensus document `see here `_. .. _putting-it-together: Putting it together... ---------------------- As discussed above there are four methods for reading descriptors... * Download descriptors directly with `stem.descriptor.remote <../api/descriptor/remote.html>`_. * Read a single file with :func:`~stem.descriptor.__init__.parse_file`. * Read multiple files or an archive with the `DescriptorReader <../api/descriptor/reader.html>`_. * Requesting them from Tor with :class:`~stem.control.Controller` methods like :func:`~stem.control.Controller.get_server_descriptors` and :func:`~stem.control.Controller.get_network_statuses`. Now lets say you want to figure out who the *biggest* exit relays are. You could use any of the methods above, but for this example we'll use `stem.descriptor.remote <../api/descriptor/remote.html>`_... .. literalinclude:: /_static/example/tor_descriptors.py :language: python :: % python example.py 1. herngaard (40.95 MB/s) 2. chaoscomputerclub19 (40.43 MB/s) 3. chaoscomputerclub18 (40.02 MB/s) 4. chaoscomputerclub20 (38.98 MB/s) 5. wannabe (38.63 MB/s) 6. dorrisdeebrown (38.48 MB/s) 7. manning2 (38.20 MB/s) 8. chaoscomputerclub21 (36.90 MB/s) 9. TorLand1 (36.22 MB/s) 10. bolobolo1 (35.93 MB/s) 11. manning1 (35.39 MB/s) 12. gorz (34.10 MB/s) 13. ndnr1 (25.36 MB/s) 14. politkovskaja2 (24.93 MB/s) 15. wau (24.72 MB/s) .. _are-there-any-other-parsing-libraries: Are there any other parsing libraries? -------------------------------------- Yup! Stem isn't the only game in town when it comes to parsing. `Metrics-lib `_ is a highly mature parsing library for Java, and `Zoossh `_ is available for Go. Each library has its own capabilities... .. role:: red .. role:: green =========================== ===================== =================== ============== Capability Stem Metrics-lib Zoossh =========================== ===================== =================== ============== Language :green:`Python` :green:`Java` :green:`Go` Checks signatures :green:`Mostly` :red:`No` :red:`No` Create new descriptors :green:`Yes` :red:`No` :red:`No` Lazy parsing :green:`Yes` :red:`No` :green:`Yes` Type detection by @type :green:`Yes` :green:`Yes` :green:`Yes` Type detection by filename :green:`Yes` :red:`No` :red:`No` Packages :green:`Several` :red:`None` :red:`None` **Can Read/Download From** Files :green:`Yes` :green:`Yes` :green:`Yes` Tarballs :green:`Yes` :green:`Yes` :red:`No` Tor Process :green:`Yes` :red:`No` :red:`No` Directory Authorities :green:`Yes` :green:`Yes` :red:`No` CollecTor :red:`No` :green:`Yes` :red:`No` **Supported Types** Server Descriptors :green:`Yes` :green:`Yes` :green:`Partly` Extrainfo Descriptors :green:`Yes` :green:`Yes` :red:`No` Microdescriptors :green:`Yes` :green:`Yes` :red:`No` Consensus :green:`Yes` :green:`Yes` :green:`Partly` Bridge Descriptors :green:`Yes` :green:`Yes` :red:`No` Hidden Service Descriptors :green:`Yes` :red:`No` :red:`No` Bridge Pool Assignments :red:`No` :green:`Yes` :red:`No` Torperf :red:`No` :green:`Yes` :red:`No` Tordnsel :green:`Yes` :green:`Yes` :red:`No` **Benchmarks** Server Descriptors :green:`0.60 ms` :green:`0.29 ms` :green:`0.46 ms` Extrainfo Descriptors :green:`0.40 ms` :green:`0.22 ms` :red:`unsupported` Microdescriptors :green:`0.33 ms` :green:`0.07 ms` :red:`unsupported` Consensus :green:`865.72 ms` :green:`246.71 ms` :green:`83.00 ms` Benchmarked With Commit :green:`c01a9cd` :green:`8767f3e` :green:`2380e55` Language Interpreter :green:`Python 3.5.1` :green:`Java 1.7.0` :green:`Go 1.5.2` =========================== ===================== =================== ============== Few things to note about these benchmarks... * **Zoossh is the fastest.** Its benchmarks were at a disadvantage due to not reading from tarballs. * Your Python version makes a very large difference for Stem. For instance, with Python 2.7 reading a consensus takes **1,290.84 ms** (almost twice as long). * Metrics-lib and Stem can both read from compressed tarballs at a small performance cost. For instance, Metrics-lib can read an `lzma compressed <../faq.html#how-do-i-read-tar-xz-descriptor-archives>`_ consensus in **255.76 ms** and Stem can do it in **902.75 ms**. So what does code with each of these look like? Stem Example ------------ * `Benchmark Script <../.../../_static/example/benchmark_stem.py>`_ .. literalinclude:: /_static/example/benchmark_server_descriptor_stem.py :language: python Metrics-lib Example ------------------- * `Benchmark Script <../.../../_static/example/benchmark_metrics_lib.java>`_ .. literalinclude:: /_static/example/benchmark_server_descriptor_metrics_lib.java :language: java Zoossh Example -------------- * `Benchmark Script <../.../../_static/example/benchmark_zoossh.go>`_ .. literalinclude:: /_static/example/benchmark_server_descriptor_zoossh.go :language: go stem-1.7.1/docs/tutorials/the_little_relay_that_could.rst0000664000175000017500000000447513157571677024516 0ustar atagaratagar00000000000000The Little Relay that Could =========================== Let's say you just set up your very first `Tor relay `_ (thank you!), and now you want to write a script that tells you how much it is being used. First, for any script to talk with your relay it will need to have a control port available. This is a port that's usually only available on localhost and protected by either a **password** or **authentication cookie**. Look at your `torrc `_ for the following configuration options... .. code-block:: bash # This provides a port for our script to talk with. If you set this then be # sure to also set either CookieAuthentication *or* HashedControlPassword! # # You could also use ControlSocket instead of ControlPort, which provides a # file based socket. You don't need to have authentication if you use # ControlSocket. For this example however we'll use a port. ControlPort 9051 # Setting this will make Tor write an authentication cookie. Anything with # permission to read this file can connect to Tor. If you're going to run # your script with the same user or permission group as Tor then this is the # easiest method of authentication to use. CookieAuthentication 1 # Alternatively we can authenticate with a password. To set a password first # get its hash... # # % tor --hash-password "my_password" # 16:E600ADC1B52C80BB6022A0E999A7734571A451EB6AE50FED489B72E3DF # # ... and use that for the HashedControlPassword in your torrc. HashedControlPassword 16:E600ADC1B52C80BB6022A0E999A7734571A451EB6AE50FED489B72E3DF When you change your torrc you'll need to either restart Tor or issue a SIGHUP for the new settings to take effect. Now let's write a script that tells us how many bytes Tor has sent and received since it started. Note that there are a `few ways to connect to Tor <../faq.html#how-do-i-connect-to-tor>`_. If you're unfamiliar with the '**with**' keyword then see `here <../faq.html#what-is-that-with-keyword-i-keep-seeing-in-the-tutorials>`_... .. literalinclude:: /_static/example/hello_world.py :language: python :: % python example.py My Tor relay has read 33406 bytes and written 29649. Congratulations! You've just written your first controller script. stem-1.7.1/docs/tutorials/tortoise_and_the_hare.rst0000664000175000017500000000250613157571677023301 0ustar atagaratagar00000000000000Tortoise and the Hare ===================== Controllers have two methods of talking with Tor... * **Synchronous** - Most commonly you make a request to Tor then receive its reply. The :func:`~stem.control.Controller.get_info` calls in the `first tutorial `_ are an example of this. * **Asynchronous** - Controllers can subscribe to be notified when various kinds of events occur within Tor (see the :data:`~stem.control.EventType`). Stem's users provide a callback function to :func:`~stem.control.Controller.add_event_listener` which is then notified when the event occurs. Try to avoid lengthy operations within event callbacks. They're notified by a single dedicated event thread, and blocking this thread will prevent the delivery of further events. With that out of the way lets see an example. The following is a `curses `_ application that graphs the bandwidth usage of Tor... .. image:: /_static/bandwidth_graph_output.png To do this it listens to **BW events** (the class for which is a :class:`~stem.response.events.BandwidthEvent`). These are events that Tor emits each second saying the number of bytes downloaded and uploaded. .. literalinclude:: /_static/example/event_listening.py :emphasize-lines: 53-55,62-67 :language: python stem-1.7.1/docs/tutorials/east_of_the_sun.rst0000664000175000017500000000603013340051401022055 0ustar atagaratagar00000000000000East of the Sun & West of the Moon ================================== The following is an overview of some of the utilities Stem provides. * :ref:`terminal-styling` * :ref:`multiprocessing` * :ref:`connection-resolution` .. _terminal-styling: Terminal Styling ---------------- Know what's better than text? Pretty text! OSX, Linux, BSD... really, everything except Windows supports terminal formatting through `ANSI escape sequences `_. Doing this yourself is easy, but we also provide a module to make it `even easier <../api/util/term.html>`_. | .. image:: /_static/words_with.png | .. literalinclude:: /_static/example/words_with.py :language: python .. _multiprocessing: Multiprocessing --------------- Python's `multiprocessing module `_ gives building blocks to parallelize around the `Global Interpreter Lock `_. However, honestly it's clunky to use. Ever just wanted to simply turn your threads into subprocesses? `We can do that <../api/util/system.html#stem.util.system.DaemonTask>`_. **Threaded** .. literalinclude:: /_static/example/fibonacci_threaded.py :language: python :: % python fibonacci_threaded.py took 21.1 seconds **Multi-process** .. literalinclude:: /_static/example/fibonacci_multiprocessing.py :language: python :: % python fibonacci_multiprocessing.py took 6.2 seconds .. _connection-resolution: Connection Resolution --------------------- Connection information is a useful tool for learning more about network applications like Tor. Our :func:`stem.util.connection.get_connections` function provides an easy method for accessing this information, with a few caveats... * Connection resolvers are platform specific. We `support several <../api/util/connection.html#stem.util.connection.Resolver>`_ but not not all, most notably Windows (:trac:`9850`). * By default Tor runs with a feature called **DisableDebuggerAttachment**. This prevents debugging applications like gdb from analyzing Tor unless it is run as root. Unfortunately this also alters the permissions of the Tor process /proc contents breaking numerous system tools (including our resolvers). To use this function you need to either run as root (discouraged) or add **DisableDebuggerAttachment 0** to your torrc. Please note that if you operate an exit relay it is **highly** discouraged for you to look at or record this information. Not only is doing so eavesdropping, but likely also a violation of wiretap laws. With that out of the way, how do you look up this information? Below is a simple script that dumps Tor's present connections. .. literalinclude:: /_static/example/utilities.py :language: python :: % python example.py Our platform supports connection resolution via: proc, netstat, sockstat, lsof, ss (picked proc) Tor is running with pid 17303 Connections: 192.168.0.1:59014 => 38.229.79.2:443 192.168.0.1:58822 => 68.169.35.102:443 stem-1.7.1/docs/tutorials/down_the_rabbit_hole.rst0000664000175000017500000001126713157571677023115 0ustar atagaratagar00000000000000Down the Rabbit Hole ==================== Underneath it all Stem is a Python implementation of Tor's `control `_ and `directory specifications `_. Anything you can do with Stem you can also do `with telnet <../faq.html#can-i-interact-with-tors-controller-interface-directly>`_ (albeit with quite a bit of extra work). Playing with Tor's control port directly is a great way of learning what Tor can and cannot do. This is handy because Stem can take advantage of anything the control interface offers, but conversely is also limited by things it lacks. To help Stem offers a control prompt with nice usability improvements over telnet... * Irc-style commands like '**/help**'. * Is a **python interpreter** (like IDLE). * Tab completion for Tor's controller commands. * History scrollback by pressing up/down. * Transparently handles Tor authentication at startup. * Colorized output for improved readability. .. _getting-started: Getting started --------------- Getting started with the control prompt is easy. Assuming you have Stem installed it will be available under **/usr/local/bin/tor-prompt**, and can attach to either an existing Tor instance or start one of its own. If Tor's already running `with a control port `_ then you can attach to it using **--interface** or **--socket** (by default it checks on **port 9051**)... .. image:: /_static/prompt/attach.png If Tor isn't running this prompt will start a temporary instance of its own. Tor will have a minimal non-relaying configuration, and be shut down when you're done. .. image:: /_static/prompt/starting_tor.png .. _what-can-i-do-with-it: What can I do with it? ---------------------- This prompt accepts three types of commands... * Commands for the interpreter itself, such as **/help** and **/info**. These are handled by the interpreter and always begin with a slash. * Commands for Tor's control port, such as **GETINFO version** and **GETCONF ExitPolicy**. These are passed along directly to Tor. * Commands that do not match either of the above are treated as Python. To get a list of the interpreter and Tor commands run **/help**. You can also run **/help [command]** (such as **/help SIGNAL**) to get details on what does... .. image:: /_static/prompt/help.png Another useful interpreter command is **/info [relay]** which provides information about a relay. With this you can look up details about any relay by its IP address, fingerprint, or nickname... .. image:: /_static/prompt/info.png Tor commands are passed along directly to Tor's control port, providing raw responses just as telnet would... .. image:: /_static/prompt/tor_commands.png And last but certainly not least this prompt provides a Python interpreter, just like IDLE. You start with a :class:`~stem.control.Controller` for you Tor instance available as your **controller** variable. This makes it easy to experiment with Stem and see what it can do... .. image:: /_static/prompt/python.png .. _event-handling: Event handling -------------- As mentioned in an `earlier tutorial `_ you can subscribe to receive events from Tor. Stem's :class:`~stem.control.Controller` does this with its :func:`~stem.control.Controller.add_event_listener` method, but with our raw Tor access we can also subscribe with **SETEVENTS [event types]**. Events we've received are available in two different ways. First, **/events** provides a quick dump of the events we've received thus far... .. image:: /_static/prompt/events_command.png You can list events of just a certain type by saying which (for instance **/events BW**). More useful though is the **events()** function, which provides a list of :class:`~stem.response.events.Event` instances we've received... .. image:: /_static/prompt/events_variable.png You can specify event types to either **/events** or **events()** to just receive events of those types (for instance, **events('BW', 'DEBUG')**). To stop receiving events run **SETEVENTS** without any event types, and to clear the backlog of events we've received run **/events clear**. .. _running-individual-commands: Running individual commands --------------------------- With its **--run** argument tor-prompt can also be used to run individual commands... .. image:: /_static/prompt/run.png ... listen to a space separated list of events with **--run 'SETEVENTS [event_types]'**... .. image:: /_static/prompt/run_events.png ... pipe its output to other destinations... .. image:: /_static/prompt/run_events_pipe.png ... and invoke files with a series of commands... .. image:: /_static/prompt/run_file.png stem-1.7.1/docs/tutorials/over_the_river.rst0000664000175000017500000001603713340051401021742 0ustar atagaratagar00000000000000Over the River and Through the Wood =================================== `Hidden services `_ give you a way of providing a service without exposing your address. These services are only accessible through Tor or `Tor2web `_, and useful for a surprising number of things... * **Hosting an anonymized site**. This is usually the first thing that comes to mind, and something we'll demonstrate in a sec. * Providing an **endpoint Tor users can reach** without exiting the Tor network. This eliminates the risk of an unreliable or malicious exit getting in the way. Great examples of this are `Facebook `_ (*facebookcorewwwi.onion*) and `DuckDuckGo `_ (*3g2upl4pq6kufc4m.onion*). * **Personal services**. For instance you can host your home SSH server as a hidden service to prevent eavesdroppers from knowing where you live while traveling abroad. `Tor2web `_ provides a quick and easy way of seeing if your hidden service is working. To use it simply replace the **.onion** of your address with **.tor2web.org**... .. image:: /_static/duck_duck_go_hidden_service.png :target: https://3g2upl4pq6kufc4m.tor2web.org/ .. _running-a-hidden-service: Running a hidden service ------------------------ Hidden services can be `configured through your torrc `_, but Stem also provides some methods to easily work with them... * :func:`~stem.control.Controller.create_hidden_service` * :func:`~stem.control.Controller.remove_hidden_service` * :func:`~stem.control.Controller.get_hidden_service_conf` * :func:`~stem.control.Controller.set_hidden_service_conf` The main threat to your anonymity when running a hidden service is the service itself. Debug information for instance might leak your real address, undermining what Tor provides. This includes the following example, **do not rely on it not to leak**. But with that out of the way lets take a look at a simple `Flask `_ example based on one by `Jordan Wright `_... .. literalinclude:: /_static/example/running_hidden_service.py :language: python Now if we run this... :: % python example.py * Connecting to tor * Creating our hidden service in /home/atagar/.tor/hello_world * Our service is available at uxiuaxejc3sxrb6i.onion, press ctrl+c to quit * Running on http://127.0.0.1:5000/ 127.0.0.1 - - [15/Dec/2014 13:05:43] "GET / HTTP/1.1" 200 - * Shutting down our hidden service ... we'll have a service we can visit via the `Tor Browser Bundle `_... .. image:: /_static/hidden_service.png .. _hidden-service-authentication: Hidden service authentication ----------------------------- Hidden services you create can restrict their access, requiring in essence a password... :: >>> from stem.control import Controller >>> controller = Controller.from_port() >>> controller.authenticate() >>> response = controller.create_ephemeral_hidden_service({80: 8080}, await_publication=True, basic_auth={'bob': None, 'alice': None}) >>> response.service_id, response.client_auth ('l3lnorirzn7hrjnw', {'alice': 'I6AMKiay+UkM5MfrvdnF2A', 'bob': 'VLsbrSGyrb5JYEvZmQ3tMg'}) To access this service users simply provide this credential to tor via their torrc or SETCONF prior to visiting it... :: >>> controller.set_conf('HidServAuth', 'l3lnorirzn7hrjnw.onion I6AMKiay+UkM5MfrvdnF2A') .. _ephemeral-hidden-services: Ephemeral hidden services ------------------------- In the above example you may have noticed the note that said... :: # The hostname is only available when we can read the hidden service # directory. This requires us to be running with the same user as tor. This has been a limitation of hidden services for years. However, as of version 0.2.7.1 Tor offers another style for making services called **ephemeral hidden services**. Ephemeral services can only be created through the controller, and only exist as long as your controller is attached unless you provide the **detached** flag. Controllers can only see their own ephemeral services, and ephemeral services that are detached. In other words, attached ephemeral services can only be managed by their own controller. Stem provides three methods to work with ephemeral hidden services... * :func:`~stem.control.Controller.list_ephemeral_hidden_services` * :func:`~stem.control.Controller.create_ephemeral_hidden_service` * :func:`~stem.control.Controller.remove_ephemeral_hidden_service` For example, with a ephemeral service our earlier example becomes as simple as... .. literalinclude:: /_static/example/ephemeral_hidden_services.py :language: python Ephemeral hidden services do not touch disk, and as such are easier to work with but require you to persist your service's private key yourself if you want to reuse a '.onion' address... .. literalinclude:: /_static/example/resuming_ephemeral_hidden_service.py :language: python .. _hidden-service-descriptors: Hidden service descriptors -------------------------- Like relays, hidden services publish documents about themselves called **hidden service descriptors**. These contain low level details for establishing connections. Hidden service descriptors are available from the tor process via its :func:`~stem.control.Controller.get_hidden_service_descriptor` method... .. literalinclude:: /_static/example/get_hidden_service_descriptor.py :language: python :: % python print_duck_duck_go_descriptor.py rendezvous-service-descriptor e5dkwgp6vt7axoozixrbgjymyof7ab6u version 2 permanent-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAJ/SzzgrXPxTlFrKVhXh3buCWv2QfcNgncUpDpKouLn3AtPH5Ocys0jE aZSKdvaiQ62md2gOwj4x61cFNdi05tdQjS+2thHKEm/KsB9BGLSLBNJYY356bupg I5gQozM65ENelfxYlysBjJ52xSDBd8C4f/p9umdzaaaCmzXG/nhzAgMBAAE= -----END RSA PUBLIC KEY----- secret-id-part bmsctib2pzirgo7cltlxdm5fxqcitt5e publication-time 2015-05-11 20:00:00 protocol-versions 2,3 introduction-points -----BEGIN MESSAGE----- aW50cm9kdWN0aW9uLXBvaW50IHZzcm4ycGNtdzNvZ21mNGo3dGpxeHptdml1Y2Rr NGtpCmlwLWFkZHJlc3MgMTc2LjkuNTkuMTcxCm9uaW9uLXBvcnQgOTAwMQpvbmlv ... etc... A hidden service's introduction points are a base64 encoded field that's possibly encrypted. These can be decoded (and decrypted if necessary) with the descriptor's :func:`~stem.descriptor.hidden_service_descriptor.HiddenServiceDescriptor.introduction_points` method. .. literalinclude:: /_static/example/introduction_points.py :language: python :: % python print_duck_duck_go_introduction_points.py DuckDuckGo's introduction points are... 176.9.59.171:9001 => vsrn2pcmw3ogmf4j7tjqxzmviucdk4ki 104.131.106.181:9001 => gcl2kpqx5qnkpgxjf6x7ulqncoqj7ghh 188.166.58.218:443 => jeymnbhs2d6l2oib7jjvweavg45m6gju stem-1.7.1/docs/tutorials/to_russia_with_love.rst0000664000175000017500000001223713157571677023042 0ustar atagaratagar00000000000000To Russia With Love =================== * :ref:`using-pycurl` * :ref:`using-socksipy` * :ref:`reading-twitter` * :ref:`custom-path-selection` .. _using-pycurl: Using PycURL ------------ Say it's 1982, the height of the Cold War, and you're a journalist doing a piece on how the Internet looks from behind the Iron Curtain. Ignoring the minor detail that the Internet doesn't yet exist, we'll walk you through how you could do it - no passport required! The Internet isn't uniform. Localization, censorship, and selective service based on your IP's geographic location can make the Internet a very different place depending on where you're coming from. Tor relays are scattered all over the world and, as such, you can pretend to be from any place running an exit. This can be especially useful to evade pesky geolocational restrictions, such as news sites that refuse to work while you're traveling abroad. Tor makes `configuring your exit locale `_ easy through the **ExitNodes** torrc option. Note that you don't need a control port (or even Stem) to do this, though they can be useful if you later want to do something more elaborate. In the following example we're using Stem to `start Tor <../api/process.html>`_, then read a site through it with `PycURL `_. This is not always reliable (some relays are lemons) so you may need to run this more than once. Having an issue? The following are some common gotchas... * PycURL's **PROXYTYPE_SOCKS5_HOSTNAME** was added in v7.19.5.1. Try `upgrading `_ if you get an AttributeError about it. * The following example for exiting through Russia will only work if... well, the Tor network *has* a Russian exit. Often this isn't the case. If Tor fails to bootstrap try dropping the line with **'ExitNodes': '{ru}'**. **Do not rely on the following not to leak.** Though it seems to work there may be edge cases that expose your real IP. If you have a suggestion for how to improve this example then please `let me know `_! .. literalinclude:: /_static/example/client_usage_using_pycurl.py :language: python .. image:: /_static/locale_selection_output.png .. _using-socksipy: Using SocksiPy -------------- Besides PycURL, you can also use `SocksiPy `_ to do the same. Be aware that the following example routes **all** socket connections through Tor, so this'll break our ability to connect to Tor's control port. To use this approach simply replace the query() function above with... .. literalinclude:: /_static/example/client_usage_using_socksipy.py :language: python .. _reading-twitter: Reading Twitter --------------- Now lets do something a little more interesting, and read a Twitter feed over Tor. This can be done `using their API `_, for authentication `see their instructions `_... .. literalinclude:: /_static/example/reading_twitter.py :language: python .. image:: /_static/twitter_output.png .. _custom-path-selection: Custom Path Selection --------------------- Routing requests over Tor is all well and good, but what if you want to do something more sophisticated? Through Tor's controller interface you can manage your own **circuits** and **streams**. A **circuit** is your path through the Tor network. Circuits must consist of at least two relays, and must end with a relay that allows connections to the destination you want to reach. **Streams** by contrast are TCP connections carried over a circuit. Tor handles attaching streams to a circuit that can service it. To instead manage this yourself call... :: controller.set_conf('__LeaveStreamsUnattached', '1') For an example of this lets fetch a site over each relay to determine it's reachability and speed. **Naturally doing this causes quite a bit of load so please be careful not to leave this running!** .. literalinclude:: /_static/example/custom_path_selection.py :language: python :: % python scan_network.py 000050888CF58A50E824E534063FF71A762CB227 => 2.62 seconds 000149E6EF7102AACA9690D6E8DD2932124B94AB => 2.50 seconds 000A10D43011EA4928A35F610405F92B4433B4DC => 2.18 seconds 000F18AC2CDAE4C710BA0898DC9E21E72E0117D8 => 2.40 seconds 0011BD2485AD45D984EC4159C88FC066E5E3300E => 2.03 seconds 003000C32D9E16FCCAEFD89336467C01E16FB00D => 11.41 seconds 008E9B9D7FF523CE1C5026B480E0127E64FA7A19 => 2.24 seconds 009851DF933754B00DDE876FCE4088CE1B4940C1 => 2.39 seconds 0098C475875ABC4AA864738B1D1079F711C38287 => Unable to reach https://check.torproject.org/ ((28, 'SSL connection timeout')) 00B70D1F261EBF4576D06CE0DA69E1F700598239 => 2.41 seconds 00DFA1137D178EE012B96F64D12F03B4D69CA0B2 => 4.53 seconds 00EF4569C8E4E165286DE6D293DCCE1BB1F280F7 => Circuit failed to be created: CHANNEL_CLOSED 00F12AB035D62C919A1F37C2A67144F17ACC9E75 => 3.58 seconds 00F2D93EBAF2F51D6EE4DCB0F37D91D72F824B16 => 2.12 seconds 00FCFBC5770DC6B716D917C73A0DE722CCF2DFE5 => 2.16 seconds ... stem-1.7.1/docs/contents.rst0000664000175000017500000000256213340051401016525 0ustar atagaratagar00000000000000Contents ======== .. toctree:: :maxdepth: 2 tutorials tutorials/the_little_relay_that_could tutorials/to_russia_with_love tutorials/tortoise_and_the_hare tutorials/mirror_mirror_on_the_wall tutorials/over_the_river tutorials/east_of_the_sun tutorials/down_the_rabbit_hole tutorials/double_double_toil_and_trouble tutorials/examples/compare_flags tutorials/examples/exit_used tutorials/examples/list_circuits tutorials/examples/relay_connections tutorials/examples/outdated_relays tutorials/examples/persisting_a_consensus tutorials/examples/votes_by_bandwidth_authorities change_log download faq api api/control api/connection api/socket api/process api/response api/exit_policy api/manual api/version api/descriptor/certificate api/descriptor/descriptor api/descriptor/server_descriptor api/descriptor/extrainfo_descriptor api/descriptor/microdescriptor api/descriptor/networkstatus api/descriptor/router_status_entry api/descriptor/hidden_service_descriptor api/descriptor/tordnsel api/descriptor/export api/descriptor/reader api/descriptor/remote api/util/init api/util/conf api/util/connection api/util/enum api/util/log api/util/proc api/util/str_tools api/util/system api/util/term api/util/test_tools api/util/tor_tools stem-1.7.1/docs/republish.py0000664000175000017500000000511013237375570016522 0ustar atagaratagar00000000000000import getopt import logging import subprocess import sys import time LOGGER = logging.getLogger('republish') LOGGER.setLevel(logging.INFO) handler = logging.FileHandler('/home/stem/republish.log') handler.setFormatter(logging.Formatter( fmt = '%(asctime)s [%(levelname)s] %(message)s', datefmt = '%m/%d/%Y %H:%M:%S', )) LOGGER.addHandler(handler) OPT = 'r:h' OPT_EXPANDED = ['repeat=', 'help'] HELP_MSG = """\ Republishes stem's website. This can either be done or on a reoccurring basis. If stem's repository is unchanged then this is a no-op. -r, --repeat RATE tries to republish the site at a set rate, in minutes """ def run(command, cwd = None): # Runs the given command. This returns the stdout if successful, and raises # an OSError if it fails. cmd = subprocess.Popen(command.split(' '), stdout = subprocess.PIPE, stderr = subprocess.PIPE, cwd = cwd) if cmd.wait() == 0: return cmd.communicate()[0] else: stdout, stderr = cmd.communicate() raise OSError("'%s' failed\n stdout: %s\n stderr: %s" % (command, stdout.strip(), stderr.strip())) def republish_site(): # Checks if stem's repository has changed, rebuilding the site if so. Ideally # we'd use plumbing commands to check this but... meh. Patches welcome. if 'Already up-to-date.' not in run('git pull', cwd = '/home/stem/stem'): start_time = time.time() LOGGER.log(logging.INFO, "Stem's repository has changed. Republishing...") run('make html', cwd = '/home/stem/stem/docs') run('sudo -u mirroradm static-master-update-component stem.torproject.org') runtime = int(time.time() - start_time) LOGGER.log(logging.INFO, ' site republished (took %s seconds)' % runtime) if __name__ == '__main__': try: opts = getopt.getopt(sys.argv[1:], OPT, OPT_EXPANDED)[0] except getopt.GetoptError as exc: print('%s (for usage provide --help)' % exc) sys.exit(1) repeat_rate = None for opt, arg in opts: if opt in ('-r', '--repeat'): if arg.isdigit(): repeat_rate = int(arg) else: print("The --repeat argument must be an integer, got '%s'" % arg) sys.exit(1) elif opt in ('-h', '--help'): print(HELP_MSG) sys.exit() if repeat_rate: LOGGER.log(logging.INFO, 'Starting stem site republisher') latest_run = 0 # unix timestamp for when we last ran while True: while time.time() < (latest_run + repeat_rate * 60): time.sleep(15) try: latest_run = time.time() republish_site() except OSError as exc: LOGGER.log(logging.WARN, str(exc)) else: republish_site() stem-1.7.1/docs/_templates/0000775000175000017500000000000013411004021016261 5ustar atagaratagar00000000000000stem-1.7.1/docs/_templates/layout.html0000664000175000017500000001041213157571677020523 0ustar atagaratagar00000000000000{# haiku/layout.html ~~~~~~~~~~~~~~~~~ Sphinx layout template for the haiku theme. :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {% extends "basic/layout.html" %} {% set css_files = css_files + ['_static/style.css'] %} {# do not display relbars #} {% block relbar1 %}{% endblock %} {% block relbar2 %}{% endblock %} {% macro nav() %}

{%- block haikurel1 %} {%- endblock %}

{%- block haikurel2 %} {%- endblock %}

{% endmacro %} {% block content %}
{%- block haikuheader %} {%- if theme_full_logo != "false" %} {%- else %} {%- if logo -%} {%- endif -%}

{{ shorttitle|e }}

{{ title|striptags|e }}

{%- endif %} {%- endblock %}
{{ nav() }}
{#{%- if display_toc %}

Table Of Contents

{{ toc }}
{%- endif %}#} {% block body %}{% endblock %}
{% endblock %} stem-1.7.1/test/0000775000175000017500000000000013411004021014153 5ustar atagaratagar00000000000000stem-1.7.1/test/unit/0000775000175000017500000000000013411004021015132 5ustar atagaratagar00000000000000stem-1.7.1/test/unit/tutorial_examples.py0000664000175000017500000003325013341034346021267 0ustar atagaratagar00000000000000""" Tests for the examples given in stem's tutorial. """ import itertools import os import unittest try: from StringIO import StringIO except ImportError: from io import StringIO import stem.response import stem.descriptor.remote import stem.prereq from stem.control import Controller from stem.descriptor.networkstatus import NetworkStatusDocumentV3 from stem.descriptor.router_status_entry import RouterStatusEntryV3 from stem.descriptor.server_descriptor import RelayDescriptor from stem.directory import DIRECTORY_AUTHORITIES from stem.response import ControlMessage from test.unit import exec_documentation_example try: # added in python 3.3 from unittest.mock import Mock, patch except ImportError: from mock import Mock, patch OPEN_FUNCTION = open # make a reference so mocking open() won't mess with us CIRC_CONTENT = '650 CIRC %d %s \ %s \ PURPOSE=%s' PATH_CONTENT = '$%s=%s,$%s=%s,$%s=%s' LIST_CIRCUITS_OUTPUT = """\ Circuit 4 (GENERAL) |- B1FA7D51B8B6F0CB585D944F450E7C06EDE7E44C (ByTORAndTheSnowDog, 173.209.180.61) |- 0DD9935C5E939CFA1E07B8DDA6D91C1A2A9D9338 (afo02, 87.238.194.176) +- DB3B1CFBD3E4D97B84B548ADD5B9A31451EEC4CC (edwardsnowden3, 109.163.234.10) Circuit 6 (GENERAL) |- B1FA7D51B8B6F0CB585D944F450E7C06EDE7E44C (ByTORAndTheSnowDog, 173.209.180.61) |- EC01CB4766BADC1611678555CE793F2A7EB2D723 (sprockets, 46.165.197.96) +- 9EA317EECA56BDF30CAEB208A253FB456EDAB1A0 (bolobolo1, 96.47.226.20) Circuit 10 (GENERAL) |- B1FA7D51B8B6F0CB585D944F450E7C06EDE7E44C (ByTORAndTheSnowDog, 173.209.180.61) |- 00C2C2A16AEDB51D5E5FB7D6168FC66B343D822F (ph3x, 86.59.119.83) +- 65242C91BFF30F165DA4D132C81A9EBA94B71D62 (torexit16, 176.67.169.171) """ EXIT_USED_OUTPUT = """\ Tracking requests for tor exits. Press 'enter' to end. Exit relay for our connection to 64.15.112.44:80 address: 31.172.30.2:443 fingerprint: A59E1E7C7EAEE083D756EE1FF6EC31CA3D8651D7 nickname: chaoscomputerclub19 locale: unknown """ OUTDATED_RELAYS_OUTPUT = """\ Checking for outdated relays... 0.1.0 Sambuddha Basu 2 outdated relays found, 1 had contact information """ COMPARE_FLAGS_OUTPUT = """\ maatuska has the Running flag but moria1 doesn't: E2BB13AA2F6960CD93ABE5257A825687F3973C62 moria1 has the Running flag but maatuska doesn't: 546C54E2A89D88E0794D04AECBF1AC8AC9DA81DE maatuska has the Running flag but moria1 doesn't: 92FCB6748A40E6088E22FBAB943AB2DD743EA818 maatuska has the Running flag but moria1 doesn't: 6871F682350BA931838C0EC1E4A23044DAE06A73 moria1 has the Running flag but maatuska doesn't: DCAEC3D069DC39AAE43D13C8AF31B5645E05ED61 """ VOTES_BY_BANDWIDTH_AUTHORITIES_OUTPUT = """\ Getting gabelmoo's vote from http://131.188.40.189:80/tor/status-vote/current/authority: 5935 measured entries and 1332 unmeasured Getting moria1's vote from http://128.31.0.39:9131/tor/status-vote/current/authority: 6647 measured entries and 625 unmeasured Getting maatuska's vote from http://171.25.193.9:443/tor/status-vote/current/authority: 6313 measured entries and 1112 unmeasured """ PERSISTING_A_CONSENSUS_OUTPUT = """\ A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB: caerSidi """ def _get_event(content): return ControlMessage.from_str(content, 'EVENT', normalize = True) def _get_circ_event(id, status, hop1, hop2, hop3, purpose): path = PATH_CONTENT % (hop1[0], hop1[1], hop2[0], hop2[1], hop3[0], hop3[1]) content = CIRC_CONTENT % (id, status, path, purpose) return _get_event(content) def _get_router_status(address = None, port = None, nickname = None, fingerprint_base64 = None, s_line = None): r_line = 'caerSidi p1aag7VwarGxqctS7/fS0y5FU+s oQZFLYe9e4A7bOkWKR7TaNxb0JE 2012-08-06 11:19:31 71.35.150.29 9001 0' if address: r_line = r_line.replace('71.35.150.29', address) if port: r_line = r_line.replace('9001', port) if nickname: r_line = r_line.replace('caerSidi', nickname) if fingerprint_base64: r_line = r_line.replace('p1aag7VwarGxqctS7/fS0y5FU+s', fingerprint_base64) if s_line: return RouterStatusEntryV3.create({'r': r_line, 's': s_line}) else: return RouterStatusEntryV3.create({'r': r_line}) class TestTutorialExamples(unittest.TestCase): def assert_equal_unordered(self, expected, actual): if stem.prereq.is_python_3(): self.assertCountEqual(expected.splitlines(), actual.splitlines()) else: self.assertItemsEqual(expected.splitlines(), actual.splitlines()) @patch('sys.stdout', new_callable = StringIO) @patch('stem.control.Controller.from_port', spec = Controller) def test_list_circuits(self, from_port_mock, stdout_mock): path_1 = ('B1FA7D51B8B6F0CB585D944F450E7C06EDE7E44C', 'ByTORAndTheSnowDog') path_2 = ('0DD9935C5E939CFA1E07B8DDA6D91C1A2A9D9338', 'afo02') path_3 = ('DB3B1CFBD3E4D97B84B548ADD5B9A31451EEC4CC', 'edwardsnowden3') path_4 = ('EC01CB4766BADC1611678555CE793F2A7EB2D723', 'sprockets') path_5 = ('9EA317EECA56BDF30CAEB208A253FB456EDAB1A0', 'bolobolo1') path_6 = ('00C2C2A16AEDB51D5E5FB7D6168FC66B343D822F', 'ph3x') path_7 = ('65242C91BFF30F165DA4D132C81A9EBA94B71D62', 'torexit16') circuit_4 = _get_circ_event(4, 'BUILT', path_1, path_2, path_3, 'GENERAL') circuit_6 = _get_circ_event(6, 'BUILT', path_1, path_4, path_5, 'GENERAL') circuit_10 = _get_circ_event(10, 'BUILT', path_1, path_6, path_7, 'GENERAL') controller = from_port_mock().__enter__() controller.get_circuits.return_value = [circuit_4, circuit_6, circuit_10] controller.get_network_status.side_effect = lambda fingerprint, *args: { path_1[0]: _get_router_status('173.209.180.61'), path_2[0]: _get_router_status('87.238.194.176'), path_3[0]: _get_router_status('109.163.234.10'), path_4[0]: _get_router_status('46.165.197.96'), path_5[0]: _get_router_status('96.47.226.20'), path_6[0]: _get_router_status('86.59.119.83'), path_7[0]: _get_router_status('176.67.169.171') }[fingerprint] exec_documentation_example('list_circuits.py') self.assert_equal_unordered(LIST_CIRCUITS_OUTPUT, stdout_mock.getvalue()) @patch('sys.stdout', new_callable = StringIO) @patch('stem.control.Controller.from_port', spec = Controller) def test_exit_used(self, from_port_mock, stdout_mock): def tutorial_example(mock_event): import functools from stem import StreamStatus from stem.control import EventType, Controller def main(): print("Tracking requests for tor exits. Press 'enter' to end.\n") with Controller.from_port() as controller: controller.authenticate() stream_listener = functools.partial(stream_event, controller) controller.add_event_listener(stream_listener, EventType.STREAM) stream_event(controller, mock_event) # simulate an event during the raw_input() def stream_event(controller, event): if event.status == StreamStatus.SUCCEEDED and event.circ_id: circ = controller.get_circuit(event.circ_id) exit_fingerprint = circ.path[-1][0] exit_relay = controller.get_network_status(exit_fingerprint) print('Exit relay for our connection to %s' % (event.target)) print(' address: %s:%i' % (exit_relay.address, exit_relay.or_port)) print(' fingerprint: %s' % exit_relay.fingerprint) print(' nickname: %s' % exit_relay.nickname) print(' locale: %s\n' % controller.get_info('ip-to-country/%s' % exit_relay.address, 'unknown')) main() path_1 = ('9EA317EECA56BDF30CAEB208A253FB456EDAB1A0', 'bolobolo1') path_2 = ('00C2C2A16AEDB51D5E5FB7D6168FC66B343D822F', 'ph3x') path_3 = ('A59E1E7C7EAEE083D756EE1FF6EC31CA3D8651D7', 'chaoscomputerclub19') circuit = _get_circ_event(1, 'BUILT', path_1, path_2, path_3, 'GENERAL') event_content = '650 STREAM 15 SUCCEEDED 3 64.15.112.44:80' event = _get_event(event_content) controller = from_port_mock().__enter__() controller.get_circuit.return_value = circuit controller.get_network_status.return_value = _get_router_status('31.172.30.2', '443', path_3[1], 'pZ4efH6u4IPXVu4f9uwxyj2GUdc=') controller.get_info.return_value = 'unknown' tutorial_example(event) self.assert_equal_unordered(EXIT_USED_OUTPUT, stdout_mock.getvalue()) @patch('sys.stdout', new_callable = StringIO) @patch('stem.descriptor.remote.DescriptorDownloader') def test_outdated_relays(self, downloader_mock, stdout_mock): downloader_mock().get_server_descriptors.return_value = [ RelayDescriptor.create({'platform': 'node-Tor 0.2.3.0 on Linux x86_64'}), RelayDescriptor.create({'platform': 'node-Tor 0.1.0 on Linux x86_64'}), RelayDescriptor.create({'opt': 'contact Random Person admin@gtr-10.de', 'platform': 'node-Tor 0.2.3.0 on Linux x86_64'}), RelayDescriptor.create({'opt': 'contact Sambuddha Basu', 'platform': 'node-Tor 0.1.0 on Linux x86_64'}), ] exec_documentation_example('outdated_relays.py') self.assert_equal_unordered(OUTDATED_RELAYS_OUTPUT, stdout_mock.getvalue()) @patch('sys.stdout', new_callable = StringIO) @patch('stem.descriptor.remote.Query') @patch('stem.directory.Authority.from_cache') def test_compare_flags(self, authorities_mock, query_mock, stdout_mock): if stem.prereq._is_python_26(): # example imports OrderedDict from collections which doesn't work under # python 2.6 self.skipTest("(example doesn't support python 2.6)") return authorities_mock().items.return_value = [('moria1', DIRECTORY_AUTHORITIES['moria1']), ('maatuska', DIRECTORY_AUTHORITIES['maatuska'])] fingerprint = [ ('92FCB6748A40E6088E22FBAB943AB2DD743EA818', 'kvy2dIpA5giOIvurlDqy3XQ+qBg='), ('6871F682350BA931838C0EC1E4A23044DAE06A73', 'aHH2gjULqTGDjA7B5KIwRNrganM='), ('E2BB13AA2F6960CD93ABE5257A825687F3973C62', '4rsTqi9pYM2Tq+UleoJWh/OXPGI='), ('546C54E2A89D88E0794D04AECBF1AC8AC9DA81DE', 'VGxU4qidiOB5TQSuy/Gsisnagd4='), ('DCAEC3D069DC39AAE43D13C8AF31B5645E05ED61', '3K7D0GncOarkPRPIrzG1ZF4F7WE='), ] entry = [ # entries for moria1 _get_router_status(fingerprint_base64 = fingerprint[0][1], s_line = ' '), _get_router_status(fingerprint_base64 = fingerprint[1][1], s_line = ' '), _get_router_status(fingerprint_base64 = fingerprint[2][1], s_line = ' '), _get_router_status(fingerprint_base64 = fingerprint[3][1]), _get_router_status(fingerprint_base64 = fingerprint[4][1]), # entries for maatuska _get_router_status(fingerprint_base64 = fingerprint[0][1]), _get_router_status(fingerprint_base64 = fingerprint[1][1]), _get_router_status(fingerprint_base64 = fingerprint[2][1]), _get_router_status(fingerprint_base64 = fingerprint[3][1], s_line = ' '), _get_router_status(fingerprint_base64 = fingerprint[4][1], s_line = ' '), ] query_mock().run.side_effect = [ [NetworkStatusDocumentV3.create(routers = (entry[0], entry[1], entry[2], entry[3], entry[4]))], [NetworkStatusDocumentV3.create(routers = (entry[5], entry[6], entry[7], entry[8], entry[9]))], ] exec_documentation_example('compare_flags.py') self.assert_equal_unordered(COMPARE_FLAGS_OUTPUT, stdout_mock.getvalue()) @patch('sys.stdout', new_callable = StringIO) @patch('stem.directory.Authority.from_cache') @patch('stem.descriptor.remote.DescriptorDownloader.query') def test_votes_by_bandwidth_authorities(self, query_mock, authorities_mock, stdout_mock): directory_values = [ DIRECTORY_AUTHORITIES['gabelmoo'], DIRECTORY_AUTHORITIES['moria1'], DIRECTORY_AUTHORITIES['maatuska'], ] directory_values[0].address = '131.188.40.189' authorities_mock().values.return_value = directory_values entry_with_measurement = RouterStatusEntryV3.create({'w': 'Bandwidth=1 Measured=1'}) entry_without_measurement = RouterStatusEntryV3.create() query1 = Mock() query1.download_url = 'http://131.188.40.189:80/tor/status-vote/current/authority' query1.run.return_value = [entry_with_measurement] * 5935 + [entry_without_measurement] * 1332 query2 = Mock() query2.download_url = 'http://128.31.0.39:9131/tor/status-vote/current/authority' query2.run.return_value = [entry_with_measurement] * 6647 + [entry_without_measurement] * 625 query3 = Mock() query3.download_url = 'http://171.25.193.9:443/tor/status-vote/current/authority' query3.run.return_value = [entry_with_measurement] * 6313 + [entry_without_measurement] * 1112 query_mock.side_effect = [query1, query2, query3] exec_documentation_example('votes_by_bandwidth_authorities.py') self.assert_equal_unordered(VOTES_BY_BANDWIDTH_AUTHORITIES_OUTPUT, stdout_mock.getvalue()) @patch('sys.stdout', new_callable = StringIO) @patch('stem.descriptor.parse_file') @patch('stem.descriptor.remote.Query') def test_persisting_a_consensus(self, query_mock, parse_file_mock, stdout_mock): def tutorial_example_2(): from stem.descriptor import DocumentHandler, parse_file consensus = next(parse_file( '/tmp/descriptor_dump', descriptor_type = 'network-status-consensus-3 1.0', document_handler = DocumentHandler.DOCUMENT, )) for fingerprint, relay in consensus.routers.items(): print('%s: %s' % (fingerprint, relay.nickname)) network_status = NetworkStatusDocumentV3.create(routers = (RouterStatusEntryV3.create({ 'r': 'caerSidi p1aag7VwarGxqctS7/fS0y5FU+s oQZFLYe9e4A7bOkWKR7TaNxb0JE 2012-08-06 11:19:31 71.35.150.29 9001 0', }),)) query_mock().run.return_value = [network_status] parse_file_mock.return_value = itertools.cycle([network_status]) exec_documentation_example('persisting_a_consensus.py') exec_documentation_example('persisting_a_consensus_with_parse_file.py') self.assertEqual(PERSISTING_A_CONSENSUS_OUTPUT, stdout_mock.getvalue()) if os.path.exists('/tmp/descriptor_dump'): os.remove('/tmp/descriptor_dump') stem-1.7.1/test/unit/control/0000775000175000017500000000000013411004021016612 5ustar atagaratagar00000000000000stem-1.7.1/test/unit/control/__init__.py0000664000175000017500000000007713237375570020761 0ustar atagaratagar00000000000000""" Unit tests for stem.control. """ __all__ = ['controller'] stem-1.7.1/test/unit/control/controller.py0000664000175000017500000007702113411002341021361 0ustar atagaratagar00000000000000""" Unit tests for the stem.control module. The module's primarily exercised via integ tests, but a few bits lend themselves to unit testing. """ import datetime import io import unittest import stem.descriptor.router_status_entry import stem.response import stem.response.events import stem.socket import stem.util.system import stem.version from stem import ControllerError, DescriptorUnavailable, InvalidArguments, InvalidRequest, ProtocolError, UnsatisfiableRequest from stem.control import MALFORMED_EVENTS, _parse_circ_path, Listener, Controller, EventType from stem.response import ControlMessage from stem.exit_policy import ExitPolicy try: # added in python 3.3 from unittest.mock import Mock, patch except ImportError: from mock import Mock, patch NS_DESC = 'r %s %s u5lTXJKGsLKufRLnSyVqT7TdGYw 2012-12-30 22:02:49 77.223.43.54 9001 0\ns Fast Named Running Stable Valid\nw Bandwidth=75' TEST_TIMESTAMP = 12345 BW_EVENT = ControlMessage.from_str('650 BW 15 25', 'EVENT', normalize = True, arrived_at = TEST_TIMESTAMP) CIRC_EVENT = ControlMessage.from_str('650 CIRC 4 LAUNCHED', 'EVENT', normalize = True, arrived_at = TEST_TIMESTAMP) BAD_EVENT = ControlMessage.from_str('650 BW &15* 25', normalize = True, arrived_at = TEST_TIMESTAMP) class TestControl(unittest.TestCase): def setUp(self): socket = stem.socket.ControlSocket() # When initially constructing a controller we need to suppress msg, so our # constructor's SETEVENTS requests pass. with patch('stem.control.BaseController.msg', Mock()): self.controller = Controller(socket) self.circ_listener = Mock() self.controller.add_event_listener(self.circ_listener, EventType.CIRC) self.bw_listener = Mock() self.controller.add_event_listener(self.bw_listener, EventType.BW) self.malformed_listener = Mock() self.controller.add_event_listener(self.malformed_listener, MALFORMED_EVENTS) def test_event_description(self): self.assertEqual("Logging at the debug runlevel. This is low level, high volume information about tor's internals that generally isn't useful to users.", stem.control.event_description('DEBUG')) self.assertEqual('Event emitted every second with the bytes sent and received by tor.', stem.control.event_description('BW')) self.assertEqual('Event emitted every second with the bytes sent and received by tor.', stem.control.event_description('bw')) def test_event_description_includes_all_events(self): self.assertEqual(None, stem.control.event_description('NO_SUCH_EVENT')) for event in stem.control.EventType: self.assertTrue(stem.control.event_description(event) is not None) @patch('stem.control.Controller.msg') def test_get_info(self, msg_mock): msg_mock.return_value = ControlMessage.from_str('250-hello=hi right back!\r\n250 OK\r\n', 'GETINFO') self.assertEqual('hi right back!', self.controller.get_info('hello')) @patch('stem.control.Controller.msg') def test_get_info_address_caching(self, msg_mock): msg_mock.return_value = ControlMessage.from_str('551 Address unknown\r\n') self.assertEqual(None, self.controller._last_address_exc) self.assertRaisesWith(stem.OperationFailed, 'Address unknown', self.controller.get_info, 'address') self.assertEqual('Address unknown', str(self.controller._last_address_exc)) self.assertEqual(1, msg_mock.call_count) # now that we have a cached failure we should provide that back self.assertRaisesWith(stem.OperationFailed, 'Address unknown', self.controller.get_info, 'address') self.assertEqual(1, msg_mock.call_count) # invalidates the cache, transitioning from no address to having one msg_mock.return_value = ControlMessage.from_str('250-address=17.2.89.80\r\n250 OK\r\n', 'GETINFO') self.assertRaisesWith(stem.OperationFailed, 'Address unknown', self.controller.get_info, 'address') self.controller._handle_event(ControlMessage.from_str('650 STATUS_SERVER NOTICE EXTERNAL_ADDRESS ADDRESS=17.2.89.80 METHOD=DIRSERV\r\n')) self.assertEqual('17.2.89.80', self.controller.get_info('address')) # invalidates the cache, transitioning from one address to another msg_mock.return_value = ControlMessage.from_str('250-address=80.89.2.17\r\n250 OK\r\n', 'GETINFO') self.assertEqual('17.2.89.80', self.controller.get_info('address')) self.controller._handle_event(ControlMessage.from_str('650 STATUS_SERVER NOTICE EXTERNAL_ADDRESS ADDRESS=80.89.2.17 METHOD=DIRSERV\r\n')) self.assertEqual('80.89.2.17', self.controller.get_info('address')) @patch('stem.control.Controller.msg') @patch('stem.control.Controller.get_conf') def test_get_info_without_fingerprint(self, get_conf_mock, msg_mock): msg_mock.return_value = ControlMessage.from_str('551 Not running in server mode\r\n') get_conf_mock.return_value = None self.assertEqual(None, self.controller._last_fingerprint_exc) self.assertRaisesWith(stem.OperationFailed, 'Not running in server mode', self.controller.get_info, 'fingerprint') self.assertEqual('Not running in server mode', str(self.controller._last_fingerprint_exc)) self.assertEqual(1, msg_mock.call_count) # now that we have a cached failure we should provide that back self.assertRaisesWith(stem.OperationFailed, 'Not running in server mode', self.controller.get_info, 'fingerprint') self.assertEqual(1, msg_mock.call_count) # ... but if we become a relay we'll call it again get_conf_mock.return_value = '443' self.assertRaisesWith(stem.OperationFailed, 'Not running in server mode', self.controller.get_info, 'fingerprint') self.assertEqual(2, msg_mock.call_count) @patch('stem.control.Controller.get_info') def test_get_version(self, get_info_mock): """ Exercises the get_version() method. """ try: # Use one version for first check. version_2_1 = '0.2.1.32' version_2_1_object = stem.version.Version(version_2_1) get_info_mock.return_value = version_2_1 # Return a version with a cold cache. self.assertEqual(version_2_1_object, self.controller.get_version()) # Use a different version for second check. version_2_2 = '0.2.2.39' version_2_2_object = stem.version.Version(version_2_2) get_info_mock.return_value = version_2_2 # Return a version with a hot cache, so it will be the old version. self.assertEqual(version_2_1_object, self.controller.get_version()) # Turn off caching. self.controller._is_caching_enabled = False # Return a version without caching, so it will be the new version. self.assertEqual(version_2_2_object, self.controller.get_version()) # Spec says the getinfo response may optionally be prefixed by 'Tor '. In # practice it doesn't but we should accept that. get_info_mock.return_value = 'Tor 0.2.1.32' self.assertEqual(version_2_1_object, self.controller.get_version()) # Raise an exception in the get_info() call. get_info_mock.side_effect = InvalidArguments # Get a default value when the call fails. self.assertEqual( 'default returned', self.controller.get_version(default = 'default returned') ) # No default value, accept the error. self.assertRaises(InvalidArguments, self.controller.get_version) # Give a bad version. The stem.version.Version ValueError should bubble up. version_A_42 = '0.A.42.spam' get_info_mock.return_value = version_A_42 get_info_mock.side_effect = None self.assertRaises(ValueError, self.controller.get_version) finally: # Turn caching back on before we leave. self.controller._is_caching_enabled = True @patch('stem.control.Controller.get_info') def test_get_exit_policy(self, get_info_mock): """ Exercises the get_exit_policy() method. """ get_info_mock.side_effect = lambda param, default = None: { 'exit-policy/full': 'reject *:25,reject *:119,reject *:135-139,reject *:445,reject *:563,reject *:1214,reject *:4661-4666,reject *:6346-6429,reject *:6699,reject *:6881-6999,accept *:*', }[param] expected = ExitPolicy( 'reject *:25', 'reject *:119', 'reject *:135-139', 'reject *:445', 'reject *:563', 'reject *:1214', 'reject *:4661-4666', 'reject *:6346-6429', 'reject *:6699', 'reject *:6881-6999', 'accept *:*', ) self.assertEqual(str(expected), str(self.controller.get_exit_policy())) @patch('stem.control.Controller.get_info') @patch('stem.control.Controller.get_conf') def test_get_exit_policy_if_not_relaying(self, get_conf_mock, get_info_mock): # If tor lacks an ORPort, resolved extrnal address, hasn't finished making # our server descriptor (ie. tor just started), etc 'GETINFO # exit-policy/full' will fail. get_conf_mock.side_effect = lambda param, **kwargs: { 'ExitRelay': '1', 'ExitPolicyRejectPrivate': '1', 'ExitPolicy': ['accept *:80, accept *:443', 'accept 43.5.5.5,reject *:22'], }[param] expected = ExitPolicy( 'reject 0.0.0.0/8:*', 'reject 169.254.0.0/16:*', 'reject 127.0.0.0/8:*', 'reject 192.168.0.0/16:*', 'reject 10.0.0.0/8:*', 'reject 172.16.0.0/12:*', 'reject 1.2.3.4:*', 'accept *:80', 'accept *:443', 'accept 43.5.5.5:*', 'reject *:22', ) # Unfortunate it's a bit tricky to have a mock that raises exceptions in # response to some arguments, and returns a response for others. As such # mapping it to the following function. exit_policy_exception = None def getinfo_response(param, default = None): if param == 'address': return '1.2.3.4' elif param == 'exit-policy/default': return '' elif param == 'exit-policy/full' and exit_policy_exception: raise exit_policy_exception else: raise ValueError("Unmocked request for 'GETINFO %s'" % param) get_info_mock.side_effect = getinfo_response exit_policy_exception = stem.OperationFailed('552', 'Not running in server mode') self.assertEqual(str(expected), str(self.controller.get_exit_policy())) exit_policy_exception = stem.OperationFailed('551', 'Descriptor still rebuilding - not ready yet') self.assertEqual(str(expected), str(self.controller.get_exit_policy())) @patch('stem.control.Controller.get_info') @patch('stem.control.Controller.get_conf') def test_get_ports(self, get_conf_mock, get_info_mock): """ Exercises the get_ports() and get_listeners() methods. """ # Exercise as an old version of tor that doesn't support the 'GETINFO # net/listeners/*' options. get_info_mock.side_effect = InvalidArguments get_conf_mock.side_effect = lambda param, **kwargs: { 'ControlPort': '9050', 'ControlListenAddress': ['127.0.0.1'], }[param] self.assertEqual([('127.0.0.1', 9050)], self.controller.get_listeners(Listener.CONTROL)) self.assertEqual([9050], self.controller.get_ports(Listener.CONTROL)) self.controller.clear_cache() # non-local addresss get_conf_mock.side_effect = lambda param, **kwargs: { 'ControlPort': '9050', 'ControlListenAddress': ['27.4.4.1'], }[param] self.assertEqual([('27.4.4.1', 9050)], self.controller.get_listeners(Listener.CONTROL)) self.assertEqual([], self.controller.get_ports(Listener.CONTROL)) self.controller.clear_cache() # exercise via the GETINFO option get_info_mock.side_effect = None get_info_mock.return_value = '"127.0.0.1:1112" "127.0.0.1:1114"' self.assertEqual( [('127.0.0.1', 1112), ('127.0.0.1', 1114)], self.controller.get_listeners(Listener.CONTROL) ) self.assertEqual([1112, 1114], self.controller.get_ports(Listener.CONTROL)) self.controller.clear_cache() # with all localhost addresses, including a couple that aren't get_info_mock.side_effect = None get_info_mock.return_value = '"27.4.4.1:1113" "127.0.0.5:1114" "0.0.0.0:1115" "[::]:1116" "[::1]:1117" "[10::]:1118"' self.assertEqual([1114, 1115, 1116, 1117], self.controller.get_ports(Listener.OR)) self.controller.clear_cache() # IPv6 address get_info_mock.return_value = '"0.0.0.0:9001" "[fe80:0000:0000:0000:0202:b3ff:fe1e:8329]:9001"' self.assertEqual( [('0.0.0.0', 9001), ('fe80:0000:0000:0000:0202:b3ff:fe1e:8329', 9001)], self.controller.get_listeners(Listener.CONTROL) ) # unix socket file self.controller.clear_cache() get_info_mock.return_value = '"unix:/tmp/tor/socket"' self.assertEqual([], self.controller.get_listeners(Listener.CONTROL)) self.assertEqual([], self.controller.get_ports(Listener.CONTROL)) @patch('stem.control.Controller.get_info') @patch('stem.control.Controller.get_conf') def test_get_socks_listeners_old(self, get_conf_mock, get_info_mock): """ Exercises the get_socks_listeners() method as though talking to an old tor instance. """ # An old tor raises stem.InvalidArguments for get_info about socks, but # get_socks_listeners should work anyway. get_info_mock.side_effect = InvalidArguments get_conf_mock.side_effect = lambda param, **kwargs: { 'SocksPort': '9050', 'SocksListenAddress': ['127.0.0.1'], }[param] self.assertEqual([('127.0.0.1', 9050)], self.controller.get_socks_listeners()) self.controller.clear_cache() # Again, an old tor, but SocksListenAddress overrides the port number. get_conf_mock.side_effect = lambda param, **kwargs: { 'SocksPort': '9050', 'SocksListenAddress': ['127.0.0.1:1112'], }[param] self.assertEqual([('127.0.0.1', 1112)], self.controller.get_socks_listeners()) self.controller.clear_cache() # Again, an old tor, but multiple listeners get_conf_mock.side_effect = lambda param, **kwargs: { 'SocksPort': '9050', 'SocksListenAddress': ['127.0.0.1:1112', '127.0.0.1:1114'], }[param] self.assertEqual([('127.0.0.1', 1112), ('127.0.0.1', 1114)], self.controller.get_socks_listeners()) self.controller.clear_cache() # Again, an old tor, but no SOCKS listeners get_conf_mock.side_effect = lambda param, **kwargs: { 'SocksPort': '0', 'SocksListenAddress': [], }[param] self.assertEqual([], self.controller.get_socks_listeners()) self.controller.clear_cache() # Where tor provides invalid ports or addresses get_conf_mock.side_effect = lambda param, **kwargs: { 'SocksPort': 'blarg', 'SocksListenAddress': ['127.0.0.1'], }[param] self.assertRaises(stem.ProtocolError, self.controller.get_socks_listeners) get_conf_mock.side_effect = lambda param, **kwargs: { 'SocksPort': '0', 'SocksListenAddress': ['127.0.0.1:abc'], }[param] self.assertRaises(stem.ProtocolError, self.controller.get_socks_listeners) get_conf_mock.side_effect = lambda param, **kwargs: { 'SocksPort': '40', 'SocksListenAddress': ['500.0.0.1'], }[param] self.assertRaises(stem.ProtocolError, self.controller.get_socks_listeners) @patch('stem.control.Controller.get_info') def test_get_socks_listeners_new(self, get_info_mock): """ Exercises the get_socks_listeners() method as if talking to a newer tor instance. """ # multiple SOCKS listeners get_info_mock.return_value = '"127.0.0.1:1112" "127.0.0.1:1114"' self.assertEqual( [('127.0.0.1', 1112), ('127.0.0.1', 1114)], self.controller.get_socks_listeners() ) # no SOCKS listeners self.controller.clear_cache() get_info_mock.return_value = '' self.assertEqual([], self.controller.get_socks_listeners()) # check where GETINFO provides malformed content invalid_responses = ( '"127.0.0.1"', # address only '"1112"', # port only '"5127.0.0.1:1112"', # invlaid address '"127.0.0.1:991112"', # invalid port ) for response in invalid_responses: self.controller.clear_cache() get_info_mock.return_value = response self.assertRaises(stem.ProtocolError, self.controller.get_socks_listeners) @patch('stem.control.Controller.get_info') @patch('time.time', Mock(return_value = 1410723598.276578)) def test_get_accounting_stats(self, get_info_mock): """ Exercises the get_accounting_stats() method. """ get_info_mock.side_effect = lambda param, **kwargs: { 'accounting/enabled': '1', 'accounting/hibernating': 'awake', 'accounting/interval-end': '2014-09-14 19:41:00', 'accounting/bytes': '4837 2050', 'accounting/bytes-left': '102944 7440', }[param] expected = stem.control.AccountingStats( 1410723598.276578, 'awake', datetime.datetime(2014, 9, 14, 19, 41), 62, 4837, 102944, 107781, 2050, 7440, 9490, ) self.assertEqual(expected, self.controller.get_accounting_stats()) get_info_mock.side_effect = ControllerError('nope, too bad') self.assertRaises(ControllerError, self.controller.get_accounting_stats) self.assertEqual('my default', self.controller.get_accounting_stats('my default')) @patch('stem.connection.get_protocolinfo') def test_get_protocolinfo(self, get_protocolinfo_mock): """ Exercises the get_protocolinfo() method. """ # use the handy mocked protocolinfo response protocolinfo_msg = ControlMessage.from_str('250-PROTOCOLINFO 1\r\n250 OK\r\n', 'PROTOCOLINFO') get_protocolinfo_mock.return_value = protocolinfo_msg # compare the str representation of these object, because the class # does not have, nor need, a direct comparison operator self.assertEqual( str(protocolinfo_msg), str(self.controller.get_protocolinfo()) ) # raise an exception in the stem.connection.get_protocolinfo() call get_protocolinfo_mock.side_effect = ProtocolError # get a default value when the call fails self.assertEqual( 'default returned', self.controller.get_protocolinfo(default = 'default returned') ) # no default value, accept the error self.assertRaises(ProtocolError, self.controller.get_protocolinfo) @patch('stem.socket.ControlSocket.is_localhost', Mock(return_value = False)) def test_get_user_remote(self): """ Exercise the get_user() method for a non-local socket. """ self.assertRaises(ValueError, self.controller.get_user) self.assertEqual(123, self.controller.get_user(123)) @patch('stem.socket.ControlSocket.is_localhost', Mock(return_value = True)) @patch('stem.control.Controller.get_info', Mock(return_value = 'atagar')) def test_get_user_by_getinfo(self): """ Exercise the get_user() resolution via its getinfo option. """ self.assertEqual('atagar', self.controller.get_user()) @patch('stem.socket.ControlSocket.is_localhost', Mock(return_value = True)) @patch('stem.util.system.pid_by_name', Mock(return_value = 432)) @patch('stem.util.system.user', Mock(return_value = 'atagar')) def test_get_user_by_system(self): """ Exercise the get_user() resolution via the system module. """ self.assertEqual('atagar', self.controller.get_user()) @patch('stem.socket.ControlSocket.is_localhost', Mock(return_value = False)) def test_get_pid_remote(self): """ Exercise the get_pid() method for a non-local socket. """ self.assertRaises(ValueError, self.controller.get_pid) self.assertEqual(123, self.controller.get_pid(123)) @patch('stem.socket.ControlSocket.is_localhost', Mock(return_value = True)) @patch('stem.control.Controller.get_info', Mock(return_value = '321')) def test_get_pid_by_getinfo(self): """ Exercise the get_pid() resolution via its getinfo option. """ self.assertEqual(321, self.controller.get_pid()) @patch('stem.socket.ControlSocket.is_localhost', Mock(return_value = True)) @patch('stem.control.Controller.get_conf') @patch('stem.control.open', create = True) def test_get_pid_by_pid_file(self, open_mock, get_conf_mock): """ Exercise the get_pid() resolution via a PidFile. """ get_conf_mock.return_value = '/tmp/pid_file' open_mock.return_value = io.BytesIO(b'432') self.assertEqual(432, self.controller.get_pid()) open_mock.assert_called_once_with('/tmp/pid_file') @patch('stem.socket.ControlSocket.is_localhost', Mock(return_value = True)) @patch('stem.util.system.pid_by_name', Mock(return_value = 432)) def test_get_pid_by_name(self): """ Exercise the get_pid() resolution via the process name. """ self.assertEqual(432, self.controller.get_pid()) @patch('stem.control.Controller.get_info') def test_get_network_status_for_ourselves(self, get_info_mock): """ Exercises the get_network_status() method for getting our own relay. """ # when there's an issue getting our fingerprint get_info_mock.side_effect = ControllerError('nope, too bad') exc_msg = 'Unable to determine our own fingerprint: nope, too bad' self.assertRaisesWith(ControllerError, exc_msg, self.controller.get_network_status) self.assertEqual('boom', self.controller.get_network_status(default = 'boom')) # successful request desc = NS_DESC % ('moria1', '/96bKo4soysolMgKn5Hex2nyFSY') get_info_mock.side_effect = lambda param, **kwargs: { 'fingerprint': '9695DFC35FFEB861329B9F1AB04C46397020CE31', 'ns/id/9695DFC35FFEB861329B9F1AB04C46397020CE31': desc, }[param] self.assertEqual(stem.descriptor.router_status_entry.RouterStatusEntryV3(desc), self.controller.get_network_status()) @patch('stem.control.Controller.get_info') def test_get_network_status_when_unavailable(self, get_info_mock): """ Exercises the get_network_status() method. """ get_info_mock.side_effect = InvalidArguments(None, 'GETINFO request contained unrecognized keywords: ns/id/5AC9C5AA75BA1F18D8459B326B4B8111A856D290') exc_msg = "Tor was unable to provide the descriptor for '5AC9C5AA75BA1F18D8459B326B4B8111A856D290'" self.assertRaisesWith(DescriptorUnavailable, exc_msg, self.controller.get_network_status, '5AC9C5AA75BA1F18D8459B326B4B8111A856D290') @patch('stem.control.Controller.get_info') def test_get_network_status(self, get_info_mock): """ Exercises the get_network_status() method. """ # build a single router status entry nickname = 'Beaver' fingerprint = '/96bKo4soysolMgKn5Hex2nyFSY' desc = NS_DESC % (nickname, fingerprint) router = stem.descriptor.router_status_entry.RouterStatusEntryV3(desc) # always return the same router status entry get_info_mock.return_value = desc # pretend to get the router status entry with its name self.assertEqual(router, self.controller.get_network_status(nickname)) # pretend to get the router status entry with its fingerprint hex_fingerprint = stem.descriptor.router_status_entry._base64_to_hex(fingerprint, False) self.assertEqual(router, self.controller.get_network_status(hex_fingerprint)) # mangle hex fingerprint and try again hex_fingerprint = hex_fingerprint[2:] self.assertRaises(ValueError, self.controller.get_network_status, hex_fingerprint) # raise an exception in the get_info() call get_info_mock.side_effect = InvalidArguments # get a default value when the call fails self.assertEqual( 'default returned', self.controller.get_network_status(nickname, default = 'default returned') ) # no default value, accept the error self.assertRaises(InvalidArguments, self.controller.get_network_status, nickname) @patch('stem.control.Controller.is_authenticated', Mock(return_value = True)) @patch('stem.control.Controller._attach_listeners', Mock(return_value = ([], []))) @patch('stem.control.Controller.get_version') def test_add_event_listener(self, get_version_mock): """ Exercises the add_event_listener and remove_event_listener methods. """ # set up for failure to create any events get_version_mock.return_value = stem.version.Version('0.1.0.14') self.assertRaises(InvalidRequest, self.controller.add_event_listener, Mock(), EventType.BW) # set up to only fail newer events get_version_mock.return_value = stem.version.Version('0.2.0.35') # EventType.BW is one of the earliest events self.controller.add_event_listener(Mock(), EventType.BW) # EventType.SIGNAL was added in tor version 0.2.3.1-alpha self.assertRaises(InvalidRequest, self.controller.add_event_listener, Mock(), EventType.SIGNAL) @patch('time.time', Mock(return_value = TEST_TIMESTAMP)) def test_events_get_received(self): """ Trigger an event, checking that our listeners get notified. """ self._emit_event(CIRC_EVENT) self.circ_listener.assert_called_once_with(CIRC_EVENT) self.bw_listener.assert_not_called() self.malformed_listener.assert_not_called() self._emit_event(BW_EVENT) self.bw_listener.assert_called_once_with(BW_EVENT) @patch('time.time', Mock(return_value = TEST_TIMESTAMP)) def test_event_listing_with_error(self): """ Raise an exception in an event listener to confirm it doesn't break our event thread. """ self.circ_listener.side_effect = ValueError('boom') self._emit_event(CIRC_EVENT) self.circ_listener.assert_called_once_with(CIRC_EVENT) self.bw_listener.assert_not_called() self.malformed_listener.assert_not_called() self._emit_event(BW_EVENT) self.bw_listener.assert_called_once_with(BW_EVENT) @patch('time.time', Mock(return_value = TEST_TIMESTAMP)) def test_event_listing_with_malformed_event(self): """ Attempt to parse a malformed event emitted from Tor. It's important this doesn't break our event thread. """ # When stem.response.convert() encounters malformed content we still recast # the message. expected_bad_event = ControlMessage.from_str(BAD_EVENT.raw_content()) setattr(expected_bad_event, 'arrived_at', TEST_TIMESTAMP) expected_bad_event.__class__ = stem.response.events.BandwidthEvent self._emit_event(BAD_EVENT) self.circ_listener.assert_not_called() self.bw_listener.assert_not_called() self.malformed_listener.assert_called_once_with(expected_bad_event) self._emit_event(BW_EVENT) self.bw_listener.assert_called_once_with(BW_EVENT) @patch('stem.control.Controller.get_version', Mock(return_value = stem.version.Version('0.5.0.14'))) @patch('stem.control.Controller.msg', Mock(return_value = ControlMessage.from_str('250 OK\r\n'))) @patch('stem.control.Controller.add_event_listener', Mock()) @patch('stem.control.Controller.remove_event_listener', Mock()) def test_timeout(self): """ Methods that have an 'await' argument also have an optional timeout. Check that we raise a Timeout exception when it's elapsed. """ self.assertRaisesWith(stem.Timeout, 'Reached our 0.1 second timeout', self.controller.get_hidden_service_descriptor, '5g2upl4pq6kufc4m', await_result = True, timeout = 0.1) def test_get_streams(self): """ Exercises the get_streams() method. """ # get a list of fake, but good looking, streams valid_streams = ( ('1', 'NEW', '4', '10.10.10.1:80'), ('2', 'SUCCEEDED', '4', '10.10.10.1:80'), ('3', 'SUCCEEDED', '4', '10.10.10.1:80') ) response = ''.join(['%s\r\n' % ' '.join(entry) for entry in valid_streams]) with patch('stem.control.Controller.get_info', Mock(return_value = response)): streams = self.controller.get_streams() self.assertEqual(len(valid_streams), len(streams)) for index, stream in enumerate(streams): self.assertEqual(valid_streams[index][0], stream.id) self.assertEqual(valid_streams[index][1], stream.status) self.assertEqual(valid_streams[index][2], stream.circ_id) self.assertEqual(valid_streams[index][3], stream.target) def test_attach_stream(self): """ Exercises the attach_stream() method. """ # Response when the stream is in a state where it can't be attached (for # instance, it's already open). response = stem.response.ControlMessage.from_str('555 Connection is not managed by controller.\r\n') with patch('stem.control.Controller.msg', Mock(return_value = response)): self.assertRaises(UnsatisfiableRequest, self.controller.attach_stream, 'stream_id', 'circ_id') def test_parse_circ_path(self): """ Exercises the _parse_circ_path() helper function. """ # empty input self.assertEqual([], _parse_circ_path(None)) self.assertEqual([], _parse_circ_path('')) # check the pydoc examples pydoc_examples = { '$999A226EBED397F331B612FE1E4CFAE5C1F201BA=piyaz': [('999A226EBED397F331B612FE1E4CFAE5C1F201BA', 'piyaz')], '$E57A476CD4DFBD99B4EE52A100A58610AD6E80B9,hamburgerphone,PrivacyRepublic14': [ ('E57A476CD4DFBD99B4EE52A100A58610AD6E80B9', None), (None, 'hamburgerphone'), (None, 'PrivacyRepublic14'), ], } for test_input, expected in pydoc_examples.items(): self.assertEqual(expected, _parse_circ_path(test_input)) # exercise with some invalid inputs malformed_inputs = [ '=piyaz', # no fingerprint '999A226EBED397F331B612FE1E4CFAE5C1F201BA=piyaz', # fingerprint missing prefix '$999A226EBED397F331B612FE1E4CFAE5C1F201BAA=piyaz', # fingerprint too long '$999A226EBED397F331B612FE1E4CFAE5C1F201B=piyaz', # fingerprint too short '$999A226EBED397F331B612FE1E4CFAE5C1F201Bz=piyaz', # invalid character in fingerprint '$999A226EBED397F331B612FE1E4CFAE5C1F201BA=', # no nickname ] for test_input in malformed_inputs: self.assertRaises(ProtocolError, _parse_circ_path, test_input) @patch('stem.control.Controller.get_conf') def test_get_effective_rate(self, get_conf_mock): """ Exercise the get_effective_rate() method. """ # check default if nothing was set get_conf_mock.side_effect = lambda param, **kwargs: { 'BandwidthRate': '1073741824', 'BandwidthBurst': '1073741824', 'RelayBandwidthRate': '0', 'RelayBandwidthBurst': '0', 'MaxAdvertisedBandwidth': '1073741824', }[param] self.assertEqual(1073741824, self.controller.get_effective_rate()) self.assertEqual(1073741824, self.controller.get_effective_rate(burst = True)) get_conf_mock.side_effect = ControllerError('nope, too bad') self.assertRaises(ControllerError, self.controller.get_effective_rate) self.assertEqual('my_default', self.controller.get_effective_rate('my_default')) @patch('stem.control.Controller.get_version') def test_drop_guards(self, get_version_mock): """ Exercises the drop_guards() method. """ get_version_mock.return_value = stem.version.Version('0.1.0.14') self.assertRaises(UnsatisfiableRequest, self.controller.drop_guards) with patch('stem.control.Controller.msg', Mock(return_value = None)): get_version_mock.return_value = stem.version.Version('0.2.5.2') self.controller.drop_guards() def _emit_event(self, event): # Spins up our Controller's thread pool, emits an event, then shuts it # down. This last part is important for a couple reasons... # # 1. So we don't leave any lingering threads. # # 2. To ensure our event handlers are done being executed. Events are # processed asynchronously, so the only way to endsure it's done # with its work is to join on the thread. with patch('stem.control.Controller.is_alive') as is_alive_mock: is_alive_mock.return_value = True self.controller._launch_threads() try: # Converting an event back into an uncast ControlMessage, then feeding it # into our controller's event queue. uncast_event = ControlMessage.from_str(event.raw_content()) self.controller._event_queue.put(uncast_event) self.controller._event_notice.set() finally: is_alive_mock.return_value = False self.controller._close() stem-1.7.1/test/unit/tor_man_with_unknown0000664000175000017500000000457713157571677021404 0ustar atagaratagar00000000000000'\" t .\" Title: tor .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 10/03/2015 .\" Manual: Tor Manual .\" Source: Tor .\" Language: English .\" .TH "TOR" "1" "10/03/2015" "Tor" "Tor Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" tor \- The second\-generation onion router .SH "GENERAL OPTIONS" .PP \fBBandwidthRate\fR \fIN\fR \fBbytes\fR|\fBKBytes\fR|\fBMBytes\fR|\fBGBytes\fR|\fBKBits\fR|\fBMBits\fR|\fBGBits\fR .RS 4 A token bucket limits the average incoming bandwidth usage on this node to the specified number of bytes per second, and the average outgoing bandwidth usage to that same value\&. If you want to run a relay in the public network, this needs to be \fIat the very least\fR 30 KBytes (that is, 30720 bytes)\&. (Default: 1 GByte) With this option, and in other options that take arguments in bytes, KBytes, and so on, other formats are also supported\&. Notably, "KBytes" can also be written as "kilobytes" or "kb"; "MBytes" can be written as "megabytes" or "MB"; "kbits" can be written as "kilobits"; and so forth\&. Tor also accepts "byte" and "bit" in the singular\&. The prefixes "tera" and "T" are also recognized\&. If no units are given, we default to bytes\&. To avoid confusion, we recommend writing "bytes" or "bits" explicitly, since it\(cqs easy to forget that "B" means bytes, not bits\&. .RE .PP .SH "NEW OPTIONS" .PP \fBSpiffyNewOption\fR \fItransport\fR exec \fIpath\-to\-binary\fR [options] .RS 4 Description of this new option. .RE .PP stem-1.7.1/test/unit/directory/0000775000175000017500000000000013411004021017136 5ustar atagaratagar00000000000000stem-1.7.1/test/unit/directory/authority.py0000664000175000017500000000523313341034346021562 0ustar atagaratagar00000000000000""" Unit tests for stem.directory.Authority. """ import io import unittest import stem.directory import stem.prereq try: # added in python 3.3 from unittest.mock import patch, Mock except ImportError: from mock import patch, Mock URL_OPEN = 'urllib.request.urlopen' if stem.prereq.is_python_3() else 'urllib2.urlopen' AUTHORITY_GITWEB_CONTENT = b"""\ "moria1 orport=9101 " "v3ident=D586D18309DED4CD6D57C18FDB97EFA96D330566 " "128.31.0.39:9131 9695 DFC3 5FFE B861 329B 9F1A B04C 4639 7020 CE31", "tor26 orport=443 " "v3ident=14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 " "ipv6=[2001:858:2:2:aabb:0:563b:1526]:443 " "86.59.21.38:80 847B 1F85 0344 D787 6491 A548 92F9 0493 4E4E B85D", """ class TestAuthority(unittest.TestCase): def test_equality(self): authority_attr = { 'address': '5.9.110.236', 'or_port': 9001, 'dir_port': 9030, 'fingerprint': '0756B7CD4DFC8182BE23143FAC0642F515182CEB', 'nickname': 'rueckgrat', 'orport_v6': ('2a01:4f8:162:51e2::2', 9001), 'v3ident': '23D15D965BC35114467363C165C4F724B64B4F66', } self.assertEqual(stem.directory.Authority(**authority_attr), stem.directory.Authority(**authority_attr)) for attr in authority_attr: for value in (None, 'something else'): second_authority = stem.directory.Authority(**authority_attr) setattr(second_authority, attr, value) self.assertNotEqual(stem.directory.Authority(**authority_attr), second_authority) def test_from_cache(self): authorities = stem.directory.Authority.from_cache() self.assertTrue(len(authorities) > 4) self.assertEqual('128.31.0.39', authorities['moria1'].address) @patch(URL_OPEN, Mock(return_value = io.BytesIO(AUTHORITY_GITWEB_CONTENT))) def test_from_remote(self): expected = { 'moria1': stem.directory.Authority( nickname = 'moria1', address = '128.31.0.39', or_port = 9101, dir_port = 9131, fingerprint = '9695DFC35FFEB861329B9F1AB04C46397020CE31', v3ident = 'D586D18309DED4CD6D57C18FDB97EFA96D330566', ), 'tor26': stem.directory.Authority( nickname = 'tor26', address = '86.59.21.38', or_port = 443, dir_port = 80, fingerprint = '847B1F850344D7876491A54892F904934E4EB85D', orport_v6 = ('2001:858:2:2:aabb:0:563b:1526', 443), v3ident = '14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4', ), } self.assertEqual(expected, stem.directory.Authority.from_remote()) @patch(URL_OPEN, Mock(return_value = io.BytesIO(b''))) def test_from_remote_empty(self): self.assertRaisesRegexp(IOError, 'did not have any content', stem.directory.Authority.from_remote) stem-1.7.1/test/unit/directory/__init__.py0000664000175000017500000000012313341034346021262 0ustar atagaratagar00000000000000""" Unit tests for stem.directory. """ __all__ = [ 'authority', 'fallback', ] stem-1.7.1/test/unit/directory/fallback.py0000664000175000017500000001756713341034346021306 0ustar atagaratagar00000000000000""" Unit tests for stem.directory.Fallback. """ import io import re import tempfile import unittest import stem.directory import stem.util.conf try: # added in python 2.7 from collections import OrderedDict except ImportError: from stem.util.ordereddict import OrderedDict try: # added in python 3.3 from unittest.mock import patch, Mock except ImportError: from mock import patch, Mock URL_OPEN = 'urllib.request.urlopen' if stem.prereq.is_python_3() else 'urllib2.urlopen' FALLBACK_GITWEB_CONTENT = b"""\ /* type=fallback */ /* version=2.0.0 */ /* timestamp=20170526090242 */ /* ===== */ /* Whitelist & blacklist excluded 1326 of 1513 candidates. */ /* Checked IPv4 DirPorts served a consensus within 15.0s. */ /* Final Count: 151 (Eligible 187, Target 392 (1963 * 0.20), Max 200) Excluded: 36 (Same Operator 27, Failed/Skipped Download 9, Excess 0) Bandwidth Range: 1.3 - 40.0 MByte/s */ /* Onionoo Source: details Date: 2017-05-16 07:00:00 Version: 4.0 URL: https:onionoo.torproject.orgdetails?fields=fingerprint%2Cnickname%2Ccontact%2Clast_changed_address_or_port%2Cconsensus_weight%2Cadvertised_bandwidth%2Cor_addresses%2Cdir_address%2Crecommended_version%2Cflags%2Ceffective_family%2Cplatform&flag=V2Dir&type=relay&last_seen_days=-0&first_seen_days=30- */ /* Onionoo Source: uptime Date: 2017-05-16 07:00:00 Version: 4.0 URL: https:onionoo.torproject.orguptime?first_seen_days=30-&flag=V2Dir&type=relay&last_seen_days=-0 */ /* ===== */ "5.9.110.236:9030 orport=9001 id=0756B7CD4DFC8182BE23143FAC0642F515182CEB" " ipv6=[2a01:4f8:162:51e2::2]:9001" /* nickname=rueckgrat */ /* extrainfo=1 */ /* ===== */ , "193.171.202.146:9030 orport=9001 id=01A9258A46E97FF8B2CAC7910577862C14F2C524" /* nickname= */ /* extrainfo=0 */ /* ===== */ """ HEADER = OrderedDict(( ('type', 'fallback'), ('version', '2.0.0'), ('timestamp', '20170526090242'), )) class TestFallback(unittest.TestCase): def test_equality(self): fallback_attr = { 'address': '5.9.110.236', 'or_port': 9001, 'dir_port': 9030, 'fingerprint': '0756B7CD4DFC8182BE23143FAC0642F515182CEB', 'nickname': 'rueckgrat', 'has_extrainfo': True, 'orport_v6': ('2a01:4f8:162:51e2::2', 9001), 'header': OrderedDict(( ('type', 'fallback'), ('version', '2.0.0'), ('timestamp', '20170526090242'), )), } self.assertEqual(stem.directory.Fallback(**fallback_attr), stem.directory.Fallback(**fallback_attr)) for attr in fallback_attr: for value in (None, 'something else'): second_fallback = stem.directory.Fallback(**fallback_attr) setattr(second_fallback, attr, value) self.assertNotEqual(stem.directory.Fallback(**fallback_attr), second_fallback) def test_from_cache(self): fallbacks = stem.directory.Fallback.from_cache() self.assertTrue(len(fallbacks) > 10) self.assertEqual('5.39.92.199', fallbacks['0BEA4A88D069753218EAAAD6D22EA87B9A1319D6'].address) @patch(URL_OPEN, Mock(return_value = io.BytesIO(FALLBACK_GITWEB_CONTENT))) def test_from_remote(self): expected = { '0756B7CD4DFC8182BE23143FAC0642F515182CEB': stem.directory.Fallback( address = '5.9.110.236', or_port = 9001, dir_port = 9030, fingerprint = '0756B7CD4DFC8182BE23143FAC0642F515182CEB', nickname = 'rueckgrat', has_extrainfo = True, orport_v6 = ('2a01:4f8:162:51e2::2', 9001), header = HEADER, ), '01A9258A46E97FF8B2CAC7910577862C14F2C524': stem.directory.Fallback( address = '193.171.202.146', or_port = 9001, dir_port = 9030, fingerprint = '01A9258A46E97FF8B2CAC7910577862C14F2C524', nickname = None, has_extrainfo = False, orport_v6 = None, header = HEADER, ), } self.assertEqual(expected, stem.directory.Fallback.from_remote()) @patch(URL_OPEN, Mock(return_value = io.BytesIO(b''))) def test_from_remote_empty(self): self.assertRaisesRegexp(IOError, 'did not have any content', stem.directory.Fallback.from_remote) @patch(URL_OPEN, Mock(return_value = io.BytesIO(b'\n'.join(FALLBACK_GITWEB_CONTENT.splitlines()[1:])))) def test_from_remote_no_header(self): self.assertRaisesRegexp(IOError, 'does not have a type field indicating it is fallback directory metadata', stem.directory.Fallback.from_remote) @patch(URL_OPEN, Mock(return_value = io.BytesIO(FALLBACK_GITWEB_CONTENT.replace(b'version=2.0.0', b'version')))) def test_from_remote_malformed_header(self): self.assertRaisesRegexp(IOError, 'Malformed fallback directory header line: /\* version \*/', stem.directory.Fallback.from_remote) def test_from_remote_malformed(self): test_values = { FALLBACK_GITWEB_CONTENT.replace(b'id=0756B7CD4DFC8182BE23143FAC0642F515182CEB', b''): 'Failed to parse mandatory data from:', FALLBACK_GITWEB_CONTENT.replace(b'5.9.110.236', b'5.9.110'): '0756B7CD4DFC8182BE23143FAC0642F515182CEB (rueckgrat) has an invalid IPv4 address: 5.9.110', FALLBACK_GITWEB_CONTENT.replace(b':9030', b':7814713228'): '0756B7CD4DFC8182BE23143FAC0642F515182CEB (rueckgrat) has an invalid DirPort: 7814713228', FALLBACK_GITWEB_CONTENT.replace(b'orport=9001', b'orport=7814713228'): '0756B7CD4DFC8182BE23143FAC0642F515182CEB (rueckgrat) has an invalid ORPort: 7814713228', FALLBACK_GITWEB_CONTENT.replace(b'ipv6=[2a01', b'ipv6=[:::'): '0756B7CD4DFC8182BE23143FAC0642F515182CEB (rueckgrat) has an invalid IPv6 address: ::::4f8:162:51e2::2', FALLBACK_GITWEB_CONTENT.replace(b'nickname=rueckgrat', b'nickname=invalid~nickname'): '0756B7CD4DFC8182BE23143FAC0642F515182CEB has an invalid nickname: invalid~nickname', } for entry, expected in test_values.items(): with patch(URL_OPEN, Mock(return_value = io.BytesIO(entry))): self.assertRaisesRegexp(IOError, re.escape(expected), stem.directory.Fallback.from_remote) def test_persistence(self): expected = { '0756B7CD4DFC8182BE23143FAC0642F515182CEB': stem.directory.Fallback( address = '5.9.110.236', or_port = 9001, dir_port = 9030, fingerprint = '0756B7CD4DFC8182BE23143FAC0642F515182CEB', nickname = 'rueckgrat', has_extrainfo = True, orport_v6 = ('2a01:4f8:162:51e2::2', 9001), header = HEADER, ), '01A9258A46E97FF8B2CAC7910577862C14F2C524': stem.directory.Fallback( address = '193.171.202.146', or_port = 9001, dir_port = 9030, fingerprint = '01A9258A46E97FF8B2CAC7910577862C14F2C524', nickname = None, has_extrainfo = False, orport_v6 = None, header = HEADER, ), } excepted_config = { 'tor_commit': ['abc'], 'stem_commit': ['def'], 'header.type': ['fallback'], 'header.version': ['2.0.0'], 'header.timestamp': ['20170526090242'], '01A9258A46E97FF8B2CAC7910577862C14F2C524.address': ['193.171.202.146'], '01A9258A46E97FF8B2CAC7910577862C14F2C524.or_port': ['9001'], '01A9258A46E97FF8B2CAC7910577862C14F2C524.dir_port': ['9030'], '01A9258A46E97FF8B2CAC7910577862C14F2C524.has_extrainfo': ['false'], '0756B7CD4DFC8182BE23143FAC0642F515182CEB.address': ['5.9.110.236'], '0756B7CD4DFC8182BE23143FAC0642F515182CEB.or_port': ['9001'], '0756B7CD4DFC8182BE23143FAC0642F515182CEB.dir_port': ['9030'], '0756B7CD4DFC8182BE23143FAC0642F515182CEB.nickname': ['rueckgrat'], '0756B7CD4DFC8182BE23143FAC0642F515182CEB.has_extrainfo': ['true'], '0756B7CD4DFC8182BE23143FAC0642F515182CEB.orport6_address': ['2a01:4f8:162:51e2::2'], '0756B7CD4DFC8182BE23143FAC0642F515182CEB.orport6_port': ['9001'], } with tempfile.NamedTemporaryFile(prefix = 'fallbacks.') as tmp: stem.directory.Fallback._write(expected, 'abc', 'def', HEADER, tmp.name) conf = stem.util.conf.Config() conf.load(tmp.name) self.assertEqual(excepted_config, dict(conf)) self.assertEqual(expected, stem.directory.Fallback.from_cache(tmp.name)) stem-1.7.1/test/unit/descriptor/0000775000175000017500000000000013411004021017310 5ustar atagaratagar00000000000000stem-1.7.1/test/unit/descriptor/certificate.py0000664000175000017500000001731113341474573022200 0ustar atagaratagar00000000000000""" Unit tests for stem.descriptor.certificate. """ import base64 import datetime import re import unittest import stem.descriptor.certificate import stem.util.str_tools import stem.prereq import test.require from stem.descriptor.certificate import ED25519_SIGNATURE_LENGTH, CertType, ExtensionType, ExtensionFlag, Ed25519Certificate, Ed25519CertificateV1, Ed25519Extension from test.unit.descriptor import get_resource ED25519_CERT = """ AQQABhtZAaW2GoBED1IjY3A6f6GNqBEl5A83fD2Za9upGke51JGqAQAgBABnprVR ptIr43bWPo2fIzo3uOywfoMrryprpbm4HhCkZMaO064LP+1KNuLvlc8sGG8lTjx1 g4k3ELuWYgHYWU5rAia7nl4gUfBZOEfHAfKES7l3d63dBEjEX98Ljhdp2w4= """.strip() EXPECTED_CERT_KEY = b'\xa5\xb6\x1a\x80D\x0fR#cp:\x7f\xa1\x8d\xa8\x11%\xe4\x0f7|=\x99k\xdb\xa9\x1aG\xb9\xd4\x91\xaa' EXPECTED_EXTENSION_DATA = b'g\xa6\xb5Q\xa6\xd2+\xe3v\xd6>\x8d\x9f#:7\xb8\xec\xb0~\x83+\xaf*k\xa5\xb9\xb8\x1e\x10\xa4d' EXPECTED_SIGNATURE = b'\xc6\x8e\xd3\xae\x0b?\xedJ6\xe2\xef\x95\xcf,\x18o%N" num% """ for keyword in ('dirreq-v2-share', 'dirreq-v3-share'): attr = keyword.replace('-', '_').replace('dirreq', 'dir') test_entries = ( ('0.00%', 0.0), ('0.01%', 0.0001), ('50%', 0.5), ('100.0%', 1.0), ) for test_value, expected_value in test_entries: desc = RelayExtraInfoDescriptor.create({keyword: test_value}) self.assertEqual(expected_value, getattr(desc, attr)) test_entries = ( (''), (' '), ('100'), ('-5%'), ) for entry in test_entries: expect_invalid_attr(self, {keyword: entry}, attr) def test_number_list_lines(self): """ Uses valid and invalid data to tests lines of the form... "" num,...,num """ for keyword in ('cell-processed-cells', 'cell-queued-cells', 'cell-time-in-queue'): attr = keyword.replace('-', '_') test_entries = ( ('', []), (' ', []), ('0,0,0', [0.0, 0.0, 0.0]), ('2.3,-4.6,8.9,16.12,32.15', [2.3, -4.6, 8.9, 16.12, 32.15]), ) for test_value, expected_value in test_entries: desc = RelayExtraInfoDescriptor.create({keyword: test_value}) self.assertEqual(expected_value, getattr(desc, attr)) test_entries = ( (',,11', [11.0]), ('abc,5.7,def', [5.7]), ('blarg', []), ) for entry, expected in test_entries: expect_invalid_attr(self, {keyword: entry}, attr, expected) def test_timestamp_lines(self): """ Uses valid and invalid data to tests lines of the form... "" YYYY-MM-DD HH:MM:SS """ for keyword in ('published', 'geoip-start-time'): attr = keyword.replace('-', '_') desc = RelayExtraInfoDescriptor.create({keyword: '2012-05-03 12:07:50'}) self.assertEqual(datetime.datetime(2012, 5, 3, 12, 7, 50), getattr(desc, attr)) test_entries = ( '', '2012-05-03 12:07:60', '2012-05-03 ', '2012-05-03', ) for entry in test_entries: expect_invalid_attr(self, {keyword: entry}, attr) def test_timestamp_and_interval_lines(self): """ Uses valid and invalid data to tests lines of the form... "" YYYY-MM-DD HH:MM:SS (NSEC s) """ for keyword in ('cell-stats-end', 'entry-stats-end', 'exit-stats-end', 'bridge-stats-end', 'dirreq-stats-end'): end_attr = keyword.replace('-', '_').replace('dirreq', 'dir') interval_attr = end_attr[:-4] + '_interval' desc = RelayExtraInfoDescriptor.create({keyword: '2012-05-03 12:07:50 (500 s)'}) self.assertEqual(datetime.datetime(2012, 5, 3, 12, 7, 50), getattr(desc, end_attr)) self.assertEqual(500, getattr(desc, interval_attr)) test_entries = ( '', '2012-05-03 ', '2012-05-03', '2012-05-03 12:07:60 (500 s)', '2012-05-03 12:07:50 (500s)', '2012-05-03 12:07:50 (500 s', '2012-05-03 12:07:50 (500 )', ) for entry in test_entries: desc = expect_invalid_attr(self, {'entry-stats-end': entry}) self.assertEqual(None, desc.entry_stats_end) self.assertEqual(None, desc.entry_stats_interval) def test_timestamp_interval_and_value_lines(self): """ Uses valid and invalid data to tests lines of the form... "" YYYY-MM-DD HH:MM:SS (NSEC s) NUM,NUM,NUM,NUM,NUM... """ for keyword in ('read-history', 'write-history', 'dirreq-read-history', 'dirreq-write-history'): base_attr = keyword.replace('-', '_').replace('dirreq', 'dir') end_attr = base_attr + '_end' interval_attr = base_attr + '_interval' values_attr = base_attr + '_values' desc = RelayExtraInfoDescriptor.create({keyword: '2012-05-03 12:07:50 (500 s) 50,11,5'}) self.assertEqual(datetime.datetime(2012, 5, 3, 12, 7, 50), getattr(desc, end_attr)) self.assertEqual(500, getattr(desc, interval_attr)) self.assertEqual([50, 11, 5], getattr(desc, values_attr)) for test_value in ('', ' '): desc = RelayExtraInfoDescriptor.create({'write-history': '2012-05-03 12:07:50 (500 s)%s' % test_value}) self.assertEqual(datetime.datetime(2012, 5, 3, 12, 7, 50), desc.write_history_end) self.assertEqual(500, desc.write_history_interval) self.assertEqual([], desc.write_history_values) test_entries = ( '', '2012-05-03', '2012-05-03 12:07:60 (500 s)', '2012-05-03 12:07:50 (500s)', '2012-05-03 12:07:50 (500 s', '2012-05-03 12:07:50 (500 s)11', ) for entry in test_entries: desc = expect_invalid_attr(self, {'write-history': entry}) self.assertEqual(None, desc.write_history_end) self.assertEqual(None, desc.write_history_interval) self.assertEqual(None, desc.write_history_values) def test_port_mapping_lines(self): """ Uses valid and invalid data to tests lines of the form... "" port=N,port=N,... """ for keyword in ('exit-kibibytes-written', 'exit-kibibytes-read', 'exit-streams-opened'): attr = keyword.replace('-', '_') test_entries = ( ('', {}), ('443=100,other=111', {443: 100, 'other': 111}), ('80=115533759,443=1777,995=690', {80: 115533759, 443: 1777, 995: 690}), ) for test_value, expected_value in test_entries: desc = RelayExtraInfoDescriptor.create({keyword: test_value}) self.assertEqual(expected_value, getattr(desc, attr)) test_entries = ( '8000000=115533759', '-80=115533759', '80=-115533759', '=115533759', '80=', '80,115533759', ) for entry in test_entries: expect_invalid_attr(self, {keyword: entry}, attr) def test_hidden_service_stats_end(self): """ Exercise the hidserv-stats-end, which should be a simple date. """ desc = RelayExtraInfoDescriptor.create({'hidserv-stats-end': '2012-05-03 12:07:50'}) self.assertEqual(datetime.datetime(2012, 5, 3, 12, 7, 50), desc.hs_stats_end) test_entries = ( '', '2012', '2012-05', '2012-05-03', '2012-05-03 12', '2012-05-03 12:07', '2012-05-03 12:07:-50', ) for entry in test_entries: expect_invalid_attr(self, {'hidserv-stats-end': entry}, 'hs_stats_end') def test_hidden_service_stats(self): """ Check the 'hidserv-rend-relayed-cells' and 'hidserv-dir-onions-seen', which share the same format. """ attributes = ( ('hidserv-rend-relayed-cells', 'hs_rend_cells', 'hs_rend_cells_attr'), ('hidserv-dir-onions-seen', 'hs_dir_onions_seen', 'hs_dir_onions_seen_attr'), ) test_entries = ( '', 'hello', ' key=value', '40 key', '40 key value', '40 key key=value', ) for keyword, stat_attr, extra_attr in attributes: # just the numeric stat (no extra attributes) desc = RelayExtraInfoDescriptor.create({keyword: '345'}) self.assertEqual(345, getattr(desc, stat_attr)) self.assertEqual({}, getattr(desc, extra_attr)) # values can be negative (#15276) desc = RelayExtraInfoDescriptor.create({keyword: '-345'}) self.assertEqual(-345, getattr(desc, stat_attr)) self.assertEqual({}, getattr(desc, extra_attr)) # with extra attributes desc = RelayExtraInfoDescriptor.create({keyword: '345 spiffy=true snowmen=neat'}) self.assertEqual(345, getattr(desc, stat_attr)) self.assertEqual({'spiffy': 'true', 'snowmen': 'neat'}, getattr(desc, extra_attr)) for entry in test_entries: expect_invalid_attr(self, {keyword: entry}, stat_attr) expect_invalid_attr(self, {keyword: entry}, extra_attr, {}) def test_padding_counts(self): """ Check the 'hidserv-dir-onions-seen' lines. """ desc = RelayExtraInfoDescriptor.create({'padding-counts': '2017-05-17 11:02:58 (86400 s) bin-size=10000 write-drop=0 write-pad=10000 write-total=10000 read-drop=0 read-pad=10000 read-total=3780000 enabled-read-pad=0 enabled-read-total=0 enabled-write-pad=0 enabled-write-total=0 max-chanpad-timers=0 non-numeric=test'}) self.assertEqual({ 'bin-size': 10000, 'write-drop': 0, 'write-pad': 10000, 'write-total': 10000, 'read-drop': 0, 'read-pad': 10000, 'read-total': 3780000, 'enabled-read-pad': 0, 'enabled-read-total': 0, 'enabled-write-pad': 0, 'enabled-write-total': 0, 'max-chanpad-timers': 0, 'non-numeric': 'test', # presently all values are ints but the spec allows for anything }, desc.padding_counts) self.assertEqual(datetime.datetime(2017, 5, 17, 11, 2, 58), desc.padding_counts_end) self.assertEqual(86400, desc.padding_counts_interval) test_entries = ( '', '2012-05-03', '2012-05-03 12:07:60 (500 s)', '2012-05-03 12:07:50 (500 s', '2012-05-03 12:07:50 (500s)', '2012-05-03 12:07:50 (500 s)bin-size=10', '2012-05-03 12:07:50 (500 s) bin-size', '2012-05-03 12:07:50 (500 s) bin-size=', ) for entry in test_entries: desc = expect_invalid_attr(self, {'padding-counts': entry}) self.assertEqual({}, desc.padding_counts) self.assertEqual(None, desc.padding_counts_end) self.assertEqual(None, desc.padding_counts_interval) def test_locale_mapping_lines(self): """ Uses valid and invalid data to tests lines of the form... "" CC=N,CC=N,... """ for keyword in ('dirreq-v2-ips', 'dirreq-v3-ips', 'dirreq-v2-reqs', 'dirreq-v3-reqs', 'geoip-client-origins', 'entry-ips', 'bridge-ips'): attr = keyword.replace('-', '_').replace('dirreq', 'dir').replace('reqs', 'requests') test_entries = ( ('', {}), ('uk=5,de=3,jp=2', {'uk': 5, 'de': 3, 'jp': 2}), ) for test_value, expected_value in test_entries: desc = RelayExtraInfoDescriptor.create({keyword: test_value}) self.assertEqual(expected_value, getattr(desc, attr)) test_entries = ( 'uk=-4', 'uki=4', 'uk:4', 'uk=4.de=3', ) for entry in test_entries: expect_invalid_attr(self, {keyword: entry}, attr) def test_minimal_bridge_descriptor(self): """ Basic sanity check that we can parse a descriptor with minimal attributes. """ desc = BridgeExtraInfoDescriptor.create() self.assertEqual('ec2bridgereaac65a3', desc.nickname) self.assertEqual([], desc.get_unrecognized_lines()) # check that we don't have crypto fields self.assertRaises(AttributeError, getattr, desc, 'signature') def test_bridge_ip_versions_line(self): """ Parses the 'bridge-ip-versions' line, which only appears in bridges. """ desc = BridgeExtraInfoDescriptor.create({'bridge-ip-versions': 'v4=16,v6=40'}) self.assertEqual({'v4': 16, 'v6': 40}, desc.ip_versions) desc = BridgeExtraInfoDescriptor.create({'bridge-ip-versions': ''}) self.assertEqual({}, desc.ip_versions) desc_text = BridgeExtraInfoDescriptor.content({'bridge-ip-versions': 'v4=24.5'}) self.assertRaises(ValueError, RelayExtraInfoDescriptor, desc_text, True) def test_bridge_ip_transports_line(self): """ Parses the 'bridge-ip-transports' line, which only appears in bridges. """ desc = BridgeExtraInfoDescriptor.create({'bridge-ip-transports': '=16,=40'}) self.assertEqual({'': 16, '': 40}, desc.ip_transports) desc = BridgeExtraInfoDescriptor.create({'bridge-ip-transports': ''}) self.assertEqual({}, desc.ip_transports) desc_text = BridgeExtraInfoDescriptor.content({'bridge-ip-transports': '=24.5'}) self.assertRaises(ValueError, RelayExtraInfoDescriptor, desc_text, True) def test_transport_line(self): """ Basic exercise for both a bridge and relay's transport entry. """ desc = BridgeExtraInfoDescriptor.create({'transport': 'obfs3'}) self.assertEqual({'obfs3': (None, None, None)}, desc.transport) self.assertEqual([], desc.get_unrecognized_lines()) desc = RelayExtraInfoDescriptor.create({'transport': 'obfs2 83.212.96.201:33570'}) self.assertEqual({'obfs2': ('83.212.96.201', 33570, [])}, desc.transport) self.assertEqual([], desc.get_unrecognized_lines()) # multiple transport lines desc = BridgeExtraInfoDescriptor.create({'transport': 'obfs3\ntransport obfs4'}) self.assertEqual({'obfs3': (None, None, None), 'obfs4': (None, None, None)}, desc.transport) self.assertEqual([], desc.get_unrecognized_lines()) stem-1.7.1/test/unit/descriptor/hidden_service_descriptor.py0000664000175000017500000005503313411002341025104 0ustar atagaratagar00000000000000""" Unit tests for stem.descriptor.hidden_service_descriptor. """ import datetime import functools import unittest import stem.descriptor import stem.prereq import test.require from stem.descriptor.hidden_service_descriptor import ( REQUIRED_FIELDS, DecryptionFailure, HiddenServiceDescriptor, ) from test.unit.descriptor import ( get_resource, base_expect_invalid_attr, base_expect_invalid_attr_for_text, ) MESSAGE_BLOCK = """ -----BEGIN MESSAGE----- %s -----END MESSAGE-----\ """ EXPECTED_DDG_PERMANENT_KEY = """\ -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAJ/SzzgrXPxTlFrKVhXh3buCWv2QfcNgncUpDpKouLn3AtPH5Ocys0jE aZSKdvaiQ62md2gOwj4x61cFNdi05tdQjS+2thHKEm/KsB9BGLSLBNJYY356bupg I5gQozM65ENelfxYlysBjJ52xSDBd8C4f/p9umdzaaaCmzXG/nhzAgMBAAE= -----END RSA PUBLIC KEY-----\ """ EXPECTED_DDG_INTRODUCTION_POINTS_ENCODED = """\ -----BEGIN MESSAGE----- aW50cm9kdWN0aW9uLXBvaW50IGl3a2k3N3h0YnZwNnF2ZWRmcndkem5jeHMzY2th eWV1CmlwLWFkZHJlc3MgMTc4LjYyLjIyMi4xMjkKb25pb24tcG9ydCA0NDMKb25p b24ta2V5Ci0tLS0tQkVHSU4gUlNBIFBVQkxJQyBLRVktLS0tLQpNSUdKQW9HQkFL OTRCRVlJSFo0S2RFa2V5UGhiTENwUlc1RVNnKzJXUFFock00eXVLWUd1cTh3Rldn dW1aWVI5CmsvV0EvL0ZZWE1CejBiQitja3Vacy9ZdTluSytITHpwR2FwVjBjbHN0 NEdVTWNCSW5VQ3pDY3BqSlRRc1FEZ20KMy9ZM2NxaDBXNTVnT0NGaG9tUTQvMVdP WWc3WUNqazRYWUhKRTIwT2RHMkxsNXpvdEs2ZkFnTUJBQUU9Ci0tLS0tRU5EIFJT QSBQVUJMSUMgS0VZLS0tLS0Kc2VydmljZS1rZXkKLS0tLS1CRUdJTiBSU0EgUFVC TElDIEtFWS0tLS0tCk1JR0pBb0dCQUpYbUpiOGxTeWRNTXFDZ0NnZmd2bEIyRTVy cGQ1N2t6L0FxZzcvZDFIS2MzK2w1UW9Vdkh5dXkKWnNBbHlrYThFdTUzNGhsNDFv cUVLcEFLWWNNbjFUTTB2cEpFR05WT2MrMDVCSW54STloOWYwTWcwMVBEMHRZdQpH Y0xIWWdCemNyZkVtS3dNdE04V0VtY01KZDduMnVmZmFBdko4NDZXdWJiZVY3TVcx WWVoQWdNQkFBRT0KLS0tLS1FTkQgUlNBIFBVQkxJQyBLRVktLS0tLQppbnRyb2R1 Y3Rpb24tcG9pbnQgZW00Z2prNmVpaXVhbGhtbHlpaWZyemM3bGJ0cnNiaXAKaXAt YWRkcmVzcyA0Ni40LjE3NC41Mgpvbmlvbi1wb3J0IDQ0Mwpvbmlvbi1rZXkKLS0t LS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JR0pBb0dCQUxCbWhkRjV3SHhI cnBMU21qQVpvdHR4MjIwKzk5NUZkTU9PdFpOalJ3MURCU3ByVVpacXR4V2EKUDhU S3BIS3p3R0pLQ1ZZSUlqN2xvaGJ2OVQ5dXJtbGZURTA1VVJHZW5ab2lmT0ZOejNZ d01KVFhTY1FFQkoxMAo5aVdOTERUc2tMekRLQ0FiR2hibi9NS3dPZllHQmhOVGxq ZHlUbU5ZNUVDUmJSempldjl2QWdNQkFBRT0KLS0tLS1FTkQgUlNBIFBVQkxJQyBL RVktLS0tLQpzZXJ2aWNlLWtleQotLS0tLUJFR0lOIFJTQSBQVUJMSUMgS0VZLS0t LS0KTUlHSkFvR0JBTXhNSG9BbXJiVU1zeGlJQ3AzaVRQWWdobjBZdWVLSHgyMTl3 dThPL1E1MVF5Y1ZWTHBYMjdkMQpoSlhrUEIzM1hRQlhzQlM3U3hzU3NTQ1EzR0V1 clFKN0d1QkxwWUlSL3Zxc2FrRS9sOHdjMkNKQzVXVWh5RkZrCisxVFdJVUk1dHhu WEx5V0NSY0tEVXJqcWRvc0RhRG9zZ0hGZzIzTW54K3hYY2FRL2ZyQi9BZ01CQUFF PQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCmludHJvZHVjdGlvbi1wb2lu dCBqcWhmbDM2NHgzdXBlNmxxbnhpem9sZXdsZnJzdzJ6eQppcC1hZGRyZXNzIDYy LjIxMC44Mi4xNjkKb25pb24tcG9ydCA0NDMKb25pb24ta2V5Ci0tLS0tQkVHSU4g UlNBIFBVQkxJQyBLRVktLS0tLQpNSUdKQW9HQkFQVWtxeGdmWWR3MFBtL2c2TWJo bVZzR0tsdWppZm1raGRmb0VldXpnbyt3bkVzR3Z3VWVienJ6CmZaSlJ0MGNhWEZo bkNHZ1FEMklnbWFyVWFVdlAyNGZYby80bVl6TGNQZUk3Z1puZXVBUUpZdm05OFl2 OXZPSGwKTmFNL1d2RGtDc0ozR1ZOSjFIM3dMUFFSSTN2N0tiTnVjOXRDT1lsL3Iw OU9oVmFXa3phakFnTUJBQUU9Ci0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K c2VydmljZS1rZXkKLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JR0pB b0dCQUxieDhMZXFSb1Avcjl3OWhqd0Q0MVlVbTdQbzY5N3hSdHl0RjBNY3lMQ1M3 R1JpVVluamk3S1kKZmVwWGR2Ti9KbDVxUUtISUJiNjAya3VPVGwwcE44UStZZUZV U0lJRGNtUEJMcEJEaEgzUHZyUU1jR1ZhaU9XSAo4dzBITVpDeGd3QWNDQzUxdzVW d2l1bXhFSk5CVmNac094MG16TjFDbG95KzkwcTBsRlhMQWdNQkFBRT0KLS0tLS1F TkQgUlNBIFBVQkxJQyBLRVktLS0tLQoK -----END MESSAGE-----\ """ EXPECTED_DDG_INTRODUCTION_POINTS_CONTENT = b"""\ introduction-point iwki77xtbvp6qvedfrwdzncxs3ckayeu ip-address 178.62.222.129 onion-port 443 onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAK94BEYIHZ4KdEkeyPhbLCpRW5ESg+2WPQhrM4yuKYGuq8wFWgumZYR9 k/WA//FYXMBz0bB+ckuZs/Yu9nK+HLzpGapV0clst4GUMcBInUCzCcpjJTQsQDgm 3/Y3cqh0W55gOCFhomQ4/1WOYg7YCjk4XYHJE20OdG2Ll5zotK6fAgMBAAE= -----END RSA PUBLIC KEY----- service-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAJXmJb8lSydMMqCgCgfgvlB2E5rpd57kz/Aqg7/d1HKc3+l5QoUvHyuy ZsAlyka8Eu534hl41oqEKpAKYcMn1TM0vpJEGNVOc+05BInxI9h9f0Mg01PD0tYu GcLHYgBzcrfEmKwMtM8WEmcMJd7n2uffaAvJ846WubbeV7MW1YehAgMBAAE= -----END RSA PUBLIC KEY----- introduction-point em4gjk6eiiualhmlyiifrzc7lbtrsbip ip-address 46.4.174.52 onion-port 443 onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBALBmhdF5wHxHrpLSmjAZottx220+995FdMOOtZNjRw1DBSprUZZqtxWa P8TKpHKzwGJKCVYIIj7lohbv9T9urmlfTE05URGenZoifOFNz3YwMJTXScQEBJ10 9iWNLDTskLzDKCAbGhbn/MKwOfYGBhNTljdyTmNY5ECRbRzjev9vAgMBAAE= -----END RSA PUBLIC KEY----- service-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAMxMHoAmrbUMsxiICp3iTPYghn0YueKHx219wu8O/Q51QycVVLpX27d1 hJXkPB33XQBXsBS7SxsSsSCQ3GEurQJ7GuBLpYIR/vqsakE/l8wc2CJC5WUhyFFk +1TWIUI5txnXLyWCRcKDUrjqdosDaDosgHFg23Mnx+xXcaQ/frB/AgMBAAE= -----END RSA PUBLIC KEY----- introduction-point jqhfl364x3upe6lqnxizolewlfrsw2zy ip-address 62.210.82.169 onion-port 443 onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAPUkqxgfYdw0Pm/g6MbhmVsGKlujifmkhdfoEeuzgo+wnEsGvwUebzrz fZJRt0caXFhnCGgQD2IgmarUaUvP24fXo/4mYzLcPeI7gZneuAQJYvm98Yv9vOHl NaM/WvDkCsJ3GVNJ1H3wLPQRI3v7KbNuc9tCOYl/r09OhVaWkzajAgMBAAE= -----END RSA PUBLIC KEY----- service-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBALbx8LeqRoP/r9w9hjwD41YUm7Po697xRtytF0McyLCS7GRiUYnji7KY fepXdvN/Jl5qQKHIBb602kuOTl0pN8Q+YeFUSIIDcmPBLpBDhH3PvrQMcGVaiOWH 8w0HMZCxgwAcCC51w5VwiumxEJNBVcZsOx0mzN1Cloy+90q0lFXLAgMBAAE= -----END RSA PUBLIC KEY----- """ EXPECTED_DDG_SIGNATURE = """\ -----BEGIN SIGNATURE----- VKMmsDIUUFOrpqvcQroIZjDZTKxqNs88a4M9Te8cR/ZvS7H2nffv6iQs0tom5X4D 4Dy4iZiy+pwYxdHfaOxmdpgMCRvgPb34MExWr5YemH0QuGtnlp5Wxr8GYaAQVuZX cZjQLW0juUYCbgIGdxVEBnlEt2rgBSM9+1oR7EAfV1U= -----END SIGNATURE-----\ """ EXPECT_POINT_1_ONION_KEY = """\ -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAK94BEYIHZ4KdEkeyPhbLCpRW5ESg+2WPQhrM4yuKYGuq8wFWgumZYR9 k/WA//FYXMBz0bB+ckuZs/Yu9nK+HLzpGapV0clst4GUMcBInUCzCcpjJTQsQDgm 3/Y3cqh0W55gOCFhomQ4/1WOYg7YCjk4XYHJE20OdG2Ll5zotK6fAgMBAAE= -----END RSA PUBLIC KEY-----\ """ EXPECT_POINT_1_SERVICE_KEY = """\ -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAJXmJb8lSydMMqCgCgfgvlB2E5rpd57kz/Aqg7/d1HKc3+l5QoUvHyuy ZsAlyka8Eu534hl41oqEKpAKYcMn1TM0vpJEGNVOc+05BInxI9h9f0Mg01PD0tYu GcLHYgBzcrfEmKwMtM8WEmcMJd7n2uffaAvJ846WubbeV7MW1YehAgMBAAE= -----END RSA PUBLIC KEY-----\ """ EXPECT_POINT_2_ONION_KEY = """\ -----BEGIN RSA PUBLIC KEY----- MIGJAoGBALBmhdF5wHxHrpLSmjAZottx220+995FdMOOtZNjRw1DBSprUZZqtxWa P8TKpHKzwGJKCVYIIj7lohbv9T9urmlfTE05URGenZoifOFNz3YwMJTXScQEBJ10 9iWNLDTskLzDKCAbGhbn/MKwOfYGBhNTljdyTmNY5ECRbRzjev9vAgMBAAE= -----END RSA PUBLIC KEY-----\ """ EXPECT_POINT_2_SERVICE_KEY = """\ -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAMxMHoAmrbUMsxiICp3iTPYghn0YueKHx219wu8O/Q51QycVVLpX27d1 hJXkPB33XQBXsBS7SxsSsSCQ3GEurQJ7GuBLpYIR/vqsakE/l8wc2CJC5WUhyFFk +1TWIUI5txnXLyWCRcKDUrjqdosDaDosgHFg23Mnx+xXcaQ/frB/AgMBAAE= -----END RSA PUBLIC KEY-----\ """ EXPECT_POINT_3_ONION_KEY = """\ -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAPUkqxgfYdw0Pm/g6MbhmVsGKlujifmkhdfoEeuzgo+wnEsGvwUebzrz fZJRt0caXFhnCGgQD2IgmarUaUvP24fXo/4mYzLcPeI7gZneuAQJYvm98Yv9vOHl NaM/WvDkCsJ3GVNJ1H3wLPQRI3v7KbNuc9tCOYl/r09OhVaWkzajAgMBAAE= -----END RSA PUBLIC KEY-----\ """ EXPECT_POINT_3_SERVICE_KEY = """\ -----BEGIN RSA PUBLIC KEY----- MIGJAoGBALbx8LeqRoP/r9w9hjwD41YUm7Po697xRtytF0McyLCS7GRiUYnji7KY fepXdvN/Jl5qQKHIBb602kuOTl0pN8Q+YeFUSIIDcmPBLpBDhH3PvrQMcGVaiOWH 8w0HMZCxgwAcCC51w5VwiumxEJNBVcZsOx0mzN1Cloy+90q0lFXLAgMBAAE= -----END RSA PUBLIC KEY-----\ """ EXPECTED_BASIC_AUTH_INTRODUCTION_POINTS_ENCODED = """\ -----BEGIN MESSAGE----- AQEAi3xIJz0Qv97ug9kr4U0UNN2kQhkddPHuj4op3cw+fgMLqzPlFBPAJgaEKc+g 8xBTRKUlvfkXxocfV75GyQGi2Vqu5iN1SbI5Uliu3n8IiUina5+WaOfUs9iuHJIK cErgfT0bUfXKDLvW6/ncsgPdb6kb+jjT8NVhR4ZrRUf9ASfcY/f2WFNTmLgOR3Oa f2tMLJcAck9VbCDjKfSC6e6HgtxRFe9dX513mDviZp15UAHkjJSKxKvqRRVkL+7W KxJGfLY56ypZa4+afBYT/yqLzY4C47/g5TTTx9fvsdp0uQ0AmjF4LeXdZ58yNjrp Da63SrgQQM7lZ3k4LGXzDS20FKW2/9rpWgD78QLJGeKdHngD3ERvTX4m43rtEFrD oB/4l2nl6fh0507ASYHy7QQQMcdjpN0OWQQKpL9SskZ8aQw1dY4KU28Gooe9ff+B RGm6BlVzMi+HGcqfMpGwFfYopmqJuOXjNlX7a1jRwrztpJKeu4J9iSTiuSOEiQSq kUyHRLO4rWJXa2/RMWfH4XSgdUaWFjOF6kaSwmI/pRZIepi/sX8BSKm+vvOnOtlr Tz2DVSiA2qM+P3Br9qNTDUmTu9mri6fRzzVnj+ybdTQXn60jwPw4vj4xmvVTkjfZ ZB2gw2+sAmZJA5pnLNGu4N8veo1Jiz7FLE0m+7yjXbcBc/GHWGTJa0Sa1Hwfp82t ohagQlRYKhLaRrM6ZvjnPMH5dqT/ypfBXcIQAh6td1+e1Hf/uXZPM/ZrgHeCJqF+ PvLDuu4TYxOod+elZE5LfwDFPzCcMA8XNuuDzGQOFOMh9o4xTbQchyRSfhDGev/H HpY9qxRyua+PjDCmE/F3YiFy77ITJLhCyYEdzVw43hCVY52inEauvHRzqTl7Lc53 PhnSIW6rDWsrrSMWApCC5WRSOSKfh0u4vO13bVLTb/QmuvMEhGiXDVI3/0NEpqKF ewqyiG9Dvv67A3/IjTe3aMRGfWREHFnEG9bonn03uoufgmQb4h9ci9+QU52sl16F rxRpxLyMRp8dpUzZbK3qxtASp09Lc2pdgItWcMMTtPObcd7KVV/xkVqm3ezaUbRF Nw5qDFxkG85ohTvFt3wnfxkpytMhWoBv9F0ZMEFRLY2j+cb8IqXN5dyz6rGqgSYY dtItQvI7Lq3XnOSFy3uCGC9Vzr6PRPQIrVH/56rSRaEyM8TgVWyaQQ3xm26x9Fe2 jUg50lG/WVzsRueBImuai1KCRC4FB/cg/kVu/s+5f5H4Z/GSD+4UpDyg3i2RYuy9 WOA/AGEeOLY5FkOTARcWteUbi6URboaouX2lnAXK6vX6Ysn8HgE9JATVbVC/96c9 GnWaf9yCr6Q0BvrHkS7hsJJj+VwaNPW4POSqhL+p0p+2eSWZVMlFFxNr+BNKONk+ RAssIHF1xVRHzzl75wjzhzuq0A0crHcHb64P+glkPt4iI7SqejyCrMQh6BWia6RT c+NwXTnbcibB56McF+xWoyHne6dg1F0urA61JfQboyWOy+Z+cNPjEIcwWhJr/+Gx v7/yf3V1kNECa90L7BeUmFGKxL7SvgyapevWqkIQCZEcOnobXQRdWUmNqSoZmOxB u5eDcvrdF9p5wG5IStpzO9OConG3SQb46S9OSU3O7PnjKFId6KRIM7VsprMIIBTz HKy6ufKyMXgyxxnvE5TZQcLzA4Wv8vHWET3t3WSQEwSPx45IAbjsE587YNOkjK1X HNT3ypfRdJacxtttR7Y5Y/XF4tJmXkCfb5RoEqIPrQTmiLYh0h02i6CqeFK9u7j/ yAdKY3NrCBuqPM4mWCdjvtgC9i1Q98LCDiVESRrvLlfvv3iWozDUZ3qIU4TnSgti U5+xKrmlKcWHHgADS56IECgCQyr2nZEhcNK7vKvg+KgA667tRm7M35w9eHz+J7lg x5v5GYPH4J1UjPEb5Cwl+Vlr0XIqbhMX9MZWimpOJ0l5TisOLuTJ9ennREsFPZjN U4IZQht7gifFlemn7D4a+UXHu95bHxDBMPJky7iYc2U3r50+JWRF+LO1L2TNDQlV iPO8AOoI0V0cGaYE+0ZUgpUDk8fxUH5CAPCn+dbsqDh165G6590cF9eF4/yrlf2V nbhZipPQyOTrmiCkBPQ1zuXYyfFHrJL7yK4ykiBV8c/VLT8nxeKfPwW3USKOScnx k68qqFZ6lNFxlDwPAJR3F2H+PN5JZ8H1lTE56ujgTBpArXMPYpKri4a0lG+8QnYK D6jOJIli5QtVQxES4X64NDwducoGHnquMZs3ScvJQPSOuTvuqaad4FrTCZGbv6Ic emUAHDsxjffMQ9IJYulluCTVWgS/AiBk31yiUB0GsAqZYcWz5kKgTpOXBQhulACM waokEqbyH2Vtvc1peiPi+Vh6EhTSiDoEVZ2w9GrOnjgpyK6zxzH0aIhJJxlQu8it w+xj/3+79Bf8myVesgzCWvXbkmvc6jJaoHGopV8lTM2JUn4xYCSz71Bt4wQBKZX4 hFXDlDZaY1k/QRP/zTfQ8pjbcohDgUVW8eftJz3ND5Iy8D3nRF9/BQB3PWox4vyQ Fj94Eoe8NmEArIKWjUoSkn+EDgNcdHGBIaQ5is0N8r9n4E2cgMj57i4Fm37k8c6+ hlilrggVJ8qTBGs57M0ldqRLwt1bM6SkU//oMGel7Ft3EDd98W/6RXRkmAbsLhRx 7VMb4WCUBrIZLxo1/StwHa13RyTHAt0GKPu549l3oTZezsSad8vlurbnIbxtK9Cl hp6mYPd3Djoe5OaLe8Gnu23ko+S2+kfHIjOwkza9R5w6AzLjkjYS3C8oRwuxKOft lj/7xMZWDrfyw5H86L0QiaZnkmD+nig1+S+Rn39mmuEgl2iwZO/ihlncUJQTEULb 7IHpmofr+5ya5xWeo/BFQhulTNr2fJN0bPkVGfp+ -----END MESSAGE-----\ """ expect_invalid_attr = functools.partial(base_expect_invalid_attr, HiddenServiceDescriptor, 'descriptor_id', 'y3olqqblqw2gbh6phimfuiroechjjafa') expect_invalid_attr_for_text = functools.partial(base_expect_invalid_attr_for_text, HiddenServiceDescriptor, 'descriptor_id', 'y3olqqblqw2gbh6phimfuiroechjjafa') class TestHiddenServiceDescriptor(unittest.TestCase): def test_for_duckduckgo_with_validation(self): """ Parse duckduckgo's descriptor. """ descriptor_file = open(get_resource('hidden_service_duckduckgo'), 'rb') desc = next(stem.descriptor.parse_file(descriptor_file, 'hidden-service-descriptor 1.0', validate = True)) self._assert_matches_duckduckgo(desc) def test_for_duckduckgo_without_validation(self): """ Parse duckduckgo's descriptor """ descriptor_file = open(get_resource('hidden_service_duckduckgo'), 'rb') desc = next(stem.descriptor.parse_file(descriptor_file, 'hidden-service-descriptor 1.0', validate = False)) self._assert_matches_duckduckgo(desc) def test_for_facebook(self): """ Parse facebook's descriptor. """ descriptor_file = open(get_resource('hidden_service_facebook'), 'rb') desc = next(stem.descriptor.parse_file(descriptor_file, 'hidden-service-descriptor 1.0', validate = True)) self.assertEqual('utjk4arxqg6s6zzo7n6cjnq6ot34udhr', desc.descriptor_id) self.assertEqual(2, desc.version) self.assertEqual('6355jaerje3bqozopwq2qmpf4iviizdn', desc.secret_id_part) self.assertEqual(datetime.datetime(2014, 10, 31, 23, 0, 0), desc.published) self.assertEqual([2, 3], desc.protocol_versions) @test.require.cryptography def test_descriptor_signing(self): self.assertRaisesWith(NotImplementedError, 'Signing of HiddenServiceDescriptor not implemented', HiddenServiceDescriptor.create, sign = True) @test.require.cryptography def test_with_basic_auth(self): """ Parse a descriptor with introduction-points encrypted with basic auth. """ descriptor_file = open(get_resource('hidden_service_basic_auth'), 'rb') desc = next(stem.descriptor.parse_file(descriptor_file, 'hidden-service-descriptor 1.0', validate = True)) self.assertEqual('yfmvdrkdbyquyqk5vygyeylgj2qmrvrd', desc.descriptor_id) self.assertEqual(2, desc.version) self.assertEqual('fluw7z3s5cghuuirq3imh5jjj5ljips6', desc.secret_id_part) self.assertEqual(datetime.datetime(2015, 2, 24, 20, 0, 0), desc.published) self.assertEqual([2, 3], desc.protocol_versions) self.assertEqual(EXPECTED_BASIC_AUTH_INTRODUCTION_POINTS_ENCODED, desc.introduction_points_encoded) self.assertEqual([], desc.introduction_points_auth) self.assertRaises(DecryptionFailure, desc.introduction_points) self.assertRaises(DecryptionFailure, desc.introduction_points, 'aCmx3qIvArbil8A0KM4KgQ==') introduction_points = desc.introduction_points('dCmx3qIvArbil8A0KM4KgQ==') self.assertEqual(3, len(introduction_points)) point = introduction_points[0] self.assertEqual('hmtvoobwglmmec26alnvl7x7mgmmr7xv', point.identifier) self.assertEqual('195.154.82.88', point.address) self.assertEqual(443, point.port) self.assertTrue('MIGJAoGBANbPRD07T' in point.onion_key) self.assertTrue('MIGJAoGBAN+LAdZP/' in point.service_key) self.assertEqual([], point.intro_authentication) point = introduction_points[1] self.assertEqual('q5w6l2f4g5zw4rkr56fkyovbkkrnzcj5', point.identifier) self.assertEqual('37.252.190.133', point.address) self.assertEqual(9001, point.port) self.assertTrue('MIGJAoGBAKmsbKrtt' in point.onion_key) self.assertTrue('MIGJAoGBANwczLtzR' in point.service_key) self.assertEqual([], point.intro_authentication) point = introduction_points[2] self.assertEqual('qcvprvmvnjb4dfyqjtxskugniliwlrx3', point.identifier) self.assertEqual('193.11.114.45', point.address) self.assertEqual(9002, point.port) self.assertTrue('MIGJAoGBAM1ILL+7P' in point.onion_key) self.assertTrue('MIGJAoGBAM7B/cymp' in point.service_key) self.assertEqual([], point.intro_authentication) @test.require.cryptography def test_with_stealth_auth(self): """ Parse a descriptor with introduction-points encrypted with stealth auth. """ descriptor_file = open(get_resource('hidden_service_stealth_auth'), 'rb') desc = next(stem.descriptor.parse_file(descriptor_file, 'hidden-service-descriptor 1.0', validate = True)) self.assertEqual('ubf3xeibzlfil6s4larq6y5peup2z3oj', desc.descriptor_id) self.assertEqual(2, desc.version) self.assertEqual('jczvydhzetbpdiylj3d5nsnjvaigs7xm', desc.secret_id_part) self.assertEqual(datetime.datetime(2015, 2, 24, 20, 0, 0), desc.published) self.assertEqual([2, 3], desc.protocol_versions) self.assertEqual([], desc.introduction_points_auth) self.assertRaises(DecryptionFailure, desc.introduction_points) self.assertRaises(DecryptionFailure, desc.introduction_points, 'aCmx3qIvArbil8A0KM4KgQ==') introduction_points = desc.introduction_points('dCmx3qIvArbil8A0KM4KgQ==') self.assertEqual(3, len(introduction_points)) point = introduction_points[0] self.assertEqual('6h4bkedts3yz2exl3vu4lsyiwkjrx5ff', point.identifier) self.assertEqual('95.85.60.23', point.address) self.assertEqual(443, point.port) self.assertTrue('MIGJAoGBAMX5hO5hQ' in point.onion_key) self.assertTrue('MIGJAoGBAMNSjfydv' in point.service_key) self.assertEqual([], point.intro_authentication) point = introduction_points[1] self.assertEqual('4ghasjftsdfbbycafvlfx7czln3hrk53', point.identifier) self.assertEqual('178.254.55.101', point.address) self.assertEqual(9901, point.port) self.assertTrue('MIGJAoGBAL2v/KNEY' in point.onion_key) self.assertTrue('MIGJAoGBAOXiuIgBr' in point.service_key) self.assertEqual([], point.intro_authentication) point = introduction_points[2] self.assertEqual('76tsxvudxqx47gedk3tl5qpesdzrh6yh', point.identifier) self.assertEqual('193.11.164.243', point.address) self.assertEqual(9001, point.port) self.assertTrue('MIGJAoGBALca3zEoS' in point.onion_key) self.assertTrue('MIGJAoGBAL3rWIAQ6' in point.service_key) self.assertEqual([], point.intro_authentication) def _assert_matches_duckduckgo(self, desc): self.assertEqual('y3olqqblqw2gbh6phimfuiroechjjafa', desc.descriptor_id) self.assertEqual(2, desc.version) self.assertEqual(EXPECTED_DDG_PERMANENT_KEY, desc.permanent_key) self.assertEqual('e24kgecavwsznj7gpbktqsiwgvngsf4e', desc.secret_id_part) self.assertEqual(datetime.datetime(2015, 2, 23, 20, 0, 0), desc.published) self.assertEqual([2, 3], desc.protocol_versions) self.assertEqual(EXPECTED_DDG_INTRODUCTION_POINTS_ENCODED, desc.introduction_points_encoded) self.assertEqual([], desc.introduction_points_auth) self.assertEqual(EXPECTED_DDG_INTRODUCTION_POINTS_CONTENT, desc.introduction_points_content) self.assertEqual(EXPECTED_DDG_SIGNATURE, desc.signature) introduction_points = desc.introduction_points() self.assertEqual(3, len(introduction_points)) point = introduction_points[0] self.assertEqual('iwki77xtbvp6qvedfrwdzncxs3ckayeu', point.identifier) self.assertEqual('178.62.222.129', point.address) self.assertEqual(443, point.port) self.assertEqual(EXPECT_POINT_1_ONION_KEY, point.onion_key) self.assertEqual(EXPECT_POINT_1_SERVICE_KEY, point.service_key) self.assertEqual([], point.intro_authentication) point = introduction_points[1] self.assertEqual('em4gjk6eiiualhmlyiifrzc7lbtrsbip', point.identifier) self.assertEqual('46.4.174.52', point.address) self.assertEqual(443, point.port) self.assertEqual(EXPECT_POINT_2_ONION_KEY, point.onion_key) self.assertEqual(EXPECT_POINT_2_SERVICE_KEY, point.service_key) self.assertEqual([], point.intro_authentication) point = introduction_points[2] self.assertEqual('jqhfl364x3upe6lqnxizolewlfrsw2zy', point.identifier) self.assertEqual('62.210.82.169', point.address) self.assertEqual(443, point.port) self.assertEqual(EXPECT_POINT_3_ONION_KEY, point.onion_key) self.assertEqual(EXPECT_POINT_3_SERVICE_KEY, point.service_key) self.assertEqual([], point.intro_authentication) def test_minimal_hidden_service_descriptor(self): """ Basic sanity check that we can parse a hidden service descriptor with minimal attributes. """ desc = HiddenServiceDescriptor.create() self.assertEqual('y3olqqblqw2gbh6phimfuiroechjjafa', desc.descriptor_id) self.assertEqual(2, desc.version) self.assertEqual('e24kgecavwsznj7gpbktqsiwgvngsf4e', desc.secret_id_part) self.assertEqual([2, 3], desc.protocol_versions) self.assertEqual('-----BEGIN MESSAGE-----\n-----END MESSAGE-----', desc.introduction_points_encoded) self.assertEqual([], desc.introduction_points_auth) self.assertEqual(b'', desc.introduction_points_content) self.assertEqual([], desc.introduction_points()) def test_unrecognized_line(self): """ Includes unrecognized content in the descriptor. """ desc = HiddenServiceDescriptor.create({'pepperjack': 'is oh so tasty!'}) self.assertEqual(['pepperjack is oh so tasty!'], desc.get_unrecognized_lines()) def test_proceeding_line(self): """ Includes a line prior to the 'rendezvous-service-descriptor' entry. """ expect_invalid_attr_for_text(self, b'hibernate 1\n' + HiddenServiceDescriptor.content()) def test_trailing_line(self): """ Includes a line after the 'router-signature' entry. """ expect_invalid_attr_for_text(self, HiddenServiceDescriptor.content() + b'\nhibernate 1') def test_required_fields(self): """ Check that we require the mandatory fields. """ line_to_attr = { 'rendezvous-service-descriptor': 'descriptor_id', 'version': 'version', 'permanent-key': 'permanent_key', 'secret-id-part': 'secret_id_part', 'publication-time': 'published', 'introduction-points': 'introduction_points_encoded', 'protocol-versions': 'protocol_versions', 'signature': 'signature', } for line in REQUIRED_FIELDS: desc_text = HiddenServiceDescriptor.content(exclude = (line,)) expected = [] if line == 'protocol-versions' else None expect_invalid_attr_for_text(self, desc_text, line_to_attr[line], expected) def test_invalid_version(self): """ Checks that our version field expects a numeric value. """ test_values = ( '', '-10', 'hello', ) for test_value in test_values: expect_invalid_attr(self, {'version': test_value}, 'version') def test_invalid_protocol_versions(self): """ Checks that our protocol-versions field expects comma separated numeric values. """ test_values = ( '', '-10', 'hello', '10,', ',10', '10,-10', '10,hello', ) for test_value in test_values: expect_invalid_attr(self, {'protocol-versions': test_value}, 'protocol_versions', []) def test_introduction_points_when_empty(self): """ It's valid to advertise zero introduciton points. I'm not clear if this would mean an empty protocol-versions field or that it's omitted but either are valid according to the spec. """ missing_field_desc = HiddenServiceDescriptor.create(exclude = ('introduction-points',)) self.assertEqual(None, missing_field_desc.introduction_points_encoded) self.assertEqual([], missing_field_desc.introduction_points_auth) self.assertEqual(None, missing_field_desc.introduction_points_content) self.assertEqual([], missing_field_desc.introduction_points()) empty_field_desc = HiddenServiceDescriptor.create({'introduction-points': MESSAGE_BLOCK % ''}) self.assertEqual((MESSAGE_BLOCK % '').strip(), empty_field_desc.introduction_points_encoded) self.assertEqual([], empty_field_desc.introduction_points_auth) self.assertEqual(b'', empty_field_desc.introduction_points_content) self.assertEqual([], empty_field_desc.introduction_points()) def test_introduction_points_when_not_base64(self): """ Checks the introduction-points field when the content isn't base64 encoded. """ test_values = ( MESSAGE_BLOCK % '12345', MESSAGE_BLOCK % 'hello', ) for test_value in test_values: desc = expect_invalid_attr(self, {'introduction-points': test_value}, 'introduction_points_encoded', test_value.strip()) self.assertEqual([], desc.introduction_points_auth) self.assertEqual(None, desc.introduction_points_content) self.assertEqual([], desc.introduction_points()) stem-1.7.1/test/unit/descriptor/data/0000775000175000017500000000000013411004021020221 5ustar atagaratagar00000000000000stem-1.7.1/test/unit/descriptor/data/cr_in_contact_line0000664000175000017500000001032613157571677024023 0ustar atagaratagar00000000000000@type server-descriptor 1.0 router pogonip 75.5.248.48 9001 0 0 platform Tor 0.1.2.17 on Darwin i386 published 2007-09-03 10:15:53 opt fingerprint 6DAB D62B C65D 4E6F E620 2931 57FC 7696 8DAB 9C9B uptime 5423 bandwidth 98304 196608 0 onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAO6pORBI9rGRCPSb2lLwzl2630eFMlBXLgLtwQvYLY2s58cWpKjhI+ZF Q43+0e50pgC//JyS3Zac4O7MA5+BUfMvNOzKUdSIIGc6QjwST/larbDy14k9XalQ +G8rdnKb7gDNLrHjxhw5tC0JSTSTXI08bNsFeN1MoY8sFBjRlyDxAgMBAAE= -----END RSA PUBLIC KEY----- signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBALL0zokdBKjVcZA1P0K2jWK7afkvmB2bpRAdx5x1KRPZtB0mRxyjvgwL Tp0z3jLwhB4gzYY4LmS8p5RBH53gv4GsNW1rPSr99q4wjWyEY5AfjOdJZtFo/nhP 881leOraicfcXmqrgtfbXZ0Jj+G9Ko216yEv4vBN/UV87kZHb/4tAgMBAAE= -----END RSA PUBLIC KEY----- opt write-history 2007-09-03 10:01:27 (900 s) 471040,874496,354304,0,0,0,0,0,0,0,0,60416,1160192,2017280,3396608,1585152,5990400,5469184,10896384,20568064,23362560,43372544,36531200,43439104,47890432,54303744,38624256,40414208,26827776,0,0,0,0,50176,611328,3126272,2952192,33792,28672 opt read-history 2007-09-03 10:01:27 (900 s) 6890496,2631680,2260992,0,0,0,0,0,0,0,0,1096704,1856512,1133568,1038336,1390592,3272704,2115584,6868992,13585408,13746176,30726144,25562112,28556288,36113408,35810304,25213952,30357504,13510656,0,0,0,0,964608,568320,966656,1991680,17408,140288 opt hibernating 1 contact jie1 at pacbell dot net -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 dot 4 dot 7 (Darwin) mQGiBEbb0rcRBADqBiUXsmtpJifh74irNnkHbhKMj8O4TqenaZYhdjLWouZsZd07 mTQoP40G4zqOrVEOOcXpdSiRnHWJYfgTnkibNZrOZEZLn3H1ywpovEgESmoGEdAX oid3XuIYRpRnqoafbFg9sg+OofX/mJuntVuoIdHfkHYnHlcShfKYQX8x4wCgqVSL VrjINDUy9YRznpj+TeoflG8EALoM4xHmIAhSKhviZr6pd86OAYF5bB8iY+koiQtQ 066Upypj+dUMKeYWKkWp3loY5KwtkA0rBd2+nhf/PRJyn387mfSiZ91NZ+Pph29d ERida1naMWOgv+XZnqDH0bk9BD12QqM/btawGiyOf3fdtLLseNzuiHr9gO2NjKxR 5jjgBACop3bFpx2nfELj/NzS/umtUaQJ139BI0BJOHrVeSffMAcuH3v5B3WJVJ5v Jb5kvvD9L7fIZNkAicpLhMUG4Lz6zNXMNGSUlCAOvHoQzBUMz6EVE7Ip73qX9viu LARFMf25qi+SsZJB18l3t/I+UgW+VTimZZgoHmVtX0nVZL+yvbQWSklFIDxqaWUx QHBhY2JlbGwubmV0PohgBBMRAgAgBQJG29K3AhsjBgsJCAcDAgQVAggDBBYCAwEC HgECF4AACgkQv5Dmts313gKv4ACcDggg0o/+ys4Djkbltvwoa9IGFoEAn1yjv8W1 Kj5WkdrV8oZudjAq2zjNuQQNBEbb0rcQEAC6mKhgeRAQtJLI7JGEqjO6hOu5mq1+ UYgpZnuQq8FxCkG2MQ0sqOjXcZPIS55wWBuUNT+G+6B+cACJHqKo+W44zXtEXaTB dHVEi135cBv037fNtH73fRK/D43QKHu+r9luxW//mMQdLhODNFSiowY8ZlOtPEYz qBiJBz0Shr0vN4EM3pkQZh7Jnmntw0Gu/hQIQONIhBFKNYYg6Zuar8j7kTHZJvDn Zh5N6C7B9pilZsAp6vuCF7CHeUx5hbyzubfUHqpqnMr2pP3gnSkC/tbxsWPxWhd7 23SfRZpbK9TFJg65n4Qr2rYF1ccGe5mpRXRWxMA4sNVmmUOPgEjsbjMgvjUBmiAd eU+xEnNGJPyamPnwvKl5MIR1Tn2BbsY+o9g6RqsK7F6ql+RP4ya1oblluOkZMbjx F8BB6Hbe0xQzp0mSKJxSJN4wY+9xDa9SKAn9MgeI23hA9B9iwhWeqz+YvLNJu82U fBPSrr8xfM5htvNHapeGaRc6QsLcyMLecZ9/Rwpjp8iO4BNFrXGErgpc5SwzZFzM beu2ymTZQ5lXXGBDNjK0C90+Z15MuUIyXswVeCP08iWgZCbPv6Y2zlVoYEuyG1BK UAkig3vzcG7iVp0HT1J191KwIPfdAS6DnXcSsb39mfR9/47zYlLsePrbHyrA/p9z 4mBDHpsqlKqUTwADBQ//a500OJpnrVhjvXqJy6/6WI4zKKq56p0KDmGitKWlexEZ uolfeJXxg2F4Y997XkOCTZjRlJEeoAQ1n4S5Vs54dlSS0Fsf1DOPflP5zmpEr3nV 6MFUkNpHUINvgxYhTPBxNq6k7DRXklBZu5aq8QbNzgbTlnS5tANMcYjlRGrKqjwm Zb7gmO3EiMp5tH8L71fA02zAyfVStpjsWBEoISrZHyoWkOP6v+JAIhLss9lSCqRT 1EPdX/Zhn+bsWjfvPig+TOIAlbEVHtLREIVvjm3Okjt4hTrSGXeff6naeuGDPSOk DfFCiUTNjqP6uUmQMMR3F0HdycOuHCp/V4X/3cwKMqSoVBC278AOPptNijwBkR+1 tGMH6g3+s8VO4EsuOYpnfTFhbSPuEGBzppD56Ezu9daWm2hcxqoKNmCBx+HYfOmW PXB8R8JRiftEPxpCGnb6qCAzrfIpjjBHtwASIQ4IbJds7mjobiBQGC93mOt5sUNk plixY77kv8h9ZYgBITJryo719IPOTG6nXCcPfke5Jp1uAx7pYpqTZqWfrio0TCT0 q6tP7+3ZGecFDN6xV3JQ4hICkTW4uOtfV3803NGM8bmZCV65EWRlzY7gOLM+Wat2 G31soA5M7cAe/Q1ro7yqBDzAIAA3DFT58lRJY/BCXkJPDJ2ABFl/O3OHUD++pReI SQQYEQIACQUCRtvStwIbDAAKCRC/kOa2zfXeAl9/AJ4lCZTgLIAwfh2Kgg8Rowxl GrO+5ACfagQ9rlfx2oxCWijYwpYFRk3NhCY= =Xaw3 -----END PGP PUBLIC KEY BLOCK----- reject 0.0.0.0/8:* reject 169.254.0.0/16:* reject 127.0.0.0/8:* reject 192.168.0.0/16:* reject 10.0.0.0/8:* reject 172.16.0.0/12:* reject *:25 reject *:119 reject *:135-139 reject *:445 reject *:465 reject *:563 reject *:587 reject *:1214 reject *:4661-4666 reject *:6346-6429 reject *:6699 reject *:6881-6999 accept *:* router-signature -----BEGIN SIGNATURE----- PrL8cocQcTTmQp0wy0dxlFOczGv8s2/hZzAafOhjdM0QqLMLh9FW/4RqH0jcDz+P t1QU3xIF3JV1fsW0rx4vFYKXG7WrLrrQp3gGuJvrXO+132UAsrs7eJKk3yxEi2lq FNY26XGZqTDPY4WPl08/JgXXfckgFFg76E4Jcl5/tY8= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/compressed_identity0000664000175000017500000000434013341034346024241 0ustar atagaratagar00000000000000router moria1 128.31.0.34 9101 0 9131 identity-ed25519 -----BEGIN ED25519 CERT----- AQQABnxNAQS9ja600v/ZodOUiu7NepTkbPIOrFPgEVQE+03rGBtPAQAgBADKnR/C 2nhpr9UzJkkbPy83sqbfNh63VgFnCpkSTULAcq52z8xM7raRDCiTJTu/FK/BJGgE dJcFQ8MgZJOuYgFKcMVyQ6j2FGbhDI0zQTK1+TAPNRG4ixiF7h7wqDT9Ugw= -----END ED25519 CERT----- master-key-ed25519 yp0fwtp4aa/VMyZJGz8vN7Km3zYet1YBZwqZEk1CwHI platform Tor 0.3.4.0-alpha-dev on Linux proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2 published 2018-03-31 04:17:41 fingerprint 9695 DFC3 5FFE B861 329B 9F1A B04C 4639 7020 CE31 uptime 295196 bandwidth 512000 62914560 3403447 extra-info-digest 393861CB4D9A0480E5A58A3005A88DD7F09271E3 CCbwxMembtsEKAVkU2bqCiBhKaokRlJv6077uy5kI4Q caches-extra-info onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAKsNybH/i/nMLDwSr6WYd77EV6IgiuhfD7UBbsifsDywTe+YrZU3Z4O+ DY9jemMPRA7wYioJrmXyMVTsbktjWUtWFge1oUj2xsxO3cufCavLmmkmqpkHL3Wn xRJraupgfLK72/UN8wXB0duSAU/DH9hTg7WRhkFZdRJK7rostJvZAgMBAAE= -----END RSA PUBLIC KEY----- signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBALtJ9uD7cD7iHjqNA3AgsX9prES5QN+yFQyr2uOkxzhvunnaf6SNhzWW bkfylnMrRm/qCz/czcjZO6N6EKHcXmypehvP566B7gAQ9vDsb+l7VZVWgXvzNc2s tl3P7qpC08rgyJh1GqmtQTCesIDqkEyWxwToympCt09ZQRq+fIttAgMBAAE= -----END RSA PUBLIC KEY----- onion-key-crosscert -----BEGIN CROSSCERT----- A9x30r1LTl6rRUe4/irB6/cdNGmd95+bOuArjrmuwSI8Crerx3uNbbN8/iRlRSec fBqElxb8SvEGONvtyjGVxp+t5QQS381Bah7DRMz7MfRvOgD8UoZ4DEcpMBnJnA+O 5OnAoBVOProdfUvFfEnBWJY+ELB3ShG4A3TL4c8QrwA= -----END CROSSCERT----- ntor-onion-key-crosscert 0 -----BEGIN ED25519 CERT----- AQoABnadAcqdH8LaeGmv1TMmSRs/Lzeypt82HrdWAWcKmRJNQsByAEnIlLlEtELa EZA/y3Q5wXxA20upqmSKoCt1s8a6cXHqnsbha61MVbRLVCgWlWmKNjBSu+GiXeXC IJ9Tr+aYawM= -----END ED25519 CERT----- hidden-service-dir contact 1024D/28988BF5 arma mit edu ntor-onion-key a3r4k2huGP4YdHTQ8ldJhZkm5O+1tLaKE//o5DSibU0= reject *:* tunnelled-dir-server router-sig-ed25519 FkY6h3SMPWPt1fQlU8jsFllGWIy+lw7SGTjTV2FZVNlrHYHcS1F2L7bMGu38ljZ7J+VIBssRZnaiQVEXbI9uDQ router-signature -----BEGIN SIGNATURE----- UzHGCcQK1XGntL3MVvcgcj0kpCsEMf5UIEj4eWOtCjWyriOX7nqwayc5vWOubZLN pAZ27MjVmMbVGgtS0xFZ/UQrGEeznITaZwjLNd1IOliadKPdOp4w4OFcjbkCytk6 MdAEyxwnZzxUwCex0Kj+3FWXQTr09VnXMg5/+vdbCUY= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/descriptor_archive.tar0000664000175000017500000005000013157571677024644 0ustar atagaratagar00000000000000descriptor_archive/0/2/02c311d3d789f3f55c0880b5c85f3c196343552c0000644000175000017500000000461511755476646021637 0ustar atagaratagar@type server-descriptor 1.0 router Amunet1 199.48.147.35 443 0 80 platform Tor 0.2.2.34 (git-f0e1ee98af443107) on Linux x86_64 opt protocols Link 1 2 Circuit 1 published 2012-03-02 09:06:14 opt fingerprint B6D8 3EC2 D9E1 8B0A 7A33 428F 8CFA 9C53 6769 E209 uptime 2370398 bandwidth 104857600 209715200 8610541 opt extra-info-digest F1A0DE598AAD783548C6185909585FB9CDF736FE onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBALEN3N09XeXVQgfQxku+swowfQiUoeX22HxneJYdHWBxgpY40Vke+Fa8 lDr2Xw2PVHChgmUl4xEXF2NPt6UD03RDZHfHVMKRYpnpJmJBaI58rJkw7DjHgDuP FSlbXDhQMWbFT8bvbhqaaTMvlfQx1cnqIhc+ZAREdeTjlJysqYndAgMBAAE= -----END RSA PUBLIC KEY----- signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBANOGfEY3n/HmoyVAbgPC1OURB9PXR/nUQPdbeAVrDA17FXbw98OF7otR 9nWfi1vPVn8H0ODXrn7YEaqxYDjSMvacchNCKC4vFxgkpdVEzSsiYBLYsxGXaDys 4FOPQAix2EZaEKon4tuUMQAHSjLcjH5VBkixh4WXj9C4h1l9YMmnAgMBAAE= -----END RSA PUBLIC KEY----- family $0CE3CFB1E9CC47B63EA8869813BF6FAB7D4540C1 $1FD187E8F69A9B74C9202DC16A25B9E7744AB9F6 $74FB5EFA6A46DE4060431D515DC9A790E6AD9A7C $77001D8DA9BF445B0F81AA427A675F570D222E6A $A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB $D2F37F46182C23AB747787FD657E680B34EAF892 $E0BD57A11F00041A9789577C53A1B784473669E4 $E5E3E9A472EAF7BE9682B86E92305DB4C71048EF opt hidden-service-dir contact tor-admin on formlessnetworking of net reject 0.0.0.0/8:* reject 169.254.0.0/16:* reject 127.0.0.0/8:* reject 192.168.0.0/16:* reject 10.0.0.0/8:* reject 172.16.0.0/12:* reject 199.48.147.35:* accept *:20-23 accept *:43 accept *:53 accept *:79-81 accept *:88 accept *:110 accept *:143 accept *:194 accept *:443 accept *:464-465 accept *:543-544 accept *:563 accept *:587 accept *:706 accept *:749 accept *:873 accept *:902-904 accept *:981 accept *:989-993 accept *:995 accept *:1194 accept *:1220 accept *:1293 accept *:1500 accept *:1723 accept *:1863 accept *:2082-2083 accept *:2086-2087 accept *:2095-2096 accept *:3389 accept *:3690 accept *:4321 accept *:4643 accept *:5050 accept *:5190 accept *:5222-5223 accept *:5900 accept *:6666-6667 accept *:6679 accept *:6697 accept *:8000 accept *:8008 accept *:8080 accept *:8087-8088 accept *:8443 accept *:8888 accept *:9418 accept *:9999 accept *:10000 accept *:19638 reject *:* router-signature -----BEGIN SIGNATURE----- TolLBBD13jT8USQ2AoZ3O7j73bknqj4WtqENF+akuJh3QKCBIHIUagcRH4q/Xt6y mNx8A/3ip/sygZwPEX080JFt03rJjF50hK/lpM2zvpn6Fw6lHFh65DV7wSjFfk7Y cqG4hkUqinotSj413JFhVihJ6bz/gOOmovU1ufpDuJw= -----END SIGNATURE----- descriptor_archive/1/b/1bb798cae15e21479db0bc700767eee4733e9d4a0000644000175000017500000000466711755476655022307 0ustar atagaratagar@type server-descriptor 1.0 router Amunet11 199.48.147.45 22 0 80 platform Tor 0.2.2.34 (git-f0e1ee98af443107) on Linux x86_64 opt protocols Link 1 2 Circuit 1 published 2012-03-01 02:58:10 opt fingerprint 1F43 EE37 A067 0301 AD9C B555 D94A FEC2 C89F DE86 uptime 2261883 bandwidth 104857600 209715200 9197333 opt extra-info-digest 93B4C7E9205430DED49FD0BEA30F647BD20DB55D onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBALFhXdB6tJJw5z5kwRhZjYtoysIaWv5GA9mRnz5CaI9g/kH2TZS6/z7p zEXrtsDd6RzSTRXBdCFbXwvt4ftLqtZj+3ezGaerfyFNNgHp37Wsqol+CYVRpam1 VQTjYMUXGplUbgc4801WJKZ+sH7Kq4V2pkJiAFmNsVWsoToQHu6tAgMBAAE= -----END RSA PUBLIC KEY----- signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAO12H34IhpknafbmuKCO7kOmsxhGv86KQffFoFETKMLDduxnfyKH9d6H AK4+Ries93WxGIZFxTc5BSaGcIfpXTY58kYS0o/OoUBR2nbTzlwrjCcmO0+5x7D5 xrbm9y/Mt/cCm98T4XYQXR45FCdVo7TU0xmrsz0YopoxhhSzy/nxAgMBAAE= -----END RSA PUBLIC KEY----- family $0CE3CFB1E9CC47B63EA8869813BF6FAB7D4540C1 $1FD187E8F69A9B74C9202DC16A25B9E7744AB9F6 $74FB5EFA6A46DE4060431D515DC9A790E6AD9A7C $77001D8DA9BF445B0F81AA427A675F570D222E6A $A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB $B6D83EC2D9E18B0A7A33428F8CFA9C536769E209 $D2F37F46182C23AB747787FD657E680B34EAF892 $E0BD57A11F00041A9789577C53A1B784473669E4 $E5E3E9A472EAF7BE9682B86E92305DB4C71048EF opt hidden-service-dir contact tor-admin on formlessnetworking of net reject 0.0.0.0/8:* reject 169.254.0.0/16:* reject 127.0.0.0/8:* reject 192.168.0.0/16:* reject 10.0.0.0/8:* reject 172.16.0.0/12:* reject 199.48.147.45:* accept *:20-23 accept *:43 accept *:53 accept *:79-81 accept *:88 accept *:110 accept *:143 accept *:194 accept *:443 accept *:464-465 accept *:543-544 accept *:563 accept *:587 accept *:706 accept *:749 accept *:873 accept *:902-904 accept *:981 accept *:989-993 accept *:995 accept *:1194 accept *:1220 accept *:1293 accept *:1500 accept *:1723 accept *:1863 accept *:2082-2083 accept *:2086-2087 accept *:2095-2096 accept *:3389 accept *:3690 accept *:4321 accept *:4643 accept *:5050 accept *:5190 accept *:5222-5223 accept *:5900 accept *:6666-6667 accept *:6679 accept *:6697 accept *:8000 accept *:8008 accept *:8080 accept *:8087-8088 accept *:8443 accept *:8888 accept *:9418 accept *:9999 accept *:10000 accept *:19638 reject *:* router-signature -----BEGIN SIGNATURE----- q+N3s+00x5WNzPjU/bOVDBOoZZVGiMExMW+gBmqgzHxJQs3lLshoEEf8eNOuTcfr OTu/sT4pMO106QtmrQfyE1npAVzm75AINnN5tzj0MsfnvusSyUxIjHHAAyb2M9Mg j4QHz7OlqNndBAVvdfQVydSefSKKUV+eGUJpeeA0Pls= -----END SIGNATURE----- descriptor_archive/1/b/1ef75fef564180d8b3f72c6f8635ff0cd855f92c0000644000175000017500000000461611755476662022331 0ustar atagaratagar@type server-descriptor 1.0 router Amunet3 199.48.147.37 443 0 80 platform Tor 0.2.2.34 (git-f0e1ee98af443107) on Linux x86_64 opt protocols Link 1 2 Circuit 1 published 2012-03-01 02:58:38 opt fingerprint E0BD 57A1 1F00 041A 9789 577C 53A1 B784 4736 69E4 uptime 2261941 bandwidth 104857600 209715200 11605015 opt extra-info-digest D4397EC97CD5187EB08A5FFBE6E1A4BC267A389F onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAKuPBv5zCgw2y6qBW+Nv5ra4C74l3kleGoSMamXcs4+uu0ibybi8pgxm bq3RXukufp0ZcH+bHDRnCWuqJ7tXdeyD/mEH5rN87OwK9B8gZ5jGqFG65YlzXC+y hRDvbuZfaEpd9Ka8AnsgKK4k4goq80nkGr+kPG3aAoVjYNoceM7lAgMBAAE= -----END RSA PUBLIC KEY----- signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAMNpCKOPaXVYt4NYsVfGRl0zdknlaf/gsl85HErpJMsFYr8VeBw9e46w 4WF6brxKZqbDlyukBAjv8BOD1KIeg9f9EfVY6UuhZbSrDUxfkEDmMIFs2Fcx67hy 4P+blGoxb+n0XfekSbyPhUzXz6EnTqAbSEYQM1Zke4tvZGRA6wm9AgMBAAE= -----END RSA PUBLIC KEY----- family $0CE3CFB1E9CC47B63EA8869813BF6FAB7D4540C1 $1FD187E8F69A9B74C9202DC16A25B9E7744AB9F6 $74FB5EFA6A46DE4060431D515DC9A790E6AD9A7C $77001D8DA9BF445B0F81AA427A675F570D222E6A $A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB $B6D83EC2D9E18B0A7A33428F8CFA9C536769E209 $D2F37F46182C23AB747787FD657E680B34EAF892 $E5E3E9A472EAF7BE9682B86E92305DB4C71048EF opt hidden-service-dir contact tor-admin on formlessnetworking of net reject 0.0.0.0/8:* reject 169.254.0.0/16:* reject 127.0.0.0/8:* reject 192.168.0.0/16:* reject 10.0.0.0/8:* reject 172.16.0.0/12:* reject 199.48.147.37:* accept *:20-23 accept *:43 accept *:53 accept *:79-81 accept *:88 accept *:110 accept *:143 accept *:194 accept *:443 accept *:464-465 accept *:543-544 accept *:563 accept *:587 accept *:706 accept *:749 accept *:873 accept *:902-904 accept *:981 accept *:989-993 accept *:995 accept *:1194 accept *:1220 accept *:1293 accept *:1500 accept *:1723 accept *:1863 accept *:2082-2083 accept *:2086-2087 accept *:2095-2096 accept *:3389 accept *:3690 accept *:4321 accept *:4643 accept *:5050 accept *:5190 accept *:5222-5223 accept *:5900 accept *:6666-6667 accept *:6679 accept *:6697 accept *:8000 accept *:8008 accept *:8080 accept *:8087-8088 accept *:8443 accept *:8888 accept *:9418 accept *:9999 accept *:10000 accept *:19638 reject *:* router-signature -----BEGIN SIGNATURE----- rvoIDm+hzveUtq7TAXz1fVnz5AZfms+rN1o6Ju+guHvdgCRao7iuHIZD+eR2eBUU +oh+T8KLzUA+llQquGGP3YNBdVOTuRR7lWmvjoalmLgxu5phhdYW6+mM4uhUlHHj qxZ72rvQ2GyMJiAGCHNLCCcX605RiEtbgkMDNG+bgz4= -----END SIGNATURE----- descriptor_archive/0/2/0000755000175000017500000000000011755476646014542 5ustar atagaratagardescriptor_archive/1/b/0000755000175000017500000000000011755476662014621 5ustar atagaratagardescriptor_archive/0/0000755000175000017500000000000011727534307014365 5ustar atagaratagardescriptor_archive/1/0000755000175000017500000000000011727534336014370 5ustar atagaratagardescriptor_archive/0000755000175000017500000000000011727534336014230 5ustar atagaratagarstem-1.7.1/test/unit/descriptor/data/extrainfo_relay_descriptor0000664000175000017500000000245113157571677025640 0ustar atagaratagar00000000000000@type extra-info 1.0 extra-info NINJA B2289C3EAB83ECD6EB916A2F481A02E6B76A0A48 published 2012-05-05 17:03:50 write-history 2012-05-05 17:02:45 (900 s) 1082368,19456,50176,272384,485376,1850368,1132544,1790976,2459648,4091904,6310912,13701120,3209216,3871744,7873536,5440512,7287808,10561536,9979904,11247616,11982848,7590912,10611712,20728832,38534144,6839296,3173376,16678912 read-history 2012-05-05 17:02:45 (900 s) 3309568,9216,41984,27648,123904,2004992,364544,576512,1607680,3808256,4672512,12783616,2938880,2562048,7348224,3574784,6488064,10954752,9359360,4438016,6286336,6438912,4502528,10720256,38165504,1524736,2336768,8186880 dirreq-write-history 2012-05-05 17:02:45 (900 s) 0,0,0,227328,349184,382976,738304,1171456,850944,657408,1675264,987136,702464,1335296,587776,1941504,893952,533504,695296,6828032,6326272,1287168,6310912,10085376,1048576,5372928,894976,8610816 dirreq-read-history 2012-05-05 17:02:45 (900 s) 0,0,0,0,33792,27648,48128,46080,60416,51200,63488,64512,45056,27648,37888,48128,57344,34816,46080,50176,37888,51200,25600,33792,39936,32768,28672,30720 router-signature -----BEGIN SIGNATURE----- K5FSywk7qvw/boA4DQcqkls6Ize5vcBYfhQ8JnOeRQC9+uDxbnpm3qaYN9jZ8myj k0d2aofcVbHr4fPQOSST0LXDrhFl5Fqo5um296zpJGvRUeO6S44U/EfJAGShtqWw 7LZqklu+gVvhMKREpchVqlAwXkWR44VENm24Hs+mT3M= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/compressed_gzip0000664000175000017500000000300713341034346023360 0ustar atagaratagar00000000000000‹•UDz£JÝó¬ŸF-¼éˆ^à…$@XIìpÂ…úúǽ=Ós££c Ne•œ“™'A?Á  mÊGq‚ûFâß°o$…ò8†£Øú"q¤L³–pÙf)AÓ8l?QÑtUäÏ*)Ž÷FÛÄîe ¶ËWƒaÏ]ا–_N¬™ ^Ÿu ¨ç\ leƒ‘@áY°…\äcçì$„èŠðþûP¯ß.9>â»Y0d«4Ԯ矄äAoîe° rd©ôÞ´S;ñ å ’ÕæŒ<´·ÿΆô]ÙwåýÚàŽ+ g_<ézTn?ÁеƒÐk¢pÍ%ÞïÊ]gœäÙÌå–²¬0z^NÅ]f}1Ëû(/³—mn ôɲ6ˆ|㫬5ÎŽÀη²?€öº7Æ5¬.>¼¨y†÷~E¼Æ—E&Ó]Šž§¶­ÛÇPïOä¥C^ÎDÓßOG–Øù&7_E,\ÁßÉ{¾ðröⵦÎáÈ‚~„‡g(ä†(Ê—ÿ·±Ì»µÜÿ— 'xà'™Md¶ÜWS …|¼òP\Ú67‹j/€˜¬úõ.žS×EwÆ5‹÷å‚Äõ}i:8íî!½wÉ;©B‹1å¸O®í2dÅóL3ŒÈæ‚Í?å1Þ4l—üú|› 1"°!Ïìc0äË¡ÀµG mOÊF]~ÔÊryÍ^¿´ƒ1>´Çæ®Cø¿Éð«¶ëÀŒc’øUɱ\÷‹çñ/øÉkàøµ+Èì’ÔÔÚ”§7±5  í4»:' ¼ÈÉŒc“Û•Nã¸Y‚ÜŇҼbÎ}*še>áRiÁkØ@Ú¶]’ÃŨ`eÇx³ÆÝyZ¹Ìù}HÉJ2bwè„…ÐV'ôb`×ñ¾ûOõ®tâåpÛ('‘t HïD%œ fá óßht°Û?0G±ÿfùýjùQºÚrºçNQ¦µOÜ3Z×w§w¶ #ö ½—äØ:ÓÅEP:½95 TN¢„Ân!mz¾¾›†Gë{ â#1ÉuÿèÆ¸ˆÜbçHù¥¹´G³Ýi£•×ì*!ú÷À&ºE³ñ-¼(Óu™mÇ <Ë$[ý IßÁ((Ž”¼#8žãD•F#ÐFh[B4K§ß„A#P5QLÚ™º¥{ÏæšôP„uK[ž¢£²Ûõ´ì–±ý@@Veëõ}ÿ k÷gM“¥‰?"øÜÁÛuî~mµ¾1éçËâw»ñ¹jT›F»è˦™YWó*/ Ô00°¿íW‰ÚDrM²‡M ‹ãè„]TÚrõu<í/™ºN ûZTW×LÁóå§Nþ{¯I‰}įZO¤<“<©°zFŸӾ®TTv± T]PZW¶{ÌÑ’ÐÏ‹5ÅáÉD!$X£ Z#´ºØK w¾ 4%{wº…su2S\·š2JçÔ¨™²Ô¤Ški5ƒ© ,¯¹ ß/–²v¬6¤z¹ÚÀø »9½Û<ÓXòo_*þ¿à]"àstem-1.7.1/test/unit/descriptor/data/bridge_descriptor0000664000175000017500000000067313157571677023705 0ustar atagaratagar00000000000000@type bridge-server-descriptor 1.0 router Unnamed 10.18.111.71 9001 0 0 platform Tor 0.2.0.26-rc (r14597) on Linux i686 opt protocols Link 1 2 Circuit 1 published 2008-05-20 19:45:00 opt fingerprint 4ED5 7358 2B16 ACDA F6E4 2AA0 44A0 38F8 3A7F 6333 uptime 204 bandwidth 3220480 6441984 59408 opt extra-info-digest BB1F13AA431421BEA29B840A2E33BB1C31C2990B opt caches-extra-info reject *:* router-digest 00F1CD29AD308A59A9AB5A88B49ECB46E0F215FD stem-1.7.1/test/unit/descriptor/data/example_descriptor0000664000175000017500000000275413157571677024106 0ustar atagaratagar00000000000000@type server-descriptor 1.0 router caerSidi 71.35.133.197 9001 0 0 platform Tor 0.2.1.30 on Linux x86_64 opt protocols Link 1 2 Circuit 1 published 2012-03-01 17:15:27 opt fingerprint A756 9A83 B570 6AB1 B1A9 CB52 EFF7 D2D3 2E45 53EB uptime 588217 bandwidth 153600 256000 104590 opt extra-info-digest D225B728768D7EA4B5587C13A7A9D22EBBEE6E66 onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAJv5IIWQ+WDWYUdyA/0L8qbIkEVH/cwryZWoIaPAzINfrw1WfNZGtBmg skFtXhOHHqTRN4GPPrZsAIUOQGzQtGb66IQgT4tO/pj+P6QmSCCdTfhvGfgTCsC+ WPi4Fl2qryzTb3QO5r5x7T8OsG2IBUET1bLQzmtbC560SYR49IvVAgMBAAE= -----END RSA PUBLIC KEY----- signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAKwvOXyztVKnuYvpTKt+nS3XIKeO8dVungi8qGoeS+6gkR6lDtGfBTjd uE9UIkdAl9zi8/1Ic2wsUNHE9jiS0VgeupITGZY8YOyMJJ/xtV1cqgiWhq1dUYaq 51TOtUogtAPgXPh4J+V8HbFFIcCzIh3qCO/xXo+DSHhv7SSif1VpAgMBAAE= -----END RSA PUBLIC KEY----- family $0CE3CFB1E9CC47B63EA8869813BF6FAB7D4540C1 $1FD187E8F69A9B74C9202DC16A25B9E7744AB9F6 $74FB5EFA6A46DE4060431D515DC9A790E6AD9A7C $77001D8DA9BF445B0F81AA427A675F570D222E6A $B6D83EC2D9E18B0A7A33428F8CFA9C536769E209 $D2F37F46182C23AB747787FD657E680B34EAF892 $E0BD57A11F00041A9789577C53A1B784473669E4 $E5E3E9A472EAF7BE9682B86E92305DB4C71048EF opt hidden-service-dir contact www.atagar.com/contact reject *:* router-signature -----BEGIN SIGNATURE----- dskLSPz8beUW7bzwDjR6EVNGpyoZde83Ejvau+5F2c6cGnlu91fiZN3suE88iE6e 758b9ldq5eh5mapb8vuuV3uO+0Xsud7IEOqfxdkmk0GKnUX8ouru7DSIUzUL0zqq Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/unparseable/0000775000175000017500000000000013411004021022522 5ustar atagaratagar00000000000000stem-1.7.1/test/unit/descriptor/data/unparseable/new_metrics_type0000664000175000017500000000012513157571677026064 0ustar atagaratagar00000000000000@type non-existant-type 1.0 valid metrics header, but a type we shouldn't recognize stem-1.7.1/test/unit/descriptor/data/unparseable/extrainfo_nonascii_v3_reqs0000664000175000017500000000342413157571677030035 0ustar atagaratagar00000000000000extra-info newton C871C91489886D5E2E94C13EA1A5FDC4B6DC5204 identity-ed25519 -----BEGIN ED25519 CERT----- AQQABjBoAS6cmIIt3t0HjlInkuk+asDf7yAuTXhg20Gdy4uesKH3AQAgBAC6lLwz 7+yzoMFGDKic6l7kOjyGlV3H01GWtErUWy0PIquP5kMVHnrvdhsBwX0zwSA19Bo+ tdKPIKrMV+89QBGX2KSa7RRXqIdnGBnGdodglrvMFPGgO/LYHOb9YogFJgA= -----END ED25519 CERT----- published 2016-03-26 07:47:53 write-history 2016-03-26 05:42:08 (14400 s) 682447872,1737454592,1207077888,1278699520,1157439488,635725824 read-history 2016-03-26 05:42:08 (14400 s) 672482304,1680056320,1198174208,1233503232,1105783808,620540928 dirreq-write-history 2016-03-26 05:42:08 (14400 s) 1960960,46080,2144256,218112,737280,3273728 dirreq-read-history 2016-03-26 05:42:08 (14400 s) 322560,13312,323584,8192,46080,440320 geoip-db-digest 6346E26E2BC96F8511588CE2695E9B0339A75D32 geoip6-db-digest 43CCB43DBC653D8CC16396A882C5F116A6004F0C dirreq-stats-end 2016-03-25 19:53:29 (86400 s) dirreq-v3-ips us=8 dirreq-v3-reqs Sÿ=4026597208,Sÿ=4026597208,Sÿ=4026597208,Sÿ=4026597208,Sÿ=4026597208,Sÿ=4026597208,¥þ=4026591624,6=4026537520,6=4026537520,6=4026537520,us=8 dirreq-v3-resp ok=8,not-enough-sigs=0,unavailable=0,not-found=0,not-modified=0,busy=0 dirreq-v3-direct-dl complete=0,timeout=0,running=0 dirreq-v3-tunneled-dl complete=8,timeout=4,running=0 hidserv-stats-end 2016-03-25 19:53:29 (86400 s) hidserv-rend-relayed-cells 5238 delta_f=2048 epsilon=0.30 bin_size=1024 hidserv-dir-onions-seen -21 delta_f=8 epsilon=0.30 bin_size=8 router-sig-ed25519 TeDQDiRfI/k31H+fxciE8q02/ddm/qIi4H7wpQ9A8wRwWBoFUBdwrjZu+pACiglomOuc/I2uSt0++/pmZulZDg router-signature -----BEGIN SIGNATURE----- OVkz0CKUwWSXjhUMEsYATzcfT+D24QR8w6IjUtb6Mcz5P5CMggqmSFhL6SzUFXWS JwipCWcd2/1NsJ7/JLyXKcG0Ak6FPNP3arweah8EwWkVo7rvscagI+u+Uq2FqtO/ OTNjnriDWTZdSA9FOcQueBZi7Qf7xwA0LEjtadtCjUI= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/unparseable/cached-microdesc-consensus_with_carriage_returns0000664000175000017500000002047713157571677034365 0ustar atagaratagar00000000000000network-status-version 3 microdesc vote-status consensus consensus-method 20 valid-after 2015-09-15 18:00:00 fresh-until 2015-09-15 19:00:00 valid-until 2015-09-15 21:00:00 voting-delay 300 300 client-versions 0.2.4.23,0.2.4.24,0.2.4.25,0.2.4.26,0.2.4.27,0.2.5.8-rc,0.2.5.9-rc,0.2.5.10,0.2.5.11,0.2.5.12,0.2.6.5-rc,0.2.6.6,0.2.6.7,0.2.6.8,0.2.6.9,0.2.6.10,0.2.7.1-alpha,0.2.7.2-alpha server-versions 0.2.4.23,0.2.4.24,0.2.4.25,0.2.4.26,0.2.4.27,0.2.5.8-rc,0.2.5.9-rc,0.2.5.10,0.2.5.11,0.2.5.12,0.2.6.5-rc,0.2.6.6,0.2.6.7,0.2.6.8,0.2.6.9,0.2.6.10,0.2.7.1-alpha,0.2.7.2-alpha known-flags Authority BadExit Exit Fast Guard HSDir Running Stable V2Dir Valid params CircuitPriorityHalflifeMsec=30000 NumDirectoryGuards=3 NumEntryGuards=1 NumNTorsPerTAP=100 Support022HiddenServices=0 UseNTorHandshake=1 UseOptimisticData=1 bwauthpid=1 cbttestfreq=1000 pb_disablepct=0 usecreatefast=0 dir-source tor26 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 86.59.21.38 86.59.21.38 80 443 contact Peter Palfrader vote-digest 7DD2661BBBA3E600CB9D641CFFF27D14D77EDCCE dir-source longclaw 23D15D965BC35114467363C165C4F724B64B4F66 longclaw.riseup.net 199.254.238.52 80 443 contact Riseup Networks - 1nNzekuHGGzBYRzyjfjFEfeisNvxkn4RT vote-digest 2EBB0C5EFEFE51ECE8C630A45F607201491D7E09 dir-source maatuska 49015F787433103580E3B66A1707A00E60F2D15B 171.25.193.9 171.25.193.9 443 80 contact 4096R/23291265 Linus Nordberg vote-digest 7FC1487C8D7C810C6FA8037AE6EC81ACECC408B8 dir-source dannenberg 585769C78764D58426B8B52B6651A5A71137189A dannenberg.torauth.de 193.23.244.244 80 443 contact Andreas Lehner vote-digest 32F82FE133ADAAED686A7360297C56B327994799 dir-source urras 80550987E1D626E3EBA5E5E75A458DE0626D088C 208.83.223.34 208.83.223.34 443 80 contact 4096R/D255D3F5C868227F Jacob Appelbaum vote-digest 86348CCEC68457D5C1777978D1043B211FA44010 dir-source moria1 D586D18309DED4CD6D57C18FDB97EFA96D330566 128.31.0.34 128.31.0.34 9131 9101 contact 1024D/28988BF5 arma mit edu vote-digest 9D18B15C2C039CB0B18B51496F8ACBDA2836DE19 dir-source dizum E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 194.109.206.212 194.109.206.212 80 443 contact 1024R/8D56913D Alex de Joode vote-digest 5473986DC071B8840F9E8C72AED3251B71A8244F dir-source gabelmoo ED03BB616EB2F60BEC80151114BB25CEF515B226 131.188.40.189 131.188.40.189 80 443 contact 4096R/261C5FBE77285F88FB0C343266C8C2D7C5AA446D Sebastian Hahn - 12NbRAjAG5U3LLWETSF7fSTcdaz32Mu5CN vote-digest 6EF25161284DB1AD19411EBF52E96927DFD66F0C dir-source Faravahar EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 154.35.175.225 154.35.175.225 80 443 contact 0x0B47D56D Sina Rabbani (inf0) vote-digest 76466BEF6525FCEE0B9FDDB205B527CBB89FAB17 r PDrelay1 AAFJ5u9xAqrKlpDW6N0pMhJLlKs 2015-09-15 04:53:47 95.215.44.189 8080 0 m iH2s4cVPTmThmmx1phnjDd6oGpHAEP7FDK38AFYRV74 s Fast Running Stable Valid v Tor 0.2.7.2-alpha-dev w Bandwidth=456 r seele AAoQ1DAR6kkoo19hBAX5K0QztNw 2015-09-15 04:43:45 73.15.150.172 9001 0 m LqTE9J4jxtMVm2IPDxmUKYyrzajcjqwYqLkX6JNOEpY s Fast Running Stable Valid v Tor 0.2.6.10 w Bandwidth=15 r TorNinurtaName AA8YrCza5McQugiY3J4h5y4BF9g 2015-09-15 17:06:16 151.236.6.198 443 80 m YxghdOEPO/uPv0N1GZV+6gCuYR5NZPaDseU45R/Yyns s Fast HSDir Running Stable V2Dir Valid v Tor 0.2.6.10 w Bandwidth=1750 r CalyxInstitute14 ABG9JIWtRdmE7EFZyI/AZuXjMA4 2015-09-15 16:12:03 162.247.72.201 443 80 m 6PnpSoAVS1oaJCqs4uk8y706JSZ6rdN8uUM78Oohgo0 s Exit Fast Guard HSDir Running Stable V2Dir Valid v Tor 0.2.6.10 w Bandwidth=11400 directory-footer bandwidth-weights Wbd=0 Wbe=0 Wbg=3944 Wbm=10000 Wdb=10000 Web=10000 Wed=10000 Wee=10000 Weg=10000 Wem=10000 Wgb=10000 Wgd=0 Wgg=6056 Wgm=6056 Wmb=10000 Wmd=0 Wme=0 Wmg=3944 Wmm=10000 directory-signature sha256 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 0B49FD2F55D02B630E7A500E34FD5B6F98FDA9D2 -----BEGIN SIGNATURE----- OYThM95E2Pcj4RWZeND9+llOUlyHLwGtHqF+n92xKTsZdc7ogigEosdqVEB1GaeJ D/GWSESN9VLEiiw5VKBG4UVvZUaFVRUnZSJVS4gNgckH5LD0VUJb0C/tIeBHJ7ea cTOwsb0vHau/W8hkAciEWLfjmAtcWutdT6lljSJ65NWyZynDPHTmtKnsB65kKT+2 p5W9GBxnMUH+Pnt2JkFqyKAsE8GgppMuk4O+AX+BtQgzK4K+pTcKFko6e/NmrBh3 W6AV/fR9/PdSUNYb6+uH/LsUhVePFVbke44u6bBN39LkvxWErQdd3yA91lUdqwz8 zR/uAngvj05Bt1zmH9eG1Kd02dgL4PqNmTI0VKZjWamf4k/xMmecU0xfrHLv52Rw /hync6FsEIrfI+B942sjIEGfv+T6UuIMNoMvkwrby6nw6WL7lAoJJq5pyBYLzlFj xLW6e567FFjqf4siHpGCzWCHoXUU+NmygDSakh0orgGoHdVW6JcKbs0QieUyUu+X -----END SIGNATURE----- directory-signature sha256 23D15D965BC35114467363C165C4F724B64B4F66 3C12B8EE0B3DC3AEDD8CD27CCB02C564281BE765 -----BEGIN SIGNATURE----- doESbeqw4jQagxP8o0Yr6VVUdB2Hnmct4F5sH1pBntPYOqIeT3GbYuFT1TdYr9SG xSpI5+aRcbSQrKryvF+qSgOJS4131YuCmL7zlwhQrQcFtltyRS8UTopubrLbvAJ1 njJt05lM8NWg6NN3uZ4Zy4L/qzn9qZB9l8WbxKZJnxott6+Rp1H19tsl77ENB4GJ Bfhc9C46LOKUfmV5IB0f+0nFOO3PDhbRFEcDw5EEGPx6xLk+EH9YHvP98VIY/YPi vtYN9G5G2PplvqG4hyIhGAYy/hm3ZTHf9eIsKvsBgHadBeFCupA/l6tf36nK94Ts d68QhqPo8QhrjM5FTddGOA== -----END SIGNATURE----- directory-signature sha256 49015F787433103580E3B66A1707A00E60F2D15B 2467B90267EEEDDD614694F16A523B0E6EBF6FAA -----BEGIN SIGNATURE----- NVXfCo512TGvfHr+9XB7nVTDMRurSlwrz/vHfXjSzmJ/6dbIK6PA98lBgvX3i83N 2AZoUcIc5wasYjUleRrP4k2jn5sBArCr3g64FsZ4/RJMLg2pWxEw4xDY2DLjKpyZ BfndyOG5KSEtIszXw0szS0kkTyz7oI76L1vu016Mh35YjaeqK0Vu+P2gxJtKxNyt pLPZwTWVQfjqLAebtXD2Bi5Csty7TSAhsNe9KE5pUB7+DyzvbamuJzyhUFbuOgii Y1nguoknHVgHnrlVGNaF1T3x2QFb3SR5Q4v8p2u1j0zqktkYTZ693gHYzkjWuyGk W/MyhtG1cE7knxu/no+HBw== -----END SIGNATURE----- directory-signature sha256 585769C78764D58426B8B52B6651A5A71137189A 02958C9BE542EEA43130E54FE6634B6E874B196D -----BEGIN SIGNATURE----- XAZPIaIQSTj+8QWZm5dAtiQz2CnEeuM7WMcJikol7CL53n1ewG6k6vYgtFPCJ5uh EDGTM4eojUB0VXNpc+jeOv207Y5z2r6tjAknr1eMxPX65z2BT4WkeBZLnc68RRrM LUAe2IbOVeaqTnQmPAtSejO8xxIkJhfZAssrxdLtvagCpkcBYwAbHiVtYWv/G+r0 pyqVzvxIaEoEFShe77bJqfjOnlLOgcTsxdmU3qcDad/5k8ewXfLVcqR8YsjoNF9D 9xbHyqkBZs0EfcNoDhqWsbuq184zMjlSH0Q3QElK/0ZoQQ1y6vlSicKM9rl8vxmf hRx2hnKyx+yhBT4fpL22ew== -----END SIGNATURE----- directory-signature sha256 80550987E1D626E3EBA5E5E75A458DE0626D088C 7C5D0700D9C266B7D3F93E7C904A62FEC6B30A60 -----BEGIN SIGNATURE----- WwrdpjcjuzxmV+E1ULuuFo98nMiN0iMw6MLAs7+kuOdjbW+ayKzizZvnDPjlMv1p 2cJM7qAwnD6aSxzn1wpc0ecdaVae1cMYqEnP3BxFFY9Xh4dxu8JdlNhB7W3rlIva lptekvZQnRBb2J4ULws4455AP6oNTCO9x3UpGNd5tbc= -----END SIGNATURE----- directory-signature sha256 D586D18309DED4CD6D57C18FDB97EFA96D330566 F1E67374A96F51A0BB4C8C24748200885EFF8645 -----BEGIN SIGNATURE----- fgn1RZSa2xtYrOiG9YUtQdPl9RMZ8YQsxImg7D53AoXrctC8Ul48CNnIz/JWdIts qcczwUtSSixuEDD5gqBcFn0Fi7S1E2F8VcmCUAh7AMBtVSn5vUKkmaQcSy+zG0N+ ospb0wQYbJ2DcsVTqL9z4TLpNB09BLN0kOzS64MJAqH9thE/1GHGNeXRFHupYgTO PERdyFvFEAmS9XnSxSRitgf6ptG5sAlFbzQrueKmnlrVe51gJBTEZNgVb1wFTjEw 7nHTvTz9c0AQfgW5if1nIh2RdQ9AeOo3FxCbFMeT53QzHiEZWSDsCZebE/EHf/lz od6P497tWLK6TIxctbWAXw== -----END SIGNATURE----- directory-signature sha256 E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 292252D59020B903943C025D96134575E1245ADF -----BEGIN SIGNATURE----- LzZynAMcx4EWSAqaXRaL2iHCET9T+T8e15kDiPyefxTc5U00Ko6ASKJPpmaHHHAI SsYQm54TauFX7AOb7Q+9Fx8ujxA0AR85DglLXftAicM27L48E4d9E3qFtzi+0ZHs At0Wp9odW7ZeFcBNHWFGB/KfqOwHYkukRvqR3vBlKG8nvQ7cC+9o9aXhl4CLoA8X ViigiEINXCC1BFibg/XA/XZqDB7uxoeazririKp0qZTTZPp8sLSQBnrSvA3OL1I5 c0m4xogooiG+YhGBC7N+MR+hDA9nyV+njVABpy/89/6Zy+y4iydqqO0qSRWXio9W 3T36ECUvEQ9l+FONnfk0cQ== -----END SIGNATURE----- directory-signature sha256 ED03BB616EB2F60BEC80151114BB25CEF515B226 5E04DFE1E5E0852F56E524B7C81D1E5FAFDBA650 -----BEGIN SIGNATURE----- UtcSi7Qb7CijqBhpMsFeqlhRxMTOGqldmdiDCp8ZLJFOCQGIHA9m9c62mlTIleDH iz/LdCn7RdGm7VoX7+jd3FfU86dajnyREDcwvvTHZ8eIUx6Bz+Q7zmv6yRBctmNL hqYcK0WHxmELYxwICljLPeu6QOaRE+4Ku1YbNoEFL/YJ4GmgAPODxxy35N+t3uRr MzWK7N+Ssdo0cRvz47cMBZqRQOKzn3a5/KMnRcBmZbhmJbhi5O9C3tZVA+XFa3fF jRGbtUir/OE23WmykdXKGmsymXX3b/io+w6UQjBUVzGHQtJLszMTKNE24eUnVOFD 9Yc8aj5LgGkmJbNxyiF0mQ== -----END SIGNATURE----- directory-signature sha256 EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 F22B7C6FB4E6DA30A3C63D265A1D4AB374CB34E3 -----BEGIN SIGNATURE----- uh/7AVwA+T8EWm9GgQxYzPPBibvb2/FP5Ny6p9x95oJRWjWeKEM77hnojJ540N6u IyyIJTUB5JgUrsN2BXEnyUqZu0+OWB9hYxFIzVjwUxtuL2uaPeBfXqv5iJNEqG9w Gl1ubnFUbVZXM83e61ClgwaswhvVPzfgirqpmD+L9m/DaZj+EmzZtoquqaBNtv1g qU/yZgFG4AFApjvSaP6kkttZ8EYTVtGMq6muIxLeBDlVRP2dmC+R5FwGmsbj92is uxaCO4raz5BM6yyDS44vzJwFePOyQhiYNV52g8dod/xtrhZOlWQtCbX3jXxv4ofV nfX9MJA9VJ5WbLSpwU1p/w== -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/unparseable/vote0000664000175000017500000001077413157571677023474 0ustar atagaratagar00000000000000network-status-version 3 vote-status vote consensus-methods 1 2 3 4 5 6 7 8 9 10 11 12 published 2012-07-11 23:50:01 valid-after 2012-07-12 00:00:00 fresh-until 2012-07-12 01:00:00 valid-until 2012-07-12 03:00:00 voting-delay 300 300 known-flags Authority BadExit Exit Fast Guard HSDir Running Stable V2Dir Valid params CircuitPriorityHalflifeMsec=30000 bwauthpid=1 dir-source turtles 27B6B5996C426270A5C95488AA5BCEB6BCC86956 76.73.17.194 76.73.17.194 9030 9090 contact Mike Perry dir-key-certificate-version 3 fingerprint 27B6B5996C426270A5C95488AA5BCEB6BCC86956 dir-key-published 2011-11-28 21:51:04 dir-key-expires 2012-11-28 21:51:04 dir-identity-key -----BEGIN RSA PUBLIC KEY----- MIIBigKCAYEA6uSmsoxj2MiJ3qyZq0qYXlRoG8o82SNqg+22m+t1c7MlQOZWPJYn XeMcBCt8xrTeIt2ZI+Q/Kt2QJSeD9WZRevTKk/kn5Tg2+xXPogalUU47y5tUohGz +Q8+CxtRSXpDxBHL2P8rLHvGrI69wbNHGoQkce/7gJy9vw5Ie2qzbyXk1NG6V8Fb pr6A885vHo6TbhUnolz2Wqt/kN+UorjLkN2H3fV+iGcQFv42SyHYGDLa0WwL3PJJ r/veu36S3VaHBrfhutfioi+d3d4Ya0bKwiWi5Lm2CHuuRTgMpHLU9vlci8Hunuxq HsULe2oMsr4VEic7sW5SPC5Obpx6hStHdNv1GxoSEm3/vIuPM8pINpU5ZYAyH9yO Ef22ZHeiVMMKmpV9TtFyiFqvlI6GpQn3mNbsQqF1y3XCA3Q4vlRAkpgJVUSvTxFP 2bNDobOyVCpCM/rwxU1+RCNY5MFJ/+oktUY+0ydvTen3gFdZdgNqCYjKPLfBNm9m RGL7jZunMUNvAgMBAAE= -----END RSA PUBLIC KEY----- dir-signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAJ5itcJRYNEM3Qf1OVWLRkwjqf84oXPc2ZusaJ5zOe7TVvBMra9GNyc0 NM9y6zVkHCAePAjr4KbW/8P1olA6FUE2LV9bozaU1jFf6K8B2OELKs5FUEW+n+ic GM0x6MhngyXonWOcKt5Gj+mAu5lrno9tpNbPkz2Utr/Pi0nsDhWlAgMBAAE= -----END RSA PUBLIC KEY----- dir-key-crosscert -----BEGIN ID SIGNATURE----- RHYImGTwg36wmEdAn7qaRg2sAfql7ZCtPIL/O3lU5OIdXXp0tNn/K00Bamqohjk+ Tz4FKsKXGDlbGv67PQcZPOK6NF0GRkNh4pk89prrDO4XwtEn7rkHHdBH6/qQ7IRG GdDZHtZ1a69oFZvPWD3hUaB50xeIe7GoKdKIfdNNJ+8= -----END ID SIGNATURE----- dir-key-certification -----BEGIN SIGNATURE----- fasWOGyUZ3iMCYpDfJ+0JcMiTH25sXPWzvlHorEOyOMbaMqRYpZU4GHzt1jLgdl6 AAoR6KdamsLg5VE8xzst48a4UFuzHFlklZ5O8om2rcvDd5DhSnWWYZnYJecqB+bo dNisPmaIVSAWb29U8BpNRj4GMC9KAgGYUj8aE/KtutAeEekFfFEHTfWZ2fFp4j3m 9rY8FWraqyiF+Emq1T8pAAgMQ+79R3oZxq0TXS42Z4Anhms735ccauKhI3pDKjbl tD5vAzIHOyjAOXj7a6jY/GrnaBNuJ4qe/4Hf9UmzK/jKKwG95BPJtPTT4LoFwEB0 KG2OUeQUNoCck4nDpsZwFqPlrWCHcHfTV2iDYFV1HQWDTtZz/qf+GtB8NXsq+I1w brADmvReM2BD6p/13h0QURCI5hq7ZYlIKcKrBa0jn1d9cduULl7vgKsRCJDls/ID emBZ6pUxMpBmV0v+PrA3v9w4DlE7GHAq61FF/zju2kpqj6MInbEvI/E+e438sWsL -----END SIGNATURE----- r sumkledi ABPSI4nNUNC3hKPkBhyzHozozrU B5n4BiALAF8B5AqafxohyYiuj7E 2012-07-11 04:22:53 178.218.213.229 80 0 s Exit Valid opt v Tor 0.2.2.35 w Bandwidth=51 Measured=36 p accept 80,443 m 8,9,10,11,12 sha256=g1vx9si329muxV3tquWIXXySNOIwRGMeAESKs/v4DWs r Unnamed AEXri4INxBAZeyi0wvJZoC58nZs csTseFzwBV0RLsEdlyxDw6jTZ1o 2012-07-11 10:47:26 79.139.135.90 443 22 s Fast HSDir Running V2Dir Valid opt v Tor 0.2.2.37 w Bandwidth=92 Measured=15 p reject 1-65535 m 8,9,10,11,12 sha256=iZfmvEGdBG/qc9KYZUh4JsWEHbn9Bw2jy5i0AtCoRB0 r default AFU4pMWKyq+eTPuBO0D9W179kQQ OZzEaq9N5+VX5yxzi051zqyEcPk 2012-07-11 08:17:21 2.90.115.167 443 9030 s V2Dir Valid opt v Tor 0.2.3.15-alpha w Bandwidth=53 p reject 1-65535 m 8,9,10,11,12 sha256=m/RouK3TqoaYBBHCxgmzMPuGGCIEr0ufSTB1i85zicM r satoshi11 AFzRyEo3Ibdko7vl4rReoU3BDfM rWaYhhU9Kym4sXAVe+uE99VGpJs 2012-07-11 08:10:01 80.218.153.44 443 9030 s V2Dir Valid opt v Tor 0.2.2.35 w Bandwidth=196 Measured=113 p reject 1-65535 m 8,9,10,11,12 sha256=yxuOPz7IraIzzmU/qeZRJHOJrutNmvPwDwj2AmsHZSI r JapanAnon AGw/p8P246zRPQ3ZsQx9+pM8I3s FpQ4fP9FE2j4AnpZTcPiUbaIjwQ 2012-07-11 15:55:42 220.0.231.71 443 9030 s Exit V2Dir Valid opt v Tor 0.2.2.37 w Bandwidth=41 Measured=5 p accept 110,143,443,706,993,995,1863,5050,5190,5222-5223,6660-6669,6697,7000-7001,8300,8888 m 8,9,10,11,12 sha256=fdV6McsFl7ZaX8YJjRCchKa7B7ImTr6++AE3e7zCkK8 r ANONIONROUTER AHhuQ8zFQJdT8l42Axxc6m6kNwI UUUhUJVXZ5b+8Lizh1ghVkUTGo0 2012-07-11 20:13:16 93.128.114.184 24051 24052 s Fast Running V2Dir Valid opt v Tor 0.2.2.37 w Bandwidth=196 Measured=100 p reject 1-65535 m 8,9,10,11,12 sha256=ooi27oMS4TBXes4FY4JyULgZYZcFzAyvB1JicaQ8zxs r pornosteffi AJrkZLNAIMRi7J3Q5os1iBJTM38 tV2vC76eZNwVpSFO8+r9lCqJSVw 2012-07-11 11:00:29 88.78.83.210 443 0 s Fast Running Valid opt v Tor 0.2.2.35 w Bandwidth=32 Measured=14 p reject 1-65535 m 8,9,10,11,12 sha256=JiARdiiTbey4aLkt4x1DUgEU3oaD2oDB2dtP7SGl3EU directory-footer directory-signature 27B6B5996C426270A5C95488AA5BCEB6BCC86956 D5C30C15BB3F1DA27669C2D88439939E8F418FCF -----BEGIN SIGNATURE----- fskXN84wB3mXfo+yKGSt0AcDaaPuU3NwMR3ROxWgLN0KjAaVi2eV9PkPCsQkcgw3 JZ/1HL9sHyZfo6bwaC6YSM9PNiiY6L7rnGpS7UkHiFI+M96VCMorvjm5YPs3FioJ DnN5aFtYKiTc19qIC7Nmo+afPdDEf0MlJvEOP5EWl3w= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/unparseable/tiny.png0000664000175000017500000000027413157571677024257 0ustar atagaratagar00000000000000‰PNG  IHDR PXêsRGB®Îé pHYs  šœtIMEÜ)ô¿atEXtCommentCreated with GIMPW)IDATÓc``````øÏÀðŸ“ÍÄ€0B2Âô¡± èf²vÿ¡qƒIEND®B`‚stem-1.7.1/test/unit/descriptor/data/unparseable/riddle0000664000175000017500000000106713157571677023755 0ustar atagaratagar00000000000000Riddle by Damian Johnson (May, 2009) Curtains raise, they take the stage, mute actors that never age. The clouds are cotton, the floor is pine, the souls bound up in fine twine. Crowds will cheer, the players dance, flowing scene to scene as in a trance. The world is perfect, they never whine, for there's not a single will, save mine. The play has ended, we take a bow, but the viewers are the actors now. When freed from decision, of thought and blame, we'll walk to another drum just the same. answer: http://www.atagar.com/riddles/answer10.php stem-1.7.1/test/unit/descriptor/data/cached-consensus0000664000175000017500000000637713157571677023447 0ustar atagaratagar00000000000000network-status-version 3 vote-status consensus consensus-method 26 valid-after 2017-05-25 04:46:30 fresh-until 2017-05-25 04:46:40 valid-until 2017-05-25 04:46:50 voting-delay 2 2 client-versions server-versions known-flags Authority Exit Fast Guard HSDir NoEdConsensus Running Stable V2Dir Valid recommended-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 LinkAuth=1 Microdesc=1-2 Relay=2 recommended-relay-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 LinkAuth=1 Microdesc=1-2 Relay=2 required-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 LinkAuth=1 Microdesc=1-2 Relay=2 required-relay-protocols Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=3-4 LinkAuth=1 Microdesc=1 Relay=1-2 dir-source test001a 596CD48D61FDA4E868F4AA10FF559917BE3B1A35 127.0.0.1 127.0.0.1 7001 5001 contact auth1@test.test vote-digest 2E7177224BBA39B505F7608FF376C07884CF926F dir-source test000a BCB380A633592C218757BEE11E630511A485658A 127.0.0.1 127.0.0.1 7000 5000 contact auth0@test.test vote-digest 5DD41617166FFB82882A117EEFDA0353A2794DC5 r test002r NIIl+DyFR5ay3WNk5lyxibM71pY UzQp+EE8G0YCKtNlZVy+3h5tv0Q 2017-05-25 04:46:11 127.0.0.1 5002 7002 s Exit Fast Guard HSDir Running Stable V2Dir Valid v Tor 0.3.0.7 pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-4 LinkAuth=1,3 Microdesc=1-2 Relay=1-2 w Bandwidth=0 Unmeasured=1 p accept 1-65535 r test001a qgzRpIKSW809FnL4tntRtWgOiwo x8yR5mi/DBbLg46qwGQ96Dno+nc 2017-05-25 04:46:12 127.0.0.1 5001 7001 s Authority Exit Fast Guard HSDir Running V2Dir Valid v Tor 0.3.0.7 pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-4 LinkAuth=1,3 Microdesc=1-2 Relay=1-2 w Bandwidth=0 Unmeasured=1 p reject 1-65535 r test000a 3nJC+LvtNmx6kw23x1WE90pyIj4 Hg3NyPqDZoRQN8hVI5Vi6B+pofw 2017-05-25 04:46:12 127.0.0.1 5000 7000 s Authority Exit Fast Guard HSDir Running Stable V2Dir Valid v Tor 0.3.0.7 pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-4 LinkAuth=1,3 Microdesc=1-2 Relay=1-2 w Bandwidth=0 Unmeasured=1 p reject 1-65535 directory-footer bandwidth-weights Wbd=3333 Wbe=0 Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=3333 Wee=10000 Weg=3333 Wem=10000 Wgb=10000 Wgd=3333 Wgg=10000 Wgm=10000 Wmb=10000 Wmd=3333 Wme=0 Wmg=0 Wmm=10000 directory-signature 596CD48D61FDA4E868F4AA10FF559917BE3B1A35 9FBF54D6A62364320308A615BF4CF6B27B254FAD -----BEGIN SIGNATURE----- Ho0rLojfLHs9cSPFxe6znuGuFU8BvRr6gnH1gULTjUZO0NSQvo5N628KFeAsq+pT ElieQeV6UfwnYN1U2tomhBYv3+/p1xBxYS5oTDAITxLUYvH4pLYz09VutwFlFFtU r/satajuOMST0M3wCCBC4Ru5o5FSklwJTPJ/tWRXDCEHv/N5ZUUkpnNdn+7tFSZ9 eFrPxPcQvB05BESo7C4/+ZnZVO/wduObSYu04eWwTEog2gkSWmsztKoXpx1QGrtG sNL22Ws9ySGDO/ykFFyxkcuyB5A8oPyedR7DrJUfCUYyB8o+XLNwODkCFxlmtFOj ci356fosgLiM1sVqCUkNdA== -----END SIGNATURE----- directory-signature BCB380A633592C218757BEE11E630511A485658A 9CA027E05B0CE1500D90DA13FFDA8EDDCD40A734 -----BEGIN SIGNATURE----- uiAt8Ir27pYFX5fNKiVZDoa6ELVEtg/E3YeYHAnlSSRzpacLMMTN/HhF//Zvv8Zj FKT95v77xKvE6b8s7JjB3ep6coiW4tkLqjDiONG6iDRKBmy6D+RZgf1NMxl3gWaZ ShINORJMW9nglnBbysP7egPiX49w1igVZQLM1C2ppphK6uO5EGcK6nDJF4LVDJ7B Fvt2yhY+gsiG3oSrhsP0snQnFfvEeUFO/r2gRVJ1FoMXUttaOCtmj268xS08eZ0m MS+u6gHEM1dYkwpA+LzE9G4akPRhvRjMDaF0RMuLQ7pY5v44uE5OX5n/GKWRgzVZ DH+ubl6BuqpQxYQXaHZ5iw== -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/descriptor_archive.tar.bz20000664000175000017500000000643013157571677025350 0ustar atagaratagar00000000000000BZh91AY&SY”öšò Ø…èd{ÿòÿÿðÿÿÿð€` Žš•"­¶vî3M6„jˆÄÐÉ£ÔÈÄÓF‘´hÁL4dÊ(5Iê6¢m1OF†O@˜É“DbzM#@dÄÐdÉ„Ó d4€Ó&†MŠõSjž žSA¦LO4=M¨=M00ƒÇdÄÐdÉ„Ó d4€Ó&†M†ÕÐÔÂi¦ 4ÓГÔÚ yO&¦'¡²KÍ~‘Ü,Frˆ?òL‘Ii"4ŽIi\d¹HÔ’Ò@NŠ&9·$×µñ$£AzI‰Γ’XoôÆ%û»óáÙ¾Tef:Œ…æBÄr ˆF£)àDF4˜`ä0”xÔ8Œˆañ£É† HA@kûR{ê1}#o¯×ëšê,ªYŽOöˆþLhJ!„Ç%óÿÒ\I,i,Ed§yì;ÉÖåK•¢@•±§¬ø¢ø"~Ä‘$cXÆ0û/Üaª¡]fxトªÎÛ©…Äðué6¶ÊêhlÒ$m?qɈ°I‡ 0üfñãÌÑ”Ôd=É!¢@•{x?‰¿ï߇^üý^|òþsíáÝüøäýä»g‚@Žã؆0ba"å9ÑAÐi&@ã8Îã HüœG!æs޲¤NXv5!£ †!¨ngÉRObNzbÎÁ*;­å”òÅýú¯ûmòŸ_†¢Ó.ž’rI`\4à0j3aô)F/ăˆˆ|$ÄÁ()IF²R18œ˜ù—þ÷[’DÊD’¸bd§Û¡_I ¬Ž+”f(ŸƒLƒæW—¢‘­ž¡Óž.#‰0•+Oæd†££‘[_êò#´Åaö+%¶ÊLMçîŠn®}±õô5†nW_­¸¼XFŠÖcy*תø ç­Ã>« â"Ü’i2„㈠'$¬¯\#`ĺ‘uNyYÝˤiQR/LDN’Lµ%2P*)u餤„D74ÙKÏ+VÒñ…+!XâJS7[V/|™Gm÷Ûϯú¿e4Wf!•™H4‘šQjœÒND“Ž¡ƒ †a^s-Pœ° aªÂqÆ*ƨ±G§RJH†¢uüãEdi夤¥†xÏ9§£_׳Ê|uÕ½z6M±ÍAÄœ4œq!7®†ÄêF5‰5aœÌFQÏ„íPZ‡g"Ssá\­„jG±H¥µ´‚ñ œl)Ç Pä 0hVdŒÇ‚SÝ>,qx冂ڷ_7Æ»¸ ÁÄyL ŒŸ¤ð8†NßsHN>}zSŠˆÍ#EªB&8”€ò5²B2¤Ë!8åÀk”šáÕô¯ÙLGJ;GÜzà†²eh«"õTŽ|dl#.ß›WPôHá ër›ˆšäæüÌŸ¶]Q¨z­smýOulnŒøEZIi#Æl•&l4’¸®QЦ'ž¢¢†F6RªQVçFôðÅ…»Xµ5PXô²Ž/$šG³Äˆµ1&”§Œ&ÔŽJÈËË\ÔRŽe÷ÑÃB<û‘ƒ¾ýqûw÷ðwsôûì¢ó7Š7ôa‚P-8Gš f³WqKœ@Ü?jÅ)|éÅcä¤y»µˆ›ÏûåÅ…­T4oî%QˆÇБóÃ_»fŸ¯.îÿÄlI[½"[ÊÉ6.#¬d¾L'Xó cç"#a¢FÒJfxÛï›wäâýµY9…‰4¨"—ëeôç˜4#.NŒ/x¦;<9&J¾:ŒE\ðJ>6QÛ–hîõyîç¿·éÕ†þMÓ÷çj1é]&OrŸã¨Î2Sã9Å yÔk5¡Î%:Æ‘ÜѲ÷ÛôÚZLN%ðË«x–úýž]É}<{@ë½´[²¤Î¹d!ÊW@€ox`a ŽQJN [²‹08z…9E‚Á%öß k‹r_—šÍ4÷}æÛ=Öyüêh†¦ÁH‡u© 7ì܇X›£íÆünBì©1±C¡kÇ4ÜHnÔ_SãåéØë&àOäBð9á "Ʊ\Ñ¡ù«š3‡~vö­>÷3䑲:õÈé4oŸWïRD)ï·Tß ãeL™ªŸÂùiLÅ0!T,‚ú­´áߥ¢t½ix¨Æ}YýQ.ëÐpZ§ÓÓÜjH)Bd ®î™_~É×±MP0•‰M”7V)˜†Hëç_J5«… ›|üS§~R í»®ÅÆ––ßyÛ{.ö¸¤r»ºc»wÚ^· ¥¼ >ØYcÈoï³Qæ“Ãlª{JѳØÁâ±Þ¨ÛsðµæzÐ¥ï:yžÒ©OM±ÜØB*Û>æû8*æFu}ó·1Áå°áL‚!§žêaé;Kò­<ü vÆ)­ª ü[i¬Í™w¹a?då*N¹‰fy°z»>ô(ãí#üùï↶å< GDZzw~¸–­ŽŒA•´&Ñ'DyãtôøLþîû|µ•Êí]^²XÍt—‡óõ½›fOÃve–ð,"+H‹äM#«V>ÖS®Fç‚¢™GØéGZÅ(‘S² »²o;9xÒJd—Ý%Æ’ü¤¬+:½ÇÎþºóù䓯mój:”ZúQö&6Á­ÌTßͯ_…ï"¯‚¦Óeǯ8äç©j€°éê@„ªfT–ùx¢0Kä D‘I)±Äžk«}|ÔE»¸»ØhÌ%ˆP>ÉOøòΊބ‘ 3ŒØqh`XÐÀDX²áÒJií«wj³]Bíµi‚± ½v›ošˆ]Ä,@„»ÊÆ;N¤kŒQæQ/©¥Ó5[N.'ˆæ8éáESåO¥×ÃE x ;ñNaG„ÜЎůŒ:ï{œAܱgÑòµd*“•:ˆ® ˆcÿ Èn`ÇLµ'c£•ÿ£Ø¤š+]•û8#=,ó…¥q„„y§ëRáVEOUب‰Ã|¤Hïó8F'‘¸´Ølí<òp*Äâ¢/‡ /£- ¨ù–O³’U ¹ÃhÆ+7¶î†•f\ ¨8N!5ÍkK~lÒÞÜâØRü:°P&NWÃñZ‡Ï—]Ý#j¿ ®'öû¹gGoéñ¿l=¹¹ ûô=(Ì=nÁ涤jŒ¡q><â\ðÃk¤Ž¹{fÈéÝì÷>½½\ßèï·RåhI¢œaáa@ˆÄB°Ð|‰ú\<Ì´.(æ»ý6sG—ÏÕ{KnA©,HÊZѨóÏÝðòãíÙ|É,üjIVf.IvvÎ%óy:c*‡3‘ ½f97é­4Yðkëö‘ÄÀ(…¡=zPD° „‚ÄE²qDe(“ F!+©cǤ8y‹‚2WËWb騷øXr¤•©.L¨qð/6Ì4Ö1%onŽƒ7|ã2Ÿá׿Ã}Óye~Cï.=žUYœ_óÉžqDŠŠBÿˆŠ%žÎ¾±ŽL*É›E/é"/„Èñ÷)bVàÛ;ëì›+ƒ „ݱof·ÓŒâ,úcÅ®»œ¬³&g;p^aìjd£p¼‘ hFë%§ä*››¦ØÌb¤èXéË’Ís3XÏ'Xº+ù9e} ú _ñw$S… Oi¯ stem-1.7.1/test/unit/descriptor/data/server_descriptor_with_ed255190000664000175000017500000000542413157571677026067 0ustar atagaratagar00000000000000@type server-descriptor 1.0 router destiny 94.242.246.23 9001 0 443 identity-ed25519 -----BEGIN ED25519 CERT----- AQQABhtZAaW2GoBED1IjY3A6f6GNqBEl5A83fD2Za9upGke51JGqAQAgBABnprVR ptIr43bWPo2fIzo3uOywfoMrryprpbm4HhCkZMaO064LP+1KNuLvlc8sGG8lTjx1 g4k3ELuWYgHYWU5rAia7nl4gUfBZOEfHAfKES7l3d63dBEjEX98Ljhdp2w4= -----END ED25519 CERT----- master-key-ed25519 Z6a1UabSK+N21j6NnyM6N7jssH6DK68qa6W5uB4QpGQ or-address [2a01:608:ffff:ff07::1:23]:9003 platform Tor 0.2.7.2-alpha-dev on Linux protocols Link 1 2 Circuit 1 published 2015-08-22 15:21:45 fingerprint F65E 0196 C94D FFF4 8AFB F2F5 F9E3 E19A AE58 3FD0 uptime 1362680 bandwidth 149715200 1048576000 51867731 extra-info-digest 44E9B679AF0B4EB09296985BAF4066AE9CA5BB93 r+roMxhsjd1GPpn5knQoBvtE9Rhsv8zQHCqiYL6u2CA onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAKpPOeBPFBZhH32k0CmIVsXMi4mbbkpEAYpZD0Z3/zLc9k05qAvhE55h +LXqG6C6k23JnR7H1a4EtFU0UQVWxUa4xUL9pi/0tj3Zsu842Z18K3sL8hYWDw6x b6afVdSKIcY6guG5fevmobUd/6437oSwM7IeXrWy28s0PtWKHhQzAgMBAAE= -----END RSA PUBLIC KEY----- signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAOUS7xm+1d/FAk7VHx2SaYzjYoGpNaCHHWXlmDz2+iWEqcDRjjnVFekV sfAPysNnB0a/lHdrqzyKjCkzAoeut5Ts3bj6eMrF3psFian2IqdlqsFaAcBov7fo J6ipwr8lP72LOMHlB2AwP3BEWtHZX7nmARV7ekbPs21R06lEhzLLAgMBAAE= -----END RSA PUBLIC KEY----- onion-key-crosscert -----BEGIN CROSSCERT----- iW8BqwH5VKqZaiMgPcuHIQFpiQnRsd2b1zc+PXVN3AFT0cQx6J4rZhIdxiqHeNqj fVEoi4+iHkbksGABZKlB/x7Kv2Kvbj3ZH46m22KEASkRL+i9EhCYdf3Ju7czIi/7 U/jQTwhn7+o8LCLsLhw3aV/v/sXEtbxePhMbCMHI7hE= -----END CROSSCERT----- ntor-onion-key-crosscert 0 -----BEGIN ED25519 CERT----- AQoABhtwAWemtVGm0ivjdtY+jZ8jOje47LB+gyuvKmulubgeEKRkAHj4IPqm+osx vbKfvRHeZ0uaghFPZr76UVPYwuK4N+VcW75yq2vuFSsFTCJqamPB3PIdSz6rbx4U 4F3iroztLAQ= -----END ED25519 CERT----- family $379FB450010D17078B3766C2273303C358C3A442 $3EB46C1D8D8B1C0BBCB6E4F08301EF68B7F5308D $B0279A521375F3CB2AE210BDBFC645FDD2E1973A $EC116BCB80565A408CE67F8EC3FE3B0B02C3A065 hidden-service-dir contact 0x02225522 Frenn vun der Enn (FVDE) ntor-onion-key JCj8BOqk0Khfp1hfoJaDbSTzNgeA/u2pSAXnaR3vhl0= reject 0.0.0.0/8:* reject 169.254.0.0/16:* reject 127.0.0.0/8:* reject 192.168.0.0/16:* reject 10.0.0.0/8:* reject 172.16.0.0/12:* reject 94.242.246.23:* reject *:25 reject *:587 reject *:465 reject 176.67.160.187:* reject 185.35.77.160:* reject 185.35.77.250:* reject *:10000 reject *:14464 reject 94.100.180.202:* reject 217.69.139.215:* reject 217.69.140.233:* accept *:* ipv6-policy reject 25,465,587,10000,14464 router-sig-ed25519 w+cKNZTlL7vz/4WgYdFUblzJy3VdTw0mfFK4N3SPFCt20fNKt9SgiZ5V/2ai3kgGsc6oCsyUesSiYtPcTXMLCw router-signature -----BEGIN SIGNATURE----- y72z1dZOYxVQVLRMvEJOn9lOFxBsjojpwiYxw+3vWFHnhkOdGqolxJ6gTLhiIXNu ckBPqxjbpFbmt6qgk0oeivwyLo9o4nZT737d3tx1EuBmxo+gqzNtukXWzJzZFIj5 xE0eo9e/zKPSCF/LK6zv0FSefdBpnEkYYFuGN0BCrZo= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/hidden_service_stealth_auth0000664000175000017500000000636113157571677025733 0ustar atagaratagar00000000000000@type hidden-service-descriptor 1.0 rendezvous-service-descriptor ubf3xeibzlfil6s4larq6y5peup2z3oj version 2 permanent-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAL1f7GdEObH+xMhf4GsaTCtfVH7ZpanegC65jn0/Kz9wlkpF+SQdIvTu Ha2iZB34GDT2PvTy98chSxz+E3Kv2h45pQWbrwLN3Fj4qa+klclIXWcIa7GT4Pct YZzAvHIh9t9EAe6ejYu8I+h4yL6QNAA2bYOi1d66+qCNCAFBgAqpAgMBAAE= -----END RSA PUBLIC KEY----- secret-id-part jczvydhzetbpdiylj3d5nsnjvaigs7xm publication-time 2015-02-24 20:00:00 protocol-versions 2,3 introduction-points -----BEGIN MESSAGE----- AgEdbps604RR6lqeyoZBzOb6+HvlL2cDt63w8vBtyRaLirq5ZD5GDnr+R0ePj71C nC7qmRWuwBmzSdSd0lOTaSApBvIifbJksHUeT/rq03dpnnRHdHSVqSvig6bukcWJ LgJmrRd3ES13LXVHenD3C6AZMHuL9TG+MjLO2PIHu0mFO18aAHVnWY32Dmt144IY c2eTVZbsKobjjwCYvDf0PBZI+B6H0PZWkDX/ykYjArpLDwydeZyp+Zwj4+k0+nRr RPlzbHYoBY9pFYDUXDXWdL+vTsgFTG0EngLGlgUWSY5U1T1Db5HfOqc7hbqklgs/ ULG8NUY1k41Wb+dleJI28/+ZOM9zOpHcegNx4Cn8UGbw/Yv3Tj+yki+TMeOtJyhK PQP8NWq8zThiVhBrfpmVjMYkNeVNyVNoxRwS6rxCQjoLWSJit2Mpf57zY1AOvT1S EqqFbsX+slD2Uk67imALh4pMtjX29VLIujpum3drLhoTHDszBRhIH61A2eAZqdJy 7JkJd1x/8x7U0l8xNWhnj/bhUHdt3OrCvlN+n8x6BwmMNoLF8JIsskTuGHOaAKSQ WK3z0rHjgIrEjkQeuQtfmptiIgRB9LnNr+YahRnRR6XIOJGaIoVLVM2Uo2RG4MS1 2KC3DRJ87WdMv2yNWha3w+lWt/mOALahYrvuNMU8wEuNXSi5yCo1OKirv+d5viGe hAgVZjRymBQF+vd30zMdOG9qXNoQFUN49JfS8z5FjWmdHRt2MHlqD2isxoeabERY T4Q50fFH8XHkRRomKBEbCwy/4t2DiqcTOSLGOSbTtf7qlUACp2bRth/g0ySAW8X/ CaWVm53z1vdgF2+t6j1CnuIqf0dUygZ07HEAHgu3rMW0YTk04QkvR3jiKAKijvGH 3YcMJz1aJ7psWSsgiwn8a8Cs4fAcLNJcdTrnyxhQI4PMST/QLfp8nPYrhKEeifTc vYkC4CtGuEFkWyRifIGbeD7FcjkL1zqVNu31vgo3EIVbHzylERgpgTIYBRv7aV7W X7XAbrrgXL0zgpI0orOyPkr2KRs6CcoEqcc2MLyB6gJ5fYAm69Ige+6gWtRT6qvZ tJXagfKZivLj73dRD6sUqTCX4tmgo7Q8WFSeNscDAVm/p4dVsw6SOoFcRgaH20yX MBa3oLNTUNAaGbScUPx2Ja3MQS0UITwk0TFTF7hL++NhTvTp6IdgQW4DG+/bVJ3M BRR+hsvSz5BSQQj2FUIAsJ+WoVK9ImbgsBbYxSH60jCvxTIdeh2IeUzS2T1bU9AU jOLzcJZmNh95Nj2Qdrc8/0gin9KpgPmuPQ6CyH3TPFy88lf19v9jHUMO4SKEr7am DAjbX3D7APKgHyZ61CkuoB3gylIRb8rRJD2ote38M6A1+04yJL/jG+PCL1UnMWdL yJ4f4LzI9c4ksnGyl9neq0IHnA0Nlky6dmgmE+vLi6OCbEEs2v132wc5PIxRY+TW 8JWu+3wUA4tj5uQvQRqU9/lmoHG/Jxubx/HwdD9Ri17G+qX8re5sySmmq7rcZEGJ LVrlFuvA0NdoTM4AZY23iR6trJ/Ba2Q4pQk4SfOEMSoZJmf0UbxIP0Ez6Fb+Dxzk WKXfI+D0ScuVjzV0bs8iXTrCcynztRKndNbtpd39hGAR0rNqvnHyQGYV75bWm5dS 0S0PQ6DOzicLxjNXZFicQvwfieg9VyJikWLFLu4zAbzHnuoRk6b2KbSU4UCG/BCz mHqz4y6GfsncsNkmFmsD5Gn9UrloWcEWgIDL05yIikL+L9DPLnNlSYtehDfxlhvh xHzY/Rad4Nzxe62yXhSxhROLTXIolllyOFJgqZ4hBlXybBqJH7sZUll6PUpDwZdu BK14pzMIpfxq2eYp8jI7fh4lU9YrkuSUM0Ewa7HfrltAgxMhHyaFjfINt61P9OlO s3nuBY17+KokaSWjACkCimVLH13H5DRhfX8OBRT4LeRMUspX3cyKbccwpOmoBf4y WPM9QXw7nQy2hwnuX6NiK5QfeCGfY64M06J2tBGcCDmjPSIcJgMcyY7jfH9yPlDt SKyyXpZnFOJplS2v28A/1csPSGy9kk/uGN0hfFULH4VvyAgNDYzmeOd8FvrbfHH2 8BUTI/Tq2pckxwCYBWHcjSdXRAj5moCNSxCUMtK3kWFdxLFYzoiKuiZwq171qb5L yCHMwNDIWEMeC75XSMswHaBsK6ON0UUg5oedQkOK+II9L/DVyTs3UYJOsWDfM67E 312O9/bmsoHvr+rofF7HEc74dtUAcaDGJNyNiB+O4UmWbtEpCfuLmq2vaZa9J7Y0 hXlD2pcibC9CWpKR58cRL+dyYHZGJ4VKg6OHlJlF+JBPeLzObNDz/zQuEt9aL9Ae QByamqGDGcaVMVZ/A80fRoUUgHbh3bLoAmxLCvMbJ0YMtRujdtGm8ZD0WvLXQA/U dNmQ6tsP6pyVorWVa/Ma5CR7Em5q7M6639T8WPcu7ETTO19MnWud2lPJ5A== -----END MESSAGE----- signature -----BEGIN SIGNATURE----- c8HgXcZesCwAzgDlE3kRYsq059yCIE7MH7r2jBHqJVYPRrtm/HF/mTUykwFPzwsY ulcuoNlPfgGMKS8qBL4kFVZ9uR2Y6P4zLchoVS6wjL+cNYOQfeQs3sNZkiIrOjbb 590tr1/yrt0qUtITGhUGhBZVs9gvkuqaThTIXleEseI= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/bridge_network_status0000664000175000017500000000132213157571677024613 0ustar atagaratagar00000000000000@type bridge-network-status 1.0 published 2012-06-01 04:07:04 r Unnamed ABSiBVJ42z6w5Z6nAXQUFq8YVVg FI74aFuNJZZQrgln0f+OaocMd0M 2012-05-31 15:57:00 10.97.236.247 443 0 s Valid w Bandwidth=55 p reject 1-65535 r TolFuin AFn9TveYjdtZEsgh7QsWp3qC5kU 1Sw8RPx2Tq/w+VHL+pZipiJUG5k 2012-05-31 18:12:39 10.99.47.37 80 0 s Fast Guard Running Stable Valid w Bandwidth=32 p reject 1-65535 r sidvic AGzeXR+V8NSBE3wTE4m7gBYbjWM 7enyDQ20UjliwCPN2JmTl6zrCdM 2012-05-31 22:56:12 10.145.17.182 80 0 s Fast Guard Running Stable Valid w Bandwidth=56 p reject 1-65535 r AntoniusBlock ANk5reA3WwTV62ZpyMo+NWtrvAw gEgv8I1E4LWrs394Xx/cRYQUL5A 2012-05-31 17:21:20 10.95.68.0 443 0 s Fast Guard Running Stable Valid w Bandwidth=55 p reject 1-65535 stem-1.7.1/test/unit/descriptor/data/old_descriptor0000664000175000017500000000557413157571677023234 0ustar atagaratagar00000000000000@type server-descriptor 1.0 router krypton 212.37.39.59 8000 0 0 platform Tor 0.1.0.14 on FreeBSD i386 published 2005-12-16 18:01:03 opt fingerprint 3E2F 63E2 356F 5231 8B53 6A12 B644 5373 808A 5D6C uptime 64820 bandwidth 102400 10485760 0 onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAOewVPvehUE/Iy06e/NmUyzwBdkL89DP3q+I68hJJsxQgd1Fqm2CVN4E X0l3U14e3yyihr8xz1qmvQenWyKMx6B5ZjHrRAk774nTXzqqZMbcEKGnoWKTAgfC SrZYD4YdO2vPIA3OIBLBvj6HlyZWPVulQANpETK1TOACKeqs6vlhAgMBAAE= -----END RSA PUBLIC KEY----- signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAJjsGNwSkG7xCzWEPTr2NBrC4k2Bx0SnTv8RfgUwqRg8rLss5CoZw7BV GL3g6PNe13rWcu7rYg27mT81T4cehrl0omnx4FrhDPmnJY4d+yjUiLKujTYaijyZ 8ll4Mr1Ua3M2tTa+79sA8rXAg3zMf+BtTfIcK4avm+csipZ75r9BAgMBAAE= -----END RSA PUBLIC KEY----- opt write-history 2005-12-16 18:00:48 (900 s) 81,8848,8927,8927,83,8848,8931,8929,81,8846,8929,8931,81,8848,8929,8927,81,8846,8929,8929,83,8848,8931,8927,9544,23145,118733,12471330,23681225,32974322,36669050,50028191,60119352,43959405,104125876,93764839,67886465,56660787,69614721,49677518,72758978,69080350,68451562,56135957,66072248,44186182,63136414,78723340,84085493,73800911,61322609,54493047,40058835,35991325,33933884,43033805,30004913,31375439,29870384,39901793,24405790,46428634,32855040,31738054,32096150,34571772,47317095,43861120,1725009,2709813,3632379,7206137,4376659,3499688,2148089,2420819,3039400,3271931,2661625,2387027,943794,138137,167325,152659,120259,119828,120342,116812,118734,117279,116769,114764,115673,117709,117201,110668 opt read-history 2005-12-16 18:00:48 (900 s) 20774,489973,510022,511163,20949,490665,509936,510266,20919,490429,512036,508640,20666,485937,506582,505071,20662,484684,507452,506131,20565,485822,505385,505766,28300,499433,627237,12392493,20716078,25654673,25415889,39581836,49991512,31545049,96363762,80390334,60930455,45885095,57137777,42643192,59698768,54573481,58379825,45862920,58781990,33448161,53507694,73363721,70825862,61283831,49325261,44674036,28451429,25009272,22895835,34914097,21103340,19156546,21131703,33036587,18445151,30464430,21857164,27329112,22507170,29536769,37525461,42026081,1778746,3200903,4137862,7712377,4397719,3980947,2650315,2440799,3522111,3774977,3165517,2407670,1427206,644034,672441,173113,609713,630447,632529,136977,611086,629716,629248,135385,607471,627380,625011,131334 opt hibernating 1 reject 169.254.0.0/255.255.0.0:* reject 127.0.0.0/255.0.0.0:* reject 192.168.0.0/255.255.0.0:* reject 10.0.0.0/255.0.0.0:* reject 172.16.0.0/255.240.0.0:* accept *:20-22 accept *:53 accept *:79-81 accept *:110 accept *:143 accept *:443 accept *:706 accept *:873 accept *:993 accept *:995 accept *:6660-6669 accept *:8008 accept *:8080 accept *:8888 reject *:* router-signature -----BEGIN SIGNATURE----- mHTlJGu2d2ZZgXfoI0CZBiLMCKbHox2n+Q3OGcivLj0kcYfJ/7/jk4o5ABRgyOHM zJ7FnC2wSg19MB8jeAvKkxdd1hp0OZQp+tCRq/7p11+6E0qvJcio+RwdeZAb0dQf suUOPIU/lHzfmraZMO3ovK4VjiWKQ7PgE1vAH7sTyZA= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/hidden_service_facebook0000664000175000017500000000633113157571677025014 0ustar atagaratagar00000000000000@type hidden-service-descriptor 1.0 rendezvous-service-descriptor utjk4arxqg6s6zzo7n6cjnq6ot34udhr version 2 permanent-key -----BEGIN RSA PUBLIC KEY----- MIGKAoGBAL7zXRnwSycHlKSqK+B8PFvy7RhkQ+OytYtxBwOLzhD82oY7zbpjSHY4 BZ+hsnceXVjB+f1mXGjvLY6pnYxuufV4wsMsk7a58aJOqUvZFFI2vXhJtnLICxoZ AEHWzajz4ULagahB1Vi62loQE84OEcuFBekTvnHca1ZTxwp16aZtAgQvoiLZ -----END RSA PUBLIC KEY----- secret-id-part 6355jaerje3bqozopwq2qmpf4iviizdn publication-time 2014-10-31 23:00:00 protocol-versions 2,3 introduction-points -----BEGIN MESSAGE----- aW50cm9kdWN0aW9uLXBvaW50IHJ6Y3V3am5jbDdpYXpkbm41NXV5cmEybWVlamxz eXVoCmlwLWFkZHJlc3MgMTkzLjExLjExNC40Nwpvbmlvbi1wb3J0IDkwMDQKb25p b24ta2V5Ci0tLS0tQkVHSU4gUlNBIFBVQkxJQyBLRVktLS0tLQpNSUdKQW9HQkFM dndQc012TkhqMTY3YlJyLzlLbi9iVGtPUTN0VC9qOFdSOWV5NTlZU2NBVEQ4TXVz OEV6ZWpNCjc0RjdhTGR1VjZuRk15djlFYmhEbVNIZDZRMmhwNkYwb2FGODB0MHMv bThXYmVWTUF1aTRvVWRSU1ZRb0drY20KTDJXTlViNy84UWYwb2hFKzZ1K1pTL0FO U2NEc0FDT2hwNkliMWxHWjhaZGxWZFJzeWxtckFnTUJBQUU9Ci0tLS0tRU5EIFJT QSBQVUJMSUMgS0VZLS0tLS0Kc2VydmljZS1rZXkKLS0tLS1CRUdJTiBSU0EgUFVC TElDIEtFWS0tLS0tCk1JR0pBb0dCQU1YVUJRMVd0cXJSZHRkaTdhODkvWU9EQUJ6 d2U2L0JSS3dEcGFBUENyMC9CZlppVnFadXFFMzcKYmlxbW1pODBPVm5uQzd6eis3 cDZYQ1QycitEemxtSmFCOGdzTjZCZlU2ek45Wklwd3ptcm1XTy94SGNoZ1BkOQpK SUNrSUxHWEJlQnorNmtnSTZiZDcrbFZEYmxJYXNRNHkrUjhMWWxTeCtRMk9mK1gy eDFwQWdNQkFBRT0KLS0tLS1FTkQgUlNBIFBVQkxJQyBLRVktLS0tLQppbnRyb2R1 Y3Rpb24tcG9pbnQgcXE0YXZmdnZhcHljMnhyNmNpYmpuaXFoNTdpY2FkMnEKaXAt YWRkcmVzcyAxODguNDAuODMuMjA4Cm9uaW9uLXBvcnQgNDQ0Cm9uaW9uLWtleQot LS0tLUJFR0lOIFJTQSBQVUJMSUMgS0VZLS0tLS0KTUlHSkFvR0JBTWZySUJ1TlVF MGZxa3ZySDlEZzJkNkM5SFUvNWR2TGxQL0NGVGFFYlVhMURvUHhyQm5iQ1BEcQp5 bHhwNGs3M04yVDM3aXJrN3FacmVZQ3B6aUVPQ3paRU4xdGlkM0t1c0tFczgzL0FQ aDFreTVRRmpkRmpBU0NxCmovRDl0VXNYYkVaa1FEN203SUlmWU40SG52KzROM0dV WjVqNkhFMWJvYmxsbURyNkd2U0xBZ01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElD IEtFWS0tLS0tCnNlcnZpY2Uta2V5Ci0tLS0tQkVHSU4gUlNBIFBVQkxJQyBLRVkt LS0tLQpNSUdKQW9HQkFNRXMyc2tRLzJsVjRFUGpRTDFrZk0zZjExUzRNZUdPcDFC aWgrcm1ESGhic09yWDRoZk1GV1NuCjY1dTlZUE9zY1hldUlHbFp4YmFyUUY2Nzkz bGMrbk9KbjVyQ016a0pYNWt0OHdobkZoVlFXN0ZoejUxRmdMNFkKNUFKKzdkaW9l WTNKdjVNVE1rMUF4Qk1hbkJsR2YxazZrU05kZWxtMCs2bWtZVmVOcVJzckFnTUJB QUU9Ci0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0KaW50cm9kdWN0aW9uLXBv aW50IGI1ZHNpY29oZ2Fqb3Vhc3VxZ3lyNWtwNXIzdzdpaWYyCmlwLWFkZHJlc3Mg MTg1LjUuNTMuNzIKb25pb24tcG9ydCA5MDAxCm9uaW9uLWtleQotLS0tLUJFR0lO IFJTQSBQVUJMSUMgS0VZLS0tLS0KTUlHSkFvR0JBTWVUc0VqS1ZMeGsyL3o4bnRG T2xWU09ZTWFjWTZBeFJTTXdQdkxoT2FsajVkNkRraitnSVA5agpsWDFoekRpZ0VP b2FBV3FwWjRjRENLa3p6UGdzWEc3ZXVnSmFxTGQydUliZmh4WEdISTJDNWtWQWZZ VnVyL1N3CnBXNFRRbmhKUytvbG1BWG84b1hvT2JNWGt1YURUdmlLSXZLa3lQWCs0 dGJ4a1RxWWt5ZURBZ01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0t CnNlcnZpY2Uta2V5Ci0tLS0tQkVHSU4gUlNBIFBVQkxJQyBLRVktLS0tLQpNSUdK QW9HQkFPM05SSGMwTld5MFo5aFQrZEUxZ3hKRnFsb0dhdmdLYzZJZ0E1UU5ORDNO RHJJakdBYmNsRVh4Ck1tY1BBR2hhc1VlNnJ2aFN0VlRkZEVvN1V0SElCM3F2YXNL d0NPem82Z2dLSHZtVVRFOWRNTk9LSEcyLy9xTi8KVkducGdJUkRoeDRwbE9DOXV6 NGFKU0RZdlhiSXVtZmtxdGJzb1BacUZMYUFqdGFWR015VkFnTUJBQUU9Ci0tLS0t RU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0KCg== -----END MESSAGE----- signature -----BEGIN SIGNATURE----- tFCNLEOFeqeDZOruKt4SBGvJ2Y2lLo29XUzd09FlIalnwb71TKcKSWi1JVB0vDqF ftGlP4M+nZGh6YGxdEriV0ikFbcW+F4XOpWR5NEPV5cCoQAMd1a8mqivGjM/lQwe 41p+e4XCex2Brsl3o+pSyHy/U+p+xdQkmNPqrHpXVK8= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/bridge_descriptor_with_ed255190000664000175000017500000000133013157571677026005 0ustar atagaratagar00000000000000@type bridge-server-descriptor 1.1 router ChandlerObfs11 10.162.85.172 443 0 0 or-address [fd9f:2e19:3bcf::3d:b3f9]:443 master-key-ed25519 lgIuiAJCoXPRwWoHgG4ZAoKtmrv47aPr4AsbmESj8AA platform Tor 0.2.7.1-alpha-dev on Linux protocols Link 1 2 Circuit 1 published 2015-08-20 20:09:42 fingerprint 6789 12AB D739 8DF8 EFC8 FA2B C7DE F610 7103 60C4 uptime 2693146 bandwidth 1073741824 1073741824 779171 extra-info-digest 5229E98EAB41A32E83159FA45BED21B5B405BF3B lTSVvW/NMR2HsLaJwhndqTULAtsaaSilmvm/orV9y/s hidden-service-dir contact somebody ntor-onion-key bVvxUCi8drAVRkFPuFQ4DYBsV1m2M+GpHOUReOopXEk= reject *:* router-digest-sha256 OB/fqLD8lYmjti09R+xXH/D4S2qlizxdZqtudnsunxE router-digest 402AC6E2BB371923E637A1D23C2D8EA55D6EB7D5 stem-1.7.1/test/unit/descriptor/data/extrainfo_descriptor_with_ed255190000664000175000017500000000242413157571677026555 0ustar atagaratagar00000000000000@type extra-info 1.0 extra-info silverfoxden 4970B1DC3DBC8D82D7F1E43FF44B28DBF4765A4E identity-ed25519 -----BEGIN ED25519 CERT----- AQQABhz0AQFcf5tGWLvPvr1sktoezBB95j6tAWSECa3Eo2ZuBtRNAQAgBABFAwSN GcRlGIte4I1giLvQSTcXefT93rvx2PZ8wEDewxWdy6tzcLouPfE3Beu/eUyg8ntt YuVlzi50WXzGlGnPmeounGLo0EDHTGzcLucFWpe0g/0ia6UDqgQiAySMBwI= -----END ED25519 CERT----- published 2015-08-22 19:21:12 write-history 2015-08-22 19:20:44 (14400 s) 14409728,23076864,7756800,6234112,7446528,12290048 read-history 2015-08-22 19:20:44 (14400 s) 20449280,23888896,9099264,7185408,8880128,13230080 geoip-db-digest 6882B8663F74C23E26E3C2274C24CAB2E82D67A2 geoip6-db-digest F063BD5247EB9829E6B9E586393D7036656DAF44 dirreq-stats-end 2015-08-22 11:58:30 (86400 s) dirreq-v3-ips dirreq-v3-reqs dirreq-v3-resp ok=0,not-enough-sigs=0,unavailable=0,not-found=0,not-modified=0,busy=0 dirreq-v3-direct-dl complete=0,timeout=0,running=0 dirreq-v3-tunneled-dl complete=0,timeout=0,running=0 router-sig-ed25519 g6Zg7Er8K7C1etmt7p20INE1ExIvMRPvhwt6sjbLqEK+EtQq8hT+86hQ1xu7cnz6bHee+Zhhmcc4JamV4eiMAw router-signature -----BEGIN SIGNATURE----- R7kNaIWZrg3n3FWFBRMlEK2cbnha7gUIs8ToksLe+SF0dgoZiLyV3GKrnzdE/K6D qdiOMN7eK04MOZVlgxkA5ayi61FTYVveK1HrDbJ+sEUwsviVGdif6kk/9DXOiyIJ 7wP/tofgHj/aCbFZb1PGU0zrEVLa72hVJ6cCW8w/t1s= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/compressed_lzma0000664000175000017500000000316413341034346023356 0ustar atagaratagar00000000000000ý7zXZæÖ´F!t/å£àß4]9ËõŸ‚Ž­ÖùæIzÐßhæ’#b–²"§$Ù—‰R®“¼¤¿!Ì‹xÅFÂП¶@ù¯b•ËP(üm­Ää)§MÁ”ŸÕÅÝ5º­dÀ^'c‰…kÍjäîmÚ ‰ÈÛÝ j¯ü7mª§>ûÍñ@îânÇ!H¾%”.jÞñ:I]6=ÚÉä@FòÚࡪ¾ZÓæ™¢ST³Z-Ð"?ÐĦ&O²˜Ýþ·5ê £€¥ÐùvO厩qf “¿ª¢aJGí?@j3u1¥J@í÷ý¥±ˆñ´Êc&áG"o1V›¯¨9†î±°ý3|½¬ŠÕyŽðb,cšSJŠ>PŠY|BæÝç¤é#é¯b|ٱ뤞;ŸÑ¶)T@¹0™O²æ´³ 2Lú*MäëIÙ×±¶ØSF÷°!Ì@ÚÀ=¹àÇ>ƒ¼ãÅ×Ê–DªÅÍ=ïÝñ&Õà— yÈ,ô>T,%§3òŸe«¤)Mê¬Ï2š]9ŽTȬü]~èÑýÒ*'¶çá¢ú+BHJ –íÃÓ¡—½ÅË`40ÁsVú 9€âª#uFQÙÍ{eÌ6 båû‰QuâS©`€®Ô ž„šÑÛÖ6I¥Ýi"?÷>&lŸ&©½‹› C8®šÈˆ¸çiIæË^Ç)X›ÕÆAÎoRZZþ³uç{ب‚n×v\ UžÄ0‚ZF+%x™H~×ËÌ`% Äûޤu¾ }Ƭ¾ÄXÓÛ€,ï‰qø²X[?“Þå:x‹ZøøVÍ­üÏ¢«{ìý¯ËKp`3ˆìÙª¥›ãJ1twxD.Šdzfgߦ$›€é†/¾&Ÿ»€úõvFò*é‹$f#hÈ Û(;Ü{^ò›@1áúœ¢:*¨%‘«K‹›;8&sá²Z)s rÛÁ¬E´ÊˆïÞv¡ôˆž¤¤ý)3>ÏÜJ_æ£ÔpÔ©up¶!_!ÿñ¸; Fé?K4Ãr(™D\/ßÚnU·9¢’ÝÇ ¡B)9¤âÂ# ïî…J«ú#5Ê7ûÁíŠuÒ™ýv­†ÊîÍÈQDÚ¿o¥~Dõè _Hæ~<ݳßÄô:Ú¼U¾Ÿ½Û:'nè·s'Q{Gxyòi’gƒÊ ïH-pqQôÙwonyCÇšr!µªZº(E[;cYÔí_Oâå ÷š÷;€ë%ZEš®±wîGA÷Ïmaô%L¤M²u¥ô¤O{Ô s[E•6 o·_’w‹ø½‚H„Ö)I»†~IÄøÍèÇ/6­Í«„|áM½ªûüâØêN”«mÊš]Ç ÎµùÑÕ…Hn*n’ ÙŸùl^ÓhS2»Ïx#k6?¸G+&ý?繺¡±ùwî«ÓæRóŽ¥"ܵªZ%]8¯Ï«ã¯ü}9'ô\vÂì_Ob~ÄÍ ýTš~ƒ6{DˆoM&«Ê·oQ¼ƒÅFê;¼¸¥At0ß§ *\ë Ço•½ckM8½ë…تû~Vet Ð÷¡íŠc2“°»Fë×ã ×½U7Ð ¬Å©š¡ÊnÞPÒ RcþÐ àŒ­ß±ÄgûYZstem-1.7.1/test/unit/descriptor/data/hidden_service_basic_auth0000664000175000017500000000724413157571677025351 0ustar atagaratagar00000000000000@type hidden-service-descriptor 1.0 rendezvous-service-descriptor yfmvdrkdbyquyqk5vygyeylgj2qmrvrd version 2 permanent-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBANHC3bZRrlFFlSu22u18wBG57JpvIhglJE+u0ctMwTnw6iyJJqqxgU6U R1gnXJlorQYDC5eHoM8nbBJu7LvUjYnqINz+En+FlpZhT+eqLk0v83IB4r0Fd6Bg ypYLygEXUfh0bwHwYfF4mkvl6YOB6I6G5jHC46I3LH15qrdHW40FAgMBAAE= -----END RSA PUBLIC KEY----- secret-id-part fluw7z3s5cghuuirq3imh5jjj5ljips6 publication-time 2015-02-24 20:00:00 protocol-versions 2,3 introduction-points -----BEGIN MESSAGE----- AQEAi3xIJz0Qv97ug9kr4U0UNN2kQhkddPHuj4op3cw+fgMLqzPlFBPAJgaEKc+g 8xBTRKUlvfkXxocfV75GyQGi2Vqu5iN1SbI5Uliu3n8IiUina5+WaOfUs9iuHJIK cErgfT0bUfXKDLvW6/ncsgPdb6kb+jjT8NVhR4ZrRUf9ASfcY/f2WFNTmLgOR3Oa f2tMLJcAck9VbCDjKfSC6e6HgtxRFe9dX513mDviZp15UAHkjJSKxKvqRRVkL+7W KxJGfLY56ypZa4+afBYT/yqLzY4C47/g5TTTx9fvsdp0uQ0AmjF4LeXdZ58yNjrp Da63SrgQQM7lZ3k4LGXzDS20FKW2/9rpWgD78QLJGeKdHngD3ERvTX4m43rtEFrD oB/4l2nl6fh0507ASYHy7QQQMcdjpN0OWQQKpL9SskZ8aQw1dY4KU28Gooe9ff+B RGm6BlVzMi+HGcqfMpGwFfYopmqJuOXjNlX7a1jRwrztpJKeu4J9iSTiuSOEiQSq kUyHRLO4rWJXa2/RMWfH4XSgdUaWFjOF6kaSwmI/pRZIepi/sX8BSKm+vvOnOtlr Tz2DVSiA2qM+P3Br9qNTDUmTu9mri6fRzzVnj+ybdTQXn60jwPw4vj4xmvVTkjfZ ZB2gw2+sAmZJA5pnLNGu4N8veo1Jiz7FLE0m+7yjXbcBc/GHWGTJa0Sa1Hwfp82t ohagQlRYKhLaRrM6ZvjnPMH5dqT/ypfBXcIQAh6td1+e1Hf/uXZPM/ZrgHeCJqF+ PvLDuu4TYxOod+elZE5LfwDFPzCcMA8XNuuDzGQOFOMh9o4xTbQchyRSfhDGev/H HpY9qxRyua+PjDCmE/F3YiFy77ITJLhCyYEdzVw43hCVY52inEauvHRzqTl7Lc53 PhnSIW6rDWsrrSMWApCC5WRSOSKfh0u4vO13bVLTb/QmuvMEhGiXDVI3/0NEpqKF ewqyiG9Dvv67A3/IjTe3aMRGfWREHFnEG9bonn03uoufgmQb4h9ci9+QU52sl16F rxRpxLyMRp8dpUzZbK3qxtASp09Lc2pdgItWcMMTtPObcd7KVV/xkVqm3ezaUbRF Nw5qDFxkG85ohTvFt3wnfxkpytMhWoBv9F0ZMEFRLY2j+cb8IqXN5dyz6rGqgSYY dtItQvI7Lq3XnOSFy3uCGC9Vzr6PRPQIrVH/56rSRaEyM8TgVWyaQQ3xm26x9Fe2 jUg50lG/WVzsRueBImuai1KCRC4FB/cg/kVu/s+5f5H4Z/GSD+4UpDyg3i2RYuy9 WOA/AGEeOLY5FkOTARcWteUbi6URboaouX2lnAXK6vX6Ysn8HgE9JATVbVC/96c9 GnWaf9yCr6Q0BvrHkS7hsJJj+VwaNPW4POSqhL+p0p+2eSWZVMlFFxNr+BNKONk+ RAssIHF1xVRHzzl75wjzhzuq0A0crHcHb64P+glkPt4iI7SqejyCrMQh6BWia6RT c+NwXTnbcibB56McF+xWoyHne6dg1F0urA61JfQboyWOy+Z+cNPjEIcwWhJr/+Gx v7/yf3V1kNECa90L7BeUmFGKxL7SvgyapevWqkIQCZEcOnobXQRdWUmNqSoZmOxB u5eDcvrdF9p5wG5IStpzO9OConG3SQb46S9OSU3O7PnjKFId6KRIM7VsprMIIBTz HKy6ufKyMXgyxxnvE5TZQcLzA4Wv8vHWET3t3WSQEwSPx45IAbjsE587YNOkjK1X HNT3ypfRdJacxtttR7Y5Y/XF4tJmXkCfb5RoEqIPrQTmiLYh0h02i6CqeFK9u7j/ yAdKY3NrCBuqPM4mWCdjvtgC9i1Q98LCDiVESRrvLlfvv3iWozDUZ3qIU4TnSgti U5+xKrmlKcWHHgADS56IECgCQyr2nZEhcNK7vKvg+KgA667tRm7M35w9eHz+J7lg x5v5GYPH4J1UjPEb5Cwl+Vlr0XIqbhMX9MZWimpOJ0l5TisOLuTJ9ennREsFPZjN U4IZQht7gifFlemn7D4a+UXHu95bHxDBMPJky7iYc2U3r50+JWRF+LO1L2TNDQlV iPO8AOoI0V0cGaYE+0ZUgpUDk8fxUH5CAPCn+dbsqDh165G6590cF9eF4/yrlf2V nbhZipPQyOTrmiCkBPQ1zuXYyfFHrJL7yK4ykiBV8c/VLT8nxeKfPwW3USKOScnx k68qqFZ6lNFxlDwPAJR3F2H+PN5JZ8H1lTE56ujgTBpArXMPYpKri4a0lG+8QnYK D6jOJIli5QtVQxES4X64NDwducoGHnquMZs3ScvJQPSOuTvuqaad4FrTCZGbv6Ic emUAHDsxjffMQ9IJYulluCTVWgS/AiBk31yiUB0GsAqZYcWz5kKgTpOXBQhulACM waokEqbyH2Vtvc1peiPi+Vh6EhTSiDoEVZ2w9GrOnjgpyK6zxzH0aIhJJxlQu8it w+xj/3+79Bf8myVesgzCWvXbkmvc6jJaoHGopV8lTM2JUn4xYCSz71Bt4wQBKZX4 hFXDlDZaY1k/QRP/zTfQ8pjbcohDgUVW8eftJz3ND5Iy8D3nRF9/BQB3PWox4vyQ Fj94Eoe8NmEArIKWjUoSkn+EDgNcdHGBIaQ5is0N8r9n4E2cgMj57i4Fm37k8c6+ hlilrggVJ8qTBGs57M0ldqRLwt1bM6SkU//oMGel7Ft3EDd98W/6RXRkmAbsLhRx 7VMb4WCUBrIZLxo1/StwHa13RyTHAt0GKPu549l3oTZezsSad8vlurbnIbxtK9Cl hp6mYPd3Djoe5OaLe8Gnu23ko+S2+kfHIjOwkza9R5w6AzLjkjYS3C8oRwuxKOft lj/7xMZWDrfyw5H86L0QiaZnkmD+nig1+S+Rn39mmuEgl2iwZO/ihlncUJQTEULb 7IHpmofr+5ya5xWeo/BFQhulTNr2fJN0bPkVGfp+ -----END MESSAGE----- signature -----BEGIN SIGNATURE----- mhGQNtyvf5QqeFrn1SNzdp8wN5bhEH5gxZhST5t4pFxxNCv3//ZgaQ83kIzcwex9 xzgGREFHpTrqVPXXs8nZZgMpmnhWuloAyT1c3HSCvjnbWXX9Y82wPbVV5OYx1CYb jLides7vbdQuS0UwEkcGMl62Ripwi0pkesgw9ZvJy+k= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/metrics_cert0000664000175000017500000000320213157571677022665 0ustar atagaratagar00000000000000@type dir-key-certificate-3 1.0 dir-key-certificate-version 3 fingerprint 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 dir-key-published 2008-05-09 21:13:26 dir-key-expires 2009-05-09 21:13:26 dir-identity-key -----BEGIN RSA PUBLIC KEY----- MIIBigKCAYEA7cZXvDRxfjDYtr9/9UsQ852+6cmHMr8VVh8GkLwbq3RzqjkULwQ2 R9mFvG4FnqMcMKXi62rYYA3fZL1afhT804cpvyp/D3dPM8QxW88fafFAgIFP4LiD 0JYjnF8cva5qZ0nzlWnMXLb32IXSvsGSE2FRyAV0YN9a6k967LSgCfUnZ+IKMezW 1vhL9YK4QIfsDowgtVsavg63GzGmA7JvZmn77+/J5wKz11vGr7Wttf8XABbH2taX O9j/KGBOX2OKhoF3mXfZSmUO2dV9NMwtkJ7zD///Ny6sfApWV6kVP4O9TdG3bAsl +fHCoCKgF/jAAWzh6VckQTOPzQZaH5aMWfXrDlzFWg17MjonI+bBTD2Ex2pHczzJ bN7coDMRH2SuOXv8wFf27KdUxZ/GcrXSRGzlRLygxqlripUanjVGN2JvrVQVr0kz pjNjiZl2z8ZyZ5d4zQuBi074JPGgx62xAstP37v1mPw14sIWfLgY16ewYuS5bCxV lyS28jsPht9VAgMBAAE= -----END RSA PUBLIC KEY----- dir-signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAOeE3Qr1Km97gTgiB3io0EU0fqHW2ESMXVHeQuNDtCWBa0XSCEG6gx4B ZkkHjfVWqGQ7TmmzjYP9L9uCgtoKfhSvJA2w9NUMtMl8sgZmF4lcGpXXvGY9a566 Bn+3wP0lMhb/I8CPVPX+NWEjgl1noZxo1C59SO/iALGQOpxRYgmbAgMBAAE= -----END RSA PUBLIC KEY----- dir-key-certification -----BEGIN SIGNATURE----- asvWwaMq34OfHoWUhAwh4+JDOuEUZJVIHQnedOYfQH8asS2QvW3Ma93OhrwVOC6b FyKmTJmJsl0MJGiC7tcEOlL6knsKE4CsuIw/PEcu2Rnm+R9zWxQuMYiHvGQMoDxl giOhLLs4LlzAAJlbfbd3hjF4STVAtTwmxYuIjb1Mq/JfAsx/wH3TLXgVZwj32w9s zUd9KZwwLzFiiHpC+U7zh6+wRsZfo2tlpmcaP1dTSINgVbdzPJ/DOUlx9nwTCBsE AQpUx2DpAikwrpw0zDqpQvYulcQlNLWFN/y/PkmiK8mIJk0OBMiQA7JgqWamnnk4 PwqaGv483LkBF+25JFGJmnUVve3RMc+s61+2kBcjfUMed4QaHkeCMHqlRqpfQVkk RY22NXCwrJvSMEwiy7acC8FGysqwHRyE356+Rw6TB43g3Tno9KaHEK7MHXjSHwNs GM9hAsAMRX9Ogqhq5UjDNqEsvDKuyVeyh7unSZEOip9Zr6K/+7VsVPNb8vfBRBjo -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/compressed_zstd0000664000175000017500000000301613341034346023373 0ustar atagaratagar00000000000000(µ/ýX0ªqD"ðÊï‘:ÍR­dLÐGë4  `A¹”jÄD-ôˆl"ŸSYX\ÊÃ(TÃ8;å«Ìºç'ŽÒÔ¦ËÃö(ëí'@#°þÙŠ”F íl—vŠƒ )ì'x6|EM̳¨Ì³í(€ÜalÃöq™;ÛíïOs]Sa@Ìöð¸_3¾éÆ a@cM«•º¼šÏ"Ïk˜¾á eí%Ó„âO3˜¸Þ¼U<ÿ²ùfŸ&@«d5fzZ§…°~k4†Œ0„l=¹ÍiH`ðPæ̇B©z¸¡…4ÑT®p-†m™ÇÂÈbYhúɃP'r VGŽbc}S´~ŒÓ!?T8Û¶!+¯ÝI°%ì†ÌºT ´ÿâüÃ40¡©ˆÍˆ³cþM3KR¸\ #™J­Ò/ ­d 5lgÚþœv)IÕD‘“r¥þìï _†ýd(„i¹µk¨˜Ôq­ÙBZâœ2ׂ¦>rq&CÇPãÙô…’tÅÓ ÚØñ¶ïÛ=LŒ1£Ï"Cœ 7\ÝŸT4~{Êc«¯/Àì=Y!Â{y£ÈÁ*²ô>Òu&3Xù¼È)c¬3«¤„6Mé€Bò"u^_ØepÖŸl°.¶ ÁÐ #t‰Ø–Ö¼U:Ìv8Qd¾¢&š€¡êyšéQpÃ6 ëÅbŽÓ!Û„eÐä¾ÜƒÐ'†íGk&§b¶)Ë(ÊŠ汨Ȋ4†‚«Ê  k$꩞ýe®²©3:«˜þCx2AÐÃ@Ïf¤j*GÚ Ã8M´×Ÿ²tÚÍ3‘ª&ªœÍ_öÇsÒ<¶‡™võHÐÆ æÚV³Uûªœg7ummÛ¢ý`[¶£Jªöï¬=W;ËHhÀÔ €˜Ý<’IÉÍÇ`ƒø:â™q,È‚ŽÀ§^¬RKÌNûšÛ¹„®Yõ%ƒ_!| ¨ÂR¤~àP?®y¤[äP|½±y¼7;j:P+5ûeÁÌV<ü»E{B¡n|,ˆ[Åçê4Á@Aqu±=HF {Ä!qÁV?DÉA`õB¿¼Õ2¨„I*SáM/̦ռêA0ú‚’àõ|N{ˆÔ q5ÇÅHP.†nÈ.Ôwžßü@<÷Eéùõ o͇SUéË})ºH—gˆ“¡—ܱk<ó@*Q<„Ø÷•eØ£Êÿ†À‚eÅ|,~kx¤!ŠZkAæØþ×Á5k¡V=Å`±cB<îOdý"…ªH”‰Éœrö¨@K.IŠ•Çõ»@Mú¤CÙ@#èÁËz¯»5£=…"²~¢Ä0{ŸkÒfÇ×àV >05W Yµës4씡S6W$v¦Á©Þ¢'*ÆàB±=‚†pŒ&!‘²ÓZ³R/‘Ú_cíÙ@·DCñ!ER“u„&ýº]š#¡G¸Æy\Ê Âˆ_å§÷&Þä”Vœ|]yÎÅ#Bk“vôiq`}­h`ÿ àPC#ÃÓd,n™ª¢„÷t¿s‹Æ¢7ˆZHŽÖÇDîçov0›+¹Ð kö2”勦²áRÏÌyçÔ9[#¢ƒw¿D¹9‰±1râD»‚š à\w“邌æ#O|Vi ÝTVVÏ=›*)w]Þûüìò÷‰Cž¬˜Eð²h³ûà½m¹R—ÇA:!¸yuZÈ?æžS¾?ûnóõ掶‹¢*ÊY2ÈašýQówM<›*ežËJçiÊ®m˜?VB‚-ø‚å³x5>ëp*–èÂ3á5’¹žrw h$Jë U¿F®ìp°——Õc²Ì%ž3â/c«Û ãòìK¼õ?y¥uËê#ïICKPŽDZá‘*¬i_CAÏœˆ)r‚8öTª,él Å=˜bQÖ8 [È®%÷ûšA:ïÙìˆ+Østem-1.7.1/test/unit/descriptor/data/metrics_consensus0000664000175000017500000001453713157571677023765 0ustar atagaratagar00000000000000@type network-status-consensus-3 1.0 network-status-version 3 vote-status consensus consensus-method 12 valid-after 2012-07-12 10:00:00 fresh-until 2012-07-12 11:00:00 valid-until 2012-07-12 13:00:00 voting-delay 300 300 client-versions 0.2.2.35,0.2.2.36,0.2.2.37,0.2.3.10-alpha,0.2.3.11-alpha,0.2.3.12-alpha,0.2.3.13-alpha,0.2.3.14-alpha,0.2.3.15-alpha,0.2.3.16-alpha,0.2.3.17-beta,0.2.3.18-rc,0.2.3.19-rc server-versions 0.2.2.35,0.2.2.36,0.2.2.37,0.2.3.10-alpha,0.2.3.11-alpha,0.2.3.12-alpha,0.2.3.13-alpha,0.2.3.14-alpha,0.2.3.15-alpha,0.2.3.16-alpha,0.2.3.17-beta,0.2.3.18-rc,0.2.3.19-rc known-flags Authority BadExit Exit Fast Guard HSDir Named Running Stable Unnamed V2Dir Valid params CircuitPriorityHalflifeMsec=30000 bwauthpid=1 dir-source tor26 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 86.59.21.38 86.59.21.38 80 443 contact Peter Palfrader vote-digest 0B6D1E9A300B895AA2D0B427F92917B6995C3C1C dir-source turtles 27B6B5996C426270A5C95488AA5BCEB6BCC86956 76.73.17.194 76.73.17.194 9030 9090 contact Mike Perry vote-digest 904B1974B9879D02B4ADFB81D7E9B4E07D768A5A dir-source maatuska 49015F787433103580E3B66A1707A00E60F2D15B 171.25.193.9 171.25.193.9 443 80 contact 4096R/23291265 Linus Nordberg vote-digest A8839355BAC373320B8CEDD0A0A09DAAA1637E3A dir-source dannenberg 585769C78764D58426B8B52B6651A5A71137189A dannenberg.ccc.de 193.23.244.244 80 443 contact Andreas Lehner vote-digest 416B73C49E717B0A5D61A4F634DCCF94611802E7 dir-source urras 80550987E1D626E3EBA5E5E75A458DE0626D088C 208.83.223.34 208.83.223.34 443 80 contact 4096R/E012B42D Jacob Appelbaum vote-digest 08B1F8E4910F136E7FB7DFD52ABB2A9EDE939F0B dir-source moria1 D586D18309DED4CD6D57C18FDB97EFA96D330566 128.31.0.34 128.31.0.34 9131 9101 contact 1024D/28988BF5 arma mit edu vote-digest 5006931FB78F7AE42B602697591DBA82AACEF533 dir-source dizum E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 194.109.206.212 194.109.206.212 80 443 contact 1024R/8D56913D Alex de Joode vote-digest 3F1F1E071EC5F54115CB8EA9723E30A9386AB8CA dir-source gabelmoo ED03BB616EB2F60BEC80151114BB25CEF515B226 212.112.245.170 212.112.245.170 80 443 contact 4096R/C5AA446D Sebastian Hahn vote-digest DF2EC9AD207831DED1D01BB889A9C4478DE2CFB9 r sumkledi ABPSI4nNUNC3hKPkBhyzHozozrU 8mCr8Sl7RF4ENU4jb0FZFA/3do8 2012-07-12 04:01:55 178.218.213.229 80 0 s Exit Fast Named Running Valid v Tor 0.2.2.35 w Bandwidth=38 p accept 80,443 r Unnamed AEXri4INxBAZeyi0wvJZoC58nZs 9t4U465paxGASh0x5Tds8a8YiKo 2012-07-12 04:48:09 79.139.135.90 443 22 s Fast HSDir Running V2Dir Valid v Tor 0.2.2.37 w Bandwidth=35 p reject 1-65535 r ANONIONROUTER AHhuQ8zFQJdT8l42Axxc6m6kNwI uI7+jQ/T3kFVnl7H7TYE/7WJxi4 2012-07-12 04:40:31 93.128.55.236 24051 24052 s Fast Named Running V2Dir Valid v Tor 0.2.2.37 w Bandwidth=108 p reject 1-65535 r ph3x AMLCoWrttR1eX7fWFo/GazQ9gi8 ZJJnmKK6+9B2KOUSIPV49+Vprxs 2012-07-11 19:44:22 86.59.119.83 443 80 s Fast Guard HSDir Named Running Stable V2Dir Valid v Tor 0.2.3.18-rc w Bandwidth=55300 p reject 1-65535 r nargothrond ANi/r5RGhUxfZ3simlDXFrf2O68 DsP6REKOns/vAUYNp3rfkCOSJFM 2012-07-11 18:25:37 173.11.83.10 9001 0 s Fast Guard Named Running Stable Valid v Tor 0.2.3.18-rc w Bandwidth=543 p reject 1-65535 r default AN1sc6ymJ4WcSJ95VITqL0B5wDQ I9HQ2zph5Nuvf4FKANoKDf5vPV8 2012-07-11 18:48:22 82.243.60.52 443 9030 s Fast Running V2Dir Valid v Tor 0.2.2.35 w Bandwidth=92 p reject 1-65535 r catfesh AOTNBUkB8Lob/wiz7h9gtuDoT2Q 0Ycp54MgG+Ns+oEd3BIubFJdGGw 2012-07-12 08:26:51 80.177.151.82 9001 9030 s Fast HSDir Running V2Dir Valid v Tor 0.2.2.37 w Bandwidth=61 p reject 1-65535 directory-footer bandwidth-weights Wbd=3335 Wbe=0 Wbg=3536 Wbm=10000 Wdb=10000 Web=10000 Wed=3329 Wee=10000 Weg=3329 Wem=10000 Wgb=10000 Wgd=3335 Wgg=6464 Wgm=6464 Wmb=10000 Wmd=3335 Wme=0 Wmg=3536 Wmm=10000 directory-signature 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 BF112F1C6D5543CFD0A32215ACABD4197B5279AD -----BEGIN SIGNATURE----- HFXB4497LzESysYJ/4jJY83E5vLjhv+igIxD9LU6lf6ftkGeF+lNmIAIEKaMts8H mfWcW0b+jsrXcJoCxV5IrwCDF3u1aC3diwZY6yiG186pwWbOwE41188XI2DeYPwE I/TJmV928na7RLZe2mGHCAW3VQOvV+QkCfj05VZ8CsY= -----END SIGNATURE----- directory-signature 27B6B5996C426270A5C95488AA5BCEB6BCC86956 D5C30C15BB3F1DA27669C2D88439939E8F418FCF -----BEGIN SIGNATURE----- VAL+VWqcJiJtTZjFDz5/rS4WLfh8dOSnU2HYUb1ZgqM8PR1rFsoxpvaK9USrtkx9 Byctu/flD3YOqGg+GpYQwU8w9tm7BGelD+dqg97DkJXmlPaXe/Z0nKW1UnCN9m93 svyWCAqglEzxlK4H7ZfMlQbkMu7EFjXGzrn1gRVGOwg= -----END SIGNATURE----- directory-signature 49015F787433103580E3B66A1707A00E60F2D15B 1C915B9493589F97BAC764D1885A34BFC18C7E26 -----BEGIN SIGNATURE----- fHAC5vdqotMtTVIxfqoNrlob2jAi3PP/urvsVA0xmaOzgYtJFIjY2iEWrrU4fRwe 0M1vyCw+oztBrPKYukedkefE9ly/R30KVW2ezo5WpOO4y6oZpelb/jRKFoSRfbyB WdKsHSe2xlXPA0ySu1klpuMOZiQ8wgxh4x3oLGXnL5Q= -----END SIGNATURE----- directory-signature 585769C78764D58426B8B52B6651A5A71137189A 499D7CE5A1356045D629F43271EBF600D6F2CC9C -----BEGIN SIGNATURE----- IDOUDykw+tdCyyVmPSGUDahIeEEPMWxarEoH2gPuyExDqZkUc0ah6Eh736rVSD5Z R4nCjDNTQNr5byDfJk6cMDN9A/5P8uz421pnmLfs9SasLUjTdJt921jxJnSvSBeF hSZPNi5wl++Uw3j2zeclOXvAkkAEGi9Pi5Zf6QNlWFI= -----END SIGNATURE----- directory-signature 80550987E1D626E3EBA5E5E75A458DE0626D088C 2B9B419BB44728A5BE01651D6D1553FD14B6CFFB -----BEGIN SIGNATURE----- D2wVGni7cYHyXNqt9RvW/CUd8r7TgkfEp9OAJKojUyweiGMJOMEqDBE01e4Ov9Pd O9D46fjxWYGE9fN72xvD8CGoNcQgTtLpvypEfB96tKM3JYr5j4MCsdcOrQBkKGp7 qf1Qfiw7aXahk8IfbgvmAvROlAMAxln7nVE0qenQWu4= -----END SIGNATURE----- directory-signature D586D18309DED4CD6D57C18FDB97EFA96D330566 8F0DEA35D1732D867FB94F5130364927DBCCBB8E -----BEGIN SIGNATURE----- cmrV1VUfCo9Smlc8BUblkBuSFqJdQkX/gd3ROOnpdRfogbsylq6xA7srCBGp1Z39 To5Vk71AI0PIy031S6gKfOLgn9E5Bl0Agr60diFxjNn0ejR49MKJTjoDI+DmBlv4 do+Bej+D8afl27LNH/QIYyzSkOl0eXSGtOEEuCQg/3A= -----END SIGNATURE----- directory-signature E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 9BE9A4CF520B6880EB42C5702BC521F03A6CF0FC -----BEGIN SIGNATURE----- UVXzEFkkjCpszLmoqQxAxSU83IS+fqrkIC4DCQZCEjRcXEvx3c56HUyTsew5WTFR XANCJn+V3DaxYLuL6L8xW7r9xOQNU970nGwocuJckxyDcLHloL8E226vIAn6mLmt a1Z6y8NzaQpv4fhdqhT7ETJo+chmf8bSX8qLLmaCIac= -----END SIGNATURE----- directory-signature ED03BB616EB2F60BEC80151114BB25CEF515B226 845CF1D0B370CA443A8579D18E7987E7E532F639 -----BEGIN SIGNATURE----- DILsRCrtn6rDbNo3DF+L1/VVAd+V86PdZKg3Q9QooqVOGgU/7HrspV/K4lFbWcTT Zm+quRQfuKmB4xljwXpeRlABQR5eainlZBtrTFg056/dDrJqYXSwV/C391tAIDZs 2TANs/4uLi94q6Ov+zE9zYUiF8jwnyXl/q/jKOYM8bE= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/hidden_service_duckduckgo0000664000175000017500000000632513157571677025371 0ustar atagaratagar00000000000000@type hidden-service-descriptor 1.0 rendezvous-service-descriptor y3olqqblqw2gbh6phimfuiroechjjafa version 2 permanent-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAJ/SzzgrXPxTlFrKVhXh3buCWv2QfcNgncUpDpKouLn3AtPH5Ocys0jE aZSKdvaiQ62md2gOwj4x61cFNdi05tdQjS+2thHKEm/KsB9BGLSLBNJYY356bupg I5gQozM65ENelfxYlysBjJ52xSDBd8C4f/p9umdzaaaCmzXG/nhzAgMBAAE= -----END RSA PUBLIC KEY----- secret-id-part e24kgecavwsznj7gpbktqsiwgvngsf4e publication-time 2015-02-23 20:00:00 protocol-versions 2,3 introduction-points -----BEGIN MESSAGE----- aW50cm9kdWN0aW9uLXBvaW50IGl3a2k3N3h0YnZwNnF2ZWRmcndkem5jeHMzY2th eWV1CmlwLWFkZHJlc3MgMTc4LjYyLjIyMi4xMjkKb25pb24tcG9ydCA0NDMKb25p b24ta2V5Ci0tLS0tQkVHSU4gUlNBIFBVQkxJQyBLRVktLS0tLQpNSUdKQW9HQkFL OTRCRVlJSFo0S2RFa2V5UGhiTENwUlc1RVNnKzJXUFFock00eXVLWUd1cTh3Rldn dW1aWVI5CmsvV0EvL0ZZWE1CejBiQitja3Vacy9ZdTluSytITHpwR2FwVjBjbHN0 NEdVTWNCSW5VQ3pDY3BqSlRRc1FEZ20KMy9ZM2NxaDBXNTVnT0NGaG9tUTQvMVdP WWc3WUNqazRYWUhKRTIwT2RHMkxsNXpvdEs2ZkFnTUJBQUU9Ci0tLS0tRU5EIFJT QSBQVUJMSUMgS0VZLS0tLS0Kc2VydmljZS1rZXkKLS0tLS1CRUdJTiBSU0EgUFVC TElDIEtFWS0tLS0tCk1JR0pBb0dCQUpYbUpiOGxTeWRNTXFDZ0NnZmd2bEIyRTVy cGQ1N2t6L0FxZzcvZDFIS2MzK2w1UW9Vdkh5dXkKWnNBbHlrYThFdTUzNGhsNDFv cUVLcEFLWWNNbjFUTTB2cEpFR05WT2MrMDVCSW54STloOWYwTWcwMVBEMHRZdQpH Y0xIWWdCemNyZkVtS3dNdE04V0VtY01KZDduMnVmZmFBdko4NDZXdWJiZVY3TVcx WWVoQWdNQkFBRT0KLS0tLS1FTkQgUlNBIFBVQkxJQyBLRVktLS0tLQppbnRyb2R1 Y3Rpb24tcG9pbnQgZW00Z2prNmVpaXVhbGhtbHlpaWZyemM3bGJ0cnNiaXAKaXAt YWRkcmVzcyA0Ni40LjE3NC41Mgpvbmlvbi1wb3J0IDQ0Mwpvbmlvbi1rZXkKLS0t LS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JR0pBb0dCQUxCbWhkRjV3SHhI cnBMU21qQVpvdHR4MjIwKzk5NUZkTU9PdFpOalJ3MURCU3ByVVpacXR4V2EKUDhU S3BIS3p3R0pLQ1ZZSUlqN2xvaGJ2OVQ5dXJtbGZURTA1VVJHZW5ab2lmT0ZOejNZ d01KVFhTY1FFQkoxMAo5aVdOTERUc2tMekRLQ0FiR2hibi9NS3dPZllHQmhOVGxq ZHlUbU5ZNUVDUmJSempldjl2QWdNQkFBRT0KLS0tLS1FTkQgUlNBIFBVQkxJQyBL RVktLS0tLQpzZXJ2aWNlLWtleQotLS0tLUJFR0lOIFJTQSBQVUJMSUMgS0VZLS0t LS0KTUlHSkFvR0JBTXhNSG9BbXJiVU1zeGlJQ3AzaVRQWWdobjBZdWVLSHgyMTl3 dThPL1E1MVF5Y1ZWTHBYMjdkMQpoSlhrUEIzM1hRQlhzQlM3U3hzU3NTQ1EzR0V1 clFKN0d1QkxwWUlSL3Zxc2FrRS9sOHdjMkNKQzVXVWh5RkZrCisxVFdJVUk1dHhu WEx5V0NSY0tEVXJqcWRvc0RhRG9zZ0hGZzIzTW54K3hYY2FRL2ZyQi9BZ01CQUFF PQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCmludHJvZHVjdGlvbi1wb2lu dCBqcWhmbDM2NHgzdXBlNmxxbnhpem9sZXdsZnJzdzJ6eQppcC1hZGRyZXNzIDYy LjIxMC44Mi4xNjkKb25pb24tcG9ydCA0NDMKb25pb24ta2V5Ci0tLS0tQkVHSU4g UlNBIFBVQkxJQyBLRVktLS0tLQpNSUdKQW9HQkFQVWtxeGdmWWR3MFBtL2c2TWJo bVZzR0tsdWppZm1raGRmb0VldXpnbyt3bkVzR3Z3VWVienJ6CmZaSlJ0MGNhWEZo bkNHZ1FEMklnbWFyVWFVdlAyNGZYby80bVl6TGNQZUk3Z1puZXVBUUpZdm05OFl2 OXZPSGwKTmFNL1d2RGtDc0ozR1ZOSjFIM3dMUFFSSTN2N0tiTnVjOXRDT1lsL3Iw OU9oVmFXa3phakFnTUJBQUU9Ci0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K c2VydmljZS1rZXkKLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JR0pB b0dCQUxieDhMZXFSb1Avcjl3OWhqd0Q0MVlVbTdQbzY5N3hSdHl0RjBNY3lMQ1M3 R1JpVVluamk3S1kKZmVwWGR2Ti9KbDVxUUtISUJiNjAya3VPVGwwcE44UStZZUZV U0lJRGNtUEJMcEJEaEgzUHZyUU1jR1ZhaU9XSAo4dzBITVpDeGd3QWNDQzUxdzVW d2l1bXhFSk5CVmNac094MG16TjFDbG95KzkwcTBsRlhMQWdNQkFBRT0KLS0tLS1F TkQgUlNBIFBVQkxJQyBLRVktLS0tLQoK -----END MESSAGE----- signature -----BEGIN SIGNATURE----- VKMmsDIUUFOrpqvcQroIZjDZTKxqNs88a4M9Te8cR/ZvS7H2nffv6iQs0tom5X4D 4Dy4iZiy+pwYxdHfaOxmdpgMCRvgPb34MExWr5YemH0QuGtnlp5Wxr8GYaAQVuZX cZjQLW0juUYCbgIGdxVEBnlEt2rgBSM9+1oR7EAfV1U= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/extrainfo_bridge_descriptor0000664000175000017500000000707713157571677025771 0ustar atagaratagar00000000000000@type bridge-extra-info 1.0 extra-info ec2bridgereaac65a3 1EC248422B57D9C0BD751892FE787585407479A4 published 2012-06-08 02:21:27 write-history 2012-06-08 02:10:38 (900 s) 343040,991232,5649408,49548288,24411136,486400,465920,975872,930816,758784,5650432,1844224,4387840,7417856,789504,623616,7376896,3940352,10039296,6054912,2051072,462848,4260864,5298176,500736,717824,714752,1370112,760832,576512,1521664,3986432,724992,615424,7079936,20995072,17465344,2592768,1014784,3082240,11468800,2770944,5660672,7646208,3385344,5404672,1158144,7741440,3275776,5239808,5291008,2197504,6070272,4919296,1180672,2245632,2362368,1641472,6153216,4660224,9184256,1488896,9736192,768000,65536,176128,2268160,3023872,704512,905216,866304,2375680,3688448,5181440,5433344,5259264,8285184,9391104,7015424,7180288,3436544,3713024,4473856,10705920,10529792,3154944,1815552,3443712,4566016,2668544,2688000,2391040,3181568,2749440,3214336,8974336 read-history 2012-06-08 02:10:38 (900 s) 337920,437248,3995648,48726016,24125440,479232,477184,1010688,988160,772096,6388736,776192,3093504,7187456,787456,657408,7360512,3588096,9319424,5211136,2034688,474112,4222976,5154816,490496,1878016,610304,757760,667648,593920,1484800,3638272,1307648,672768,6614016,19262464,14863360,2612224,525312,1494016,11119616,3160064,1986560,5619712,3290112,5457920,1145856,7060480,3262464,5570560,5933056,2245632,4548608,3614720,829440,1765376,2379776,2531328,4306944,4244480,9225216,1054720,9806848,880640,66560,192512,2135040,3038208,830464,804864,941056,2386944,3660800,4835328,6406144,5152768,8714240,9145344,6902784,6781952,3648512,3876864,5474304,9958400,10851328,3322880,2239488,4790272,4343808,2404352,2615296,1551360,3295232,2869248,2924544,4941824 dirreq-write-history 2012-06-08 02:10:38 (900 s) 5120,664576,2419712,578560,3072,5120,5120,3072,11264,5120,54272,1130496,1381376,202752,47104,0,6144,1064960,716800,835584,2048,0,3072,128000,4096,1024,222208,604160,129024,7168,118784,353280,0,0,761856,2236416,2574336,3072,526336,2037760,214016,726016,3592192,2205696,134144,1024,86016,656384,8192,9216,402432,14336,1617920,1436672,445440,481280,7168,1024,1959936,442368,14336,544768,4096,1024,0,4096,1052672,78848,0,223232,51200,5120,5120,1191936,1024,579584,2048,231424,68608,1305600,38912,4096,8192,1433600,5120,4096,330752,574464,382976,225280,940032,1185792,6144,1024,374784,4173824 dirreq-read-history 2012-06-08 02:10:38 (900 s) 0,71680,99328,25600,0,0,0,0,0,0,3072,45056,74752,13312,2048,0,0,69632,18432,39936,0,0,0,8192,0,0,16384,25600,9216,0,7168,8192,0,0,96256,92160,138240,0,18432,128000,0,81920,149504,113664,8192,0,11264,46080,2048,0,25600,0,75776,77824,0,6144,19456,0,58368,14336,0,21504,0,0,0,0,25600,6144,0,0,5120,4096,0,54272,0,23552,0,0,4096,64512,2048,0,0,34816,0,0,6144,8192,10240,0,31744,48128,0,0,10240,236544 geoip-db-digest A27BE984989AB31C50D0861C7106B17A7EEC3756 dirreq-stats-end 2012-06-07 06:33:46 (86400 s) dirreq-v3-ips dirreq-v2-ips dirreq-v3-reqs dirreq-v2-reqs dirreq-v3-resp ok=72,not-enough-sigs=0,unavailable=0,not-found=0,not-modified=0,busy=0 dirreq-v2-resp ok=0,unavailable=0,not-found=0,not-modified=0,busy=0 dirreq-v3-direct-dl complete=0,timeout=0,running=0 dirreq-v2-direct-dl complete=0,timeout=0,running=0 dirreq-v3-tunneled-dl complete=68,timeout=4,running=0,min=2626,d1=7795,d2=14369,q1=18695,d3=29117,d4=52562,md=70626,d6=102271,d7=164175,q3=181522,d8=271682,d9=563791,max=32136142 dirreq-v2-tunneled-dl complete=0,timeout=0,running=0 bridge-stats-end 2012-06-07 06:33:53 (86400 s) bridge-ips cn=16,ir=16,sy=16,us=16,??=8,bn=8,br=8,by=8,cu=8,dk=8,dz=8,es=8,lb=8,ph=8,sd=8,tw=8 router-digest 00A2AECCEAD3FEE033CFE29893387143146728EC stem-1.7.1/test/unit/descriptor/data/bridge_extrainfo_descriptor_with_ed255190000664000175000017500000000243313157571677030071 0ustar atagaratagar00000000000000@type bridge-extra-info 1.3 extra-info Unnamed B8AB331047F1C1637EFE07FB1B94CCC0FE0ABFFA master-key-ed25519 VigmhxML9uw8CT1XeGqZ8KLMhKk6AOKnChQt24usBbI published 2015-08-21 16:08:15 write-history 2015-08-21 12:51:16 (14400 s) 2371584,40206336,45142016,8745984,6049792,1072128 read-history 2015-08-21 12:51:16 (14400 s) 5175296,43838464,50509824,13580288,8732672,4001792 dirreq-write-history 2015-08-21 12:51:16 (14400 s) 1630208,565248,29696,28672,1993728,581632 dirreq-read-history 2015-08-21 12:51:16 (14400 s) 1024,3072,5120,4096,285696,11264 geoip-db-digest 6882B8663F74C23E26E3C2274C24CAB2E82D67A2 geoip6-db-digest F063BD5247EB9829E6B9E586393D7036656DAF44 dirreq-stats-end 2015-08-21 12:51:16 (86400 s) dirreq-v3-ips ie=8,in=8,kz=8,nl=8,qa=8 dirreq-v3-reqs ie=8,in=8,kz=8,nl=8,qa=8 dirreq-v3-resp ok=8,not-enough-sigs=0,unavailable=0,not-found=0,not-modified=0,busy=0 dirreq-v3-direct-dl complete=0,timeout=0,running=0 dirreq-v3-tunneled-dl complete=4,timeout=4,running=0 transport scramblesuit transport obfs3 transport obfs4 bridge-stats-end 2015-08-21 12:51:21 (86400 s) bridge-ips ie=8,in=8,kz=8,nl=8,qa=8 bridge-ip-versions v4=8,v6=0 bridge-ip-transports =8,obfs3=8,obfs4=8 router-digest-sha256 7DSOQz9eGgjDX6GT7qcrVViK8yqJD4aoEnuhdAgYtgA router-digest 3DBE6840376F3EC277002396832788DB2FB38393 stem-1.7.1/test/unit/descriptor/data/non-ascii_descriptor0000664000175000017500000000230013157571677024316 0ustar atagaratagar00000000000000@type server-descriptor 1.0 router Coruscant 88.182.161.122 9001 0 9030 platform Tor 0.2.3.25 on Linux opt protocols Link 1 2 Circuit 1 published 2013-05-18 11:16:19 opt fingerprint 0B98 2154 5C48 E496 AEED 9ECC 0DB5 06C4 9FF8 158D uptime 259738 bandwidth 102400 204800 122818 opt extra-info-digest 56403D838DE152421CD401B8E57DAD4483A3D56B onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAK+rjPilZJVzvWn6slOpak4eUab+VXiGNkRAIKgGAqbpex7lNMcZeXbu 8uYhiDUdjRaHQUbBjLaj6nAjtlHUl3NCbIpo2p03KEcxfAGi3k6dUMBJ7aIYb8lL SDK95huLBpyyNPikeDIiTKS1HNtmrai/iVtUiJS2I4fs3lP1TxevAgMBAAE= -----END RSA PUBLIC KEY----- signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBANGDDMHoCtTeL4UTEGip4T+37jd4lEjBgla7lgL8W1gtVTX/uMMo+HGE m1sD/FgBI3w8w7zpZlJgYeB/94YPUrw11iAEYAooJVmGDmel2g6CFofDs7KmrzqR 1FQDIWeY9sQd4+L+jWMquqcA3FyzuZz28gi56hIombjkfr0RwCsNAgMBAAE= -----END RSA PUBLIC KEY----- opt hidden-service-dir contact 1024D/04D2E818 Lénaïc Huard reject *:* router-signature -----BEGIN SIGNATURE----- hk4jKRtI0LbjYWdGhjTuev9Hk9AilyBmBtK9nfpBPyamQZDZVirEUuP7PdtxM2U9 EdCg+KnkrLoKoxh18YumBD2HvwHa2J1VZtezWkwxGB+HPkECTU/byl+dn6ZRncY7 r0IrVeGUnlK/UaWpswx6amH7FEKXmBZYHxTxyuwwybQ= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/cached-microdescs0000664000175000017500000000201413157571677023542 0ustar atagaratagar00000000000000@last-listed 2013-02-24 00:18:36 onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAMhPQtZPaxP3ukybV5LfofKQr20/ljpRk0e9IlGWWMSTkfVvBcHsa6IM H2KE6s4uuPHp7FqhakXAzJbODobnPHY8l1E4efyrqMQZXEQk2IMhgSNtG6YqUrVF CxdSKSSy0mmcBe2TOyQsahlGZ9Pudxfnrey7KcfqnArEOqNH09RpAgMBAAE= -----END RSA PUBLIC KEY----- @last-listed 2013-02-24 00:18:37 onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBALCOxZdpMI2WO496njSQ2M7b4IgAGATqpJmH3So7lXOa25sK6o7JipgP qQE83K/t/xsMIpxQ/hHkft3G78HkeXXFc9lVUzH0HmHwYEu0M+PMVULSkG36MfEl 7WeSZzaG+Tlnh9OySAzVyTsv1ZJsTQFHH9V8wuM0GOMo9X8DFC+NAgMBAAE= -----END RSA PUBLIC KEY----- ntor-onion-key r5572HzD+PMPBbXlZwBhsm6YEbxnYgis8vhZ1jmdI2k= family $6141629FA0D15A6AEAEF3A1BEB76E64C767B3174 @last-listed 2013-02-24 00:18:36 onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAOWFQHxO+5kGuhwPUX5jB7wJCrTbSU0fZwolNV1t9UaDdjGDvIjIhdit y2sMbyd9K8lbQO7x9rQjNst5ZicuaSOs854XQddSjm++vMdjYbOcVMqnKGSztvpd w/1LVWFfhcBnsGi4JMGbmP+KUZG9A8kI9deSyJhfi35jA7UepiHHAgMBAAE= -----END RSA PUBLIC KEY----- a [2001:6b0:7:125::242]:9001 p accept 80,443 stem-1.7.1/test/unit/descriptor/data/metrics_server_desc_multiple0000664000175000017500000000531413157571677026155 0ustar atagaratagar00000000000000@type server-descriptor 1.0 router anonion 31.54.58.167 443 0 0 platform Tor 0.2.3.22-rc on Windows XP opt protocols Link 1 2 Circuit 1 published 2012-09-17 07:28:01 opt fingerprint 9A5E C5BB 8665 17E5 3962 AF4D 3E77 6536 694B 069E uptime 0 bandwidth 8388608 8388608 442368 opt extra-info-digest 0DED759EDA005BFD735E91D3E2DBF22D2D685F12 onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAM+vu//ysOgcbCwri0RnunH8xNwswnTPbbusad7im2lXJuPjMbTFlkcn 3yPxbL1aD3p/PHPfLKOOPcFDVlCma/N8tJ6CEeJn6pZcrvgsU/d1EASQyrhpXFgL oH/+zfg4ir52dZp4gS03P16i9m4HB4YTewo62cIuZoZKq1smReMzAgMBAAE= -----END RSA PUBLIC KEY----- signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBALSrtq1TqL5TImtctKm/5CvZHb54n5JpkmD8jtmdajgpHF0eaSaaw/Qw IKaoQn17etuGzbeXF1vgphv2T4xyIm04MiLOszbLGXK1Fsa5uAO+qs1bIy6mLpwg XrYhyuddYyw1s4U5ZNBNK/0rlwo7hoIZjxcej0AvTGewFx+Rv6UlAgMBAAE= -----END RSA PUBLIC KEY----- opt hidden-service-dir contact anonion at nym dot hush dot com reject 0.0.0.0/8:* reject 169.254.0.0/16:* reject 127.0.0.0/8:* reject 192.168.0.0/16:* reject 10.0.0.0/8:* reject 172.16.0.0/12:* reject 31.54.58.167:* accept *:53 accept *:80 accept *:443 accept *:3128 accept *:8080 accept *:8000 accept *:50 accept *:51 accept *:389 accept *:636 accept *:2123 accept *:2152 accept *:11370 accept *:11371 accept *:2301 accept *:2381 accept *:6518 accept *:9100 accept *:1433 accept *:1434 accept *:3389 accept *:5901 reject *:* router-signature -----BEGIN SIGNATURE----- XzcWkD6QV6CHtcdKuM6mVGGl+m9JsmLtYhpPMxRANxbRLMLaI1+XkO58QS0zvl6f 0vhmifJhJSu+FV+mOkg/aCsPyleSMd8vLOjCzhVv0yCzcn252ujsjGc0HrmyPE1R p2bQE2u2SpgLKw6oylyr6qLcZkGIWDYhnnyZTg2lXm8= -----END SIGNATURE----- router Unnamed 122.60.235.157 9001 0 0 platform Tor 0.2.2.37 (git-fce6eb1c44e87bc2) on Darwin x86_64 opt protocols Link 1 2 Circuit 1 published 2012-09-17 14:57:28 opt fingerprint 5366 F1D1 9875 9F88 94EA 6E5F F768 C667 F59A FD24 uptime 542717 bandwidth 32768 65536 58012 opt extra-info-digest 33C8C462BFA5A9C6E825A0A717BD63072AB68E59 onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAKCt4oloDEzaHKzuljXGIJujbTbQfl/XZPjc/84eWp8Ka2Vmpa9DL3cV +bO3wttgA6ZtkGUB6d6AHcfOoRT7tP/wBeQSHSDxh9OmKzGKZiHB76HNxVny8aJd ngVPgMmolXajdnzCIAIRLdUW6SHvIinyeghLuVSwLZU+eEN5XSXrAgMBAAE= -----END RSA PUBLIC KEY----- signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAJ5avJflNjXZjGukC0aACUeTMHsQEHsQKCFPwXFVBCX6gDmrfivqT+EB efT8XTktk44EFJbCAWj65kuj+aoXBfUvrr21at4WAEJ33BgmitwCrzwkKWVX/wLM +NMIGObvs88HYyaTsoyZ/TToLE5nPQJj77bNyabHgNvYEXyFxooJAgMBAAE= -----END RSA PUBLIC KEY----- opt hidden-service-dir reject *:* router-signature -----BEGIN SIGNATURE----- m0Q/dr4HvyGShKG8DdKyabcTO4lZtGMXNGX+TEM1D43+5mw4D5UgiIdaK9a2tMQA sBGFCymv3ZHpmPRtOhSMRafwcZDYXeCSdvZXmfGzpyIRrBde3uRIJj97eqA+oOHd 5TlnK2Z0tF+M1bUD0xYHOde5a/lAaiQaw5+mley6i6M= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/extrainfo_bridge_descriptor_multiple0000664000175000017500000001136313157571677027675 0ustar atagaratagar00000000000000@type bridge-extra-info 1.2 extra-info default 909B07DB17E21D263C55794AB815BF1DB195FDD9 published 2015-03-20 10:49:48 router-digest 560269C81DEC146D94399FF5E95505A6DE591F3C @type bridge-extra-info 1.2 extra-info AndreasBaader 7F7798A3CBB0F643B1CFCE3FD4F2B7C553764498 published 2015-03-20 10:52:01 write-history 2015-03-20 10:37:14 (900 s) 7168,24576,89088,14336,9216,9216,215040,62464,5120,10240,4096,10240,7168,45056,79872,7317504,566272,3484672,1227776,19456,92160,9216,11264,176128,17408,58368,46080,7168,10240,15360,8192,17408,115712,8268800,5313536,4535296,4857856,4766720,2446336,4061184,17056768,12321792,9737216,4689920,41984,128000,10240,9216,75776,3697664,8046592,3249152,3329024,15947776,30720,5165056,11705344,10077184,2409472,1417216,944128,3110912,558080,14336,9216,63488,10240,70656,15360,72704,14336,6144,11264,8192,225280,40960,15360,8192,13312,7168,44032,11264,7168,94208,10240,5120,21504,38912,39936,71680,11264,5120,49152,15360,114688,17408 read-history 2015-03-20 10:37:14 (900 s) 8192,26624,896000,26624,12288,12288,2320384,107520,4096,12288,5120,11264,6144,644096,907264,7287808,723968,3475456,1826816,17408,914432,14336,13312,2001920,54272,663552,657408,9216,17408,24576,15360,19456,966656,8250368,5293056,4518912,6098944,5287936,2457600,4047872,17041408,12282880,9706496,4666368,683008,1456128,19456,10240,1010688,3686400,8024064,3246080,5412864,15894528,31744,5157888,12541952,11269120,2410496,1417216,947200,3341312,557056,11264,9216,874496,12288,1241088,16384,935936,13312,6144,11264,11264,2270208,279552,26624,12288,21504,8192,628736,13312,10240,1213440,8192,7168,21504,626688,635904,905216,8192,8192,649216,18432,1274880,40960 dirreq-write-history 2015-03-20 01:52:14 (900 s) 1024,0,0,0,0,0,0,0,0,0,0,0,20480,2048,0,2048,1024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29696,2048,5120,2048,0,0,0,0,0,0,0,0,0,0,0,0,0,1024,1024,4096,0,0,613376,1024,0,0,0,1024,0,0,0,0,0,0,7168,2048,0,1024,2048,0,0,21504,4096,2048,0,3072 dirreq-read-history 2015-03-20 01:52:14 (900 s) 0,0,0,0,0,0,0,0,0,0,0,0,2048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4096,0,2048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4096,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3072,0,0,0,0 geoip-db-digest 9EF0A1874377BFB6413ED3F9EB5504B1DB17BE13 geoip6-db-digest 542D349827A88738A04332DAFF2516A384BCC8FF dirreq-stats-end 2015-03-20 07:52:16 (86400 s) dirreq-v3-ips mx=8 dirreq-v3-reqs mx=8 dirreq-v3-resp ok=8,not-enough-sigs=0,unavailable=0,not-found=0,not-modified=0,busy=0 dirreq-v3-direct-dl complete=0,timeout=0,running=0 dirreq-v3-tunneled-dl complete=4,timeout=0,running=0 transport obfs3 bridge-stats-end 2015-03-20 07:52:22 (86400 s) bridge-ips ??=8,mx=8 bridge-ip-versions v4=8,v6=8 bridge-ip-transports =8,obfs3=8 router-digest A493F46D74014938951862D30A71C59E652AEBE7 @type bridge-extra-info 1.2 extra-info UlrikeMeinhof B4869206C1EEA4A090FE614155BD6942701F80F1 published 2015-03-20 10:54:03 write-history 2015-03-20 10:40:27 (14400 s) 440320,487424,483328,495616,435200,1073152 read-history 2015-03-20 10:40:27 (14400 s) 5354496,5104640,4907008,4946944,4852736,6280192 geoip-db-digest C1EB5237F2FBAF63381D8551157F13D12EFCCA25 geoip6-db-digest 1F99B6B0EC78E9DB34D61AE7E0FC261D558E8E5D dirreq-stats-end 2015-03-20 07:55:27 (86400 s) dirreq-v3-ips dirreq-v3-reqs dirreq-v3-resp ok=0,not-enough-sigs=0,unavailable=0,not-found=0,not-modified=0,busy=0 dirreq-v3-direct-dl complete=0,timeout=0,running=0 dirreq-v3-tunneled-dl complete=0,timeout=0,running=0 transport obfs3 bridge-stats-end 2015-03-20 07:55:31 (86400 s) bridge-ips bridge-ip-versions v4=0,v6=0 bridge-ip-transports router-digest 2BEA3A5A03D1125617892D5A4E69A1BFDAE07AB6 @type bridge-extra-info 1.2 extra-info Unnamed C18896EB6274DC8123491FAE1DD17E1769C54C4F published 2015-03-20 10:55:41 write-history 2015-03-20 10:52:59 (900 s) 1520640,17408,24576,19456,11264,5120,130048,25600,20480,14336,11264,100352,12288 read-history 2015-03-20 10:52:59 (900 s) 7316480,16384,24576,23552,11264,4096,2151424,33792,23552,13312,12288,1253376,8192 router-digest 5D531EB5BC5B4D887B6AE1CFE8B20D61E9E4C43D @type bridge-extra-info 1.2 extra-info default 478B4CB438302981DE9AAF246F48DBE57F69050A published 2015-03-20 10:56:17 write-history 2015-03-20 10:54:10 (900 s) 1387520 read-history 2015-03-20 10:54:10 (900 s) 7402496 router-digest 132180906EAF02DD018CBD939AFE56236B2D3218 @type bridge-extra-info 1.2 extra-info Unnamed 25D9D52A0350B42E69C8AB7CE945DB1CA38DA0CF published 2015-03-20 10:59:53 write-history 2015-03-20 10:51:53 (900 s) 1398784,70656,20480,21504,9216,7168,55296,35840,104448,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 read-history 2015-03-20 10:51:53 (900 s) 8119296,885760,26624,32768,18432,16384,1226752,60416,1311744,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 router-digest 1AA6F27BB6A55EE97FF8C22D8BC2026A437BC1EF stem-1.7.1/test/unit/descriptor/data/metrics_vote0000664000175000017500000001002013157571677022701 0ustar atagaratagar00000000000000@type network-status-vote-3 1.0 network-status-version 3 vote-status vote consensus-methods 1 2 3 4 5 6 7 8 9 10 11 12 published 2012-07-11 23:50:01 valid-after 2012-07-12 00:00:00 fresh-until 2012-07-12 01:00:00 valid-until 2012-07-12 03:00:00 voting-delay 300 300 client-versions 0.2.2.35,0.2.2.36,0.2.2.37,0.2.3.10-alpha,0.2.3.11-alpha,0.2.3.12-alpha,0.2.3.13-alpha,0.2.3.14-alpha,0.2.3.15-alpha,0.2.3.16-alpha,0.2.3.17-beta,0.2.3.18-rc,0.2.3.19-rc server-versions 0.2.2.35,0.2.2.36,0.2.2.37,0.2.3.10-alpha,0.2.3.11-alpha,0.2.3.12-alpha,0.2.3.13-alpha,0.2.3.14-alpha,0.2.3.15-alpha,0.2.3.16-alpha,0.2.3.17-beta,0.2.3.18-rc,0.2.3.19-rc known-flags Authority BadExit Exit Fast Guard HSDir Named Running Stable Unnamed V2Dir Valid params CircuitPriorityHalflifeMsec=30000 bwauthpid=1 dir-source tor26 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 86.59.21.38 86.59.21.38 80 443 contact Peter Palfrader dir-key-certificate-version 3 fingerprint 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 dir-key-published 2012-04-29 21:21:25 dir-key-expires 2013-05-29 21:21:25 dir-identity-key -----BEGIN RSA PUBLIC KEY----- MIIBigKCAYEA7cZXvDRxfjDYtr9/9UsQ852+6cmHMr8VVh8GkLwbq3RzqjkULwQ2 R9mFvG4FnqMcMKXi62rYYA3fZL1afhT804cpvyp/D3dPM8QxW88fafFAgIFP4LiD 0JYjnF8cva5qZ0nzlWnMXLb32IXSvsGSE2FRyAV0YN9a6k967LSgCfUnZ+IKMezW 1vhL9YK4QIfsDowgtVsavg63GzGmA7JvZmn77+/J5wKz11vGr7Wttf8XABbH2taX O9j/KGBOX2OKhoF3mXfZSmUO2dV9NMwtkJ7zD///Ny6sfApWV6kVP4O9TdG3bAsl +fHCoCKgF/jAAWzh6VckQTOPzQZaH5aMWfXrDlzFWg17MjonI+bBTD2Ex2pHczzJ bN7coDMRH2SuOXv8wFf27KdUxZ/GcrXSRGzlRLygxqlripUanjVGN2JvrVQVr0kz pjNjiZl2z8ZyZ5d4zQuBi074JPGgx62xAstP37v1mPw14sIWfLgY16ewYuS5bCxV lyS28jsPht9VAgMBAAE= -----END RSA PUBLIC KEY----- dir-signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBANROlyEQEWJ20RC+DogV0Ww8mrUw9viscZ7eqAkyhDZKIt++2kVXszUI Zd2NoWG025f3np4zlTuIkz2PShn1yAYmKBlRcwbexgR6dXBToL3Zxe1Mezig/UuL kX75imfneBiLdtCRzaZs/Fa5cwd3msUNPVsq5Zmk0R7rCmBqiLDbAgMBAAE= -----END RSA PUBLIC KEY----- dir-key-crosscert -----BEGIN ID SIGNATURE----- UuK7wNT0weVelnsMYgoj2apYzr5pJqaI7pM+IzWiSGq1NipqMDEwZqx0WVWR/izB kLQm1mxU0+84QxAtNNmwNo5uHXR1h2fZJQ2yHf8JLIjIEsaOeOfvDLkn9IyHwmIA OBPgHmAetivVUYc8lqejBO5l4xg8BpG7KK16yjTDflc= -----END ID SIGNATURE----- dir-key-certification -----BEGIN SIGNATURE----- t5PLDPgT2TJiM8fNmqXkXY0rK6u5LZEtMNqQ4BCQCrvUN87BPBpF4U0GptqVjmdK aKS0v6BMRBbSQhyro42jv8iaP8X57V39rJAEbQsWJVNnhBmgLPxY9LYS/he8dUPZ 0LuNjNuBaekvUoPr6iunHGYUjVMZa3aOf+SeUxdS4ZudlozegDyBrkMeEVH/7DC/ dx/VsqR5hIZ8/e+u3XQcSIYCmBbJxPNeOWNERi4npbyY0Iy2AJ1eJyX2onUsk2Qq jnMxPtuCSDAWEebChwtKTTV6EAnZzYcCZLxNLXcd4Tvfm2EgSw8xKtiDn+eABpcv 7FaKEkuUBGLe+sN3jt3K05qOAOvVtCi0hSO/94+DO7PiXFxmb6Om6vEbKiGxagH2 3jE6rNpJJsO0TspO3KTD7fpXJU7gtXIurcQwziXUGchK84aNFjdX/G1ra5M5kMHf hJt6p7rCqPyEVOwW+DIGVfucLfjtJu/h7XuWw9/htrE0TNx0Hah8V2+7Ok5XA10N -----END SIGNATURE----- r sumkledi ABPSI4nNUNC3hKPkBhyzHozozrU B5n4BiALAF8B5AqafxohyYiuj7E 2012-07-11 04:22:53 178.218.213.229 80 0 s Exit Named Valid opt v Tor 0.2.2.35 w Bandwidth=51 p accept 80,443 m 8,9,10,11,12 sha256=g1vx9si329muxV3tquWIXXySNOIwRGMeAESKs/v4DWs r Unnamed AEXri4INxBAZeyi0wvJZoC58nZs csTseFzwBV0RLsEdlyxDw6jTZ1o 2012-07-11 10:47:26 79.139.135.90 443 22 s Fast HSDir Running V2Dir Valid opt v Tor 0.2.2.37 w Bandwidth=92 p reject 1-65535 m 8,9,10,11,12 sha256=iZfmvEGdBG/qc9KYZUh4JsWEHbn9Bw2jy5i0AtCoRB0 r default AFU4pMWKyq+eTPuBO0D9W179kQQ OZzEaq9N5+VX5yxzi051zqyEcPk 2012-07-11 08:17:21 2.90.115.167 443 9030 s V2Dir Valid opt v Tor 0.2.3.15-alpha w Bandwidth=53 p reject 1-65535 m 8,9,10,11,12 sha256=m/RouK3TqoaYBBHCxgmzMPuGGCIEr0ufSTB1i85zicM r satoshi11 AFzRyEo3Ibdko7vl4rReoU3BDfM rWaYhhU9Kym4sXAVe+uE99VGpJs 2012-07-11 08:10:01 80.218.153.44 443 9030 s V2Dir Valid opt v Tor 0.2.2.35 w Bandwidth=196 p reject 1-65535 m 8,9,10,11,12 sha256=yxuOPz7IraIzzmU/qeZRJHOJrutNmvPwDwj2AmsHZSI directory-footer directory-signature 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 BF112F1C6D5543CFD0A32215ACABD4197B5279AD -----BEGIN SIGNATURE----- 02UCTf06pLYkuLgUSR+L0vHOJ7gUyidKscg88q8TWUAiP57x27o+BlZdEMSu/ArT yBOz+0ZOWggb04maA2cwJQQEK2LkzxzBijmfoC6RhQx3wS8llhyOMaoR6rkobE1D oLqVZPDNPX87DkhmQfgBM2I3vYQX13YJwZc0jNCEGpU= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/negative_uptime0000664000175000017500000000615613157571677023402 0ustar atagaratagar00000000000000@type server-descriptor 1.0 router TipTor 62.99.247.83 9001 0 9030 platform Tor 0.1.1.25 on Darwin Power Macintosh published 2006-12-18 22:42:40 opt fingerprint 1379 62D4 931D BF08 A24E 8432 88B8 A155 D6D2 AEDD uptime -31081285 bandwidth 102400 153600 124131 onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAOAG0OI7xLpz3gAkJoJdRzKYOvOZ7PL5dQQZJGw+pXVUnXfchwTXLm5o rAoYolziFjUU+EDaDXCHq1MrQBNbT1kQHqv+OcVjTwuameNVOCgPTIDOxiXfxxoO zDAEQ91gzcDIBZdV9V64KV8Oz4+NYK3zrGDkIg00pAQjNuwvmZqlAgMBAAE= -----END RSA PUBLIC KEY----- signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAKjCkU3eAwbW9ZU42B1l+Itqy4yKoQpRjt6N42mfNFfKZ8Ywd789/jiK J31QYBhW3JBn1ZFkRwpfKYlbOm0XS2CjlqHuT0Ycp9iphtCIHADIM+3shaSKAIwA 8/wQ2GN9zYiTneUNWRJN5sDja+oU7XfkRI46cpV1Y1lVJyEoKQWpAgMBAAE= -----END RSA PUBLIC KEY----- opt write-history 2006-12-18 22:36:20 (900 s) 85896196,91917257,89966503,91506428,91213104,88921400,91039183,91716023,91147326,86173405,88624130,87211145,90976203,91765274,91904016,92475836,91436900,91811938,86244782,91228827,91939844,89829330,89107239,89019495,88925780,91247327,90406742,91088221,91065780,91770795,91408136,89981571,88663478,91555300,91664187,91916304,92079918,87826691,87836934,91162457,91904383,91508890,90270067,91314943,91856008,84648838,86133485,81010341,78078954,85039584,91951911,91327645,92042781,87120087,76812012,87759151,91627062,91881873,91965911,91523086,86332304,86299595,90915708,89321373,91093137,91654532,91836129,91819440,92049427,92014514,89481483,91098381,88852717,91601581,89729803,91256453,89604862,91881660,91942891,91769572,91896895,92224718,91431715,91762404,91709273,92046002,91866341,91561459,91673622,91700186,91659511,92402879,90926431,87060230,91076389,89573325 opt read-history 2006-12-18 22:36:20 (900 s) 69091643,77959428,74322746,75132861,74637737,68249949,73224421,72744339,73893094,69049631,71480325,68334060,72775510,79560093,78273066,75799097,76810596,78186192,67593073,75998559,77654399,70612520,74383546,74734217,74966593,75402221,80000519,80112418,79005070,80831698,76082779,73232671,71056247,75135941,71903141,78060009,79742551,70250313,66205769,78319432,73988994,74372922,71546410,73545171,74220510,63051559,66646384,68538308,59360208,63812166,75673274,72347320,76357687,66600939,56487705,70648976,70968064,74698003,75944759,74122368,67485399,63305556,68515366,71145401,69625041,68993028,71537081,75025172,75155755,70871549,69489568,74027234,72162369,74396503,76005043,72708060,70567406,73291632,75536033,73865170,69322880,73918987,72020474,76681275,76604577,77208720,75252120,75305805,76861569,77278013,77057424,76937746,72642470,65754315,70138397,73236479 contact rbr@tip-informatik.at reject 0.0.0.0/8:* reject 169.254.0.0/16:* reject 127.0.0.0/8:* reject 192.168.0.0/16:* reject 10.0.0.0/8:* reject 172.16.0.0/12:* reject *:25 reject *:119 reject *:135-139 reject *:445 reject *:465 reject *:587 reject *:1214 reject *:4661-4666 reject *:6346-6429 reject *:6699 reject *:6881-6999 accept *:* router-signature -----BEGIN SIGNATURE----- XAy56NzQm+LGMnaxBZC0ulmyZxoTNTFxZN0834V/hrfBdEOwMuBZMSsS613OfRK1 3K/StL29NdLChHt71XCPyxsnbzguBE0Pma6cX4aSNa1WJO4wpc1WipmWdmuVKXHD RoxIVSJU3qwfjzSbwJiNSLPs4mmQFecsVmG94cZSITY= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/descriptor_archive.tar.gz0000664000175000017500000000547213157571677025300 0ustar atagaratagar00000000000000‹Ó}¶OíZYÓâ¸Ùík~…/ú"ŠF’µNUª>¯l/ûò7)Û`¼°ýúÈ=5i¿™îLϤ§çKŇ,éÑæGztŽÁóÓMž³8ù»“lváÕo‚&j´Q!ôTq¨!À9pɆ“@Ý@AU¬‚6ï¾@‚b\|CF@ù»¦¼ƒ2‡`F)¦ï‚TeïðU­ÿ‡ÈÓÌIå“9['ù²Ý¯•ÿ—âÿ²ÇÙWR?¹úIÃûçbPàPKâ<óE;呟A ñó³*Q0V pP;,ˆ““2“ÕÀ$_*Vþ² ³F|èû‚;´†€ýU‰#å%Œò»rçôï×âs¦œ“8‹7ñ1-Š Tb„É&3Öι{ Óï)@Ôj ˆýþT=£­Ÿœ“0Êš\Q-)¦° Âu )LSU#n+ܰ5EDU(£B±µüœ…'_A*ªà5׉¼[èe;Ì £ÈŽƒÉ+N! ~ìÖ¿g‰Ó£ nxáÖO3ņ0-"¸¦™Œ«sƒBN„[†i3•ÚV-ŽÂ8jüG­Q@·Z2™jÊh®¿t ¥g­>ÔúVW‹[ºöb ÔK¹oƒñý×Ó[| Æá<ö—µï‘ß]yíWý¾=¯0XüºíðÚÑLÐò†F‹¶±ÛžæG|·–6Œ2:7:1×í ½è÷&«stºÓ!<énÌÜ··f>ªÙÓ£»4wãþ«kϸ{uwÇ™õ¯G9¸‰.ݦ¾Ö&–çÏöÇî#½¬"OÛöuM³þöÓì¬ùÙ¹¥á6’žûM·a0lÖJšíSüXhîvdÀá|¢‹ÑrÒŒæã‘çúÚ"15Èì¥{|h³8›ÔDô„ð:ZD¼ †æ2‰ØÊr.÷•¹Ÿö¯Îf³=_íûöpöÖsš†+ýe•Þ[KÇ|¤5lGc-¼#kíX½8ÂY>ïµötÿ²Ù·ÉB?„÷~]î…wð(VýSôu·!pNáñ¡¼†¥¶-a˜éTµ4ΩàPÕmjk:31ÁÀ€Ê{h›3‹ÛThBgØ Ó€TCDckº°©òža['–­Q SÓ€¹ M‰i `QÍ”†´d2$›Ü” ÚØjFL£ŒØ„!$Í•÷#²_®ê2“j:Ô¡& ˶™‰LY˜ÕÒ•÷&²UfËàΑT9Ìg¶I ³(ºŠ-Íæ)ï- ›„iÚÅi ”‡aLnT êŒc,· ––ÄR-¡a†d]¦[‚r¤sj ¤bêØ`Ŷµì;tzž5ŠØn|¹K“Ú&Ž2g“)2Â5ïFE@*‚×ÑOSänqr‹R‰E¦j‰¿÷¥5øðñÕä?þðs¤â"øc6¤¥|Ä>c,ÐHù/?×0+l2Eå&J±WfË5ëË)þð# ¤~JâÒ5)]3ÑàðS’óOׂR¢Ü¸Ôr¹SÜÀ””úÂjƒà’9¡å‘pV  ¥¥Q±RPC€R‹¢<ÁECˆ²¹ å)•G*Ï•«AÊe¬|/!/ÏŽòãm-²X9K™%JSTU^š£J(» Á7wµ|Ó)YX®GävlȲ¹(Ï„J4䛕³˜(§D©Œƒre™âåSÆYC~” Þ, ÎËeÃrJ¢tÁ›^ RÉ^ï?Kÿ#ýh…“å‰_>&¦Ö@›Í'ÖOQt_tÝ„ê~ÆçÓ1Òâµ:d{¦º‡è²Ç¯ÙÅØuçwwê¸gèvgîl7“6¾4—}ÔNƒ;ךjxn¦íú6²–rÖ];jÒÝÛìzÍ㹞×sDí=¶í%æ‚ݦ{;8°UmsiáÝa~ £8›î1T»önîºÔ}6·Ãá)¾ÎaœÍ¼{+ÿ2?ÿy¿äÿ°é6¡ë2Á7މdÔž Ü<%e¾ïˈ¬úÂÃÎWõñ«üŸ²OüŸÉÿe8¯øÿwÁ×óÿ7¡?‰ÿC y¤Èøñ þm©J,KeŠ(S€*%Ç1"5Ö»P¶bZœþ“ÿ#ÉSdlÿ÷ü_@!¾úþ/Ô‚€H."5‚*•€‰…mÝÒT`SÉéLL9ó÷ð{·ôtšu»7ò$‡Ûd·Þ¯²ø‘vœ×+iiâ4‰žÄp:bÛ<´Ñl=¥Í';מÖ2ÉRÓ£“çt6Yêža»ËÛ5ÃAörÉÖûºê?[ŽŸ{0ضÏ*{M/ñ±n¬“³s‚µÅx¶_õçËÖù8w·Ì|íöÖõ´Íz¼@çC7ÔìÓ ]¼¦ñ,·sšýqüQ[ÅÝù9{Ê{Ɔ§ô¾k]9íƒÀŽmkÖ뿘^~‚G¯-<Ú®i=\Ÿ„~*Ô×{«³¶ï³ ѧNkÓ ÎËÙŠðÃj âæ0žë¹³çñ–ìÍiêäÎLR»'îI<šý¬¹1N‚Ïðr5^N0± o³ÙÜOIú«øßw»éóÑŒîÿëü¿Ðâ…/”x!Ä ^ÈðB…"¼Ðà…¯”Â¥p¥*¥P)…7ûR¨i€;y~‡ÿ¥œ«ü_¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡Â¯áZ©ÜšPstem-1.7.1/test/unit/descriptor/data/cached-certs0000664000175000017500000001065013157571677022534 0ustar atagaratagar00000000000000dir-key-certificate-version 3 dir-address 127.0.0.1:7000 fingerprint BCB380A633592C218757BEE11E630511A485658A dir-key-published 2017-05-25 04:45:52 dir-key-expires 2018-05-25 04:45:52 dir-identity-key -----BEGIN RSA PUBLIC KEY----- MIIBigKCAYEAxfTHG1b3Sxe8n3JQ/nIk4+1/chj7+jAyLLK+WrEBiP1vnDxTXMuo x26ntWEjOaxjtKB12k5wMQW94/KvE754Gn98uQRFBHqLkrS4hUnn4/MqiBQVd2y3 UtE6KDSRhJZ5LfFH+dCKwu5+695PyJp/pfCUSOyPj0HQbFOnAOqdHPok8dtdfsy0 LaI7ycpzqAalzgrlwFP5KwwLtL+VapUGN4QOZlIXgL4W5e7OAG42lZhHt0b7/zdt oIegZM1y8tK2l75ijqsvbetddQcFlnVaYzNwlQAUIZuxJOGfnPfTo+WrjCgrK2ur ed5NiQMrEbZn5uCUscs+xLlKl4uKW0XXo1EIL45yBrVbmlP6V3/9diTHk64W9+m8 2G4ToDyH8J7LvnYPsmD0cCaQEceebxYVlmmwgqdORH/ixbeGF7JalTwtWBQYo2r0 VZAqjRwxR9dri6m1MIpzmzWmrbXghZ1IzJEL1rpB0okA/bE8AUGRx61eKnbI415O PmO06JMpvkxxAgMBAAE= -----END RSA PUBLIC KEY----- dir-signing-key -----BEGIN RSA PUBLIC KEY----- MIIBCgKCAQEAvzugxJl1gc7BgXarBO5IWejNZC30U1xVjZ/myQTzxtiKkPU0agQh sPqn4vVsaW6ZnWjJ2pSOq0/jg8WgFyGHGQ9cG8tv2TlpObeb/tI7iANxWx+MXJAh /CnFDBQ1ifKntJrs2IcRKMivfobqaHAL3Pz93noLWOTQunWjZ8D6kovYvUXe+yUQ tZEROrmXJx7ZIIJF6BNKYBTc+iEkYtkWlJVs0my7yP/bbS075QyBsr6CfT+O2yU4 mgIg43QuqcFRbjyUvGI/gap06QNlB6yj8pqeE5rWo++5EpEvMK76fK6ymYuTN2SN Oil+Fo7qgG8UP/fv0GelSz6Tk7pBoeHJlQIDAQAB -----END RSA PUBLIC KEY----- dir-key-crosscert -----BEGIN ID SIGNATURE----- Oz+rvXDzlxLgQSb3nS5/4hrHVWgGCy0OnuNmFsyw8bi2eBst5Yj79dQ+D25giZke 81FRGIFU4eS6dshB+pJ+z0hc9ozlRTYh/qevY6l6o0amvuhHyk/cQXrh8oYU9Ihe XQ1yVItvxC24HENsoGIGbr5uxc85FOcNs+R9qTLYA/56TjvAU4WUje3nTZE1awml lj/Y6DM7ruMF6UoYJZPTklukZ+XHZg4Z2eE55e/oIaD7bfU/lFWU/alMyTV/J5oT sxaD2XBLBScYiKypUmgrZ50W4ZqsXaYk76ClrudZnDbce+FuugVxok+jKYGjMu75 2es2ucuik7iuO7QPdPIXfg== -----END ID SIGNATURE----- dir-key-certification -----BEGIN SIGNATURE----- I86FTQ5ZyCZUzm19HVAQWByrrRgUmddoRBfNiCj0iTGN3kdIq9OfuNLhWAqz71xP 8Nn0Vun8Uj3/vBq/odIFpnngL3mKI6OEKcNDr0D5hEV9Yjrxe8msMoaUZT+LHzUW 1q3pzxfMx6EmlSilMhuzSsa4YEbXMZzMqASKANSJHo2fzUkzQOpPw2SlWSTIgyqw wAOB6QOvFfP3c0NTwxXrYE/iT+r90wZBuzS+v7r9B94alNAkE1KZQKnq2QTTIznP iF9LWMsZcMHCjoTxszK4jF4MRMN/S4Xl8yQo0/z6FoqBz4RIXzFtJoG/rbXdKfkE nJK9iEhaZbS1IN0o+uIGtvOm2rQSu9gS8merurr5GDSK3szjesPVJuF00mCNgOx4 hAYPN9N8HAL4zGE/l1UM7BGg3L84A0RMpDxnpXePd9mlHLhl4UV2lrkkf8S9Z6fX PPc3r7zKlL/jEGHwz+C7kE88HIvkVnKLLn//40b6HxitHSOCkZ1vtp8YyXae6xnU -----END SIGNATURE----- dir-key-certificate-version 3 dir-address 127.0.0.1:7001 fingerprint 596CD48D61FDA4E868F4AA10FF559917BE3B1A35 dir-key-published 2017-05-25 04:45:58 dir-key-expires 2018-05-25 04:45:58 dir-identity-key -----BEGIN RSA PUBLIC KEY----- MIIBigKCAYEAu+wP/sAA3tcKI5ICHUTs4uwsqSPNcFDalL7VR9/N4dsgsNd5t+4Z 4v1lc/RovxYC0ojLqe9WE+SsB0cpSRBGA4xSQMOKj3zR1gIO7LQmv2IxYruRlkNo CxJglbFQOF7gnOOAALygyPl7T5y6BfAeqI9Y51JeHqrgL+7pxAGJ1hNCux4bsAFx MwNxydBeGS3/yJFp+xJiZl6ocmi9oAmJ4OZmrwKCFTit2Yq5jgbHDkY0OZR6ul8b xCJRKBSl7jGUhLi1MlW0oGQauKnJ3C/N5rP1icvPJbgP5aZVLqSXFFEGTbjDyFiP AjlyCozL/A7evAwo1JtxbtBNVCmzUUItP5kd4+YQnYvmH8fRp17JMxLwWLNe0hSx suljZDdxgCWruTQz8EC73LcExkPQxTb+FUQ3EDm0uGi2A1PUR8+Xtc7fejwov6PN XtrB+VSn8ne1oA6nI2SS6aNpn1MgAdahvfkTn1c9h2UEhTAeGacvmPLS0YRDdGrs 0ZvQF6Y6694tAgMBAAE= -----END RSA PUBLIC KEY----- dir-signing-key -----BEGIN RSA PUBLIC KEY----- MIIBCgKCAQEA19hY+t1GAsR08rQeqMy8/0XkBx6Ho3WN1XAmHvwkWgnIzamgXJge THuTw/uDonGXn69NBpQWb9wVyCQ5gssjJCC4OX4EjeZaaxhtZCph3BxA0xHDMYzu 0j/zlXEpQ3Y/05ZbXcJC/VO9QVywwg3QTiTVRjhyD514UeeOxHHJ8JAm5x3puabt FinwLi3pZBzGisTcfxfpTcZETG47mxzrRTk1KLOU0dvp0UZAdfYQfoecBrWpowCG dt+kuCK+aUVPi+VbJXK4DzhyaU1nFxHCEEDEfAI7jSt0bdvnTTkVZuoE6JvzIsPn 18qLqG64dgiTs/zutg1Je+NRG3fw5bjg3QIDAQAB -----END RSA PUBLIC KEY----- dir-key-crosscert -----BEGIN ID SIGNATURE----- A8uI+g1fqMDwfRe7mILD9uDZXgjWc2PaZHElp21wfC5z/fO7EZHf+oBpMfnFZlpW EgbdIWoxIWAeFiunpUEaGrNGztfXXzmCGJOCkYJS0z6QnbdTPxfARIcQL96NRJ5O xA0xjTzoR57LKnwHSAdq9ZIjMWyJM7yf/PnD4GCU+v+0O3DzhCPt2vE7QVx6h8oU Zkmx2GIoRv1K17B0mYJsMFnJse3aLkZdQoFRpicfWwKHtkpGB0dkuGw+OAdcx5vv Qwb05YiQeAJF3UtPNEcCDR4v5Keia+qQeuJcta9aK2Za/n8LCaB8JrOtDrkMH7EV DuuXUlxdZG65y9QR3jo5Ng== -----END ID SIGNATURE----- dir-key-certification -----BEGIN SIGNATURE----- l9Wa0CUIndYdX3nvMEZPoQX8jWosfNo5lTvA1r1JndNBhpr4D6rR9MmpNiaOzuM/ rcVCMwmekmPVVx2vU168PNX/1yhE0vGEfeRDpiYVXUvboPe2MC9XtUQtQEpmqPrh EnsfqOhUoxe6uemJszEtqUzHFvcSEUIJN+RX1YG/xGUYsNy5wBZpAMcKiEq0J3c/ eCrmKs7o4HL/yPtPGdylsMiIhxLmzB1ZjSOq6OpaMPsiafIG+lu0w3G1JAZftCFQ x+SnFdaxBjeSPlXA8YpIf4SAOx0lSjlcGc+cVUtJcQ2pH01z5s8kMLd7Rei6/Sk7 xWuiMAqmvG+McfG0C9jhkTp8r6O34zgRTq9sVeZNW/4bn/Nt8vPE8IX9StmGSOju XA1DuwMEqH1/b5RN5qxWZlvcguEF4CPOh2KNz4M7gsPyc/57eKuvLUSGDtryG0KQ 0FgHa31RRfaO6rIKZ2z2ksHe+bHJi8SM6S9R1KFtudJX4drqTw+Q5q0JRPsKBcGu -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/data/cached-consensus-v20000664000175000017500000000544313157571677023765 0ustar atagaratagar00000000000000@type network-status-2 1.0 network-status-version 2 dir-source 18.244.0.114 18.244.0.114 80 fingerprint 719BE45DE224B607C53707D0E2143E2D423E74CF contact arma at mit dot edu published 2005-12-16 00:13:46 dir-options Names Versions client-versions 0.0.9rc2,0.0.9rc3,0.0.9rc4-cvs,0.0.9rc4,0.0.9rc5-cvs,0.0.9rc5,0.0.9rc6-cvs,0.0.9rc6,0.0.9rc7-cvs,0.0.9rc7,0.0.9,0.0.9.1,0.0.9.2,0.0.9.3,0.0.9.4,0.0.9.5,0.0.9.6,0.0.9.7,0.0.9.8,0.0.9.9,0.0.9.10,0.1.0.0-alpha-cvs,0.1.0.1-rc,0.1.0.1-rc-cvs,0.1.0.2-rc,0.1.0.2-rc-cvs,0.1.0.3-rc,0.1.0.3-rc-cvs,0.1.0.4-rc,0.1.0.4-rc-cvs,0.1.0.5-rc,0.1.0.5-rc-cvs,0.1.0.6-rc,0.1.0.6-rc-cvs,0.1.0.7-rc,0.1.0.7-rc-cvs,0.1.0.8-rc,0.1.0.8-rc-cvs,0.1.0.9-rc,0.1.0.10,0.1.0.11,0.1.0.12,0.1.0.13,0.1.0.14,0.1.0.15,0.1.0.16,0.1.1.0-alpha-cvs,0.1.1.1-alpha,0.1.1.1-alpha-cvs,0.1.1.2-alpha,0.1.1.2-alpha-cvs,0.1.1.3-alpha,0.1.1.3-alpha-cvs,0.1.1.4-alpha,0.1.1.4-alpha-cvs,0.1.1.5-alpha,0.1.1.5-alpha-cvs,0.1.1.6-alpha,0.1.1.6-alpha-cvs,0.1.1.7-alpha,0.1.1.7-alpha-cvs,0.1.1.8-alpha,0.1.1.8-alpha-cvs,0.1.1.9-alpha,0.1.1.9-alpha-cvs,0.1.1.10-alpha,0.1.1.10-alpha-cvs server-versions 0.0.9rc2,0.0.9rc3,0.0.9rc4-cvs,0.0.9rc4,0.0.9rc5-cvs,0.0.9rc5,0.0.9rc6-cvs,0.0.9rc6,0.0.9rc7-cvs,0.0.9rc7,0.0.9,0.0.9.1,0.0.9.2,0.0.9.3,0.0.9.4,0.0.9.5,0.0.9.6,0.0.9.7,0.0.9.8,0.0.9.9,0.0.9.10,0.1.0.0-alpha-cvs,0.1.0.1-rc,0.1.0.1-rc-cvs,0.1.0.2-rc,0.1.0.2-rc-cvs,0.1.0.3-rc,0.1.0.3-rc-cvs,0.1.0.4-rc,0.1.0.4-rc-cvs,0.1.0.5-rc,0.1.0.5-rc-cvs,0.1.0.6-rc,0.1.0.6-rc-cvs,0.1.0.7-rc,0.1.0.7-rc-cvs,0.1.0.8-rc,0.1.0.8-rc-cvs,0.1.0.9-rc,0.1.0.10,0.1.0.11,0.1.0.12,0.1.0.13,0.1.0.14,0.1.0.15,0.1.0.16,0.1.1.0-alpha-cvs,0.1.1.1-alpha,0.1.1.1-alpha-cvs,0.1.1.2-alpha,0.1.1.2-alpha-cvs,0.1.1.3-alpha,0.1.1.3-alpha-cvs,0.1.1.4-alpha,0.1.1.4-alpha-cvs,0.1.1.5-alpha,0.1.1.5-alpha-cvs,0.1.1.6-alpha,0.1.1.6-alpha-cvs,0.1.1.7-alpha,0.1.1.7-alpha-cvs,0.1.1.8-alpha,0.1.1.8-alpha-cvs,0.1.1.9-alpha,0.1.1.9-alpha-cvs,0.1.1.10-alpha,0.1.1.10-alpha-cvs dir-signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAOcrht/y5rkaahfX7sMe2qnpqoPibsjTSJaDvsUtaNP/Bq0MgNDGOR48 rtwfqTRff275Edkp/UYw3G3vSgKCJr76/bqOHCmkiZrnPV1zxNfrK18gNw2Cxre0 nTA+fD8JQqpPtb8b0SnG9kwy75eS//sRu7TErie2PzGMxrf9LH0LAgMBAAE= -----END RSA PUBLIC KEY----- r moria2 cZvkXeIktgfFNwfQ4hQ+LUI+dM8 t/Pwl1uHiJ3RKF/Vehsbthf2VDI 2005-12-15 06:57:18 18.244.0.114 443 80 s Authority Fast Named Running Valid V2Dir r stnv CSi6RnBWxKaJ/uTvXXFIK2KJw9U ItGn7UGZvaftbEFu7NdpwY4fKlo 2005-12-15 16:24:42 84.16.236.173 9001 0 s Named Valid r nggrplz CehYL/Dm+F4rjkHA3AucncRuaWg swLCsByU85jj7ziTlSawZR+CTdY 2005-12-15 23:25:50 194.109.109.109 9001 0 s Fast Stable Running Valid directory-signature moria2 -----BEGIN SIGNATURE----- 2nXCxVje3wzn6HrIFRNMc0nc48AhMVpHZyPwRKGXkuYfTQG55uvwQDaFgJHud4RT 27QhWltau3K1evhnzhKcpbTXwkVv1TBYJSzL6rEeAn8cQ7ZiCyqf4EJCaNcem3d2 TpQQk3nNQF8z6UIvdlvP+DnJV4izWVkQEZgUZgIVM0E= -----END SIGNATURE----- stem-1.7.1/test/unit/descriptor/export.py0000664000175000017500000000576713237375570021254 0ustar atagaratagar00000000000000""" Unit tests for stem.descriptor.export. """ import unittest try: from StringIO import StringIO except ImportError: from io import StringIO import stem.prereq from stem.descriptor.server_descriptor import RelayDescriptor, BridgeDescriptor from stem.descriptor.export import export_csv, export_csv_file class TestExport(unittest.TestCase): def test_minimal_descriptor(self): """ Exports a single minimal tor server descriptor. """ if stem.prereq._is_python_26(): self.skipTest('(header added in python 2.7)') return desc = RelayDescriptor.create({ 'router': 'caerSidi 71.35.133.197 9001 0 0', 'published': '2012-03-01 17:15:27', }) desc_csv = export_csv(desc, included_fields = ('nickname', 'address', 'published'), header = False) expected = 'caerSidi,71.35.133.197,2012-03-01 17:15:27\n' self.assertEqual(expected, desc_csv) desc_csv = export_csv(desc, included_fields = ('nickname', 'address', 'published'), header = True) expected = 'nickname,address,published\n' + expected self.assertEqual(expected, desc_csv) def test_multiple_descriptors(self): """ Exports multiple descriptors, making sure that we get them back in the same order. """ nicknames = ('relay1', 'relay3', 'relay2', 'caerSidi', 'zeus') descriptors = [] for nickname in nicknames: router_line = '%s 71.35.133.197 9001 0 0' % nickname descriptors.append(RelayDescriptor.create({'router': router_line})) expected = '\n'.join(nicknames) + '\n' self.assertEqual(expected, export_csv(descriptors, included_fields = ('nickname',), header = False)) def test_file_output(self): """ Basic test for the export_csv_file() function, checking that it provides the same output as export_csv(). """ desc = RelayDescriptor.create() desc_csv = export_csv(desc) csv_buffer = StringIO() export_csv_file(csv_buffer, desc) self.assertEqual(desc_csv, csv_buffer.getvalue()) def test_excludes_private_attr(self): """ Checks that the default attributes for our csv output doesn't include private fields. """ if stem.prereq._is_python_26(): self.skipTest('(header added in python 2.7)') return desc = RelayDescriptor.create() desc_csv = export_csv(desc) self.assertTrue(',signature' in desc_csv) self.assertFalse(',_digest' in desc_csv) self.assertFalse(',_annotation_lines' in desc_csv) def test_empty_input(self): """ Exercises when we don't provide any descriptors. """ self.assertEqual('', export_csv([])) def test_invalid_attributes(self): """ Attempts to make a csv with attributes that don't exist. """ desc = RelayDescriptor.create() self.assertRaises(ValueError, export_csv, desc, ('nickname', 'blarg!')) def test_multiple_descriptor_types(self): """ Attempts to make a csv with multiple descriptor types. """ self.assertRaises(ValueError, export_csv, (RelayDescriptor.create(), BridgeDescriptor.create())) stem-1.7.1/test/unit/descriptor/router_status_entry.py0000664000175000017500000005661113411002341024042 0ustar atagaratagar00000000000000""" Unit tests for stem.descriptor.router_status_entry. """ import datetime import functools import unittest import stem.descriptor import test.require from stem import Flag from stem.exit_policy import MicroExitPolicy from stem.version import Version from test.unit.descriptor import ( get_resource, base_expect_invalid_attr, base_expect_invalid_attr_for_text, ) from stem.descriptor.router_status_entry import ( RouterStatusEntryV2, RouterStatusEntryV3, RouterStatusEntryMicroV3, _base64_to_hex, ) try: # Added in 2.7 from collections import OrderedDict except ImportError: from stem.util.ordereddict import OrderedDict ENTRY_WITHOUT_ED25519 = """\ r seele AAoQ1DAR6kkoo19hBAX5K0QztNw m0ynPuwzSextzsiXYJYA0Hce+Cs 2015-08-23 00:26:35 73.15.150.172 9001 0 s Running Stable Valid v Tor 0.2.6.10 w Bandwidth=102 Measured=31 p reject 1-65535 id ed25519 none m 13,14,15 sha256=uaAYTOVuYRqUwJpNfP2WizjzO0FiNQB4U97xSQu+vMc m 16,17 sha256=G6FmPe/ehgfb6tsRzFKDCwvvae+RICeP1MaP0vWDGyI m 18,19,20,21 sha256=/XhIMOnhElo2UiKjL2S10uRka/fhg1CFfNd+9wgUwEE """ ENTRY_WITH_ED25519 = """\ r PDrelay1 AAFJ5u9xAqrKlpDW6N0pMhJLlKs yrJ6b/73pmHBiwsREgw+inf8WFw 2015-08-23 16:52:37 95.215.44.189 8080 0 s Fast Running Stable Valid v Tor 0.2.7.2-alpha-dev w Bandwidth=608 Measured=472 p reject 1-65535 id ed25519 8RH34kO07Pp+XYwzdoATVyCibIvmbslUjRkAm7J4IA8 m 13 sha256=PTSHzE7RKnRGZMRmBddSzDiZio254FUhv9+V4F5zq8s m 14,15 sha256=0wsEwBbxJ8RtPmGYwilHQTVEw2pWzUBEVlSgEO77OyU m 16,17 sha256=JK2xhYr/VsCF60px+LsT990BCpfKfQTeMxRbD63o2vE m 18,19,20 sha256=AkZH3gIvz3wunsroqh5izBJizdYuR7kn2oVbsvqgML8 m 21 sha256=AVp41YVxKEJCaoEf0+77Cdvyw5YgpyDXdob0+LSv/pE """ ENTRY_WITH_IPV6 = """\ r MYLEX AQt3KEVEEfSFzinUx5oUU0FRwsQ 2018-07-15 16:38:10 77.123.42.148 444 800 a [2001:470:71:9b9:f66d:4ff:fee7:954c]:444 m GWb+xjav0fsuwPwPNnUvW9Q1Ivk5nz8m1McECM4KY8A s Fast Guard HSDir Running Stable V2Dir Valid v Tor 0.2.5.16 pr Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=1-4 LinkAuth=1 Microdesc=1 Relay=1-2 w Bandwidth=4950 """ expect_invalid_attr = functools.partial(base_expect_invalid_attr, RouterStatusEntryV3, 'nickname', 'Unnamed') expect_invalid_attr_for_text = functools.partial(base_expect_invalid_attr_for_text, RouterStatusEntryV3, 'nickname', 'Unnamed') def vote_document(): class Stub(object): pass mock_document = Stub() # just need anything with a __dict__ setattr(mock_document, 'is_vote', True) setattr(mock_document, 'is_consensus', False) return mock_document class TestRouterStatusEntry(unittest.TestCase): def test_fingerprint_decoding(self): """ Tests for the _base64_to_hex() helper. """ # consensus identity field and fingerprint for caerSidi and Amunet1-5 test_values = { 'p1aag7VwarGxqctS7/fS0y5FU+s': 'A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB', 'IbhGa8T+8tyy/MhxCk/qI+EI2LU': '21B8466BC4FEF2DCB2FCC8710A4FEA23E108D8B5', '20wYcbFGwFfMktmuffYj6Z1RM9k': 'DB4C1871B146C057CC92D9AE7DF623E99D5133D9', 'nTv9AG1cZeFW2hXiSIEAF6JLRJ4': '9D3BFD006D5C65E156DA15E248810017A24B449E', '/UKsQiOSGPi/6es0/ha1prNTeDI': 'FD42AC42239218F8BFE9EB34FE16B5A6B3537832', '/nHdqoKZ6bKZixxAPzYt9Qen+Is': 'FE71DDAA8299E9B2998B1C403F362DF507A7F88B', } for arg, expected in test_values.items(): self.assertEqual(expected, _base64_to_hex(arg, True)) # checks with some malformed inputs for arg in ('', '20wYcb', '20wYcb' * 30): self.assertRaises(ValueError, _base64_to_hex, arg, True) def test_minimal_v2(self): """ Parses a minimal v2 router status entry. """ entry = RouterStatusEntryV2.create() self.assertEqual(None, entry.document) self.assertTrue(entry.nickname.startswith('Unnamed')) self.assertEqual('A106452D87BD7B803B6CE916291ED368DC5BD091', entry.digest) self.assertEqual(9001, entry.or_port) self.assertEqual(None, entry.dir_port) self.assertEqual(None, entry.flags) self.assertEqual(None, entry.version_line) self.assertEqual(None, entry.version) self.assertEqual([], entry.get_unrecognized_lines()) def test_minimal_v3(self): """ Parses a minimal v3 router status entry. """ entry = RouterStatusEntryV3.create() expected_flags = set([Flag.FAST, Flag.NAMED, Flag.RUNNING, Flag.STABLE, Flag.VALID]) self.assertEqual(None, entry.document) self.assertTrue(entry.nickname.startswith('Unnamed')) self.assertEqual('A106452D87BD7B803B6CE916291ED368DC5BD091', entry.digest) self.assertEqual(9001, entry.or_port) self.assertEqual(None, entry.dir_port) self.assertEqual(expected_flags, set(entry.flags)) self.assertEqual(None, entry.version_line) self.assertEqual(None, entry.version) self.assertEqual(None, entry.bandwidth) self.assertEqual(None, entry.measured) self.assertEqual(False, entry.is_unmeasured) self.assertEqual([], entry.unrecognized_bandwidth_entries) self.assertEqual(None, entry.exit_policy) self.assertEqual([], entry.microdescriptor_hashes) self.assertEqual(None, entry.identifier_type) self.assertEqual(None, entry.identifier) self.assertEqual([], entry.get_unrecognized_lines()) def test_minimal_micro_v3(self): """ Parses a minimal microdescriptor v3 router status entry. """ entry = RouterStatusEntryMicroV3.create() expected_flags = set([Flag.FAST, Flag.GUARD, Flag.HSDIR, Flag.NAMED, Flag.RUNNING, Flag.STABLE, Flag.V2DIR, Flag.VALID]) self.assertEqual(None, entry.document) self.assertTrue(entry.nickname.startswith('Unnamed')) self.assertEqual(9001, entry.or_port) self.assertEqual(9030, entry.dir_port) self.assertEqual(expected_flags, set(entry.flags)) self.assertEqual(None, entry.version_line) self.assertEqual(None, entry.version) self.assertEqual('6A252497006BB9AF36A1B1B902C4D7FA2129923400DBE0101F167B1B031F63BD', entry.digest) self.assertEqual([], entry.get_unrecognized_lines()) @test.require.cryptography def test_descriptor_signing(self): self.assertRaisesWith(NotImplementedError, 'Signing of RouterStatusEntryV2 not implemented', RouterStatusEntryV2.create, sign = True) self.assertRaisesWith(NotImplementedError, 'Signing of RouterStatusEntryV3 not implemented', RouterStatusEntryV3.create, sign = True) self.assertRaisesWith(NotImplementedError, 'Signing of RouterStatusEntryMicroV3 not implemented', RouterStatusEntryMicroV3.create, sign = True) def test_without_ed25519(self): """ Parses a router status entry without a ed25519 value. """ microdescriptor_hashes = [ ([13, 14, 15], {'sha256': 'uaAYTOVuYRqUwJpNfP2WizjzO0FiNQB4U97xSQu+vMc'}), ([16, 17], {'sha256': 'G6FmPe/ehgfb6tsRzFKDCwvvae+RICeP1MaP0vWDGyI'}), ([18, 19, 20, 21], {'sha256': '/XhIMOnhElo2UiKjL2S10uRka/fhg1CFfNd+9wgUwEE'}), ] entry = RouterStatusEntryV3(ENTRY_WITHOUT_ED25519, document = vote_document(), validate = True) self.assertEqual('seele', entry.nickname) self.assertEqual('000A10D43011EA4928A35F610405F92B4433B4DC', entry.fingerprint) self.assertEqual(datetime.datetime(2015, 8, 23, 0, 26, 35), entry.published) self.assertEqual('73.15.150.172', entry.address) self.assertEqual(9001, entry.or_port) self.assertEqual(None, entry.dir_port) self.assertEqual(set([Flag.RUNNING, Flag.STABLE, Flag.VALID]), set(entry.flags)) self.assertEqual('Tor 0.2.6.10', entry.version_line) self.assertEqual(Version('0.2.6.10'), entry.version) self.assertEqual(102, entry.bandwidth) self.assertEqual(31, entry.measured) self.assertEqual(False, entry.is_unmeasured) self.assertEqual([], entry.unrecognized_bandwidth_entries) self.assertEqual(MicroExitPolicy('reject 1-65535'), entry.exit_policy) self.assertEqual(microdescriptor_hashes, entry.microdescriptor_hashes) self.assertEqual('ed25519', entry.identifier_type) self.assertEqual('none', entry.identifier) self.assertEqual('9B4CA73EEC3349EC6DCEC897609600D0771EF82B', entry.digest) self.assertEqual([], entry.get_unrecognized_lines()) def test_with_ed25519(self): """ Parses a router status entry with a ed25519 value. """ microdescriptor_hashes = [ ([13], {'sha256': 'PTSHzE7RKnRGZMRmBddSzDiZio254FUhv9+V4F5zq8s'}), ([14, 15], {'sha256': '0wsEwBbxJ8RtPmGYwilHQTVEw2pWzUBEVlSgEO77OyU'}), ([16, 17], {'sha256': 'JK2xhYr/VsCF60px+LsT990BCpfKfQTeMxRbD63o2vE'}), ([18, 19, 20], {'sha256': 'AkZH3gIvz3wunsroqh5izBJizdYuR7kn2oVbsvqgML8'}), ([21], {'sha256': 'AVp41YVxKEJCaoEf0+77Cdvyw5YgpyDXdob0+LSv/pE'}), ] entry = RouterStatusEntryV3(ENTRY_WITH_ED25519, document = vote_document(), validate = True) self.assertEqual('PDrelay1', entry.nickname) self.assertEqual('000149E6EF7102AACA9690D6E8DD2932124B94AB', entry.fingerprint) self.assertEqual(datetime.datetime(2015, 8, 23, 16, 52, 37), entry.published) self.assertEqual('95.215.44.189', entry.address) self.assertEqual(8080, entry.or_port) self.assertEqual(None, entry.dir_port) self.assertEqual(set([Flag.FAST, Flag.RUNNING, Flag.STABLE, Flag.VALID]), set(entry.flags)) self.assertEqual('Tor 0.2.7.2-alpha-dev', entry.version_line) self.assertEqual(Version('0.2.7.2-alpha-dev'), entry.version) self.assertEqual(608, entry.bandwidth) self.assertEqual(472, entry.measured) self.assertEqual(False, entry.is_unmeasured) self.assertEqual([], entry.unrecognized_bandwidth_entries) self.assertEqual(MicroExitPolicy('reject 1-65535'), entry.exit_policy) self.assertEqual(microdescriptor_hashes, entry.microdescriptor_hashes) self.assertEqual('ed25519', entry.identifier_type) self.assertEqual('8RH34kO07Pp+XYwzdoATVyCibIvmbslUjRkAm7J4IA8', entry.identifier) self.assertEqual('CAB27A6FFEF7A661C18B0B11120C3E8A77FC585C', entry.digest) self.assertEqual([], entry.get_unrecognized_lines()) def test_with_ipv6(self): """ Parse a router status entry with an IPv6 address. """ expected_protocols = OrderedDict(( ('Cons', [1]), ('Desc', [1]), ('DirCache', [1]), ('HSDir', [1]), ('HSIntro', [3]), ('HSRend', [1]), ('Link', [1, 2, 3, 4]), ('LinkAuth', [1]), ('Microdesc', [1]), ('Relay', [1, 2]), )) entry = RouterStatusEntryMicroV3(ENTRY_WITH_IPV6, validate = True) self.assertEqual('MYLEX', entry.nickname) self.assertEqual('010B7728454411F485CE29D4C79A14534151C2C4', entry.fingerprint) self.assertEqual(datetime.datetime(2018, 7, 15, 16, 38, 10), entry.published) self.assertEqual('77.123.42.148', entry.address) self.assertEqual(444, entry.or_port) self.assertEqual(800, entry.dir_port) self.assertEqual(set([Flag.FAST, Flag.GUARD, Flag.HSDIR, Flag.RUNNING, Flag.STABLE, Flag.V2DIR, Flag.VALID]), set(entry.flags)) self.assertEqual('Tor 0.2.5.16', entry.version_line) self.assertEqual(Version('0.2.5.16'), entry.version) self.assertEqual([('2001:470:71:9b9:f66d:4ff:fee7:954c', 444, True)], entry.or_addresses) self.assertEqual(4950, entry.bandwidth) self.assertEqual(None, entry.measured) self.assertEqual(False, entry.is_unmeasured) self.assertEqual([], entry.unrecognized_bandwidth_entries) self.assertEqual(expected_protocols, entry.protocols) self.assertEqual('1966FEC636AFD1FB2EC0FC0F36752F5BD43522F9399F3F26D4C70408CE0A63C0', entry.digest) self.assertEqual([], entry.get_unrecognized_lines()) def test_missing_fields(self): """ Parses a router status entry that's missing fields. """ expect_invalid_attr_for_text(self, RouterStatusEntryV3.content(exclude = ('r', 's')), 'address') expect_invalid_attr_for_text(self, RouterStatusEntryV3.content(exclude = ('r',)), 'address') expect_invalid_attr_for_text(self, RouterStatusEntryV3.content(exclude = ('s',)), 'flags') def test_unrecognized_lines(self): """ Parses a router status entry with new keywords. """ entry = RouterStatusEntryV3.create({'z': 'New tor feature: sparkly unicorns!'}) self.assertEqual(['z New tor feature: sparkly unicorns!'], entry.get_unrecognized_lines()) def test_proceeding_line(self): """ Includes content prior to the 'r' line. """ content = b'z some stuff\n' + RouterStatusEntryV3.content() self.assertRaises(ValueError, RouterStatusEntryV3, content, True) self.assertEqual(['z some stuff'], RouterStatusEntryV3(content, False).get_unrecognized_lines()) def test_blank_lines(self): """ Includes blank lines, which should be ignored. """ content = RouterStatusEntryV3.content() + b'\n\nv Tor 0.2.2.35\n\n' entry = RouterStatusEntryV3(content) self.assertEqual('Tor 0.2.2.35', entry.version_line) def test_duplicate_lines(self): """ Duplicates linesin the entry. """ lines = RouterStatusEntryV3.content().split(b'\n') for index, duplicate_line in enumerate(lines): content = b'\n'.join(lines[:index] + [duplicate_line] + lines[index:]) self.assertRaises(ValueError, RouterStatusEntryV3, content, True) entry = RouterStatusEntryV3(content, False) self.assertTrue(entry.nickname.startswith('Unnamed')) def test_missing_r_field(self): """ Excludes fields from the 'r' line. """ components = ( ('nickname', 'caerSidi'), ('fingerprint', 'p1aag7VwarGxqctS7/fS0y5FU+s'), ('digest', 'oQZFLYe9e4A7bOkWKR7TaNxb0JE'), ('published', '2012-08-06 11:19:31'), ('address', '71.35.150.29'), ('or_port', '9001'), ('dir_port', '0'), ) for attr, value in components: # construct the 'r' line without this field test_components = [comp[1] for comp in components] test_components.remove(value) r_line = ' '.join(test_components) expect_invalid_attr(self, {'r': r_line}, attr) def test_malformed_nickname(self): """ Parses an 'r' line with a malformed nickname. """ test_values = ( '', 'saberrider2008ReallyLongNickname', # too long '$aberrider2008', # invalid characters ) for value in test_values: r_line = '%s p1aag7VwarGxqctS7/fS0y5FU+s oQZFLYe9e4A7bOkWKR7TaNxb0JE 2012-08-06 11:19:31 71.35.150.29 9001 0' % value # TODO: Initial whitespace is consumed as part of the keyword/value # divider. This is a bug in the case of V3 router status entries, but # proper behavior for V2 router status entries and server/extrainfo # descriptors. # # I'm inclined to leave this as-is for the moment since fixing it # requires special KEYWORD_LINE handling, and the only result of this bug # is that our validation doesn't catch the new SP restriction on V3 # entries. if value == '': value = None expect_invalid_attr(self, {'r': r_line}, 'nickname') def test_malformed_fingerprint(self): """ Parses an 'r' line with a malformed fingerprint. """ test_values = ( '', 'zzzzz', 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz', ) for value in test_values: r_line = 'caerSidi %s oQZFLYe9e4A7bOkWKR7TaNxb0JE 2012-08-06 11:19:31 71.35.150.29 9001 0' % value expect_invalid_attr(self, {'r': r_line}, 'fingerprint') def test_malformed_published_date(self): """ Parses an 'r' line with a malformed published date. """ test_values = ( '', '2012-08-06 11:19:', '2012-08-06 11:19:71', '2012-08-06 11::31', '2012-08-06 11:79:31', '2012-08-06 :19:31', '2012-08-06 41:19:31', '2012-08- 11:19:31', '2012-08-86 11:19:31', '2012--06 11:19:31', '2012-38-06 11:19:31', '-08-06 11:19:31', '2012-08-06 11:19:31', ) for value in test_values: r_line = 'caerSidi p1aag7VwarGxqctS7/fS0y5FU+s oQZFLYe9e4A7bOkWKR7TaNxb0JE %s 71.35.150.29 9001 0' % value expect_invalid_attr(self, {'r': r_line}, 'published') def test_malformed_address(self): """ Parses an 'r' line with a malformed address. """ test_values = ( '', '71.35.150.', '71.35..29', '71.35.150', '71.35.150.256', ) for value in test_values: r_line = 'caerSidi p1aag7VwarGxqctS7/fS0y5FU+s oQZFLYe9e4A7bOkWKR7TaNxb0JE 2012-08-06 11:19:31 %s 9001 0' % value expect_invalid_attr(self, {'r': r_line}, 'address') def test_malformed_port(self): """ Parses an 'r' line with a malformed ORPort or DirPort. """ test_values = ( '', '-1', '399482', 'blarg', ) for value in test_values: for include_or_port in (False, True): for include_dir_port in (False, True): if not include_or_port and not include_dir_port: continue r_line = 'caerSidi p1aag7VwarGxqctS7/fS0y5FU+s oQZFLYe9e4A7bOkWKR7TaNxb0JE 2012-08-06 11:19:31 71.35.150.29 9001 0' if include_or_port: r_line = r_line.replace(' 9001 ', ' %s ' % value) if include_dir_port: r_line = r_line[:-1] + value attr = 'or_port' if include_or_port else 'dir_port' expect_invalid_attr(self, {'r': r_line}, attr) def test_ipv6_addresses(self): """ Handles a variety of 'a' lines. """ test_values = { '[2607:fcd0:daaa:101::602c:bd62]:443': [ ('2607:fcd0:daaa:101::602c:bd62', 443, True)], } for a_line, expected in test_values.items(): entry = RouterStatusEntryV3.create({'a': a_line}) self.assertEqual(expected, entry.or_addresses) # includes multiple 'a' lines content = RouterStatusEntryV3.content() content += b'\na [2607:fcd0:daaa:101::602c:bd62]:443' content += b'\na [1148:fcd0:daaa:101::602c:bd62]:80' expected = [ ('2607:fcd0:daaa:101::602c:bd62', 443, True), ('1148:fcd0:daaa:101::602c:bd62', 80, True), ] entry = RouterStatusEntryV3(content) self.assertEqual(expected, entry.or_addresses) # tries some invalid inputs test_values = ( '', '[1148:fcd0:daaa:101::602c:bd62]:80000', ) for a_line in test_values: expect_invalid_attr(self, {'a': a_line}, expected_value = {}) def test_flags(self): """ Handles a variety of flag inputs. """ test_values = { '': [], 'Fast': [Flag.FAST], 'Fast Valid': [Flag.FAST, Flag.VALID], 'Ugabuga': ['Ugabuga'], } for s_line, expected in test_values.items(): entry = RouterStatusEntryV3.create({'s': s_line}) self.assertEqual(expected, entry.flags) # tries some invalid inputs test_values = { 'Fast ': [Flag.FAST, '', '', ''], 'Fast Valid': [Flag.FAST, '', Flag.VALID], 'Fast Fast': [Flag.FAST, Flag.FAST], } for s_line, expected in test_values.items(): expect_invalid_attr(self, {'s': s_line}, 'flags', expected) def test_protocols(self): desc = RouterStatusEntryV3.create({'pr': 'Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=1-4 LinkAuth=1 Microdesc=1 Relay=1-2'}) self.assertEqual(10, len(desc.protocols)) def test_versions(self): """ Handles a variety of version inputs. """ test_values = { 'Tor 0.2.2.35': Version('0.2.2.35'), 'Tor 0.1.2': Version('0.1.2'), 'Torr new_stuff': None, 'new_stuff and stuff': None, } for v_line, expected in test_values.items(): entry = RouterStatusEntryV3.create({'v': v_line}) self.assertEqual(expected, entry.version) self.assertEqual(v_line, entry.version_line) # tries an invalid input expect_invalid_attr(self, {'v': 'Tor ugabuga'}, 'version') def test_bandwidth(self): """ Handles a variety of 'w' lines. """ test_values = { 'Bandwidth=0': (0, None, False, []), 'Bandwidth=63138': (63138, None, False, []), 'Bandwidth=11111 Measured=482': (11111, 482, False, []), 'Bandwidth=11111 Measured=482 Blarg!': (11111, 482, False, ['Blarg!']), 'Bandwidth=11111 Measured=482 Unmeasured=1 Blarg!': (11111, 482, True, ['Blarg!']), } for w_line, expected in test_values.items(): entry = RouterStatusEntryV3.create({'w': w_line}) self.assertEqual(expected[0], entry.bandwidth) self.assertEqual(expected[1], entry.measured) self.assertEqual(expected[2], entry.is_unmeasured) self.assertEqual(expected[3], entry.unrecognized_bandwidth_entries) # tries some invalid inputs test_values = ( '', 'blarg', 'Bandwidth', 'Bandwidth=', 'Bandwidth:0', 'Bandwidth 0', 'Bandwidth=-10', 'Bandwidth=10 Measured', 'Bandwidth=10 Measured=', 'Bandwidth=10 Measured=-50', 'Bandwidth=10 Measured=482 Unmeasured', 'Bandwidth=10 Measured=482 Unmeasured=', 'Bandwidth=10 Measured=482 Unmeasured=0', 'Bandwidth=10 Measured=482 Unmeasured=842', 'Bandwidth=10 Measured=482 Unmeasured=-5', ) for w_line in test_values: expect_invalid_attr(self, {'w': w_line}) def test_exit_policy(self): """ Handles a variety of 'p' lines. """ test_values = { 'reject 1-65535': MicroExitPolicy('reject 1-65535'), 'accept 80,110,143,443': MicroExitPolicy('accept 80,110,143,443'), } for p_line, expected in test_values.items(): entry = RouterStatusEntryV3.create({'p': p_line}) self.assertEqual(expected, entry.exit_policy) # tries some invalid inputs test_values = ( '', 'blarg', 'reject -50', 'accept 80,', ) for p_line in test_values: expect_invalid_attr(self, {'p': p_line}, 'exit_policy') def test_microdescriptor_hashes(self): """ Handles a variety of 'm' lines. """ test_values = { '8,9,10,11,12': [([8, 9, 10, 11, 12], {})], '8,9,10,11,12 sha256=g1vx9si329muxV3tquWIXXySNOIwRGMeAESKs/v4DWs': [([8, 9, 10, 11, 12], {'sha256': 'g1vx9si329muxV3tquWIXXySNOIwRGMeAESKs/v4DWs'})], '8,9,10,11,12 sha256=g1vx9si329muxV md5=3tquWIXXySNOIwRGMeAESKs/v4DWs': [([8, 9, 10, 11, 12], {'sha256': 'g1vx9si329muxV', 'md5': '3tquWIXXySNOIwRGMeAESKs/v4DWs'})], } for m_line, expected in test_values.items(): content = RouterStatusEntryV3.content({'m': m_line}) entry = RouterStatusEntryV3(content, document = vote_document()) self.assertEqual(expected, entry.microdescriptor_hashes) # try with multiple 'm' lines content = RouterStatusEntryV3.content() content += b'\nm 11,12 sha256=g1vx9si329muxV3tquWIXXySNOIwRGMeAESKs/v4DWs' content += b'\nm 31,32 sha512=g1vx9si329muxV3tquWIXXySNOIwRGMeAESKs/v4DWs' expected = [ ([11, 12], {'sha256': 'g1vx9si329muxV3tquWIXXySNOIwRGMeAESKs/v4DWs'}), ([31, 32], {'sha512': 'g1vx9si329muxV3tquWIXXySNOIwRGMeAESKs/v4DWs'}), ] entry = RouterStatusEntryV3(content, document = vote_document()) self.assertEqual(expected, entry.microdescriptor_hashes) # try without a document expect_invalid_attr(self, {'m': '8,9,10,11,12'}, 'microdescriptor_hashes', expected_value = []) # tries some invalid inputs test_values = ( '', '4,a,2', '1,2,3 stuff', ) for m_line in test_values: content = RouterStatusEntryV3.content({'m': m_line}) self.assertRaises(ValueError, RouterStatusEntryV3, content, True, vote_document()) def test_with_carriage_returns(self): """ Read a descriptor file with windows newlines (CRLF). """ descriptor_path = get_resource('unparseable/cached-microdesc-consensus_with_carriage_returns') with open(descriptor_path, 'rb') as descriptor_file: descriptors = stem.descriptor.parse_file(descriptor_file, 'network-status-microdesc-consensus-3 1.0', normalize_newlines = True) # if we didn't strip \r then it would be part of the last flag router = next(descriptors) self.assertEqual([Flag.FAST, Flag.RUNNING, Flag.STABLE, Flag.VALID], router.flags) stem-1.7.1/test/unit/descriptor/tordnsel.py0000664000175000017500000000566713411002341021535 0ustar atagaratagar00000000000000""" Unit tests for stem.descriptor.tordnsel. """ import io import unittest import datetime from stem.util.tor_tools import is_valid_fingerprint from stem.descriptor.tordnsel import TorDNSEL, _parse_file TEST_DESC = b"""\ @type tordnsel 1.0 Downloaded 2013-08-19 04:02:03 ExitNode 003A71137D959748C8157C4A76ECA639CEF5E33E Published 2013-08-19 02:13:53 LastStatus 2013-08-19 03:02:47 ExitAddress 66.223.170.168 2013-08-19 03:18:51 ExitNode 00FF300624FECA7F40515C8D854EE925332580D6 Published 2013-08-18 07:02:14 LastStatus 2013-08-18 09:02:58 ExitAddress 82.252.181.153 2013-08-18 08:03:01 ExitAddress 82.252.181.154 2013-08-18 08:03:02 ExitAddress 82.252.181.155 2013-08-18 08:03:03 ExitNode 030B22437D99B2DB2908B747B6962EAD13AB4039 Published 2013-08-18 12:44:20 LastStatus 2013-08-18 13:02:57 ExitAddress 46.10.211.205 2013-08-18 13:18:48 """ MALFORMED_ENTRY_1 = b"""\ ExitNode 030B22437D99B2DB2908B747B6962EAD13AB4038 Published Today! LastStatus 2013-08-18 13:02:57 ExitAddress 46.10.211.205 2013-08-18 13:18:48 """ MALFORMED_ENTRY_2 = b"""\ @type tordnsel 1.0 ExitNode 030B22437D99B2DB2908B747B6962EAD13AB4038 Published Today! LastStatus 2013-08-18 13:02:57 ExitAddress 46.10.211.205 2013-08-18 Never """ class TestTorDNSELDescriptor(unittest.TestCase): def test_parse_file(self): """ Try parsing a document via the _parse_file() function. """ # parse file and assert values descriptors = list(_parse_file(io.BytesIO(TEST_DESC))) self.assertEqual(3, len(descriptors)) self.assertTrue(isinstance(descriptors[0], TorDNSEL)) desc = descriptors[1] self.assertTrue(is_valid_fingerprint(desc.fingerprint)) self.assertEqual('00FF300624FECA7F40515C8D854EE925332580D6', desc.fingerprint) self.assertEqual(datetime.datetime(2013, 8, 18, 7, 2, 14), desc.published) self.assertEqual(datetime.datetime(2013, 8, 18, 9, 2, 58), desc.last_status) self.assertEqual(3, len(desc.exit_addresses)) exit = desc.exit_addresses[0] self.assertEqual('82.252.181.153', exit[0]) self.assertEqual(datetime.datetime(2013, 8, 18, 8, 3, 1), exit[1]) # block content raises value error extra = b'ExtraContent goes here\n' descriptors = _parse_file(io.BytesIO(TEST_DESC + extra), validate = True) self.assertRaises(ValueError, list, descriptors) # malformed fingerprint raises value errors extra = b'ExitNode 030B22437D99B2DB2908B747B6' self.assertRaises(ValueError, list, _parse_file(io.BytesIO(TEST_DESC + extra), validate = True)) # malformed date raises value errors self.assertRaises(ValueError, list, _parse_file(io.BytesIO(TEST_DESC + MALFORMED_ENTRY_1), validate = True)) # skip exit address if malformed date and validate is False desc = next(_parse_file(io.BytesIO(MALFORMED_ENTRY_2), validate=False)) self.assertTrue(is_valid_fingerprint(desc.fingerprint)) self.assertEqual('030B22437D99B2DB2908B747B6962EAD13AB4038', desc.fingerprint) self.assertEqual(0, len(desc.exit_addresses)) stem-1.7.1/test/unit/descriptor/__init__.py0000664000175000017500000000313213341034346021437 0ustar atagaratagar00000000000000""" Unit tests for stem.descriptor. """ import os __all__ = [ 'export', 'extrainfo_descriptor', 'microdescriptor', 'networkstatus', 'reader', 'router_status_entry', 'server_descriptor', ] DESCRIPTOR_TEST_DATA = os.path.join(os.path.dirname(__file__), 'data') def get_resource(filename): """ Provides the path for a file in our descriptor data directory. """ return os.path.join(DESCRIPTOR_TEST_DATA, filename) def read_resource(filename): """ Provides test data. """ with open(get_resource(filename), 'rb') as resource_file: return resource_file.read() def base_expect_invalid_attr(cls, default_attr, default_value, test, desc_attrs, attr = None, expected_value = None): return base_expect_invalid_attr_for_text(cls, default_attr, default_value, test, cls.content(desc_attrs), attr, expected_value) def base_expect_invalid_attr_for_text(cls, default_attr, default_prefix, test, desc_text, attr = None, expected_value = None): """ Asserts that construction will fail due to desc_text having a malformed attribute. If an attr is provided then we check that it matches an expected value when we're constructed without validation. """ test.assertRaises(ValueError, cls, desc_text, True) desc = cls(desc_text, validate = False) if attr: # check that the invalid attribute matches the expected value when # constructed without validation test.assertEqual(expected_value, getattr(desc, attr)) elif default_attr and default_prefix: test.assertTrue(getattr(desc, default_attr).startswith(default_prefix)) # check a default attribute return desc stem-1.7.1/test/unit/descriptor/server_descriptor.py0000664000175000017500000011607313411002341023441 0ustar atagaratagar00000000000000""" Unit tests for stem.descriptor.server_descriptor. """ import datetime import functools import io import pickle import tarfile import time import unittest import stem.descriptor import stem.descriptor.router_status_entry import stem.descriptor.server_descriptor import stem.exit_policy import stem.prereq import stem.version import stem.util.str_tools import test.require from stem.descriptor.certificate import CertType, ExtensionType from stem.descriptor.server_descriptor import BridgeDistribution, RelayDescriptor, BridgeDescriptor from test.unit.descriptor import ( get_resource, base_expect_invalid_attr, base_expect_invalid_attr_for_text, ) try: # Added in 2.7 from collections import OrderedDict except ImportError: from stem.util.ordereddict import OrderedDict try: # added in python 3.3 from unittest.mock import Mock, patch except ImportError: from mock import Mock, patch TARFILE_FINGERPRINTS = set([ 'B6D83EC2D9E18B0A7A33428F8CFA9C536769E209', 'E0BD57A11F00041A9789577C53A1B784473669E4', '1F43EE37A0670301AD9CB555D94AFEC2C89FDE86', ]) expect_invalid_attr = functools.partial(base_expect_invalid_attr, RelayDescriptor, 'nickname', 'Unnamed') expect_invalid_attr_for_text = functools.partial(base_expect_invalid_attr_for_text, RelayDescriptor, 'nickname', 'Unnamed') class TestServerDescriptor(unittest.TestCase): def test_with_tarfile_path(self): """ Fetch server descriptors via parse_file() for a tarfile path. """ descriptors = list(stem.descriptor.parse_file(get_resource('descriptor_archive.tar'))) self.assertEqual(3, len(descriptors)) fingerprints = set([desc.fingerprint for desc in descriptors]) self.assertEqual(TARFILE_FINGERPRINTS, fingerprints) def test_with_tarfile_object(self): """ Fetch server descriptors via parse_file() for a tarfile object. """ # TODO: When dropping python 2.6 support we can go back to using the 'with' # keyword here. tar_file = tarfile.open(get_resource('descriptor_archive.tar')) descriptors = list(stem.descriptor.parse_file(tar_file)) self.assertEqual(3, len(descriptors)) fingerprints = set([desc.fingerprint for desc in descriptors]) self.assertEqual(TARFILE_FINGERPRINTS, fingerprints) tar_file.close() def test_metrics_descriptor(self): """ Parses and checks our results against a server descriptor from metrics. """ expected_family = set([ '$0CE3CFB1E9CC47B63EA8869813BF6FAB7D4540C1', '$1FD187E8F69A9B74C9202DC16A25B9E7744AB9F6', '$74FB5EFA6A46DE4060431D515DC9A790E6AD9A7C', '$77001D8DA9BF445B0F81AA427A675F570D222E6A', '$B6D83EC2D9E18B0A7A33428F8CFA9C536769E209', '$D2F37F46182C23AB747787FD657E680B34EAF892', '$E0BD57A11F00041A9789577C53A1B784473669E4', '$E5E3E9A472EAF7BE9682B86E92305DB4C71048EF', ]) expected_onion_key = """-----BEGIN RSA PUBLIC KEY----- MIGJAoGBAJv5IIWQ+WDWYUdyA/0L8qbIkEVH/cwryZWoIaPAzINfrw1WfNZGtBmg skFtXhOHHqTRN4GPPrZsAIUOQGzQtGb66IQgT4tO/pj+P6QmSCCdTfhvGfgTCsC+ WPi4Fl2qryzTb3QO5r5x7T8OsG2IBUET1bLQzmtbC560SYR49IvVAgMBAAE= -----END RSA PUBLIC KEY-----""" expected_signing_key = """-----BEGIN RSA PUBLIC KEY----- MIGJAoGBAKwvOXyztVKnuYvpTKt+nS3XIKeO8dVungi8qGoeS+6gkR6lDtGfBTjd uE9UIkdAl9zi8/1Ic2wsUNHE9jiS0VgeupITGZY8YOyMJJ/xtV1cqgiWhq1dUYaq 51TOtUogtAPgXPh4J+V8HbFFIcCzIh3qCO/xXo+DSHhv7SSif1VpAgMBAAE= -----END RSA PUBLIC KEY-----""" expected_signature = """-----BEGIN SIGNATURE----- dskLSPz8beUW7bzwDjR6EVNGpyoZde83Ejvau+5F2c6cGnlu91fiZN3suE88iE6e 758b9ldq5eh5mapb8vuuV3uO+0Xsud7IEOqfxdkmk0GKnUX8ouru7DSIUzUL0zqq Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4= -----END SIGNATURE-----""" with open(get_resource('example_descriptor'), 'rb') as descriptor_file: desc = next(stem.descriptor.parse_file(descriptor_file, 'server-descriptor 1.0')) self.assertEqual('caerSidi', desc.nickname) self.assertEqual('A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB', desc.fingerprint) self.assertEqual('71.35.133.197', desc.address) self.assertEqual(9001, desc.or_port) self.assertEqual(None, desc.socks_port) self.assertEqual(None, desc.dir_port) self.assertEqual(None, desc.certificate) self.assertEqual(None, desc.ed25519_certificate) self.assertEqual(None, desc.ed25519_master_key) self.assertEqual(None, desc.ed25519_signature) self.assertEqual(b'Tor 0.2.1.30 on Linux x86_64', desc.platform) self.assertEqual(stem.version.Version('0.2.1.30'), desc.tor_version) self.assertEqual('Linux x86_64', desc.operating_system) self.assertEqual(588217, desc.uptime) self.assertEqual(datetime.datetime(2012, 3, 1, 17, 15, 27), desc.published) self.assertEqual(b'www.atagar.com/contact', desc.contact) self.assertEqual(['1', '2'], desc.link_protocols) self.assertEqual(['1'], desc.circuit_protocols) self.assertEqual(True, desc.is_hidden_service_dir) self.assertEqual(False, desc.hibernating) self.assertEqual(False, desc.allow_single_hop_exits) self.assertEqual(False, desc.allow_tunneled_dir_requests) self.assertEqual(False, desc.extra_info_cache) self.assertEqual('D225B728768D7EA4B5587C13A7A9D22EBBEE6E66', desc.extra_info_digest) self.assertEqual(None, desc.extra_info_sha256_digest) self.assertEqual(BridgeDistribution.ANY, desc.bridge_distribution) self.assertEqual(expected_family, desc.family) self.assertEqual(153600, desc.average_bandwidth) self.assertEqual(256000, desc.burst_bandwidth) self.assertEqual(104590, desc.observed_bandwidth) self.assertEqual(stem.exit_policy.ExitPolicy('reject *:*'), desc.exit_policy) self.assertEqual(expected_onion_key, desc.onion_key) self.assertEqual(None, desc.onion_key_crosscert) self.assertEqual(None, desc.ntor_onion_key_crosscert) self.assertEqual(None, desc.onion_key_crosscert) self.assertEqual(expected_signing_key, desc.signing_key) self.assertEqual(expected_signature, desc.signature) self.assertEqual([], desc.get_unrecognized_lines()) self.assertEqual('2C7B27BEAB04B4E2459D89CA6D5CD1CC5F95A689', desc.digest()) self.assertEqual(['2'], desc.hidden_service_dir) # obsolete field def test_metrics_descriptor_multiple(self): """ Parses and checks our results against a server descriptor from metrics. """ with open(get_resource('metrics_server_desc_multiple'), 'rb') as descriptor_file: descriptors = list(stem.descriptor.parse_file(descriptor_file, 'server-descriptor 1.0')) self.assertEqual(2, len(descriptors)) self.assertEqual('anonion', descriptors[0].nickname) self.assertEqual('9A5EC5BB866517E53962AF4D3E776536694B069E', descriptors[0].fingerprint) self.assertEqual('Unnamed', descriptors[1].nickname) self.assertEqual('5366F1D198759F8894EA6E5FF768C667F59AFD24', descriptors[1].fingerprint) def test_old_descriptor(self): """ Parses a relay server descriptor from 2005. """ with open(get_resource('old_descriptor'), 'rb') as descriptor_file: desc = next(stem.descriptor.parse_file(descriptor_file, 'server-descriptor 1.0', validate = True)) self.assertEqual('krypton', desc.nickname) self.assertEqual('3E2F63E2356F52318B536A12B6445373808A5D6C', desc.fingerprint) self.assertEqual('212.37.39.59', desc.address) self.assertEqual(8000, desc.or_port) self.assertEqual(None, desc.socks_port) self.assertEqual(None, desc.dir_port) self.assertEqual(b'Tor 0.1.0.14 on FreeBSD i386', desc.platform) self.assertEqual(stem.version.Version('0.1.0.14'), desc.tor_version) self.assertEqual('FreeBSD i386', desc.operating_system) self.assertEqual(64820, desc.uptime) self.assertEqual(datetime.datetime(2005, 12, 16, 18, 1, 3), desc.published) self.assertEqual(None, desc.contact) self.assertEqual(None, desc.link_protocols) self.assertEqual(None, desc.circuit_protocols) self.assertEqual(False, desc.is_hidden_service_dir) self.assertEqual(True, desc.hibernating) self.assertEqual(False, desc.allow_single_hop_exits) self.assertEqual(False, desc.allow_tunneled_dir_requests) self.assertEqual(False, desc.extra_info_cache) self.assertEqual(None, desc.extra_info_digest) self.assertEqual(None, desc.extra_info_sha256_digest) self.assertEqual(BridgeDistribution.ANY, desc.bridge_distribution) self.assertEqual(set(), desc.family) self.assertEqual(102400, desc.average_bandwidth) self.assertEqual(10485760, desc.burst_bandwidth) self.assertEqual(0, desc.observed_bandwidth) self.assertEqual(datetime.datetime(2005, 12, 16, 18, 0, 48), desc.read_history_end) self.assertEqual(900, desc.read_history_interval) self.assertEqual(datetime.datetime(2005, 12, 16, 18, 0, 48), desc.write_history_end) self.assertEqual(900, desc.write_history_interval) self.assertEqual([], desc.get_unrecognized_lines()) # The read-history and write-history lines are pretty long so just checking # the initial contents for the line and parsed values. read_values_start = [20774, 489973, 510022, 511163, 20949] self.assertEqual(read_values_start, desc.read_history_values[:5]) write_values_start = [81, 8848, 8927, 8927, 83, 8848, 8931, 8929, 81, 8846] self.assertEqual(write_values_start, desc.write_history_values[:10]) def test_non_ascii_descriptor(self): """ Parses a descriptor with non-ascii content. """ with open(get_resource('non-ascii_descriptor'), 'rb') as descriptor_file: desc = next(stem.descriptor.parse_file(descriptor_file, 'server-descriptor 1.0', validate = True)) self.assertEqual('Coruscant', desc.nickname) self.assertEqual('0B9821545C48E496AEED9ECC0DB506C49FF8158D', desc.fingerprint) self.assertEqual('88.182.161.122', desc.address) self.assertEqual(9001, desc.or_port) self.assertEqual(None, desc.socks_port) self.assertEqual(9030, desc.dir_port) self.assertEqual(b'Tor 0.2.3.25 on Linux', desc.platform) self.assertEqual(stem.version.Version('0.2.3.25'), desc.tor_version) self.assertEqual('Linux', desc.operating_system) self.assertEqual(259738, desc.uptime) self.assertEqual(datetime.datetime(2013, 5, 18, 11, 16, 19), desc.published) self.assertEqual(b'1024D/04D2E818 L\xc3\xa9na\xc3\xafc Huard ', desc.contact) self.assertEqual(['1', '2'], desc.link_protocols) self.assertEqual(['1'], desc.circuit_protocols) self.assertEqual(True, desc.is_hidden_service_dir) self.assertEqual(False, desc.hibernating) self.assertEqual(False, desc.allow_single_hop_exits) self.assertEqual(False, desc.allow_tunneled_dir_requests) self.assertEqual(False, desc.extra_info_cache) self.assertEqual('56403D838DE152421CD401B8E57DAD4483A3D56B', desc.extra_info_digest) self.assertEqual(None, desc.extra_info_sha256_digest) self.assertEqual(BridgeDistribution.ANY, desc.bridge_distribution) self.assertEqual(set(), desc.family) self.assertEqual(102400, desc.average_bandwidth) self.assertEqual(204800, desc.burst_bandwidth) self.assertEqual(122818, desc.observed_bandwidth) self.assertEqual(stem.exit_policy.ExitPolicy('reject *:*'), desc.exit_policy) self.assertEqual([], desc.get_unrecognized_lines()) # Make sure that we can get a string representation for this descriptor # (having non-unicode content risks a UnicodeEncodeError)... # # https://trac.torproject.org/8265 self.assertTrue(isinstance(str(desc), str)) @test.require.cryptography def test_descriptor_signing(self): RelayDescriptor.create(sign = True) self.assertRaisesWith(NotImplementedError, 'Signing of BridgeDescriptor not implemented', BridgeDescriptor.create, sign = True) def test_router_status_entry(self): """ Tests creation of router status entries. """ desc_without_fingerprint = RelayDescriptor.create() exc_msg = 'Server descriptor lacks a fingerprint. This is an optional field, but required to make a router status entry.' self.assertRaisesWith(ValueError, exc_msg, desc_without_fingerprint.make_router_status_entry) desc = RelayDescriptor.create(OrderedDict(( ('router', 'caerSidi 71.35.133.197 9001 0 0'), ('published', '2012-02-29 04:03:19'), ('fingerprint', '4F0C 867D F0EF 6816 0568 C826 838F 482C EA7C FE44'), ('or-address', ['71.35.133.197:9001', '[12ab:2e19:3bcf::02:9970]:9001']), ('onion-key', '\n-----BEGIN RSA PUBLIC KEY-----%s-----END RSA PUBLIC KEY-----' % stem.descriptor.CRYPTO_BLOB), ('signing-key', '\n-----BEGIN RSA PUBLIC KEY-----%s-----END RSA PUBLIC KEY-----' % stem.descriptor.CRYPTO_BLOB), ))).make_router_status_entry() self.assertEqual(stem.descriptor.router_status_entry.RouterStatusEntryV3, type(desc)) self.assertEqual('caerSidi', desc.nickname) self.assertEqual('4F0C867DF0EF68160568C826838F482CEA7CFE44', desc.fingerprint) self.assertEqual(datetime.datetime(2012, 2, 29, 4, 3, 19), desc.published) self.assertEqual('71.35.133.197', desc.address) self.assertEqual(9001, desc.or_port) self.assertEqual(None, desc.dir_port) self.assertEqual(['Fast', 'Named', 'Running', 'Stable', 'Valid'], desc.flags) self.assertEqual(None, desc.version) self.assertEqual(None, desc.version_line) self.assertEqual([('71.35.133.197', 9001, False), ('12ab:2e19:3bcf::02:9970', 9001, True)], desc.or_addresses) self.assertEqual(None, desc.identifier_type) self.assertEqual(None, desc.identifier) self.assertEqual('A863EFE8395C41C880782B89B850D20EDD242BDA', desc.digest) self.assertEqual(153600, desc.bandwidth) self.assertEqual(None, desc.measured) self.assertEqual(False, desc.is_unmeasured) self.assertEqual([], desc.unrecognized_bandwidth_entries) self.assertEqual(stem.exit_policy.MicroExitPolicy('reject 1-65535'), desc.exit_policy) self.assertEqual([], desc.microdescriptor_hashes) def test_make_router_status_entry_with_live_descriptor(self): """ Tests creation of router status entries with a live server descriptor. """ with open(get_resource('server_descriptor_with_ed25519'), 'rb') as descriptor_file: desc = next(stem.descriptor.parse_file(descriptor_file, validate = True)).make_router_status_entry() self.assertEqual(stem.descriptor.router_status_entry.RouterStatusEntryV3, type(desc)) self.assertEqual('destiny', desc.nickname) self.assertEqual('F65E0196C94DFFF48AFBF2F5F9E3E19AAE583FD0', desc.fingerprint) self.assertEqual(datetime.datetime(2015, 8, 22, 15, 21, 45), desc.published) self.assertEqual('94.242.246.23', desc.address) self.assertEqual(9001, desc.or_port) self.assertEqual(443, desc.dir_port) self.assertEqual(['Fast', 'Named', 'Running', 'Stable', 'Valid'], desc.flags) self.assertEqual(stem.version.Version('0.2.7.2-alpha-dev'), desc.version) self.assertEqual('Tor 0.2.7.2-alpha-dev', desc.version_line) self.assertEqual([('2a01:608:ffff:ff07::1:23', 9003, True)], desc.or_addresses) self.assertEqual('ed25519', desc.identifier_type) self.assertEqual('pbYagEQPUiNjcDp/oY2oESXkDzd8PZlr26kaR7nUkao', desc.identifier) self.assertEqual('B5E441051D139CCD84BC765D130B01E44DAC29AD', desc.digest) self.assertEqual(149715200, desc.bandwidth) self.assertEqual(None, desc.measured) self.assertEqual(False, desc.is_unmeasured) self.assertEqual([], desc.unrecognized_bandwidth_entries) self.assertEqual(stem.exit_policy.MicroExitPolicy('reject 25,465,587,10000,14464'), desc.exit_policy) self.assertEqual([], desc.microdescriptor_hashes) @patch('time.time', Mock(return_value = time.mktime(datetime.date(2010, 1, 1).timetuple()))) def test_with_ed25519(self): """ Parses a descriptor with a ed25519 identity key, as added by proposal 228 (cross certification onionkeys). """ with open(get_resource('server_descriptor_with_ed25519'), 'rb') as descriptor_file: desc = next(stem.descriptor.parse_file(descriptor_file, validate = True)) family = set([ '$379FB450010D17078B3766C2273303C358C3A442', '$3EB46C1D8D8B1C0BBCB6E4F08301EF68B7F5308D', '$B0279A521375F3CB2AE210BDBFC645FDD2E1973A', '$EC116BCB80565A408CE67F8EC3FE3B0B02C3A065', ]) self.assertEqual(1, desc.certificate.version) self.assertEqual(CertType.SIGNING, desc.certificate.type) self.assertEqual(datetime.datetime(2015, 8, 28, 17, 0, 0), desc.certificate.expiration) self.assertEqual(1, desc.certificate.key_type) self.assertTrue(desc.certificate.key.startswith(b'\xa5\xb6\x1a\x80D\x0f')) self.assertTrue(desc.certificate.signature.startswith(b'\xc6\x8e\xd3\xae\x0b')) self.assertEqual(1, len(desc.certificate.extensions)) self.assertTrue('bWPo2fIzo3uOywfoM' in desc.certificate.encoded) extension = desc.certificate.extensions[0] self.assertEqual(ExtensionType.HAS_SIGNING_KEY, extension.type) self.assertEqual([], extension.flags) self.assertEqual(0, extension.flag_int) self.assertTrue(extension.data.startswith(b'g\xa6\xb5Q\xa6\xd2')) self.assertEqual('destiny', desc.nickname) self.assertEqual('F65E0196C94DFFF48AFBF2F5F9E3E19AAE583FD0', desc.fingerprint) self.assertEqual('94.242.246.23', desc.address) self.assertEqual(9001, desc.or_port) self.assertEqual(None, desc.socks_port) self.assertEqual(443, desc.dir_port) self.assertTrue('bWPo2fIzo3uOywfoM' in desc.ed25519_certificate) self.assertEqual('Z6a1UabSK+N21j6NnyM6N7jssH6DK68qa6W5uB4QpGQ', desc.ed25519_master_key) self.assertEqual('w+cKNZTlL7vz/4WgYdFUblzJy3VdTw0mfFK4N3SPFCt20fNKt9SgiZ5V/2ai3kgGsc6oCsyUesSiYtPcTXMLCw', desc.ed25519_signature) self.assertEqual(b'Tor 0.2.7.2-alpha-dev on Linux', desc.platform) self.assertEqual(stem.version.Version('0.2.7.2-alpha-dev'), desc.tor_version) self.assertEqual('Linux', desc.operating_system) self.assertEqual(1362680, desc.uptime) self.assertEqual(datetime.datetime(2015, 8, 22, 15, 21, 45), desc.published) self.assertEqual(b'0x02225522 Frenn vun der Enn (FVDE) ', desc.contact) self.assertEqual(['1', '2'], desc.link_protocols) self.assertEqual(['1'], desc.circuit_protocols) self.assertEqual(True, desc.is_hidden_service_dir) self.assertEqual(False, desc.hibernating) self.assertEqual(False, desc.allow_single_hop_exits) self.assertEqual(False, desc.allow_tunneled_dir_requests) self.assertEqual(False, desc.extra_info_cache) self.assertEqual('44E9B679AF0B4EB09296985BAF4066AE9CA5BB93', desc.extra_info_digest) self.assertEqual('r+roMxhsjd1GPpn5knQoBvtE9Rhsv8zQHCqiYL6u2CA', desc.extra_info_sha256_digest) self.assertEqual(family, desc.family) self.assertEqual(149715200, desc.average_bandwidth) self.assertEqual(1048576000, desc.burst_bandwidth) self.assertEqual(51867731, desc.observed_bandwidth) self.assertTrue(desc.exit_policy is not None) self.assertEqual(stem.exit_policy.MicroExitPolicy('reject 25,465,587,10000,14464'), desc.exit_policy_v6) self.assertTrue('MIGJAoGBAKpPOe' in desc.onion_key) self.assertTrue('iW8BqwH5VKqZai' in desc.onion_key_crosscert) self.assertTrue('AQoABhtwAWemtV' in desc.ntor_onion_key_crosscert) self.assertEqual('0', desc.ntor_onion_key_crosscert_sign) self.assertTrue('MIGJAoGBAOUS7x' in desc.signing_key) self.assertTrue('y72z1dZOYxVQVL' in desc.signature) self.assertEqual('B5E441051D139CCD84BC765D130B01E44DAC29AD', desc.digest()) self.assertEqual([], desc.get_unrecognized_lines()) @patch('time.time', Mock(return_value = time.mktime(datetime.date(2020, 1, 1).timetuple()))) def test_with_ed25519_expired_cert(self): """ Parses a server descriptor with an expired ed25519 certificate """ desc_text = open(get_resource('bridge_descriptor_with_ed25519'), 'rb').read() desc_iter = stem.descriptor.server_descriptor._parse_file(io.BytesIO(desc_text), validate = True) self.assertRaises(ValueError, list, desc_iter) def test_bridge_with_ed25519(self): """ Parses a bridge descriptor with ed25519. """ with open(get_resource('bridge_descriptor_with_ed25519'), 'rb') as descriptor_file: desc = next(stem.descriptor.parse_file(descriptor_file, validate = True)) self.assertEqual('ChandlerObfs11', desc.nickname) self.assertEqual('678912ABD7398DF8EFC8FA2BC7DEF610710360C4', desc.fingerprint) self.assertEqual('10.162.85.172', desc.address) self.assertFalse(hasattr(desc, 'ed25519_certificate')) self.assertEqual('lgIuiAJCoXPRwWoHgG4ZAoKtmrv47aPr4AsbmESj8AA', desc.ed25519_certificate_hash) self.assertEqual('OB/fqLD8lYmjti09R+xXH/D4S2qlizxdZqtudnsunxE', desc.router_digest_sha256) self.assertEqual([], desc.get_unrecognized_lines()) def test_cr_in_contact_line(self): """ Parses a descriptor with a huge contact line containing anomalous carriage returns ('\r' entries). """ with open(get_resource('cr_in_contact_line'), 'rb') as descriptor_file: desc = next(stem.descriptor.parse_file(descriptor_file, 'server-descriptor 1.0', validate = True)) self.assertEqual('pogonip', desc.nickname) self.assertEqual('6DABD62BC65D4E6FE620293157FC76968DAB9C9B', desc.fingerprint) self.assertEqual('75.5.248.48', desc.address) # the contact info block is huge so just checking the start and end, # including some of the embedded carriage returns contact_start = b'jie1 at pacbell dot net -----BEGIN PGP PUBLIC KEY BLOCK-----\rVersion:' contact_end = b'YFRk3NhCY=\r=Xaw3\r-----END PGP PUBLIC KEY BLOCK-----' self.assertTrue(desc.contact.startswith(contact_start)) self.assertTrue(desc.contact.endswith(contact_end)) def test_negative_uptime(self): """ Parses a descriptor where we are tolerant of a negative uptime, and another where we shouldn't be. """ with open(get_resource('negative_uptime'), 'rb') as descriptor_file: desc = next(stem.descriptor.parse_file(descriptor_file, 'server-descriptor 1.0', validate = True)) self.assertEqual('TipTor', desc.nickname) self.assertEqual('137962D4931DBF08A24E843288B8A155D6D2AEDD', desc.fingerprint) self.assertEqual('62.99.247.83', desc.address) # modify the relay version so it's after when the negative uptime bug # should appear descriptor_contents = desc.get_bytes().replace(b'Tor 0.1.1.25', b'Tor 0.1.2.7') self.assertRaises(ValueError, stem.descriptor.server_descriptor.RelayDescriptor, descriptor_contents, True) def test_bridge_descriptor(self): """ Parses a bridge descriptor. """ with open(get_resource('bridge_descriptor'), 'rb') as descriptor_file: desc = next(stem.descriptor.parse_file(descriptor_file, 'bridge-server-descriptor 1.0', validate = True)) self.assertEqual('Unnamed', desc.nickname) self.assertEqual('4ED573582B16ACDAF6E42AA044A038F83A7F6333', desc.fingerprint) self.assertEqual('10.18.111.71', desc.address) self.assertEqual(9001, desc.or_port) self.assertEqual(None, desc.socks_port) self.assertEqual(None, desc.dir_port) self.assertEqual(b'Tor 0.2.0.26-rc (r14597) on Linux i686', desc.platform) self.assertEqual(stem.version.Version('0.2.0.26-rc'), desc.tor_version) self.assertEqual('Linux i686', desc.operating_system) self.assertEqual(204, desc.uptime) self.assertEqual(datetime.datetime(2008, 5, 20, 19, 45, 0), desc.published) self.assertEqual(None, desc.contact) self.assertEqual(['1', '2'], desc.link_protocols) self.assertEqual(['1'], desc.circuit_protocols) self.assertEqual(False, desc.is_hidden_service_dir) self.assertEqual(False, desc.hibernating) self.assertEqual(False, desc.allow_single_hop_exits) self.assertEqual(False, desc.allow_tunneled_dir_requests) self.assertEqual(True, desc.extra_info_cache) self.assertEqual('BB1F13AA431421BEA29B840A2E33BB1C31C2990B', desc.extra_info_digest) self.assertEqual(None, desc.extra_info_sha256_digest) self.assertEqual(BridgeDistribution.ANY, desc.bridge_distribution) self.assertEqual(set(), desc.family) self.assertEqual(3220480, desc.average_bandwidth) self.assertEqual(6441984, desc.burst_bandwidth) self.assertEqual(59408, desc.observed_bandwidth) self.assertEqual(stem.exit_policy.ExitPolicy('reject *:*'), desc.exit_policy) self.assertEqual('00F1CD29AD308A59A9AB5A88B49ECB46E0F215FD', desc.digest()) self.assertEqual([], desc.get_unrecognized_lines()) def test_minimal_relay_descriptor(self): """ Basic sanity check that we can parse a relay server descriptor with minimal attributes. """ desc = RelayDescriptor.create({'router': 'caerSidi 71.35.133.197 9001 0 0'}) self.assertEqual('caerSidi', desc.nickname) self.assertEqual('71.35.133.197', desc.address) self.assertEqual(None, desc.fingerprint) def test_with_opt(self): """ Includes an 'opt ' entry. """ desc = RelayDescriptor.create({'opt': 'contact www.atagar.com/contact/'}) self.assertEqual(b'www.atagar.com/contact/', desc.contact) def test_unrecognized_line(self): """ Includes unrecognized content in the descriptor. """ desc = RelayDescriptor.create({'pepperjack': 'is oh so tasty!'}) self.assertEqual(['pepperjack is oh so tasty!'], desc.get_unrecognized_lines()) def test_proceeding_line(self): """ Includes a line prior to the 'router' entry. """ desc_text = b'hibernate 1\n' + RelayDescriptor.content() expect_invalid_attr_for_text(self, desc_text) def test_trailing_line(self): """ Includes a line after the 'router-signature' entry. """ desc_text = RelayDescriptor.content() + b'\nhibernate 1' expect_invalid_attr_for_text(self, desc_text) def test_nickname_missing(self): """ Constructs with a malformed router entry. """ expect_invalid_attr(self, {'router': ' 71.35.133.197 9001 0 0'}, 'nickname') def test_nickname_too_long(self): """ Constructs with a nickname that is an invalid length. """ expect_invalid_attr(self, {'router': 'saberrider2008ReallyLongNickname 71.35.133.197 9001 0 0'}, 'nickname') def test_nickname_invalid_char(self): """ Constructs with an invalid relay nickname. """ expect_invalid_attr(self, {'router': '$aberrider2008 71.35.133.197 9001 0 0'}, 'nickname') def test_address_malformed(self): """ Constructs with an invalid ip address. """ expect_invalid_attr(self, {'router': 'caerSidi 371.35.133.197 9001 0 0'}, 'address') def test_port_too_high(self): """ Constructs with an ORPort that is too large. """ expect_invalid_attr(self, {'router': 'caerSidi 71.35.133.197 900001 0 0'}, 'or_port') def test_port_malformed(self): """ Constructs with an ORPort that isn't numeric. """ expect_invalid_attr(self, {'router': 'caerSidi 71.35.133.197 900a1 0 0'}, 'or_port') def test_port_newline(self): """ Constructs with a newline replacing the ORPort. """ expect_invalid_attr(self, {'router': 'caerSidi 71.35.133.197 \n 0 0'}, 'or_port') def test_platform_empty(self): """ Constructs with an empty platform entry. """ desc_text = RelayDescriptor.content({'platform': ''}) desc = RelayDescriptor(desc_text, validate = False) self.assertEqual(b'', desc.platform) # does the same but with 'platform ' replaced with 'platform' desc_text = desc_text.replace(b'platform ', b'platform') desc = RelayDescriptor(desc_text, validate = False) self.assertEqual(b'', desc.platform) def test_platform_for_node_tor(self): """ Parse a platform line belonging to a node-Tor relay. """ desc = RelayDescriptor.create({'platform': 'node-Tor 0.1.0 on Linux x86_64'}) self.assertEqual(b'node-Tor 0.1.0 on Linux x86_64', desc.platform) self.assertEqual(stem.version.Version('0.1.0'), desc.tor_version) self.assertEqual('Linux x86_64', desc.operating_system) def test_protocols_no_circuit_versions(self): """ Constructs with a protocols line without circuit versions. """ expect_invalid_attr(self, {'opt': 'protocols Link 1 2'}, 'circuit_protocols') @patch('stem.prereq.is_crypto_available', Mock(return_value = False)) def test_published_leap_year(self): """ Constructs with a published entry for a leap year, and when the date is invalid. """ expect_invalid_attr(self, {'published': '2011-02-29 04:03:19'}, 'published') desc = RelayDescriptor.create({'published': '2012-02-29 04:03:19'}) self.assertEqual(datetime.datetime(2012, 2, 29, 4, 3, 19), desc.published) def test_published_no_time(self): """ Constructs with a published entry without a time component. """ expect_invalid_attr(self, {'published': '2012-01-01'}, 'published') def test_read_and_write_history(self): """ Parses a read-history and write-history entry. This is now a deprecated field for relay server descriptors but is still found in archives and extra-info descriptors. """ for field in ('read-history', 'write-history'): value = '2005-12-16 18:00:48 (900 s) 81,8848,8927,8927,83,8848' desc = RelayDescriptor.create({'opt %s' % field: value}) if field == 'read-history': attr = (desc.read_history_end, desc.read_history_interval, desc.read_history_values) else: attr = (desc.write_history_end, desc.write_history_interval, desc.write_history_values) expected_end = datetime.datetime(2005, 12, 16, 18, 0, 48) expected_values = [81, 8848, 8927, 8927, 83, 8848] self.assertEqual(expected_end, attr[0]) self.assertEqual(900, attr[1]) self.assertEqual(expected_values, attr[2]) def test_read_history_empty(self): """ Parses a read-history with an empty value. """ desc = RelayDescriptor.create({'opt read-history': '2005-12-17 01:23:11 (900 s) '}) self.assertEqual(datetime.datetime(2005, 12, 17, 1, 23, 11), desc.read_history_end) self.assertEqual(900, desc.read_history_interval) self.assertEqual([], desc.read_history_values) @patch('stem.prereq.is_crypto_available', Mock(return_value = False)) def test_annotations(self): """ Checks that content before a descriptor are parsed as annotations. """ desc_text = b'@pepperjack very tasty\n@mushrooms not so much\n' desc_text += RelayDescriptor.content() desc_text += b'\ntrailing text that should be invalid, ho hum' # running _parse_file should provide an iterator with a single descriptor desc_iter = stem.descriptor.server_descriptor._parse_file(io.BytesIO(desc_text), validate = True) self.assertRaises(ValueError, list, desc_iter) desc_text = b'@pepperjack very tasty\n@mushrooms not so much\n' desc_text += RelayDescriptor.content({'router': 'caerSidi 71.35.133.197 9001 0 0'}) desc_iter = stem.descriptor.server_descriptor._parse_file(io.BytesIO(desc_text)) desc_entries = list(desc_iter) self.assertEqual(1, len(desc_entries)) desc = desc_entries[0] self.assertEqual('caerSidi', desc.nickname) self.assertEqual(b'@pepperjack very tasty', desc.get_annotation_lines()[0]) self.assertEqual(b'@mushrooms not so much', desc.get_annotation_lines()[1]) self.assertEqual({b'@pepperjack': b'very tasty', b'@mushrooms': b'not so much'}, desc.get_annotations()) self.assertEqual([], desc.get_unrecognized_lines()) def test_duplicate_field(self): """ Constructs with a field appearing twice. """ desc_text = RelayDescriptor.content({'': ''}) desc_text = desc_text.replace(b'', b'contact foo\ncontact bar') expect_invalid_attr_for_text(self, desc_text, 'contact', b'foo') def test_missing_required_attr(self): """ Test making a descriptor with a missing required attribute. """ for attr in stem.descriptor.server_descriptor.REQUIRED_FIELDS: desc_text = RelayDescriptor.content(exclude = [attr]) self.assertRaises(ValueError, RelayDescriptor, desc_text, True) # check that we can still construct it without validation desc = RelayDescriptor(desc_text, validate = False) # for one of them checks that the corresponding values are None if attr == 'router': self.assertEqual(None, desc.nickname) self.assertEqual(None, desc.address) self.assertEqual(None, desc.or_port) self.assertEqual(None, desc.socks_port) self.assertEqual(None, desc.dir_port) def test_fingerprint_invalid(self): """ Checks that, with a correctly formed fingerprint, we'll fail validation if it doesn't match the hash of our signing key. """ fingerprint = '4F0C 867D F0EF 6816 0568 C826 838F 482C EA7C FE45' expect_invalid_attr(self, {'opt fingerprint': fingerprint}, 'fingerprint', fingerprint.replace(' ', '')) def test_with_bridge_distribution(self): """ Include a preferred method of bridge distribution. """ desc = RelayDescriptor.create({'bridge-distribution-request': 'email'}) self.assertEqual(BridgeDistribution.EMAIL, desc.bridge_distribution) def test_ipv6_policy(self): """ Checks a 'ipv6-policy' line. """ desc = RelayDescriptor.create({'ipv6-policy': 'accept 22-23,53,80,110'}) self.assertEqual(stem.exit_policy.MicroExitPolicy('accept 22-23,53,80,110'), desc.exit_policy_v6) def test_extrainfo_sha256_digest(self): """ Extrainfo descriptor line with both a hex and base64 encoded sha256 digest. """ desc = RelayDescriptor.create({'extra-info-digest': '03272BF7C68484AFBDA508DAE3734D809E4A5BC4 DWMz1AEdqPlcroubwx3lPEoGbT+oX7S2BH653sPIqfI'}) self.assertEqual('03272BF7C68484AFBDA508DAE3734D809E4A5BC4', desc.extra_info_digest) self.assertEqual('DWMz1AEdqPlcroubwx3lPEoGbT+oX7S2BH653sPIqfI', desc.extra_info_sha256_digest) def test_protocols(self): """ Checks a 'proto' line. """ desc = RelayDescriptor.create({'proto': 'Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=1-4 LinkAuth=1 Microdesc=1 Relay=1-2'}) self.assertEqual({'Cons': [1], 'Desc': [1], 'DirCache': [1], 'HSDir': [1], 'HSIntro': [3], 'HSRend': [1], 'Link': [1, 2, 3, 4], 'LinkAuth': [1], 'Microdesc': [1], 'Relay': [1, 2]}, desc.protocols) def test_protocols_with_no_mapping(self): """ Checks a 'proto' line when it's not key=value pairs. """ exc_msg = "'proto' should be a series of 'key=value' pairs but was: Desc Link=1-4" self.assertRaisesWith(ValueError, exc_msg, RelayDescriptor.create, {'proto': 'Desc Link=1-4'}) def test_parse_with_non_int_version(self): """ Checks a 'proto' line with non-numeric content. """ exc_msg = 'Protocol values should be a number or number range, but was: proto Desc=hi Link=1-4' self.assertRaisesWith(ValueError, exc_msg, RelayDescriptor.create, {'proto': 'Desc=hi Link=1-4'}) def test_ntor_onion_key(self): """ Checks a 'ntor-onion-key' line. """ desc = RelayDescriptor.create({'ntor-onion-key': 'Od2Sj3UXFyDjwESLXk6fhatqW9z/oBL/vAKJ+tbDqUU='}) self.assertEqual('Od2Sj3UXFyDjwESLXk6fhatqW9z/oBL/vAKJ+tbDqUU=', desc.ntor_onion_key) def test_minimal_bridge_descriptor(self): """ Basic sanity check that we can parse a descriptor with minimal attributes. """ desc = BridgeDescriptor.create() self.assertTrue(desc.nickname.startswith('Unnamed')) self.assertEqual(None, desc.fingerprint) self.assertEqual('006FD96BA35E7785A6A3B8B75FE2E2435A13BDB4', desc.digest()) # check that we don't have crypto fields self.assertRaises(AttributeError, getattr, desc, 'onion_key') self.assertRaises(AttributeError, getattr, desc, 'signing_key') self.assertRaises(AttributeError, getattr, desc, 'signature') def test_bridge_unsanitized(self): """ Targeted check that individual unsanitized attributes will be detected. """ unsanitized_attr = [ {'router': 'Unnamed 75.45.227.253 9001 0 0'}, {'contact': 'Damian'}, {'or-address': '71.35.133.197:9001'}, {'or-address': '[12ab:2e19:3bcf::02:9970]:9001'}, {'onion-key': '\n-----BEGIN RSA PUBLIC KEY-----%s-----END RSA PUBLIC KEY-----' % stem.descriptor.CRYPTO_BLOB}, {'signing-key': '\n-----BEGIN RSA PUBLIC KEY-----%s-----END RSA PUBLIC KEY-----' % stem.descriptor.CRYPTO_BLOB}, {'router-signature': '\n-----BEGIN SIGNATURE-----%s-----END SIGNATURE-----' % stem.descriptor.CRYPTO_BLOB}, ] for attr in unsanitized_attr: desc = BridgeDescriptor.create(attr) self.assertFalse(desc.is_scrubbed()) def test_bridge_unsanitized_relay(self): """ Checks that parsing a normal relay descriptor as a bridge will fail due to its unsanatized content. """ desc_text = RelayDescriptor.content({'router-digest': '006FD96BA35E7785A6A3B8B75FE2E2435A13BDB4'}) desc = BridgeDescriptor(desc_text) self.assertFalse(desc.is_scrubbed()) def test_router_digest(self): """ Constructs with a router-digest line with both valid and invalid contents. """ # checks with valid content router_digest = '068A2E28D4C934D9490303B7A645BA068DCA0504' desc = BridgeDescriptor.create({'router-digest': router_digest}) self.assertEqual(router_digest, desc.digest()) # checks when missing desc_text = BridgeDescriptor.content(exclude = ['router-digest']) self.assertRaises(ValueError, BridgeDescriptor, desc_text, True) # check that we can still construct it without validation desc = BridgeDescriptor(desc_text, validate = False) self.assertEqual(None, desc.digest()) # checks with invalid content test_values = ( '', '006FD96BA35E7785A6A3B8B75FE2E2435A13BDB44', '006FD96BA35E7785A6A3B8B75FE2E2435A13BDB', '006FD96BA35E7785A6A3B8B75FE2E2435A13BDBH', ) for value in test_values: desc_text = BridgeDescriptor.content({'router-digest': value}) self.assertRaises(ValueError, BridgeDescriptor, desc_text, True) desc = BridgeDescriptor(desc_text, validate = False) self.assertEqual(None, desc.digest()) def test_or_address_v4(self): """ Constructs a bridge descriptor with a sanatized IPv4 or-address entry. """ desc = BridgeDescriptor.create({'or-address': '10.45.227.253:9001'}) self.assertEqual([('10.45.227.253', 9001, False)], desc.or_addresses) def test_or_address_v6(self): """ Constructs a bridge descriptor with a sanatized IPv6 or-address entry. """ desc = BridgeDescriptor.create({'or-address': '[fd9f:2e19:3bcf::02:9970]:9001'}) self.assertEqual([('fd9f:2e19:3bcf::02:9970', 9001, True)], desc.or_addresses) def test_or_address_multiple(self): """ Constructs a bridge descriptor with multiple or-address entries and multiple ports. """ desc_text = b'\n'.join(( BridgeDescriptor.content(), b'or-address 10.45.227.253:9001', b'or-address [fd9f:2e19:3bcf::02:9970]:443', )) expected_or_addresses = [ ('10.45.227.253', 9001, False), ('fd9f:2e19:3bcf::02:9970', 443, True), ] desc = BridgeDescriptor(desc_text) self.assertEqual(expected_or_addresses, desc.or_addresses) def test_pickleability(self): """ Checks that we can unpickle lazy loaded server descriptors. """ with open(get_resource('example_descriptor'), 'rb') as descriptor_file: desc = next(stem.descriptor.parse_file(descriptor_file, 'server-descriptor 1.0')) encoded_desc = pickle.dumps(desc) restored_desc = pickle.loads(encoded_desc) self.assertEqual('caerSidi', restored_desc.nickname) self.assertEqual('A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB', restored_desc.fingerprint) self.assertEqual('71.35.133.197', restored_desc.address) self.assertEqual(9001, restored_desc.or_port) self.assertEqual(None, restored_desc.socks_port) stem-1.7.1/test/unit/descriptor/remote.py0000664000175000017500000003302513411002341021163 0ustar atagaratagar00000000000000""" Unit tests for stem.descriptor.remote. """ import io import socket import time import unittest import stem import stem.descriptor.remote import stem.prereq import stem.util.str_tools from stem.descriptor.remote import Compression from test.unit.descriptor import read_resource try: from http.client import HTTPMessage # python3 except ImportError: from httplib import HTTPMessage # python2 try: # added in python 3.3 from unittest.mock import patch, Mock, MagicMock except ImportError: from mock import patch, Mock, MagicMock # The urlopen() method is in a different location depending on if we're using # python 2.x or 3.x. The 2to3 converter accounts for this in imports, but not # mock annotations. URL_OPEN = 'urllib.request.urlopen' if stem.prereq.is_python_3() else 'urllib2.urlopen' TEST_RESOURCE = '/tor/server/fp/9695DFC35FFEB861329B9F1AB04C46397020CE31' # Output from requesting moria1's descriptor from itself... # % curl http://128.31.0.39:9131/tor/server/fp/9695DFC35FFEB861329B9F1AB04C46397020CE31 TEST_DESCRIPTOR = b"""\ router moria1 128.31.0.34 9101 0 9131 platform Tor 0.2.5.0-alpha-dev on Linux protocols Link 1 2 Circuit 1 published 2013-07-05 23:48:52 fingerprint 9695 DFC3 5FFE B861 329B 9F1A B04C 4639 7020 CE31 uptime 1818933 bandwidth 512000 62914560 1307929 extra-info-digest 17D0142F6EBCDF60160EB1794FA6C9717D581F8C caches-extra-info onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBALzd4bhz1usB7wpoaAvP+BBOnNIk7mByAKV6zvyQ0p1M09oEmxPMc3qD AAm276oJNf0eq6KWC6YprzPWFsXEIdXSqA6RWXCII1JG/jOoy6nt478BkB8TS9I9 1MJW27ppRaqnLiTmBmM+qzrsgJGwf+onAgUKKH2GxlVgahqz8x6xAgMBAAE= -----END RSA PUBLIC KEY----- signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBALtJ9uD7cD7iHjqNA3AgsX9prES5QN+yFQyr2uOkxzhvunnaf6SNhzWW bkfylnMrRm/qCz/czcjZO6N6EKHcXmypehvP566B7gAQ9vDsb+l7VZVWgXvzNc2s tl3P7qpC08rgyJh1GqmtQTCesIDqkEyWxwToympCt09ZQRq+fIttAgMBAAE= -----END RSA PUBLIC KEY----- hidden-service-dir contact 1024D/28988BF5 arma mit edu ntor-onion-key 9ZVjNkf/iLEnD685SpC5kcDytQ7u5ViiI9JOftdbE0k= reject *:* router-signature -----BEGIN SIGNATURE----- Y8Tj2e7mPbFJbguulkPEBVYzyO57p4btpWEXvRMD6vxIh/eyn25pehg5dUVBtZlL iO3EUE0AEYah2W9gdz8t+i3Dtr0zgqLS841GC/TyDKCm+MKmN8d098qnwK0NGF9q 01NZPuSqXM1b6hnl2espFzL7XL8XEGRU+aeg+f/ukw4= -----END SIGNATURE----- """ HEADER = '\r\n'.join([ 'Date: Fri, 13 Apr 2018 16:35:50 GMT', 'Content-Type: application/octet-stream', 'X-Your-Address-Is: 97.103.17.56', 'Pragma: no-cache', 'Content-Encoding: %s', ]) def _orport_mock(data, encoding = 'identity', response_code_header = None): if response_code_header is None: response_code_header = b'HTTP/1.0 200 OK\r\n' data = response_code_header + stem.util.str_tools._to_bytes(HEADER % encoding) + b'\r\n\r\n' + data cells = [] for hunk in [data[i:i + 50] for i in range(0, len(data), 50)]: cell = Mock() cell.data = hunk cells.append(cell) connect_mock = MagicMock() relay_mock = connect_mock().__enter__() circ_mock = relay_mock.create_circuit().__enter__() circ_mock.send.return_value = cells return connect_mock def _dirport_mock(data, encoding = 'identity'): dirport_mock = Mock() dirport_mock().read.return_value = data if stem.prereq.is_python_3(): headers = HTTPMessage() for line in HEADER.splitlines(): key, value = line.split(': ', 1) headers.add_header(key, encoding if key == 'Content-Encoding' else value) dirport_mock().headers = headers else: dirport_mock().headers = HTTPMessage(io.BytesIO(HEADER % encoding)) return dirport_mock class TestDescriptorDownloader(unittest.TestCase): def tearDown(self): # prevent our mocks from impacting other tests stem.descriptor.remote.SINGLETON_DOWNLOADER = None @patch('stem.client.Relay.connect', _orport_mock(TEST_DESCRIPTOR)) def test_using_orport(self): """ Download a descriptor through the ORPort. """ reply = stem.descriptor.remote.their_server_descriptor( endpoints = [stem.ORPort('12.34.56.78', 1100)], validate = True, ) self.assertEqual(1, len(list(reply))) self.assertEqual('moria1', list(reply)[0].nickname) self.assertEqual(5, len(reply.reply_headers)) def test_orport_response_code_headers(self): """ When successful Tor provides a '200 OK' status, but we should accept other 2xx response codes, reason text, and recognize HTTP errors. """ response_code_headers = ( b'HTTP/1.0 200 OK\r\n', b'HTTP/1.0 205 OK\r\n', b'HTTP/1.0 200 This is also alright\r\n', ) for header in response_code_headers: with patch('stem.client.Relay.connect', _orport_mock(TEST_DESCRIPTOR, response_code_header = header)): stem.descriptor.remote.their_server_descriptor( endpoints = [stem.ORPort('12.34.56.78', 1100)], validate = True, ).run() with patch('stem.client.Relay.connect', _orport_mock(TEST_DESCRIPTOR, response_code_header = b'HTTP/1.0 500 Kaboom\r\n')): request = stem.descriptor.remote.their_server_descriptor( endpoints = [stem.ORPort('12.34.56.78', 1100)], validate = True, ) self.assertRaisesWith(stem.ProtocolError, "Response should begin with HTTP success, but was 'HTTP/1.0 500 Kaboom'", request.run) @patch(URL_OPEN, _dirport_mock(TEST_DESCRIPTOR)) def test_using_dirport(self): """ Download a descriptor through the DirPort. """ reply = stem.descriptor.remote.their_server_descriptor( endpoints = [stem.DirPort('12.34.56.78', 1100)], validate = True, ) self.assertEqual(1, len(list(reply))) self.assertEqual('moria1', list(reply)[0].nickname) self.assertEqual(5, len(reply.reply_headers)) def test_gzip_url_override(self): query = stem.descriptor.remote.Query(TEST_RESOURCE, start = False) self.assertEqual([Compression.PLAINTEXT], query.compression) self.assertEqual(TEST_RESOURCE, query.resource) query = stem.descriptor.remote.Query(TEST_RESOURCE + '.z', compression = Compression.PLAINTEXT, start = False) self.assertEqual([Compression.GZIP], query.compression) self.assertEqual(TEST_RESOURCE, query.resource) def test_zstd_support_check(self): with patch('stem.prereq.is_zstd_available', Mock(return_value = True)): query = stem.descriptor.remote.Query(TEST_RESOURCE, compression = Compression.ZSTD, start = False) self.assertEqual([Compression.ZSTD], query.compression) with patch('stem.prereq.is_zstd_available', Mock(return_value = False)): query = stem.descriptor.remote.Query(TEST_RESOURCE, compression = Compression.ZSTD, start = False) self.assertEqual([Compression.PLAINTEXT], query.compression) def test_lzma_support_check(self): with patch('stem.prereq.is_lzma_available', Mock(return_value = True)): query = stem.descriptor.remote.Query(TEST_RESOURCE, compression = Compression.LZMA, start = False) self.assertEqual([Compression.LZMA], query.compression) with patch('stem.prereq.is_lzma_available', Mock(return_value = False)): query = stem.descriptor.remote.Query(TEST_RESOURCE, compression = Compression.LZMA, start = False) self.assertEqual([Compression.PLAINTEXT], query.compression) @patch(URL_OPEN, _dirport_mock(read_resource('compressed_identity'), encoding = 'identity')) def test_compression_plaintext(self): """ Download a plaintext descriptor. """ descriptors = list(stem.descriptor.remote.get_server_descriptors( '9695DFC35FFEB861329B9F1AB04C46397020CE31', compression = Compression.PLAINTEXT, validate = True, )) self.assertEqual(1, len(descriptors)) self.assertEqual('moria1', descriptors[0].nickname) @patch(URL_OPEN, _dirport_mock(read_resource('compressed_gzip'), encoding = 'gzip')) def test_compression_gzip(self): """ Download a gip compressed descriptor. """ descriptors = list(stem.descriptor.remote.get_server_descriptors( '9695DFC35FFEB861329B9F1AB04C46397020CE31', compression = Compression.GZIP, validate = True, )) self.assertEqual(1, len(descriptors)) self.assertEqual('moria1', descriptors[0].nickname) @patch(URL_OPEN, _dirport_mock(read_resource('compressed_zstd'), encoding = 'x-zstd')) def test_compression_zstd(self): """ Download a zstd compressed descriptor. """ if not stem.prereq.is_zstd_available(): self.skipTest('(requires zstd module)') return descriptors = list(stem.descriptor.remote.get_server_descriptors( '9695DFC35FFEB861329B9F1AB04C46397020CE31', compression = Compression.ZSTD, validate = True, )) self.assertEqual(1, len(descriptors)) self.assertEqual('moria1', descriptors[0].nickname) @patch(URL_OPEN, _dirport_mock(read_resource('compressed_lzma'), encoding = 'x-tor-lzma')) def test_compression_lzma(self): """ Download a lzma compressed descriptor. """ if not stem.prereq.is_lzma_available(): self.skipTest('(requires lzma module)') return descriptors = list(stem.descriptor.remote.get_server_descriptors( '9695DFC35FFEB861329B9F1AB04C46397020CE31', compression = Compression.LZMA, validate = True, )) self.assertEqual(1, len(descriptors)) self.assertEqual('moria1', descriptors[0].nickname) @patch(URL_OPEN, _dirport_mock(TEST_DESCRIPTOR)) def test_reply_headers(self): query = stem.descriptor.remote.get_server_descriptors('9695DFC35FFEB861329B9F1AB04C46397020CE31', start = False) self.assertEqual(None, query.reply_headers) # initially we don't have a reply query.run() self.assertEqual('Fri, 13 Apr 2018 16:35:50 GMT', query.reply_headers.get('date')) self.assertEqual('application/octet-stream', query.reply_headers.get('content-type')) self.assertEqual('97.103.17.56', query.reply_headers.get('x-your-address-is')) self.assertEqual('no-cache', query.reply_headers.get('pragma')) self.assertEqual('identity', query.reply_headers.get('content-encoding')) # getting headers should be case insensitive self.assertEqual('identity', query.reply_headers.get('CoNtEnT-ENCODING')) # request a header that isn't present self.assertEqual(None, query.reply_headers.get('no-such-header')) self.assertEqual('default', query.reply_headers.get('no-such-header', 'default')) descriptors = list(query) self.assertEqual(1, len(descriptors)) self.assertEqual('moria1', descriptors[0].nickname) @patch(URL_OPEN, _dirport_mock(TEST_DESCRIPTOR)) def test_query_download(self): """ Check Query functionality when we successfully download a descriptor. """ query = stem.descriptor.remote.Query( TEST_RESOURCE, 'server-descriptor 1.0', endpoints = [('128.31.0.39', 9131)], compression = Compression.PLAINTEXT, validate = True, ) self.assertEqual(stem.DirPort('128.31.0.39', 9131), query._pick_endpoint()) descriptors = list(query) self.assertEqual(1, len(descriptors)) desc = descriptors[0] self.assertEqual('moria1', desc.nickname) self.assertEqual('128.31.0.34', desc.address) self.assertEqual('9695DFC35FFEB861329B9F1AB04C46397020CE31', desc.fingerprint) self.assertEqual(TEST_DESCRIPTOR.strip(), desc.get_bytes()) @patch(URL_OPEN, _dirport_mock(b'some malformed stuff')) def test_query_with_malformed_content(self): """ Query with malformed descriptor content. """ query = stem.descriptor.remote.Query( TEST_RESOURCE, 'server-descriptor 1.0', endpoints = [('128.31.0.39', 9131)], compression = Compression.PLAINTEXT, validate = True, ) # checking via the iterator expected_error_msg = 'Content conform to being a server descriptor:\nsome malformed stuff' descriptors = list(query) self.assertEqual(0, len(descriptors)) self.assertEqual(ValueError, type(query.error)) self.assertEqual(expected_error_msg, str(query.error)) # check via the run() method self.assertRaises(ValueError, query.run) @patch(URL_OPEN) def test_query_with_timeout(self, dirport_mock): def urlopen_call(*args, **kwargs): time.sleep(0.06) raise socket.timeout('connection timed out') dirport_mock.side_effect = urlopen_call query = stem.descriptor.remote.Query( TEST_RESOURCE, 'server-descriptor 1.0', endpoints = [('128.31.0.39', 9131)], fall_back_to_authority = False, timeout = 0.1, validate = True, ) # After two requests we'll have reached our total permissable timeout. # Check that we don't make a third. self.assertRaises(socket.timeout, query.run) self.assertEqual(2, dirport_mock.call_count) def test_query_with_invalid_endpoints(self): invalid_endpoints = { 'hello': "'h' is a str.", ('hello',): "'hello' is a str.", (15,): "'15' is a int.", (('12.34.56.78', 15, 'third arg'),): "'('12.34.56.78', 15, 'third arg')' is a tuple.", } for endpoints, error_suffix in invalid_endpoints.items(): expected_error = 'Endpoints must be an stem.ORPort, stem.DirPort, or two value tuple. ' + error_suffix self.assertRaisesWith(ValueError, expected_error, stem.descriptor.remote.Query, TEST_RESOURCE, 'server-descriptor 1.0', endpoints = endpoints) @patch(URL_OPEN, _dirport_mock(TEST_DESCRIPTOR)) def test_can_iterate_multiple_times(self): query = stem.descriptor.remote.Query( TEST_RESOURCE, 'server-descriptor 1.0', endpoints = [('128.31.0.39', 9131)], compression = Compression.PLAINTEXT, validate = True, ) # check that iterating over the query provides the descriptors each time self.assertEqual(1, len(list(query))) self.assertEqual(1, len(list(query))) self.assertEqual(1, len(list(query))) stem-1.7.1/test/unit/descriptor/networkstatus/0000775000175000017500000000000013411004021022245 5ustar atagaratagar00000000000000stem-1.7.1/test/unit/descriptor/networkstatus/bridge_document.py0000664000175000017500000000433113411002341025755 0ustar atagaratagar00000000000000""" Unit tests for the BridgeNetworkStatusDocument of stem.descriptor.networkstatus. """ import datetime import unittest import stem.descriptor from stem.descriptor.networkstatus import BridgeNetworkStatusDocument from test.unit.descriptor import get_resource DOCUMENT = b"""\ published 2012-06-01 04:07:04 r Unnamed ABSiBVJ42z6w5Z6nAXQUFq8YVVg FI74aFuNJZZQrgln0f+OaocMd0M 2012-05-31 15:57:00 10.97.236.247 443 0 s Valid w Bandwidth=55 p reject 1-65535 r TolFuin AFn9TveYjdtZEsgh7QsWp3qC5kU 1Sw8RPx2Tq/w+VHL+pZipiJUG5k 2012-05-31 18:12:39 10.99.47.37 80 0 s Fast Guard Running Stable Valid w Bandwidth=32 p reject 1-65535 """ class TestBridgeNetworkStatusDocument(unittest.TestCase): def test_metrics_bridge_consensus(self): """ Checks if the bridge documents from Metrics are parsed properly. """ consensus_path = get_resource('bridge_network_status') with open(consensus_path, 'rb') as descriptor_file: router = next(stem.descriptor.parse_file(descriptor_file)) self.assertEqual('Unnamed', router.nickname) self.assertEqual('0014A2055278DB3EB0E59EA701741416AF185558', router.fingerprint) self.assertEqual('148EF8685B8D259650AE0967D1FF8E6A870C7743', router.digest) self.assertEqual(datetime.datetime(2012, 5, 31, 15, 57, 0), router.published) self.assertEqual('10.97.236.247', router.address) self.assertEqual(443, router.or_port) self.assertEqual(None, router.dir_port) def test_empty_document(self): """ Parse a document without any router status entries. """ document = BridgeNetworkStatusDocument(b'published 2012-06-01 04:07:04') self.assertEqual(datetime.datetime(2012, 6, 1, 4, 7, 4), document.published) self.assertEqual({}, document.routers) self.assertEqual([], document.get_unrecognized_lines()) def test_document(self): """ Parse a document with router status entries. """ document = BridgeNetworkStatusDocument(DOCUMENT) self.assertEqual(datetime.datetime(2012, 6, 1, 4, 7, 4), document.published) self.assertEqual(2, len(document.routers)) self.assertEqual(set(['Unnamed', 'TolFuin']), set([desc.nickname for desc in document.routers.values()])) self.assertEqual([], document.get_unrecognized_lines()) stem-1.7.1/test/unit/descriptor/networkstatus/document_v3.py0000664000175000017500000015240313411002341025055 0ustar atagaratagar00000000000000""" Unit tests for the NetworkStatusDocumentV3 of stem.descriptor.networkstatus. """ import datetime import io import unittest import stem.descriptor import stem.version import test.require from stem import Flag from stem.descriptor import CRYPTO_BLOB from stem.descriptor.networkstatus import ( HEADER_STATUS_DOCUMENT_FIELDS, FOOTER_STATUS_DOCUMENT_FIELDS, DEFAULT_PARAMS, PackageVersion, DirectoryAuthority, NetworkStatusDocumentV3, _parse_file, ) from stem.descriptor.router_status_entry import ( RouterStatusEntryV3, RouterStatusEntryMicroV3, ) from test.unit.descriptor import get_resource try: # added in python 2.7 from collections import OrderedDict except ImportError: from stem.util.ordereddict import OrderedDict BANDWIDTH_WEIGHT_ENTRIES = ( 'Wbd', 'Wbe', 'Wbg', 'Wbm', 'Wdb', 'Web', 'Wed', 'Wee', 'Weg', 'Wem', 'Wgb', 'Wgd', 'Wgg', 'Wgm', 'Wmb', 'Wmd', 'Wme', 'Wmg', 'Wmm', ) class TestNetworkStatusDocument(unittest.TestCase): def test_metrics_consensus(self): """ Checks if consensus documents from Metrics are parsed properly. """ consensus_path = get_resource('metrics_consensus') for specify_type in (True, False): with open(consensus_path, 'rb') as descriptor_file: if specify_type: descriptors = stem.descriptor.parse_file(descriptor_file, 'network-status-consensus-3 1.0') else: descriptors = stem.descriptor.parse_file(descriptor_file) router = next(descriptors) self.assertEqual('sumkledi', router.nickname) self.assertEqual('0013D22389CD50D0B784A3E4061CB31E8CE8CEB5', router.fingerprint) self.assertEqual('F260ABF1297B445E04354E236F4159140FF7768F', router.digest) self.assertEqual(datetime.datetime(2012, 7, 12, 4, 1, 55), router.published) self.assertEqual('178.218.213.229', router.address) self.assertEqual(80, router.or_port) self.assertEqual(None, router.dir_port) def test_real_consensus(self): """ Checks that version 3 consensus documents from chutney can be properly parsed. """ expected_flags = set( ['Authority', 'Exit', 'Fast', 'Guard', 'HSDir', 'Running', 'Stable', 'V2Dir', 'Valid', 'NoEdConsensus']) expected_bandwidth_weights = { 'Web': 10000, 'Wdb': 10000, 'Weg': 3333, 'Wee': 10000, 'Wed': 3333, 'Wgd': 3333, 'Wgb': 10000, 'Wgg': 10000, 'Wem': 10000, 'Wbg': 0, 'Wbd': 3333, 'Wbe': 0, 'Wmm': 10000, 'Wmb': 10000, 'Wgm': 10000, 'Wbm': 10000, 'Wmg': 0, 'Wme': 0, 'Wmd': 3333 } expected_signature = """\ -----BEGIN SIGNATURE----- Ho0rLojfLHs9cSPFxe6znuGuFU8BvRr6gnH1gULTjUZO0NSQvo5N628KFeAsq+pT ElieQeV6UfwnYN1U2tomhBYv3+/p1xBxYS5oTDAITxLUYvH4pLYz09VutwFlFFtU r/satajuOMST0M3wCCBC4Ru5o5FSklwJTPJ/tWRXDCEHv/N5ZUUkpnNdn+7tFSZ9 eFrPxPcQvB05BESo7C4/+ZnZVO/wduObSYu04eWwTEog2gkSWmsztKoXpx1QGrtG sNL22Ws9ySGDO/ykFFyxkcuyB5A8oPyedR7DrJUfCUYyB8o+XLNwODkCFxlmtFOj ci356fosgLiM1sVqCUkNdA== -----END SIGNATURE-----""" with open(get_resource('cached-consensus'), 'rb') as descriptor_file: document = stem.descriptor.networkstatus.NetworkStatusDocumentV3(descriptor_file.read(), default_params = False) self.assertEqual(3, document.version) self.assertEqual(None, document.version_flavor) self.assertEqual(True, document.is_consensus) self.assertEqual(False, document.is_vote) self.assertEqual(False, document.is_microdescriptor) self.assertEqual(datetime.datetime(2017, 5, 25, 4, 46, 30), document.valid_after) self.assertEqual(datetime.datetime(2017, 5, 25, 4, 46, 40), document.fresh_until) self.assertEqual(datetime.datetime(2017, 5, 25, 4, 46, 50), document.valid_until) self.assertEqual(2, document.vote_delay) self.assertEqual(2, document.dist_delay) self.assertEqual([], document.client_versions) self.assertEqual([], document.server_versions) self.assertEqual(expected_flags, set(document.known_flags)) self.assertEqual([], document.packages) self.assertEqual({}, document.params) self.assertEqual(26, document.consensus_method) self.assertEqual(expected_bandwidth_weights, document.bandwidth_weights) self.assertEqual([], document.consensus_methods) self.assertEqual(None, document.published) self.assertEqual([], document.get_unrecognized_lines()) router = document.routers['348225F83C854796B2DD6364E65CB189B33BD696'] self.assertEqual('test002r', router.nickname) self.assertEqual('348225F83C854796B2DD6364E65CB189B33BD696', router.fingerprint) self.assertEqual('533429F8413C1B46022AD365655CBEDE1E6DBF44', router.digest) self.assertEqual(datetime.datetime(2017, 5, 25, 4, 46, 11), router.published) self.assertEqual('127.0.0.1', router.address) self.assertEqual(5002, router.or_port) self.assertEqual(7002, router.dir_port) self.assertEqual(set(['Exit', 'Fast', 'Running', 'Valid', 'V2Dir', 'Guard', 'HSDir', 'Stable']), set(router.flags)) authority = document.directory_authorities[0] self.assertEqual(2, len(document.directory_authorities)) self.assertEqual('test001a', authority.nickname) self.assertEqual('596CD48D61FDA4E868F4AA10FF559917BE3B1A35', authority.fingerprint) self.assertEqual('127.0.0.1', authority.hostname) self.assertEqual('127.0.0.1', authority.address) self.assertEqual(7001, authority.dir_port) self.assertEqual(5001, authority.or_port) self.assertEqual('auth1@test.test', authority.contact) self.assertEqual('2E7177224BBA39B505F7608FF376C07884CF926F', authority.vote_digest) self.assertEqual(None, authority.legacy_dir_key) self.assertEqual(None, authority.key_certificate) signature = document.signatures[0] self.assertEqual(2, len(document.signatures)) self.assertEqual('sha1', signature.method) self.assertEqual('596CD48D61FDA4E868F4AA10FF559917BE3B1A35', signature.identity) self.assertEqual('9FBF54D6A62364320308A615BF4CF6B27B254FAD', signature.key_digest) self.assertEqual(expected_signature, signature.signature) def test_metrics_vote(self): """ Checks if vote documents from Metrics are parsed properly. """ vote_path = get_resource('metrics_vote') with open(vote_path, 'rb') as descriptor_file: descriptors = stem.descriptor.parse_file(descriptor_file) router = next(descriptors) self.assertEqual('sumkledi', router.nickname) self.assertEqual('0013D22389CD50D0B784A3E4061CB31E8CE8CEB5', router.fingerprint) self.assertEqual('0799F806200B005F01E40A9A7F1A21C988AE8FB1', router.digest) self.assertEqual(datetime.datetime(2012, 7, 11, 4, 22, 53), router.published) self.assertEqual('178.218.213.229', router.address) self.assertEqual(80, router.or_port) self.assertEqual(None, router.dir_port) def test_vote(self): """ Checks that vote documents are properly parsed. """ expected_flags = set( ['Authority', 'BadExit', 'Exit', 'Fast', 'Guard', 'HSDir', 'Running', 'Stable', 'V2Dir', 'Valid']) expected_identity_key = """-----BEGIN RSA PUBLIC KEY----- MIIBigKCAYEA6uSmsoxj2MiJ3qyZq0qYXlRoG8o82SNqg+22m+t1c7MlQOZWPJYn XeMcBCt8xrTeIt2ZI+Q/Kt2QJSeD9WZRevTKk/kn5Tg2+xXPogalUU47y5tUohGz +Q8+CxtRSXpDxBHL2P8rLHvGrI69wbNHGoQkce/7gJy9vw5Ie2qzbyXk1NG6V8Fb pr6A885vHo6TbhUnolz2Wqt/kN+UorjLkN2H3fV+iGcQFv42SyHYGDLa0WwL3PJJ r/veu36S3VaHBrfhutfioi+d3d4Ya0bKwiWi5Lm2CHuuRTgMpHLU9vlci8Hunuxq HsULe2oMsr4VEic7sW5SPC5Obpx6hStHdNv1GxoSEm3/vIuPM8pINpU5ZYAyH9yO Ef22ZHeiVMMKmpV9TtFyiFqvlI6GpQn3mNbsQqF1y3XCA3Q4vlRAkpgJVUSvTxFP 2bNDobOyVCpCM/rwxU1+RCNY5MFJ/+oktUY+0ydvTen3gFdZdgNqCYjKPLfBNm9m RGL7jZunMUNvAgMBAAE= -----END RSA PUBLIC KEY-----""" expected_signing_key = """-----BEGIN RSA PUBLIC KEY----- MIGJAoGBAJ5itcJRYNEM3Qf1OVWLRkwjqf84oXPc2ZusaJ5zOe7TVvBMra9GNyc0 NM9y6zVkHCAePAjr4KbW/8P1olA6FUE2LV9bozaU1jFf6K8B2OELKs5FUEW+n+ic GM0x6MhngyXonWOcKt5Gj+mAu5lrno9tpNbPkz2Utr/Pi0nsDhWlAgMBAAE= -----END RSA PUBLIC KEY-----""" expected_key_crosscert = """-----BEGIN ID SIGNATURE----- RHYImGTwg36wmEdAn7qaRg2sAfql7ZCtPIL/O3lU5OIdXXp0tNn/K00Bamqohjk+ Tz4FKsKXGDlbGv67PQcZPOK6NF0GRkNh4pk89prrDO4XwtEn7rkHHdBH6/qQ7IRG GdDZHtZ1a69oFZvPWD3hUaB50xeIe7GoKdKIfdNNJ+8= -----END ID SIGNATURE-----""" expected_key_certification = """-----BEGIN SIGNATURE----- fasWOGyUZ3iMCYpDfJ+0JcMiTH25sXPWzvlHorEOyOMbaMqRYpZU4GHzt1jLgdl6 AAoR6KdamsLg5VE8xzst48a4UFuzHFlklZ5O8om2rcvDd5DhSnWWYZnYJecqB+bo dNisPmaIVSAWb29U8BpNRj4GMC9KAgGYUj8aE/KtutAeEekFfFEHTfWZ2fFp4j3m 9rY8FWraqyiF+Emq1T8pAAgMQ+79R3oZxq0TXS42Z4Anhms735ccauKhI3pDKjbl tD5vAzIHOyjAOXj7a6jY/GrnaBNuJ4qe/4Hf9UmzK/jKKwG95BPJtPTT4LoFwEB0 KG2OUeQUNoCck4nDpsZwFqPlrWCHcHfTV2iDYFV1HQWDTtZz/qf+GtB8NXsq+I1w brADmvReM2BD6p/13h0QURCI5hq7ZYlIKcKrBa0jn1d9cduULl7vgKsRCJDls/ID emBZ6pUxMpBmV0v+PrA3v9w4DlE7GHAq61FF/zju2kpqj6MInbEvI/E+e438sWsL -----END SIGNATURE-----""" expected_signature = """-----BEGIN SIGNATURE----- fskXN84wB3mXfo+yKGSt0AcDaaPuU3NwMR3ROxWgLN0KjAaVi2eV9PkPCsQkcgw3 JZ/1HL9sHyZfo6bwaC6YSM9PNiiY6L7rnGpS7UkHiFI+M96VCMorvjm5YPs3FioJ DnN5aFtYKiTc19qIC7Nmo+afPdDEf0MlJvEOP5EWl3w= -----END SIGNATURE-----""" with open(get_resource('unparseable/vote'), 'rb') as descriptor_file: document = stem.descriptor.networkstatus.NetworkStatusDocumentV3(descriptor_file.read(), default_params = False) self.assertEqual(3, document.version) self.assertEqual(None, document.version_flavor) self.assertEqual(False, document.is_consensus) self.assertEqual(True, document.is_vote) self.assertEqual(False, document.is_microdescriptor) self.assertEqual(datetime.datetime(2012, 7, 12, 0, 0, 0), document.valid_after) self.assertEqual(datetime.datetime(2012, 7, 12, 1, 0, 0), document.fresh_until) self.assertEqual(datetime.datetime(2012, 7, 12, 3, 0, 0), document.valid_until) self.assertEqual(300, document.vote_delay) self.assertEqual(300, document.dist_delay) self.assertEqual([], document.client_versions) self.assertEqual([], document.server_versions) self.assertEqual(expected_flags, set(document.known_flags)) self.assertEqual([], document.packages) self.assertEqual({'CircuitPriorityHalflifeMsec': 30000, 'bwauthpid': 1}, document.params) self.assertEqual(None, document.consensus_method) self.assertEqual({}, document.bandwidth_weights) self.assertEqual(list(range(1, 13)), document.consensus_methods) self.assertEqual(datetime.datetime(2012, 7, 11, 23, 50, 1), document.published) self.assertEqual([], document.get_unrecognized_lines()) router = document.routers['0013D22389CD50D0B784A3E4061CB31E8CE8CEB5'] self.assertEqual('sumkledi', router.nickname) self.assertEqual('0013D22389CD50D0B784A3E4061CB31E8CE8CEB5', router.fingerprint) self.assertEqual('0799F806200B005F01E40A9A7F1A21C988AE8FB1', router.digest) self.assertEqual(datetime.datetime(2012, 7, 11, 4, 22, 53), router.published) self.assertEqual('178.218.213.229', router.address) self.assertEqual(80, router.or_port) self.assertEqual(None, router.dir_port) authority = document.directory_authorities[0] self.assertEqual(1, len(document.directory_authorities)) self.assertEqual('turtles', authority.nickname) self.assertEqual('27B6B5996C426270A5C95488AA5BCEB6BCC86956', authority.fingerprint) self.assertEqual('76.73.17.194', authority.hostname) self.assertEqual('76.73.17.194', authority.address) self.assertEqual(9030, authority.dir_port) self.assertEqual(9090, authority.or_port) self.assertEqual('Mike Perry ', authority.contact) self.assertEqual(None, authority.vote_digest) self.assertEqual(None, authority.legacy_dir_key) certificate = authority.key_certificate self.assertEqual(3, certificate.version) self.assertEqual(None, certificate.address) self.assertEqual(None, certificate.dir_port) self.assertEqual('27B6B5996C426270A5C95488AA5BCEB6BCC86956', certificate.fingerprint) self.assertEqual(expected_identity_key, certificate.identity_key) self.assertEqual(datetime.datetime(2011, 11, 28, 21, 51, 4), certificate.published) self.assertEqual(datetime.datetime(2012, 11, 28, 21, 51, 4), certificate.expires) self.assertEqual(expected_signing_key, certificate.signing_key) self.assertEqual(expected_key_crosscert, certificate.crosscert) self.assertEqual(expected_key_certification, certificate.certification) signature = document.signatures[0] self.assertEqual(1, len(document.signatures)) self.assertEqual('sha1', signature.method) self.assertEqual('27B6B5996C426270A5C95488AA5BCEB6BCC86956', signature.identity) self.assertEqual('D5C30C15BB3F1DA27669C2D88439939E8F418FCF', signature.key_digest) self.assertEqual(expected_signature, signature.signature) def test_minimal_consensus(self): """ Parses a minimal network status document. """ document = NetworkStatusDocumentV3.create() expected_known_flags = [ Flag.AUTHORITY, Flag.BADEXIT, Flag.EXIT, Flag.FAST, Flag.GUARD, Flag.HSDIR, Flag.NAMED, Flag.RUNNING, Flag.STABLE, Flag.UNNAMED, Flag.V2DIR, Flag.VALID] self.assertEqual({}, document.routers) self.assertEqual(3, document.version) self.assertEqual(None, document.version_flavor) self.assertEqual(True, document.is_consensus) self.assertEqual(False, document.is_vote) self.assertEqual(False, document.is_microdescriptor) self.assertEqual(9, document.consensus_method) self.assertEqual([], document.consensus_methods) self.assertEqual(None, document.published) self.assertEqual(300, document.vote_delay) self.assertEqual(300, document.dist_delay) self.assertEqual([], document.client_versions) self.assertEqual([], document.server_versions) self.assertEqual(expected_known_flags, document.known_flags) self.assertEqual([], document.packages) self.assertEqual({}, document.flag_thresholds) self.assertEqual(False, document.is_shared_randomness_participate) self.assertEqual([], document.shared_randomness_commitments) self.assertEqual(None, document.shared_randomness_previous_reveal_count) self.assertEqual(None, document.shared_randomness_previous_value) self.assertEqual(None, document.shared_randomness_current_reveal_count) self.assertEqual(None, document.shared_randomness_current_value) self.assertEqual({}, document.recommended_client_protocols) self.assertEqual({}, document.recommended_relay_protocols) self.assertEqual({}, document.required_client_protocols) self.assertEqual({}, document.required_relay_protocols) self.assertEqual(DEFAULT_PARAMS, document.params) self.assertEqual((), document.directory_authorities) self.assertEqual({}, document.bandwidth_weights) self.assertEqual([], document.get_unrecognized_lines()) def test_minimal_vote(self): """ Parses a minimal network status document. """ document = NetworkStatusDocumentV3.create({'vote-status': 'vote'}) expected_known_flags = [ Flag.AUTHORITY, Flag.BADEXIT, Flag.EXIT, Flag.FAST, Flag.GUARD, Flag.HSDIR, Flag.NAMED, Flag.RUNNING, Flag.STABLE, Flag.UNNAMED, Flag.V2DIR, Flag.VALID] self.assertEqual({}, document.routers) self.assertEqual(3, document.version) self.assertEqual(False, document.is_consensus) self.assertEqual(True, document.is_vote) self.assertEqual(None, document.consensus_method) self.assertEqual([1, 9], document.consensus_methods) self.assertEqual(300, document.vote_delay) self.assertEqual(300, document.dist_delay) self.assertEqual([], document.client_versions) self.assertEqual([], document.server_versions) self.assertEqual(expected_known_flags, document.known_flags) self.assertEqual([], document.packages) self.assertEqual({}, document.flag_thresholds) self.assertEqual(False, document.is_shared_randomness_participate) self.assertEqual([], document.shared_randomness_commitments) self.assertEqual(None, document.shared_randomness_previous_reveal_count) self.assertEqual(None, document.shared_randomness_previous_value) self.assertEqual(None, document.shared_randomness_current_reveal_count) self.assertEqual(None, document.shared_randomness_current_value) self.assertEqual(DEFAULT_PARAMS, document.params) self.assertEqual({}, document.bandwidth_weights) self.assertEqual([], document.get_unrecognized_lines()) @test.require.cryptography def test_descriptor_signing(self): self.assertRaisesWith(NotImplementedError, 'Signing of NetworkStatusDocumentV3 not implemented', NetworkStatusDocumentV3.create, sign = True) def test_examples(self): """ Run something similar to the examples in the header pydocs. """ # makes a consensus with a couple routers, both with the same nickname entry1 = RouterStatusEntryV3.create({'s': 'Fast'}) entry2 = RouterStatusEntryV3.create({'s': 'Valid'}) content = NetworkStatusDocumentV3.content(routers = (entry1, entry2)) # first example: parsing via the NetworkStatusDocumentV3 constructor consensus_file = io.BytesIO(content) consensus = NetworkStatusDocumentV3(consensus_file.read()) consensus_file.close() for router in consensus.routers.values(): self.assertTrue(router.nickname.startswith('Unnamed')) # second example: using stem.descriptor.parse_file with io.BytesIO(content) as consensus_file: for router in stem.descriptor.parse_file(consensus_file, 'network-status-consensus-3 1.0'): self.assertTrue(router.nickname.startswith('Unnamed')) @test.require.cryptography def test_signature_validation(self): """ Check that we can validate the consensus with its certificates. """ with open(get_resource('cached-consensus'), 'rb') as descriptor_file: consensus_content = descriptor_file.read() with open(get_resource('cached-certs'), 'rb') as cert_file: certs = list(stem.descriptor.parse_file(cert_file, 'dir-key-certificate-3 1.0')) consensus = stem.descriptor.networkstatus.NetworkStatusDocumentV3(consensus_content) consensus.validate_signatures(certs) # change a relay's nickname in the consensus so it's no longer validly signed consensus = stem.descriptor.networkstatus.NetworkStatusDocumentV3(consensus_content.replace(b'test002r', b'different_nickname')) self.assertRaisesWith(ValueError, 'Network Status Document has 0 valid signatures out of 2 total, needed 1', consensus.validate_signatures, certs) def test_handlers(self): """ Try parsing a document with DocumentHandler.DOCUMENT and DocumentHandler.BARE_DOCUMENT. """ # Simple sanity check that they provide the right type, and that the # document includes or excludes the router status entries as appropriate. entry1 = RouterStatusEntryV3.create({'s': 'Fast'}) entry2 = RouterStatusEntryV3.create({ 'r': 'Nightfae AWt0XNId/OU2xX5xs5hVtDc5Mes 6873oEfM7fFIbxYtwllw9GPDwkA 2013-02-20 11:12:27 85.177.66.233 9001 9030', 's': 'Valid', }) content = NetworkStatusDocumentV3.content(routers = (entry1, entry2)) descriptors = list(stem.descriptor.parse_file(io.BytesIO(content), 'network-status-consensus-3 1.0', document_handler = stem.descriptor.DocumentHandler.DOCUMENT)) self.assertEqual(1, len(descriptors)) self.assertTrue(isinstance(descriptors[0], NetworkStatusDocumentV3)) self.assertEqual(2, len(descriptors[0].routers)) descriptors = list(stem.descriptor.parse_file(io.BytesIO(content), 'network-status-consensus-3 1.0', document_handler = stem.descriptor.DocumentHandler.BARE_DOCUMENT)) self.assertEqual(1, len(descriptors)) self.assertTrue(isinstance(descriptors[0], NetworkStatusDocumentV3)) self.assertEqual(0, len(descriptors[0].routers)) def test_parse_file(self): """ Try parsing a document via the _parse_file() function. """ entry1 = RouterStatusEntryV3.create({'s': 'Fast'}) entry2 = RouterStatusEntryV3.create({'s': 'Valid'}) content = NetworkStatusDocumentV3.content(routers = (entry1, entry2)) # the document that the entries refer to should actually be the minimal # descriptor (ie, without the entries) descriptor_file = io.BytesIO(content) entries = list(_parse_file(descriptor_file)) self.assertEqual(entry1, entries[0]) self.assertEqual(entry2, entries[1]) def test_missing_fields(self): """ Excludes mandatory fields from both a vote and consensus document. """ for is_consensus in (True, False): attr = {'vote-status': 'consensus'} if is_consensus else {'vote-status': 'vote'} is_vote = not is_consensus for entries in (HEADER_STATUS_DOCUMENT_FIELDS, FOOTER_STATUS_DOCUMENT_FIELDS): for field, in_votes, in_consensus, is_mandatory in entries: if is_mandatory and field != 'vote-status' and ((is_consensus and in_consensus) or (is_vote and in_votes)): content = NetworkStatusDocumentV3.content(attr, exclude = (field,)) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) NetworkStatusDocumentV3(content, False) # constructs without validation def test_unrecognized_line(self): """ Includes unrecognized content in the document. """ document = NetworkStatusDocumentV3.create({'pepperjack': 'is oh so tasty!'}) self.assertEqual(['pepperjack is oh so tasty!'], document.get_unrecognized_lines()) def test_duplicate_fields(self): """ Almost all fields can only appear once. Checking that duplicates cause validation errors. """ for is_consensus in (True, False): attr = {'vote-status': 'consensus'} if is_consensus else {'vote-status': 'vote'} lines = NetworkStatusDocumentV3.content(attr).split(b'\n') for index, line in enumerate(lines): if not is_consensus and lines[index].startswith(b'dir-source'): break # Stop when we hit the 'directory-signature' for a couple reasons... # - that is the one field that can validly appear multiple times # - after it is a crypto blob, which won't trigger this kind of # validation failure test_lines = list(lines) if line.startswith(b'directory-signature '): break # duplicates the line test_lines.insert(index, line) content = b'\n'.join(test_lines) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) NetworkStatusDocumentV3(content, False) # constructs without validation def test_version(self): """ Parses the network-status-version field, including trying to handle a different document version with the v3 parser. """ document = NetworkStatusDocumentV3.create({'network-status-version': '3'}) self.assertEqual(3, document.version) self.assertEqual(None, document.version_flavor) self.assertEqual(False, document.is_microdescriptor) document = NetworkStatusDocumentV3.create({'network-status-version': '3 microdesc'}) self.assertEqual(3, document.version) self.assertEqual('microdesc', document.version_flavor) self.assertEqual(True, document.is_microdescriptor) content = NetworkStatusDocumentV3.content({'network-status-version': '4'}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual(4, document.version) self.assertEqual(None, document.version_flavor) self.assertEqual(False, document.is_microdescriptor) def test_vote_status(self): """ Parses the vote-status field. """ document = NetworkStatusDocumentV3.create({'vote-status': 'vote'}) self.assertEqual(False, document.is_consensus) self.assertEqual(True, document.is_vote) content = NetworkStatusDocumentV3.content({'vote-status': 'consensus'}) document = NetworkStatusDocumentV3(content) self.assertEqual(True, document.is_consensus) self.assertEqual(False, document.is_vote) test_values = ( '', ' ', 'votee', ) for test_value in test_values: content = NetworkStatusDocumentV3.content({'vote-status': test_value}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual(True, document.is_consensus) self.assertEqual(False, document.is_vote) def test_consensus_methods(self): """ Parses the consensus-methods field. """ document = NetworkStatusDocumentV3.create({'vote-status': 'vote', 'consensus-methods': '12 3 1 780'}) self.assertEqual([12, 3, 1, 780], document.consensus_methods) # check that we default to including consensus-method 1 content = NetworkStatusDocumentV3.content({'vote-status': 'vote'}, ('consensus-methods',)) document = NetworkStatusDocumentV3(content, False) self.assertEqual([1], document.consensus_methods) self.assertEqual(None, document.consensus_method) test_values = ( (''), (' '), ('1 2 3 a 5'), ('1 2 3 4.0 5'), ('2 3 4'), # spec says version one must be included ) for test_value in test_values: content = NetworkStatusDocumentV3.content({'vote-status': 'vote', 'consensus-methods': test_value}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) expected_value = [2, 3, 4] if test_value == '2 3 4' else [1] document = NetworkStatusDocumentV3(content, False) self.assertEqual(expected_value, document.consensus_methods) def test_consensus_method(self): """ Parses the consensus-method field. """ document = NetworkStatusDocumentV3.create({'consensus-method': '12'}) self.assertEqual(12, document.consensus_method) # check that we default to being consensus-method 1 content = NetworkStatusDocumentV3.content(exclude = ('consensus-method',)) document = NetworkStatusDocumentV3(content, False) self.assertEqual(1, document.consensus_method) self.assertEqual([], document.consensus_methods) test_values = ( '', ' ', 'a', '1 2', '2.0', ) for test_value in test_values: content = NetworkStatusDocumentV3.content({'consensus-method': test_value}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual(1, document.consensus_method) def test_time_fields(self): """ Parses invalid published, valid-after, fresh-until, and valid-until fields. All are simply datetime values. """ expected = datetime.datetime(2012, 9, 2, 22, 0, 0) test_value = '2012-09-02 22:00:00' document = NetworkStatusDocumentV3.create({ 'vote-status': 'vote', 'published': test_value, 'valid-after': test_value, 'fresh-until': test_value, 'valid-until': test_value, }) self.assertEqual(expected, document.published) self.assertEqual(expected, document.valid_after) self.assertEqual(expected, document.fresh_until) self.assertEqual(expected, document.valid_until) test_values = ( '', ' ', '2012-12-12', '2012-12-12 01:01:', '2012-12-12 01:a1:01', ) for test_value in test_values: content = NetworkStatusDocumentV3.content({'vote-status': 'vote', 'published': test_value}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual(None, document.published) def test_voting_delay(self): """ Parses the voting-delay field. """ document = NetworkStatusDocumentV3.create({'voting-delay': '12 345'}) self.assertEqual(12, document.vote_delay) self.assertEqual(345, document.dist_delay) test_values = ( '', ' ', '1 a', '1\t2', '1 2.0', ) for test_value in test_values: content = NetworkStatusDocumentV3.content({'voting-delay': test_value}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual(None, document.vote_delay) self.assertEqual(None, document.dist_delay) def test_version_lists(self): """ Parses client-versions and server-versions fields. Both are comma separated lists of tor versions. """ expected = [stem.version.Version('1.2.3.4'), stem.version.Version('56.789.12.34-alpha')] test_value = '1.2.3.4,56.789.12.34-alpha' document = NetworkStatusDocumentV3.create({'client-versions': test_value, 'server-versions': test_value}) self.assertEqual(expected, document.client_versions) self.assertEqual(expected, document.server_versions) test_values = ( (''), (' '), ('1.2.3.4,'), ('1.2.3.4,1.2.3.a'), ) for field in ('client-versions', 'server-versions'): attr = field.replace('-', '_') for test_value in test_values: content = NetworkStatusDocumentV3.content({field: test_value}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual([], getattr(document, attr)) def test_packages(self): """ Parse the package line. These can appear multiple times, and have any number of digests. """ test_values = ( (['Stem 1.3.0 https://stem.torproject.org/'], [PackageVersion('Stem', '1.3.0', 'https://stem.torproject.org/', {})]), (['Stem 1.3.0 https://stem.torproject.org/ sha1=5d676c8124b4be1f52ddc8e15ca143cad211eeb4 md5=600ad5e2fc4caf585c1bdaaa532b7e82'], [PackageVersion('Stem', '1.3.0', 'https://stem.torproject.org/', {'sha1': '5d676c8124b4be1f52ddc8e15ca143cad211eeb4', 'md5': '600ad5e2fc4caf585c1bdaaa532b7e82'})]), (['Stem 1.3.0 https://stem.torproject.org/', 'Txtorcon 0.13.0 https://github.com/meejah/txtorcon'], [PackageVersion('Stem', '1.3.0', 'https://stem.torproject.org/', {}), PackageVersion('Txtorcon', '0.13.0', 'https://github.com/meejah/txtorcon', {})]), ) for test_value, expected_value in test_values: document = NetworkStatusDocumentV3.create({'package': '\npackage '.join(test_value)}) self.assertEqual(expected_value, document.packages) test_values = ( '', ' ', 'Stem', 'Stem 1.3.0', 'Stem 1.3.0 https://stem.torproject.org/ keyword_field', 'Stem 1.3.0 https://stem.torproject.org/ keyword_field key=value', 'Stem 1.3.0 https://stem.torproject.org/ key=value keyword_field', ) for test_value in test_values: content = NetworkStatusDocumentV3.content({'package': test_value}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual([], document.packages) def test_known_flags(self): """ Parses some known-flag entries. Just exercising the field, there's not much to test here. """ test_values = ( ('', []), (' ', []), ('BadExit', [Flag.BADEXIT]), ('BadExit ', [Flag.BADEXIT]), ('BadExit ', [Flag.BADEXIT]), ('BadExit Fast', [Flag.BADEXIT, Flag.FAST]), ('BadExit Unrecognized Fast', [Flag.BADEXIT, 'Unrecognized', Flag.FAST]), ) for test_value, expected_value in test_values: document = NetworkStatusDocumentV3.create({'known-flags': test_value}) self.assertEqual(expected_value, document.known_flags) def test_flag_thresholds(self): """ Parses the flag-thresholds entry. """ test_values = ( ('', {}), ('fast-speed=40960', {'fast-speed': 40960}), # numeric value ('guard-wfu=94.669%', {'guard-wfu': 0.94669}), # percentage value ('guard-wfu=94.669% guard-tk=691200', {'guard-wfu': 0.94669, 'guard-tk': 691200}), # multiple values ('stable-uptime=0 stable-mtbf=0 fast-speed=0 guard-wfu=0.000% guard-tk=0 guard-bw-inc-exits=0 guard-bw-exc-exits=0 enough-mtbf=1 ignoring-advertised-bws=0', { 'stable-uptime': 0, 'stable-mtbf': 0, 'fast-speed': 0, 'guard-wfu': 0.0, 'guard-tk': 0, 'guard-bw-inc-exits': 0, 'guard-bw-exc-exits': 0, 'enough-mtbf': 1, 'ignoring-advertised-bws': 0, }), ) for test_value, expected_value in test_values: document = NetworkStatusDocumentV3.create({'vote-status': 'vote', 'flag-thresholds': test_value}) self.assertEqual(expected_value, document.flag_thresholds) # parses a full entry found in an actual vote full_line = 'stable-uptime=693369 stable-mtbf=153249 fast-speed=40960 guard-wfu=94.669% guard-tk=691200 guard-bw-inc-exits=174080 guard-bw-exc-exits=184320 enough-mtbf=1' expected_value = { 'stable-uptime': 693369, 'stable-mtbf': 153249, 'fast-speed': 40960, 'guard-wfu': 0.94669, 'guard-tk': 691200, 'guard-bw-inc-exits': 174080, 'guard-bw-exc-exits': 184320, 'enough-mtbf': 1, } document = NetworkStatusDocumentV3.create({'vote-status': 'vote', 'flag-thresholds': full_line}) self.assertEqual(expected_value, document.flag_thresholds) test_values = ( 'stable-uptime 693369', # not a key=value mapping 'stable-uptime=a693369', # non-numeric value 'guard-wfu=94.669%%', # double quote 'stable-uptime=693369\tstable-mtbf=153249', # non-space divider ) for test_value in test_values: content = NetworkStatusDocumentV3.content({'vote-status': 'vote', 'flag-thresholds': test_value}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual({}, document.flag_thresholds) def test_parameters(self): """ Parses the parameters attributes. """ document = NetworkStatusDocumentV3.create(OrderedDict([ ('vote-status', 'vote'), ('recommended-client-protocols', 'HSDir=1 HSIntro=3'), ('recommended-relay-protocols', 'Cons=1 Desc=1'), ('required-client-protocols', 'HSRend=1 Link=1-4 LinkAuth=1 Microdesc=1'), ('required-relay-protocols', 'DirCache=1'), ])) self.assertEqual(2, len(document.recommended_client_protocols)) self.assertEqual(2, len(document.recommended_relay_protocols)) self.assertEqual(4, len(document.required_client_protocols)) self.assertEqual(1, len(document.required_relay_protocols)) def test_params(self): """ General testing for the 'params' line, exercising the happy cases. """ document = NetworkStatusDocumentV3.create({'params': 'CircuitPriorityHalflifeMsec=30000 bwauthpid=1 unrecognized=-122'}) self.assertEqual(30000, document.params['CircuitPriorityHalflifeMsec']) self.assertEqual(1, document.params['bwauthpid']) self.assertEqual(-122, document.params['unrecognized']) # empty params line content = NetworkStatusDocumentV3.content({'params': ''}) document = NetworkStatusDocumentV3(content, default_params = True) self.assertEqual(DEFAULT_PARAMS, document.params) content = NetworkStatusDocumentV3.content({'params': ''}) document = NetworkStatusDocumentV3(content, default_params = False) self.assertEqual({}, document.params) def test_params_malformed(self): """ Parses a 'params' line with malformed content. """ test_values = ( 'foo=', 'foo=abc', 'foo=+123', 'foo=12\tbar=12', ) for test_value in test_values: content = NetworkStatusDocumentV3.content({'params': test_value}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual(DEFAULT_PARAMS, document.params) def test_params_range(self): """ Check both the furthest valid 'params' values and values that are out of bounds. """ test_values = ( ('foo=2147483648', {'foo': 2147483648}, False), ('foo=-2147483649', {'foo': -2147483649}, False), ('foo=2147483647', {'foo': 2147483647}, True), ('foo=-2147483648', {'foo': -2147483648}, True), # param with special range constraints ('circwindow=99', {'circwindow': 99}, False), ('circwindow=1001', {'circwindow': 1001}, False), ('circwindow=500', {'circwindow': 500}, True), # param that relies on another param for its constraints ('cbtclosequantile=79 cbtquantile=80', {'cbtclosequantile': 79, 'cbtquantile': 80}, False), ('cbtclosequantile=80 cbtquantile=80', {'cbtclosequantile': 80, 'cbtquantile': 80}, True), ) for test_value, expected_value, is_ok in test_values: content = NetworkStatusDocumentV3.content({'params': test_value}) if is_ok: document = NetworkStatusDocumentV3(content, default_params = False) else: self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False, default_params = False) self.assertEqual(expected_value, document.params) def test_params_misordered(self): """ Check that the 'params' line is rejected if out of order. """ content = NetworkStatusDocumentV3.content({'params': 'unrecognized=-122 bwauthpid=1'}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False, default_params = False) self.assertEqual({}, document.params) def test_footer_consensus_method_requirement(self): """ Check that validation will notice if a footer appears before it was introduced. """ content = NetworkStatusDocumentV3.content({'consensus-method': '8'}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual([], document.get_unrecognized_lines()) # excludes a footer from a version that shouldn't have it document = NetworkStatusDocumentV3.create({'consensus-method': '8'}, ('directory-footer', 'directory-signature')) self.assertEqual([], document.signatures) self.assertEqual([], document.get_unrecognized_lines()) # Prior to conensus method 9 votes can still have a signature in their # footer... # # https://trac.torproject.org/7932 document = NetworkStatusDocumentV3.create( { 'vote-status': 'vote', 'consensus-methods': '1 8', }, exclude = ('directory-footer',), authorities = (DirectoryAuthority.create(is_vote = True),) ) self.assertEqual([], document.get_unrecognized_lines()) def test_footer_with_value(self): """ Tries to parse a descriptor with content on the 'directory-footer' line. """ content = NetworkStatusDocumentV3.content({'directory-footer': 'blarg'}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual([], document.get_unrecognized_lines()) def test_bandwidth_wights_ok(self): """ Parses a properly formed 'bandwidth-wights' line. Negative bandwidth weights might or might not be valid. The spec doesn't say, so making sure that we accept them. """ weight_entries, expected = [], {} for index, key in enumerate(BANDWIDTH_WEIGHT_ENTRIES): weight_entries.append('%s=%i' % (key, index - 5)) expected[key] = index - 5 document = NetworkStatusDocumentV3.create({'bandwidth-weights': ' '.join(weight_entries)}) self.assertEqual(expected, document.bandwidth_weights) def test_bandwidth_wights_malformed(self): """ Provides malformed content in the 'bandwidth-wights' line. """ test_values = ( 'Wbe', 'Wbe=', 'Wbe=a', 'Wbe=+7', ) base_weight_entry = ' '.join(['%s=5' % e for e in BANDWIDTH_WEIGHT_ENTRIES]) for test_value in test_values: weight_entry = base_weight_entry.replace('Wbe=5', test_value) content = NetworkStatusDocumentV3.content({'bandwidth-weights': weight_entry}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual({}, document.bandwidth_weights) def test_bandwidth_wights_misordered(self): """ Check that the 'bandwidth-wights' line is rejected if out of order. """ weight_entry = ' '.join(['%s=5' % e for e in reversed(BANDWIDTH_WEIGHT_ENTRIES)]) content = NetworkStatusDocumentV3.content({'bandwidth-weights': weight_entry}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual({}, document.bandwidth_weights) def test_bandwidth_wights_in_vote(self): """ Tries adding a 'bandwidth-wights' line to a vote. """ weight_entry = ' '.join(['%s=5' % e for e in BANDWIDTH_WEIGHT_ENTRIES]) expected = dict([(e, 5) for e in BANDWIDTH_WEIGHT_ENTRIES]) content = NetworkStatusDocumentV3.content({'vote-status': 'vote', 'bandwidth-weights': weight_entry}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual(expected, document.bandwidth_weights) def test_microdescriptor_signature(self): """ The 'directory-signature' lines both with and without a defined method for the signature format. """ # including the signature method field should work document = NetworkStatusDocumentV3.create({ 'network-status-version': '3 microdesc', 'directory-signature': 'sha256 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 BF112F1C6D5543CFD0A32215ACABD4197B5279AD\n-----BEGIN SIGNATURE-----%s-----END SIGNATURE-----' % CRYPTO_BLOB, }) self.assertEqual('sha256', document.signatures[0].method) # excluding the method should default to sha1 document = NetworkStatusDocumentV3.create({ 'network-status-version': '3 microdesc', }) self.assertEqual('sha1', document.signatures[0].method) def test_malformed_signature(self): """ Provides malformed or missing content in the 'directory-signature' line. """ test_values = ( '', '\n', 'blarg', ) for test_value in test_values: for test_attr in range(3): attrs = [ '14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4', 'BF112F1C6D5543CFD0A32215ACABD4197B5279AD', '-----BEGIN SIGNATURE-----%s-----END SIGNATURE-----' % CRYPTO_BLOB, ] attrs[test_attr] = test_value content = NetworkStatusDocumentV3.content({'directory-signature': '%s %s\n%s' % tuple(attrs)}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) NetworkStatusDocumentV3(content, False) # checks that it's still parsable without validation def test_with_router_status_entries(self): """ Includes router status entries within the document. This isn't to test the RouterStatusEntry parsing but rather the inclusion of it within the document. """ entry1 = RouterStatusEntryV3.create({'s': 'Fast'}) entry2 = RouterStatusEntryV3.create({ 'r': 'Nightfae AWt0XNId/OU2xX5xs5hVtDc5Mes 6873oEfM7fFIbxYtwllw9GPDwkA 2013-02-20 11:12:27 85.177.66.233 9001 9030', 's': 'Valid', }) document = NetworkStatusDocumentV3.create(routers = (entry1, entry2)) self.assertTrue(entry1 in document.routers.values()) self.assertTrue(entry2 in document.routers.values()) # try with an invalid RouterStatusEntry entry3 = RouterStatusEntryV3(RouterStatusEntryV3.content({'r': 'ugabuga'}), False) content = NetworkStatusDocumentV3.content(routers = (entry3,)) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual([entry3], list(document.routers.values())) # try including with a microdescriptor consensus content = NetworkStatusDocumentV3.content({'network-status-version': '3 microdesc'}, routers = (entry1,)) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual([RouterStatusEntryMicroV3(str(entry1), False)], list(document.routers.values())) def test_with_microdescriptor_router_status_entries(self): """ Includes microdescriptor flavored router status entries within the document. """ entry1 = RouterStatusEntryMicroV3.create({'s': 'Fast'}) entry2 = RouterStatusEntryMicroV3.create({ 'r': 'tornodeviennasil AcWxDFxrHetHYS5m6/MVt8ZN6AM 2013-03-13 22:09:13 78.142.142.246 443 80', 's': 'Valid', }) document = NetworkStatusDocumentV3.create({'network-status-version': '3 microdesc'}, routers = (entry1, entry2)) self.assertTrue(entry1 in document.routers.values()) self.assertTrue(entry2 in document.routers.values()) # try with an invalid RouterStatusEntry entry3 = RouterStatusEntryMicroV3(RouterStatusEntryMicroV3.content({'r': 'ugabuga'}), False) content = NetworkStatusDocumentV3.content({'network-status-version': '3 microdesc'}, routers = (entry3,)) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual([entry3], list(document.routers.values())) # try including microdescriptor entry in a normal consensus content = NetworkStatusDocumentV3.content(routers = (entry1,)) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual([RouterStatusEntryV3(str(entry1), False)], list(document.routers.values())) def test_with_directory_authorities(self): """ Includes a couple directory authorities in the document. """ for is_document_vote in (False, True): for is_authorities_vote in (False, True): authority1 = DirectoryAuthority.create({'contact': 'doctor jekyll'}, is_vote = is_authorities_vote) authority2 = DirectoryAuthority.create({'contact': 'mister hyde'}, is_vote = is_authorities_vote) vote_status = 'vote' if is_document_vote else 'consensus' content = NetworkStatusDocumentV3.content({'vote-status': vote_status}, authorities = (authority1, authority2)) if is_document_vote == is_authorities_vote: if is_document_vote: # votes can only have a single authority self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, validate = False) else: document = NetworkStatusDocumentV3(content) self.assertEqual((authority1, authority2), document.directory_authorities) else: # authority votes in a consensus or consensus authorities in a vote self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, validate = False) self.assertEqual((authority1, authority2), document.directory_authorities) def test_shared_randomness(self): """ Parses the shared randomness attributes. """ COMMITMENT_1 = '1 sha3-256 4CAEC248004A0DC6CE86EBD5F608C9B05500C70C AAAAAFd4/kAaklgYr4ijHZjXXy/B354jQfL31BFhhE46nuOHSPITyw== AAAAAFd4/kCpZeis3yJyr//rz8hXCeeAhHa4k3lAcAiMJd1vEMTPuw==' COMMITMENT_2 = '1 sha3-256 598536A9DD4E6C0F18B4AD4B88C7875A0A29BA31 AAAAAFd4/kC7S920awC5/HF5RfX4fKZtYqjm6qMh9G91AcjZm13DQQ==' authority = DirectoryAuthority.create(OrderedDict([ ('shared-rand-participate', ''), ('shared-rand-commit', '%s\nshared-rand-commit %s' % (COMMITMENT_1, COMMITMENT_2)), ('shared-rand-previous-value', '8 hAQLxyt0U3gu7QR2owixRCbIltcyPrz3B0YBfUshOkE='), ('shared-rand-current-value', '7 KEIfSB7Db+ToasQIzJhbh0CtkeSePHLEehO+ams/RTU='), ])) self.assertEqual(True, authority.is_shared_randomness_participate) self.assertEqual(8, authority.shared_randomness_previous_reveal_count) self.assertEqual('hAQLxyt0U3gu7QR2owixRCbIltcyPrz3B0YBfUshOkE=', authority.shared_randomness_previous_value) self.assertEqual(7, authority.shared_randomness_current_reveal_count) self.assertEqual('KEIfSB7Db+ToasQIzJhbh0CtkeSePHLEehO+ams/RTU=', authority.shared_randomness_current_value) self.assertEqual(2, len(authority.shared_randomness_commitments)) first_commitment = authority.shared_randomness_commitments[0] self.assertEqual(1, first_commitment.version) self.assertEqual('sha3-256', first_commitment.algorithm) self.assertEqual('4CAEC248004A0DC6CE86EBD5F608C9B05500C70C', first_commitment.identity) self.assertEqual('AAAAAFd4/kAaklgYr4ijHZjXXy/B354jQfL31BFhhE46nuOHSPITyw==', first_commitment.commit) self.assertEqual('AAAAAFd4/kCpZeis3yJyr//rz8hXCeeAhHa4k3lAcAiMJd1vEMTPuw==', first_commitment.reveal) second_commitment = authority.shared_randomness_commitments[1] self.assertEqual(1, second_commitment.version) self.assertEqual('sha3-256', second_commitment.algorithm) self.assertEqual('598536A9DD4E6C0F18B4AD4B88C7875A0A29BA31', second_commitment.identity) self.assertEqual('AAAAAFd4/kC7S920awC5/HF5RfX4fKZtYqjm6qMh9G91AcjZm13DQQ==', second_commitment.commit) self.assertEqual(None, second_commitment.reveal) def test_shared_randomness_malformed(self): """ Checks shared randomness with malformed values. """ test_values = [ ({'vote-status': 'vote', 'shared-rand-commit': 'hi sha3-256 598536A9DD4E6C0F18B4AD4B88C7875A0A29BA31 AAAAAFd4/kC7S920awC5/HF5RfX4fKZtYqjm6qMh9G91AcjZm13DQQ=='}, "The version on our 'shared-rand-commit' line wasn't an integer: hi sha3-256 598536A9DD4E6C0F18B4AD4B88C7875A0A29BA31 AAAAAFd4/kC7S920awC5/HF5RfX4fKZtYqjm6qMh9G91AcjZm13DQQ=="), ({'vote-status': 'vote', 'shared-rand-commit': 'sha3-256 598536A9DD4E6C0F18B4AD4B88C7875A0A29BA31 AAAAAFd4/kC7S920awC5/HF5RfX4fKZtYqjm6qMh9G91AcjZm13DQQ=='}, "'shared-rand-commit' must at least have a 'Version AlgName Identity Commit': sha3-256 598536A9DD4E6C0F18B4AD4B88C7875A0A29BA31 AAAAAFd4/kC7S920awC5/HF5RfX4fKZtYqjm6qMh9G91AcjZm13DQQ=="), ({'vote-status': 'vote', 'shared-rand-current-value': 'hi KEIfSB7Db+ToasQIzJhbh0CtkeSePHLEehO+ams/RTU='}, "A network status document's 'shared-rand-current-value' line must be a pair of values, the first an integer but was 'hi KEIfSB7Db+ToasQIzJhbh0CtkeSePHLEehO+ams/RTU='"), ({'vote-status': 'vote', 'shared-rand-current-value': 'KEIfSB7Db+ToasQIzJhbh0CtkeSePHLEehO+ams/RTU='}, "A network status document's 'shared-rand-current-value' line must be a pair of values, the first an integer but was 'KEIfSB7Db+ToasQIzJhbh0CtkeSePHLEehO+ams/RTU='"), ] for attr, expected_exception in test_values: content = DirectoryAuthority.content(attr) self.assertRaisesWith(ValueError, expected_exception, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertEqual([], authority.shared_randomness_commitments) self.assertEqual(None, authority.shared_randomness_previous_reveal_count) self.assertEqual(None, authority.shared_randomness_previous_value) self.assertEqual(None, authority.shared_randomness_current_reveal_count) self.assertEqual(None, authority.shared_randomness_current_value) def test_bandwidth_file_headers(self): """ Parses a 'bandwidth-file-headers' line of votes. """ test_values = { '': {}, 'timestamp=': {'timestamp': ''}, 'timestamp=12=34': {'timestamp': '12=34'}, 'timestamp=123': {'timestamp': '123'}, 'timestamp=123 version=1.0': {'timestamp': '123', 'version': '1.0'}, 'timestamp=123 version=1.0 software=neat_thingy': {'timestamp': '123', 'version': '1.0', 'software': 'neat_thingy'}, } for test_value, expected_value in test_values.items(): document = NetworkStatusDocumentV3.create({'vote-status': 'vote', 'bandwidth-file-headers': test_value}) self.assertEqual(expected_value, document.bandwidth_file_headers) # field must be key=value mappings content = NetworkStatusDocumentV3.content({'vote-status': 'vote', 'bandwidth-file-headers': 'key_without_value'}) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, False) self.assertEqual({}, document.bandwidth_file_headers) def test_with_legacy_directory_authorities(self): """ Includes both normal authorities and those following the '-legacy' format. """ legacy_content = 'dir-source gabelmoo-legacy 81349FC1F2DBA2C2C11B45CB9706637D480AB913 131.188.40.189 131.188.40.189 80 443' authority1 = DirectoryAuthority.create({'contact': 'doctor jekyll'}, is_vote = False) authority2 = DirectoryAuthority(legacy_content, validate = True, is_vote = False) authority3 = DirectoryAuthority.create({'contact': 'mister hyde'}, is_vote = False) document = NetworkStatusDocumentV3.create({'vote-status': 'consensus'}, authorities = (authority1, authority2, authority3)) self.assertEqual((authority1, authority2, authority3), document.directory_authorities) def test_authority_validation_flag_propagation(self): """ Includes invalid certificate content in an authority entry. This is testing that the 'validate' flag propagages from the document to authority, and authority to certificate classes. """ # make the dir-key-published field of the certiciate be malformed authority_content = DirectoryAuthority.content(is_vote = True) authority_content = authority_content.replace(b'dir-key-published 2', b'dir-key-published b2') authority = DirectoryAuthority(authority_content, False, True) content = NetworkStatusDocumentV3.content({'vote-status': 'vote'}, authorities = (authority,)) self.assertRaises(ValueError, NetworkStatusDocumentV3, content, True) document = NetworkStatusDocumentV3(content, validate = False) self.assertEqual((authority,), document.directory_authorities) stem-1.7.1/test/unit/descriptor/networkstatus/directory_authority.py0000664000175000017500000002247413341474573026775 0ustar atagaratagar00000000000000""" Unit tests for the DirectoryAuthority of stem.descriptor.networkstatus. """ import unittest import test.require from stem.descriptor.networkstatus import ( DirectoryAuthority, KeyCertificate, ) DIR_SOURCE_LINE = 'turtles 27B6B5996C426270A5C95488AA5BCEB6BCC86956 no.place.com 76.73.17.194 9030 9090' class TestDirectoryAuthority(unittest.TestCase): def test_minimal_consensus_authority(self): """ Parses a minimal directory authority for a consensus. """ authority = DirectoryAuthority.create() self.assertTrue(authority.nickname.startswith('Unnamed')) self.assertEqual(40, len(authority.fingerprint)) self.assertEqual('no.place.com', authority.hostname) self.assertEqual(9030, authority.dir_port) self.assertEqual(9090, authority.or_port) self.assertEqual(False, authority.is_legacy) self.assertEqual('Mike Perry ', authority.contact) self.assertEqual(40, len(authority.vote_digest)) self.assertEqual(None, authority.legacy_dir_key) self.assertEqual(None, authority.key_certificate) self.assertEqual([], authority.get_unrecognized_lines()) def test_minimal_vote_authority(self): """ Parses a minimal directory authority for a vote. """ authority = DirectoryAuthority.create(is_vote = True) self.assertTrue(authority.nickname.startswith('Unnamed')) self.assertEqual(40, len(authority.fingerprint)) self.assertEqual('no.place.com', authority.hostname) self.assertEqual(9030, authority.dir_port) self.assertEqual(9090, authority.or_port) self.assertEqual(False, authority.is_legacy) self.assertEqual('Mike Perry ', authority.contact) self.assertEqual(None, authority.vote_digest) self.assertEqual(None, authority.legacy_dir_key) self.assertEqual([], authority.get_unrecognized_lines()) @test.require.cryptography def test_descriptor_signing(self): self.assertRaisesWith(NotImplementedError, 'Signing of DirectoryAuthority not implemented', DirectoryAuthority.create, sign = True) def test_unrecognized_line(self): """ Includes unrecognized content in the descriptor. """ authority = DirectoryAuthority.create({'pepperjack': 'is oh so tasty!'}) self.assertEqual(['pepperjack is oh so tasty!'], authority.get_unrecognized_lines()) def test_legacy_authority(self): """ Parses an authority using the '-legacy' format. """ content = 'dir-source gabelmoo-legacy 81349FC1F2DBA2C2C11B45CB9706637D480AB913 131.188.40.189 131.188.40.189 80 443' authority = DirectoryAuthority(content, is_vote = False) self.assertEqual('gabelmoo-legacy', authority.nickname) self.assertEqual('81349FC1F2DBA2C2C11B45CB9706637D480AB913', authority.fingerprint) self.assertEqual('131.188.40.189', authority.hostname) self.assertEqual('131.188.40.189', authority.address) self.assertEqual(80, authority.dir_port) self.assertEqual(443, authority.or_port) self.assertEqual(True, authority.is_legacy) self.assertEqual(None, authority.contact) self.assertEqual(None, authority.vote_digest) self.assertEqual(None, authority.legacy_dir_key) self.assertEqual(None, authority.key_certificate) self.assertEqual([], authority.get_unrecognized_lines()) def test_first_line(self): """ Includes a non-mandatory field before the 'dir-source' line. """ content = b'ho-hum 567\n' + DirectoryAuthority.content() self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertTrue(authority.nickname.startswith('Unnamed')) self.assertEqual(['ho-hum 567'], authority.get_unrecognized_lines()) def test_missing_fields(self): """ Parse an authority where a mandatory field is missing. """ for excluded_field in ('dir-source', 'contact'): content = DirectoryAuthority.content(exclude = (excluded_field,)) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) if excluded_field == 'dir-source': self.assertEqual('Mike Perry ', authority.contact) else: self.assertTrue(authority.nickname.startswith('Unnamed')) def test_blank_lines(self): """ Includes blank lines, which should be ignored. """ authority = DirectoryAuthority.create({'dir-source': DIR_SOURCE_LINE + '\n\n\n'}) self.assertEqual('Mike Perry ', authority.contact) def test_duplicate_lines(self): """ Duplicates linesin the entry. """ lines = DirectoryAuthority.content().split(b'\n') for index, duplicate_line in enumerate(lines): content = b'\n'.join(lines[:index] + [duplicate_line] + lines[index:]) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertTrue(authority.nickname.startswith('Unnamed')) def test_missing_dir_source_field(self): """ Excludes fields from the 'dir-source' line. """ for missing_value in DIR_SOURCE_LINE.split(' '): dir_source = DIR_SOURCE_LINE.replace(missing_value, '').replace(' ', ' ') content = DirectoryAuthority.content({'dir-source': dir_source}) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertEqual(None, authority.nickname) self.assertEqual(None, authority.fingerprint) self.assertEqual(None, authority.hostname) self.assertEqual(None, authority.address) self.assertEqual(None, authority.dir_port) self.assertEqual(None, authority.or_port) def test_malformed_fingerprint(self): """ Includes a malformed fingerprint on the 'dir-source' line. """ test_values = ( '', 'zzzzz', 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz', ) for value in test_values: dir_source = DIR_SOURCE_LINE.replace('27B6B5996C426270A5C95488AA5BCEB6BCC86956', value) content = DirectoryAuthority.content({'dir-source': dir_source}) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertEqual(None, authority.fingerprint) def test_malformed_address(self): """ Includes a malformed ip address on the 'dir-source' line. """ test_values = ( '', '71.35.150.', '71.35..29', '71.35.150', '71.35.150.256', '[fd9f:2e19:3bcf::02:9970]', ) for value in test_values: dir_source = DIR_SOURCE_LINE.replace('76.73.17.194', value) content = DirectoryAuthority.content({'dir-source': dir_source}) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertEqual(None, authority.address) def test_malformed_port(self): """ Includes a malformed orport or dirport on the 'dir-source' line. """ test_values = ( '', '-1', '399482', 'blarg', ) for value in test_values: for include_or_port in (False, True): for include_dir_port in (False, True): if not include_or_port and not include_dir_port: continue dir_source = DIR_SOURCE_LINE if include_or_port: dir_source = dir_source.replace('9090', value) if include_dir_port: dir_source = dir_source.replace('9030', value) content = DirectoryAuthority.content({'dir-source': dir_source}) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) actual_value = authority.or_port if include_or_port else authority.dir_port self.assertEqual(None, actual_value) def test_legacy_dir_key(self): """ Includes a 'legacy-dir-key' line with both valid and invalid content. """ test_value = '65968CCB6BECB5AA88459C5A072624C6995B6B72' authority = DirectoryAuthority.create({'legacy-dir-key': test_value}, is_vote = True) self.assertEqual(test_value, authority.legacy_dir_key) # check that we'll fail if legacy-dir-key appears in a consensus content = DirectoryAuthority.content({'legacy-dir-key': test_value}) self.assertRaises(ValueError, DirectoryAuthority, content, True) test_values = ( '', 'zzzzz', 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz', ) for value in test_values: content = DirectoryAuthority.content({'legacy-dir-key': value}) self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertEqual(None, authority.legacy_dir_key) def test_key_certificate(self): """ Includes or exclude a key certificate from the directory entry. """ key_cert = KeyCertificate.content() # include a key cert with a consensus content = DirectoryAuthority.content() + b'\n' + key_cert self.assertRaises(ValueError, DirectoryAuthority, content, True) authority = DirectoryAuthority(content, False) self.assertTrue(authority.nickname.startswith('Unnamed')) # exclude key cert from a vote content = b'\n'.join(DirectoryAuthority.content(is_vote = True).splitlines()[:-5]) self.assertRaises(ValueError, DirectoryAuthority, content, True, True) authority = DirectoryAuthority(content, False, True) self.assertTrue(authority.nickname.startswith('Unnamed')) stem-1.7.1/test/unit/descriptor/networkstatus/__init__.py0000664000175000017500000000023513237375570024410 0ustar atagaratagar00000000000000""" Unit tests for stem.descriptor.networkstatus. """ __all__ = ['bridge_document', 'directory_authority', 'key_certificate', 'document_v2', 'document_v3'] stem-1.7.1/test/unit/descriptor/networkstatus/document_v2.py0000664000175000017500000001166713411002341025062 0ustar atagaratagar00000000000000""" Unit tests for the NetworkStatusDocumentV2 of stem.descriptor.networkstatus. """ import datetime import unittest import test.require from stem.descriptor.networkstatus import NetworkStatusDocumentV2 from test.unit.descriptor import get_resource class TestNetworkStatusDocument(unittest.TestCase): def test_consensus_v2(self): """ Checks that version 2 consensus documents are properly parsed. """ expected_signing_key = """-----BEGIN RSA PUBLIC KEY----- MIGJAoGBAOcrht/y5rkaahfX7sMe2qnpqoPibsjTSJaDvsUtaNP/Bq0MgNDGOR48 rtwfqTRff275Edkp/UYw3G3vSgKCJr76/bqOHCmkiZrnPV1zxNfrK18gNw2Cxre0 nTA+fD8JQqpPtb8b0SnG9kwy75eS//sRu7TErie2PzGMxrf9LH0LAgMBAAE= -----END RSA PUBLIC KEY-----""" expected_signature = """-----BEGIN SIGNATURE----- 2nXCxVje3wzn6HrIFRNMc0nc48AhMVpHZyPwRKGXkuYfTQG55uvwQDaFgJHud4RT 27QhWltau3K1evhnzhKcpbTXwkVv1TBYJSzL6rEeAn8cQ7ZiCyqf4EJCaNcem3d2 TpQQk3nNQF8z6UIvdlvP+DnJV4izWVkQEZgUZgIVM0E= -----END SIGNATURE-----""" with open(get_resource('cached-consensus-v2'), 'rb') as descriptor_file: descriptor_file.readline() # strip header document = NetworkStatusDocumentV2(descriptor_file.read()) self.assertEqual(2, document.version) self.assertEqual('18.244.0.114', document.hostname) self.assertEqual('18.244.0.114', document.address) self.assertEqual(80, document.dir_port) self.assertEqual('719BE45DE224B607C53707D0E2143E2D423E74CF', document.fingerprint) self.assertEqual('arma at mit dot edu', document.contact) self.assertEqual(expected_signing_key, document.signing_key) self.assertEqual(67, len(document.client_versions)) self.assertEqual('0.0.9rc2', document.client_versions[0]) self.assertEqual('0.1.1.10-alpha-cvs', document.client_versions[-1]) self.assertEqual(67, len(document.server_versions)) self.assertEqual('0.0.9rc2', document.server_versions[0]) self.assertEqual('0.1.1.10-alpha-cvs', document.server_versions[-1]) self.assertEqual(datetime.datetime(2005, 12, 16, 0, 13, 46), document.published) self.assertEqual(['Names', 'Versions'], document.options) self.assertEqual('moria2', document.signing_authority) self.assertEqual(expected_signature, document.signature) self.assertEqual([], document.get_unrecognized_lines()) self.assertEqual(3, len(document.routers)) router1 = document.routers['719BE45DE224B607C53707D0E2143E2D423E74CF'] self.assertEqual('moria2', router1.nickname) self.assertEqual('719BE45DE224B607C53707D0E2143E2D423E74CF', router1.fingerprint) self.assertEqual('B7F3F0975B87889DD1285FD57A1B1BB617F65432', router1.digest) self.assertEqual(datetime.datetime(2005, 12, 15, 6, 57, 18), router1.published) self.assertEqual('18.244.0.114', router1.address) self.assertEqual(443, router1.or_port) self.assertEqual(80, router1.dir_port) self.assertEqual(set(['Authority', 'Fast', 'Named', 'Running', 'Valid', 'V2Dir']), set(router1.flags)) router2 = document.routers['0928BA467056C4A689FEE4EF5D71482B6289C3D5'] self.assertEqual('stnv', router2.nickname) self.assertEqual('0928BA467056C4A689FEE4EF5D71482B6289C3D5', router2.fingerprint) self.assertEqual('22D1A7ED4199BDA7ED6C416EECD769C18E1F2A5A', router2.digest) self.assertEqual(datetime.datetime(2005, 12, 15, 16, 24, 42), router2.published) self.assertEqual('84.16.236.173', router2.address) self.assertEqual(9001, router2.or_port) self.assertEqual(None, router2.dir_port) self.assertEqual(set(['Named', 'Valid']), set(router2.flags)) router3 = document.routers['09E8582FF0E6F85E2B8E41C0DC0B9C9DC46E6968'] self.assertEqual('nggrplz', router3.nickname) self.assertEqual('09E8582FF0E6F85E2B8E41C0DC0B9C9DC46E6968', router3.fingerprint) self.assertEqual('B302C2B01C94F398E3EF38939526B0651F824DD6', router3.digest) self.assertEqual(datetime.datetime(2005, 12, 15, 23, 25, 50), router3.published) self.assertEqual('194.109.109.109', router3.address) self.assertEqual(9001, router3.or_port) self.assertEqual(None, router3.dir_port) self.assertEqual(set(['Fast', 'Stable', 'Running', 'Valid']), set(router3.flags)) def test_minimal_document(self): """ Parses a minimal v2 network status document. """ document = NetworkStatusDocumentV2.create() self.assertEqual({}, document.routers) self.assertEqual(2, document.version) self.assertEqual(80, document.dir_port) self.assertEqual(40, len(document.fingerprint)) self.assertEqual('arma at mit dot edu', document.contact) self.assertEqual([], document.client_versions) self.assertEqual([], document.server_versions) self.assertEqual([], document.options) self.assertEqual('moria2', document.signing_authority) @test.require.cryptography def test_descriptor_signing(self): self.assertRaisesWith(NotImplementedError, 'Signing of NetworkStatusDocumentV2 not implemented', NetworkStatusDocumentV2.create, sign = True) stem-1.7.1/test/unit/descriptor/networkstatus/key_certificate.py0000664000175000017500000003015713411002341025762 0ustar atagaratagar00000000000000""" Unit tests for the KeyCertificate of stem.descriptor.networkstatus. """ import datetime import unittest import stem.descriptor import test.require from stem.descriptor.networkstatus import KeyCertificate from test.unit.descriptor import get_resource class TestKeyCertificate(unittest.TestCase): def test_minimal(self): """ Parses a minimal key certificate. """ certificate = KeyCertificate.create() self.assertEqual(3, certificate.version) self.assertEqual(None, certificate.address) self.assertEqual(None, certificate.dir_port) self.assertEqual(40, len(certificate.fingerprint)) self.assertEqual(None, certificate.crosscert) self.assertEqual([], certificate.get_unrecognized_lines()) def test_real_certificates(self): """ Checks that key certificates from chutney can be properly parsed. """ expected_identity_key = """\ -----BEGIN RSA PUBLIC KEY----- MIIBigKCAYEAxfTHG1b3Sxe8n3JQ/nIk4+1/chj7+jAyLLK+WrEBiP1vnDxTXMuo x26ntWEjOaxjtKB12k5wMQW94/KvE754Gn98uQRFBHqLkrS4hUnn4/MqiBQVd2y3 UtE6KDSRhJZ5LfFH+dCKwu5+695PyJp/pfCUSOyPj0HQbFOnAOqdHPok8dtdfsy0 LaI7ycpzqAalzgrlwFP5KwwLtL+VapUGN4QOZlIXgL4W5e7OAG42lZhHt0b7/zdt oIegZM1y8tK2l75ijqsvbetddQcFlnVaYzNwlQAUIZuxJOGfnPfTo+WrjCgrK2ur ed5NiQMrEbZn5uCUscs+xLlKl4uKW0XXo1EIL45yBrVbmlP6V3/9diTHk64W9+m8 2G4ToDyH8J7LvnYPsmD0cCaQEceebxYVlmmwgqdORH/ixbeGF7JalTwtWBQYo2r0 VZAqjRwxR9dri6m1MIpzmzWmrbXghZ1IzJEL1rpB0okA/bE8AUGRx61eKnbI415O PmO06JMpvkxxAgMBAAE= -----END RSA PUBLIC KEY-----""" expected_signing_key = """\ -----BEGIN RSA PUBLIC KEY----- MIIBCgKCAQEAvzugxJl1gc7BgXarBO5IWejNZC30U1xVjZ/myQTzxtiKkPU0agQh sPqn4vVsaW6ZnWjJ2pSOq0/jg8WgFyGHGQ9cG8tv2TlpObeb/tI7iANxWx+MXJAh /CnFDBQ1ifKntJrs2IcRKMivfobqaHAL3Pz93noLWOTQunWjZ8D6kovYvUXe+yUQ tZEROrmXJx7ZIIJF6BNKYBTc+iEkYtkWlJVs0my7yP/bbS075QyBsr6CfT+O2yU4 mgIg43QuqcFRbjyUvGI/gap06QNlB6yj8pqeE5rWo++5EpEvMK76fK6ymYuTN2SN Oil+Fo7qgG8UP/fv0GelSz6Tk7pBoeHJlQIDAQAB -----END RSA PUBLIC KEY-----""" expected_crosscert = """\ -----BEGIN ID SIGNATURE----- Oz+rvXDzlxLgQSb3nS5/4hrHVWgGCy0OnuNmFsyw8bi2eBst5Yj79dQ+D25giZke 81FRGIFU4eS6dshB+pJ+z0hc9ozlRTYh/qevY6l6o0amvuhHyk/cQXrh8oYU9Ihe XQ1yVItvxC24HENsoGIGbr5uxc85FOcNs+R9qTLYA/56TjvAU4WUje3nTZE1awml lj/Y6DM7ruMF6UoYJZPTklukZ+XHZg4Z2eE55e/oIaD7bfU/lFWU/alMyTV/J5oT sxaD2XBLBScYiKypUmgrZ50W4ZqsXaYk76ClrudZnDbce+FuugVxok+jKYGjMu75 2es2ucuik7iuO7QPdPIXfg== -----END ID SIGNATURE-----""" expected_key_cert = """\ -----BEGIN SIGNATURE----- I86FTQ5ZyCZUzm19HVAQWByrrRgUmddoRBfNiCj0iTGN3kdIq9OfuNLhWAqz71xP 8Nn0Vun8Uj3/vBq/odIFpnngL3mKI6OEKcNDr0D5hEV9Yjrxe8msMoaUZT+LHzUW 1q3pzxfMx6EmlSilMhuzSsa4YEbXMZzMqASKANSJHo2fzUkzQOpPw2SlWSTIgyqw wAOB6QOvFfP3c0NTwxXrYE/iT+r90wZBuzS+v7r9B94alNAkE1KZQKnq2QTTIznP iF9LWMsZcMHCjoTxszK4jF4MRMN/S4Xl8yQo0/z6FoqBz4RIXzFtJoG/rbXdKfkE nJK9iEhaZbS1IN0o+uIGtvOm2rQSu9gS8merurr5GDSK3szjesPVJuF00mCNgOx4 hAYPN9N8HAL4zGE/l1UM7BGg3L84A0RMpDxnpXePd9mlHLhl4UV2lrkkf8S9Z6fX PPc3r7zKlL/jEGHwz+C7kE88HIvkVnKLLn//40b6HxitHSOCkZ1vtp8YyXae6xnU -----END SIGNATURE-----""" with open(get_resource('cached-certs'), 'rb') as cert_file: cert = next(stem.descriptor.parse_file(cert_file, 'dir-key-certificate-3 1.0')) self.assertEqual(3, cert.version) self.assertEqual('127.0.0.1', cert.address) self.assertEqual(7000, cert.dir_port) self.assertEqual('BCB380A633592C218757BEE11E630511A485658A', cert.fingerprint) self.assertEqual(expected_identity_key, cert.identity_key) self.assertEqual(datetime.datetime(2017, 5, 25, 4, 45, 52), cert.published) self.assertEqual(datetime.datetime(2018, 5, 25, 4, 45, 52), cert.expires) self.assertEqual(expected_signing_key, cert.signing_key) self.assertEqual(expected_crosscert, cert.crosscert) self.assertEqual(expected_key_cert, cert.certification) self.assertEqual([], cert.get_unrecognized_lines()) def test_metrics_certificate(self): """ Checks if consensus documents from Metrics are parsed properly. """ expected_identity_key = """-----BEGIN RSA PUBLIC KEY----- MIIBigKCAYEA7cZXvDRxfjDYtr9/9UsQ852+6cmHMr8VVh8GkLwbq3RzqjkULwQ2 R9mFvG4FnqMcMKXi62rYYA3fZL1afhT804cpvyp/D3dPM8QxW88fafFAgIFP4LiD 0JYjnF8cva5qZ0nzlWnMXLb32IXSvsGSE2FRyAV0YN9a6k967LSgCfUnZ+IKMezW 1vhL9YK4QIfsDowgtVsavg63GzGmA7JvZmn77+/J5wKz11vGr7Wttf8XABbH2taX O9j/KGBOX2OKhoF3mXfZSmUO2dV9NMwtkJ7zD///Ny6sfApWV6kVP4O9TdG3bAsl +fHCoCKgF/jAAWzh6VckQTOPzQZaH5aMWfXrDlzFWg17MjonI+bBTD2Ex2pHczzJ bN7coDMRH2SuOXv8wFf27KdUxZ/GcrXSRGzlRLygxqlripUanjVGN2JvrVQVr0kz pjNjiZl2z8ZyZ5d4zQuBi074JPGgx62xAstP37v1mPw14sIWfLgY16ewYuS5bCxV lyS28jsPht9VAgMBAAE= -----END RSA PUBLIC KEY-----""" expected_signing_key = """-----BEGIN RSA PUBLIC KEY----- MIGJAoGBAOeE3Qr1Km97gTgiB3io0EU0fqHW2ESMXVHeQuNDtCWBa0XSCEG6gx4B ZkkHjfVWqGQ7TmmzjYP9L9uCgtoKfhSvJA2w9NUMtMl8sgZmF4lcGpXXvGY9a566 Bn+3wP0lMhb/I8CPVPX+NWEjgl1noZxo1C59SO/iALGQOpxRYgmbAgMBAAE= -----END RSA PUBLIC KEY-----""" expected_key_cert = """-----BEGIN SIGNATURE----- asvWwaMq34OfHoWUhAwh4+JDOuEUZJVIHQnedOYfQH8asS2QvW3Ma93OhrwVOC6b FyKmTJmJsl0MJGiC7tcEOlL6knsKE4CsuIw/PEcu2Rnm+R9zWxQuMYiHvGQMoDxl giOhLLs4LlzAAJlbfbd3hjF4STVAtTwmxYuIjb1Mq/JfAsx/wH3TLXgVZwj32w9s zUd9KZwwLzFiiHpC+U7zh6+wRsZfo2tlpmcaP1dTSINgVbdzPJ/DOUlx9nwTCBsE AQpUx2DpAikwrpw0zDqpQvYulcQlNLWFN/y/PkmiK8mIJk0OBMiQA7JgqWamnnk4 PwqaGv483LkBF+25JFGJmnUVve3RMc+s61+2kBcjfUMed4QaHkeCMHqlRqpfQVkk RY22NXCwrJvSMEwiy7acC8FGysqwHRyE356+Rw6TB43g3Tno9KaHEK7MHXjSHwNs GM9hAsAMRX9Ogqhq5UjDNqEsvDKuyVeyh7unSZEOip9Zr6K/+7VsVPNb8vfBRBjo -----END SIGNATURE-----""" with open(get_resource('metrics_cert'), 'rb') as cert_file: cert = next(stem.descriptor.parse_file(cert_file)) self.assertEqual(3, cert.version) self.assertEqual(None, cert.address) self.assertEqual(None, cert.dir_port) self.assertEqual('14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4', cert.fingerprint) self.assertEqual(expected_identity_key, cert.identity_key) self.assertEqual(datetime.datetime(2008, 5, 9, 21, 13, 26), cert.published) self.assertEqual(datetime.datetime(2009, 5, 9, 21, 13, 26), cert.expires) self.assertEqual(expected_signing_key, cert.signing_key) self.assertEqual(None, cert.crosscert) self.assertEqual(expected_key_cert, cert.certification) self.assertEqual([], cert.get_unrecognized_lines()) @test.require.cryptography def test_descriptor_signing(self): self.assertRaisesWith(NotImplementedError, 'Signing of KeyCertificate not implemented', KeyCertificate.create, sign = True) def test_unrecognized_line(self): """ Includes unrecognized content in the descriptor. """ certificate = KeyCertificate.create({'pepperjack': 'is oh so tasty!'}) self.assertEqual(['pepperjack is oh so tasty!'], certificate.get_unrecognized_lines()) def test_first_and_last_lines(self): """ Includes a non-mandatory field before the 'dir-key-certificate-version' line or after the 'dir-key-certification' line. """ content = KeyCertificate.content() for cert_text in (b'dir-address 127.0.0.1:80\n' + content, content + b'\ndir-address 127.0.0.1:80'): self.assertRaises(ValueError, KeyCertificate, cert_text, True) certificate = KeyCertificate(cert_text, False) self.assertEqual('127.0.0.1', certificate.address) self.assertEqual(80, certificate.dir_port) def test_missing_fields(self): """ Parse a key certificate where a mandatory field is missing. """ mandatory_fields = ( 'dir-key-certificate-version', 'fingerprint', 'dir-key-published', 'dir-key-expires', 'dir-identity-key', 'dir-signing-key', 'dir-key-certification', ) for excluded_field in mandatory_fields: content = KeyCertificate.content(exclude = (excluded_field,)) self.assertRaises(ValueError, KeyCertificate, content, True) certificate = KeyCertificate(content, False) if excluded_field == 'fingerprint': self.assertEqual(3, certificate.version) else: self.assertEqual(40, len(certificate.fingerprint)) def test_blank_lines(self): """ Includes blank lines, which should be ignored. """ certificate = KeyCertificate.create({'dir-key-published': '2011-11-28 21:51:04\n\n\n'}) self.assertEqual(datetime.datetime(2011, 11, 28, 21, 51, 4), certificate.published) def test_version(self): """ Parses the dir-key-certificate-version field, including trying to handle a different certificate version with the v3 parser. """ certificate = KeyCertificate.create({'dir-key-certificate-version': '3'}) self.assertEqual(3, certificate.version) content = KeyCertificate.content({'dir-key-certificate-version': '4'}) self.assertRaises(ValueError, KeyCertificate, content, True) self.assertEqual(4, KeyCertificate(content, False).version) content = KeyCertificate.content({'dir-key-certificate-version': 'boo'}) self.assertRaises(ValueError, KeyCertificate, content, True) self.assertEqual(None, KeyCertificate(content, False).version) def test_dir_address(self): """ Parses the dir-address field. """ certificate = KeyCertificate.create({'dir-address': '127.0.0.1:80'}) self.assertEqual('127.0.0.1', certificate.address) self.assertEqual(80, certificate.dir_port) test_values = ( (''), (' '), ('127.0.0.1'), ('127.0.0.1:'), ('80'), (':80'), ('127.0.0.1a:80'), ('127.0.0.1:80a'), ) for test_value in test_values: content = KeyCertificate.content({'dir-address': test_value}) self.assertRaises(ValueError, KeyCertificate, content, True) certificate = KeyCertificate(content, False) self.assertEqual(None, certificate.address) self.assertEqual(None, certificate.dir_port) def test_fingerprint(self): """ Parses the fingerprint field. """ test_values = ( '', ' ', '27B6B5996C426270A5C95488AA5BCEB6BCC8695', '27B6B5996C426270A5C95488AA5BCEB6BCC869568', ) for test_value in test_values: content = KeyCertificate.content({'fingerprint': test_value}) self.assertRaises(ValueError, KeyCertificate, content, True) certificate = KeyCertificate(content, False) self.assertEqual(None, certificate.fingerprint) def test_time_fields(self): """ Parses the dir-key-published and dir-key-expires fields, which both have datetime content. """ test_values = ( '', ' ', '2012-12-12', '2012-12-12 01:01:', '2012-12-12 01:a1:01', ) for field, attr in (('dir-key-published', 'published'), ('dir-key-expires', 'expires')): for test_value in test_values: content = KeyCertificate.content({field: test_value}) self.assertRaises(ValueError, KeyCertificate, content, True) certificate = KeyCertificate(content, False) self.assertEqual(None, getattr(certificate, attr)) def test_key_blocks(self): """ Parses the dir-identity-key, dir-signing-key, dir-key-crosscert, and dir-key-certification fields which all just have signature content. """ # the only non-mandatory field that we haven't exercised yet is dir-key-crosscert certificate = KeyCertificate.create({'dir-key-crosscert': '\n-----BEGIN ID SIGNATURE-----%s-----END ID SIGNATURE-----' % stem.descriptor.CRYPTO_BLOB}) self.assertTrue(stem.descriptor.CRYPTO_BLOB in certificate.crosscert) test_value = '\n-----BEGIN ID SIGNATURE-----%s-----END UGABUGA SIGNATURE-----' % stem.descriptor.CRYPTO_BLOB for field, attr in (('dir-identity-key', 'identity_key'), ('dir-signing-key', 'signing_key'), ('dir-key-crosscert', 'crosscert'), ('dir-key-certification', 'certification')): content = KeyCertificate.content({field: test_value}) self.assertRaises(ValueError, KeyCertificate, content, True) certificate = KeyCertificate(content, False) self.assertEqual(None, getattr(certificate, attr)) def test_wrong_block_type(self): """ Checks that we validate the type of crypto content we receive. """ content = KeyCertificate.content({'dir-identity-key': '\n-----BEGIN MD5SUM-----%s-----END MD5SUM-----' % stem.descriptor.CRYPTO_BLOB}) self.assertRaises(ValueError, KeyCertificate, content, True) stem-1.7.1/test/unit/descriptor/microdescriptor.py0000664000175000017500000001664413411002341023110 0ustar atagaratagar00000000000000""" Unit tests for stem.descriptor.microdescriptor. """ import unittest import stem.descriptor import stem.exit_policy import test.require from stem.descriptor.microdescriptor import Microdescriptor from test.unit.descriptor import get_resource FIRST_ONION_KEY = """\ -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAMhPQtZPaxP3ukybV5LfofKQr20/ljpRk0e9IlGWWMSTkfVvBcHsa6IM H2KE6s4uuPHp7FqhakXAzJbODobnPHY8l1E4efyrqMQZXEQk2IMhgSNtG6YqUrVF CxdSKSSy0mmcBe2TOyQsahlGZ9Pudxfnrey7KcfqnArEOqNH09RpAgMBAAE= -----END RSA PUBLIC KEY-----\ """ SECOND_ONION_KEY = """\ -----BEGIN RSA PUBLIC KEY----- MIGJAoGBALCOxZdpMI2WO496njSQ2M7b4IgAGATqpJmH3So7lXOa25sK6o7JipgP qQE83K/t/xsMIpxQ/hHkft3G78HkeXXFc9lVUzH0HmHwYEu0M+PMVULSkG36MfEl 7WeSZzaG+Tlnh9OySAzVyTsv1ZJsTQFHH9V8wuM0GOMo9X8DFC+NAgMBAAE= -----END RSA PUBLIC KEY-----\ """ THIRD_ONION_KEY = """\ -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAOWFQHxO+5kGuhwPUX5jB7wJCrTbSU0fZwolNV1t9UaDdjGDvIjIhdit y2sMbyd9K8lbQO7x9rQjNst5ZicuaSOs854XQddSjm++vMdjYbOcVMqnKGSztvpd w/1LVWFfhcBnsGi4JMGbmP+KUZG9A8kI9deSyJhfi35jA7UepiHHAgMBAAE= -----END RSA PUBLIC KEY-----\ """ class TestMicrodescriptor(unittest.TestCase): def test_local_microdescriptors(self): """ Checks a small microdescriptor file with known contents. """ descriptor_path = get_resource('cached-microdescs') with open(descriptor_path, 'rb') as descriptor_file: descriptors = stem.descriptor.parse_file(descriptor_file, 'microdescriptor 1.0') router = next(descriptors) self.assertEqual(FIRST_ONION_KEY, router.onion_key) self.assertEqual(None, router.ntor_onion_key) self.assertEqual([], router.or_addresses) self.assertEqual([], router.family) self.assertEqual(stem.exit_policy.MicroExitPolicy('reject 1-65535'), router.exit_policy) self.assertEqual({b'@last-listed': b'2013-02-24 00:18:36'}, router.get_annotations()) self.assertEqual([b'@last-listed 2013-02-24 00:18:36'], router.get_annotation_lines()) router = next(descriptors) self.assertEqual(SECOND_ONION_KEY, router.onion_key) self.assertEqual('r5572HzD+PMPBbXlZwBhsm6YEbxnYgis8vhZ1jmdI2k=', router.ntor_onion_key) self.assertEqual([], router.or_addresses) self.assertEqual(['$6141629FA0D15A6AEAEF3A1BEB76E64C767B3174'], router.family) self.assertEqual(stem.exit_policy.MicroExitPolicy('reject 1-65535'), router.exit_policy) self.assertEqual({b'@last-listed': b'2013-02-24 00:18:37'}, router.get_annotations()) self.assertEqual([b'@last-listed 2013-02-24 00:18:37'], router.get_annotation_lines()) router = next(descriptors) self.assertEqual(THIRD_ONION_KEY, router.onion_key) self.assertEqual(None, router.ntor_onion_key) self.assertEqual([('2001:6b0:7:125::242', 9001, True)], router.or_addresses) self.assertEqual([], router.family) self.assertEqual(stem.exit_policy.MicroExitPolicy('accept 80,443'), router.exit_policy) self.assertEqual({b'@last-listed': b'2013-02-24 00:18:36'}, router.get_annotations()) self.assertEqual([b'@last-listed 2013-02-24 00:18:36'], router.get_annotation_lines()) def test_minimal_microdescriptor(self): """ Basic sanity check that we can parse a microdescriptor with minimal attributes. """ desc = Microdescriptor.create() self.assertEqual(None, desc.ntor_onion_key) self.assertEqual([], desc.or_addresses) self.assertEqual([], desc.family) self.assertEqual(stem.exit_policy.MicroExitPolicy('reject 1-65535'), desc.exit_policy) self.assertEqual(None, desc.exit_policy_v6) self.assertEqual({}, desc.identifiers) self.assertEqual(None, desc.identifier_type) self.assertEqual(None, desc.identifier) self.assertEqual({}, desc.protocols) self.assertEqual([], desc.get_unrecognized_lines()) @test.require.cryptography def test_descriptor_signing(self): self.assertRaisesWith(NotImplementedError, 'Signing of Microdescriptor not implemented', Microdescriptor.create, sign = True) def test_unrecognized_line(self): """ Includes unrecognized content in the descriptor. """ desc = Microdescriptor.create({'pepperjack': 'is oh so tasty!'}) self.assertEqual(['pepperjack is oh so tasty!'], desc.get_unrecognized_lines()) def test_proceeding_line(self): """ Includes a line prior to the 'onion-key' entry. """ desc_text = b'family Amunet1\n' + Microdescriptor.content() self.assertRaises(ValueError, Microdescriptor, desc_text, True) desc = Microdescriptor(desc_text, validate = False) self.assertEqual(['Amunet1'], desc.family) def test_a_line(self): """ Sanity test with both an IPv4 and IPv6 address. """ desc_text = Microdescriptor.content() desc_text += b'\na 10.45.227.253:9001' desc_text += b'\na [fd9f:2e19:3bcf::02:9970]:9001' expected = [ ('10.45.227.253', 9001, False), ('fd9f:2e19:3bcf::02:9970', 9001, True), ] desc = Microdescriptor(desc_text) self.assertEqual(expected, desc.or_addresses) def test_family(self): """ Check the family line. """ desc = Microdescriptor.create({'family': 'Amunet1 Amunet2 Amunet3'}) self.assertEqual(['Amunet1', 'Amunet2', 'Amunet3'], desc.family) # try multiple family lines desc_text = Microdescriptor.content() desc_text += b'\nfamily Amunet1' desc_text += b'\nfamily Amunet2' self.assertRaises(ValueError, Microdescriptor, desc_text, True) # family entries will overwrite each other desc = Microdescriptor(desc_text, validate = False) self.assertEqual(1, len(desc.family)) def test_exit_policy(self): """ Basic check for 'p' lines. The router status entries contain an identical field so we're not investing much effort here. """ desc = Microdescriptor.create({'p': 'accept 80,110,143,443'}) self.assertEqual(stem.exit_policy.MicroExitPolicy('accept 80,110,143,443'), desc.exit_policy) def test_protocols(self): """ Basic check for 'pr' lines. """ desc = Microdescriptor.create({'pr': 'Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=1-4 LinkAuth=1 Microdesc=1 Relay=1-2'}) self.assertEqual(10, len(desc.protocols)) def test_identifier(self): """ Basic check for 'id' lines. """ desc = Microdescriptor.create({'id': 'rsa1024 Cd47okjCHD83YGzThGBDptXs9Z4'}) self.assertEqual({'rsa1024': 'Cd47okjCHD83YGzThGBDptXs9Z4'}, desc.identifiers) self.assertEqual('rsa1024', desc.identifier_type) self.assertEqual('Cd47okjCHD83YGzThGBDptXs9Z4', desc.identifier) # check when there's multiple key types desc_text = b'\n'.join(( Microdescriptor.content(), b'id rsa1024 Cd47okjCHD83YGzThGBDptXs9Z4', b'id ed25519 50f6ddbecdc848dcc6b818b14d1', )) desc = Microdescriptor(desc_text, validate = True) self.assertEqual({'rsa1024': 'Cd47okjCHD83YGzThGBDptXs9Z4', 'ed25519': '50f6ddbecdc848dcc6b818b14d1'}, desc.identifiers) self.assertEqual('ed25519', desc.identifier_type) self.assertEqual('50f6ddbecdc848dcc6b818b14d1', desc.identifier) # check when there's conflicting keys desc_text = b'\n'.join(( Microdescriptor.content(), b'id rsa1024 Cd47okjCHD83YGzThGBDptXs9Z4', b'id rsa1024 50f6ddbecdc848dcc6b818b14d1', )) desc = Microdescriptor(desc_text) self.assertEqual({}, desc.identifiers) exc_msg = "There can only be one 'id' line per a key type, but 'rsa1024' appeared multiple times" self.assertRaisesWith(ValueError, exc_msg, Microdescriptor, desc_text, validate = True) stem-1.7.1/test/unit/version.py0000664000175000017500000002232013340051401017175 0ustar atagaratagar00000000000000""" Unit tests for the stem.version.Version parsing and class. """ import unittest import stem.util.system import stem.version from stem.version import Version try: # added in python 3.3 from unittest.mock import patch except ImportError: from mock import patch TOR_VERSION_OUTPUT = """Mar 22 23:09:37.088 [notice] Tor v0.2.2.35 \ (git-73ff13ab3cc9570d). This is experimental software. Do not rely on it for \ strong anonymity. (Running on Linux i686) Tor version 0.2.2.35 (git-73ff13ab3cc9570d).""" class TestVersion(unittest.TestCase): @patch('stem.util.system.call') @patch.dict(stem.version.VERSION_CACHE) def test_get_system_tor_version(self, call_mock): call_mock.return_value = TOR_VERSION_OUTPUT.splitlines() version = stem.version.get_system_tor_version('tor_unit') self.assert_versions_match(version, 0, 2, 2, 35, None, 'git-73ff13ab3cc9570d') self.assertEqual('73ff13ab3cc9570d', version.git_commit) call_mock.assert_called_once_with('tor_unit --version') self.assertEqual(stem.version.VERSION_CACHE['tor_unit'], version) def test_parsing(self): """ Tests parsing by the Version class constructor. """ # valid versions with various number of compontents to the version version = Version('0.1.2.3-tag') self.assert_versions_match(version, 0, 1, 2, 3, 'tag', None) version = Version('0.1.2.3') self.assert_versions_match(version, 0, 1, 2, 3, None, None) version = Version('0.1.2-tag') self.assert_versions_match(version, 0, 1, 2, None, 'tag', None) version = Version('0.1.2') self.assert_versions_match(version, 0, 1, 2, None, None, None) # checks an empty tag version = Version('0.1.2.3-') self.assert_versions_match(version, 0, 1, 2, 3, '', None) version = Version('0.1.2-') self.assert_versions_match(version, 0, 1, 2, None, '', None) # check with extra informaton version = Version('0.1.2.3-tag (git-73ff13ab3cc9570d)') self.assert_versions_match(version, 0, 1, 2, 3, 'tag', 'git-73ff13ab3cc9570d') self.assertEqual('73ff13ab3cc9570d', version.git_commit) version = Version('0.1.2.3-tag ()') self.assert_versions_match(version, 0, 1, 2, 3, 'tag', '') version = Version('0.1.2 (git-73ff13ab3cc9570d)') self.assert_versions_match(version, 0, 1, 2, None, None, 'git-73ff13ab3cc9570d') # checks invalid version strings self.assertRaises(ValueError, stem.version.Version, '') self.assertRaises(ValueError, stem.version.Version, '1.2.3.4nodash') self.assertRaises(ValueError, stem.version.Version, '1.2.3.a') self.assertRaises(ValueError, stem.version.Version, '1.2.a.4') self.assertRaises(ValueError, stem.version.Version, '1x2x3x4') self.assertRaises(ValueError, stem.version.Version, '12.3') self.assertRaises(ValueError, stem.version.Version, '1.-2.3') def test_with_multiple_extra(self): """ Parse a version with multiple 'extra' fields. """ version = Version('0.1.2 (release) (git-73ff13ab3cc9570d)') self.assert_versions_match(version, 0, 1, 2, None, None, 'release') self.assertEqual(['release', 'git-73ff13ab3cc9570d'], version.all_extra) self.assertEqual('73ff13ab3cc9570d', version.git_commit) def test_comparison(self): """ Tests comparision between Version instances. """ # check for basic incrementing in each portion self.assert_version_is_greater('1.1.2.3-tag', '0.1.2.3-tag') self.assert_version_is_greater('0.2.2.3-tag', '0.1.2.3-tag') self.assert_version_is_greater('0.1.3.3-tag', '0.1.2.3-tag') self.assert_version_is_greater('0.1.2.4-tag', '0.1.2.3-tag') self.assert_version_is_greater('0.1.2.3-ugg', '0.1.2.3-tag') self.assert_version_is_equal('0.1.2.3-tag', '0.1.2.3-tag') # check with common tags self.assert_version_is_greater('0.1.2.3-beta', '0.1.2.3-alpha') self.assert_version_is_greater('0.1.2.3-rc', '0.1.2.3-beta') # checks that a missing patch level equals zero self.assert_version_is_equal('0.1.2', '0.1.2.0') self.assert_version_is_equal('0.1.2-tag', '0.1.2.0-tag') # checks for missing patch or status self.assert_version_is_greater('0.1.2.3-tag', '0.1.2.3') self.assert_version_is_greater('0.1.2.3-tag', '0.1.2-tag') self.assert_version_is_greater('0.1.2.3-tag', '0.1.2') self.assert_version_is_equal('0.1.2.3', '0.1.2.3') self.assert_version_is_equal('0.1.2', '0.1.2') def test_nonversion_comparison(self): """ Checks that we can be compared with other types. In python 3 on only equality comparisons work, greater than and less than comparisons result in a TypeError. """ test_version = Version('0.1.2.3') self.assertNotEqual(test_version, None) self.assertNotEqual(test_version, 5) def test_string(self): """ Tests the Version -> string conversion. """ # checks conversion with various numbers of arguments self.assert_string_matches('0.1.2.3-tag') self.assert_string_matches('0.1.2.3') self.assert_string_matches('0.1.2') def test_requirements_greater_than(self): """ Checks a VersionRequirements with a single greater_than rule. """ requirements = stem.version._VersionRequirements() requirements.greater_than(Version('0.2.2.36')) self.assertTrue(Version('0.2.2.36') >= requirements) self.assertTrue(Version('0.2.2.37') >= requirements) self.assertTrue(Version('0.2.3.36') >= requirements) self.assertFalse(Version('0.2.2.35') >= requirements) self.assertFalse(Version('0.2.1.38') >= requirements) requirements = stem.version._VersionRequirements() requirements.greater_than(Version('0.2.2.36'), False) self.assertFalse(Version('0.2.2.35') >= requirements) self.assertFalse(Version('0.2.2.36') >= requirements) self.assertTrue(Version('0.2.2.37') >= requirements) def test_requirements_less_than(self): """ Checks a VersionRequirements with a single less_than rule. """ requirements = stem.version._VersionRequirements() requirements.less_than(Version('0.2.2.36')) self.assertTrue(Version('0.2.2.36') >= requirements) self.assertTrue(Version('0.2.2.35') >= requirements) self.assertTrue(Version('0.2.1.38') >= requirements) self.assertFalse(Version('0.2.2.37') >= requirements) self.assertFalse(Version('0.2.3.36') >= requirements) requirements = stem.version._VersionRequirements() requirements.less_than(Version('0.2.2.36'), False) self.assertFalse(Version('0.2.2.37') >= requirements) self.assertFalse(Version('0.2.2.36') >= requirements) self.assertTrue(Version('0.2.2.35') >= requirements) def test_requirements_in_range(self): """ Checks a VersionRequirements with a single in_range rule. """ requirements = stem.version._VersionRequirements() requirements.in_range(Version('0.2.2.36'), Version('0.2.2.38')) self.assertFalse(Version('0.2.2.35') >= requirements) self.assertTrue(Version('0.2.2.36') >= requirements) self.assertTrue(Version('0.2.2.37') >= requirements) self.assertFalse(Version('0.2.2.38') >= requirements) # rule for 'anything in the 0.2.2.x series' requirements = stem.version._VersionRequirements() requirements.in_range(Version('0.2.2.0'), Version('0.2.3.0')) for index in range(0, 100): self.assertTrue(Version('0.2.2.%i' % index) >= requirements) def test_requirements_multiple_rules(self): """ Checks a VersionRequirements is the logical 'or' when it has multiple rules. """ # rule to say 'anything but the 0.2.2.x series' requirements = stem.version._VersionRequirements() requirements.greater_than(Version('0.2.3.0')) requirements.less_than(Version('0.2.2.0'), False) self.assertTrue(Version('0.2.3.0') >= requirements) self.assertFalse(Version('0.2.2.0') >= requirements) for index in range(0, 100): self.assertFalse(Version('0.2.2.%i' % index) >= requirements) def assert_versions_match(self, version, major, minor, micro, patch, status, extra): """ Asserts that the values for a types.Version instance match the given values. """ self.assertEqual(major, version.major) self.assertEqual(minor, version.minor) self.assertEqual(micro, version.micro) self.assertEqual(patch, version.patch) self.assertEqual(status, version.status) self.assertEqual(extra, version.extra) if extra is None: self.assertEqual([], version.all_extra) self.assertEqual(None, version.git_commit) def assert_version_is_greater(self, first_version, second_version): """ Asserts that the parsed version of the first version is greate than the second (also checking the inverse). """ version1 = Version(first_version) version2 = Version(second_version) self.assertEqual(version1 > version2, True) self.assertEqual(version1 < version2, False) def assert_version_is_equal(self, first_version, second_version): """ Asserts that the parsed version of the first version equals the second. """ version1 = Version(first_version) version2 = Version(second_version) self.assertEqual(version1, version2) def assert_string_matches(self, version): """ Parses the given version string then checks that its string representation matches the input. """ self.assertEqual(version, str(Version(version))) stem-1.7.1/test/unit/endpoint.py0000664000175000017500000000377113341034346017353 0ustar atagaratagar00000000000000""" Unit tests for the stem.Endpoint class. """ import unittest import stem class TestEndpoint(unittest.TestCase): def test_constructor(self): endpoint = stem.ORPort('12.34.56.78', 80) self.assertEqual('12.34.56.78', endpoint.address) self.assertEqual(80, endpoint.port) self.assertEqual(None, endpoint.link_protocols) endpoint = stem.ORPort('12.34.56.78', 80, [3]) self.assertEqual('12.34.56.78', endpoint.address) self.assertEqual(80, endpoint.port) self.assertEqual([3], endpoint.link_protocols) endpoint = stem.DirPort('12.34.56.78', 80) self.assertEqual('12.34.56.78', endpoint.address) self.assertEqual(80, endpoint.port) def test_validation(self): self.assertRaises(ValueError, stem.DirPort, '12.34.56.78', 'hello') self.assertRaises(ValueError, stem.DirPort, '12.34.56.78', -5) self.assertRaises(ValueError, stem.DirPort, '12.34.56.78', None) self.assertRaises(ValueError, stem.DirPort, 'hello', 80) self.assertRaises(ValueError, stem.DirPort, -5, 80) self.assertRaises(ValueError, stem.DirPort, None, 80) def test_equality(self): self.assertTrue(stem.ORPort('12.34.56.78', 80) == stem.ORPort('12.34.56.78', 80)) self.assertTrue(stem.ORPort('12.34.56.78', 80, [1, 2, 3]) == stem.ORPort('12.34.56.78', 80, [1, 2, 3])) self.assertFalse(stem.ORPort('12.34.56.78', 80) == stem.ORPort('12.34.56.88', 80)) self.assertFalse(stem.ORPort('12.34.56.78', 80) == stem.ORPort('12.34.56.78', 443)) self.assertFalse(stem.ORPort('12.34.56.78', 80, [2, 3]) == stem.ORPort('12.34.56.78', 80, [1, 2, 3])) self.assertTrue(stem.DirPort('12.34.56.78', 80) == stem.DirPort('12.34.56.78', 80)) self.assertFalse(stem.DirPort('12.34.56.78', 80) == stem.DirPort('12.34.56.88', 80)) self.assertFalse(stem.DirPort('12.34.56.78', 80) == stem.DirPort('12.34.56.78', 443)) self.assertFalse(stem.ORPort('12.34.56.78', 80) == stem.DirPort('12.34.56.78', 80)) self.assertFalse(stem.DirPort('12.34.56.78', 80) == stem.ORPort('12.34.56.78', 80)) stem-1.7.1/test/unit/client/0000775000175000017500000000000013411004021016410 5ustar atagaratagar00000000000000stem-1.7.1/test/unit/client/certificate.py0000664000175000017500000000301013341034346021255 0ustar atagaratagar00000000000000""" Unit tests for stem.client.Certificate. """ import unittest from stem.client.datatype import CertType, Certificate class TestCertificate(unittest.TestCase): def test_constructor(self): test_data = ( ((1, b'\x7f\x00\x00\x01'), (CertType.LINK, 1, b'\x7f\x00\x00\x01')), ((2, b'\x7f\x00\x00\x01'), (CertType.IDENTITY, 2, b'\x7f\x00\x00\x01')), ((3, b'\x7f\x00\x00\x01'), (CertType.AUTHENTICATE, 3, b'\x7f\x00\x00\x01')), ((4, b'\x7f\x00\x00\x01'), (CertType.UNKNOWN, 4, b'\x7f\x00\x00\x01')), ((CertType.IDENTITY, b'\x7f\x00\x00\x01'), (CertType.IDENTITY, 2, b'\x7f\x00\x00\x01')), ) for (cert_type, cert_value), (expected_type, expected_type_int, expected_value) in test_data: cert = Certificate(cert_type, cert_value) self.assertEqual(expected_type, cert.type) self.assertEqual(expected_type_int, cert.type_int) self.assertEqual(expected_value, cert.value) def test_unknown_type(self): cert = Certificate(12, 'hello') self.assertEqual(CertType.UNKNOWN, cert.type) self.assertEqual(12, cert.type_int) self.assertEqual('hello', cert.value) def test_packing(self): cert, content = Certificate.pop(b'\x02\x00\x04\x00\x00\x01\x01\x04\x04aq\x0f\x02\x00\x00\x00\x00') self.assertEqual(b'\x04\x04aq\x0f\x02\x00\x00\x00\x00', content) self.assertEqual(CertType.IDENTITY, cert.type) self.assertEqual(2, cert.type_int) self.assertEqual(b'\x00\x00\x01\x01', cert.value) self.assertEqual(b'\x02\x00\x04\x00\x00\x01\x01', cert.pack()) stem-1.7.1/test/unit/client/address.py0000664000175000017500000000702613341474573020445 0ustar atagaratagar00000000000000""" Unit tests for stem.client.Address. """ import collections import unittest from stem.client.datatype import AddrType, Address ExpectedAddress = collections.namedtuple('ExpectedAddress', ['type', 'type_int', 'value', 'value_bin']) class TestAddress(unittest.TestCase): def test_enum(self): self.assertEqual(('IPv4', 4), AddrType.get(AddrType.IPv4)) self.assertEqual(('IPv4', 4), AddrType.get(4)) self.assertEqual(('UNKNOWN', 25), AddrType.get(25)) self.assertRaisesWith(ValueError, "Invalid enumeration 'boom', options are HOSTNAME, IPv4, IPv6, ERROR_TRANSIENT, ERROR_PERMANENT, UNKNOWN", AddrType.get, 'boom') def test_constructor(self): test_data = ( ((4, b'\x7f\x00\x00\x01'), ExpectedAddress(AddrType.IPv4, 4, '127.0.0.1', b'\x7f\x00\x00\x01')), ((4, b'aq\x0f\x02'), ExpectedAddress(AddrType.IPv4, 4, '97.113.15.2', b'aq\x0f\x02')), ((6, b' \x01\r\xb8\x00\x00\x00\x00\x00\x00\xff\x00\x00B\x83)'), ExpectedAddress(AddrType.IPv6, 6, '2001:0db8:0000:0000:0000:ff00:0042:8329', b' \x01\r\xb8\x00\x00\x00\x00\x00\x00\xff\x00\x00B\x83)')), ((AddrType.IPv4, '127.0.0.1'), ExpectedAddress(AddrType.IPv4, 4, '127.0.0.1', b'\x7f\x00\x00\x01')), ((AddrType.IPv4, '97.113.15.2'), ExpectedAddress(AddrType.IPv4, 4, '97.113.15.2', b'aq\x0f\x02')), ((AddrType.IPv6, '2001:0db8:0000:0000:0000:ff00:0042:8329'), ExpectedAddress(AddrType.IPv6, 6, '2001:0db8:0000:0000:0000:ff00:0042:8329', b' \x01\r\xb8\x00\x00\x00\x00\x00\x00\xff\x00\x00B\x83)')), ((AddrType.IPv6, '2001:0DB8:AC10:FE01::'), ExpectedAddress(AddrType.IPv6, 6, '2001:0db8:ac10:fe01:0000:0000:0000:0000', b' \x01\r\xb8\xac\x10\xfe\x01\x00\x00\x00\x00\x00\x00\x00\x00')), # collaped and different case ) for (addr_type, addr_value), expected in test_data: addr = Address(addr_value, addr_type) self.assertEqual(expected.type, addr.type) self.assertEqual(expected.type_int, addr.type_int) self.assertEqual(expected.value, addr.value) self.assertEqual(expected.value_bin, addr.value_bin) # when an IPv4 or IPv6 address the type is optional self.assertEqual(AddrType.IPv4, Address('127.0.0.1').type) self.assertEqual(AddrType.IPv6, Address('2001:0DB8:AC10:FE01::').type) self.assertRaisesWith(ValueError, "Packed IPv4 addresses should be four bytes, but was: '\\x7f\\x00'", Address, '\x7f\x00', 4) self.assertRaisesWith(ValueError, "Packed IPv6 addresses should be sixteen bytes, but was: '\\x7f\\x00'", Address, '\x7f\x00', 6) self.assertRaisesWith(ValueError, "'nope' isn't an IPv4 or IPv6 address", Address, 'nope') def test_unknown_type(self): addr = Address('hello', 12) self.assertEqual(AddrType.UNKNOWN, addr.type) self.assertEqual(12, addr.type_int) self.assertEqual(None, addr.value) self.assertEqual('hello', addr.value_bin) def test_packing(self): test_data = { b'\x04\x04\x7f\x00\x00\x01': Address('127.0.0.1'), b'\x06\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\xff\x00\x00B\x83)': Address('2001:0db8:0000:0000:0000:ff00:0042:8329'), } for cell_bytes, address in test_data.items(): self.assertEqual(cell_bytes, address.pack()) self.assertEqual(address, Address.unpack(cell_bytes)) addr, content = Address.pop(b'\x04\x04\x7f\x00\x00\x01\x01\x04\x04aq\x0f\x02\x00\x00\x00\x00') self.assertEqual(b'\x01\x04\x04aq\x0f\x02\x00\x00\x00\x00', content) self.assertEqual(AddrType.IPv4, addr.type) self.assertEqual(4, addr.type_int) self.assertEqual('127.0.0.1', addr.value) self.assertEqual(b'\x7f\x00\x00\x01', addr.value_bin) stem-1.7.1/test/unit/client/data/0000775000175000017500000000000013411004021017321 5ustar atagaratagar00000000000000stem-1.7.1/test/unit/client/data/new_link_cells0000664000175000017500000000377313341034346022265 0ustar atagaratagar00000000000000ÀJ0‚F0‚¯ oªš—P1K0  *†H†÷  0'1%0#U www.dvklxpc27pequgjrosyd.com0 170819000000Z 180311000000Z0 10U www.mldzsjpalxyjx.net0‚"0  *†H†÷ ‚0‚ ‚›TÔ‰üÞ,éô¦ÁµMªì¨:* Æb·íÖÖ^çCöØô`™ÝN+É#çÝ+oFÊ7ût…0Ä=}ÿô\ö6Lõ©Ž…»ºHC$¾g­+ÙüŒ| ŠE%;"ð5ÁÒ·x“¢{wA³€Hˆ«Ó)Jz¸ ˜&kÄ^»)ëblE7,L1ÜÎí\E£ö$×@·³÷¤ð#˜iŸ92‡*(hß¡ø%`”*H*š{£•! ƒq˜ü<îSƒ¶ô‰ ðµ ZؙҶ£ÌZY±/F EŠ”²Š!F.«–Æ&«k·Dé³U3/ukʬ*ñrú+º¸™¡U|Vds0  *†H†÷  ¯±>¸Dåèúc×Äú`{¶VÛ>Œ˜ÑÙÀÕ†êæ¯ƒº̳As¢ôX1Œu™Ð/…„êfKvÇÐ*eC%1Fµ‹¤M%*òíÓ<“ÇÔ¢lO¡æ¾A ˜£CéßVäÿ-æ#ø|Í>=üL¥{;OG{5‹DÍ0‚É0‚2 .àd‰ëh0  *†H†÷  0'1%0#U www.dvklxpc27pequgjrosyd.com0 170410000000Z 180410000000Z0'1%0#U www.dvklxpc27pequgjrosyd.com0Ÿ0  *†H†÷ 0‰Ñ$¾A›jÇ iE?³p”ß¶òK«¼9J„ÃaÏHUЇùÑ̹·³´©Ã}úà&âI”xwÇÚ¯Õ£ƒ}·zqzneNMn—’”V~4XÎ+8­•˜0efÓU^Qö Î\Û•k€{Ê6Aû¹¬Ç,"+Žj“0  *†H†÷  ¹ÿæå4a¿ôïQB¡îˆûêÍ\+~ „˦•êÚ´zâ>ƒ­õ96û5<^mS©¢:LèÒK_×PG§»IðkÍŒ« O˜cžpîÙYÕe­HÔzŽÙ£ôU ƒŒÂN¦¬©ãÕ¼5â{:qýUÙã@ªÅ ßÙ?ɸ>[+Œm"­”HòQD‹8Çqüàµè»WÞ 'å%òq»˜%ÍB ¥³½ˆ±CÒ_R! ˆOegl¼‚d«Û¯ìåBÂÖ쎑cβCÀCÕ •®t*ÓÌcmø'wŒ—óa¨­¼•i,ÊãŸP .ðçœ_Koé¢(ÜK÷Ó hm Ù£ïô{Ô!^-¶K³3çŸçXZr{j“%!sJ¦ mÓý5+xU¸Á{Ñ eëô'+ŸUÙl,’ÃH?€a»<Âì×õViܯWó¹ÎTÂVÇláê8!8ÉÞ¥¥³½ˆ±CÒ_R! ˆOegl¼‚d«Û¯ìåBÂÖ}º€MD :GÛÑ%-`5!¹)“’FÌè×\¹[‡,¨ÙdK¥¥7zû á™\…MÃ!žk û‚r\|_Ûb¶ðЧ§`ÔµÀÓ ÒÒ¤;êšœ™8˜y(®_ °grg¾§üÈ {!Ex®y‹iôUÁDœÙ€1'¶¡è¿îPÓSÉ£î‚&‰Y ™²Ù*V¶n Ø/ãQH…Zü{©®ƒ^KZZ¶aqstem-1.7.1/test/unit/client/size.py0000664000175000017500000000375613341474573020000 0ustar atagaratagar00000000000000""" Unit tests for stem.client.Size. """ import re import unittest from stem.client.datatype import Size class TestSize(unittest.TestCase): def test_attributes(self): self.assertEqual('CHAR', Size.CHAR.name) self.assertEqual('!B', Size.CHAR.format) self.assertEqual(1, Size.CHAR.size) self.assertEqual(2, Size.SHORT.size) self.assertEqual(4, Size.LONG.size) self.assertEqual(8, Size.LONG_LONG.size) def test_pack(self): self.assertEqual(b'\x12', Size.CHAR.pack(18)) self.assertEqual(b'\x00\x12', Size.SHORT.pack(18)) self.assertEqual(b'\x00\x00\x00\x12', Size.LONG.pack(18)) self.assertEqual(b'\x00\x00\x00\x00\x00\x00\x00\x12', Size.LONG_LONG.pack(18)) self.assertRaisesWith(ValueError, 'Size.pack encodes an integer, but was a str', Size.CHAR.pack, 'hi') self.assertRaisesWith(ValueError, 'Packed values must be positive (attempted to pack -1 as a CHAR)', Size.CHAR.pack, -1) bad_size = Size('BAD_SIZE', 1, '!H') self.assertRaisesRegexp(ValueError, re.escape("'\\x00\\x12' is the wrong size for a BAD_SIZE field"), bad_size.pack, 18) def test_unpack(self): self.assertEqual(18, Size.CHAR.unpack(b'\x12')) self.assertEqual(18, Size.SHORT.unpack(b'\x00\x12')) self.assertEqual(18, Size.LONG.unpack(b'\x00\x00\x00\x12')) self.assertEqual(18, Size.LONG_LONG.unpack(b'\x00\x00\x00\x00\x00\x00\x00\x12')) self.assertEqual(ord('a'), Size.CHAR.unpack(b'a')) self.assertEqual(24930, Size.SHORT.unpack(b'ab')) self.assertRaisesWith(ValueError, "'\\x00\\x12' is the wrong size for a CHAR field", Size.CHAR.unpack, '\x00\x12') def test_pop(self): self.assertEqual((18, b''), Size.CHAR.pop(b'\x12')) self.assertEqual((0, b'\x12'), Size.CHAR.pop(b'\x00\x12')) self.assertEqual((18, b''), Size.SHORT.pop(b'\x00\x12')) self.assertRaisesWith(ValueError, "'' is the wrong size for a CHAR field", Size.CHAR.pop, '') self.assertRaisesWith(ValueError, "'\\x12' is the wrong size for a SHORT field", Size.SHORT.pop, '\x12') stem-1.7.1/test/unit/client/__init__.py0000664000175000017500000000070213341034346020537 0ustar atagaratagar00000000000000""" Unit tests for stem.client.* contents. """ import os __all__ = [ 'address', 'cell', 'certificate', 'kdf', 'size', ] TEST_DATA = os.path.join(os.path.dirname(__file__), 'data') def test_data(filename): """ Provides test data in the given file. :param str filename: test data to provide :returns: **bytes** with the data """ with open(os.path.join(TEST_DATA, filename), 'rb') as data_file: return data_file.read() stem-1.7.1/test/unit/client/cell.py0000664000175000017500000004336113341474573017741 0ustar atagaratagar00000000000000""" Unit tests for the stem.client.cell. """ import datetime import hashlib import os import unittest from stem.client.datatype import ZERO, CertType, CloseReason, Address, Certificate from test.unit.client import test_data from stem.client.cell import ( FIXED_PAYLOAD_LEN, Cell, PaddingCell, RelayCell, DestroyCell, CreateFastCell, CreatedFastCell, VersionsCell, NetinfoCell, VPaddingCell, CertsCell, AuthChallengeCell, ) RANDOM_PAYLOAD = os.urandom(FIXED_PAYLOAD_LEN) CHALLENGE = b'\x89Y\t\x99\xb2\x1e\xd9*V\xb6\x1bn\n\x05\xd8/\xe3QH\x85\x13Z\x17\xfc\x1c\x00{\xa9\xae\x83^K' PADDING_CELLS = { b'\x00\x00\x00' + RANDOM_PAYLOAD: (RANDOM_PAYLOAD, 2), } RELAY_CELLS = { b'\x00\x01\x03\r\x00\x00\x00\x01!\xa3?\xec\x00\x00' + ZERO * 498: ('RELAY_BEGIN_DIR', 13, 1, 1, b'', 564346860, ZERO * 498, 2), b'\x00\x01\x03\x02\x00\x00\x00\x01\x15:m\xe0\x00&GET /tor/server/authority HTTP/1.0\r\n\r\n' + ZERO * 460: ('RELAY_DATA', 2, 1, 1, b'GET /tor/server/authority HTTP/1.0\r\n\r\n', 356150752, ZERO * 460, 2), b'\x00\x01\x03\x02\x00\x00\x00\x01\x15:m\xe0\x00&GET /tor/server/authority HTTP/1.0\r\n\r\n' + b'\x01' + ZERO * 459: ('RELAY_DATA', 2, 1, 1, b'GET /tor/server/authority HTTP/1.0\r\n\r\n', 356150752, b'\x01' + ZERO * 459, 2), } DESTROY_CELLS = { b'\x80\x00\x00\x00\x04\x00' + ZERO * 508: (2147483648, CloseReason.NONE, 0, ZERO * 508, 5), b'\x80\x00\x00\x00\x04\x03' + ZERO * 508: (2147483648, CloseReason.REQUESTED, 3, ZERO * 508, 5), b'\x80\x00\x00\x00\x04\x01' + b'\x01' + ZERO * 507: (2147483648, CloseReason.PROTOCOL, 1, b'\x01' + ZERO * 507, 5), } CREATE_FAST_CELLS = { (b'\x80\x00\x00\x00\x05\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\xce' + ZERO * 489): (2147483648, b'\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\xce', ZERO * 489, 5), (b'\x80\x00\x00\x00\x05\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\x00' + ZERO * 489): (2147483648, b'\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\x00', ZERO * 489, 5), (b'\x80\x00\x00\x00\x05\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\x00' + b'\x01' + ZERO * 488): (2147483648, b'\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\x00', b'\x01' + ZERO * 488, 5), } CREATED_FAST_CELLS = { (b'\x80\x00\x00\x00\x06\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\xce\x13Z\x99\xb2\x1e\xb6\x05\x85\x17\xfc\x1c\x00{\xa9\xae\x83^K\x99\xb2' + ZERO * 469): (2147483648, b'\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\xce', b'\x13Z\x99\xb2\x1e\xb6\x05\x85\x17\xfc\x1c\x00{\xa9\xae\x83^K\x99\xb2', ZERO * 469, 5), (b'\x80\x00\x00\x00\x06\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\xce\x13Z\x99\xb2\x1e\xb6\x05\x85\x17\xfc\x1c\x00{\xa9\xae\x83^K\x99\x00' + ZERO * 469): (2147483648, b'\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\xce', b'\x13Z\x99\xb2\x1e\xb6\x05\x85\x17\xfc\x1c\x00{\xa9\xae\x83^K\x99\x00', ZERO * 469, 5), (b'\x80\x00\x00\x00\x06\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\xce\x13Z\x99\xb2\x1e\xb6\x05\x85\x17\xfc\x1c\x00{\xa9\xae\x83^K\x99\x00' + b'\x01' + ZERO * 468): (2147483648, b'\x92O\x0c\xcb\xa8\xac\xfb\xc9\x7f\xd0\rz\x1a\x03u\x91\xceas\xce', b'\x13Z\x99\xb2\x1e\xb6\x05\x85\x17\xfc\x1c\x00{\xa9\xae\x83^K\x99\x00', b'\x01' + ZERO * 468, 5), } VERSIONS_CELLS = { b'\x00\x00\x07\x00\x00': ([], 2), b'\x00\x00\x07\x00\x02\x00\x01': ([1], 2), b'\x00\x00\x07\x00\x06\x00\x01\x00\x02\x00\x03': ([1, 2, 3], 2), b'\x00\x00\x00\x00\x07\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04': ([1, 2, 3, 4], 4), } NETINFO_CELLS = { b'\x00\x00\x08ZZ\xb6\x90\x04\x04\x7f\x00\x00\x01\x01\x04\x04aq\x0f\x02' + ZERO * (FIXED_PAYLOAD_LEN - 17): (datetime.datetime(2018, 1, 14, 1, 46, 56), Address('127.0.0.1'), [Address('97.113.15.2')], ZERO * 492, 2), b'\x00\x00\x08ZZ\xb6\x90\x04\x04\x7f\x00\x00\x01\x01\x04\x04aq\x0f\x02' + b'\x01' + ZERO * (FIXED_PAYLOAD_LEN - 18): (datetime.datetime(2018, 1, 14, 1, 46, 56), Address('127.0.0.1'), [Address('97.113.15.2')], b'\x01' + ZERO * 491, 2), } VPADDING_CELL_EMPTY_PACKED = b'\x00\x00\x80\x00\x00' VPADDING_CELLS = { VPADDING_CELL_EMPTY_PACKED: (b'', 2), b'\x00\x00\x80\x00\x01\x08': (b'\x08', 2), b'\x00\x00\x80\x00\x02\x08\x11': (b'\x08\x11', 2), b'\x00\x00\x80\x01\xfd' + RANDOM_PAYLOAD: (RANDOM_PAYLOAD, 2), } CERTS_CELLS = { b'\x00\x00\x81\x00\x01\x00': ([], b'', 2), b'\x00\x00\x81\x00\x04\x01\x01\x00\x00': ([Certificate(1, b'')], b'', 2), b'\x00\x00\x81\x00\x05\x01\x01\x00\x01\x08': ([Certificate(1, b'\x08')], b'', 2), b'\x00\x00\x81\x00\x07\x01\x01\x00\x01\x08' + b'\x06\x04': ([Certificate(1, b'\x08')], b'\x06\x04', 2), } AUTH_CHALLENGE_CELLS = { b'\x00\x00\x82\x00\x26' + CHALLENGE + b'\x00\x02\x00\x01\x00\x03': (CHALLENGE, [1, 3], b'', 2), b'\x00\x00\x82\x00\x28' + CHALLENGE + b'\x00\x02\x00\x01\x00\x03' + b'\x01\x02': (CHALLENGE, [1, 3], b'\x01\x02', 2), } class TestCell(unittest.TestCase): def test_by_name(self): cls = Cell.by_name('NETINFO') self.assertEqual('NETINFO', cls.NAME) self.assertEqual(8, cls.VALUE) self.assertEqual(True, cls.IS_FIXED_SIZE) self.assertRaises(ValueError, Cell.by_name, 'NOPE') self.assertRaises(ValueError, Cell.by_name, 85) self.assertRaises(ValueError, Cell.by_name, None) def test_by_value(self): cls = Cell.by_value(8) self.assertEqual('NETINFO', cls.NAME) self.assertEqual(8, cls.VALUE) self.assertEqual(True, cls.IS_FIXED_SIZE) self.assertRaises(ValueError, Cell.by_value, 'NOPE') self.assertRaises(ValueError, Cell.by_value, 85) self.assertRaises(ValueError, Cell.by_value, None) def test_unimplemented_cell_methods(self): cell_instance = Cell() self.assertRaisesWith(NotImplementedError, 'Packing not yet implemented for UNKNOWN cells', cell_instance.pack, 2) self.assertRaisesWith(NotImplementedError, 'Unpacking not yet implemented for UNKNOWN cells', cell_instance._unpack, b'dummy', 0, 2) def test_payload_too_large(self): class OversizedCell(Cell): NAME = 'OVERSIZED' VALUE = 127 # currently nonsense, but potentially will be allocated in the distant future IS_FIXED_SIZE = True def pack(self, link_protocol): return OversizedCell._pack(link_protocol, ZERO * (FIXED_PAYLOAD_LEN + 1)) instance = OversizedCell() expected_message = 'Cell of type OVERSIZED is too large (%i bytes), must not be more than %i. Check payload size (was %i bytes)' % (FIXED_PAYLOAD_LEN + 4, FIXED_PAYLOAD_LEN + 3, FIXED_PAYLOAD_LEN + 1) self.assertRaisesWith(ValueError, expected_message, instance.pack, 2) def test_circuit_id_validation(self): # only CircuitCell subclasses should provide a circ_id self.assertRaisesWith(ValueError, 'PADDING cells should not specify a circuit identifier', PaddingCell._pack, 5, b'', circ_id = 12) # CircuitCell should validate its circ_id self.assertRaisesWith(ValueError, 'RELAY cells require a circuit identifier', RelayCell._pack, 5, b'', circ_id = None) for circ_id in (0, -1, -50): expected_msg = 'Circuit identifiers must a positive integer, not %s' % circ_id self.assertRaisesWith(ValueError, expected_msg, RelayCell._pack, 5, b'', circ_id = circ_id) def test_unpack_for_new_link(self): expected_certs = ( (CertType.LINK, 1, b'0\x82\x02F0\x82\x01\xaf'), (CertType.IDENTITY, 2, b'0\x82\x01\xc90\x82\x012'), (CertType.UNKNOWN, 4, b'\x01\x04\x00\x06m\x1f'), (CertType.UNKNOWN, 5, b'\x01\x05\x00\x06m\n\x01'), (CertType.UNKNOWN, 7, b'\x1a\xa5\xb3\xbd\x88\xb1C'), ) content = test_data('new_link_cells') version_cell, content = Cell.pop(content, 2) self.assertEqual(VersionsCell([3, 4, 5]), version_cell) certs_cell, content = Cell.pop(content, 2) self.assertEqual(CertsCell, type(certs_cell)) self.assertEqual(len(expected_certs), len(certs_cell.certificates)) for i, (cert_type, cert_type_int, cert_prefix) in enumerate(expected_certs): self.assertEqual(cert_type, certs_cell.certificates[i].type) self.assertEqual(cert_type_int, certs_cell.certificates[i].type_int) self.assertTrue(certs_cell.certificates[i].value.startswith(cert_prefix)) auth_challenge_cell, content = Cell.pop(content, 2) self.assertEqual(AuthChallengeCell([1, 3], b'\x89Y\t\x99\xb2\x1e\xd9*V\xb6\x1bn\n\x05\xd8/\xe3QH\x85\x13Z\x17\xfc\x1c\x00{\xa9\xae\x83^K'), auth_challenge_cell) netinfo_cell, content = Cell.pop(content, 2) self.assertEqual(NetinfoCell, type(netinfo_cell)) self.assertEqual(datetime.datetime(2018, 1, 14, 1, 46, 56), netinfo_cell.timestamp) self.assertEqual(Address('127.0.0.1'), netinfo_cell.receiver_address) self.assertEqual([Address('97.113.15.2')], netinfo_cell.sender_addresses) self.assertEqual(ZERO * 492, netinfo_cell.unused) self.assertEqual(b'', content) # check that we've consumed all of the bytes def test_padding_cell(self): for cell_bytes, (payload, link_protocol) in PADDING_CELLS.items(): self.assertEqual(cell_bytes, PaddingCell(payload).pack(link_protocol)) cell = Cell.pop(cell_bytes, link_protocol)[0] self.assertEqual(payload, cell.payload) self.assertEqual(b'', cell.unused) # always empty self.assertEqual(cell_bytes, cell.pack(link_protocol)) def test_relay_cell(self): for cell_bytes, (command, command_int, circ_id, stream_id, data, digest, unused, link_protocol) in RELAY_CELLS.items(): if not unused.strip(ZERO): self.assertEqual(cell_bytes, RelayCell(circ_id, command, data, digest, stream_id).pack(link_protocol)) self.assertEqual(cell_bytes, RelayCell(circ_id, command_int, data, digest, stream_id).pack(link_protocol)) else: self.assertEqual(cell_bytes, RelayCell(circ_id, command, data, digest, stream_id, unused = unused).pack(link_protocol)) self.assertEqual(cell_bytes, RelayCell(circ_id, command_int, data, digest, stream_id, unused = unused).pack(link_protocol)) cell = Cell.pop(cell_bytes, link_protocol)[0] self.assertEqual(circ_id, cell.circ_id) self.assertEqual(command, cell.command) self.assertEqual(command_int, cell.command_int) self.assertEqual(data, cell.data) self.assertEqual(digest, cell.digest) self.assertEqual(stream_id, cell.stream_id) self.assertEqual(unused, cell.unused) self.assertEqual(cell_bytes, cell.pack(link_protocol)) digest = hashlib.sha1(b'hi') self.assertEqual(3257622417, RelayCell(5, 'RELAY_BEGIN_DIR', '', digest, 564346860).digest) self.assertEqual(3257622417, RelayCell(5, 'RELAY_BEGIN_DIR', '', digest.digest(), 564346860).digest) self.assertEqual(3257622417, RelayCell(5, 'RELAY_BEGIN_DIR', '', 3257622417, 564346860).digest) self.assertRaisesWith(ValueError, 'RELAY cell digest must be a hash, string, or int but was a list', RelayCell, 5, 'RELAY_BEGIN_DIR', '', [], 564346860) self.assertRaisesRegexp(ValueError, "Invalid enumeration 'NO_SUCH_COMMAND', options are RELAY_BEGIN, RELAY_DATA", RelayCell, 5, 'NO_SUCH_COMMAND', '', 5, 564346860) mismatched_data_length_bytes = b''.join(( b'\x00\x01', # circ ID b'\x03', # command b'\x02', # relay command b'\x00\x00', # 'recognized' b'\x00\x01', # stream ID b'\x15:m\xe0', # digest b'\xFF\xFF', # data len (65535, clearly invalid) ZERO * 498, # data )) self.assertRaisesWith(ValueError, 'RELAY cell said it had 65535 bytes of data, but only had 498', Cell.pop, mismatched_data_length_bytes, 2) def test_destroy_cell(self): for cell_bytes, (circ_id, reason, reason_int, unused, link_protocol) in DESTROY_CELLS.items(): if not unused.strip(ZERO): self.assertEqual(cell_bytes, DestroyCell(circ_id, reason).pack(link_protocol)) self.assertEqual(cell_bytes, DestroyCell(circ_id, reason_int).pack(link_protocol)) else: self.assertEqual(cell_bytes, DestroyCell(circ_id, reason, unused = unused).pack(link_protocol)) self.assertEqual(cell_bytes, DestroyCell(circ_id, reason_int, unused = unused).pack(link_protocol)) cell = Cell.pop(cell_bytes, link_protocol)[0] self.assertEqual(circ_id, cell.circ_id) self.assertEqual(reason, cell.reason) self.assertEqual(reason_int, cell.reason_int) self.assertEqual(unused, cell.unused) self.assertEqual(cell_bytes, cell.pack(link_protocol)) def test_create_fast_cell(self): for cell_bytes, (circ_id, key_material, unused, link_protocol) in CREATE_FAST_CELLS.items(): if not unused.strip(ZERO): self.assertEqual(cell_bytes, CreateFastCell(circ_id, key_material).pack(link_protocol)) else: self.assertEqual(cell_bytes, CreateFastCell(circ_id, key_material, unused = unused).pack(link_protocol)) cell = Cell.pop(cell_bytes, link_protocol)[0] self.assertEqual(circ_id, cell.circ_id) self.assertEqual(key_material, cell.key_material) self.assertEqual(unused, cell.unused) self.assertEqual(cell_bytes, cell.pack(link_protocol)) self.assertRaisesWith(ValueError, 'Key material should be 20 bytes, but was 3', CreateFastCell, 5, 'boo') def test_created_fast_cell(self): for cell_bytes, (circ_id, key_material, derivative_key, unused, link_protocol) in CREATED_FAST_CELLS.items(): if not unused.strip(ZERO): self.assertEqual(cell_bytes, CreatedFastCell(circ_id, derivative_key, key_material).pack(link_protocol)) else: self.assertEqual(cell_bytes, CreatedFastCell(circ_id, derivative_key, key_material, unused = unused).pack(link_protocol)) cell = Cell.pop(cell_bytes, link_protocol)[0] self.assertEqual(circ_id, cell.circ_id) self.assertEqual(key_material, cell.key_material) self.assertEqual(derivative_key, cell.derivative_key) self.assertEqual(unused, cell.unused) self.assertEqual(cell_bytes, cell.pack(link_protocol)) self.assertRaisesWith(ValueError, 'Key material should be 20 bytes, but was 3', CreateFastCell, 5, 'boo') def test_versions_cell(self): for cell_bytes, (versions, link_protocol) in VERSIONS_CELLS.items(): self.assertEqual(cell_bytes, VersionsCell(versions).pack(link_protocol)) cell = Cell.pop(cell_bytes, link_protocol)[0] self.assertEqual(versions, cell.versions) self.assertEqual(b'', cell.unused) # always empty self.assertEqual(cell_bytes, cell.pack(link_protocol)) def test_netinfo_cell(self): for cell_bytes, (timestamp, receiver_address, sender_addresses, unused, link_protocol) in NETINFO_CELLS.items(): if not unused.strip(ZERO): self.assertEqual(cell_bytes, NetinfoCell(receiver_address, sender_addresses, timestamp).pack(link_protocol)) else: self.assertEqual(cell_bytes, NetinfoCell(receiver_address, sender_addresses, timestamp, unused = unused).pack(link_protocol)) cell = Cell.pop(cell_bytes, link_protocol)[0] self.assertEqual(timestamp, cell.timestamp) self.assertEqual(receiver_address, cell.receiver_address) self.assertEqual(sender_addresses, cell.sender_addresses) self.assertEqual(unused, cell.unused) self.assertEqual(cell_bytes, cell.pack(link_protocol)) def test_vpadding_cell(self): for cell_bytes, (payload, link_protocol) in VPADDING_CELLS.items(): self.assertEqual(cell_bytes, VPaddingCell(payload = payload).pack(link_protocol)) cell = Cell.pop(cell_bytes, link_protocol)[0] self.assertEqual(payload, cell.payload) self.assertEqual(b'', cell.unused) # always empty self.assertEqual(cell_bytes, cell.pack(link_protocol)) empty_constructed_cell = VPaddingCell(size = 0) self.assertEqual(VPADDING_CELL_EMPTY_PACKED, empty_constructed_cell.pack(2)) self.assertEqual(b'', empty_constructed_cell.payload) self.assertRaisesWith(ValueError, 'VPaddingCell constructor specified both a size of 5 bytes and payload of 1 bytes', VPaddingCell, 5, '\x02') self.assertRaisesWith(ValueError, 'VPaddingCell size (-15) cannot be negative', VPaddingCell, -15) self.assertRaisesWith(ValueError, 'VPaddingCell constructor must specify payload or size', VPaddingCell) def test_certs_cell(self): for cell_bytes, (certs, unused, link_protocol) in CERTS_CELLS.items(): if not unused.strip(ZERO): self.assertEqual(cell_bytes, CertsCell(certs).pack(link_protocol)) else: self.assertEqual(cell_bytes, CertsCell(certs, unused = unused).pack(link_protocol)) cell = Cell.pop(cell_bytes, link_protocol)[0] self.assertEqual(certs, cell.certificates) self.assertEqual(unused, cell.unused) self.assertEqual(cell_bytes, cell.pack(link_protocol)) # truncated or missing certificates should error self.assertRaisesWith(ValueError, 'CERTS cell should have a certificate with 3 bytes, but only had 1 remaining', Cell.pop, b'\x00\x00\x81\x00\x05\x01\x01\x00\x03\x08', 2) self.assertRaisesWith(ValueError, 'CERTS cell indicates it should have 2 certificates, but only contained 1', Cell.pop, b'\x00\x00\x81\x00\x05\x02\x01\x00\x01\x08', 2) def test_auth_challenge_cell(self): for cell_bytes, (challenge, methods, unused, link_protocol) in AUTH_CHALLENGE_CELLS.items(): if not unused.strip(ZERO): self.assertEqual(cell_bytes, AuthChallengeCell(methods, challenge).pack(link_protocol)) else: self.assertEqual(cell_bytes, AuthChallengeCell(methods, challenge, unused = unused).pack(link_protocol)) cell = Cell.pop(cell_bytes, link_protocol)[0] self.assertEqual(challenge, cell.challenge) self.assertEqual(methods, cell.methods) self.assertEqual(unused, cell.unused) self.assertEqual(cell_bytes, cell.pack(link_protocol)) self.assertRaisesWith(ValueError, 'AUTH_CHALLENGE cell should have a payload of 38 bytes, but only had 16', Cell.pop, b'\x00\x00\x82\x00&' + CHALLENGE[:10] + b'\x00\x02\x00\x01\x00\x03', 2) self.assertRaisesWith(ValueError, 'AUTH_CHALLENGE should have 3 methods, but only had 4 bytes for it', Cell.pop, b'\x00\x00\x82\x00&' + CHALLENGE + b'\x00\x03\x00\x01\x00\x03', 2) stem-1.7.1/test/unit/client/kdf.py0000664000175000017500000000273113341474573017562 0ustar atagaratagar00000000000000""" Unit tests for stem.client.datatype.KDF. """ import unittest from stem.client.datatype import KDF KEY_1 = b'\xec\xec.\xeb7R\xf2\n\xcb\xce\x97\xf4\x86\x82\x19#\x10\x0f\x08\xf0\xa2Z\xdeJ\x8f2\x8cc\xf6\xfa\x0e\t\x83f\xc5\xe2\xb3\x94\xa8\x13' KEY_2 = b'\xe0v\xe4\xfaTB\x91\x1c\x81Gz\xa0\tI\xcb{\xc56\xcfV\xc2\xa0\x19\x9c\x98\x9a\x06\x0e\xc5\xfa\xb0z\x83\xa6\x10\xf6r" notice stdout\x1b[0m \x1b[34;1maddress\x1b[0m\x1b[34m => \x1b[0m """ FINGERPRINT = '9695DFC35FFEB861329B9F1AB04C46397020CE31' class TestInterpreterCommands(unittest.TestCase): def test_get_fingerprint_for_ourselves(self): controller = Mock() controller.get_info.side_effect = lambda arg: { 'fingerprint': FINGERPRINT, }[arg] self.assertEqual(FINGERPRINT, _get_fingerprint('', controller)) controller.get_info.side_effect = stem.ControllerError self.assertRaises(ValueError, _get_fingerprint, '', controller) def test_get_fingerprint_for_fingerprint(self): self.assertEqual(FINGERPRINT, _get_fingerprint(FINGERPRINT, Mock())) def test_get_fingerprint_for_nickname(self): controller, descriptor = Mock(), Mock() descriptor.fingerprint = FINGERPRINT controller.get_network_status.side_effect = lambda arg: { 'moria1': descriptor, }[arg] self.assertEqual(FINGERPRINT, _get_fingerprint('moria1', controller)) controller.get_network_status.side_effect = stem.ControllerError self.assertRaises(ValueError, _get_fingerprint, 'moria1', controller) def test_get_fingerprint_for_address(self): controller = Mock() self.assertRaises(ValueError, _get_fingerprint, '127.0.0.1:-1', controller) self.assertRaises(ValueError, _get_fingerprint, '127.0.0.901:80', controller) descriptor = Mock() descriptor.address = '127.0.0.1' descriptor.or_port = 80 descriptor.fingerprint = FINGERPRINT controller.get_network_statuses.return_value = [descriptor] self.assertEqual(FINGERPRINT, _get_fingerprint('127.0.0.1', controller)) self.assertEqual(FINGERPRINT, _get_fingerprint('127.0.0.1:80', controller)) self.assertRaises(ValueError, _get_fingerprint, '127.0.0.1:81', controller) self.assertRaises(ValueError, _get_fingerprint, '127.0.0.2', controller) def test_get_fingerprint_for_unrecognized_inputs(self): self.assertRaises(ValueError, _get_fingerprint, 'blarg!', Mock()) def test_when_disconnected(self): controller = Mock() controller.msg.side_effect = stem.SocketClosed('kaboom!') interpreter = ControlInterpreter(controller) # we should be able to run non-tor commands self.assertTrue('Interpreter commands include:' in interpreter.run_command('/help')) # ... but tor commands should provide exceptions self.assertRaises(stem.SocketClosed, interpreter.run_command, 'GETINFO version') def test_quit(self): interpreter = ControlInterpreter(CONTROLLER) self.assertRaises(stem.SocketClosed, interpreter.run_command, '/quit') self.assertRaises(stem.SocketClosed, interpreter.run_command, 'QUIT') def test_help(self): interpreter = ControlInterpreter(CONTROLLER) self.assertTrue('Interpreter commands include:' in interpreter.run_command('/help')) self.assertTrue('Queries the tor process for information.' in interpreter.run_command('/help GETINFO')) self.assertTrue('Queries the tor process for information.' in interpreter.run_command('/help GETINFO version')) def test_events(self): interpreter = ControlInterpreter(CONTROLLER) # no received events self.assertEqual('', interpreter.run_command('/events')) # with enqueued events event_contents = ( '650 BW 15 25', '650 BW 758 570', '650 DEBUG connection_edge_process_relay_cell(): Got an extended cell! Yay.', ) for content in event_contents: event = ControlMessage.from_str(content, 'EVENT', normalize = True) interpreter._received_events.append(event) self.assertEqual(EXPECTED_EVENTS_RESPONSE, interpreter.run_command('/events')) @patch('stem.descriptor.remote.DescriptorDownloader') @patch('socket.gethostbyaddr', Mock(return_value = ['moria.csail.mit.edu'])) def test_info(self, downloader_mock): controller, server_desc, ns_desc = Mock(), Mock(), Mock() controller.get_microdescriptor.return_value = None controller.get_server_descriptor.return_value = server_desc controller.get_network_status.return_value = ns_desc downloader_mock().get_server_descriptors.return_value = [server_desc] controller.get_info.side_effect = lambda arg, _: { 'ip-to-country/128.31.0.34': 'us', }[arg] ns_desc.address = '128.31.0.34' ns_desc.or_port = 9101 ns_desc.published = datetime.datetime(2014, 5, 5, 5, 52, 5) ns_desc.nickname = 'moria1' ns_desc.flags = ['Authority', 'Fast', 'Guard', 'HSDir', 'Named', 'Running', 'Stable', 'V2Dir', 'Valid'] server_desc.exit_policy = 'reject *:*' server_desc.platform = 'Linux' server_desc.tor_version = stem.version.Version('0.2.5.4-alpha-dev') server_desc.contact = '1024D/28988BF5 arma mit edu' interpreter = ControlInterpreter(controller) self.assertTrue(interpreter.run_command('/info ' + FINGERPRINT).startswith(EXPECTED_INFO_RESPONSE)) def test_unrecognized_interpreter_command(self): interpreter = ControlInterpreter(CONTROLLER) expected = "\x1b[1;31m'/unrecognized' isn't a recognized command\x1b[0m\n" self.assertEqual(expected, interpreter.run_command('/unrecognized')) def test_getinfo(self): controller = Mock() controller.msg.return_value = ControlMessage.from_str('250-version=0.2.5.1-alpha-dev (git-245ecfff36c0cecc)\r\n250 OK\r\n') interpreter = ControlInterpreter(controller) self.assertEqual('\x1b[34m250-version=0.2.5.1-alpha-dev (git-245ecfff36c0cecc)\r\x1b[0m\n\x1b[34m250 OK\x1b[0m\n', interpreter.run_command('GETINFO version')) self.assertEqual('\x1b[34m250-version=0.2.5.1-alpha-dev (git-245ecfff36c0cecc)\r\x1b[0m\n\x1b[34m250 OK\x1b[0m\n', interpreter.run_command('GETINFO version')) controller.msg.assert_called_with('GETINFO version') controller.msg.side_effect = stem.ControllerError('kaboom!') self.assertEqual('\x1b[1;31mkaboom!\x1b[0m\n', interpreter.run_command('getinfo process/user')) def test_getconf(self): controller = Mock() controller.msg.return_value = ControlMessage.from_str('250-Log=notice stdout\r\n250 Address\r\n') interpreter = ControlInterpreter(controller) self.assertEqual('\x1b[34m250-Log=notice stdout\r\x1b[0m\n\x1b[34m250 Address\x1b[0m\n', interpreter.run_command('GETCONF log address')) controller.msg.assert_called_with('GETCONF log address') def test_setevents(self): controller = Mock() controller.msg.return_value = ControlMessage.from_str('250 OK\r\n') interpreter = ControlInterpreter(controller) self.assertEqual('\x1b[34m250 OK\x1b[0m\n', interpreter.run_command('SETEVENTS BW')) stem-1.7.1/test/unit/interpreter/__init__.py0000664000175000017500000000143213237375570021640 0ustar atagaratagar00000000000000""" Unit tests for the stem's interpreter prompt. """ __all__ = [ 'arguments', 'autocomplete', 'commands', 'help', ] try: # added in python 3.3 from unittest.mock import Mock except ImportError: from mock import Mock GETINFO_NAMES = """ info/names -- List of GETINFO options, types, and documentation. ip-to-country/* -- Perform a GEOIP lookup md/id/* -- Microdescriptors by ID """.strip() GETCONF_NAMES = """ ExitNodes RouterList ExitPolicy LineList ExitPolicyRejectPrivate Boolean """.strip() CONTROLLER = Mock() CONTROLLER.get_info.side_effect = lambda arg, _: { 'info/names': GETINFO_NAMES, 'config/names': GETCONF_NAMES, 'events/names': 'BW DEBUG INFO NOTICE', 'features/names': 'VERBOSE_NAMES EXTENDED_EVENTS', 'signal/names': 'RELOAD HUP SHUTDOWN', }[arg] stem-1.7.1/test/unit/interpreter/autocomplete.py0000664000175000017500000000634613237375570022613 0ustar atagaratagar00000000000000import unittest from stem.interpreter.autocomplete import _get_commands, Autocompleter from test.unit.interpreter import CONTROLLER try: # added in python 3.3 from unittest.mock import Mock except ImportError: from mock import Mock class TestAutocompletion(unittest.TestCase): def test_autocomplete_results_from_config(self): """ Check that we load autocompletion results from our configuration. """ commands = _get_commands(None) self.assertTrue('PROTOCOLINFO' in commands) self.assertTrue('/quit' in commands) def test_autocomplete_results_from_tor(self): """ Check our ability to determine autocompletion results based on our tor instance's capabilities. """ # Check that when GETINFO requests fail we have base commands, but nothing # with arguments. controller = Mock() controller.get_info.return_value = None commands = _get_commands(controller) self.assertTrue('GETINFO ' in commands) self.assertTrue('GETCONF ' in commands) self.assertTrue('SIGNAL ' in commands) self.assertFalse('GETINFO info/names' in commands) self.assertFalse('GETCONF ExitPolicy' in commands) self.assertFalse('SIGNAL SHUTDOWN' in commands) # Now check where we should be able to determine tor's capabilities. commands = _get_commands(CONTROLLER) expected = ( 'GETINFO info/names', 'GETINFO ip-to-country/', 'GETINFO md/id/', 'GETCONF ExitNodes', 'GETCONF ExitPolicy', 'SETCONF ExitPolicy', 'RESETCONF ExitPolicy', 'SETEVENTS BW', 'SETEVENTS INFO', 'USEFEATURE VERBOSE_NAMES', 'USEFEATURE EXTENDED_EVENTS', 'SIGNAL RELOAD', 'SIGNAL SHUTDOWN', ) for result in expected: self.assertTrue(result in commands) # We shouldn't include the base commands since we have results with # their arguments. self.assertFalse('GETINFO ' in commands) self.assertFalse('GETCONF ' in commands) self.assertFalse('SIGNAL ' in commands) def test_autocompleter_match(self): """ Exercise our Autocompleter's match method. """ autocompleter = Autocompleter(None) self.assertEqual(['/help'], autocompleter.matches('/help')) self.assertEqual(['/help'], autocompleter.matches('/hel')) self.assertEqual(['/help'], autocompleter.matches('/he')) self.assertEqual(['/help'], autocompleter.matches('/h')) self.assertEqual(['/help', '/events', '/info', '/quit'], autocompleter.matches('/')) # check case sensitivity self.assertEqual(['/help'], autocompleter.matches('/HELP')) self.assertEqual(['/help'], autocompleter.matches('/HeLp')) # check when we shouldn't have any matches self.assertEqual([], autocompleter.matches('blarg')) def test_autocompleter_complete(self): """ Exercise our Autocompleter's complete method. """ autocompleter = Autocompleter(None) self.assertEqual('/help', autocompleter.complete('/', 0)) self.assertEqual('/events', autocompleter.complete('/', 1)) self.assertEqual('/info', autocompleter.complete('/', 2)) self.assertEqual('/quit', autocompleter.complete('/', 3)) self.assertEqual(None, autocompleter.complete('/', 4)) self.assertEqual(None, autocompleter.complete('blarg', 0)) stem-1.7.1/test/unit/doctest.py0000664000175000017500000000720213411002341017155 0ustar atagaratagar00000000000000""" Tests examples from our documentation. """ from __future__ import absolute_import import doctest import os import unittest import stem.descriptor.router_status_entry import stem.util.connection import stem.util.str_tools import stem.util.system import stem.version import test from stem.response import ControlMessage try: # added in python 3.3 from unittest.mock import Mock, patch except ImportError: from mock import Mock, patch EXPECTED_CIRCUIT_STATUS = """\ 20 EXTENDED $718BCEA286B531757ACAFF93AE04910EA73DE617=KsmoinOK,$649F2D0ACF418F7CFC6539AB2257EB2D5297BAFA=Eskimo BUILD_FLAGS=NEED_CAPACITY PURPOSE=GENERAL TIME_CREATED=2012-12-06T13:51:11.433755 19 BUILT $718BCEA286B531757ACAFF93AE04910EA73DE617=KsmoinOK,$30BAB8EE7606CBD12F3CC269AE976E0153E7A58D=Pascal1,$2765D8A8C4BBA3F89585A9FFE0E8575615880BEB=Anthracite PURPOSE=GENERAL TIME_CREATED=2012-12-06T13:50:56.969938\ """ ADD_ONION_RESPONSE = """\ 250-ServiceID=oekn5sqrvcu4wote 250-ClientAuth=bob:nKwfvVPmTNr2k2pG0pzV4g 250 OK """ class TestDocumentation(unittest.TestCase): def test_examples(self): stem_dir = os.path.join(test.STEM_BASE, 'stem') is_failed = False for path in stem.util.system.files_with_suffix(stem_dir, '.py'): args = {'module_relative': False} test_run = None if path.endswith('/stem/util/conf.py'): with patch('stem.util.conf.get_config') as get_config_mock: config = Mock() config.load.return_value = None get_config_mock.return_value = config test_run = doctest.testfile(path, **args) elif path.endswith('/stem/descriptor/router_status_entry.py'): args['globs'] = { '_base64_to_hex': stem.descriptor.router_status_entry._base64_to_hex, } test_run = doctest.testfile(path, **args) elif path.endswith('/stem/util/connection.py'): args['globs'] = { 'expand_ipv6_address': stem.util.connection.expand_ipv6_address, } test_run = doctest.testfile(path, **args) elif path.endswith('/stem/util/str_tools.py'): args['globs'] = { '_to_camel_case': stem.util.str_tools._to_camel_case, '_split_by_length': stem.util.str_tools._split_by_length, 'crop': stem.util.str_tools.crop, 'size_label': stem.util.str_tools.size_label, 'time_label': stem.util.str_tools.time_label, 'time_labels': stem.util.str_tools.time_labels, 'short_time_label': stem.util.str_tools.short_time_label, 'parse_short_time_label': stem.util.str_tools.parse_short_time_label, } test_run = doctest.testfile(path, **args) elif path.endswith('/stem/response/__init__.py'): pass # the escaped slashes seem to be confusing doctest elif path.endswith('/stem/control.py'): controller = Mock() controller.extend_circuit.side_effect = [19, 20] controller.get_info.side_effect = lambda arg: { 'circuit-status': EXPECTED_CIRCUIT_STATUS, }[arg] response = ControlMessage.from_str(ADD_ONION_RESPONSE, 'ADD_ONION', normalize = True) controller.create_ephemeral_hidden_service.return_value = response args['globs'] = {'controller': controller} test_run = doctest.testfile(path, **args) elif path.endswith('/stem/version.py'): with patch('stem.version.get_system_tor_version', Mock(return_value = stem.version.Version('0.2.1.30'))): test_run = doctest.testfile(path, **args) else: test_run = doctest.testfile(path, **args) if test_run and test_run.failed > 0: is_failed = True if is_failed: self.fail('doctests encountered errors') stem-1.7.1/test/unit/connection/0000775000175000017500000000000013411004021017271 5ustar atagaratagar00000000000000stem-1.7.1/test/unit/connection/connect.py0000664000175000017500000001603613237375570021334 0ustar atagaratagar00000000000000""" Unit tests for the stem.connection.connect function. """ import unittest try: from StringIO import StringIO except ImportError: from io import StringIO try: from mock import Mock, patch except ImportError: from unittest.mock import Mock, patch import stem import stem.connection import stem.socket class TestConnect(unittest.TestCase): @patch('sys.stdout', new_callable = StringIO) @patch('stem.util.system.is_running') @patch('os.path.exists', Mock(return_value = True)) @patch('stem.socket.ControlSocketFile', Mock(side_effect = stem.SocketError('failed'))) @patch('stem.socket.ControlPort', Mock(side_effect = stem.SocketError('failed'))) @patch('stem.connection._connect_auth', Mock()) def test_failue_with_the_default_endpoint(self, is_running_mock, stdout_mock): is_running_mock.return_value = False self._assert_connect_fails_with({}, stdout_mock, "Unable to connect to tor. Are you sure it's running?") is_running_mock.return_value = True self._assert_connect_fails_with({}, stdout_mock, "Unable to connect to tor. Maybe it's running without a ControlPort?") @patch('sys.stdout', new_callable = StringIO) @patch('os.path.exists') @patch('stem.util.system.is_running', Mock(return_value = True)) @patch('stem.socket.ControlSocketFile', Mock(side_effect = stem.SocketError('failed'))) @patch('stem.socket.ControlPort', Mock(side_effect = stem.SocketError('failed'))) @patch('stem.connection._connect_auth', Mock()) def test_failure_with_a_custom_endpoint(self, path_exists_mock, stdout_mock): path_exists_mock.return_value = True self._assert_connect_fails_with({'control_port': ('127.0.0.1', 80), 'control_socket': None}, stdout_mock, "Unable to connect to 127.0.0.1:80: failed") self._assert_connect_fails_with({'control_port': None, 'control_socket': '/tmp/my_socket'}, stdout_mock, "Unable to connect to '/tmp/my_socket': failed") path_exists_mock.return_value = False self._assert_connect_fails_with({'control_port': ('127.0.0.1', 80), 'control_socket': None}, stdout_mock, "Unable to connect to 127.0.0.1:80: failed") self._assert_connect_fails_with({'control_port': None, 'control_socket': '/tmp/my_socket'}, stdout_mock, "The socket file you specified (/tmp/my_socket) doesn't exist") @patch('stem.socket.ControlPort') @patch('os.path.exists', Mock(return_value = False)) @patch('stem.connection._connect_auth', Mock()) def test_getting_a_control_port(self, port_mock): stem.connection.connect() port_mock.assert_called_once_with('127.0.0.1', 9051) port_mock.reset_mock() stem.connection.connect(control_port = ('255.0.0.10', 80), control_socket = None) port_mock.assert_called_once_with('255.0.0.10', 80) @patch('stem.socket.ControlSocketFile') @patch('os.path.exists', Mock(return_value = True)) @patch('stem.connection._connect_auth', Mock()) def test_getting_a_control_socket(self, socket_mock): stem.connection.connect() socket_mock.assert_called_once_with('/var/run/tor/control') socket_mock.reset_mock() stem.connection.connect(control_port = None, control_socket = '/tmp/my_socket') socket_mock.assert_called_once_with('/tmp/my_socket') def _assert_connect_fails_with(self, args, stdout_mock, msg): result = stem.connection.connect(**args) if result is not None: self.fail() # Python 3.x seems to have an oddity where StringIO has prefixed null # characters (\x00) after we call truncate(). This could be addressed # a couple ways... # # * Don't use a stdout mock more than once. # * Strip the null characters. # # Opting for the second (which is admittedly a hack) so the tests are a # little nicer. stdout_output = stdout_mock.getvalue() stdout_mock.truncate(0) self.assertEqual(msg, stdout_output.strip().lstrip('\x00')) @patch('stem.connection.authenticate') def test_auth_success(self, authenticate_mock): control_socket = Mock() stem.connection._connect_auth(control_socket, None, False, None, None) authenticate_mock.assert_called_with(control_socket, None, None) authenticate_mock.reset_mock() stem.connection._connect_auth(control_socket, 's3krit!!!', False, '/my/chroot', None) authenticate_mock.assert_called_with(control_socket, 's3krit!!!', '/my/chroot') @patch('getpass.getpass') @patch('stem.connection.authenticate') def test_auth_success_with_password_prompt(self, authenticate_mock, getpass_mock): control_socket = Mock() def authenticate_mock_func(controller, password, *args): if password is None: raise stem.connection.MissingPassword('no password') elif password == 'my_password': return None # success else: raise ValueError('Unexpected authenticate_mock input: %s' % password) authenticate_mock.side_effect = authenticate_mock_func getpass_mock.return_value = 'my_password' stem.connection._connect_auth(control_socket, None, True, None, None) authenticate_mock.assert_any_call(control_socket, None, None) authenticate_mock.assert_any_call(control_socket, 'my_password', None) @patch('sys.stdout', new_callable = StringIO) @patch('stem.connection.authenticate') def test_auth_failure(self, authenticate_mock, stdout_mock): control_socket = stem.socket.ControlPort(connect = False) authenticate_mock.side_effect = stem.connection.IncorrectSocketType('unable to connect to socket') self._assert_authenticate_fails_with(control_socket, stdout_mock, 'Please check in your torrc that 9051 is the ControlPort.') control_socket = stem.socket.ControlSocketFile(connect = False) self._assert_authenticate_fails_with(control_socket, stdout_mock, 'Are you sure the interface you specified belongs to') authenticate_mock.side_effect = stem.connection.UnrecognizedAuthMethods('unable to connect', ['telepathy']) self._assert_authenticate_fails_with(control_socket, stdout_mock, 'Tor is using a type of authentication we do not recognize...\n\n telepathy') authenticate_mock.side_effect = stem.connection.IncorrectPassword('password rejected') self._assert_authenticate_fails_with(control_socket, stdout_mock, 'Incorrect password') authenticate_mock.side_effect = stem.connection.UnreadableCookieFile('permission denied', '/tmp/my_cookie', False) self._assert_authenticate_fails_with(control_socket, stdout_mock, "We were unable to read tor's authentication cookie...\n\n Path: /tmp/my_cookie\n Issue: permission denied") authenticate_mock.side_effect = stem.connection.OpenAuthRejected('crazy failure') self._assert_authenticate_fails_with(control_socket, stdout_mock, 'Unable to authenticate: crazy failure') def _assert_authenticate_fails_with(self, control_socket, stdout_mock, msg): result = stem.connection._connect_auth(control_socket, None, False, None, None) if result is not None: self.fail() # _connect_auth() was successful stdout_output = stdout_mock.getvalue() stdout_mock.truncate(0) if msg not in stdout_output: self.fail("Expected...\n\n%s\n\n... which couldn't be found in...\n\n%s" % (msg, stdout_output)) stem-1.7.1/test/unit/connection/authentication.py0000664000175000017500000001407713237375570022725 0ustar atagaratagar00000000000000""" Unit tests for the stem.connection.authenticate function. Under the covers the authentiate function really just translates a PROTOCOLINFO response into authenticate_* calls, then does prioritization on the exceptions if they all fail. This monkey patches the various functions authenticate relies on to exercise various error conditions, and make sure that the right exception is raised. """ import unittest import stem.connection import test from stem.response import ControlMessage from stem.util import log try: # added in python 3.3 from unittest.mock import Mock, patch except ImportError: from mock import Mock, patch class TestAuthenticate(unittest.TestCase): @patch('stem.connection.get_protocolinfo') @patch('stem.connection.authenticate_none', Mock()) def test_with_get_protocolinfo(self, get_protocolinfo_mock): """ Tests the authenticate() function when it needs to make a get_protocolinfo. """ # tests where get_protocolinfo succeeds protocolinfo_message = ControlMessage.from_str('250-PROTOCOLINFO 1\r\n250 OK\r\n', 'PROTOCOLINFO') protocolinfo_message.auth_methods = (stem.connection.AuthMethod.NONE, ) get_protocolinfo_mock.return_value = protocolinfo_message stem.connection.authenticate(None) # tests where get_protocolinfo raises an exception get_protocolinfo_mock.side_effect = stem.ProtocolError self.assertRaises(stem.connection.IncorrectSocketType, stem.connection.authenticate, None) get_protocolinfo_mock.side_effect = stem.SocketError self.assertRaises(stem.connection.AuthenticationFailure, stem.connection.authenticate, None) @patch('stem.connection.authenticate_none') @patch('stem.connection.authenticate_password') @patch('stem.connection.authenticate_cookie') @patch('stem.connection.authenticate_safecookie') def test_all_use_cases(self, authenticate_safecookie_mock, authenticate_cookie_mock, authenticate_password_mock, authenticate_none_mock): """ Does basic validation that all valid use cases for the PROTOCOLINFO input and dependent functions result in either success or a AuthenticationFailed subclass being raised. """ # mute the logger for this test since otherwise the output is overwhelming stem_logger = log.get_logger() stem_logger.setLevel(log.logging_level(None)) # exceptions that the authentication functions are documented to raise all_auth_none_exc = ( None, stem.connection.OpenAuthRejected(None), stem.ControllerError(None)) all_auth_password_exc = ( None, stem.connection.PasswordAuthRejected(None), stem.connection.IncorrectPassword(None), stem.ControllerError(None)) all_auth_cookie_exc = ( None, stem.connection.CookieAuthRejected(None, False, None), stem.connection.IncorrectCookieValue(None, False, None), stem.connection.IncorrectCookieSize(None, False, None), stem.connection.UnreadableCookieFile(None, False, None), stem.connection.AuthChallengeFailed(None, None), stem.ControllerError(None)) auth_method_combinations = test.get_all_combinations([ stem.connection.AuthMethod.NONE, stem.connection.AuthMethod.PASSWORD, stem.connection.AuthMethod.COOKIE, stem.connection.AuthMethod.SAFECOOKIE, stem.connection.AuthMethod.UNKNOWN, ], include_empty = True) protocolinfo = ControlMessage.from_str('250-PROTOCOLINFO 1\r\n250 OK\r\n', 'PROTOCOLINFO') protocolinfo.cookie_path = '/tmp/blah' for auth_methods in auth_method_combinations: for auth_none_exc in all_auth_none_exc: for auth_password_exc in all_auth_password_exc: for auth_cookie_exc in all_auth_cookie_exc: # Skip iteration if it's to test exceptions for authentication # we're not using. if auth_none_exc and stem.connection.AuthMethod.NONE not in auth_methods: continue elif auth_password_exc and stem.connection.AuthMethod.PASSWORD not in auth_methods: continue elif auth_cookie_exc and stem.connection.AuthMethod.COOKIE not in auth_methods and stem.connection.AuthMethod.SAFECOOKIE not in auth_methods: continue # Determine if the authenticate() call will succeed and mock each # of the authenticate_* function to raise its given exception. # # This implementation is slightly inaccurate in a couple regards... # a. it raises safecookie exceptions from authenticate_cookie() # b. exceptions raised by authenticate_cookie() and # authenticate_safecookie() are always the same # # However, adding another loop for safe_cookie exceptions means # multiplying our runtime many fold. This exercises everything that # matters so the above inaccuracies seem fine. expect_success = False protocolinfo.auth_methods = auth_methods for auth_method in auth_methods: if auth_method == stem.connection.AuthMethod.NONE: auth_mock, raised_exc = authenticate_none_mock, auth_none_exc elif auth_method == stem.connection.AuthMethod.PASSWORD: auth_mock, raised_exc = authenticate_password_mock, auth_password_exc elif auth_method == stem.connection.AuthMethod.COOKIE: auth_mock, raised_exc = authenticate_cookie_mock, auth_cookie_exc elif auth_method == stem.connection.AuthMethod.SAFECOOKIE: auth_mock, raised_exc = authenticate_safecookie_mock, auth_cookie_exc if raised_exc: auth_mock.side_effect = raised_exc else: auth_mock.side_effect = None expect_success = True if expect_success: stem.connection.authenticate(None, 'blah', None, protocolinfo) else: self.assertRaises(stem.connection.AuthenticationFailure, stem.connection.authenticate, None, 'blah', None, protocolinfo) # revert logging back to normal stem_logger.setLevel(log.logging_level(log.TRACE)) stem-1.7.1/test/unit/connection/__init__.py0000664000175000017500000000012113237375570021426 0ustar atagaratagar00000000000000""" Unit tests for stem.connection. """ __all__ = ['authentication', 'connect'] stem-1.7.1/test/unit/tor_man_example0000664000175000017500000002111313157571677020266 0ustar atagaratagar00000000000000'\" t .\" Title: tor .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 11/29/2015 .\" Manual: Tor Manual .\" Source: Tor .\" Language: English .\" .TH "TOR" "1" "11/29/2015" "Tor" "Tor Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" tor \- The second\-generation onion router .SH "SYNOPSIS" .sp \fBtor\fR [\fIOPTION\fR \fIvalue\fR]\&... .SH "DESCRIPTION" .sp Tor is a connection\-oriented anonymizing communication service\&. Users choose a source\-routed path through a set of nodes, and negotiate a "virtual circuit" through the network, in which each node knows its predecessor and successor, but no others\&. Traffic flowing down the circuit is unwrapped by a symmetric key at each node, which reveals the downstream node\&. .SH "COMMAND-LINE OPTIONS" .PP \fB\-h\fR, \fB\-help\fR .RS 4 Display a short help message and exit\&. .RE .PP \fB\-f\fR \fIFILE\fR .RS 4 Specify a new configuration file to contain further Tor configuration options OR pass \fB\-\fR to make Tor read its configuration from standard input\&. (Default: @CONFDIR@/torrc, or $HOME/\&.torrc if that file is not found) .RE .PP \fB\-\-allow\-missing\-torrc\fR .RS 4 Do not require that configuration file specified by \fB\-f\fR exist if default torrc can be accessed\&. .RE .PP .sp Options on the command line override those in configuration files\&. See the next section for more information\&. .SH "THE CONFIGURATION FILE FORMAT" .sp All configuration options in a configuration are written on a single line by default\&. They take the form of an option name and a value, or an option name and a quoted value (option value or option "value")\&. Anything after a # character is treated as a comment\&. Options are case\-insensitive\&. C\-style escaped characters are allowed inside quoted values\&. To split one configuration entry into multiple lines, use a single backslash character (\e) before the end of the line\&. Comments can be used in such multiline entries, but they must start at the beginning of a line\&. .sp By default, an option on the command line overrides an option found in the configuration file, and an option in a configuration file overrides one in the defaults file\&. .SH "GENERAL OPTIONS" .PP \fBBandwidthRate\fR \fIN\fR \fBbytes\fR|\fBKBytes\fR|\fBMBytes\fR|\fBGBytes\fR|\fBKBits\fR|\fBMBits\fR|\fBGBits\fR .RS 4 A token bucket limits the average incoming bandwidth usage on this node to the specified number of bytes per second, and the average outgoing bandwidth usage to that same value\&. If you want to run a relay in the public network, this needs to be \fIat the very least\fR 75 KBytes for a relay (that is, 600 kbits) or 50 KBytes for a bridge (400 kbits) \(em but of course, more is better; we recommend at least 250 KBytes (2 mbits) if possible\&. (Default: 1 GByte) With this option, and in other options that take arguments in bytes, KBytes, and so on, other formats are also supported\&. Notably, "KBytes" can also be written as "kilobytes" or "kb"; "MBytes" can be written as "megabytes" or "MB"; "kbits" can be written as "kilobits"; and so forth\&. Tor also accepts "byte" and "bit" in the singular\&. The prefixes "tera" and "T" are also recognized\&. If no units are given, we default to bytes\&. To avoid confusion, we recommend writing "bytes" or "bits" explicitly, since it\(cqs easy to forget that "B" means bytes, not bits\&. .RE .PP \fBBandwidthBurst\fR \fIN\fR \fBbytes\fR|\fBKBytes\fR|\fBMBytes\fR|\fBGBytes\fR|\fBKBits\fR|\fBMBits\fR|\fBGBits\fR .RS 4 Limit the maximum token bucket size (also known as the burst) to the given number of bytes in each direction\&. (Default: 1 GByte) .RE .PP \fBMaxAdvertisedBandwidth\fR \fIN\fR \fBbytes\fR|\fBKBytes\fR|\fBMBytes\fR|\fBGBytes\fR|\fBKBits\fR|\fBMBits\fR|\fBGBits\fR .RS 4 If set, we will not advertise more than this amount of bandwidth for our BandwidthRate\&. Server operators who want to reduce the number of clients who ask to build circuits through them (since this is proportional to advertised bandwidth rate) can thus reduce the CPU demands on their server without impacting network performance\&. .RE .SH "CLIENT OPTIONS" .sp The following options are useful only for clients (that is, if \fBSocksPort\fR, \fBTransPort\fR, \fBDNSPort\fR, or \fBNATDPort\fR is non\-zero): .PP \fBBridge\fR [\fItransport\fR] \fIIP\fR:\fIORPort\fR [\fIfingerprint\fR] .RS 4 When set along with UseBridges, instructs Tor to use the relay at "IP:ORPort" as a "bridge" relaying into the Tor network\&. If "fingerprint" is provided (using the same format as for DirAuthority), we will verify that the relay running at that location has the right fingerprint\&. We also use fingerprint to look up the bridge descriptor at the bridge authority, if it\(cqs provided and if UpdateBridgesFromAuthority is set too\&. If "transport" is provided, and matches to a ClientTransportPlugin line, we use that pluggable transports proxy to transfer data to the bridge\&. .RE .SH "SIGNALS" .sp Tor catches the following signals: .PP \fBSIGTERM\fR .RS 4 Tor will catch this, clean up and sync to disk if necessary, and exit\&. .RE .PP \fBSIGINT\fR .RS 4 Tor clients behave as with SIGTERM; but Tor servers will do a controlled slow shutdown, closing listeners and waiting 30 seconds before exiting\&. (The delay can be configured with the ShutdownWaitLength config option\&.) .RE .PP \fBSIGHUP\fR .RS 4 The signal instructs Tor to reload its configuration (including closing and reopening logs), and kill and restart its helper processes if applicable\&. .RE .SH "FILES" .PP \fB@CONFDIR@/torrc\fR .RS 4 The configuration file, which contains "option value" pairs\&. .RE .PP \fB$HOME/\&.torrc\fR .RS 4 Fallback location for torrc, if @CONFDIR@/torrc is not found\&. .RE .PP \fB@LOCALSTATEDIR@/lib/tor/\fR .RS 4 The tor process stores keys and other data here\&. .RE .PP \fIDataDirectory\fR\fB/cached\-status/\fR .RS 4 The most recently downloaded network status document for each authority\&. Each file holds one such document; the filenames are the hexadecimal identity key fingerprints of the directory authorities\&. Mostly obsolete\&. .RE .PP \fIDataDirectory\fR\fB/cached\-certs\fR .RS 4 This file holds downloaded directory key certificates that are used to verify authenticity of documents generated by Tor directory authorities\&. .RE .PP \fIDataDirectory\fR\fB/state\fR .RS 4 A set of persistent key\-value mappings\&. These are documented in the file\&. These include: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} The current entry guards and their status\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} The current bandwidth accounting values (unused so far; see below)\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} When the file was last written .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} What version of Tor generated the state file .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} A short history of bandwidth usage, as produced in the server descriptors\&. .RE .RE .PP \fIDataDirectory\fR\fB/bw_accounting\fR .RS 4 Used to track bandwidth accounting values (when the current period starts and ends; how much has been read and written so far this period)\&. This file is obsolete, and the data is now stored in the \*(Aqstate\*(Aq file as well\&. Only used when bandwidth accounting is enabled\&. .RE .SH "SEE ALSO" .sp \fBtorsocks\fR(1), \fBtorify\fR(1) .sp \fBhttps://www\&.torproject\&.org/\fR .sp \fBtorspec: \fR\fBhttps://spec\&.torproject\&.org\fR\fB \fR .SH "BUGS" .sp Plenty, probably\&. Tor is still in development\&. Please report them at https://trac\&.torproject\&.org/\&. .SH "AUTHORS" .sp Roger Dingledine [arma at mit\&.edu], Nick Mathewson [nickm at alum\&.mit\&.edu]\&. stem-1.7.1/test/unit/response/0000775000175000017500000000000013411004021016770 5ustar atagaratagar00000000000000stem-1.7.1/test/unit/response/add_onion.py0000664000175000017500000001014313237375570021325 0ustar atagaratagar00000000000000""" Unit tests for the stem.response.add_onion.AddOnionResponse class. """ import unittest import stem import stem.response import stem.response.add_onion from stem.response import ControlMessage WITH_PRIVATE_KEY = """250-ServiceID=gfzprpioee3hoppz 250-PrivateKey=RSA1024:MIICXgIBAAKBgQDZvYVxvKPTWhId/8Ss9fVxjAoFDsrJ3pk6HjHrEFRm3ypkK/vArbG9BrupzzYcyms+lO06O8b/iOSHuZI5mUEGkrYqQ+hpB2SkPUEzW7vcp8SQQivna3+LfkWH4JDqfiwZutU6MMEvU6g1OqK4Hll6uHbLpsfxkS/mGjyu1C9a9wIDAQABAoGBAJxsC3a25xZJqaRFfxwmIiptSTFy+/nj4T4gPQo6k/fHMKP/+P7liT9bm+uUwbITNNIjmPzxvrcKt+pNRR/92fizxr8QXr8l0ciVOLerbvdqvVUaQ/K1IVsblOLbactMvXcHactmqqLFUaZU9PPSDla7YkzikLDIUtHXQBEt4HEhAkEA/c4n+kpwi4odCaF49ESPbZC/Qejh7U9Tq10vAHzfrrGgQjnLw2UGDxJQXc9P12fGTvD2q3Q3VaMI8TKKFqZXsQJBANufh1zfP+xX/UfxJ4QzDUCHCu2gnyTDj3nG9Bc80E5g7NwR2VBXF1R+QQCK9GZcXd2y6vBYgrHOSUiLbVjGrycCQQDpOcs0zbjUEUuTsQUT+fiO50dJSrZpus6ZFxz85sMppeItWSzsVeYWbW7adYnZ2Gu72OPjM/0xPYsXEakhHSRRAkAxlVauNQjthv/72god4pi/VL224GiNmEkwKSa6iFRPHbrcBHuXk9IElWx/ft+mrHvUraw1DwaStgv9gNzzCghJAkEA08RegCRnIzuGvgeejLk4suIeCMD/11AvmSvxbRWS5rq1leSVo7uGLSnqDbwlzE4dGb5kH15NNAp14/l2Fu/yZg== 250 OK""" WITH_CLIENT_AUTH = """250-ServiceID=oekn5sqrvcu4wote 250-ClientAuth=bob:lhwLVFt0Kd5/0Gy9DkKoyA 250-ClientAuth=alice:T9UADxtrvqx2HnLKWp/fWQ 250 OK """ WITHOUT_PRIVATE_KEY = """250-ServiceID=gfzprpioee3hoppz 250 OK""" WRONG_FIRST_KEY = """250-MyKey=gfzprpioee3hoppz 250-ServiceID=gfzprpioee3hoppz 250 OK""" MISSING_KEY_TYPE = """250-ServiceID=gfzprpioee3hoppz 250-PrivateKey=MIICXgIBAAKBgQDZvYVxvKPTWhId/8Ss9fVxj 250 OK""" class TestAddOnionResponse(unittest.TestCase): def test_convert(self): """ Exercises functionality of the convert method both when it works and there's an error. """ # working case response = ControlMessage.from_str(WITH_PRIVATE_KEY, 'ADD_ONION', normalize = True) # now this should be a AddOnionResponse (ControlMessage subclass) self.assertTrue(isinstance(response, stem.response.ControlMessage)) self.assertTrue(isinstance(response, stem.response.add_onion.AddOnionResponse)) # exercise some of the ControlMessage functionality raw_content = (WITH_PRIVATE_KEY + '\n').replace('\n', '\r\n') self.assertEqual(raw_content, response.raw_content()) self.assertTrue(str(response).startswith('ServiceID=')) def test_with_private_key(self): """ Checks a response when there's a private key. """ response = ControlMessage.from_str(WITH_PRIVATE_KEY, 'ADD_ONION', normalize = True) self.assertEqual('gfzprpioee3hoppz', response.service_id) self.assertTrue(response.private_key.startswith('MIICXgIBAAKB')) self.assertEqual('RSA1024', response.private_key_type) self.assertEqual({}, response.client_auth) def test_with_client_auth(self): """ Checks a response when there's client credentials. """ response = ControlMessage.from_str(WITH_CLIENT_AUTH, 'ADD_ONION', normalize = True) self.assertEqual('oekn5sqrvcu4wote', response.service_id) self.assertEqual(None, response.private_key) self.assertEqual(None, response.private_key_type) self.assertEqual({'bob': 'lhwLVFt0Kd5/0Gy9DkKoyA', 'alice': 'T9UADxtrvqx2HnLKWp/fWQ'}, response.client_auth) def test_without_private_key(self): """ Checks a response without a private key. """ response = ControlMessage.from_str(WITHOUT_PRIVATE_KEY, 'ADD_ONION', normalize = True) self.assertEqual('gfzprpioee3hoppz', response.service_id) self.assertEqual(None, response.private_key) self.assertEqual(None, response.private_key_type) def test_without_service_id(self): """ Checks a response that lack an initial service id. """ response = ControlMessage.from_str(WRONG_FIRST_KEY, normalize = True) self.assertRaisesRegexp(stem.ProtocolError, 'ADD_ONION response should start with', stem.response.convert, 'ADD_ONION', response) def test_no_key_type(self): """ Checks a response that's missing the private key type. """ response = ControlMessage.from_str(MISSING_KEY_TYPE, normalize = True) self.assertRaisesRegexp(stem.ProtocolError, 'ADD_ONION PrivateKey lines should be of the form', stem.response.convert, 'ADD_ONION', response) stem-1.7.1/test/unit/response/singleline.py0000664000175000017500000000150313237375570021524 0ustar atagaratagar00000000000000""" Unit tests for the stem.response.SingleLineResponse class. """ import unittest import stem from stem.response import ControlMessage class TestSingleLineResponse(unittest.TestCase): def test_single_line_response(self): message = ControlMessage.from_str('552 NOTOK\r\n', 'SINGLELINE') self.assertEqual(False, message.is_ok()) message = ControlMessage.from_str('250 KK\r\n', 'SINGLELINE') self.assertEqual(True, message.is_ok()) message = ControlMessage.from_str('250 OK\r\n', 'SINGLELINE') self.assertEqual(True, message.is_ok(True)) message = ControlMessage.from_str('250 HMM\r\n', 'SINGLELINE') self.assertEqual(False, message.is_ok(True)) def test_multi_line_response(self): self.assertRaises(stem.ProtocolError, ControlMessage.from_str, '250-MULTI\r\n250 LINE\r\n', 'SINGLELINE') stem-1.7.1/test/unit/response/getinfo.py0000664000175000017500000000745213237375570021037 0ustar atagaratagar00000000000000""" Unit tests for the stem.response.getinfo.GetInfoResponse class. """ import unittest import stem.response import stem.response.getinfo import stem.socket import stem.util.str_tools from stem.response import ControlMessage SINGLE_RESPONSE = """\ 250-version=0.2.3.11-alpha-dev 250 OK""" BATCH_RESPONSE = """\ 250-version=0.2.3.11-alpha-dev 250-address=67.137.76.214 250-fingerprint=5FDE0422045DF0E1879A3738D09099EB4A0C5BA0 250 OK""" MULTILINE_RESPONSE = """\ 250-version=0.2.3.11-alpha-dev (git-ef0bc7f8f26a917c) 250+config-text= ControlPort 9051 DataDirectory /home/atagar/.tor ExitPolicy reject *:* Log notice stdout Nickname Unnamed ORPort 9050 . 250 OK""" NON_KEY_VALUE_ENTRY = """\ 250-version=0.2.3.11-alpha-dev 250-address 67.137.76.214 250 OK""" UNRECOGNIZED_KEY_ENTRY = """\ 552 Unrecognized key "blackhole" """ MISSING_MULTILINE_NEWLINE = """\ 250+config-text=ControlPort 9051 DataDirectory /home/atagar/.tor . 250 OK""" class TestGetInfoResponse(unittest.TestCase): def test_empty_response(self): """ Parses a GETINFO reply without options (just calling "GETINFO"). """ control_message = ControlMessage.from_str('250 OK\r\n', 'GETINFO') # now this should be a GetInfoResponse (ControlMessage subclass) self.assertTrue(isinstance(control_message, stem.response.ControlMessage)) self.assertTrue(isinstance(control_message, stem.response.getinfo.GetInfoResponse)) self.assertEqual({}, control_message.entries) def test_single_response(self): """ Parses a GETINFO reply response for a single parameter. """ control_message = ControlMessage.from_str(SINGLE_RESPONSE, 'GETINFO', normalize = True) self.assertEqual({'version': b'0.2.3.11-alpha-dev'}, control_message.entries) def test_batch_response(self): """ Parses a GETINFO reply for muiltiple parameters. """ expected = { 'version': b'0.2.3.11-alpha-dev', 'address': b'67.137.76.214', 'fingerprint': b'5FDE0422045DF0E1879A3738D09099EB4A0C5BA0', } control_message = ControlMessage.from_str(BATCH_RESPONSE, 'GETINFO', normalize = True) self.assertEqual(expected, control_message.entries) def test_multiline_response(self): """ Parses a GETINFO reply for multiple parameters including a multi-line value. """ expected = { 'version': b'0.2.3.11-alpha-dev (git-ef0bc7f8f26a917c)', 'config-text': b'\n'.join(stem.util.str_tools._to_bytes(MULTILINE_RESPONSE).splitlines()[2:8]), } control_message = ControlMessage.from_str(MULTILINE_RESPONSE, 'GETINFO', normalize = True) self.assertEqual(expected, control_message.entries) def test_invalid_non_mapping_content(self): """ Parses a malformed GETINFO reply containing a line that isn't a key=value entry. """ control_message = ControlMessage.from_str(NON_KEY_VALUE_ENTRY, normalize = True) self.assertRaises(stem.ProtocolError, stem.response.convert, 'GETINFO', control_message) def test_unrecognized_key_response(self): """ Parses a GETCONF reply that contains an error code with an unrecognized key. """ try: control_message = ControlMessage.from_str(UNRECOGNIZED_KEY_ENTRY, normalize = True) stem.response.convert('GETINFO', control_message) self.fail('expected a stem.InvalidArguments to be raised') except stem.InvalidArguments as exc: self.assertEqual(exc.arguments, ['blackhole']) def test_invalid_multiline_content(self): """ Parses a malformed GETINFO reply with a multi-line entry missing a newline between its key and value. This is a proper controller message, but malformed according to the GETINFO's spec. """ control_message = ControlMessage.from_str(MISSING_MULTILINE_NEWLINE, normalize = True) self.assertRaises(stem.ProtocolError, stem.response.convert, 'GETINFO', control_message) stem-1.7.1/test/unit/response/getconf.py0000664000175000017500000000630113237375570021021 0ustar atagaratagar00000000000000""" Unit tests for the stem.response.getconf.GetConfResponse class. """ import unittest import stem.response import stem.response.getconf import stem.socket from stem.response import ControlMessage SINGLE_RESPONSE = """\ 250 DataDirectory=/home/neena/.tor""" BATCH_RESPONSE = """\ 250-CookieAuthentication=0 250-ControlPort=9100 250-DataDirectory=/tmp/fake dir 250 DirPort""" MULTIVALUE_RESPONSE = """\ 250-ControlPort=9100 250-ExitPolicy=accept 34.3.4.5 250-ExitPolicy=accept 3.4.53.3 250-ExitPolicy=accept 3.4.53.3 250 ExitPolicy=reject 23.245.54.3""" UNRECOGNIZED_KEY_RESPONSE = '''552-Unrecognized configuration key "brickroad" 552 Unrecognized configuration key "submarine"''' INVALID_RESPONSE = """\ 123-FOO 232 BAR""" class TestGetConfResponse(unittest.TestCase): def test_empty_response(self): """ Parses a GETCONF reply without options (just calling "GETCONF"). """ control_message = ControlMessage.from_str('250 OK\r\n', 'GETCONF') # now this should be a GetConfResponse (ControlMessage subclass) self.assertTrue(isinstance(control_message, stem.response.ControlMessage)) self.assertTrue(isinstance(control_message, stem.response.getconf.GetConfResponse)) self.assertEqual({}, control_message.entries) def test_single_response(self): """ Parses a GETCONF reply response for a single parameter. """ control_message = ControlMessage.from_str(SINGLE_RESPONSE, 'GETCONF', normalize = True) self.assertEqual({'DataDirectory': ['/home/neena/.tor']}, control_message.entries) def test_batch_response(self): """ Parses a GETCONF reply for muiltiple parameters. """ expected = { 'CookieAuthentication': ['0'], 'ControlPort': ['9100'], 'DataDirectory': ['/tmp/fake dir'], 'DirPort': [], } control_message = ControlMessage.from_str(BATCH_RESPONSE, 'GETCONF', normalize = True) self.assertEqual(expected, control_message.entries) def test_multivalue_response(self): """ Parses a GETCONF reply containing a single key with multiple parameters. """ expected = { 'ControlPort': ['9100'], 'ExitPolicy': ['accept 34.3.4.5', 'accept 3.4.53.3', 'accept 3.4.53.3', 'reject 23.245.54.3'] } control_message = ControlMessage.from_str(MULTIVALUE_RESPONSE, 'GETCONF', normalize = True) self.assertEqual(expected, control_message.entries) def test_unrecognized_key_response(self): """ Parses a GETCONF reply that contains an error code with an unrecognized key. """ try: control_message = ControlMessage.from_str(UNRECOGNIZED_KEY_RESPONSE, normalize = True) stem.response.convert('GETCONF', control_message) self.fail('expected a stem.InvalidArguments to be raised') except stem.InvalidArguments as exc: self.assertEqual(exc.arguments, ['brickroad', 'submarine']) def test_invalid_content(self): """ Parses a malformed GETCONF reply that contains an invalid response code. This is a proper controller message, but malformed according to the GETCONF's spec. """ control_message = ControlMessage.from_str(INVALID_RESPONSE, normalize = True) self.assertRaises(stem.ProtocolError, stem.response.convert, 'GETCONF', control_message) stem-1.7.1/test/unit/response/protocolinfo.py0000664000175000017500000001301613237375570022112 0ustar atagaratagar00000000000000""" Unit tests for the stem.response.protocolinfo.ProtocolInfoResponse class. """ import unittest import stem.response import stem.response.protocolinfo import stem.socket import stem.util.proc import stem.util.system import stem.version from stem.response import ControlMessage from stem.response.protocolinfo import AuthMethod try: # added in python 3.3 from unittest.mock import Mock, patch except ImportError: from mock import Mock, patch NO_AUTH = """250-PROTOCOLINFO 1 250-AUTH METHODS=NULL 250-VERSION Tor="0.2.1.30" 250 OK""" PASSWORD_AUTH = """250-PROTOCOLINFO 1 250-AUTH METHODS=HASHEDPASSWORD 250-VERSION Tor="0.2.1.30" 250 OK""" COOKIE_AUTH = r"""250-PROTOCOLINFO 1 250-AUTH METHODS=COOKIE COOKIEFILE="/tmp/my data\\\"dir//control_auth_cookie" 250-VERSION Tor="0.2.1.30" 250 OK""" MULTIPLE_AUTH = """250-PROTOCOLINFO 1 250-AUTH METHODS=COOKIE,HASHEDPASSWORD COOKIEFILE="/home/atagar/.tor/control_auth_cookie" 250-VERSION Tor="0.2.1.30" 250 OK""" UNKNOWN_AUTH = """250-PROTOCOLINFO 1 250-AUTH METHODS=MAGIC,HASHEDPASSWORD,PIXIE_DUST 250-VERSION Tor="0.2.1.30" 250 OK""" MINIMUM_RESPONSE = """250-PROTOCOLINFO 5 250 OK""" UNICODE_COOKIE_PATH = r"""250-PROTOCOLINFO 1 250-AUTH METHODS=COOKIE COOKIEFILE="/home/user/\346\226\207\346\241\243/tor-browser_en-US/Browser/TorBrowser/Data/Tor/control_auth_cookie" 250-VERSION Tor="0.2.1.30" 250 OK""" RELATIVE_COOKIE_PATH = r"""250-PROTOCOLINFO 1 250-AUTH METHODS=COOKIE COOKIEFILE="./tor-browser_en-US/Data/control_auth_cookie" 250-VERSION Tor="0.2.1.30" 250 OK""" EXPECTED_UNICODE_PATH = b"/home/user/\346\226\207\346\241\243/tor-browser_en-US/Browser/TorBrowser/Data/Tor/control_auth_cookie".decode('utf-8') class TestProtocolInfoResponse(unittest.TestCase): def test_convert(self): """ Exercises functionality of the convert method both when it works and there's an error. """ # working case control_message = ControlMessage.from_str(NO_AUTH, 'PROTOCOLINFO', normalize = True) # now this should be a ProtocolInfoResponse (ControlMessage subclass) self.assertTrue(isinstance(control_message, stem.response.ControlMessage)) self.assertTrue(isinstance(control_message, stem.response.protocolinfo.ProtocolInfoResponse)) # exercise some of the ControlMessage functionality raw_content = (NO_AUTH + '\n').replace('\n', '\r\n') self.assertEqual(raw_content, control_message.raw_content()) self.assertTrue(str(control_message).startswith('PROTOCOLINFO 1')) # attempt to convert the wrong type self.assertRaises(TypeError, stem.response.convert, 'PROTOCOLINFO', 'hello world') # attempt to convert a different message type self.assertRaises(stem.ProtocolError, ControlMessage.from_str, '650 BW 32326 2856\r\n', 'PROTOCOLINFO') def test_no_auth(self): """ Checks a response when there's no authentication. """ control_message = ControlMessage.from_str(NO_AUTH, 'PROTOCOLINFO', normalize = True) self.assertEqual(1, control_message.protocol_version) self.assertEqual(stem.version.Version('0.2.1.30'), control_message.tor_version) self.assertEqual((AuthMethod.NONE, ), control_message.auth_methods) self.assertEqual((), control_message.unknown_auth_methods) self.assertEqual(None, control_message.cookie_path) def test_password_auth(self): """ Checks a response with password authentication. """ control_message = ControlMessage.from_str(PASSWORD_AUTH, 'PROTOCOLINFO', normalize = True) self.assertEqual((AuthMethod.PASSWORD, ), control_message.auth_methods) def test_cookie_auth(self): """ Checks a response with cookie authentication and a path including escape characters. """ control_message = ControlMessage.from_str(COOKIE_AUTH, 'PROTOCOLINFO', normalize = True) self.assertEqual((AuthMethod.COOKIE, ), control_message.auth_methods) self.assertEqual('/tmp/my data\\"dir//control_auth_cookie', control_message.cookie_path) def test_multiple_auth(self): """ Checks a response with multiple authentication methods. """ control_message = ControlMessage.from_str(MULTIPLE_AUTH, 'PROTOCOLINFO', normalize = True) self.assertEqual((AuthMethod.COOKIE, AuthMethod.PASSWORD), control_message.auth_methods) self.assertEqual('/home/atagar/.tor/control_auth_cookie', control_message.cookie_path) def test_unknown_auth(self): """ Checks a response with an unrecognized authtentication method. """ control_message = ControlMessage.from_str(UNKNOWN_AUTH, 'PROTOCOLINFO', normalize = True) self.assertEqual((AuthMethod.UNKNOWN, AuthMethod.PASSWORD), control_message.auth_methods) self.assertEqual(('MAGIC', 'PIXIE_DUST'), control_message.unknown_auth_methods) def test_minimum_response(self): """ Checks a PROTOCOLINFO response that only contains the minimum amount of information to be a valid response. """ control_message = ControlMessage.from_str(MINIMUM_RESPONSE, 'PROTOCOLINFO', normalize = True) self.assertEqual(5, control_message.protocol_version) self.assertEqual(None, control_message.tor_version) self.assertEqual((), control_message.auth_methods) self.assertEqual((), control_message.unknown_auth_methods) self.assertEqual(None, control_message.cookie_path) @patch('sys.getfilesystemencoding', Mock(return_value = 'UTF-8')) def test_unicode_cookie(self): """ Checks an authentication cookie with a unicode path. """ control_message = ControlMessage.from_str(UNICODE_COOKIE_PATH, 'PROTOCOLINFO', normalize = True) self.assertEqual(EXPECTED_UNICODE_PATH, control_message.cookie_path) stem-1.7.1/test/unit/response/control_line.py0000664000175000017500000001514513237375570022071 0ustar atagaratagar00000000000000""" Unit tests for the stem.response.ControlLine class. """ import unittest import stem.response # response made by having 'DataDirectory /tmp/my data\"dir/' in the torrc PROTOCOLINFO_RESPONSE = ( 'PROTOCOLINFO 1', 'AUTH METHODS=COOKIE COOKIEFILE="/tmp/my data\\\\\\"dir//control_auth_cookie"', 'VERSION Tor="0.2.1.30"', 'OK', ) class TestControlLine(unittest.TestCase): def test_pop_examples(self): """ Checks that the pop method's pydoc examples are correct. """ line = stem.response.ControlLine("\"We're all mad here.\" says the grinning cat.") self.assertEqual(line.pop(True), "We're all mad here.") self.assertEqual(line.pop(), 'says') self.assertEqual(line.remainder(), 'the grinning cat.') line = stem.response.ControlLine('"this has a \\" and \\\\ in it" foo=bar more_data') self.assertEqual(line.pop(True, True), 'this has a " and \\ in it') def test_string(self): """ Basic checks that we behave as a regular immutable string. """ line = stem.response.ControlLine(PROTOCOLINFO_RESPONSE[0]) self.assertEqual(line, 'PROTOCOLINFO 1') self.assertTrue(line.startswith('PROTOCOLINFO ')) # checks that popping items doesn't effect us line.pop() self.assertEqual(line, 'PROTOCOLINFO 1') self.assertTrue(line.startswith('PROTOCOLINFO ')) def test_general_usage(self): """ Checks a basic use case for the popping entries. """ # pops a series of basic, space separated entries line = stem.response.ControlLine(PROTOCOLINFO_RESPONSE[0]) self.assertEqual(line.remainder(), 'PROTOCOLINFO 1') self.assertFalse(line.is_empty()) self.assertFalse(line.is_next_quoted()) self.assertFalse(line.is_next_mapping()) self.assertEqual(None, line.peek_key()) self.assertRaises(ValueError, line.pop_mapping) self.assertEqual(line.pop(), 'PROTOCOLINFO') self.assertEqual(line.remainder(), '1') self.assertFalse(line.is_empty()) self.assertFalse(line.is_next_quoted()) self.assertFalse(line.is_next_mapping()) self.assertEqual(None, line.peek_key()) self.assertRaises(ValueError, line.pop_mapping) self.assertEqual(line.pop(), '1') self.assertEqual(line.remainder(), '') self.assertTrue(line.is_empty()) self.assertFalse(line.is_next_quoted()) self.assertFalse(line.is_next_mapping()) self.assertEqual(None, line.peek_key()) self.assertRaises(IndexError, line.pop_mapping) self.assertRaises(IndexError, line.pop) self.assertEqual(line.remainder(), '') self.assertTrue(line.is_empty()) self.assertFalse(line.is_next_quoted()) self.assertFalse(line.is_next_mapping()) self.assertEqual(None, line.peek_key()) def test_pop_mapping(self): """ Checks use cases when parsing KEY=VALUE mappings. """ # version entry with a space version_entry = 'Tor="0.2.1.30 (0a083b0188cacd2f07838ff0446113bd5211a024)"' line = stem.response.ControlLine(version_entry) self.assertEqual(line.remainder(), version_entry) self.assertFalse(line.is_empty()) self.assertFalse(line.is_next_quoted()) self.assertTrue(line.is_next_mapping()) self.assertTrue(line.is_next_mapping(key = 'Tor')) self.assertTrue(line.is_next_mapping(key = 'Tor', quoted = True)) self.assertTrue(line.is_next_mapping(quoted = True)) self.assertEqual('Tor', line.peek_key()) # try popping this as a non-quoted mapping self.assertEqual(line.pop_mapping(), ('Tor', '"0.2.1.30')) self.assertEqual(line.remainder(), '(0a083b0188cacd2f07838ff0446113bd5211a024)"') self.assertFalse(line.is_empty()) self.assertFalse(line.is_next_quoted()) self.assertFalse(line.is_next_mapping()) self.assertRaises(ValueError, line.pop_mapping) self.assertEqual(None, line.peek_key()) # try popping this as a quoted mapping line = stem.response.ControlLine(version_entry) self.assertEqual(line.pop_mapping(True), ('Tor', '0.2.1.30 (0a083b0188cacd2f07838ff0446113bd5211a024)')) self.assertEqual(line.remainder(), '') self.assertTrue(line.is_empty()) self.assertFalse(line.is_next_quoted()) self.assertFalse(line.is_next_mapping()) self.assertEqual(None, line.peek_key()) def test_escapes(self): """ Checks that we can parse quoted values with escaped quotes in it. This explicitely comes up with the COOKIEFILE attribute of PROTOCOLINFO responses. """ auth_line = PROTOCOLINFO_RESPONSE[1] line = stem.response.ControlLine(auth_line) self.assertEqual(line, auth_line) self.assertEqual(line.remainder(), auth_line) self.assertEqual(line.pop(), 'AUTH') self.assertEqual(line.pop_mapping(), ('METHODS', 'COOKIE')) self.assertEqual(line.remainder(), r'COOKIEFILE="/tmp/my data\\\"dir//control_auth_cookie"') self.assertTrue(line.is_next_mapping()) self.assertTrue(line.is_next_mapping(key = 'COOKIEFILE')) self.assertTrue(line.is_next_mapping(quoted = True)) self.assertTrue(line.is_next_mapping(quoted = True, escaped = True)) cookie_file_entry = line.remainder() # try a general pop self.assertEqual(line.pop(), 'COOKIEFILE="/tmp/my') self.assertEqual(line.pop(), r'data\\\"dir//control_auth_cookie"') self.assertTrue(line.is_empty()) # try a general pop with escapes line = stem.response.ControlLine(cookie_file_entry) self.assertEqual(line.pop(escaped = True), 'COOKIEFILE="/tmp/my') self.assertEqual(line.pop(escaped = True), r'data\"dir//control_auth_cookie"') self.assertTrue(line.is_empty()) # try a mapping pop line = stem.response.ControlLine(cookie_file_entry) self.assertEqual(line.pop_mapping(), ('COOKIEFILE', '"/tmp/my')) self.assertEqual(line.remainder(), r'data\\\"dir//control_auth_cookie"') self.assertFalse(line.is_empty()) # try a quoted mapping pop (this should trip up on the escaped quote) line = stem.response.ControlLine(cookie_file_entry) self.assertEqual(line.pop_mapping(True), ('COOKIEFILE', '/tmp/my data\\\\\\')) self.assertEqual(line.remainder(), 'dir//control_auth_cookie"') self.assertFalse(line.is_empty()) # try an escaped quoted mapping pop line = stem.response.ControlLine(cookie_file_entry) self.assertEqual(line.pop_mapping(True, True), ('COOKIEFILE', r'/tmp/my data\"dir//control_auth_cookie')) self.assertTrue(line.is_empty()) # try an escaped slash followed by a character that could be part of an # escape sequence line = stem.response.ControlLine(r'COOKIEFILE="C:\\Users\\Atagar\\AppData\\tor\\control_auth_cookie"') self.assertEqual(line.pop_mapping(True, True), ('COOKIEFILE', r'C:\Users\Atagar\AppData\tor\control_auth_cookie')) self.assertTrue(line.is_empty()) stem-1.7.1/test/unit/response/__init__.py0000664000175000017500000000026713237375570021140 0ustar atagaratagar00000000000000""" Unit tests for stem.response. """ __all__ = [ 'control_message', 'control_line', 'events', 'getinfo', 'getconf', 'protocolinfo', 'authchallenge', 'singleline', ] stem-1.7.1/test/unit/response/authchallenge.py0000664000175000017500000000416513237375570022206 0ustar atagaratagar00000000000000""" Unit tests for the stem.response.authchallenge.AuthChallengeResponse class. """ import unittest import stem.response import stem.response.authchallenge import stem.socket from stem.response import ControlMessage VALID_RESPONSE = '250 AUTHCHALLENGE \ SERVERHASH=B16F72DACD4B5ED1531F3FCC04B593D46A1E30267E636EA7C7F8DD7A2B7BAA05 \ SERVERNONCE=653574272ABBB49395BD1060D642D653CFB7A2FCE6A4955BCFED819703A9998C' VALID_HASH = b'\xb1or\xda\xcdK^\xd1S\x1f?\xcc\x04\xb5\x93\xd4j\x1e0&~cn\xa7\xc7\xf8\xddz+{\xaa\x05' VALID_NONCE = b"e5t'*\xbb\xb4\x93\x95\xbd\x10`\xd6B\xd6S\xcf\xb7\xa2\xfc\xe6\xa4\x95[\xcf\xed\x81\x97\x03\xa9\x99\x8c" INVALID_RESPONSE = '250 AUTHCHALLENGE \ SERVERHASH=FOOBARB16F72DACD4B5ED1531F3FCC04B593D46A1E30267E636EA7C7F8DD7A2B7BAA05 \ SERVERNONCE=FOOBAR653574272ABBB49395BD1060D642D653CFB7A2FCE6A4955BCFED819703A9998C' class TestAuthChallengeResponse(unittest.TestCase): def test_valid_response(self): """ Parses valid AUTHCHALLENGE responses. """ control_message = ControlMessage.from_str(VALID_RESPONSE, 'AUTHCHALLENGE', normalize = True) # now this should be a AuthChallengeResponse (ControlMessage subclass) self.assertTrue(isinstance(control_message, stem.response.ControlMessage)) self.assertTrue(isinstance(control_message, stem.response.authchallenge.AuthChallengeResponse)) self.assertEqual(VALID_HASH, control_message.server_hash) self.assertEqual(VALID_NONCE, control_message.server_nonce) def test_invalid_responses(self): """ Tries to parse various malformed responses and checks it they raise appropriate exceptions. """ auth_challenge_comp = VALID_RESPONSE.split() for index in range(1, len(auth_challenge_comp)): # Attempts to parse a message without this item. The first item is # skipped because, without the 250 code, the message won't be # constructed. remaining_comp = auth_challenge_comp[:index] + auth_challenge_comp[index + 1:] control_message = ControlMessage.from_str(' '.join(remaining_comp), normalize = True) self.assertRaises(stem.ProtocolError, stem.response.convert, 'AUTHCHALLENGE', control_message) stem-1.7.1/test/unit/response/control_message.py0000664000175000017500000002012013341474573022552 0ustar atagaratagar00000000000000""" Unit tests for the stem.response.ControlMessage parsing and class. """ import io import socket import unittest import stem.socket import stem.response import stem.response.getinfo import stem.util.str_tools OK_REPLY = '250 OK\r\n' EVENT_BW = '650 BW 32326 2856\r\n' EVENT_CIRC_TIMEOUT = '650 CIRC 5 FAILED PURPOSE=GENERAL REASON=TIMEOUT\r\n' EVENT_CIRC_LAUNCHED = '650 CIRC 9 LAUNCHED PURPOSE=GENERAL\r\n' EVENT_CIRC_EXTENDED = '650 CIRC 5 EXTENDED $A200F527C82C59A25CCA44884B49D3D65B122652=faktor PURPOSE=MEASURE_TIMEOUT\r\n' GETINFO_VERSION = """250-version=0.2.2.23-alpha (git-b85eb949b528f4d7) 250 OK """.replace('\n', '\r\n') GETINFO_INFONAMES = """250+info/names= accounting/bytes -- Number of bytes read/written so far in the accounting interval. accounting/bytes-left -- Number of bytes left to write/read so far in the accounting interval. accounting/enabled -- Is accounting currently enabled? accounting/hibernating -- Are we hibernating or awake? stream-status -- List of current streams. version -- The current version of Tor. . 250 OK """.replace('\n', '\r\n') class TestControlMessage(unittest.TestCase): def test_from_str(self): msg = stem.response.ControlMessage.from_str(GETINFO_VERSION) self.assertTrue(isinstance(msg, stem.response.ControlMessage)) self.assertEqual('version=0.2.2.23-alpha (git-b85eb949b528f4d7)\nOK', str(msg)) msg = stem.response.ControlMessage.from_str(GETINFO_VERSION, 'GETINFO') self.assertTrue(isinstance(msg, stem.response.getinfo.GetInfoResponse)) self.assertEqual({'version': b'0.2.2.23-alpha (git-b85eb949b528f4d7)'}, msg.entries) def test_ok_response(self): """ Checks the basic 'OK' response that we get for most commands. """ message = self._assert_message_parses(OK_REPLY) self.assertEqual('OK', str(message)) contents = message.content() self.assertEqual(1, len(contents)) self.assertEqual(('250', ' ', 'OK'), contents[0]) def test_event_response(self): """ Checks parsing of actual events. """ # BW event message = self._assert_message_parses(EVENT_BW) self.assertEqual('BW 32326 2856', str(message)) contents = message.content() self.assertEqual(1, len(contents)) self.assertEqual(('650', ' ', 'BW 32326 2856'), contents[0]) # few types of CIRC events for circ_content in (EVENT_CIRC_TIMEOUT, EVENT_CIRC_LAUNCHED, EVENT_CIRC_EXTENDED): message = self._assert_message_parses(circ_content) self.assertEqual(circ_content[4:-2], str(message)) contents = message.content() self.assertEqual(1, len(contents)) self.assertEqual(('650', ' ', str(message)), contents[0]) def test_getinfo_response(self): """ Checks parsing of actual GETINFO responses. """ # GETINFO version (basic single-line results) message = self._assert_message_parses(GETINFO_VERSION) self.assertEqual(2, len(list(message))) self.assertEqual(2, len(str(message).splitlines())) # manually checks the contents contents = message.content() self.assertEqual(2, len(contents)) self.assertEqual(('250', '-', 'version=0.2.2.23-alpha (git-b85eb949b528f4d7)'), contents[0]) self.assertEqual(('250', ' ', 'OK'), contents[1]) # GETINFO info/names (data entry) message = self._assert_message_parses(GETINFO_INFONAMES) self.assertEqual(2, len(list(message))) self.assertEqual(8, len(str(message).splitlines())) # manually checks the contents contents = message.content() self.assertEqual(2, len(contents)) first_entry = (contents[0][0], contents[0][1], contents[0][2][:contents[0][2].find('\n')]) self.assertEqual(('250', '+', 'info/names='), first_entry) self.assertEqual(('250', ' ', 'OK'), contents[1]) def test_no_crlf(self): """ Checks that we get a ProtocolError when we don't have both a carriage return and newline for line endings. This doesn't really check for newlines (since that's what readline would break on), but not the end of the world. """ # Replaces each of the CRLF entries with just LF, confirming that this # causes a parsing error. This should test line endings for both data # entry parsing and non-data. infonames_lines = [line + '\n' for line in GETINFO_INFONAMES.splitlines()] for index, line in enumerate(infonames_lines): # replace the CRLF for the line infonames_lines[index] = line.rstrip('\r\n') + '\n' test_socket_file = io.BytesIO(stem.util.str_tools._to_bytes(''.join(infonames_lines))) self.assertRaises(stem.ProtocolError, stem.socket.recv_message, test_socket_file) # puts the CRLF back infonames_lines[index] = infonames_lines[index].rstrip('\n') + '\r\n' # sanity check the above test isn't broken due to leaving infonames_lines # with invalid data self._assert_message_parses(''.join(infonames_lines)) def test_malformed_prefix(self): """ Checks parsing for responses where the header is missing a digit or divider. """ for index in range(len(EVENT_BW)): # makes test input with that character missing or replaced removal_test_input = EVENT_BW[:index] + EVENT_BW[index + 1:] replacement_test_input = EVENT_BW[:index] + '#' + EVENT_BW[index + 1:] if index < 4 or index >= (len(EVENT_BW) - 2): # dropping the character should cause an error if... # - this is part of the message prefix # - this is disrupting the line ending self.assertRaises(stem.ProtocolError, stem.socket.recv_message, io.BytesIO(stem.util.str_tools._to_bytes(removal_test_input))) self.assertRaises(stem.ProtocolError, stem.socket.recv_message, io.BytesIO(stem.util.str_tools._to_bytes(replacement_test_input))) else: # otherwise the data will be malformed, but this goes undetected self._assert_message_parses(removal_test_input) self._assert_message_parses(replacement_test_input) def test_disconnected_socket(self): """ Tests when the read function is given a file derived from a disconnected socket. """ control_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) control_socket_file = control_socket.makefile() self.assertRaises(stem.SocketClosed, stem.socket.recv_message, control_socket_file) def test_equality(self): msg = stem.response.ControlMessage.from_str(EVENT_BW) event_msg = stem.response.ControlMessage.from_str(EVENT_BW, 'EVENT') # basic check for identical and differing events self.assertEqual(msg, stem.response.ControlMessage.from_str(EVENT_BW)) self.assertNotEqual(msg, stem.response.ControlMessage.from_str(EVENT_CIRC_TIMEOUT)) # casting to different message types should cause us to mismatch self.assertNotEqual(event_msg, msg) stem.response.convert('EVENT', msg) self.assertEqual(event_msg, msg) # events also take into account when they were received event1 = stem.response.ControlMessage.from_str(EVENT_BW, 'EVENT', arrived_at = 123) event2 = stem.response.ControlMessage.from_str(EVENT_BW, 'EVENT', arrived_at = 456) event3 = stem.response.ControlMessage.from_str(EVENT_BW, 'EVENT', arrived_at = 123) self.assertNotEqual(event1, event2) self.assertEqual(event1, event3) def _assert_message_parses(self, controller_reply): """ Performs some basic sanity checks that a reply mirrors its parsed result. Returns: stem.response.ControlMessage for the given input """ message = stem.socket.recv_message(io.BytesIO(stem.util.str_tools._to_bytes(controller_reply))) # checks that the raw_content equals the input value self.assertEqual(controller_reply, message.raw_content()) # checks that the contents match the input message_lines = str(message).splitlines() controller_lines = controller_reply.split('\r\n') controller_lines.pop() # the ControlMessage won't have a trailing newline while controller_lines: line = controller_lines.pop(0) # mismatching lines with just a period are probably data termination if line == '.' and (not message_lines or line != message_lines[0]): continue self.assertTrue(line.endswith(message_lines.pop(0))) return message stem-1.7.1/test/unit/response/mapaddress.py0000664000175000017500000000466513237375570021532 0ustar atagaratagar00000000000000""" Unit tests for the stem.response.mapaddress.MapAddressResponse class. """ import unittest import stem.response import stem.response.mapaddress import stem.socket from stem.response import ControlMessage BATCH_RESPONSE = """\ 250-foo=bar 250-baz=quux 250-gzzz=bzz 250 120.23.23.2=torproject.org""" INVALID_EMPTY_RESPONSE = '250 OK' INVALID_RESPONSE = '250 foo is bar' PARTIAL_FAILURE_RESPONSE = """512-syntax error: mapping '2389' is not of expected form 'foo=bar' 512-syntax error: mapping '23' is not of expected form 'foo=bar'. 250 23=324""" UNRECOGNIZED_KEYS_RESPONSE = "512 syntax error: mapping '2389' is not of expected form 'foo=bar'" FAILED_RESPONSE = '451 Resource exhausted' class TestMapAddressResponse(unittest.TestCase): def test_single_response(self): """ Parses a MAPADDRESS reply response with a single address mapping. """ control_message = ControlMessage.from_str('250 foo=bar\r\n', 'MAPADDRESS') self.assertEqual({'foo': 'bar'}, control_message.entries) def test_batch_response(self): """ Parses a MAPADDRESS reply with multiple address mappings """ expected = { 'foo': 'bar', 'baz': 'quux', 'gzzz': 'bzz', '120.23.23.2': 'torproject.org' } control_message = ControlMessage.from_str(BATCH_RESPONSE, 'MAPADDRESS', normalize = True) self.assertEqual(expected, control_message.entries) def test_invalid_requests(self): """ Parses a MAPADDRESS replies that contain an error code due to hostname syntax errors. """ control_message = ControlMessage.from_str(UNRECOGNIZED_KEYS_RESPONSE, normalize = True) self.assertRaises(stem.InvalidRequest, stem.response.convert, 'MAPADDRESS', control_message) control_message = ControlMessage.from_str(PARTIAL_FAILURE_RESPONSE, 'MAPADDRESS', normalize = True) self.assertEqual({'23': '324'}, control_message.entries) def test_invalid_response(self): """ Parses a malformed MAPADDRESS reply that contains an invalid response code. This is a proper controller message, but malformed according to the MAPADDRESS's spec. """ control_message = ControlMessage.from_str(INVALID_EMPTY_RESPONSE, normalize = True) self.assertRaises(stem.ProtocolError, stem.response.convert, 'MAPADDRESS', control_message) control_message = ControlMessage.from_str(INVALID_RESPONSE, normalize = True) self.assertRaises(stem.ProtocolError, stem.response.convert, 'MAPADDRESS', control_message) stem-1.7.1/test/unit/response/events.py0000664000175000017500000020414413341034346020672 0ustar atagaratagar00000000000000""" Unit tests for the stem.response.events classes. """ import datetime import threading import unittest import stem.response import stem.response.events import stem.util.log from stem import * # enums and exceptions from stem.response import ControlMessage from stem.descriptor.router_status_entry import RouterStatusEntryV3 try: # added in python 3.3 from unittest.mock import Mock except ImportError: from mock import Mock # ADDRMAP event ADDRMAP = '650 ADDRMAP www.atagar.com 75.119.206.243 "2012-11-19 00:50:13" \ EXPIRES="2012-11-19 08:50:13"' ADDRMAP_NO_EXPIRATION = '650 ADDRMAP www.atagar.com 75.119.206.243 NEVER' ADDRMAP_ERROR_EVENT = '650 ADDRMAP www.atagar.com "2012-11-19 00:50:13" \ error=yes EXPIRES="2012-11-19 08:50:13"' ADDRMAP_BAD_1 = '650 ADDRMAP www.atagar.com 75.119.206.243 2012-11-19 00:50:13" \ EXPIRES="2012-11-19 08:50:13"' ADDRMAP_BAD_2 = '650 ADDRMAP www.atagar.com 75.119.206.243 "2012-11-19 00:50:13 \ EXPIRES="2012-11-19 08:50:13"' ADDRMAP_CACHED = '650 ADDRMAP example.com 192.0.43.10 "2013-04-03 22:31:22" \ EXPIRES="2013-04-03 20:31:22" \ CACHED="YES"' ADDRMAP_NOT_CACHED = '650 ADDRMAP example.com 192.0.43.10 "2013-04-03 22:29:11" \ EXPIRES="2013-04-03 20:29:11" \ CACHED="NO"' ADDRMAP_CACHED_MALFORMED = '650 ADDRMAP example.com 192.0.43.10 "2013-04-03 22:29:11" \ CACHED="KINDA"' AUTHDIR_NEWDESC = """\ 650+AUTHDIR_NEWDESCS DROPPED Not replacing router descriptor; no information has changed since the last one with this identity. @uploaded-at 2017-05-25 04:46:21 @source "127.0.0.1" router test002r 127.0.0.1 5002 0 7002 identity-ed25519 -----BEGIN ED25519 CERT----- AQQABlm9AXVOPVG4KHqFmShWRFPU2oXO15yaS+J8c6SrLBMpnB1vAQAgBABBic8D +GIdBzNCezf1Lfw8NSpbDL7S4ExBuMXvi6WvEoN1gIGwEwddLvUF91l6BXL5yoXf xg7fDhYZ7CDwtVBHSfvmsIKR/QnQyylbDpVllsV9Wz6JLz52JgFGQaNjAgA= -----END ED25519 CERT----- master-key-ed25519 QYnPA/hiHQczQns39S38PDUqWwy+0uBMQbjF74ulrxI platform Tor 0.3.0.7 on Darwin proto Cons=1-2 Desc=1-2 DirCache=1 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-4 LinkAuth=1,3 Microdesc=1-2 Relay=1-2 published 2017-05-25 04:46:20 fingerprint 3482 25F8 3C85 4796 B2DD 6364 E65C B189 B33B D696 uptime 9 bandwidth 1073741824 1073741824 0 extra-info-digest 114E4F433D6E08D9E73621BB418EBF02336EB578 i6+wKCBaNqUbNZIM9DFacEM74R5m0lkh8//h6R/nbGc onion-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAMMpf3fLSUEme0aQfN2RUfAPhZJMXVSqMpFRdBoKA4AYlz78VA9zxfj3 Nyir2G2HFaTzeS82p74obc8RufJQcGoDUwDnPlHtjb2ezmr018j8i3fTEvPwj5xC 5001FRwUVcOaLnxZKSDzpTyKRWGnSQBSbGcyXwMRtySKf0P5yjHDAgMBAAE= -----END RSA PUBLIC KEY----- signing-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAM7Rn1kQffaJE8rbtgTiMxNY67i27hCBzzr0gE558jARizOJo8lf7get rxz92mzYPYskM1V/j16QhoRlrruMn319/l6o97+/ta6qIwlSPXZ1jd/BGs3yqS4X 2N+N9qW8zC6km88K/YZuIsqYyXL7oHoIGqbERYLmp/JqLlAR52JJAgMBAAE= -----END RSA PUBLIC KEY----- onion-key-crosscert -----BEGIN CROSSCERT----- t4BE0PcPra9o5HBJHr9+h1MgP76XY3UGLQX8FGfEPHfNBMtVxRKkhOZ7Ki01+dkK IpfkdQn3bOXTIa+FYGvzpyADYx4RDpbHG9/Tna/xR+6LhAQfvcLrlBxsjyntXjkX FwE+AemijIU4DM4F1FHIkFz6OgT9B1/G0mr5QggzXS8= -----END CROSSCERT----- ntor-onion-key-crosscert 0 -----BEGIN ED25519 CERT----- AQoABleVAUGJzwP4Yh0HM0J7N/Ut/Dw1KlsMvtLgTEG4xe+Lpa8SAKgaOVGouOKa N64AOq7FdJJM/qgI1r2+jqTj1Mk/a19kfTIQ8hhWxoaJhg1xo8BasnjNQ+4Cm7ds vMW0fhwJjQ4= -----END ED25519 CERT----- hidden-service-dir ntor-onion-key tic6dEvMWt3kaUtDhwULgb3qBnc2wd5GkJ5cv0TelhA= accept *:* ipv6-policy accept 1-65535 tunnelled-dir-server router-sig-ed25519 t7XJfoMOKbk1167f4p5+z5nlXxr+8us3qaLdNeQ1nGpUyQtM4G8Ie9P/oeqwhV4lCx5pQN1vIy3lUaN811WqAA router-signature -----BEGIN SIGNATURE----- j/mMC1JuChvJH/ZP/Ayy0ZAV2P6VoxpRhHJfZMC07rr2ctmxfDTwLQhbYrqJ2adW FYy5QTzxYzSFoTA7FvsadJuyvsGlaRfgFs+AxYjBUUoK7Dcd2ri+Y11NmwCBLFqF 4cYG3pqPHb38gXLj89QXfMJUDbOwrxvkVxIFbdwDCsE= -----END SIGNATURE----- . 650 OK """ # BUILDTIMEOUT_SET event from tor 0.2.3.16. BUILD_TIMEOUT_EVENT = '650 BUILDTIMEOUT_SET COMPUTED \ TOTAL_TIMES=124 \ TIMEOUT_MS=9019 \ XM=1375 \ ALPHA=0.855662 \ CUTOFF_QUANTILE=0.800000 \ TIMEOUT_RATE=0.137097 \ CLOSE_MS=21850 \ CLOSE_RATE=0.072581' BUILD_TIMEOUT_EVENT_BAD_1 = '650 BUILDTIMEOUT_SET COMPUTED \ TOTAL_TIMES=one_twenty_four \ TIMEOUT_MS=9019 \ XM=1375 \ ALPHA=0.855662 \ CUTOFF_QUANTILE=0.800000 \ TIMEOUT_RATE=0.137097 \ CLOSE_MS=21850 \ CLOSE_RATE=0.072581' BUILD_TIMEOUT_EVENT_BAD_2 = '650 BUILDTIMEOUT_SET COMPUTED \ TOTAL_TIMES=124 \ TIMEOUT_MS=9019 \ XM=1375 \ ALPHA=0.855662 \ CUTOFF_QUANTILE=zero_point_eight \ TIMEOUT_RATE=0.137097 \ CLOSE_MS=21850 \ CLOSE_RATE=0.072581' # CIRC events from tor v0.2.3.16 CIRC_LAUNCHED = '650 CIRC 7 LAUNCHED \ BUILD_FLAGS=NEED_CAPACITY \ PURPOSE=GENERAL \ TIME_CREATED=2012-11-08T16:48:38.417238' CIRC_LAUNCHED_BAD_1 = '650 CIRC 7 LAUNCHED \ BUILD_FLAGS=NEED_CAPACITY \ PURPOSE=GENERAL \ TIME_CREATED=20121108T164838417238' CIRC_LAUNCHED_BAD_2 = '650 CIRC toolong8901234567 LAUNCHED \ BUILD_FLAGS=NEED_CAPACITY \ PURPOSE=GENERAL \ TIME_CREATED=2012-11-08T16:48:38.417238' CIRC_EXTENDED = '650 CIRC 7 EXTENDED \ $999A226EBED397F331B612FE1E4CFAE5C1F201BA=piyaz \ BUILD_FLAGS=NEED_CAPACITY \ PURPOSE=GENERAL \ TIME_CREATED=2012-11-08T16:48:38.417238' CIRC_FAILED = '650 CIRC 5 FAILED \ $E57A476CD4DFBD99B4EE52A100A58610AD6E80B9=ergebnisoffen \ BUILD_FLAGS=NEED_CAPACITY \ PURPOSE=GENERAL \ TIME_CREATED=2012-11-08T16:48:36.400959 \ REASON=DESTROYED \ REMOTE_REASON=OR_CONN_CLOSED' CIRC_WITH_CREDENTIALS = '650 CIRC 7 LAUNCHED \ SOCKS_USERNAME="It\'s a me, Mario!" \ SOCKS_PASSWORD="your princess is in another castle"' # CIRC events from tor v0.2.1.30 without the VERBOSE_NAMES feature CIRC_LAUNCHED_OLD = '650 CIRC 4 LAUNCHED' CIRC_EXTENDED_OLD = '650 CIRC 1 EXTENDED \ $E57A476CD4DFBD99B4EE52A100A58610AD6E80B9,hamburgerphone' CIRC_BUILT_OLD = '650 CIRC 1 BUILT \ $E57A476CD4DFBD99B4EE52A100A58610AD6E80B9,hamburgerphone,PrivacyRepublic14' # CIRC_MINOR event from tor 0.2.3.16. CIRC_MINOR_EVENT = '650 CIRC_MINOR 7 PURPOSE_CHANGED \ $67B2BDA4264D8A189D9270E28B1D30A262838243~europa1 \ BUILD_FLAGS=IS_INTERNAL,NEED_CAPACITY \ PURPOSE=MEASURE_TIMEOUT \ TIME_CREATED=2012-12-03T16:45:33.409602 \ OLD_PURPOSE=TESTING' CIRC_MINOR_EVENT_BAD_1 = '650 CIRC_MINOR 7 PURPOSE_CHANGED \ $67B2BDA4264D8A189D9270E28B1D30A262838243~europa1 \ BUILD_FLAGS=IS_INTERNAL,NEED_CAPACITY \ PURPOSE=MEASURE_TIMEOUT \ TIME_CREATED=20121203T164533409602 \ OLD_PURPOSE=TESTING' CIRC_MINOR_EVENT_BAD_2 = '650 CIRC_MINOR toolong8901234567 PURPOSE_CHANGED \ $67B2BDA4264D8A189D9270E28B1D30A262838243~europa1 \ BUILD_FLAGS=IS_INTERNAL,NEED_CAPACITY \ PURPOSE=MEASURE_TIMEOUT \ TIME_CREATED=2012-12-03T16:45:33.409602 \ OLD_PURPOSE=TESTING' # CLIENTS_SEEN example from the spec CLIENTS_SEEN_EVENT = '650 CLIENTS_SEEN \ TimeStarted="2008-12-25 23:50:43" \ CountrySummary=us=16,de=8,uk=8 \ IPVersions=v4=16,v6=40' CLIENTS_SEEN_EVENT_BAD_1 = '650 CLIENTS_SEEN \ TimeStarted="2008-12-25 23:50:43" \ CountrySummary=us:16,de:8,uk:8 \ IPVersions=v4=16,v6=40' CLIENTS_SEEN_EVENT_BAD_2 = '650 CLIENTS_SEEN \ TimeStarted="2008-12-25 23:50:43" \ CountrySummary=usa=16,unitedkingdom=8 \ IPVersions=v4=16,v6=40' CLIENTS_SEEN_EVENT_BAD_3 = '650 CLIENTS_SEEN \ TimeStarted="2008-12-25 23:50:43" \ CountrySummary=us=16,de=8,uk=eight \ IPVersions=v4=16,v6=40' CLIENTS_SEEN_EVENT_BAD_4 = '650 CLIENTS_SEEN \ TimeStarted="2008-12-25 23:50:43" \ CountrySummary=au=16,au=8,au=8 \ IPVersions=v4=16,v6=40' CLIENTS_SEEN_EVENT_BAD_5 = '650 CLIENTS_SEEN \ TimeStarted="2008-12-25 23:50:43" \ CountrySummary=us=16,de=8,uk=8 \ IPVersions=v4:16,v6:40' CLIENTS_SEEN_EVENT_BAD_6 = '650 CLIENTS_SEEN \ TimeStarted="2008-12-25 23:50:43" \ CountrySummary=us=16,de=8,uk=8 \ IPVersions=v4=sixteen,v6=40' # CONF_CHANGED event from tor 0.2.3.16. CONF_CHANGED_EVENT = """650-CONF_CHANGED 650-ExitNodes=caerSidi 650-ExitPolicy 650-MaxCircuitDirtiness=20 650 OK """ CONF_CHANGED_EVENT_MULTIPLE = """650-CONF_CHANGED 650-ExitPolicy=accept 34.3.4.5 650-ExitPolicy=accept 3.4.53.3 650-MaxCircuitDirtiness=20 650 OK """ # GUARD events from tor v0.2.1.30. GUARD_NEW = '650 GUARD ENTRY $36B5DBA788246E8369DBAF58577C6BC044A9A374 NEW' GUARD_GOOD = '650 GUARD ENTRY $5D0034A368E0ABAF663D21847E1C9B6CFA09752A GOOD' GUARD_BAD = '650 GUARD ENTRY $5D0034A368E0ABAF663D21847E1C9B6CFA09752A=caerSidi BAD' HS_DESC_EVENT = '650 HS_DESC REQUESTED ajhb7kljbiru65qo NO_AUTH \ $67B2BDA4264D8A189D9270E28B1D30A262838243=europa1 b3oeducbhjmbqmgw2i3jtz4fekkrinwj' HS_DESC_NO_DESC_ID = '650 HS_DESC REQUESTED ajhb7kljbiru65qo NO_AUTH \ $67B2BDA4264D8A189D9270E28B1D30A262838243' HS_DESC_NOT_FOUND = '650 HS_DESC REQUESTED ajhb7kljbiru65qo NO_AUTH UNKNOWN' HS_DESC_FAILED = '650 HS_DESC FAILED ajhb7kljbiru65qo NO_AUTH \ $67B2BDA4264D8A189D9270E28B1D30A262838243 \ b3oeducbhjmbqmgw2i3jtz4fekkrinwj REASON=NOT_FOUND' # HS_DESC_CONTENT from 0.2.7.1 HS_DESC_CONTENT_EVENT = """\ 650+HS_DESC_CONTENT facebookcorewwwi riwvyw6njgvs4koel4heqs7w4bssnmlw $8A30C9E8F5954EE286D29BD65CADEA6991200804~YorkshireTOR rendezvous-service-descriptor riwvyw6njgvs4koel4heqs7w4bssnmlw version 2 permanent-key -----BEGIN RSA PUBLIC KEY----- MIGJAoGBALfng/krEfrBcvblDiM3PAkowkiAKxLoTsXt3nPEzyTP6Cw+Gdr0ODje hmxTngN1pKiH7szk4Q1p2RabOrUHWwXmGXeDDNs00fcyU6HupgqsCoKOqCsmPac6 /58apC64A7xHeS02wtfWJp6qiZ8i6GGu6xWXRWux+ShPgcHvkajRAgMahU8= -----END RSA PUBLIC KEY----- secret-id-part vnb2j6ftvkvghypd4yyypsl3qmpjyq3j publication-time 2015-03-13 19:00:00 protocol-versions 2,3 introduction-points -----BEGIN MESSAGE----- aW50cm9kdWN0aW9uLXBvaW50IHNqbm1xbmdraXl3YmtkeXBjb2FqdHY2dmNtNjY2 NmR6CmlwLWFkZHJlc3MgMTk4LjIzLjE4Ny4xNTgKb25pb24tcG9ydCA0NDMKb25p b24ta2V5Ci0tLS0tQkVHSU4gUlNBIFBVQkxJQyBLRVktLS0tLQpNSUdKQW9HQkFO MUNsaERkZDNSWHdwT0hMZUNNYlVvNFlISDNEMUxnR0pXbEFPVnBxQ3ZSbDhEbjIv UWpGeHNVCnJGaG9WUzRDUjlNVFIzMnlsSnJ0R2JTcWxRVm1HY3M3bnZ5RDU5YVky em9RVGhIdm1lWVUwS0ZzQTc5ZFNyTW0KUDR5WnZFSkZmdkpQODRySWd0TlVtZ3R4 aHQzVzNiR2FVMUNBNGU4bjBza2hYWXdRRzg1MUFnTUJBQUU9Ci0tLS0tRU5EIFJT QSBQVUJMSUMgS0VZLS0tLS0Kc2VydmljZS1rZXkKLS0tLS1CRUdJTiBSU0EgUFVC TElDIEtFWS0tLS0tCk1JR0pBb0dCQUxDajREUTJPaTJhRjF4WE1iNjhsSHFJQnN5 NjRSbXFjTUpNb1d3THF4WTFiREcwbnE0Nlk5eHYKVnBPVzAxTmQrYnF3b3BIa0J2 TzllSGVKTm9NN1BYMmtVWmQ5RlFQSUJHbWdCZ0dxenV6a2lQTEFpbHhtWHRQbwpN cnRheGdzRTR6MjlWYnJUV2Q0SHFKSDJFOWNybDdzeHhiTGVvSDFLRjZzSm5lMFlP WGlyQWdNQkFBRT0KLS0tLS1FTkQgUlNBIFBVQkxJQyBLRVktLS0tLQppbnRyb2R1 Y3Rpb24tcG9pbnQgYmhzbjVhdDNzaDIzZGZ5cmNxYnU1bDV6NGs1Z3RueHAKaXAt YWRkcmVzcyAxMDQuMTI4Ljc4LjEwNwpvbmlvbi1wb3J0IDMwMDIKb25pb24ta2V5 Ci0tLS0tQkVHSU4gUlNBIFBVQkxJQyBLRVktLS0tLQpNSUdKQW9HQkFMYk5HdU0v RlNnZEJjOTFZSjNQOXRoVC9vQzRWOFZDZzZBcjk5WlFHRldhVGlRdXRjNGZLWC9F CnR1TGRjdzBsRmxVbXhPZXNXMVduaVkxaVFDOW9yUkQ3cGE1amNES0EyRThDb3kv WmYzYTlXNFNRRzYxakswUzcKYlNGVk9LUHQ3TDUvT21pK05icStsSnB5MmdCTnFU TWt0U0k0YklPUlY1aUpWWkRWU21qVkFnTUJBQUU9Ci0tLS0tRU5EIFJTQSBQVUJM SUMgS0VZLS0tLS0Kc2VydmljZS1rZXkKLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtF WS0tLS0tCk1JR0pBb0dCQU5YOVJobHRobkZkbXFXQVRsNGJ4dTBrR0UyNWlYcm83 VzFvM05GV3Q4cG8rL25oU080aVZRMHQKWVZzSGwyZEdGSVNKcWxqK3FaTXh1emVL ZmNwV3dHQnZMR1FaTDZJYUxJMUxkWSt6YzBaNjFFdWx5dXRFWFl5bAo3djFwRWN2 dGFJSDhuRXdzQnZlU1ZWUVJ5cFI4b3BnbXhmMWFKWmdzZVdMSE5hZ0JwNW81QWdN QkFBRT0KLS0tLS1FTkQgUlNBIFBVQkxJQyBLRVktLS0tLQppbnRyb2R1Y3Rpb24t cG9pbnQgbTVibGd0dHRscWc1Mno1emJlcW82a2ViczQ0bG1wd2EKaXAtYWRkcmVz cyAxNzYuMzEuMzUuMTQ5Cm9uaW9uLXBvcnQgNDQzCm9uaW9uLWtleQotLS0tLUJF R0lOIFJTQSBQVUJMSUMgS0VZLS0tLS0KTUlHSkFvR0JBTnVORFlobFF2RG9TNEFa cE5nUkFLUmZhRjAzVWFSM0JrSXo3UC8zOVB4NjZueDc1bG5wQ1pMYwpkSHl4cGJu UWp2ekE0UzdjUUVnYXUyQkgyeUtzU1NBL3ZXUHk4OVJBWUVhaUV2TlZQS1hRWmNw cnY0WXdmejU0CmRuY2VJNG51NVFQM0E3SUpkSi9PYTlHMklhdHA3OVBlTzJkN2Rq L3pzWFNKMkxvRXgyZWRBZ01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0t LS0tCnNlcnZpY2Uta2V5Ci0tLS0tQkVHSU4gUlNBIFBVQkxJQyBLRVktLS0tLQpN SUdKQW9HQkFLbU9KbXB6ZVphVkZXaVlkMms5SHY1TWpidUY0eDBUKzlXclV4Z041 N2o2Uk1CVFZQZ0lVM2hUCkdCY3dwWjR2NDduNitIbVg4VHFNTFlVZkc1bTg1cm8x SHNKMWVObnh2cW9iZVFVMW13TXdHdDMwbkJ6Y0F2NzMKbWFsYmlYRkxiOVdsK1hl OTBRdXZhbjZTenhERkx5STFPbzA2aGVUeVZwQ3d0QVVvejhCVEFnTUJBQUU9Ci0t LS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0KCg== -----END MESSAGE----- signature -----BEGIN SIGNATURE----- s9Z0zWHsoPuqLw3GOwA6cv68vCFybnitIK4vD0MbNKF5qrOfKydZzGWfN09PuShy H8Gr6aBYoz7HmlD7KyeGz9xdwRdouP+LW5YREOCORuwYnu5chWtB4iVJ0N1tIzSp nHIs1lSrV7Ux2WQ3qSVj505fTGSCmaQRBX726ZlTPW0= -----END SIGNATURE----- . 650 OK """ HS_DESC_CONTENT_EMPTY_EVENT = """\ 650+HS_DESC_CONTENT 3g2upl4pq6kufc4n 255tjwttk3wi7r2df57nuprs72j2daa3 $D7A0C3262724F2BC9646F6836E967A2777A3AF83~tsunaminitor . 650 OK """ # NEWCONSENSUS event from v0.2.1.30. NEWCONSENSUS_EVENT = """650+NEWCONSENSUS r Beaver /96bKo4soysolMgKn5Hex2nyFSY pAJH9dSBp/CG6sPhhVY/5bLaVPM 2012-12-02 22:02:45 77.223.43.54 9001 0 s Fast Named Running Stable Valid r Unnamed /+fJRWjmIGNAL2C5rRZHq3R91tA 7AnpZjfdBpYzXnMNm+w1bTsFF6Y 2012-12-02 17:51:10 91.121.184.87 9001 0 s Fast Guard Running Stable Valid . 650 OK """ # NEWDESC events. I've never actually seen multiple descriptors in an event, # but the spec allows for it. NEWDESC_SINGLE = '650 NEWDESC $B3FA3110CC6F42443F039220C134CBD2FC4F0493=Sakura' NEWDESC_MULTIPLE = '650 NEWDESC $BE938957B2CA5F804B3AFC2C1EE6673170CDBBF8=Moonshine \ $B4BE08B22D4D2923EDC3970FD1B93D0448C6D8FF~Unnamed' # NS event from tor v0.2.1.30. NS_EVENT = """650+NS r whnetz dbBxYcJriTTrcxsuy4PUZcMRwCA VStM7KAIH/mXXoGDUpoGB1OXufg 2012-12-02 21:03:56 141.70.120.13 9001 9030 s Fast HSDir Named Stable V2Dir Valid . 650 OK """ # ORCONN events from starting tor 0.2.2.39 via TBB ORCONN_CLOSED = '650 ORCONN $A1130635A0CDA6F60C276FBF6994EFBD4ECADAB1~tama CLOSED REASON=DONE' ORCONN_CONNECTED = '650 ORCONN 127.0.0.1:9000 CONNECTED NCIRCS=20 ID=18' ORCONN_LAUNCHED = '650 ORCONN $7ED90E2833EE38A75795BA9237B0A4560E51E1A0=GreenDragon LAUNCHED' ORCONN_BAD_1 = '650 ORCONN $7ED90E2833EE38A75795BA9237B0A4560E5=GreenD LAUNCHED' ORCONN_BAD_2 = '650 ORCONN 127.0.0.1:001 CONNECTED' ORCONN_BAD_3 = '650 ORCONN 127.0.0.1:9000 CONNECTED NCIRCS=too_many' ORCONN_BAD_4 = '650 ORCONN 127.0.0.1:9000 CONNECTED NCIRCS=20 ID=30635A0CDA6F60C276FBF6994EFBD4ECADA' # STATUS_* events that I was able to easily trigger. Most came from starting # TBB, then listening while it bootstrapped. STATUS_GENERAL_CONSENSUS_ARRIVED = '650 STATUS_GENERAL NOTICE CONSENSUS_ARRIVED' STATUS_CLIENT_ENOUGH_DIR_INFO = '650 STATUS_CLIENT NOTICE ENOUGH_DIR_INFO' STATUS_CLIENT_CIRC_ESTABLISHED = '650 STATUS_CLIENT NOTICE CIRCUIT_ESTABLISHED' STATUS_CLIENT_BOOTSTRAP_DESCRIPTORS = '650 STATUS_CLIENT NOTICE BOOTSTRAP \ PROGRESS=53 \ TAG=loading_descriptors \ SUMMARY="Loading relay descriptors"' STATUS_CLIENT_BOOTSTRAP_STUCK = '650 STATUS_CLIENT WARN BOOTSTRAP \ PROGRESS=80 \ TAG=conn_or \ SUMMARY="Connecting to the Tor network" \ WARNING="Network is unreachable" \ REASON=NOROUTE \ COUNT=5 \ RECOMMENDATION=warn' STATUS_CLIENT_BOOTSTRAP_CONNECTING = '650 STATUS_CLIENT NOTICE BOOTSTRAP \ PROGRESS=80 \ TAG=conn_or \ SUMMARY="Connecting to the Tor network"' STATUS_CLIENT_BOOTSTRAP_FIRST_HANDSHAKE = '650 STATUS_CLIENT NOTICE BOOTSTRAP \ PROGRESS=85 \ TAG=handshake_or \ SUMMARY="Finishing handshake with first hop"' STATUS_CLIENT_BOOTSTRAP_ESTABLISHED = '650 STATUS_CLIENT NOTICE BOOTSTRAP \ PROGRESS=90 \ TAG=circuit_create \ SUMMARY="Establishing a Tor circuit"' STATUS_CLIENT_BOOTSTRAP_DONE = '650 STATUS_CLIENT NOTICE BOOTSTRAP \ PROGRESS=100 \ TAG=done \ SUMMARY="Done"' STATUS_SERVER_CHECK_REACHABILITY = '650 STATUS_SERVER NOTICE CHECKING_REACHABILITY \ ORADDRESS=71.35.143.230:9050' STATUS_SERVER_DNS_TIMEOUT = '650 STATUS_SERVER NOTICE NAMESERVER_STATUS \ NS=205.171.3.25 \ STATUS=DOWN \ ERR="request timed out."' STATUS_SERVER_DNS_DOWN = '650 STATUS_SERVER WARN NAMESERVER_ALL_DOWN' STATUS_SERVER_DNS_UP = '650 STATUS_SERVER NOTICE NAMESERVER_STATUS \ NS=205.171.3.25 \ STATUS=UP' # unknown STATUS_* event type STATUS_SPECIFIC_CONSENSUS_ARRIVED = '650 STATUS_SPECIFIC NOTICE CONSENSUS_ARRIVED' # STREAM events from tor 0.2.3.16 for visiting the google front page STREAM_NEW = '650 STREAM 18 NEW 0 \ encrypted.google.com:443 \ SOURCE_ADDR=127.0.0.1:47849 \ PURPOSE=USER' STREAM_SENTCONNECT = '650 STREAM 18 SENTCONNECT 26 encrypted.google.com:443' STREAM_REMAP = '650 STREAM 18 REMAP 26 74.125.227.129:443 SOURCE=EXIT' STREAM_SUCCEEDED = '650 STREAM 18 SUCCEEDED 26 74.125.227.129:443' STREAM_CLOSED_RESET = '650 STREAM 21 CLOSED 26 74.125.227.129:443 REASON=CONNRESET' STREAM_CLOSED_DONE = '650 STREAM 25 CLOSED 26 199.7.52.72:80 REASON=DONE' STREAM_DIR_FETCH = '650 STREAM 14 NEW 0 \ 176.28.51.238.$649F2D0ACF418F7CFC6539AB2257EB2D5297BAFA.exit:443 \ SOURCE_ADDR=(Tor_internal):0 PURPOSE=DIR_FETCH' STREAM_DNS_REQUEST = '650 STREAM 1113 NEW 0 www.google.com:0 \ SOURCE_ADDR=127.0.0.1:15297 \ PURPOSE=DNS_REQUEST' STREAM_SENTCONNECT_BAD_1 = '650 STREAM 18 SENTCONNECT 26' STREAM_SENTCONNECT_BAD_2 = '650 STREAM 18 SENTCONNECT 26 encrypted.google.com' STREAM_SENTCONNECT_BAD_3 = '650 STREAM 18 SENTCONNECT 26 encrypted.google.com:https' STREAM_DNS_REQUEST_BAD_1 = '650 STREAM 1113 NEW 0 www.google.com:0 \ SOURCE_ADDR=127.0.0.1 \ PURPOSE=DNS_REQUEST' STREAM_DNS_REQUEST_BAD_2 = '650 STREAM 1113 NEW 0 www.google.com:0 \ SOURCE_ADDR=127.0.0.1:dns \ PURPOSE=DNS_REQUEST' STREAM_NEWRESOLVE_IP6 = '650 STREAM 23 NEWRESOLVE 0 2001:db8::1:0 PURPOSE=DNS_REQUEST' TRANSPORT_LAUNCHED = '650 TRANSPORT_LAUNCHED server obfs1 127.0.0.1 1111' TRANSPORT_LAUNCHED_BAD_TYPE = '650 TRANSPORT_LAUNCHED unicorn obfs1 127.0.0.1 1111' TRANSPORT_LAUNCHED_BAD_ADDRESS = '650 TRANSPORT_LAUNCHED server obfs1 127.0.x.y 1111' TRANSPORT_LAUNCHED_BAD_PORT = '650 TRANSPORT_LAUNCHED server obfs1 127.0.0.1 my_port' CONN_BW = '650 CONN_BW ID=11 TYPE=DIR READ=272 WRITTEN=817' CONN_BW_BAD_WRITTEN_VALUE = '650 CONN_BW ID=11 TYPE=DIR READ=272 WRITTEN=817.7' CONN_BW_BAD_MISSING_ID = '650 CONN_BW TYPE=DIR READ=272 WRITTEN=817' CIRC_BW = '650 CIRC_BW ID=11 READ=272 WRITTEN=817' CIRC_BW_WITH_TIMESTAMP = '650 CIRC_BW ID=11 READ=272 WRITTEN=817 TIME=2012-12-06T13:51:11.433755' CIRC_BW_BAD_WRITTEN_VALUE = '650 CIRC_BW ID=11 READ=272 WRITTEN=817.7' CIRC_BW_BAD_MISSING_ID = '650 CIRC_BW READ=272 WRITTEN=817' CIRC_BW_MALFORMED_TIMESTAMP = '650 CIRC_BW ID=11 READ=272 WRITTEN=817 TIME=boom' CIRC_BW_WITH_EXTRA_COUNTS = '650 CIRC_BW ID=11 READ=272 WRITTEN=817 TIME=2012-12-06T13:51:11.433755 DELIVERED_READ=12 OVERHEAD_READ=34 DELIVERED_WRITTEN=56 OVERHEAD_WRITTEN=78' CELL_STATS_1 = '650 CELL_STATS ID=14 \ OutboundQueue=19403 OutboundConn=15 \ OutboundAdded=create_fast:1,relay_early:2 \ OutboundRemoved=create_fast:1,relay_early:2 \ OutboundTime=create_fast:0,relay_early:0' CELL_STATS_2 = '650 CELL_STATS \ InboundQueue=19403 InboundConn=32 \ InboundAdded=relay:1,created_fast:1 \ InboundRemoved=relay:1,created_fast:1 \ InboundTime=relay:0,created_fast:0 \ OutboundQueue=6710 OutboundConn=18 \ OutboundAdded=create:1,relay_early:1 \ OutboundRemoved=create:1,relay_early:1 \ OutboundTime=create:0,relay_early:0' CELL_STATS_BAD_1 = '650 CELL_STATS OutboundAdded=create_fast:-1,relay_early:2' CELL_STATS_BAD_2 = '650 CELL_STATS OutboundAdded=create_fast:arg,relay_early:-2' CELL_STATS_BAD_3 = '650 CELL_STATS OutboundAdded=create_fast!:1,relay_early:-2' TB_EMPTY_1 = '650 TB_EMPTY ORCONN ID=16 READ=0 WRITTEN=0 LAST=100' TB_EMPTY_2 = '650 TB_EMPTY GLOBAL READ=93 WRITTEN=93 LAST=100' TB_EMPTY_3 = '650 TB_EMPTY RELAY READ=93 WRITTEN=93 LAST=100' TB_EMPTY_BAD_1 = '650 TB_EMPTY GLOBAL READ=93 WRITTEN=blarg LAST=100' TB_EMPTY_BAD_2 = '650 TB_EMPTY GLOBAL READ=93 WRITTEN=93 LAST=-100' def _get_event(content): return ControlMessage.from_str(content, 'EVENT', normalize = True) class TestEvents(unittest.TestCase): def test_example(self): """ Exercises the add_event_listener() pydoc example, but without the sleep(). """ import time from stem.control import Controller, EventType def print_bw(event): msg = 'sent: %i, received: %i' % (event.written, event.read) self.assertEqual('sent: 25, received: 15', msg) def event_sender(): for index in range(3): print_bw(_get_event('650 BW 15 25')) time.sleep(0.0005) controller = Mock(spec = Controller) controller.authenticate() controller.add_event_listener(print_bw, EventType.BW) events_thread = threading.Thread(target = event_sender) events_thread.start() time.sleep(0.002) events_thread.join() def test_event(self): # synthetic, contrived message construction to reach the blank event check self.assertRaises(ProtocolError, stem.response.convert, 'EVENT', stem.response.ControlMessage([('', '', '')], '')) # Event._parse_message() on an unknown event type event = _get_event('650 NONE SOLID "NON SENSE" condition=MEH quoted="1 2 3"') self.assertEqual('NONE', event.type) self.assertEqual(['SOLID', '"NON', 'SENSE"'], event.positional_args) self.assertEqual({'condition': 'MEH', 'quoted': '1 2 3'}, event.keyword_args) def test_log_events(self): event = _get_event('650 DEBUG connection_edge_process_relay_cell(): Got an extended cell! Yay.') self.assertTrue(isinstance(event, stem.response.events.LogEvent)) self.assertEqual('DEBUG', event.runlevel) self.assertEqual('connection_edge_process_relay_cell(): Got an extended cell! Yay.', event.message) event = _get_event('650 INFO circuit_finish_handshake(): Finished building circuit hop:') self.assertTrue(isinstance(event, stem.response.events.LogEvent)) self.assertEqual('INFO', event.runlevel) self.assertEqual('circuit_finish_handshake(): Finished building circuit hop:', event.message) event = _get_event('650+WARN\na multi-line\nwarning message\n.\n650 OK\n') self.assertTrue(isinstance(event, stem.response.events.LogEvent)) self.assertEqual('WARN', event.runlevel) self.assertEqual('a multi-line\nwarning message', event.message) def test_addrmap_event(self): event = _get_event(ADDRMAP) self.assertTrue(isinstance(event, stem.response.events.AddrMapEvent)) self.assertEqual(ADDRMAP.lstrip('650 '), str(event)) self.assertEqual('www.atagar.com', event.hostname) self.assertEqual('75.119.206.243', event.destination) self.assertEqual(datetime.datetime(2012, 11, 19, 0, 50, 13), event.expiry) self.assertEqual(None, event.error) self.assertEqual(datetime.datetime(2012, 11, 19, 8, 50, 13), event.utc_expiry) event = _get_event(ADDRMAP_NO_EXPIRATION) self.assertTrue(isinstance(event, stem.response.events.AddrMapEvent)) self.assertEqual(ADDRMAP_NO_EXPIRATION.lstrip('650 '), str(event)) self.assertEqual('www.atagar.com', event.hostname) self.assertEqual('75.119.206.243', event.destination) self.assertEqual(None, event.expiry) self.assertEqual(None, event.error) self.assertEqual(None, event.utc_expiry) event = _get_event(ADDRMAP_ERROR_EVENT) self.assertTrue(isinstance(event, stem.response.events.AddrMapEvent)) self.assertEqual(ADDRMAP_ERROR_EVENT.lstrip('650 '), str(event)) self.assertEqual('www.atagar.com', event.hostname) self.assertEqual(None, event.destination) self.assertEqual(datetime.datetime(2012, 11, 19, 0, 50, 13), event.expiry) self.assertEqual('yes', event.error) self.assertEqual(datetime.datetime(2012, 11, 19, 8, 50, 13), event.utc_expiry) self.assertEqual(None, event.cached) # malformed content where quotes are missing self.assertRaises(ProtocolError, _get_event, ADDRMAP_BAD_1) self.assertRaises(ProtocolError, _get_event, ADDRMAP_BAD_2) # check the CACHED flag event = _get_event(ADDRMAP_CACHED) self.assertTrue(isinstance(event, stem.response.events.AddrMapEvent)) self.assertEqual('example.com', event.hostname) self.assertEqual(True, event.cached) event = _get_event(ADDRMAP_NOT_CACHED) self.assertTrue(isinstance(event, stem.response.events.AddrMapEvent)) self.assertEqual('example.com', event.hostname) self.assertEqual(False, event.cached) # the CACHED argument should only allow YES or NO self.assertRaises(ProtocolError, _get_event, ADDRMAP_CACHED_MALFORMED) def test_authdir_newdesc_event(self): minimal_event = _get_event('650+AUTHDIR_NEWDESCS\nAction\nMessage\nDescriptor\n.\n650 OK\n') self.assertTrue(isinstance(minimal_event, stem.response.events.AuthDirNewDescEvent)) self.assertEqual('Action', minimal_event.action) self.assertEqual('Message', minimal_event.message) self.assertEqual('Descriptor', minimal_event.descriptor) event = _get_event(AUTHDIR_NEWDESC) self.assertTrue(isinstance(event, stem.response.events.AuthDirNewDescEvent)) self.assertEqual('DROPPED', event.action) self.assertEqual('Not replacing router descriptor; no information has changed since the last one with this identity.', event.message) self.assertTrue('Descripto', event.descriptor.startswith('@uploaded-at 2017-05-25 04:46:21')) def test_build_timeout_set_event(self): event = _get_event(BUILD_TIMEOUT_EVENT) self.assertTrue(isinstance(event, stem.response.events.BuildTimeoutSetEvent)) self.assertEqual(BUILD_TIMEOUT_EVENT.lstrip('650 '), str(event)) self.assertEqual(TimeoutSetType.COMPUTED, event.set_type) self.assertEqual(124, event.total_times) self.assertEqual(9019, event.timeout) self.assertEqual(1375, event.xm) self.assertEqual(0.855662, event.alpha) self.assertEqual(0.8, event.quantile) self.assertEqual(0.137097, event.timeout_rate) self.assertEqual(21850, event.close_timeout) self.assertEqual(0.072581, event.close_rate) # malformed content where we get non-numeric values self.assertRaises(ProtocolError, _get_event, BUILD_TIMEOUT_EVENT_BAD_1) self.assertRaises(ProtocolError, _get_event, BUILD_TIMEOUT_EVENT_BAD_2) def test_bw_event(self): event = _get_event('650 BW 15 25') self.assertTrue(isinstance(event, stem.response.events.BandwidthEvent)) self.assertEqual(15, event.read) self.assertEqual(25, event.written) event = _get_event('650 BW 0 0') self.assertEqual(0, event.read) self.assertEqual(0, event.written) # BW events are documented as possibly having various keywords including # DIR, OR, EXIT, and APP in the future. This is kinda a pointless note # since tor doesn't actually do it yet (and likely never will), but might # as well sanity test that it'll be ok. event = _get_event('650 BW 10 20 OR=5 EXIT=500') self.assertEqual(10, event.read) self.assertEqual(20, event.written) self.assertEqual({'OR': '5', 'EXIT': '500'}, event.keyword_args) self.assertRaises(ProtocolError, _get_event, '650 BW') self.assertRaises(ProtocolError, _get_event, '650 BW 15') self.assertRaises(ProtocolError, _get_event, '650 BW -15 25') self.assertRaises(ProtocolError, _get_event, '650 BW 15 -25') self.assertRaises(ProtocolError, _get_event, '650 BW x 25') def test_circ_event(self): event = _get_event(CIRC_LAUNCHED) self.assertTrue(isinstance(event, stem.response.events.CircuitEvent)) self.assertEqual(CIRC_LAUNCHED.lstrip('650 '), str(event)) self.assertEqual('7', event.id) self.assertEqual(CircStatus.LAUNCHED, event.status) self.assertEqual((), event.path) self.assertEqual((CircBuildFlag.NEED_CAPACITY,), event.build_flags) self.assertEqual(CircPurpose.GENERAL, event.purpose) self.assertEqual(None, event.hs_state) self.assertEqual(None, event.rend_query) self.assertEqual(datetime.datetime(2012, 11, 8, 16, 48, 38, 417238), event.created) self.assertEqual(None, event.reason) self.assertEqual(None, event.remote_reason) self.assertEqual(None, event.socks_username) self.assertEqual(None, event.socks_password) event = _get_event(CIRC_EXTENDED) self.assertTrue(isinstance(event, stem.response.events.CircuitEvent)) self.assertEqual(CIRC_EXTENDED.lstrip('650 '), str(event)) self.assertEqual('7', event.id) self.assertEqual(CircStatus.EXTENDED, event.status) self.assertEqual((('999A226EBED397F331B612FE1E4CFAE5C1F201BA', 'piyaz'),), event.path) self.assertEqual((CircBuildFlag.NEED_CAPACITY,), event.build_flags) self.assertEqual(CircPurpose.GENERAL, event.purpose) self.assertEqual(None, event.hs_state) self.assertEqual(None, event.rend_query) self.assertEqual(datetime.datetime(2012, 11, 8, 16, 48, 38, 417238), event.created) self.assertEqual(None, event.reason) self.assertEqual(None, event.remote_reason) event = _get_event(CIRC_FAILED) self.assertTrue(isinstance(event, stem.response.events.CircuitEvent)) self.assertEqual(CIRC_FAILED.lstrip('650 '), str(event)) self.assertEqual('5', event.id) self.assertEqual(CircStatus.FAILED, event.status) self.assertEqual((('E57A476CD4DFBD99B4EE52A100A58610AD6E80B9', 'ergebnisoffen'),), event.path) self.assertEqual((CircBuildFlag.NEED_CAPACITY,), event.build_flags) self.assertEqual(CircPurpose.GENERAL, event.purpose) self.assertEqual(None, event.hs_state) self.assertEqual(None, event.rend_query) self.assertEqual(datetime.datetime(2012, 11, 8, 16, 48, 36, 400959), event.created) self.assertEqual(CircClosureReason.DESTROYED, event.reason) self.assertEqual(CircClosureReason.OR_CONN_CLOSED, event.remote_reason) event = _get_event(CIRC_WITH_CREDENTIALS) self.assertTrue(isinstance(event, stem.response.events.CircuitEvent)) self.assertEqual(CIRC_WITH_CREDENTIALS.lstrip('650 '), str(event)) self.assertEqual('7', event.id) self.assertEqual(CircStatus.LAUNCHED, event.status) self.assertEqual((), event.path) self.assertEqual(None, event.build_flags) self.assertEqual(None, event.purpose) self.assertEqual(None, event.hs_state) self.assertEqual(None, event.rend_query) self.assertEqual(None, event.created) self.assertEqual(None, event.reason) self.assertEqual(None, event.remote_reason) self.assertEqual("It's a me, Mario!", event.socks_username) self.assertEqual('your princess is in another castle', event.socks_password) event = _get_event(CIRC_LAUNCHED_OLD) self.assertTrue(isinstance(event, stem.response.events.CircuitEvent)) self.assertEqual(CIRC_LAUNCHED_OLD.lstrip('650 '), str(event)) self.assertEqual('4', event.id) self.assertEqual(CircStatus.LAUNCHED, event.status) self.assertEqual((), event.path) self.assertEqual(None, event.build_flags) self.assertEqual(None, event.purpose) self.assertEqual(None, event.hs_state) self.assertEqual(None, event.rend_query) self.assertEqual(None, event.created) self.assertEqual(None, event.reason) self.assertEqual(None, event.remote_reason) event = _get_event(CIRC_EXTENDED_OLD) self.assertTrue(isinstance(event, stem.response.events.CircuitEvent)) self.assertEqual(CIRC_EXTENDED_OLD.lstrip('650 '), str(event)) self.assertEqual('1', event.id) self.assertEqual(CircStatus.EXTENDED, event.status) self.assertEqual((('E57A476CD4DFBD99B4EE52A100A58610AD6E80B9', None), (None, 'hamburgerphone')), event.path) self.assertEqual(None, event.build_flags) self.assertEqual(None, event.purpose) self.assertEqual(None, event.hs_state) self.assertEqual(None, event.rend_query) self.assertEqual(None, event.created) self.assertEqual(None, event.reason) self.assertEqual(None, event.remote_reason) event = _get_event(CIRC_BUILT_OLD) self.assertTrue(isinstance(event, stem.response.events.CircuitEvent)) self.assertEqual(CIRC_BUILT_OLD.lstrip('650 '), str(event)) self.assertEqual('1', event.id) self.assertEqual(CircStatus.BUILT, event.status) self.assertEqual((('E57A476CD4DFBD99B4EE52A100A58610AD6E80B9', None), (None, 'hamburgerphone'), (None, 'PrivacyRepublic14')), event.path) self.assertEqual(None, event.build_flags) self.assertEqual(None, event.purpose) self.assertEqual(None, event.hs_state) self.assertEqual(None, event.rend_query) self.assertEqual(None, event.created) self.assertEqual(None, event.reason) self.assertEqual(None, event.remote_reason) # malformed TIME_CREATED timestamp self.assertRaises(ProtocolError, _get_event, CIRC_LAUNCHED_BAD_1) # invalid circuit id self.assertRaises(ProtocolError, _get_event, CIRC_LAUNCHED_BAD_2) def test_circ_minor_event(self): event = _get_event(CIRC_MINOR_EVENT) self.assertTrue(isinstance(event, stem.response.events.CircMinorEvent)) self.assertEqual(CIRC_MINOR_EVENT.lstrip('650 '), str(event)) self.assertEqual('7', event.id) self.assertEqual(CircEvent.PURPOSE_CHANGED, event.event) self.assertEqual((('67B2BDA4264D8A189D9270E28B1D30A262838243', 'europa1'),), event.path) self.assertEqual((CircBuildFlag.IS_INTERNAL, CircBuildFlag.NEED_CAPACITY), event.build_flags) self.assertEqual(CircPurpose.MEASURE_TIMEOUT, event.purpose) self.assertEqual(None, event.hs_state) self.assertEqual(None, event.rend_query) self.assertEqual(datetime.datetime(2012, 12, 3, 16, 45, 33, 409602), event.created) self.assertEqual(CircPurpose.TESTING, event.old_purpose) self.assertEqual(None, event.old_hs_state) # malformed TIME_CREATED timestamp self.assertRaises(ProtocolError, _get_event, CIRC_MINOR_EVENT_BAD_1) # invalid circuit id self.assertRaises(ProtocolError, _get_event, CIRC_MINOR_EVENT_BAD_2) def test_clients_seen_event(self): event = _get_event(CLIENTS_SEEN_EVENT) self.assertTrue(isinstance(event, stem.response.events.ClientsSeenEvent)) self.assertEqual(CLIENTS_SEEN_EVENT.lstrip('650 '), str(event)) self.assertEqual(datetime.datetime(2008, 12, 25, 23, 50, 43), event.start_time) self.assertEqual({'us': 16, 'de': 8, 'uk': 8}, event.locales) self.assertEqual({'v4': 16, 'v6': 40}, event.ip_versions) # CountrySummary's 'key=value' mappings are replaced with 'key:value' self.assertRaises(ProtocolError, _get_event, CLIENTS_SEEN_EVENT_BAD_1) # CountrySummary's country codes aren't two letters self.assertRaises(ProtocolError, _get_event, CLIENTS_SEEN_EVENT_BAD_2) # CountrySummary's mapping contains a non-numeric value self.assertRaises(ProtocolError, _get_event, CLIENTS_SEEN_EVENT_BAD_3) # CountrySummary has duplicate country codes (multiple 'au=' mappings) self.assertRaises(ProtocolError, _get_event, CLIENTS_SEEN_EVENT_BAD_4) # IPVersions's 'key=value' mappings are replaced with 'key:value' self.assertRaises(ProtocolError, _get_event, CLIENTS_SEEN_EVENT_BAD_5) # IPVersions's mapping contains a non-numeric value self.assertRaises(ProtocolError, _get_event, CLIENTS_SEEN_EVENT_BAD_6) def test_conf_changed(self): event = _get_event(CONF_CHANGED_EVENT) self.assertTrue(isinstance(event, stem.response.events.ConfChangedEvent)) self.assertEqual({ 'ExitNodes': ['caerSidi'], 'MaxCircuitDirtiness': ['20'], }, event.changed) self.assertEqual(['ExitPolicy'], event.unset) self.assertEqual({ 'ExitNodes': 'caerSidi', 'MaxCircuitDirtiness': '20', 'ExitPolicy': None, }, event.config) event = _get_event(CONF_CHANGED_EVENT_MULTIPLE) self.assertTrue(isinstance(event, stem.response.events.ConfChangedEvent)) self.assertEqual({ 'ExitPolicy': ['accept 34.3.4.5', 'accept 3.4.53.3'], 'MaxCircuitDirtiness': ['20'], }, event.changed) self.assertEqual([], event.unset) self.assertEqual({ 'ExitPolicy': 'accept 3.4.53.3', # overwrote with second value 'MaxCircuitDirtiness': '20', }, event.config) def test_descchanged_event(self): # all we can check for is that the event is properly parsed as a # DescChangedEvent instance event = _get_event('650 DESCCHANGED') self.assertTrue(isinstance(event, stem.response.events.DescChangedEvent)) self.assertEqual('DESCCHANGED', str(event)) self.assertEqual([], event.positional_args) self.assertEqual({}, event.keyword_args) def test_guard_event(self): event = _get_event(GUARD_NEW) self.assertTrue(isinstance(event, stem.response.events.GuardEvent)) self.assertEqual(GUARD_NEW.lstrip('650 '), str(event)) self.assertEqual(GuardType.ENTRY, event.guard_type) self.assertEqual('$36B5DBA788246E8369DBAF58577C6BC044A9A374', event.endpoint) self.assertEqual('36B5DBA788246E8369DBAF58577C6BC044A9A374', event.endpoint_fingerprint) self.assertEqual(None, event.endpoint_nickname) self.assertEqual(GuardStatus.NEW, event.status) event = _get_event(GUARD_GOOD) self.assertEqual(GuardType.ENTRY, event.guard_type) self.assertEqual('$5D0034A368E0ABAF663D21847E1C9B6CFA09752A', event.endpoint) self.assertEqual('5D0034A368E0ABAF663D21847E1C9B6CFA09752A', event.endpoint_fingerprint) self.assertEqual(None, event.endpoint_nickname) self.assertEqual(GuardStatus.GOOD, event.status) event = _get_event(GUARD_BAD) self.assertEqual(GuardType.ENTRY, event.guard_type) self.assertEqual('$5D0034A368E0ABAF663D21847E1C9B6CFA09752A=caerSidi', event.endpoint) self.assertEqual('5D0034A368E0ABAF663D21847E1C9B6CFA09752A', event.endpoint_fingerprint) self.assertEqual('caerSidi', event.endpoint_nickname) self.assertEqual(GuardStatus.BAD, event.status) def test_hs_desc_event(self): event = _get_event(HS_DESC_EVENT) self.assertTrue(isinstance(event, stem.response.events.HSDescEvent)) self.assertEqual(HS_DESC_EVENT.lstrip('650 '), str(event)) self.assertEqual(HSDescAction.REQUESTED, event.action) self.assertEqual('ajhb7kljbiru65qo', event.address) self.assertEqual(HSAuth.NO_AUTH, event.authentication) self.assertEqual('$67B2BDA4264D8A189D9270E28B1D30A262838243=europa1', event.directory) self.assertEqual('67B2BDA4264D8A189D9270E28B1D30A262838243', event.directory_fingerprint) self.assertEqual('europa1', event.directory_nickname) self.assertEqual('b3oeducbhjmbqmgw2i3jtz4fekkrinwj', event.descriptor_id) self.assertEqual(None, event.reason) event = _get_event(HS_DESC_NO_DESC_ID) self.assertEqual('$67B2BDA4264D8A189D9270E28B1D30A262838243', event.directory) self.assertEqual('67B2BDA4264D8A189D9270E28B1D30A262838243', event.directory_fingerprint) self.assertEqual(None, event.directory_nickname) self.assertEqual(None, event.descriptor_id) self.assertEqual(None, event.reason) event = _get_event(HS_DESC_NOT_FOUND) self.assertEqual('UNKNOWN', event.directory) self.assertEqual(None, event.directory_fingerprint) self.assertEqual(None, event.directory_nickname) self.assertEqual(None, event.descriptor_id) self.assertEqual(None, event.reason) event = _get_event(HS_DESC_FAILED) self.assertTrue(isinstance(event, stem.response.events.HSDescEvent)) self.assertEqual(HS_DESC_FAILED.lstrip('650 '), str(event)) self.assertEqual(HSDescAction.FAILED, event.action) self.assertEqual('ajhb7kljbiru65qo', event.address) self.assertEqual(HSAuth.NO_AUTH, event.authentication) self.assertEqual('$67B2BDA4264D8A189D9270E28B1D30A262838243', event.directory) self.assertEqual('67B2BDA4264D8A189D9270E28B1D30A262838243', event.directory_fingerprint) self.assertEqual(None, event.directory_nickname) self.assertEqual('b3oeducbhjmbqmgw2i3jtz4fekkrinwj', event.descriptor_id) self.assertEqual(HSDescReason.NOT_FOUND, event.reason) def test_hs_desc_content_event(self): event = _get_event(HS_DESC_CONTENT_EVENT) self.assertTrue(isinstance(event, stem.response.events.HSDescContentEvent)) self.assertEqual('facebookcorewwwi', event.address) self.assertEqual('riwvyw6njgvs4koel4heqs7w4bssnmlw', event.descriptor_id) self.assertEqual('$8A30C9E8F5954EE286D29BD65CADEA6991200804~YorkshireTOR', event.directory) self.assertEqual('8A30C9E8F5954EE286D29BD65CADEA6991200804', event.directory_fingerprint) self.assertEqual('YorkshireTOR', event.directory_nickname) desc = event.descriptor self.assertEqual('riwvyw6njgvs4koel4heqs7w4bssnmlw', desc.descriptor_id) self.assertEqual(2, desc.version) self.assertTrue('MIGJAoGBALf' in desc.permanent_key) self.assertEqual('vnb2j6ftvkvghypd4yyypsl3qmpjyq3j', desc.secret_id_part) self.assertEqual(datetime.datetime(2015, 3, 13, 19, 0, 0), desc.published) self.assertEqual([2, 3], desc.protocol_versions) self.assertEqual(3, len(desc.introduction_points())) self.assertTrue('s9Z0zWHsoPu' in desc.signature) event = _get_event(HS_DESC_CONTENT_EMPTY_EVENT) self.assertTrue(isinstance(event, stem.response.events.HSDescContentEvent)) self.assertEqual('3g2upl4pq6kufc4n', event.address) self.assertEqual('255tjwttk3wi7r2df57nuprs72j2daa3', event.descriptor_id) self.assertEqual('$D7A0C3262724F2BC9646F6836E967A2777A3AF83~tsunaminitor', event.directory) self.assertEqual('D7A0C3262724F2BC9646F6836E967A2777A3AF83', event.directory_fingerprint) self.assertEqual('tsunaminitor', event.directory_nickname) self.assertEqual(None, event.descriptor) def test_newdesc_event(self): event = _get_event(NEWDESC_SINGLE) expected_relays = (('B3FA3110CC6F42443F039220C134CBD2FC4F0493', 'Sakura'),) self.assertTrue(isinstance(event, stem.response.events.NewDescEvent)) self.assertEqual(NEWDESC_SINGLE.lstrip('650 '), str(event)) self.assertEqual(expected_relays, event.relays) event = _get_event(NEWDESC_MULTIPLE) expected_relays = (('BE938957B2CA5F804B3AFC2C1EE6673170CDBBF8', 'Moonshine'), ('B4BE08B22D4D2923EDC3970FD1B93D0448C6D8FF', 'Unnamed')) self.assertTrue(isinstance(event, stem.response.events.NewDescEvent)) self.assertEqual(NEWDESC_MULTIPLE.lstrip('650 '), str(event)) self.assertEqual(expected_relays, event.relays) def test_network_liveness_event(self): event = _get_event('650 NETWORK_LIVENESS UP') self.assertTrue(isinstance(event, stem.response.events.NetworkLivenessEvent)) self.assertEqual('NETWORK_LIVENESS UP', str(event)) self.assertEqual('UP', event.status) event = _get_event('650 NETWORK_LIVENESS DOWN') self.assertEqual('DOWN', event.status) event = _get_event('650 NETWORK_LIVENESS OTHER_STATUS key=value') self.assertEqual('OTHER_STATUS', event.status) def test_new_consensus_event(self): expected_desc = [] expected_desc.append(RouterStatusEntryV3.create({ 'r': 'Beaver /96bKo4soysolMgKn5Hex2nyFSY pAJH9dSBp/CG6sPhhVY/5bLaVPM 2012-12-02 22:02:45 77.223.43.54 9001 0', 's': 'Fast Named Running Stable Valid', })) expected_desc.append(RouterStatusEntryV3.create({ 'r': 'Unnamed /+fJRWjmIGNAL2C5rRZHq3R91tA 7AnpZjfdBpYzXnMNm+w1bTsFF6Y 2012-12-02 17:51:10 91.121.184.87 9001 0', 's': 'Fast Guard Running Stable Valid', })) event = _get_event(NEWCONSENSUS_EVENT) self.assertTrue(isinstance(event, stem.response.events.NewConsensusEvent)) self.assertEqual(expected_desc, event.desc) def test_ns_event(self): expected_desc = RouterStatusEntryV3.create({ 'r': 'whnetz dbBxYcJriTTrcxsuy4PUZcMRwCA VStM7KAIH/mXXoGDUpoGB1OXufg 2012-12-02 21:03:56 141.70.120.13 9001 9030', 's': 'Fast HSDir Named Stable V2Dir Valid', }) event = _get_event(NS_EVENT) self.assertTrue(isinstance(event, stem.response.events.NetworkStatusEvent)) self.assertEqual([expected_desc], event.desc) def test_orconn_event(self): event = _get_event(ORCONN_CLOSED) self.assertTrue(isinstance(event, stem.response.events.ORConnEvent)) self.assertEqual(ORCONN_CLOSED.lstrip('650 '), str(event)) self.assertEqual('$A1130635A0CDA6F60C276FBF6994EFBD4ECADAB1~tama', event.endpoint) self.assertEqual('A1130635A0CDA6F60C276FBF6994EFBD4ECADAB1', event.endpoint_fingerprint) self.assertEqual('tama', event.endpoint_nickname) self.assertEqual(None, event.endpoint_address) self.assertEqual(None, event.endpoint_port) self.assertEqual(ORStatus.CLOSED, event.status) self.assertEqual(ORClosureReason.DONE, event.reason) self.assertEqual(None, event.circ_count) self.assertEqual(None, event.id) event = _get_event(ORCONN_CONNECTED) self.assertTrue(isinstance(event, stem.response.events.ORConnEvent)) self.assertEqual(ORCONN_CONNECTED.lstrip('650 '), str(event)) self.assertEqual('127.0.0.1:9000', event.endpoint) self.assertEqual(None, event.endpoint_fingerprint) self.assertEqual(None, event.endpoint_nickname) self.assertEqual('127.0.0.1', event.endpoint_address) self.assertEqual(9000, event.endpoint_port) self.assertEqual(ORStatus.CONNECTED, event.status) self.assertEqual(None, event.reason) self.assertEqual(20, event.circ_count) self.assertEqual('18', event.id) event = _get_event(ORCONN_LAUNCHED) self.assertTrue(isinstance(event, stem.response.events.ORConnEvent)) self.assertEqual(ORCONN_LAUNCHED.lstrip('650 '), str(event)) self.assertEqual('$7ED90E2833EE38A75795BA9237B0A4560E51E1A0=GreenDragon', event.endpoint) self.assertEqual('7ED90E2833EE38A75795BA9237B0A4560E51E1A0', event.endpoint_fingerprint) self.assertEqual('GreenDragon', event.endpoint_nickname) self.assertEqual(None, event.endpoint_address) self.assertEqual(None, event.endpoint_port) self.assertEqual(ORStatus.LAUNCHED, event.status) self.assertEqual(None, event.reason) self.assertEqual(None, event.circ_count) # malformed fingerprint self.assertRaises(ProtocolError, _get_event, ORCONN_BAD_1) # invalid port number ('001') self.assertRaises(ProtocolError, _get_event, ORCONN_BAD_2) # non-numeric NCIRCS self.assertRaises(ProtocolError, _get_event, ORCONN_BAD_3) # invalid connection id self.assertRaises(ProtocolError, _get_event, ORCONN_BAD_4) def test_signal_event(self): event = _get_event('650 SIGNAL DEBUG') self.assertTrue(isinstance(event, stem.response.events.SignalEvent)) self.assertEqual('SIGNAL DEBUG', str(event)) self.assertEqual(Signal.DEBUG, event.signal) event = _get_event('650 SIGNAL DUMP') self.assertEqual(Signal.DUMP, event.signal) def test_status_event_consensus_arrived(self): event = _get_event(STATUS_GENERAL_CONSENSUS_ARRIVED) self.assertTrue(isinstance(event, stem.response.events.StatusEvent)) self.assertEqual(STATUS_GENERAL_CONSENSUS_ARRIVED.lstrip('650 '), str(event)) self.assertEqual(StatusType.GENERAL, event.status_type) self.assertEqual(Runlevel.NOTICE, event.runlevel) self.assertEqual('CONSENSUS_ARRIVED', event.action) def test_status_event_enough_dir_info(self): event = _get_event(STATUS_CLIENT_ENOUGH_DIR_INFO) self.assertEqual(StatusType.CLIENT, event.status_type) self.assertEqual(Runlevel.NOTICE, event.runlevel) self.assertEqual('ENOUGH_DIR_INFO', event.action) def test_status_event_circuit_established(self): event = _get_event(STATUS_CLIENT_CIRC_ESTABLISHED) self.assertEqual(StatusType.CLIENT, event.status_type) self.assertEqual(Runlevel.NOTICE, event.runlevel) self.assertEqual('CIRCUIT_ESTABLISHED', event.action) def test_status_event_bootstrap_descriptors(self): event = _get_event(STATUS_CLIENT_BOOTSTRAP_DESCRIPTORS) self.assertEqual(StatusType.CLIENT, event.status_type) self.assertEqual(Runlevel.NOTICE, event.runlevel) self.assertEqual('BOOTSTRAP', event.action) expected_attr = { 'PROGRESS': '53', 'TAG': 'loading_descriptors', 'SUMMARY': 'Loading relay descriptors', } self.assertEqual(expected_attr, event.arguments) def test_status_event_bootstrap_stuck(self): event = _get_event(STATUS_CLIENT_BOOTSTRAP_STUCK) self.assertEqual(StatusType.CLIENT, event.status_type) self.assertEqual(Runlevel.WARN, event.runlevel) self.assertEqual('BOOTSTRAP', event.action) expected_attr = { 'PROGRESS': '80', 'TAG': 'conn_or', 'SUMMARY': 'Connecting to the Tor network', 'WARNING': 'Network is unreachable', 'REASON': 'NOROUTE', 'COUNT': '5', 'RECOMMENDATION': 'warn', } self.assertEqual(expected_attr, event.keyword_args) def test_status_event_bootstrap_connecting(self): event = _get_event(STATUS_CLIENT_BOOTSTRAP_CONNECTING) self.assertEqual(StatusType.CLIENT, event.status_type) self.assertEqual(Runlevel.NOTICE, event.runlevel) self.assertEqual('BOOTSTRAP', event.action) expected_attr = { 'PROGRESS': '80', 'TAG': 'conn_or', 'SUMMARY': 'Connecting to the Tor network', } self.assertEqual(expected_attr, event.keyword_args) def test_status_event_bootstrap_first_handshake(self): event = _get_event(STATUS_CLIENT_BOOTSTRAP_FIRST_HANDSHAKE) self.assertEqual(StatusType.CLIENT, event.status_type) self.assertEqual(Runlevel.NOTICE, event.runlevel) self.assertEqual('BOOTSTRAP', event.action) expected_attr = { 'PROGRESS': '85', 'TAG': 'handshake_or', 'SUMMARY': 'Finishing handshake with first hop', } self.assertEqual(expected_attr, event.keyword_args) def test_status_event_bootstrap_established(self): event = _get_event(STATUS_CLIENT_BOOTSTRAP_ESTABLISHED) self.assertEqual(StatusType.CLIENT, event.status_type) self.assertEqual(Runlevel.NOTICE, event.runlevel) self.assertEqual('BOOTSTRAP', event.action) expected_attr = { 'PROGRESS': '90', 'TAG': 'circuit_create', 'SUMMARY': 'Establishing a Tor circuit', } self.assertEqual(expected_attr, event.keyword_args) def test_status_event_bootstrap_done(self): event = _get_event(STATUS_CLIENT_BOOTSTRAP_DONE) self.assertEqual(StatusType.CLIENT, event.status_type) self.assertEqual(Runlevel.NOTICE, event.runlevel) self.assertEqual('BOOTSTRAP', event.action) expected_attr = { 'PROGRESS': '100', 'TAG': 'done', 'SUMMARY': 'Done', } self.assertEqual(expected_attr, event.keyword_args) def test_status_event_bootstrap_check_reachability(self): event = _get_event(STATUS_SERVER_CHECK_REACHABILITY) self.assertEqual(StatusType.SERVER, event.status_type) self.assertEqual(Runlevel.NOTICE, event.runlevel) self.assertEqual('CHECKING_REACHABILITY', event.action) expected_attr = { 'ORADDRESS': '71.35.143.230:9050', } self.assertEqual(expected_attr, event.keyword_args) def test_status_event_dns_timeout(self): event = _get_event(STATUS_SERVER_DNS_TIMEOUT) self.assertEqual(StatusType.SERVER, event.status_type) self.assertEqual(Runlevel.NOTICE, event.runlevel) self.assertEqual('NAMESERVER_STATUS', event.action) expected_attr = { 'NS': '205.171.3.25', 'STATUS': 'DOWN', 'ERR': 'request timed out.', } self.assertEqual(expected_attr, event.keyword_args) def test_status_event_dns_down(self): event = _get_event(STATUS_SERVER_DNS_DOWN) self.assertEqual(StatusType.SERVER, event.status_type) self.assertEqual(Runlevel.WARN, event.runlevel) self.assertEqual('NAMESERVER_ALL_DOWN', event.action) def test_status_event_dns_up(self): event = _get_event(STATUS_SERVER_DNS_UP) self.assertEqual(StatusType.SERVER, event.status_type) self.assertEqual(Runlevel.NOTICE, event.runlevel) self.assertEqual('NAMESERVER_STATUS', event.action) expected_attr = { 'NS': '205.171.3.25', 'STATUS': 'UP', } self.assertEqual(expected_attr, event.keyword_args) def test_status_event_bug(self): # briefly insert a fake value in EVENT_TYPE_TO_CLASS stem.response.events.EVENT_TYPE_TO_CLASS['STATUS_SPECIFIC'] = stem.response.events.StatusEvent self.assertRaises(ValueError, _get_event, STATUS_SPECIFIC_CONSENSUS_ARRIVED) del stem.response.events.EVENT_TYPE_TO_CLASS['STATUS_SPECIFIC'] def test_stream_event(self): event = _get_event(STREAM_NEW) self.assertTrue(isinstance(event, stem.response.events.StreamEvent)) self.assertEqual(STREAM_NEW.lstrip('650 '), str(event)) self.assertEqual('18', event.id) self.assertEqual(StreamStatus.NEW, event.status) self.assertEqual(None, event.circ_id) self.assertEqual('encrypted.google.com:443', event.target) self.assertEqual('encrypted.google.com', event.target_address) self.assertEqual(443, event.target_port) self.assertEqual(None, event.reason) self.assertEqual(None, event.remote_reason) self.assertEqual(None, event.source) self.assertEqual('127.0.0.1:47849', event.source_addr) self.assertEqual('127.0.0.1', event.source_address) self.assertEqual(47849, event.source_port) self.assertEqual(StreamPurpose.USER, event.purpose) event = _get_event(STREAM_SENTCONNECT) self.assertTrue(isinstance(event, stem.response.events.StreamEvent)) self.assertEqual(STREAM_SENTCONNECT.lstrip('650 '), str(event)) self.assertEqual('18', event.id) self.assertEqual(StreamStatus.SENTCONNECT, event.status) self.assertEqual('26', event.circ_id) self.assertEqual('encrypted.google.com:443', event.target) self.assertEqual('encrypted.google.com', event.target_address) self.assertEqual(443, event.target_port) self.assertEqual(None, event.reason) self.assertEqual(None, event.remote_reason) self.assertEqual(None, event.source) self.assertEqual(None, event.source_addr) self.assertEqual(None, event.source_address) self.assertEqual(None, event.source_port) self.assertEqual(None, event.purpose) event = _get_event(STREAM_REMAP) self.assertTrue(isinstance(event, stem.response.events.StreamEvent)) self.assertEqual(STREAM_REMAP.lstrip('650 '), str(event)) self.assertEqual('18', event.id) self.assertEqual(StreamStatus.REMAP, event.status) self.assertEqual('26', event.circ_id) self.assertEqual('74.125.227.129:443', event.target) self.assertEqual('74.125.227.129', event.target_address) self.assertEqual(443, event.target_port) self.assertEqual(None, event.reason) self.assertEqual(None, event.remote_reason) self.assertEqual(StreamSource.EXIT, event.source) self.assertEqual(None, event.source_addr) self.assertEqual(None, event.source_address) self.assertEqual(None, event.source_port) self.assertEqual(None, event.purpose) event = _get_event(STREAM_SUCCEEDED) self.assertTrue(isinstance(event, stem.response.events.StreamEvent)) self.assertEqual(STREAM_SUCCEEDED.lstrip('650 '), str(event)) self.assertEqual('18', event.id) self.assertEqual(StreamStatus.SUCCEEDED, event.status) self.assertEqual('26', event.circ_id) self.assertEqual('74.125.227.129:443', event.target) self.assertEqual('74.125.227.129', event.target_address) self.assertEqual(443, event.target_port) self.assertEqual(None, event.reason) self.assertEqual(None, event.remote_reason) self.assertEqual(None, event.source) self.assertEqual(None, event.source_addr) self.assertEqual(None, event.source_address) self.assertEqual(None, event.source_port) self.assertEqual(None, event.purpose) event = _get_event(STREAM_CLOSED_RESET) self.assertTrue(isinstance(event, stem.response.events.StreamEvent)) self.assertEqual(STREAM_CLOSED_RESET.lstrip('650 '), str(event)) self.assertEqual('21', event.id) self.assertEqual(StreamStatus.CLOSED, event.status) self.assertEqual('26', event.circ_id) self.assertEqual('74.125.227.129:443', event.target) self.assertEqual('74.125.227.129', event.target_address) self.assertEqual(443, event.target_port) self.assertEqual(StreamClosureReason.CONNRESET, event.reason) self.assertEqual(None, event.remote_reason) self.assertEqual(None, event.source) self.assertEqual(None, event.source_addr) self.assertEqual(None, event.source_address) self.assertEqual(None, event.source_port) self.assertEqual(None, event.purpose) event = _get_event(STREAM_CLOSED_DONE) self.assertTrue(isinstance(event, stem.response.events.StreamEvent)) self.assertEqual(STREAM_CLOSED_DONE.lstrip('650 '), str(event)) self.assertEqual('25', event.id) self.assertEqual(StreamStatus.CLOSED, event.status) self.assertEqual('26', event.circ_id) self.assertEqual('199.7.52.72:80', event.target) self.assertEqual('199.7.52.72', event.target_address) self.assertEqual(80, event.target_port) self.assertEqual(StreamClosureReason.DONE, event.reason) self.assertEqual(None, event.remote_reason) self.assertEqual(None, event.source) self.assertEqual(None, event.source_addr) self.assertEqual(None, event.source_address) self.assertEqual(None, event.source_port) self.assertEqual(None, event.purpose) event = _get_event(STREAM_DIR_FETCH) self.assertTrue(isinstance(event, stem.response.events.StreamEvent)) self.assertEqual(STREAM_DIR_FETCH.lstrip('650 '), str(event)) self.assertEqual('14', event.id) self.assertEqual(StreamStatus.NEW, event.status) self.assertEqual(None, event.circ_id) self.assertEqual('176.28.51.238.$649F2D0ACF418F7CFC6539AB2257EB2D5297BAFA.exit:443', event.target) self.assertEqual('176.28.51.238.$649F2D0ACF418F7CFC6539AB2257EB2D5297BAFA.exit', event.target_address) self.assertEqual(443, event.target_port) self.assertEqual(None, event.reason) self.assertEqual(None, event.remote_reason) self.assertEqual(None, event.source) self.assertEqual('(Tor_internal):0', event.source_addr) self.assertEqual('(Tor_internal)', event.source_address) self.assertEqual(0, event.source_port) self.assertEqual(StreamPurpose.DIR_FETCH, event.purpose) event = _get_event(STREAM_DNS_REQUEST) self.assertTrue(isinstance(event, stem.response.events.StreamEvent)) self.assertEqual(STREAM_DNS_REQUEST.lstrip('650 '), str(event)) self.assertEqual('1113', event.id) self.assertEqual(StreamStatus.NEW, event.status) self.assertEqual(None, event.circ_id) self.assertEqual('www.google.com:0', event.target) self.assertEqual('www.google.com', event.target_address) self.assertEqual(0, event.target_port) self.assertEqual(None, event.reason) self.assertEqual(None, event.remote_reason) self.assertEqual(None, event.source) self.assertEqual('127.0.0.1:15297', event.source_addr) self.assertEqual('127.0.0.1', event.source_address) self.assertEqual(15297, event.source_port) self.assertEqual(StreamPurpose.DNS_REQUEST, event.purpose) # missing target self.assertRaises(ProtocolError, _get_event, STREAM_SENTCONNECT_BAD_1) # target is missing a port self.assertRaises(ProtocolError, _get_event, STREAM_SENTCONNECT_BAD_2) # target's port is malformed self.assertRaises(ProtocolError, _get_event, STREAM_SENTCONNECT_BAD_3) # SOURCE_ADDR is missing a port self.assertRaises(ProtocolError, _get_event, STREAM_DNS_REQUEST_BAD_1) # SOURCE_ADDR's port is malformed self.assertRaises(ProtocolError, _get_event, STREAM_DNS_REQUEST_BAD_2) # IPv6 address event = _get_event(STREAM_NEWRESOLVE_IP6) self.assertTrue(isinstance(event, stem.response.events.StreamEvent)) self.assertEqual(STREAM_NEWRESOLVE_IP6.lstrip('650 '), str(event)) self.assertEqual('23', event.id) self.assertEqual(StreamStatus.NEWRESOLVE, event.status) self.assertEqual(None, event.circ_id) self.assertEqual('2001:db8::1:0', event.target) self.assertEqual('2001:db8::1', event.target_address) self.assertEqual(0, event.target_port) self.assertEqual(None, event.reason) self.assertEqual(None, event.remote_reason) self.assertEqual(None, event.source) self.assertEqual(None, event.source_addr) self.assertEqual(None, event.source_address) self.assertEqual(None, event.source_port) self.assertEqual(StreamPurpose.DNS_REQUEST, event.purpose) def test_stream_bw_event(self): event = _get_event('650 STREAM_BW 2 15 25') self.assertTrue(isinstance(event, stem.response.events.StreamBwEvent)) self.assertEqual('2', event.id) self.assertEqual(15, event.written) self.assertEqual(25, event.read) self.assertEqual(None, event.time) event = _get_event('650 STREAM_BW Stream02 0 0') self.assertEqual('Stream02', event.id) self.assertEqual(0, event.written) self.assertEqual(0, event.read) self.assertEqual(None, event.time) event = _get_event('650 STREAM_BW Stream02 0 0 2012-12-06T13:51:11.433755') self.assertEqual('Stream02', event.id) self.assertEqual(0, event.written) self.assertEqual(0, event.read) self.assertEqual(datetime.datetime(2012, 12, 6, 13, 51, 11, 433755), event.time) self.assertRaises(ProtocolError, _get_event, '650 STREAM_BW') self.assertRaises(ProtocolError, _get_event, '650 STREAM_BW 2') self.assertRaises(ProtocolError, _get_event, '650 STREAM_BW 2 15') self.assertRaises(ProtocolError, _get_event, '650 STREAM_BW - 15 25') self.assertRaises(ProtocolError, _get_event, '650 STREAM_BW 12345678901234567 15 25') self.assertRaises(ProtocolError, _get_event, '650 STREAM_BW 2 -15 25') self.assertRaises(ProtocolError, _get_event, '650 STREAM_BW 2 15 -25') self.assertRaises(ProtocolError, _get_event, '650 STREAM_BW 2 x 25') def test_transport_launched_event(self): event = _get_event(TRANSPORT_LAUNCHED) self.assertTrue(isinstance(event, stem.response.events.TransportLaunchedEvent)) self.assertEqual(TRANSPORT_LAUNCHED.lstrip('650 '), str(event)) self.assertEqual('server', event.type) self.assertEqual('obfs1', event.name) self.assertEqual('127.0.0.1', event.address) self.assertEqual(1111, event.port) self.assertRaises(ProtocolError, _get_event, TRANSPORT_LAUNCHED_BAD_TYPE) self.assertRaises(ProtocolError, _get_event, TRANSPORT_LAUNCHED_BAD_ADDRESS) self.assertRaises(ProtocolError, _get_event, TRANSPORT_LAUNCHED_BAD_PORT) def test_conn_bw_event(self): event = _get_event(CONN_BW) self.assertTrue(isinstance(event, stem.response.events.ConnectionBandwidthEvent)) self.assertEqual(CONN_BW.lstrip('650 '), str(event)) self.assertEqual('11', event.id) self.assertEqual(stem.ConnectionType.DIR, event.conn_type) self.assertEqual(272, event.read) self.assertEqual(817, event.written) self.assertRaises(ProtocolError, _get_event, CONN_BW_BAD_WRITTEN_VALUE) self.assertRaises(ProtocolError, _get_event, CONN_BW_BAD_MISSING_ID) def test_circ_bw_event(self): event = _get_event(CIRC_BW) self.assertTrue(isinstance(event, stem.response.events.CircuitBandwidthEvent)) self.assertEqual(CIRC_BW.lstrip('650 '), str(event)) self.assertEqual('11', event.id) self.assertEqual(272, event.read) self.assertEqual(817, event.written) self.assertEqual(None, event.time) event = _get_event(CIRC_BW_WITH_TIMESTAMP) self.assertEqual('11', event.id) self.assertEqual(272, event.read) self.assertEqual(817, event.written) self.assertEqual(datetime.datetime(2012, 12, 6, 13, 51, 11, 433755), event.time) event = _get_event(CIRC_BW_WITH_EXTRA_COUNTS) self.assertEqual('11', event.id) self.assertEqual(272, event.read) self.assertEqual(817, event.written) self.assertEqual(datetime.datetime(2012, 12, 6, 13, 51, 11, 433755), event.time) self.assertEqual(12, event.delivered_read) self.assertEqual(56, event.delivered_written) self.assertEqual(34, event.overhead_read) self.assertEqual(78, event.overhead_written) self.assertRaises(ProtocolError, _get_event, CIRC_BW_BAD_WRITTEN_VALUE) self.assertRaises(ProtocolError, _get_event, CIRC_BW_BAD_MISSING_ID) self.assertRaises(ProtocolError, _get_event, CIRC_BW_MALFORMED_TIMESTAMP) def test_cell_stats_event(self): event = _get_event(CELL_STATS_1) self.assertTrue(isinstance(event, stem.response.events.CellStatsEvent)) self.assertEqual(CELL_STATS_1.lstrip('650 '), str(event)) self.assertEqual('14', event.id) self.assertEqual(None, event.inbound_queue) self.assertEqual(None, event.inbound_connection) self.assertEqual(None, event.inbound_added) self.assertEqual(None, event.inbound_removed) self.assertEqual(None, event.inbound_time) self.assertEqual('19403', event.outbound_queue) self.assertEqual('15', event.outbound_connection) self.assertEqual({'create_fast': 1, 'relay_early': 2}, event.outbound_added) self.assertEqual({'create_fast': 1, 'relay_early': 2}, event.outbound_removed) self.assertEqual({'create_fast': 0, 'relay_early': 0}, event.outbound_time) event = _get_event(CELL_STATS_2) self.assertTrue(isinstance(event, stem.response.events.CellStatsEvent)) self.assertEqual(CELL_STATS_2.lstrip('650 '), str(event)) self.assertEqual(None, event.id) self.assertEqual('19403', event.inbound_queue) self.assertEqual('32', event.inbound_connection) self.assertEqual({'relay': 1, 'created_fast': 1}, event.inbound_added) self.assertEqual({'relay': 1, 'created_fast': 1}, event.inbound_removed) self.assertEqual({'relay': 0, 'created_fast': 0}, event.inbound_time) self.assertEqual('6710', event.outbound_queue) self.assertEqual('18', event.outbound_connection) self.assertEqual({'create': 1, 'relay_early': 1}, event.outbound_added) self.assertEqual({'create': 1, 'relay_early': 1}, event.outbound_removed) self.assertEqual({'create': 0, 'relay_early': 0}, event.outbound_time) # check a few invalid mappings (bad key or value) self.assertRaises(ProtocolError, _get_event, CELL_STATS_BAD_1) self.assertRaises(ProtocolError, _get_event, CELL_STATS_BAD_2) self.assertRaises(ProtocolError, _get_event, CELL_STATS_BAD_3) def test_token_bucket_empty_event(self): event = _get_event(TB_EMPTY_1) self.assertTrue(isinstance(event, stem.response.events.TokenBucketEmptyEvent)) self.assertEqual(TB_EMPTY_1.lstrip('650 '), str(event)) self.assertEqual(stem.TokenBucket.ORCONN, event.bucket) self.assertEqual('16', event.id) self.assertEqual(0, event.read) self.assertEqual(0, event.written) self.assertEqual(100, event.last_refill) event = _get_event(TB_EMPTY_2) self.assertTrue(isinstance(event, stem.response.events.TokenBucketEmptyEvent)) self.assertEqual(TB_EMPTY_2.lstrip('650 '), str(event)) self.assertEqual(stem.TokenBucket.GLOBAL, event.bucket) self.assertEqual(None, event.id) self.assertEqual(93, event.read) self.assertEqual(93, event.written) self.assertEqual(100, event.last_refill) event = _get_event(TB_EMPTY_3) self.assertTrue(isinstance(event, stem.response.events.TokenBucketEmptyEvent)) self.assertEqual(TB_EMPTY_3.lstrip('650 '), str(event)) self.assertEqual(stem.TokenBucket.RELAY, event.bucket) self.assertEqual(None, event.id) self.assertEqual(93, event.read) self.assertEqual(93, event.written) self.assertEqual(100, event.last_refill) self.assertRaises(ProtocolError, _get_event, TB_EMPTY_BAD_1) self.assertRaises(ProtocolError, _get_event, TB_EMPTY_BAD_2) def test_unrecognized_enum_logging(self): """ Checks that when event parsing gets a value that isn't recognized by stem's enumeration of the attribute that we log a message. """ stem_logger = stem.util.log.get_logger() logging_buffer = stem.util.log.LogBuffer(stem.util.log.INFO) stem_logger.addHandler(logging_buffer) # Try parsing a valid event. We shouldn't log anything. _get_event(STATUS_GENERAL_CONSENSUS_ARRIVED) self.assertTrue(logging_buffer.is_empty()) self.assertEqual([], list(logging_buffer)) # Parse an invalid runlevel. _get_event(STATUS_GENERAL_CONSENSUS_ARRIVED.replace('NOTICE', 'OMEGA_CRITICAL!!!')) logged_events = list(logging_buffer) self.assertEqual(1, len(logged_events)) self.assertTrue('STATUS_GENERAL event had an unrecognized runlevel' in logged_events[0]) stem_logger.removeHandler(logging_buffer) stem-1.7.1/test/unit/exit_policy/0000775000175000017500000000000013411004021017462 5ustar atagaratagar00000000000000stem-1.7.1/test/unit/exit_policy/rule.py0000664000175000017500000003377213341474573021050 0ustar atagaratagar00000000000000""" Unit tests for the stem.exit_policy.ExitPolicyRule class. """ import unittest from stem.exit_policy import AddressType, ExitPolicyRule, MicroExitPolicy class TestExitPolicyRule(unittest.TestCase): def test_accept_or_reject(self): self.assertTrue(ExitPolicyRule('accept *:*').is_accept) self.assertFalse(ExitPolicyRule('reject *:*').is_accept) invalid_inputs = ( 'accept', 'reject', 'accept\t*:*', 'accept\n*:*', 'acceptt *:*', 'rejectt *:*', 'blarg *:*', ' *:*', '*:*', '', ) for rule_arg in invalid_inputs: self.assertRaises(ValueError, ExitPolicyRule, rule_arg) def test_with_multiple_spaces(self): rule = ExitPolicyRule('accept *:80') self.assertEqual('accept *:80', str(rule)) policy = MicroExitPolicy('accept 80,443') self.assertTrue(policy.can_exit_to('75.119.206.243', 80)) def test_str_unchanged(self): # provides a series of test inputs where the str() representation should # match the input rule test_inputs = ( 'accept *:*', 'reject *:*', 'accept *:80', 'accept *:80-443', 'accept 127.0.0.1:80', 'accept 87.0.0.1/24:80', 'accept 156.5.38.3/255.255.0.255:80', 'accept [FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF]:80', 'accept [FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF]/32:80', ) for rule_arg in test_inputs: rule = ExitPolicyRule(rule_arg) self.assertEqual(rule_arg, str(rule)) def test_str_changed(self): # some instances where our rule is valid but won't match our str() representation test_inputs = { 'accept 10.0.0.1/32:80': 'accept 10.0.0.1:80', 'accept 192.168.0.1/255.255.255.0:80': 'accept 192.168.0.1/24:80', 'accept [::]/32:*': 'accept [0000:0000:0000:0000:0000:0000:0000:0000]/32:*', 'accept [::]/128:*': 'accept [0000:0000:0000:0000:0000:0000:0000:0000]:*', 'accept6 *:*': 'accept [0000:0000:0000:0000:0000:0000:0000:0000]/0:*', 'reject6 *:*': 'reject [0000:0000:0000:0000:0000:0000:0000:0000]/0:*', 'accept6 [FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF]:*': 'accept [FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF]:*', 'reject6 [FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF]:*': 'reject [FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF]:*', 'accept *4:*': 'accept 0.0.0.0/0:*', 'accept *6:*': 'accept [0000:0000:0000:0000:0000:0000:0000:0000]/0:*', 'accept6 *4:*': 'accept 0.0.0.0/0:*', 'accept6 *6:*': 'accept [0000:0000:0000:0000:0000:0000:0000:0000]/0:*', } for rule_arg, expected_str in test_inputs.items(): rule = ExitPolicyRule(rule_arg) self.assertEqual(expected_str, str(rule)) def test_valid_wildcard(self): test_inputs = { 'reject *:*': (True, True), 'reject *:80': (True, False), 'accept 192.168.0.1:*': (False, True), 'accept 192.168.0.1:80': (False, False), 'reject *4:*': (False, True), 'reject *6:*': (False, True), 'reject6 *4:*': (False, True), 'reject6 *6:*': (False, True), 'reject 127.0.0.1/0:*': (False, True), 'reject 127.0.0.1/0.0.0.0:*': (False, True), 'reject 127.0.0.1/16:*': (False, True), 'reject 127.0.0.1/32:*': (False, True), 'reject [0000:0000:0000:0000:0000:0000:0000:0000]/0:80': (False, False), 'reject [0000:0000:0000:0000:0000:0000:0000:0000]/64:80': (False, False), 'reject [0000:0000:0000:0000:0000:0000:0000:0000]/128:80': (False, False), 'reject6 *:*': (False, True), 'reject6 *:80': (False, False), 'reject6 [0000:0000:0000:0000:0000:0000:0000:0000]/128:80': (False, False), 'accept 192.168.0.1:0-65535': (False, True), 'accept 192.168.0.1:1-65535': (False, True), 'accept 192.168.0.1:2-65535': (False, False), 'accept 192.168.0.1:1-65534': (False, False), } for rule_arg, attr in test_inputs.items(): is_address_wildcard, is_port_wildcard = attr rule = ExitPolicyRule(rule_arg) self.assertEqual(is_address_wildcard, rule.is_address_wildcard(), '%s (wildcard expected %s and actually %s)' % (rule_arg, is_address_wildcard, rule.is_address_wildcard())) self.assertEqual(is_port_wildcard, rule.is_port_wildcard()) # check that when appropriate a /0 is reported as *not* being a wildcard rule = ExitPolicyRule('reject 127.0.0.1/0:*') rule._submask_wildcard = False self.assertEqual(False, rule.is_address_wildcard()) rule = ExitPolicyRule('reject [0000:0000:0000:0000:0000:0000:0000:0000]/0:80') rule._submask_wildcard = False self.assertEqual(False, rule.is_address_wildcard()) def test_invalid_wildcard(self): test_inputs = ( 'reject */16:*', 'reject 127.0.0.1/*:*', 'reject *:0-*', 'reject *:*-15', ) for rule_arg in test_inputs: self.assertRaises(ValueError, ExitPolicyRule, rule_arg) def test_wildcard_attributes(self): rule = ExitPolicyRule('reject *:*') self.assertEqual(AddressType.WILDCARD, rule.get_address_type()) self.assertEqual(None, rule.address) self.assertEqual(None, rule.get_mask()) self.assertEqual(None, rule.get_masked_bits()) self.assertEqual(1, rule.min_port) self.assertEqual(65535, rule.max_port) def test_valid_ipv4_addresses(self): test_inputs = { '0.0.0.0': ('0.0.0.0', '255.255.255.255', 32), '127.0.0.1/32': ('127.0.0.1', '255.255.255.255', 32), '192.168.0.50/24': ('192.168.0.50', '255.255.255.0', 24), '255.255.255.255/0': ('255.255.255.255', '0.0.0.0', 0), } for rule_addr, attr in test_inputs.items(): address, mask, masked_bits = attr rule = ExitPolicyRule('accept %s:*' % rule_addr) self.assertEqual(AddressType.IPv4, rule.get_address_type()) self.assertEqual(address, rule.address) self.assertEqual(mask, rule.get_mask()) self.assertEqual(masked_bits, rule.get_masked_bits()) def test_invalid_ipv4_addresses(self): test_inputs = ( '256.0.0.0', '-1.0.0.0', '0.0.0', '0.0.0.', '0.0.0.a', '127.0.0.1/-1', '127.0.0.1/33', ) for rule_addr in test_inputs: self.assertRaises(ValueError, ExitPolicyRule, 'accept %s:*' % rule_addr) def test_valid_ipv6_addresses(self): test_inputs = { '[fe80:0000:0000:0000:0202:b3ff:fe1e:8329]': ('FE80:0000:0000:0000:0202:B3FF:FE1E:8329', 'FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF', 128), '[FE80::0202:b3ff:fe1e:8329]': ('FE80:0000:0000:0000:0202:B3FF:FE1E:8329', 'FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF', 128), '[0000:0000:0000:0000:0000:0000:0000:0000]/0': ('0000:0000:0000:0000:0000:0000:0000:0000', '0000:0000:0000:0000:0000:0000:0000:0000', 0), '[::]': ('0000:0000:0000:0000:0000:0000:0000:0000', 'FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF', 128), } for rule_addr, attr in test_inputs.items(): address, mask, masked_bits = attr rule = ExitPolicyRule('accept %s:*' % rule_addr) self.assertEqual(AddressType.IPv6, rule.get_address_type()) self.assertEqual(address, rule.address) self.assertEqual(mask, rule.get_mask()) self.assertEqual(masked_bits, rule.get_masked_bits()) def test_invalid_ipv6_addresses(self): test_inputs = ( 'fe80::0202:b3ff:fe1e:8329', '[fe80::0202:b3ff:fe1e:8329', 'fe80::0202:b3ff:fe1e:8329]', '[fe80::0202:b3ff:fe1e:832g]', '[fe80:::b3ff:fe1e:8329]', '[fe80::b3ff::fe1e:8329]', '[fe80::0202:b3ff:fe1e:8329]/-1', '[fe80::0202:b3ff:fe1e:8329]/129', ) for rule_addr in test_inputs: self.assertRaises(ValueError, ExitPolicyRule, 'accept %s:*' % rule_addr) def test_valid_ports(self): test_inputs = { '0': (0, 0), '1': (1, 1), '80': (80, 80), '80-443': (80, 443), } for rule_port, attr in test_inputs.items(): min_port, max_port = attr rule = ExitPolicyRule('accept 127.0.0.1:%s' % rule_port) self.assertEqual(min_port, rule.min_port) self.assertEqual(max_port, rule.max_port) def test_invalid_ports(self): test_inputs = ( '65536', 'a', '5-3', '5-', '-3', ) for rule_port in test_inputs: self.assertRaises(ValueError, ExitPolicyRule, 'accept 127.0.0.1:%s' % rule_port) def test_is_match_wildcard(self): test_inputs = { 'reject *:*': { ('192.168.0.1', 80): True, ('0.0.0.0', 80): True, ('255.255.255.255', 80): True, ('FE80:0000:0000:0000:0202:B3FF:FE1E:8329', 80): True, ('[FE80:0000:0000:0000:0202:B3FF:FE1E:8329]', 80): True, ('192.168.0.1', None): True, (None, 80, False): True, (None, 80, True): True, (None, None, False): True, (None, None, True): True, }, 'reject 255.255.255.255/0:*': { ('192.168.0.1', 80): True, ('0.0.0.0', 80): True, ('255.255.255.255', 80): True, ('FE80:0000:0000:0000:0202:B3FF:FE1E:8329', 80): False, ('[FE80:0000:0000:0000:0202:B3FF:FE1E:8329]', 80): False, ('192.168.0.1', None): True, (None, 80, False): False, (None, 80, True): True, (None, None, False): False, (None, None, True): True, }, 'reject *4:*': { ('192.168.0.1', 80): True, ('FE80:0000:0000:0000:0202:B3FF:FE1E:8329', 80): False, }, 'reject *6:*': { ('192.168.0.1', 80): False, ('FE80:0000:0000:0000:0202:B3FF:FE1E:8329', 80): True, }, } for rule_arg, matches in test_inputs.items(): rule = ExitPolicyRule(rule_arg) rule._submask_wildcard = False for match_args, expected_result in matches.items(): self.assertEqual(expected_result, rule.is_match(*match_args)) # port zero is special in that exit policies can include it, but it's not # something that we can match against rule = ExitPolicyRule('reject *:*') self.assertRaises(ValueError, rule.is_match, '127.0.0.1', 0) def test_is_match_ipv4(self): test_inputs = { 'reject 192.168.0.50:*': { ('192.168.0.50', 80): True, ('192.168.0.51', 80): False, ('192.168.0.49', 80): False, (None, 80, False): False, (None, 80, True): True, ('192.168.0.50', None): True, }, 'reject 0.0.0.0/24:*': { ('0.0.0.0', 80): True, ('0.0.0.1', 80): True, ('0.0.0.255', 80): True, ('0.0.1.0', 80): False, ('0.1.0.0', 80): False, ('1.0.0.0', 80): False, (None, 80, False): False, (None, 80, True): True, ('0.0.0.0', None): True, }, } for rule_arg, matches in test_inputs.items(): rule = ExitPolicyRule(rule_arg) for match_args, expected_result in matches.items(): self.assertEqual(expected_result, rule.is_match(*match_args)) def test_is_match_ipv6(self): test_inputs = { 'reject [FE80:0000:0000:0000:0202:B3FF:FE1E:8329]:*': { ('FE80:0000:0000:0000:0202:B3FF:FE1E:8329', 80): True, ('fe80:0000:0000:0000:0202:b3ff:fe1e:8329', 80): True, ('[FE80:0000:0000:0000:0202:B3FF:FE1E:8329]', 80): True, ('FE80:0000:0000:0000:0202:B3FF:FE1E:8330', 80): False, ('FE80:0000:0000:0000:0202:B3FF:FE1E:8328', 80): False, (None, 80, False): False, (None, 80, True): True, ('FE80:0000:0000:0000:0202:B3FF:FE1E:8329', None): True, }, 'reject [FE80:0000:0000:0000:0202:B3FF:FE1E:8329]/112:*': { ('FE80:0000:0000:0000:0202:B3FF:FE1E:8329', 80): True, ('FE80:0000:0000:0000:0202:B3FF:FE1E:0000', 80): True, ('FE80:0000:0000:0000:0202:B3FF:FE1E:FFFF', 80): True, ('FE80:0000:0000:0000:0202:B3FF:FE1F:8329', 80): False, ('FE81:0000:0000:0000:0202:B3FF:FE1E:8329', 80): False, (None, 80, False): False, (None, 80, True): True, ('FE80:0000:0000:0000:0202:B3FF:FE1E:8329', None, False): True, ('FE80:0000:0000:0000:0202:B3FF:FE1E:8329', None, True): True, }, } for rule_arg, matches in test_inputs.items(): rule = ExitPolicyRule(rule_arg) for match_args, expected_result in matches.items(): self.assertEqual(expected_result, rule.is_match(*match_args)) def test_is_match_port(self): test_inputs = { 'reject *:80': { ('192.168.0.50', 80): True, ('192.168.0.50', 81): False, ('192.168.0.50', 79): False, (None, 80): True, ('192.168.0.50', None, False): False, ('192.168.0.50', None, True): True, }, 'reject *:80-85': { ('192.168.0.50', 79): False, ('192.168.0.50', 80): True, ('192.168.0.50', 83): True, ('192.168.0.50', 85): True, ('192.168.0.50', 86): False, (None, 83): True, ('192.168.0.50', None, False): False, ('192.168.0.50', None, True): True, }, } for rule_arg, matches in test_inputs.items(): rule = ExitPolicyRule(rule_arg) for match_args, expected_result in matches.items(): self.assertEqual(expected_result, rule.is_match(*match_args)) def test_missing_port(self): exc_msg = "An exitpattern must be of the form 'addrspec:portspec': accept6 192.168.0.1/0" self.assertRaisesWith(ValueError, exc_msg, ExitPolicyRule, 'accept6 192.168.0.1/0') exc_msg = "An exitpattern must be of the form 'addrspec:portspec': reject6 [2a00:1450:4001:081e:0000:0000:0000:200e]" self.assertRaisesWith(ValueError, exc_msg, ExitPolicyRule, 'reject6 [2a00:1450:4001:081e:0000:0000:0000:200e]') def test_ipv6_only_entries(self): # accept6/reject6 shouldn't match anything when given an ipv4 addresses rule = ExitPolicyRule('accept6 192.168.0.1/0:*') self.assertTrue(rule._skip_rule) self.assertFalse(rule.is_match('192.168.0.1')) self.assertFalse(rule.is_match('FE80:0000:0000:0000:0202:B3FF:FE1E:8329')) self.assertFalse(rule.is_match()) rule = ExitPolicyRule('accept6 *4:*') self.assertTrue(rule._skip_rule) # wildcards match all ipv6 but *not* ipv4 rule = ExitPolicyRule('accept6 *:*') self.assertTrue(rule.is_match('FE80:0000:0000:0000:0202:B3FF:FE1E:8329', 443)) self.assertFalse(rule.is_match('192.168.0.1', 443)) stem-1.7.1/test/unit/exit_policy/policy.py0000664000175000017500000002653413237375570021377 0ustar atagaratagar00000000000000""" Unit tests for the stem.exit_policy.ExitPolicy class. """ import pickle import unittest try: # added in python 3.3 from unittest.mock import Mock, patch except ImportError: from mock import Mock, patch from stem.exit_policy import ( DEFAULT_POLICY_RULES, get_config_policy, ExitPolicy, MicroExitPolicy, ExitPolicyRule, ) class TestExitPolicy(unittest.TestCase): def test_example(self): # tests the ExitPolicy and MicroExitPolicy pydoc examples policy = ExitPolicy('accept *:80', 'accept *:443', 'reject *:*') self.assertEqual('accept *:80, accept *:443, reject *:*', str(policy)) self.assertEqual('accept 80, 443', policy.summary()) self.assertTrue(policy.can_exit_to('75.119.206.243', 80)) policy = MicroExitPolicy('accept 80,443') self.assertTrue(policy.can_exit_to('75.119.206.243', 80)) def test_constructor(self): # The ExitPolicy constructor takes a series of string or ExitPolicyRule # entries. Extra whitespace is ignored to make csvs easier to handle. expected_policy = ExitPolicy( ExitPolicyRule('accept *:80'), ExitPolicyRule('accept *:443'), ExitPolicyRule('reject *:*'), ) policy = ExitPolicy('accept *:80', 'accept *:443', 'reject *:*') self.assertEqual(expected_policy, policy) policy = ExitPolicy(*'accept *:80, accept *:443, reject *:*'.split(',')) self.assertEqual(expected_policy, policy) # checks that we truncate after getting a catch-all policy policy = ExitPolicy(*'accept *:80, accept *:443, reject *:*, accept *:20-50'.split(',')) self.assertEqual(expected_policy, policy) # checks that we compress redundant policies policy = ExitPolicy(*'reject *:80, reject *:443, reject *:*'.split(',')) self.assertEqual(ExitPolicy('reject *:*'), policy) def test_can_exit_to(self): # Basic sanity test for our can_exit_to() method. Most of the interesting # use cases (ip masks, wildcards, etc) are covered by the ExitPolicyRule # tests. policy = ExitPolicy('accept *:80', 'accept *:443', 'reject *:*') for index in range(1, 100): ip_addr = '%i.%i.%i.%i' % (index / 2, index / 2, index / 2, index / 2) expected_result = index in (80, 443) self.assertEqual(expected_result, policy.can_exit_to(ip_addr, index)) self.assertEqual(expected_result, policy.can_exit_to(port = index)) def test_can_exit_to_strictness(self): # Check our 'strict' argument. policy = ExitPolicy('reject 1.0.0.0/8:80', 'accept *:*') self.assertEqual(False, policy.can_exit_to(None, 80, strict = True)) # can't exit to *all* instances of port 80 self.assertEqual(True, policy.can_exit_to(None, 80, strict = False)) # can exit to *an* instance of port 80 policy = ExitPolicy('accept 1.0.0.0/8:80', 'reject *:*') self.assertEqual(False, policy.can_exit_to(None, 80, strict = True)) # can't exit to *all* instances of port 80 self.assertEqual(True, policy.can_exit_to(None, 80, strict = False)) # can exit to *an* instance of port 80 def test_is_exiting_allowed(self): test_inputs = { (): True, ('accept *:*', ): True, ('reject *:*', ): False, ('accept *:80', 'reject *:*'): True, ('reject *:80', 'accept *:80', 'reject *:*'): False, ('reject *:50-90', 'accept *:80', 'reject *:*'): False, ('reject *:2-65535', 'accept *:80-65535', 'reject *:*'): False, ('reject *:2-65535', 'accept 127.0.0.0:1', 'reject *:*'): True, ('reject 127.0.0.1:*', 'accept *:80', 'reject *:*'): True, } for rules, expected_result in test_inputs.items(): policy = ExitPolicy(*rules) self.assertEqual(expected_result, policy.is_exiting_allowed()) def test_summary_examples(self): # checks the summary() method's pydoc examples policy = ExitPolicy('accept *:80', 'accept *:443', 'reject *:*') self.assertEqual('accept 80, 443', policy.summary()) policy = ExitPolicy('accept *:443', 'reject *:1-1024', 'accept *:*') self.assertEqual('reject 1-442, 444-1024', policy.summary()) def test_summary_large_ranges(self): # checks the summary() method when the policy includes very large port ranges policy = ExitPolicy('reject *:80-65535', 'accept *:1-65533', 'reject *:*') self.assertEqual('accept 1-79', policy.summary()) def test_without_port(self): policy = get_config_policy('accept 216.58.193.78, reject *') self.assertEqual([ExitPolicyRule('accept 216.58.193.78:*'), ExitPolicyRule('reject *:*')], list(policy)) policy = get_config_policy('reject6 [2a00:1450:4001:081e:0000:0000:0000:200e]') self.assertEqual([ExitPolicyRule('reject [2a00:1450:4001:081e:0000:0000:0000:200e]:*')], list(policy)) def test_non_private_non_default_policy(self): policy = get_config_policy('reject *:80-65535, accept *:1-65533, reject *:*') for rule in policy: self.assertFalse(rule.is_private()) self.assertFalse(rule.is_default()) self.assertFalse(policy.has_private()) self.assertFalse(policy.has_default()) self.assertEqual(policy, policy.strip_private()) self.assertEqual(policy, policy.strip_default()) def test_all_private_policy(self): for port in ('*', '80', '1-1024'): private_policy = get_config_policy('reject private:%s' % port, '12.34.56.78') for rule in private_policy: self.assertTrue(rule.is_private()) self.assertEqual(ExitPolicy(), private_policy.strip_private()) # though not commonly done, technically private policies can be accept rules too private_policy = get_config_policy('accept private:*') self.assertEqual(ExitPolicy(), private_policy.strip_private()) @patch('socket.gethostname', Mock(side_effect = IOError('no address'))) def test_all_private_policy_without_network(self): for rule in get_config_policy('reject private:80, accept *:80'): # all rules except the ending accept are part of the private policy self.assertEqual(str(rule) != 'accept *:80', rule.is_private()) def test_all_default_policy(self): policy = ExitPolicy(*DEFAULT_POLICY_RULES) for rule in policy: self.assertTrue(rule.is_default()) self.assertTrue(policy.has_default()) self.assertEqual(ExitPolicy(), policy.strip_default()) def test_mixed_private_policy(self): policy = get_config_policy('accept *:80, reject private:1-65533, accept *:*') for rule in policy: self.assertTrue(rule.is_accept != rule.is_private()) # only reject rules are the private ones self.assertEqual(get_config_policy('accept *:80, accept *:*'), policy.strip_private()) def test_mixed_default_policy(self): policy = ExitPolicy('accept *:80', 'accept 127.0.0.1:1-65533', *DEFAULT_POLICY_RULES) for rule in policy: # only accept-all and reject rules are the default ones self.assertTrue(rule.is_accept != rule.is_default() or (rule.is_accept and rule.is_address_wildcard() and rule.is_port_wildcard())) self.assertEqual(get_config_policy('accept *:80, accept 127.0.0.1:1-65533'), policy.strip_default()) def test_get_config_policy_with_ipv6(self): # ensure our constructor accepts addresses both with and without brackets self.assertTrue(get_config_policy('reject private:80', 'fe80:0000:0000:0000:0202:b3ff:fe1e:8329').is_exiting_allowed()) self.assertTrue(get_config_policy('reject private:80', '[fe80:0000:0000:0000:0202:b3ff:fe1e:8329]').is_exiting_allowed()) def test_str(self): # sanity test for our __str__ method policy = ExitPolicy(' accept *:80\n', '\taccept *:443') self.assertEqual('accept *:80, accept *:443', str(policy)) policy = ExitPolicy('reject 0.0.0.0/255.255.255.0:*', 'accept *:*') self.assertEqual('reject 0.0.0.0/24:*, accept *:*', str(policy)) def test_iter(self): # sanity test for our __iter__ method rules = [ ExitPolicyRule('accept *:80'), ExitPolicyRule('accept *:443'), ExitPolicyRule('reject *:*'), ] self.assertEqual(rules, list(ExitPolicy(*rules))) self.assertEqual(rules, list(ExitPolicy('accept *:80', 'accept *:443', 'reject *:*'))) def test_microdescriptor_parsing(self): # mapping between inputs and if they should succeed or not test_inputs = { 'accept 80': True, 'accept 80,443': True, '': False, 'accept': False, 'accept ': False, 'accept\t80,443': False, 'accept 80, 443': False, 'accept 80,\t443': False, '80,443': False, 'accept 80,-443': False, 'accept 80,+443': False, 'accept 80,66666': False, 'reject 80,foo': False, 'bar 80,443': False, } for policy_arg, expect_success in test_inputs.items(): try: policy = MicroExitPolicy(policy_arg) if expect_success: self.assertEqual(policy_arg, str(policy)) else: self.fail() except ValueError: if expect_success: self.fail() def test_microdescriptor_attributes(self): # checks that its is_accept attribute is properly set # single port policy = MicroExitPolicy('accept 443') self.assertTrue(policy.is_accept) # multiple ports policy = MicroExitPolicy('accept 80,443') self.assertTrue(policy.is_accept) # port range policy = MicroExitPolicy('reject 1-1024') self.assertFalse(policy.is_accept) def test_microdescriptor_can_exit_to(self): test_inputs = { 'accept 443': {442: False, 443: True, 444: False}, 'reject 443': {442: True, 443: False, 444: True}, 'accept 80,443': {80: True, 443: True, 10: False}, 'reject 1-1024': {1: False, 1024: False, 1025: True}, } for policy_arg, attr in test_inputs.items(): policy = MicroExitPolicy(policy_arg) for port, expected_value in attr.items(): self.assertEqual(expected_value, policy.can_exit_to(port = port)) # address argument should be ignored policy = MicroExitPolicy('accept 80,443') self.assertFalse(policy.can_exit_to('127.0.0.1', 79)) self.assertTrue(policy.can_exit_to('127.0.0.1', 80)) def test_get_config_policy(self): test_inputs = { '': ExitPolicy(), 'reject *': ExitPolicy('reject *:*'), 'reject *:*': ExitPolicy('reject *:*'), 'reject private': ExitPolicy( 'reject 0.0.0.0/8:*', 'reject 169.254.0.0/16:*', 'reject 127.0.0.0/8:*', 'reject 192.168.0.0/16:*', 'reject 10.0.0.0/8:*', 'reject 172.16.0.0/12:*', 'reject 12.34.56.78:*', ), 'accept *:80, reject *': ExitPolicy( 'accept *:80', 'reject *:*', ), ' accept *:80, reject * ': ExitPolicy( 'accept *:80', 'reject *:*', ), } for test_input, expected in test_inputs.items(): self.assertEqual(expected, get_config_policy(test_input, '12.34.56.78')) test_inputs = ( 'blarg', 'accept *:*:*', 'acceptt *:80', 'accept 257.0.0.1:80', 'accept *:999999', ) for test_input in test_inputs: self.assertRaises(ValueError, get_config_policy, test_input) def test_pickleability(self): """ Checks that we can unpickle ExitPolicy instances. """ policy = ExitPolicy('accept *:80', 'accept *:443', 'reject *:*') self.assertTrue(policy.can_exit_to('74.125.28.106', 80)) encoded_policy = pickle.dumps(policy) restored_policy = pickle.loads(encoded_policy) self.assertEqual(policy, restored_policy) self.assertTrue(restored_policy.is_exiting_allowed()) self.assertTrue(restored_policy.can_exit_to('74.125.28.106', 80)) stem-1.7.1/test/unit/exit_policy/__init__.py0000664000175000017500000000012313237375570021621 0ustar atagaratagar00000000000000""" Unit tests for stem.exit_policy.py contents. """ __all__ = ['policy', 'rule'] stem-1.7.1/test/unit/__init__.py0000664000175000017500000000063013341034346017261 0ustar atagaratagar00000000000000""" Unit tests for the stem library. """ import os import test __all__ = [ 'client', 'connection', 'control', 'descriptor', 'directory', 'exit_policy', 'socket', 'util', 'version', ] def exec_documentation_example(filename): path = os.path.join(test.STEM_BASE, 'docs', '_static', 'example', filename) with open(path) as f: code = compile(f.read(), path, 'exec') exec(code) stem-1.7.1/test/unit/manual.py0000664000175000017500000004201413341474573017013 0ustar atagaratagar00000000000000""" Unit testing for the stem.manual module. """ import io import os import sqlite3 import tempfile import unittest import stem.prereq import stem.manual import stem.util.system import test.require try: # account for urllib's change between python 2.x and 3.x import urllib.request as urllib except ImportError: import urllib2 as urllib try: # added in python 3.3 from unittest.mock import Mock, patch except ImportError: from mock import Mock, patch try: # added in python 2.7 from collections import OrderedDict except ImportError: from stem.util.ordereddict import OrderedDict URL_OPEN = 'urllib.request.urlopen' if stem.prereq.is_python_3() else 'urllib2.urlopen' EXAMPLE_MAN_PATH = os.path.join(os.path.dirname(__file__), 'tor_man_example') UNKNOWN_OPTIONS_MAN_PATH = os.path.join(os.path.dirname(__file__), 'tor_man_with_unknown') EXPECTED_DESCRIPTION = 'Tor is a connection-oriented anonymizing communication service. Users choose a source-routed path through a set of nodes, and negotiate a "virtual circuit" through the network, in which each node knows its predecessor and successor, but no others. Traffic flowing down the circuit is unwrapped by a symmetric key at each node, which reveals the downstream node.' EXPECTED_CLI_OPTIONS = { '-f FILE': 'Specify a new configuration file to contain further Tor configuration options OR pass - to make Tor read its configuration from standard input. (Default: @CONFDIR@/torrc, or $HOME/.torrc if that file is not found)', '-h, -help': 'Display a short help message and exit.', '--allow-missing-torrc': 'Do not require that configuration file specified by -f exist if default torrc can be accessed.', } EXPECTED_SIGNALS = { 'SIGHUP': 'The signal instructs Tor to reload its configuration (including closing and reopening logs), and kill and restart its helper processes if applicable.', 'SIGTERM': 'Tor will catch this, clean up and sync to disk if necessary, and exit.', 'SIGINT': 'Tor clients behave as with SIGTERM; but Tor servers will do a controlled slow shutdown, closing listeners and waiting 30 seconds before exiting. (The delay can be configured with the ShutdownWaitLength config option.)', } EXPECTED_FILES = { '@LOCALSTATEDIR@/lib/tor/': 'The tor process stores keys and other data here.', 'DataDirectory/cached-status/': 'The most recently downloaded network status document for each authority. Each file holds one such document; the filenames are the hexadecimal identity key fingerprints of the directory authorities. Mostly obsolete.', 'DataDirectory/cached-certs': 'This file holds downloaded directory key certificates that are used to verify authenticity of documents generated by Tor directory authorities.', 'DataDirectory/state': 'A set of persistent key-value mappings. These are documented in the file. These include: o The current entry guards and their status. o The current bandwidth accounting values (unused so far; see below). o When the file was last written o What version of Tor generated the state file o A short history of bandwidth usage, as produced in the server descriptors.', '@CONFDIR@/torrc': 'The configuration file, which contains "option value" pairs.', 'DataDirectory/bw_accounting': "Used to track bandwidth accounting values (when the current period starts and ends; how much has been read and written so far this period). This file is obsolete, and the data is now stored in the 'state' file as well. Only used when bandwidth accounting is enabled.", '$HOME/.torrc': 'Fallback location for torrc, if @CONFDIR@/torrc is not found.', } EXPECTED_CONFIG_OPTIONS = OrderedDict() EXPECTED_CONFIG_OPTIONS['BandwidthRate'] = stem.manual.ConfigOption( name = 'BandwidthRate', category = 'General', usage = 'N bytes|KBytes|MBytes|GBytes|KBits|MBits|GBits', summary = 'Average bandwidth usage limit', description = 'A token bucket limits the average incoming bandwidth usage on this node to the specified number of bytes per second, and the average outgoing bandwidth usage to that same value. If you want to run a relay in the public network, this needs to be at the very least 75 KBytes for a relay (that is, 600 kbits) or 50 KBytes for a bridge (400 kbits) -- but of course, more is better; we recommend at least 250 KBytes (2 mbits) if possible. (Default: 1 GByte)\n\nWith this option, and in other options that take arguments in bytes, KBytes, and so on, other formats are also supported. Notably, "KBytes" can also be written as "kilobytes" or "kb"; "MBytes" can be written as "megabytes" or "MB"; "kbits" can be written as "kilobits"; and so forth. Tor also accepts "byte" and "bit" in the singular. The prefixes "tera" and "T" are also recognized. If no units are given, we default to bytes. To avoid confusion, we recommend writing "bytes" or "bits" explicitly, since it\'s easy to forget that "B" means bytes, not bits.') EXPECTED_CONFIG_OPTIONS['BandwidthBurst'] = stem.manual.ConfigOption( name = 'BandwidthBurst', category = 'General', usage = 'N bytes|KBytes|MBytes|GBytes|KBits|MBits|GBits', summary = 'Maximum bandwidth usage limit', description = 'Limit the maximum token bucket size (also known as the burst) to the given number of bytes in each direction. (Default: 1 GByte)') EXPECTED_CONFIG_OPTIONS['MaxAdvertisedBandwidth'] = stem.manual.ConfigOption( name = 'MaxAdvertisedBandwidth', category = 'General', usage = 'N bytes|KBytes|MBytes|GBytes|KBits|MBits|GBits', summary = 'Limit for the bandwidth we advertise as being available for relaying', description = 'If set, we will not advertise more than this amount of bandwidth for our BandwidthRate. Server operators who want to reduce the number of clients who ask to build circuits through them (since this is proportional to advertised bandwidth rate) can thus reduce the CPU demands on their server without impacting network performance.') EXPECTED_CONFIG_OPTIONS['Bridge'] = stem.manual.ConfigOption( name = 'Bridge', category = 'Client', usage = '[transport] IP:ORPort [fingerprint]', summary = 'Available bridges', description = 'When set along with UseBridges, instructs Tor to use the relay at "IP:ORPort" as a "bridge" relaying into the Tor network. If "fingerprint" is provided (using the same format as for DirAuthority), we will verify that the relay running at that location has the right fingerprint. We also use fingerprint to look up the bridge descriptor at the bridge authority, if it\'s provided and if UpdateBridgesFromAuthority is set too.\n\nIf "transport" is provided, and matches to a ClientTransportPlugin line, we use that pluggable transports proxy to transfer data to the bridge.') CACHED_MANUAL = None def _cached_manual(): global CACHED_MANUAL if CACHED_MANUAL is None: CACHED_MANUAL = stem.manual.Manual.from_cache() return CACHED_MANUAL class TestManual(unittest.TestCase): def test_query(self): self.assertEqual("If set, this option overrides the default location and file name for Tor's cookie file. (See CookieAuthentication above.)", stem.manual.query('SELECT description FROM torrc WHERE name="CookieAuthFile"').fetchone()[0]) self.assertEqual("If set, this option overrides the default location and file name for Tor's cookie file. (See CookieAuthentication above.)", stem.manual.query('SELECT description FROM torrc WHERE name=?', 'CookieAuthFile').fetchone()[0]) def test_query_on_failure(self): self.assertRaisesWith(sqlite3.OperationalError, 'near "hello": syntax error', stem.manual.query, 'hello world') def test_has_all_summaries(self): """ Check that we have brief, human readable summaries for all of tor's configuration options. If you add a new config entry then please take a sec to write a little summary. They're located in 'stem/settings.cfg'. """ manual = _cached_manual() present = set(manual.config_options.keys()) expected = set([key[15:] for key in stem.manual._config(lowercase = False) if key.startswith('manual.summary.')]) missing_options = present.difference(expected) extra_options = expected.difference(present) if missing_options: self.fail("Ran cache_manual.py? Please update Stem's settings.cfg with summaries of the following config options: %s" % ', '.join(missing_options)) elif extra_options: self.fail("Ran cache_manual.py? Please remove the following summaries from Stem's settings.cfg: %s" % ', '.join(extra_options)) def test_is_important(self): self.assertTrue(stem.manual.is_important('ExitPolicy')) self.assertTrue(stem.manual.is_important('exitpolicy')) self.assertTrue(stem.manual.is_important('EXITPOLICY')) self.assertFalse(stem.manual.is_important('ConstrainedSockSize')) def test_minimal_config_option(self): blank = stem.manual.ConfigOption('UnknownOption') self.assertEqual(stem.manual.Category.UNKNOWN, blank.category) self.assertEqual('UnknownOption', blank.name) self.assertEqual('', blank.usage) self.assertEqual('', blank.summary) self.assertEqual('', blank.description) @test.require.command('man') def test_parsing_with_example(self): """ Read a trimmed copy of tor's man page. This gives a good exercise of our parser with static content. As new oddball man oddities appear feel free to expand our example (or add another). """ if not stem.manual.HAS_ENCODING_ARG: self.skipTest('(man lacks --encoding arg on OSX, BSD, and Slackware #18660)') return manual = stem.manual.Manual.from_man(EXAMPLE_MAN_PATH) self.assertEqual('tor - The second-generation onion router', manual.name) self.assertEqual('tor [OPTION value]...', manual.synopsis) self.assertEqual(EXPECTED_DESCRIPTION, manual.description) self.assertEqual(EXPECTED_CLI_OPTIONS, manual.commandline_options) self.assertEqual(EXPECTED_SIGNALS, manual.signals) self.assertEqual(EXPECTED_FILES, manual.files) self.assertEqual(EXPECTED_CONFIG_OPTIONS, manual.config_options) @test.require.command('man') def test_parsing_with_unknown_options(self): """ Check that we can read a local mock man page that contains unrecognized options. Unlike most other tests this doesn't require network access. """ if not stem.manual.HAS_ENCODING_ARG: self.skipTest('(man lacks --encoding arg on OSX and BSD and Slackware, #18660)') return manual = stem.manual.Manual.from_man(UNKNOWN_OPTIONS_MAN_PATH) self.assertEqual('tor - The second-generation onion router', manual.name) self.assertEqual('', manual.synopsis) self.assertEqual('', manual.description) self.assertEqual({}, manual.commandline_options) self.assertEqual({}, manual.signals) self.assertEqual({}, manual.files) self.assertEqual(2, len(manual.config_options)) option = [entry for entry in manual.config_options.values() if entry.category == stem.manual.Category.UNKNOWN][0] self.assertEqual(stem.manual.Category.UNKNOWN, option.category) self.assertEqual('SpiffyNewOption', option.name) self.assertEqual('transport exec path-to-binary [options]', option.usage) self.assertEqual('', option.summary) self.assertEqual('Description of this new option.', option.description) @test.require.command('man') def test_saving_manual_as_config(self): """ Check that we can save and reload manuals as a config. """ if not stem.manual.HAS_ENCODING_ARG: self.skipTest('(man lacks --encoding arg on OSX, BSD and Slackware, #18660)') return manual = stem.manual.Manual.from_man(EXAMPLE_MAN_PATH) with tempfile.NamedTemporaryFile(prefix = 'saved_test_manual.') as tmp: manual.save(tmp.name) loaded_manual = stem.manual.Manual.from_cache(tmp.name) self.assertEqual(manual, loaded_manual) @test.require.command('man') def test_saving_manual_as_sqlite(self): """ Check that we can save and reload manuals as sqlite. """ if not stem.manual.HAS_ENCODING_ARG: self.skipTest('(man lacks --encoding arg on OSX, BSD, and Slackware #18660)') return manual = stem.manual.Manual.from_man(EXAMPLE_MAN_PATH) with tempfile.NamedTemporaryFile(prefix = 'saved_test_manual.', suffix = '.sqlite') as tmp: manual.save(tmp.name) loaded_manual = stem.manual.Manual.from_cache(tmp.name) self.assertEqual(manual, loaded_manual) def test_cached_manual(self): manual = _cached_manual() self.assertEqual('tor - The second-generation onion router', manual.name) self.assertEqual('tor [OPTION value]...', manual.synopsis) self.assertTrue(manual.description.startswith(EXPECTED_DESCRIPTION)) self.assertTrue(len(manual.commandline_options) > 10) self.assertTrue(len(manual.signals) > 5) self.assertTrue(len(manual.files) > 20) self.assertTrue(len(manual.config_options) > 200) def test_download_man_page_without_arguments(self): exc_msg = "Either the path or file_handle we're saving to must be provided" self.assertRaisesWith(ValueError, exc_msg, stem.manual.download_man_page) @patch('stem.util.system.is_available', Mock(return_value = False)) def test_download_man_page_requires_a2x(self): exc_msg = 'We require a2x from asciidoc to provide a man page' self.assertRaisesWith(IOError, exc_msg, stem.manual.download_man_page, '/tmp/no_such_file') @patch('tempfile.mkdtemp', Mock(return_value = '/no/such/path')) @patch('shutil.rmtree', Mock()) @patch('stem.manual.open', Mock(side_effect = IOError('unable to write to file')), create = True) @patch('stem.util.system.is_available', Mock(return_value = True)) def test_download_man_page_when_unable_to_write(self): exc_msg = "Unable to download tor's manual from https://gitweb.torproject.org/tor.git/plain/doc/tor.1.txt to /no/such/path/tor.1.txt: unable to write to file" self.assertRaisesWith(IOError, exc_msg, stem.manual.download_man_page, '/tmp/no_such_file') @patch('tempfile.mkdtemp', Mock(return_value = '/no/such/path')) @patch('shutil.rmtree', Mock()) @patch('stem.manual.open', Mock(return_value = io.BytesIO()), create = True) @patch('stem.util.system.is_available', Mock(return_value = True)) @patch(URL_OPEN, Mock(side_effect = urllib.URLError(''))) def test_download_man_page_when_download_fails(self): exc_msg = "Unable to download tor's manual from https://www.atagar.com/foo/bar to /no/such/path/tor.1.txt: >" self.assertRaisesWith(IOError, exc_msg, stem.manual.download_man_page, '/tmp/no_such_file', url = 'https://www.atagar.com/foo/bar') @patch('tempfile.mkdtemp', Mock(return_value = '/no/such/path')) @patch('shutil.rmtree', Mock()) @patch('stem.manual.open', Mock(return_value = io.BytesIO()), create = True) @patch('stem.util.system.call', Mock(side_effect = stem.util.system.CallError('call failed', 'a2x -f manpage /no/such/path/tor.1.txt', 1, None, None, 'call failed'))) @patch('stem.util.system.is_available', Mock(return_value = True)) @patch(URL_OPEN, Mock(return_value = io.BytesIO(b'test content'))) def test_download_man_page_when_a2x_fails(self): exc_msg = "Unable to run 'a2x -f manpage /no/such/path/tor.1.txt': call failed" self.assertRaisesWith(IOError, exc_msg, stem.manual.download_man_page, '/tmp/no_such_file', url = 'https://www.atagar.com/foo/bar') @patch('tempfile.mkdtemp', Mock(return_value = '/no/such/path')) @patch('shutil.rmtree', Mock()) @patch('stem.manual.open', create = True) @patch('stem.util.system.call') @patch('stem.util.system.is_available', Mock(return_value = True)) @patch('os.path.exists', Mock(return_value = True)) @patch(URL_OPEN, Mock(return_value = io.BytesIO(b'test content'))) def test_download_man_page_when_successful(self, call_mock, open_mock): open_mock.side_effect = lambda path, *args: { '/no/such/path/tor.1.txt': io.BytesIO(), '/no/such/path/tor.1': io.BytesIO(b'a2x output'), }[path] call_mock.return_value = Mock() output = io.BytesIO() stem.manual.download_man_page(file_handle = output) self.assertEqual(b'a2x output', output.getvalue()) call_mock.assert_called_once_with('a2x -f manpage /no/such/path/tor.1.txt') @patch('stem.manual.HAS_ENCODING_ARG', Mock(return_value = True)) @patch('stem.util.system.is_mac', Mock(return_value = False)) @patch('stem.util.system.is_bsd', Mock(return_value = False)) @patch('stem.util.system.is_slackware', Mock(return_value = False)) @patch('stem.util.system.call', Mock(side_effect = OSError('man --encoding=ascii -P cat tor returned exit status 16'))) def test_from_man_when_manual_is_unavailable(self): exc_msg = "Unable to run 'man --encoding=ascii -P cat tor': man --encoding=ascii -P cat tor returned exit status 16" self.assertRaisesWith(IOError, exc_msg, stem.manual.Manual.from_man) @patch('stem.util.system.call', Mock(return_value = [])) def test_when_man_is_empty(self): manual = stem.manual.Manual.from_man() self.assertEqual('', manual.name) self.assertEqual('', manual.synopsis) self.assertEqual('', manual.description) self.assertEqual({}, manual.commandline_options) self.assertEqual({}, manual.signals) self.assertEqual({}, manual.files) self.assertEqual(OrderedDict(), manual.config_options) stem-1.7.1/test/unit/util/0000775000175000017500000000000013411004021016107 5ustar atagaratagar00000000000000stem-1.7.1/test/unit/util/system.py0000664000175000017500000004450613341474573020047 0ustar atagaratagar00000000000000""" Unit tests for the stem.util.system functions. This works by mocking the stem.util.system.call function to selectively exercise other functions. None of these tests actually make system calls, use proc, or otherwise deal with the system running the tests. """ import functools import ntpath import os import posixpath import tempfile import unittest import stem.prereq from stem.util import system try: # added in python 3.3 from unittest.mock import Mock, patch except ImportError: from mock import Mock, patch # Base responses for the pid_by_name tests. The 'success' and # 'multiple_results' entries are filled in by tests. GET_PID_BY_NAME_BASE_RESULTS = { 'success': [], 'multiple_results': [], 'malformed_data': ['bad data'], 'no_results': [], 'command_fails': None, } # testing output for system calls GET_PID_BY_NAME_PS_BSD = [ ' PID TT STAT TIME COMMAND', ' 1 ?? Ss 9:00.22 launchd', ' 10 ?? Ss 0:09.97 kextd', ' 11 ?? Ss 5:47.36 DirectoryService', ' 12 ?? Ss 3:01.44 notifyd'] GET_PID_BY_NAME_PS_BSD_MULTIPLE = [ ' PID TT STAT TIME COMMAND', ' 1 ?? Ss 9:00.22 launchd', ' 10 ?? Ss 0:09.97 kextd', ' 41 ?? Ss 9:00.22 launchd'] GET_PID_BY_NAME_TASKLIST_RESULTS = [ 'Image Name PID Session Name Session# Mem Usage', 'System Idle Process 0 Services 0 20 K', 'svchost.exe 872 Services 0 8,744 K', 'hpservice.exe 1112 Services 0 3,828 K', 'tor.exe 3712 Console 1 29,976 K', 'tor.exe 3713 Console 1 21,976 K', 'conhost.exe 3012 Console 1 4,652 K'] GET_PID_BY_PORT_NETSTAT_RESULTS = [ 'Active Internet connections (only servers)', 'Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name', 'tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN - ', 'tcp 0 0 127.0.0.1:9051 0.0.0.0:* LISTEN 1641/tor ', 'tcp6 0 0 ::1:631 :::* LISTEN - ', 'udp 0 0 0.0.0.0:5353 0.0.0.0:* - ', 'udp6 0 0 fe80::7ae4:ff:fe2f::123 :::* - '] GET_PID_BY_PORT_SOCKSTAT_RESULTS = [ '_tor tor 4397 7 tcp4 51.64.7.84:9051 *:*', '_tor tor 4397 12 tcp4 51.64.7.84:54011 80.3.121.7:9051', '_tor tor 4397 15 tcp4 51.64.7.84:59374 7.42.1.102:9051'] GET_PID_BY_PORT_LSOF_RESULTS = [ 'COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME', 'tor 1745 atagar 6u IPv4 14229 0t0 TCP 127.0.0.1:9051 (LISTEN)', 'apache 329 atagar 6u IPv4 14229 0t0 TCP 127.0.0.1:80 (LISTEN)'] GET_BSD_JAIL_PATH_RESULTS = [ ' JID IP Address Hostname Path', ' 1 10.0.0.2 tor-jail /usr/jails/tor-jail', ] def mock_call(base_cmd, responses): """ Provides mocking for the system module's call function. There are a couple ways of using this... - Simple usage is for base_cmd is the system call we want to respond to and responses is a list containing the respnose. For instance... mock_call('ls my_dir', ['file1', 'file2', 'file3']) - The base_cmd can be a formatted string and responses are a dictionary of completions for tat string to the responses. For instance... mock_call('ls %s', {'dir1': ['file1', 'file2'], 'dir2': ['file3', 'file4']}) :param str base_cmd: command to match against :param list,dict responses: either list with the response, or mapping of base_cmd formatted string completions to responses :returns: **functor** to override stem.util.system.call with """ def _mock_call(base_cmd, responses, command, default = None): if isinstance(responses, list): if base_cmd == command: return responses else: return default else: for cmd_completion in responses: if command == base_cmd % cmd_completion: return responses[cmd_completion] return default return functools.partial(_mock_call, base_cmd, responses) class TestSystem(unittest.TestCase): @patch('stem.util.system.call') @patch('stem.util.system.is_available', Mock(return_value = True)) def test_is_running(self, call_mock): """ Exercises multiple use cases for the is_running function. """ # mock response with a linux and bsd resolver running_commands = ['irssi', 'moc', 'tor', 'ps', ' firefox '] for ps_cmd in (system.IS_RUNNING_PS_LINUX, system.IS_RUNNING_PS_BSD): call_mock.side_effect = mock_call(ps_cmd, running_commands) self.assertTrue(system.is_running('irssi')) self.assertTrue(system.is_running('moc')) self.assertTrue(system.is_running('tor')) self.assertTrue(system.is_running(['funky-tor', 'tor'])) self.assertTrue(system.is_running('ps')) self.assertTrue(system.is_running('firefox')) self.assertFalse(system.is_running('something_else')) self.assertFalse(system.is_running(['funky-tor', 'funkier-tor'])) # mock both calls failing call_mock.return_value = None call_mock.side_effect = None self.assertFalse(system.is_running('irssi')) self.assertEqual(None, system.is_running('irssi')) def test_size_of(self): """ Exercises the size_of function. """ if stem.prereq.is_pypy(): self.assertRaises(NotImplementedError, system.size_of, 'hello') else: self.assertTrue(system.size_of('') < system.size_of('hello') < system.size_of('hello world')) self.assertTrue(system.size_of([]) < system.size_of(['hello']) < system.size_of(['hello', 'world'])) self.assertTrue(system.size_of({}) < system.size_of({'hello': 'world'}) < system.size_of({'hello': 'world', 'more': 'stuff'})) @patch('stem.util.system.call') @patch('stem.util.proc.is_available', Mock(return_value = False)) @patch('stem.util.system.is_available', Mock(return_value = True)) def test_name_by_pid_ps(self, call_mock): """ Tests the name_by_pid function with ps responses. """ responses = { 'success': ['COMMAND', 'vim'], 'malformed_command_1': ['COMMAND'], 'malformed_command_2': ['foobar'], 'malformed_command_3': ['NOT_COMMAND', 'vim'], 'no_results': [], 'command_fails': None, } call_mock.side_effect = mock_call(system.GET_NAME_BY_PID_PS, responses) for test_input in responses: expected_response = 'vim' if test_input == 'success' else None self.assertEqual(expected_response, system.name_by_pid(test_input)) @patch('stem.util.system.call') @patch('stem.util.system.is_available', Mock(return_value = True)) @patch('stem.util.system.is_windows', Mock(return_value = False)) def test_pid_by_name_pgrep(self, call_mock): """ Tests the pid_by_name function with pgrep responses. """ responses = dict(GET_PID_BY_NAME_BASE_RESULTS) responses['success'] = ['1111'] responses['multiple_results'] = ['123', '456', '789'] call_mock.side_effect = mock_call(system.GET_PID_BY_NAME_PGREP, responses) for test_input in responses: expected_response = 1111 if test_input == 'success' else None self.assertEqual(expected_response, system.pid_by_name(test_input)) self.assertEqual([123, 456, 789], system.pid_by_name('multiple_results', multiple = True)) @patch('stem.util.system.call') @patch('stem.util.system.is_available', Mock(return_value = True)) @patch('stem.util.system.is_windows', Mock(return_value = False)) def test_pid_by_name_pidof(self, call_mock): """ Tests the pid_by_name function with pidof responses. """ responses = dict(GET_PID_BY_NAME_BASE_RESULTS) responses['success'] = ['1111'] responses['multiple_results'] = ['123 456 789'] call_mock.side_effect = mock_call(system.GET_PID_BY_NAME_PIDOF, responses) for test_input in responses: expected_response = 1111 if test_input == 'success' else None self.assertEqual(expected_response, system.pid_by_name(test_input)) self.assertEqual([123, 456, 789], system.pid_by_name('multiple_results', multiple = True)) @patch('stem.util.system.call') @patch('stem.util.system.is_bsd', Mock(return_value = False)) @patch('stem.util.system.is_windows', Mock(return_value = False)) @patch('stem.util.system.is_available', Mock(return_value = True)) def test_pid_by_name_ps_linux(self, call_mock): """ Tests the pid_by_name function with the linux variant of ps. """ responses = dict(GET_PID_BY_NAME_BASE_RESULTS) responses['success'] = ['PID', ' 1111'] responses['multiple_results'] = ['PID', ' 123', ' 456', ' 789'] call_mock.side_effect = mock_call(system.GET_PID_BY_NAME_PS_LINUX, responses) for test_input in responses: expected_response = 1111 if test_input == 'success' else None self.assertEqual(expected_response, system.pid_by_name(test_input)) self.assertEqual([123, 456, 789], system.pid_by_name('multiple_results', multiple = True)) @patch('stem.util.system.call') @patch('stem.util.system.is_bsd', Mock(return_value = True)) @patch('stem.util.system.is_windows', Mock(return_value = False)) @patch('stem.util.system.is_available', Mock(return_value = True)) def test_pid_by_name_ps_bsd(self, call_mock): """ Tests the pid_by_name function with the bsd variant of ps. """ call_mock.side_effect = mock_call(system.GET_PID_BY_NAME_PS_BSD, GET_PID_BY_NAME_PS_BSD) self.assertEqual(1, system.pid_by_name('launchd')) self.assertEqual(11, system.pid_by_name('DirectoryService')) self.assertEqual(None, system.pid_by_name('blarg')) call_mock.side_effect = mock_call(system.GET_PID_BY_NAME_PS_BSD, GET_PID_BY_NAME_PS_BSD_MULTIPLE) self.assertEqual([1, 41], system.pid_by_name('launchd', multiple = True)) @patch('stem.util.system.call') @patch('stem.util.system.is_available', Mock(return_value = True)) @patch('stem.util.system.is_windows', Mock(return_value = False)) def test_pid_by_name_lsof(self, call_mock): """ Tests the pid_by_name function with lsof responses. """ responses = dict(GET_PID_BY_NAME_BASE_RESULTS) responses['success'] = ['1111'] responses['multiple_results'] = ['123', '456', '789'] call_mock.side_effect = mock_call(system.GET_PID_BY_NAME_LSOF, responses) for test_input in responses: expected_response = 1111 if test_input == 'success' else None self.assertEqual(expected_response, system.pid_by_name(test_input)) self.assertEqual([123, 456, 789], system.pid_by_name('multiple_results', multiple = True)) @patch('stem.util.system.call') @patch('stem.util.system.is_available', Mock(return_value = True)) @patch('stem.util.system.is_windows', Mock(return_value = True)) def test_pid_by_name_tasklist(self, call_mock): """ Tests the pid_by_name function with tasklist responses. """ call_mock.side_effect = mock_call('tasklist', GET_PID_BY_NAME_TASKLIST_RESULTS) self.assertEqual(3712, system.pid_by_name('tor')) self.assertEqual(None, system.pid_by_name('DirectoryService')) self.assertEqual(None, system.pid_by_name('blarg')) self.assertEqual([3712, 3713], system.pid_by_name('tor', multiple = True)) @patch('stem.util.system.call') @patch('stem.util.system.is_available', Mock(return_value = True)) def test_pid_by_port_netstat(self, call_mock): """ Tests the pid_by_port function with a netstat response. """ call_mock.side_effect = mock_call(system.GET_PID_BY_PORT_NETSTAT, GET_PID_BY_PORT_NETSTAT_RESULTS) self.assertEqual(1641, system.pid_by_port(9051)) self.assertEqual(1641, system.pid_by_port('9051')) self.assertEqual(None, system.pid_by_port(631)) self.assertEqual(None, system.pid_by_port(123)) @patch('stem.util.system.call') @patch('stem.util.system.is_available', Mock(return_value = True)) def test_pid_by_port_sockstat(self, call_mock): """ Tests the pid_by_port function with a sockstat response. """ call_mock.side_effect = mock_call(system.GET_PID_BY_PORT_SOCKSTAT % 9051, GET_PID_BY_PORT_SOCKSTAT_RESULTS) self.assertEqual(4397, system.pid_by_port(9051)) self.assertEqual(4397, system.pid_by_port('9051')) self.assertEqual(None, system.pid_by_port(123)) @patch('stem.util.system.call') @patch('stem.util.system.is_available', Mock(return_value = True)) def test_pid_by_port_lsof(self, call_mock): """ Tests the pid_by_port function with a lsof response. """ call_mock.side_effect = mock_call(system.GET_PID_BY_PORT_LSOF, GET_PID_BY_PORT_LSOF_RESULTS) self.assertEqual(1745, system.pid_by_port(9051)) self.assertEqual(1745, system.pid_by_port('9051')) self.assertEqual(329, system.pid_by_port(80)) self.assertEqual(None, system.pid_by_port(123)) @patch('stem.util.system.call') @patch('stem.util.system.is_available', Mock(return_value = True)) def test_pid_by_open_file_lsof(self, call_mock): """ Tests the pid_by_open_file function with a lsof response. """ lsof_query = system.GET_PID_BY_FILE_LSOF % '/tmp/foo' call_mock.side_effect = mock_call(lsof_query, ['4762']) self.assertEqual(4762, system.pid_by_open_file('/tmp/foo')) call_mock.return_value = [] call_mock.side_effect = None self.assertEqual(None, system.pid_by_open_file('/tmp/somewhere_else')) @patch('stem.util.system.call') @patch('stem.util.proc.is_available', Mock(return_value = False)) @patch('stem.util.system.is_available', Mock(return_value = True)) def test_cwd_pwdx(self, call_mock): """ Tests the cwd function with a pwdx response. """ responses = { '3799': ['3799: /home/atagar'], '5839': ['5839: No such process'], '1234': ['malformed output'], '7878': None, } call_mock.side_effect = mock_call(system.GET_CWD_PWDX, responses) for test_input in responses: expected_response = '/home/atagar' if test_input == '3799' else None self.assertEqual(expected_response, system.cwd(test_input)) @patch('stem.util.system.call') @patch('stem.util.proc.is_available', Mock(return_value = False)) @patch('stem.util.system.is_available', Mock(return_value = True)) def test_cwd_lsof(self, call_mock): """ Tests the cwd function with a lsof response. """ responses = { '75717': ['p75717', 'n/Users/atagar/tor/src/or'], '75718': ['p75718', 'fcwd', 'n/Users/atagar/tor/src/or'], '1234': ['malformed output'], '7878': [], } call_mock.side_effect = mock_call(system.GET_CWD_LSOF, responses) for test_input in responses: expected_response = '/Users/atagar/tor/src/or' if test_input in ('75717', '75718') else None self.assertEqual(expected_response, system.cwd(test_input)) def test_tail(self): """ Exercise our tail() function with a variety of inputs. """ path = os.path.join(os.path.dirname(__file__), 'text_file') # by file handle with open(path, 'rb') as riddle_file: self.assertEqual([' both the wicked and sweet.'], list(system.tail(riddle_file, 1))) self.assertEqual([], list(system.tail(path, 0))) self.assertEqual([' both the wicked and sweet.'], list(system.tail(path, 1))) self.assertEqual([' both the wicked and sweet.', "but I'm with people you meet"], list(system.tail(path, 2))) self.assertEqual(14, len(list(system.tail(path)))) self.assertEqual(14, len(list(system.tail(path, 200)))) self.assertRaises(IOError, list, system.tail('/path/doesnt/exist')) fd, temp_path = tempfile.mkstemp() os.chmod(temp_path, 0o077) # remove read permissions self.assertRaises(IOError, list, system.tail(temp_path)) os.close(fd) os.remove(temp_path) @patch('stem.util.system.call') @patch('stem.util.system.is_available', Mock(return_value = True)) def test_bsd_jail_id(self, call_mock): """ Tests the bsd_jail_id function. """ responses = { '1111': ['JID', ' 1'], '2222': ['JID', ' 0'], '3333': ['JID', 'bad data'], '4444': ['bad data'], '5555': [], '6666': [] } call_mock.side_effect = mock_call(system.GET_BSD_JAIL_ID_PS, responses) for test_input in responses: expected_response = 1 if test_input == '1111' else 0 self.assertEqual(expected_response, system.bsd_jail_id(test_input)) @patch('stem.util.system.call') @patch('stem.util.system.is_available', Mock(return_value = True)) def test_bsd_jail_path(self, call_mock): """ Tests the bsd_jail_path function. """ # check when we don't have a jail call_mock.return_value = [] self.assertEqual(None, system.bsd_jail_path(1)) call_mock.side_effect = mock_call(system.GET_BSD_JAIL_PATH % '1', GET_BSD_JAIL_PATH_RESULTS) self.assertEqual('/usr/jails/tor-jail', system.bsd_jail_path(1)) @patch('platform.system', Mock(return_value = 'Linux')) @patch('os.path.join', Mock(side_effect = posixpath.join)) def test_expand_path_unix(self): """ Tests the expand_path function. This does not exercise home directory expansions since that deals with our environment (that's left to integ tests). """ self.assertEqual('', system.expand_path('')) self.assertEqual('/tmp', system.expand_path('/tmp')) self.assertEqual('/tmp', system.expand_path('/tmp/')) self.assertEqual('/tmp', system.expand_path('.', '/tmp')) self.assertEqual('/tmp', system.expand_path('./', '/tmp')) self.assertEqual('/tmp/foo', system.expand_path('foo', '/tmp')) self.assertEqual('/tmp/foo', system.expand_path('./foo', '/tmp')) @patch('platform.system', Mock(return_value = 'Windows')) @patch('os.path.join', Mock(side_effect = ntpath.join)) def test_expand_path_windows(self): """ Tests the expand_path function on windows. This does not exercise home directory expansions since that deals with our environment (that's left to integ tests). """ self.assertEqual('', system.expand_path('')) self.assertEqual('C:\\tmp', system.expand_path('C:\\tmp')) self.assertEqual('C:\\tmp', system.expand_path('C:\\tmp\\')) self.assertEqual('C:\\tmp', system.expand_path('.', 'C:\\tmp')) self.assertEqual('C:\\tmp', system.expand_path('.\\', 'C:\\tmp')) self.assertEqual('C:\\tmp\\foo', system.expand_path('foo', 'C:\\tmp')) self.assertEqual('C:\\tmp\\foo', system.expand_path('.\\foo', 'C:\\tmp')) stem-1.7.1/test/unit/util/conf.py0000664000175000017500000001633613237375570017451 0ustar atagaratagar00000000000000""" Unit tests for the stem.util.conf class and functions. """ import unittest import stem.util.conf import stem.util.enum from stem.util.conf import parse_enum, parse_enum_csv class TestConf(unittest.TestCase): def tearDown(self): # clears the config contents test_config = stem.util.conf.get_config('unit_testing') test_config.clear() test_config.clear_listeners() def test_config_dict(self): """ Tests the config_dict function. """ my_config = { 'bool_value': False, 'int_value': 5, 'str_value': 'hello', 'list_value': [], } test_config = stem.util.conf.get_config('unit_testing') # checks that sync causes existing contents to be applied test_config.set('bool_value', 'true') my_config = stem.util.conf.config_dict('unit_testing', my_config) self.assertEqual(True, my_config['bool_value']) # check a basic synchronize test_config.set('str_value', 'me') self.assertEqual('me', my_config['str_value']) # synchronize with a type mismatch, should keep the old value test_config.set('int_value', '7a') self.assertEqual(5, my_config['int_value']) # changes for a collection test_config.set('list_value', 'a', False) self.assertEqual(['a'], my_config['list_value']) test_config.set('list_value', 'b', False) self.assertEqual(['a', 'b'], my_config['list_value']) test_config.set('list_value', 'c', False) self.assertEqual(['a', 'b', 'c'], my_config['list_value']) def test_parse_enum(self): """ Tests the parse_enum function. """ Insects = stem.util.enum.Enum('BUTTERFLY', 'LADYBUG', 'CRICKET') self.assertEqual(Insects.LADYBUG, parse_enum('my_option', 'ladybug', Insects)) self.assertRaises(ValueError, parse_enum, 'my_option', 'ugabuga', Insects) self.assertRaises(ValueError, parse_enum, 'my_option', 'ladybug, cricket', Insects) def test_parse_enum_csv(self): """ Tests the parse_enum_csv function. """ Insects = stem.util.enum.Enum('BUTTERFLY', 'LADYBUG', 'CRICKET') # check the case insensitivity self.assertEqual([Insects.LADYBUG], parse_enum_csv('my_option', 'ladybug', Insects)) self.assertEqual([Insects.LADYBUG], parse_enum_csv('my_option', 'Ladybug', Insects)) self.assertEqual([Insects.LADYBUG], parse_enum_csv('my_option', 'LaDyBuG', Insects)) self.assertEqual([Insects.LADYBUG], parse_enum_csv('my_option', 'LADYBUG', Insects)) # various number of values self.assertEqual([], parse_enum_csv('my_option', '', Insects)) self.assertEqual([Insects.LADYBUG], parse_enum_csv('my_option', 'ladybug', Insects)) self.assertEqual( [Insects.LADYBUG, Insects.BUTTERFLY], parse_enum_csv('my_option', 'ladybug, butterfly', Insects) ) self.assertEqual( [Insects.LADYBUG, Insects.BUTTERFLY, Insects.CRICKET], parse_enum_csv('my_option', 'ladybug, butterfly, cricket', Insects) ) # edge cases for count argument where things are ok self.assertEqual( [Insects.LADYBUG, Insects.BUTTERFLY], parse_enum_csv('my_option', 'ladybug, butterfly', Insects, 2) ) self.assertEqual( [Insects.LADYBUG, Insects.BUTTERFLY], parse_enum_csv('my_option', 'ladybug, butterfly', Insects, (1, 2)) ) self.assertEqual( [Insects.LADYBUG, Insects.BUTTERFLY], parse_enum_csv('my_option', 'ladybug, butterfly', Insects, (2, 3)) ) self.assertEqual( [Insects.LADYBUG, Insects.BUTTERFLY], parse_enum_csv('my_option', 'ladybug, butterfly', Insects, (2, 2)) ) # failure cases self.assertRaises(ValueError, parse_enum_csv, 'my_option', 'ugabuga', Insects) self.assertRaises(ValueError, parse_enum_csv, 'my_option', 'ladybug, ugabuga', Insects) self.assertRaises(ValueError, parse_enum_csv, 'my_option', 'ladybug butterfly', Insects) # no comma self.assertRaises(ValueError, parse_enum_csv, 'my_option', 'ladybug', Insects, 2) self.assertRaises(ValueError, parse_enum_csv, 'my_option', 'ladybug', Insects, (2, 3)) def test_clear(self): """ Tests the clear method. """ test_config = stem.util.conf.get_config('unit_testing') self.assertEqual([], list(test_config.keys())) # tests clearing when we're already empty test_config.clear() self.assertEqual([], list(test_config.keys())) # tests clearing when we have contents test_config.set('hello', 'world') self.assertEqual(['hello'], list(test_config.keys())) test_config.clear() self.assertEqual([], list(test_config.keys())) def test_listeners(self): """ Tests the add_listener and clear_listeners methods. """ listener_received_keys = [] def test_listener(config, key): self.assertEqual(config, stem.util.conf.get_config('unit_testing')) listener_received_keys.append(key) test_config = stem.util.conf.get_config('unit_testing') test_config.add_listener(test_listener) self.assertEqual([], listener_received_keys) test_config.set('hello', 'world') self.assertEqual(['hello'], listener_received_keys) test_config.clear_listeners() test_config.set('foo', 'bar') self.assertEqual(['hello'], listener_received_keys) def test_unused_keys(self): """ Tests the unused_keys method. """ test_config = stem.util.conf.get_config('unit_testing') test_config.set('hello', 'world') test_config.set('foo', 'bar') test_config.set('pw', '12345') test_config.get('hello') test_config.get_value('foo') self.assertEqual(set(['pw']), test_config.unused_keys()) test_config.get('pw') self.assertEqual(set(), test_config.unused_keys()) def test_get(self): """ Tests the get and get_value methods. """ test_config = stem.util.conf.get_config('unit_testing') test_config.set('bool_value', 'true') test_config.set('int_value', '11') test_config.set('float_value', '11.1') test_config.set('str_value', 'world') test_config.set('list_value', 'a', False) test_config.set('list_value', 'b', False) test_config.set('list_value', 'c', False) test_config.set('map_value', 'foo => bar') # check that we get the default for type mismatch or missing values self.assertEqual(5, test_config.get('foo', 5)) self.assertEqual(5, test_config.get('bool_value', 5)) # checks that we get a string when no default is supplied self.assertEqual('11', test_config.get('int_value')) # exercise type casting for each of the supported types self.assertEqual(True, test_config.get('bool_value', False)) self.assertEqual(11, test_config.get('int_value', 0)) self.assertEqual(11.1, test_config.get('float_value', 0.0)) self.assertEqual('world', test_config.get('str_value', '')) self.assertEqual(['a', 'b', 'c'], test_config.get('list_value', [])) self.assertEqual(('a', 'b', 'c'), test_config.get('list_value', ())) self.assertEqual({'foo': 'bar'}, test_config.get('map_value', {})) # the get_value is similar, though only provides back a string or list self.assertEqual('c', test_config.get_value('list_value')) self.assertEqual(['a', 'b', 'c'], test_config.get_value('list_value', multiple = True)) self.assertEqual(None, test_config.get_value('foo')) self.assertEqual('hello', test_config.get_value('foo', 'hello')) stem-1.7.1/test/unit/util/term.py0000664000175000017500000000214213237375570017461 0ustar atagaratagar00000000000000""" Unit tests for the stem.util.term functions. """ import unittest import stem.util.term from stem.util.term import Color, Attr class TestTerminal(unittest.TestCase): def test_encoding(self): """ Exercises our encoding function. """ self.assertEqual(None, stem.util.term.encoding()) self.assertEqual('\x1b[31m', stem.util.term.encoding(Color.RED)) self.assertEqual('\x1b[31;1m', stem.util.term.encoding(Color.RED, Attr.BOLD)) def test_format(self): """ Exercises our format function. """ self.assertEqual('hi!', stem.util.term.format('hi!')) self.assertEqual('\x1b[31mhi!\x1b[0m', stem.util.term.format('hi!', Color.RED)) self.assertEqual('\x1b[31;1mhi!\x1b[0m', stem.util.term.format('hi!', Color.RED, Attr.BOLD)) self.assertEqual('\x1b[31mhi\nthere!\x1b[0m', stem.util.term.format('hi\nthere!', Color.RED)) self.assertEqual('\x1b[31mhi\x1b[0m\n\x1b[31mthere!\x1b[0m', stem.util.term.format('hi\nthere!', Color.RED, Attr.LINES)) self.assertEqual('\001\x1b[31m\002hi!\001\x1b[0m\002', stem.util.term.format('hi!', Color.RED, Attr.READLINE_ESCAPE)) stem-1.7.1/test/unit/util/proc.py0000664000175000017500000003066013341474573017462 0ustar atagaratagar00000000000000""" Unit testing code for the stem.util.proc functions. """ import io import unittest import test from stem.util import proc from stem.util.connection import Connection try: from unittest.mock import Mock, patch except ImportError: from mock import Mock, patch TITLE_LINE = b'sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout' TCP6_CONTENT = b"""\ sl local_address remote_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode 0: 00000000000000000000000000000000:1495 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 106 0 14347030 1 0000000000000000 100 0 0 10 0 1: 00000000000000000000000000000000:0035 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 1457 1 0000000000000000 100 0 0 10 0 2: 00000000000000000000000000000000:0217 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 6606 1 0000000000000000 100 0 0 10 0 3: F804012A4A5190010000000002000000:01BB 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 4372 1 0000000000000000 100 0 0 10 0 4: 00000000000000000000000000000000:14A1 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 106 0 14347031 1 0000000000000000 100 0 0 10 0 5: 00000000000000000000000000000000:1466 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 106 0 14347029 1 0000000000000000 100 0 0 10 0 6: F804012A4A5190010000000002000000:01BB 38060120404100A0000000008901FFFF:9DF3 01 00000000:00000000 00:00000000 00000000 101 0 42088802 1 0000000000000000 20 4 25 10 7 7: F804012A4A5190010000000002000000:01BB 58080120020002000000BBAA26153B56:ADB5 01 00000000:00000000 00:00000000 00000000 101 0 41691357 1 0000000000000000 24 4 32 10 7 8: 0000000000000000FFFF00004B9E0905:1466 0000000000000000FFFF00002186364E:95BA 01 00000000:00000000 02:000A5B3D 00000000 106 0 41878761 2 0000000000000000 26 4 30 10 -1 9: F804012A4A5190010000000002000000:1495 F806012011006F120000000026000000:C5A2 01 00000000:00000000 02:000A5B3D 00000000 106 0 41825895 2 0000000000000000 21 4 15 10 -1 10: 0000000000000000FFFF00004B9E0905:1466 0000000000000000FFFF00002186364E:951E 01 00000000:00000000 02:00090E70 00000000 106 0 41512577 2 0000000000000000 26 4 31 10 -1 """ SL_WIDTH_CHANGE = b"""\ sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode 0: 11111111:1111 22222233:2244 01 44444444:44444444 55:55555555 66666666 1111 8 99999999 1: 22222222:2222 33333344:3355 01 44444444:44444444 55:55555555 66666666 1111 8 88888888 12675: 33333333:3333 44444455:4466 01 44444444:44444444 55:55555555 66666666 1111 8 77777777 """.rstrip() class TestProc(unittest.TestCase): @patch('stem.util.proc._get_line') def test_system_start_time(self, get_line_mock): """ Tests the system_start_time function. """ get_line_mock.side_effect = lambda *params: { ('/proc/stat', 'btime', 'system start time'): 'btime 1001001', }[params] self.assertEqual(1001001, proc.system_start_time()) @patch('stem.util.proc._get_line') def test_physical_memory(self, get_line_mock): """ Tests the physical_memory function. """ get_line_mock.side_effect = lambda *params: { ('/proc/meminfo', 'MemTotal:', 'system physical memory'): 'MemTotal: 12345 kB', }[params] self.assertEqual((12345 * 1024), proc.physical_memory()) @patch('os.readlink') def test_cwd(self, readlink_mock): """ Tests the cwd function with a given pid. """ readlink_mock.side_effect = lambda param: { '/proc/24019/cwd': '/home/directory/TEST' }[param] self.assertEqual('/home/directory/TEST', proc.cwd(24019)) @patch('stem.util.proc._get_line') def test_uid(self, get_line_mock): """ Tests the uid function with a given pid. """ for test_value in [(24019, 11111), (0, 22222)]: pid, uid = test_value get_line_mock.side_effect = lambda *params: { ('/proc/%s/status' % pid, 'Uid:', 'uid'): 'Uid: %s' % uid, }[params] self.assertEqual(uid, proc.uid(pid)) @patch('stem.util.proc._get_lines') def test_memory_usage(self, get_lines_mock): """ Tests the memory_usage function with a given pid. """ get_lines_mock.side_effect = lambda *params: { ('/proc/1111/status', ('VmRSS:', 'VmSize:'), 'memory usage'): {'VmRSS:': 'VmRSS: 100 kB', 'VmSize:': 'VmSize: 1800 kB'} }[params] self.assertEqual((0, 0), proc.memory_usage(0)) self.assertEqual((100 * 1024, 1800 * 1024), proc.memory_usage(1111)) @patch('stem.util.proc._get_line') @patch('stem.util.proc.system_start_time', Mock(return_value = 10)) @patch('stem.util.proc.CLOCK_TICKS', 100) def test_stats(self, get_line_mock): """ Tests stats() with all combinations of stat_type arguments. """ # list of all combinations of args with respective return values stat_combinations = test.get_all_combinations([ ('command', 'test_program'), ('utime', '0.13'), ('stime', '0.14'), ('start time', '10.21'), ]) stat_path = '/proc/24062/stat' stat = '1 (test_program) 2 3 4 5 6 7 8 9 10 11 12 13.0 14.0 15 16 17 18 19 20 21.0 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43' # tests the case where no stat_types are specified get_line_mock.side_effect = lambda *params: { (stat_path, '24062', 'process '): stat }[params] self.assertEqual((), proc.stats(24062)) for stats in stat_combinations: # the stats variable is... # [(arg1, resp1), (arg2, resp2)...] # # but we need... # (arg1, arg2...), (resp1, resp2...). args, response = list(zip(*stats)) get_line_mock.side_effect = lambda *params: { (stat_path, '24062', 'process %s' % ', '.join(args)): stat }[params] self.assertEqual(response, proc.stats(24062, *args)) # tests the case where pid = 0 if 'start time' in args: response = 10 else: response = () for arg in args: if arg == 'command': response += ('sched',) elif arg == 'utime': response += ('0',) elif arg == 'stime': response += ('0',) get_line_mock.side_effect = lambda *params: { ('/proc/0/stat', '0', 'process %s' % ', '.join(args)): stat }[params] self.assertEqual(response, proc.stats(0, *args)) @patch('os.listdir') def test_file_descriptors_used(self, listdir_mock): """ Tests the file_descriptors_used function. """ # check that we reject bad pids for arg in (None, -100, 'hello',): self.assertRaises(IOError, proc.file_descriptors_used, arg) # when proc directory doesn't exist error_msg = "OSError: [Errno 2] No such file or directory: '/proc/2118/fd'" listdir_mock.side_effect = OSError(error_msg) exc_msg = 'Unable to check number of file descriptors used: %s' % error_msg self.assertRaisesWith(IOError, exc_msg, proc.file_descriptors_used, 2118) # successful calls listdir_mock.return_value = ['0', '1', '2', '3', '4', '5'] listdir_mock.side_effect = None self.assertEqual(6, proc.file_descriptors_used(2118)) self.assertEqual(6, proc.file_descriptors_used('2118')) @patch('os.listdir') @patch('os.path.exists') @patch('os.readlink') @patch('stem.util.proc.open', create = True) def test_connections(self, open_mock, readlink_mock, path_exists_mock, listdir_mock): """ Tests the connections function. """ pid = 1111 listdir_mock.side_effect = lambda param: { '/proc/%s/fd' % pid: ['1', '2', '3', '4'], }[param] readlink_mock.side_effect = lambda param: { '/proc/%s/fd/1' % pid: 'socket:[99999999]', '/proc/%s/fd/2' % pid: 'socket:[IIIIIIII]', '/proc/%s/fd/3' % pid: 'pipe:[30303]', '/proc/%s/fd/4' % pid: 'pipe:[40404]', }[param] tcp = TITLE_LINE + b'\n 0: 11111111:1111 22222222:2222 01 44444444:44444444 55:55555555 66666666 1111 8 99999999' udp = TITLE_LINE + b'\n A: BBBBBBBB:BBBB CCCCCCCC:CCCC DD EEEEEEEE:EEEEEEEE FF:FFFFFFFF GGGGGGGG 1111 H IIIIIIII' path_exists_mock.side_effect = lambda param: { '/proc/net/tcp6': False, '/proc/net/udp6': False }[param] open_mock.side_effect = lambda param, mode: { '/proc/net/tcp': io.BytesIO(tcp), '/proc/net/udp': io.BytesIO(udp) }[param] expected = [ Connection('17.17.17.17', 4369, '34.34.34.34', 8738, 'tcp', False), Connection('187.187.187.187', 48059, '204.204.204.204', 52428, 'udp', False), ] self.assertEqual(expected, proc.connections(pid)) @patch('os.listdir') @patch('os.path.exists') @patch('os.readlink') @patch('stem.util.proc.open', create = True) def test_connections_ipv6(self, open_mock, readlink_mock, path_exists_mock, listdir_mock): """ Tests the connections function with ipv6 addresses. """ pid = 1111 listdir_mock.side_effect = lambda param: { '/proc/%s/fd' % pid: ['1', '2'], }[param] readlink_mock.side_effect = lambda param: { '/proc/%s/fd/1' % pid: 'socket:[42088802]', '/proc/%s/fd/2' % pid: 'socket:[41691357]', }[param] path_exists_mock.side_effect = lambda param: { '/proc/net/tcp6': True, '/proc/net/udp6': False }[param] open_mock.side_effect = lambda param, mode: { '/proc/net/tcp': io.BytesIO(TITLE_LINE), '/proc/net/tcp6': io.BytesIO(TCP6_CONTENT), '/proc/net/udp': io.BytesIO(TITLE_LINE), }[param] expected = [ Connection('2a01:04f8:0190:514a:0000:0000:0000:0002', 443, '2001:0638:a000:4140:0000:0000:ffff:0189', 40435, 'tcp', True), Connection('2a01:04f8:0190:514a:0000:0000:0000:0002', 443, '2001:0858:0002:0002:aabb:0000:563b:1526', 44469, 'tcp', True), ] self.assertEqual(expected, proc.connections(pid = pid)) @patch('os.path.exists') @patch('pwd.getpwnam') @patch('stem.util.proc.open', create = True) def test_connections_ipv6_by_user(self, open_mock, getpwnam_mock, path_exists_mock): """ Tests the connections function with ipv6 addresses. """ getpwnam_mock('me').pw_uid = 106 path_exists_mock.side_effect = lambda param: { '/proc/net/tcp6': True, '/proc/net/udp6': False }[param] open_mock.side_effect = lambda param, mode: { '/proc/net/tcp': io.BytesIO(TITLE_LINE), '/proc/net/tcp6': io.BytesIO(TCP6_CONTENT), '/proc/net/udp': io.BytesIO(TITLE_LINE), }[param] expected = [ Connection('0000:0000:0000:0000:0000:ffff:0509:9e4b', 5222, '0000:0000:0000:0000:0000:ffff:4e36:8621', 38330, 'tcp', True), Connection('2a01:04f8:0190:514a:0000:0000:0000:0002', 5269, '2001:06f8:126f:0011:0000:0000:0000:0026', 50594, 'tcp', True), Connection('0000:0000:0000:0000:0000:ffff:0509:9e4b', 5222, '0000:0000:0000:0000:0000:ffff:4e36:8621', 38174, 'tcp', True), ] self.assertEqual(expected, proc.connections(user = 'me')) @patch('os.listdir') @patch('os.path.exists') @patch('os.readlink') @patch('stem.util.proc.open', create = True) def test_high_connection_count(self, open_mock, readlink_mock, path_exists_mock, listdir_mock): """ When we have over ten thousand connections the 'SL' column's width changes. Checking that we account for this. """ pid = 1111 listdir_mock.side_effect = lambda param: { '/proc/%s/fd' % pid: ['1', '2', '3', '4'], }[param] readlink_mock.side_effect = lambda param: { '/proc/%s/fd/1' % pid: 'socket:[99999999]', '/proc/%s/fd/2' % pid: 'socket:[88888888]', '/proc/%s/fd/3' % pid: 'socket:[77777777]', '/proc/%s/fd/4' % pid: 'pipe:[30303]', '/proc/%s/fd/5' % pid: 'pipe:[40404]', }[param] path_exists_mock.side_effect = lambda param: { '/proc/net/tcp6': False, '/proc/net/udp6': False }[param] open_mock.side_effect = lambda param, mode: { '/proc/net/tcp': io.BytesIO(SL_WIDTH_CHANGE), '/proc/net/udp': io.BytesIO(TITLE_LINE) }[param] expected = [ Connection('17.17.17.17', 4369, '51.34.34.34', 8772, 'tcp', False), Connection('34.34.34.34', 8738, '68.51.51.51', 13141, 'tcp', False), Connection('51.51.51.51', 13107, '85.68.68.68', 17510, 'tcp', False), ] self.assertEqual(expected, proc.connections(pid)) stem-1.7.1/test/unit/util/connection.py0000664000175000017500000007417113341034346020651 0ustar atagaratagar00000000000000""" Unit tests for the stem.util.connection functions. """ import platform import unittest import stem.util.connection from stem.util.connection import Resolver, Connection try: # added in python 3.3 from unittest.mock import Mock, patch except ImportError: from mock import Mock, patch NETSTAT_OUTPUT = """\ Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 192.168.0.1:5939 73.94.23.87:443 ESTABLISHED 20586/firefox tcp 0 0 192.168.0.1:4325 73.94.23.55:443 ESTABLISHED 20586/firefox tcp 1 0 192.168.0.1:4378 29.208.141.42:443 CLOSE_WAIT 20586/firefox tcp 0 0 127.0.0.1:22 127.0.0.1:56673 ESTABLISHED - tcp 0 586 192.168.0.1:44284 38.229.79.2:443 ESTABLISHED 15843/tor tcp 0 0 192.168.0.1:37909 16.111.19.278:6697 ESTABLISHED - Active UNIX domain sockets (w/o servers) Proto RefCnt Flags Type State I-Node PID/Program name Path unix 14 [ ] DGRAM 8433 - /dev/log unix 3 [ ] STREAM CONNECTED 34164277 15843/tor unix 3 [ ] STREAM CONNECTED 34164276 15843/tor unix 3 [ ] STREAM CONNECTED 7951 - """ NETSTAT_IPV6_OUTPUT = """\ Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp6 0 0 5.9.158.75:5222 80.171.220.248:48910 ESTABLISHED 9820/beam tcp6 0 0 2a01:4f8:190:514a::2:443 2001:638:a000:4140::ffff:189:41046 ESTABLISHED 1904/tor tcp6 0 0 5.9.158.75:5269 146.255.57.226:38703 ESTABLISHED 9820/beam tcp6 0 0 2a01:4f8:190:514a::2:443 2001:858:2:2:aabb:0:563b:1526:38260 ESTABLISHED 1904/tor tcp6 0 0 5.9.158.75:5222 80.171.220.248:48966 ESTABLISHED 9820/beam """ NETSTAT_WINDOWS_OUTPUT = """\ Active Connections Proto Local Address Foreign Address State PID TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 852 TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4 TCP 0.0.0.0:902 0.0.0.0:0 LISTENING 2076 TCP 0.0.0.0:912 0.0.0.0:0 LISTENING 2076 TCP 192.168.0.1:44284 38.229.79.2:443 ESTABLISHED 15843 TCP 0.0.0.0:37782 0.0.0.0:0 LISTENING 4128 """ SS_OUTPUT = """\ Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp CLOSE-WAIT 1 0 192.168.0.1:43780 53.203.145.45:443 users:(("firefox",20586,118)) tcp ESTAB 55274 0 192.168.0.1:46136 196.153.236.35:80 users:(("firefox",20586,93)) tcp ESTAB 0 0 192.168.0.1:44092 23.112.135.72:443 users:(("tor",15843,10)) tcp ESTAB 0 0 127.0.0.1:22 127.0.0.1:56673 tcp ESTAB 0 0 192.168.0.1:44415 38.229.79.2:443 users:(("tor",15843,9)) """ SS_IPV6_OUTPUT = """\ Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 0 5.9.158.75:443 107.170.93.13:56159 users:(("tor",pid=25056,fd=997)) tcp ESTAB 0 0 5.9.158.75:443 159.203.97.91:37802 users:(("tor",pid=25056,fd=77)) tcp ESTAB 0 0 2a01:4f8:190:514a::2:443 2001:638:a000:4140::ffff:189:38556 users:(("tor",pid=25056,fd=3175)) tcp ESTAB 0 0 ::ffff:5.9.158.75:5222 ::ffff:78.54.131.65:34950 users:(("beam",pid=1712,fd=29)) tcp ESTAB 0 0 2a01:4f8:190:514a::2:443 2001:858:2:2:aabb:0:563b:1526:51428 users:(("tor",pid=25056,fd=3248)) tcp ESTAB 0 0 ::ffff:5.9.158.75:5222 ::ffff:78.54.131.65:34882 users:(("beam",pid=1712,fd=26)) """ LSOF_OUTPUT = """\ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ubuntu-ge 2164 atagar 11u IPv4 13593 0t0 TCP 192.168.0.1:55395->21.89.91.78:80 (CLOSE_WAIT) tor 15843 atagar 6u IPv4 34164278 0t0 TCP 127.0.0.1:9050 (LISTEN) tor 15843 atagar 7u IPv4 34164279 0t0 TCP 127.0.0.1:9051 (LISTEN) tor 15843 atagar 9u IPv4 34188132 0t0 TCP 192.168.0.1:44415->38.229.79.2:443 (ESTABLISHED) tor 15843 atagar 10u IPv4 34165291 0t0 TCP 192.168.0.1:44092->68.169.35.102:443 (ESTABLISHED) python 16422 atagar 3u IPv4 34203773 0t0 UDP 127.0.0.1:39624->127.0.0.1:53 firefox 20586 atagar 66u IPv4 5765353 0t0 TCP 192.168.0.1:47486->62.135.16.134:443 (ESTABLISHED) firefox 20586 atagar 71u IPv4 13094989 0t0 TCP 192.168.0.1:43762->182.3.10.42:443 (CLOSE_WAIT) """ LSOF_IPV6_OUTPUT = """\ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ntpd 1818 root 20u IPv6 530 0t0 UDP [::1]:123 ntpd 1818 root 21u IPv6 532 0t0 UDP [2a01:4f8:190:514a::2]:123 ntpd 1818 root 22u IPv6 534 0t0 UDP [fe80::3285:a9ff:feed:1cb]:123 tor 1904 tor 10u IPv6 4372 0t0 TCP [2a01:4f8:190:514a::2]:443 (LISTEN) tor 1904 tor 3228u IPv6 10303350 0t0 TCP [2a01:4f8:190:514a::2]:443->[2001:858:2:2:aabb:0:563b:1526]:44811 (ESTABLISHED) """ LSOF_OUTPUT_OSX = """\ tor 129 atagar 4u IPv4 0xffffff3527af0500 0t0 TCP 127.0.0.1:9051 (LISTEN) tor 129 atagar 5u IPv4 0xffffff363af9de40 0t0 TCP 192.168.1.10:9090 (LISTEN) tor 129 atagar 6u IPv4 0xffffff306a960a40 0t0 TCP 192.168.1.10:9091 (LISTEN) tor 129 atagar 8u IPv6 0xffffff13f5575a98 0t0 UDP *:48718 tor 129 atagar 9u IPv6 0xffffff1b2273a178 0t0 UDP *:48714 tor 129 atagar 10u IPv6 0xffffff1b473a9758 0t0 UDP *:48716 tor 129 atagar 11u IPv6 0xffffff1b5733aa48 0t0 UDP *:48719 tor 129 atagar 12u IPv4 0xffffff1cc6dd0160 0t0 TCP 192.168.1.20:9090->38.229.79.2:14010 (ESTABLISHED) tor 129 atagar 22u IPv4 0xffffff35c9125500 0t0 TCP 192.168.1.20:9090->68.169.35.102:14815 (ESTABLISHED) tor 129 atagar 23u IPv4 0xffffff3236168160 0t0 TCP 192.168.1.20:9090->62.135.16.134:14456 (ESTABLISHED) """ SOCKSTAT_OUTPUT = """\ USER PROCESS PID PROTO SOURCE ADDRESS FOREIGN ADDRESS STATE atagar ubuntu-geoip-pr 2164 tcp4 192.168.0.1:55395 141.18.34.33:80 CLOSE_WAIT atagar tor 15843 tcp4 127.0.0.1:9050 *:* LISTEN atagar tor 15843 tcp4 127.0.0.1:9051 *:* LISTEN atagar tor 15843 tcp4 192.168.0.1:44415 38.229.79.2:443 ESTABLISHED atagar tor 15843 tcp4 192.168.0.1:44092 68.169.35.102:443 ESTABLISHED atagar firefox 20586 tcp4 192.168.0.1:47486 213.24.100.160:443 ESTABLISHED atagar firefox 20586 tcp4 192.168.0.1:43762 32.188.221.72:443 CLOSE_WAIT """ # I don't have actual sockstat and procstat output for FreeBSD. Rather, these # are snippets of output from email threads. BSD_SOCKSTAT_OUTPUT = """\ _tor tor 4397 7 tcp4 172.27.72.202:9050 *:* _tor tor 4397 8 udp4 172.27.72.202:53 *:* _tor tor 4397 9 tcp4 172.27.72.202:9051 *:* _tor tor 4397 12 tcp4 172.27.72.202:54011 38.229.79.2:9001 _tor tor 4397 15 tcp4 172.27.72.202:59374 68.169.35.102:9001 _tor tor 4397 19 tcp4 172.27.72.202:59673 213.24.100.160:9001 _tor tor 4397 20 tcp4 172.27.72.202:51946 32.188.221.72:443 _tor tor 4397 22 tcp4 172.27.72.202:60344 21.89.91.78:9001 """ BSD_PROCSTAT_OUTPUT = """\ PID COMM FD T V FLAGS REF OFFSET PRO NAME 3561 tor 4 s - rw---n-- 2 0 TCP 10.0.0.2:9050 10.0.0.1:22370 3561 tor 5 s - rw---n-- 2 0 TCP 10.0.0.2:9050 0.0.0.0:0 3561 tor 6 s - rw---n-- 2 0 TCP 10.0.0.2:9040 0.0.0.0:0 3561 tor 7 s - rw---n-- 2 0 UDP 10.0.0.2:53 0.0.0.0:0 3561 tor 8 s - rw---n-- 2 0 TCP 10.0.0.2:9051 0.0.0.0:0 3561 tor 14 s - rw---n-- 2 0 TCP 10.0.0.2:9050 10.0.0.1:44381 3561 tor 15 s - rw---n-- 2 0 TCP 10.0.0.2:33734 38.229.79.2:443 3561 tor 16 s - rw---n-- 2 0 TCP 10.0.0.2:47704 68.169.35.102:9001 """ BSD_FSTAT_OUTPUT = """\ USER CMD PID FD MOUNT INUM MODE R/W SZ|DV _tor tor 15843 text /usr/local 207875 -rwxr-xr-x r 2421008 _tor tor 15843 wd /var 623616 drwx------ r 512 _tor tor 15843 0 / 1160 crw-rw-rw- rw null _tor tor 15843 1 / 1160 crw-rw-rw- rw null _tor tor 15843 2 / 1160 crw-rw-rw- rw null _tor tor 15843 3 kqueue 0x0 0 state: W _tor tor 15843 4* internet dgram udp *:6063 _tor tor 15843 5* internet stream tcp 0x0 127.0.0.1:8443 _tor tor 15843 6* internet stream tcp 0x0 127.0.0.1:8080 _tor tor 15843 7 /var 623617 -rw------- rwe 0 _tor tor 15843 8* internet dgram udp *:19515 _tor tor 15843 9* internet dgram udp *:43052 _tor tor 15843 10 pipe 0x0 state: _tor tor 15843 11 pipe 0x0 state: _tor tor 15843 12* internet stream tcp 0x0 127.0.0.1:8443 <-- 1.2.3.4:54581 _tor tor 15843 20* internet stream tcp 0x0 192.168.1.100:36174 --> 4.3.2.1:443 """ class TestConnection(unittest.TestCase): @patch('os.access') @patch('stem.util.system.is_available') @patch('stem.util.proc.is_available') def test_system_resolvers(self, proc_mock, is_available_mock, os_mock): """ Checks the system_resolvers function. """ is_available_mock.return_value = True proc_mock.return_value = False os_mock.return_value = True self.assertEqual([Resolver.NETSTAT_WINDOWS], stem.util.connection.system_resolvers('Windows')) self.assertEqual([Resolver.LSOF], stem.util.connection.system_resolvers('Darwin')) self.assertEqual([Resolver.BSD_FSTAT], stem.util.connection.system_resolvers('OpenBSD')) self.assertEqual([Resolver.BSD_SOCKSTAT, Resolver.BSD_PROCSTAT, Resolver.LSOF], stem.util.connection.system_resolvers('FreeBSD')) self.assertEqual([Resolver.NETSTAT, Resolver.SOCKSTAT, Resolver.LSOF, Resolver.SS], stem.util.connection.system_resolvers('Linux')) proc_mock.return_value = True self.assertEqual([Resolver.PROC, Resolver.NETSTAT, Resolver.SOCKSTAT, Resolver.LSOF, Resolver.SS], stem.util.connection.system_resolvers('Linux')) # check that calling without an argument is equivalent to calling for this # platform self.assertEqual(stem.util.connection.system_resolvers(platform.system()), stem.util.connection.system_resolvers()) # check that lacking commands in our PATH drops them from the results is_available_mock.return_value = False self.assertEqual([Resolver.PROC], stem.util.connection.system_resolvers('Linux')) def test_port_usage(self): """ Check that port_usage can load our config and provide the expected results. """ self.assertEqual('HTTP', stem.util.connection.port_usage(80)) self.assertEqual('HTTP', stem.util.connection.port_usage('80')) # query with a string self.assertEqual('BitTorrent', stem.util.connection.port_usage(6881)) # min and max value of a range self.assertEqual('BitTorrent', stem.util.connection.port_usage(6999)) self.assertEqual(None, stem.util.connection.port_usage(30000)) # unrecognized port @patch('stem.util.proc.connections') def test_get_connections_by_proc(self, proc_mock): """ Checks the get_connections function with the proc resolver. """ proc_mock.return_value = [ ('17.17.17.17', 4369, '34.34.34.34', 8738, 'tcp', False), ('187.187.187.187', 48059, '204.204.204.204', 52428, 'tcp', False), ] expected = [ Connection('17.17.17.17', 4369, '34.34.34.34', 8738, 'tcp', False), Connection('187.187.187.187', 48059, '204.204.204.204', 52428, 'tcp', False), ] self.assertEqual(expected, stem.util.connection.get_connections(Resolver.PROC, process_pid = 1111)) proc_mock.side_effect = IOError('No connections for you!') self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.PROC, process_pid = 1111) @patch('stem.util.system.call') def test_get_connections_by_netstat(self, call_mock): """ Checks the get_connections function with the netstat resolver. """ call_mock.return_value = NETSTAT_OUTPUT.split('\n') expected = [Connection('192.168.0.1', 44284, '38.229.79.2', 443, 'tcp', False)] self.assertEqual(expected, stem.util.connection.get_connections(Resolver.NETSTAT, process_pid = 15843, process_name = 'tor')) self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.NETSTAT, process_pid = 15843, process_name = 'stuff') self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.NETSTAT, process_pid = 1111, process_name = 'tor') call_mock.side_effect = OSError('Unable to call netstat') self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.NETSTAT, process_pid = 1111) @patch('stem.util.system.call', Mock(return_value = NETSTAT_IPV6_OUTPUT.split('\n'))) def test_get_connections_by_netstat_ipv6(self): """ Checks the get_connections function with the netstat resolver for IPv6. """ expected = [ Connection('2a01:4f8:190:514a::2', 443, '2001:638:a000:4140::ffff:189', 41046, 'tcp', True), Connection('2a01:4f8:190:514a::2', 443, '2001:858:2:2:aabb:0:563b:1526', 38260, 'tcp', True), ] self.assertEqual(expected, stem.util.connection.get_connections(Resolver.NETSTAT, process_pid = 1904, process_name = 'tor')) @patch('stem.util.system.call') def test_get_connections_by_windows_netstat(self, call_mock): """ Checks the get_connections function with the Windows netstat resolver. """ call_mock.return_value = NETSTAT_WINDOWS_OUTPUT.split('\n') expected = [Connection('192.168.0.1', 44284, '38.229.79.2', 443, 'tcp', False)] self.assertEqual(expected, stem.util.connection.get_connections(Resolver.NETSTAT_WINDOWS, process_pid = 15843, process_name = 'tor')) self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.NETSTAT_WINDOWS, process_pid = 1111, process_name = 'tor') call_mock.side_effect = OSError('Unable to call netstat') self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.NETSTAT_WINDOWS, process_pid = 1111) @patch('stem.util.system.call') def test_get_connections_by_ss(self, call_mock): """ Checks the get_connections function with the ss resolver. """ call_mock.return_value = SS_OUTPUT.split('\n') expected = [ Connection('192.168.0.1', 44092, '23.112.135.72', 443, 'tcp', False), Connection('192.168.0.1', 44415, '38.229.79.2', 443, 'tcp', False), ] self.assertEqual(expected, stem.util.connection.get_connections(Resolver.SS, process_pid = 15843, process_name = 'tor')) self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.SS, process_pid = 15843, process_name = 'stuff') self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.SS, process_pid = 1111, process_name = 'tor') call_mock.side_effect = OSError('Unable to call ss') self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.SS, process_pid = 1111) @patch('stem.util.system.call', Mock(return_value = SS_IPV6_OUTPUT.split('\n'))) def test_get_connections_by_ss_ipv6(self): """ Checks the get_connections function with the ss resolver results on IPv6 conections. This also checks with the output from a hardened Gentoo system which has subtle differences... https://trac.torproject.org/projects/tor/ticket/18079 """ expected = [ Connection('5.9.158.75', 443, '107.170.93.13', 56159, 'tcp', False), Connection('5.9.158.75', 443, '159.203.97.91', 37802, 'tcp', False), Connection('2a01:4f8:190:514a::2', 443, '2001:638:a000:4140::ffff:189', 38556, 'tcp', True), Connection('2a01:4f8:190:514a::2', 443, '2001:858:2:2:aabb:0:563b:1526', 51428, 'tcp', True), ] self.assertEqual(expected, stem.util.connection.get_connections(Resolver.SS, process_pid = 25056, process_name = 'tor')) self.assertEqual(2, len(stem.util.connection.get_connections(Resolver.SS, process_name = 'beam'))) @patch('stem.util.system.call') def test_get_connections_by_lsof(self, call_mock): """ Checks the get_connections function with the lsof resolver. """ call_mock.return_value = LSOF_OUTPUT.split('\n') expected = [ Connection('192.168.0.1', 44415, '38.229.79.2', 443, 'tcp', False), Connection('192.168.0.1', 44092, '68.169.35.102', 443, 'tcp', False), ] self.assertEqual(expected, stem.util.connection.get_connections(Resolver.LSOF, process_pid = 15843, process_name = 'tor')) self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.LSOF, process_pid = 15843, process_name = 'stuff') self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.LSOF, process_pid = 1111, process_name = 'tor') call_mock.side_effect = OSError('Unable to call lsof') self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.LSOF, process_pid = 1111) @patch('stem.util.system.call', Mock(return_value = LSOF_IPV6_OUTPUT.split('\n'))) def test_get_connections_by_lsof_ipv6(self): """ Checks the get_connections function with the lsof resolver for IPv6. """ expected = [Connection('2a01:4f8:190:514a::2', 443, '2001:858:2:2:aabb:0:563b:1526', 44811, 'tcp', True)] self.assertEqual(expected, stem.util.connection.get_connections(Resolver.LSOF, process_pid = 1904, process_name = 'tor')) @patch('stem.util.system.call', Mock(return_value = LSOF_OUTPUT_OSX.split('\n'))) def test_get_connections_by_lsof_osx(self): """ Checks the get_connections function with the lsof resolver on OSX. This only includes entries for the tor process. """ expected = [ Connection('192.168.1.20', 9090, '38.229.79.2', 14010, 'tcp', False), Connection('192.168.1.20', 9090, '68.169.35.102', 14815, 'tcp', False), Connection('192.168.1.20', 9090, '62.135.16.134', 14456, 'tcp', False), ] self.assertEqual(expected, stem.util.connection.get_connections(Resolver.LSOF, process_pid = 129, process_name = 'tor')) @patch('stem.util.system.call') def test_get_connections_by_sockstat(self, call_mock): """ Checks the get_connections function with the sockstat resolver. """ call_mock.return_value = SOCKSTAT_OUTPUT.split('\n') expected = [ Connection('192.168.0.1', 44415, '38.229.79.2', 443, 'tcp', False), Connection('192.168.0.1', 44092, '68.169.35.102', 443, 'tcp', False), ] self.assertEqual(expected, stem.util.connection.get_connections(Resolver.SOCKSTAT, process_pid = 15843, process_name = 'tor')) self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.SOCKSTAT, process_pid = 15843, process_name = 'stuff') self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.SOCKSTAT, process_pid = 1111, process_name = 'tor') call_mock.side_effect = OSError('Unable to call sockstat') self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.SOCKSTAT, process_pid = 1111) @patch('stem.util.system.call') def test_get_connections_by_sockstat_for_bsd(self, call_mock): """ Checks the get_connections function with the bsd variant of the sockstat resolver. """ call_mock.return_value = BSD_SOCKSTAT_OUTPUT.split('\n') expected = [ Connection('172.27.72.202', 54011, '38.229.79.2', 9001, 'tcp', False), Connection('172.27.72.202', 59374, '68.169.35.102', 9001, 'tcp', False), Connection('172.27.72.202', 59673, '213.24.100.160', 9001, 'tcp', False), Connection('172.27.72.202', 51946, '32.188.221.72', 443, 'tcp', False), Connection('172.27.72.202', 60344, '21.89.91.78', 9001, 'tcp', False), ] self.assertEqual(expected, stem.util.connection.get_connections(Resolver.BSD_SOCKSTAT, process_pid = 4397, process_name = 'tor')) self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.BSD_SOCKSTAT, process_pid = 4397, process_name = 'stuff') self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.BSD_SOCKSTAT, process_pid = 1111, process_name = 'tor') call_mock.side_effect = OSError('Unable to call sockstat') self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.BSD_SOCKSTAT, process_pid = 1111) @patch('stem.util.system.call') def test_get_connections_by_procstat(self, call_mock): """ Checks the get_connections function with the procstat resolver. """ call_mock.return_value = BSD_PROCSTAT_OUTPUT.split('\n') expected = [ Connection('10.0.0.2', 9050, '10.0.0.1', 22370, 'tcp', False), Connection('10.0.0.2', 9050, '10.0.0.1', 44381, 'tcp', False), Connection('10.0.0.2', 33734, '38.229.79.2', 443, 'tcp', False), Connection('10.0.0.2', 47704, '68.169.35.102', 9001, 'tcp', False), ] self.assertEqual(expected, stem.util.connection.get_connections(Resolver.BSD_PROCSTAT, process_pid = 3561, process_name = 'tor')) self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.BSD_PROCSTAT, process_pid = 3561, process_name = 'stuff') self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.BSD_PROCSTAT, process_pid = 1111, process_name = 'tor') call_mock.side_effect = OSError('Unable to call procstat') self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.BSD_PROCSTAT, process_pid = 1111) @patch('stem.util.system.call') def test_get_connections_by_fstat(self, call_mock): """ Checks the get_connections function with the fstat resolver. """ call_mock.return_value = BSD_FSTAT_OUTPUT.split('\n') expected = [ Connection('127.0.0.1', 8443, '1.2.3.4', 54581, 'tcp', False), Connection('192.168.1.100', 36174, '4.3.2.1', 443, 'tcp', False), ] self.assertEqual(expected, stem.util.connection.get_connections(Resolver.BSD_FSTAT, process_pid = 15843, process_name = 'tor')) self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.BSD_FSTAT, process_pid = 15843, process_name = 'stuff') self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.BSD_FSTAT, process_pid = 1111, process_name = 'tor') call_mock.side_effect = OSError('Unable to call fstat') self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.BSD_FSTAT, process_pid = 1111) def test_is_valid_ipv4_address(self): """ Checks the is_valid_ipv4_address function. """ valid_addresses = ( '0.0.0.0', '1.2.3.4', '1.2.3.4', '192.168.0.1', '255.255.255.255', b'255.255.255.255', ) invalid_addresses = ( '0.0.00.0', '0.0.0', '1.2.3.256', '1.2.3.-1', '0.0.0.a', 'a.b.c.d', b'a.b.c.d', ) for address in valid_addresses: self.assertTrue(stem.util.connection.is_valid_ipv4_address(address)) for address in invalid_addresses: self.assertFalse(stem.util.connection.is_valid_ipv4_address(address)) def test_is_valid_ipv6_address(self): """ Checks the is_valid_ipv6_address function. """ valid_addresses = ( 'fe80:0000:0000:0000:0202:b3ff:fe1e:8329', 'fe80:0:0:0:202:b3ff:fe1e:8329', 'fe80::202:b3ff:fe1e:8329', '::ffff:5.9.158.75', '5.9.158.75::ffff', '::5.9.158.75:ffff', '::', ) invalid_addresses = ( 'fe80:0000:0000:0000:0202:b3ff:fe1e:829g', 'fe80:0000:0000:0000:0202:b3ff:fe1e: 8329', '2001:db8::aaaa::1', '::ffff:5.9.158.75.12', '::ffff:5.9.158', '::ffff:5.9', ':::', ':', '', ) for address in valid_addresses: self.assertTrue(stem.util.connection.is_valid_ipv6_address(address), "%s isn't a valid IPv6 address" % address) for address in invalid_addresses: self.assertFalse(stem.util.connection.is_valid_ipv6_address(address), '%s should be an invalid IPv6 address' % address) def test_is_valid_port(self): """ Checks the is_valid_port function. """ valid_ports = (1, '1', 1234, '1234', 65535, '65535', [1, '2']) invalid_ports = (0, '0', 65536, '65536', 'abc', '*', ' 15', '01', True, {}) for port in valid_ports: self.assertTrue(stem.util.connection.is_valid_port(port)) for port in invalid_ports: self.assertFalse(stem.util.connection.is_valid_port(port)) self.assertTrue(stem.util.connection.is_valid_port(0, allow_zero = True)) self.assertTrue(stem.util.connection.is_valid_port('0', allow_zero = True)) def test_is_private_address(self): """ Checks the is_private_address function. """ self.assertTrue(stem.util.connection.is_private_address('127.0.0.1')) self.assertTrue(stem.util.connection.is_private_address('10.0.0.0')) self.assertTrue(stem.util.connection.is_private_address('172.16.0.0')) self.assertTrue(stem.util.connection.is_private_address('172.31.0.0')) self.assertTrue(stem.util.connection.is_private_address('192.168.0.50')) self.assertFalse(stem.util.connection.is_private_address('74.125.28.103')) self.assertFalse(stem.util.connection.is_private_address('172.15.0.0')) self.assertFalse(stem.util.connection.is_private_address('172.32.0.0')) self.assertRaises(ValueError, stem.util.connection.is_private_address, '') self.assertRaises(ValueError, stem.util.connection.is_private_address, 'blarg') self.assertRaises(ValueError, stem.util.connection.is_private_address, '127.0.0') self.assertRaises(ValueError, stem.util.connection.is_private_address, 'fe80:0000:0000:0000:0202:b3ff:fe1e:8329') def test_address_to_int(self): """ Checks the address_to_int function. """ self.assertEqual(1, stem.util.connection.address_to_int('0.0.0.1')) self.assertEqual(2, stem.util.connection.address_to_int('0.0.0.2')) self.assertEqual(256, stem.util.connection.address_to_int('0.0.1.0')) self.assertEqual(2130706433, stem.util.connection.address_to_int('127.0.0.1')) self.assertEqual(338288524927261089654163772891438416681, stem.util.connection.address_to_int('fe80:0000:0000:0000:0202:b3ff:fe1e:8329')) def test_expand_ipv6_address(self): """ Checks the expand_ipv6_address function. """ test_values = { '2001:db8::ff00:42:8329': '2001:0db8:0000:0000:0000:ff00:0042:8329', '::': '0000:0000:0000:0000:0000:0000:0000:0000', '::1': '0000:0000:0000:0000:0000:0000:0000:0001', '1::1': '0001:0000:0000:0000:0000:0000:0000:0001', '::ffff:5.9.158.75': '0000:0000:0000:0000:0000:ffff:0509:9e4b', '5.9.158.75::ffff': '0509:9e4b:0000:0000:0000:0000:0000:ffff', '::5.9.158.75:ffff': '0000:0000:0000:0000:0000:0509:9e4b:ffff', } for test_arg, expected in test_values.items(): self.assertEqual(expected, stem.util.connection.expand_ipv6_address(test_arg)) self.assertRaises(ValueError, stem.util.connection.expand_ipv6_address, '127.0.0.1') def test_get_mask_ipv4(self): """ Checks the get_mask_ipv4 function. """ self.assertEqual('255.255.255.255', stem.util.connection.get_mask_ipv4(32)) self.assertEqual('255.255.255.248', stem.util.connection.get_mask_ipv4(29)) self.assertEqual('255.255.254.0', stem.util.connection.get_mask_ipv4(23)) self.assertEqual('0.0.0.0', stem.util.connection.get_mask_ipv4(0)) self.assertRaises(ValueError, stem.util.connection.get_mask_ipv4, -1) self.assertRaises(ValueError, stem.util.connection.get_mask_ipv4, 33) def test_get_mask_ipv6(self): """ Checks the get_mask_ipv6 function. """ self.assertEqual('FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF', stem.util.connection.get_mask_ipv6(128)) self.assertEqual('FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFE:0000', stem.util.connection.get_mask_ipv6(111)) self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0000', stem.util.connection.get_mask_ipv6(0)) self.assertRaises(ValueError, stem.util.connection.get_mask_ipv6, -1) self.assertRaises(ValueError, stem.util.connection.get_mask_ipv6, 129) def test_get_masked_bits(self): """ Checks the _get_masked_bits function. """ self.assertEqual(32, stem.util.connection._get_masked_bits('255.255.255.255')) self.assertEqual(29, stem.util.connection._get_masked_bits('255.255.255.248')) self.assertEqual(23, stem.util.connection._get_masked_bits('255.255.254.0')) self.assertEqual(0, stem.util.connection._get_masked_bits('0.0.0.0')) self.assertRaises(ValueError, stem.util.connection._get_masked_bits, 'blarg') self.assertRaises(ValueError, stem.util.connection._get_masked_bits, '255.255.0.255') def test_address_to_binary(self): """ Checks the _address_to_binary function. """ test_values = { '0.0.0.0': '00000000000000000000000000000000', '1.2.3.4': '00000001000000100000001100000100', '127.0.0.1': '01111111000000000000000000000001', '255.255.255.255': '11111111111111111111111111111111', '::': '0' * 128, '::1': ('0' * 127) + '1', '1::1': '0000000000000001' + ('0' * 111) + '1', '2001:db8::ff00:42:8329': '00100000000000010000110110111000000000000000000000000000000000000000000000000000111111110000000000000000010000101000001100101001', } for test_arg, expected in test_values.items(): self.assertEqual(expected, stem.util.connection._address_to_binary(test_arg)) self.assertRaises(ValueError, stem.util.connection._address_to_binary, '') self.assertRaises(ValueError, stem.util.connection._address_to_binary, 'blarg') stem-1.7.1/test/unit/util/text_file0000664000175000017500000000052513157571677020060 0ustar atagaratagar00000000000000I'm in magic and books, with spooks and the crooks, and forbidden lover's bliss after a vine trellis kiss. I might be open or closed, often plain as your nose. I'm a gift you can't take back, and in the sharing I crack. Authors place me in Prague or the dense London fog but I'm with people you meet both the wicked and sweet. stem-1.7.1/test/unit/util/log.py0000664000175000017500000000106113237375570017272 0ustar atagaratagar00000000000000""" Unit tests for the stem.util.log functions. """ import unittest from stem.util import log class TestLog(unittest.TestCase): def test_is_tracing(self): logger = log.get_logger() original_handlers = logger.handlers logger.handlers = [log._NullHandler()] try: self.assertFalse(log.is_tracing()) logger.addHandler(log.LogBuffer(log.DEBUG)) self.assertFalse(log.is_tracing()) logger.addHandler(log.LogBuffer(log.TRACE)) self.assertTrue(log.is_tracing()) finally: logger.handlers = original_handlers stem-1.7.1/test/unit/util/__init__.py0000664000175000017500000000112413356507530020243 0ustar atagaratagar00000000000000""" Unit tests for stem.util.* contents. """ import datetime import time import unittest from stem.util import datetime_to_unix __all__ = [ 'conf', 'connection', 'enum', 'log', 'proc', 'str_tools', 'system', 'tor_tools', ] class TestBaseUtil(unittest.TestCase): def test_datetime_to_unix(self): self.assertEqual(1344251971.0, datetime_to_unix(datetime.datetime(2012, 8, 6, 11, 19, 31))) self.assertEqual(1515894416.0, datetime_to_unix(datetime.datetime(2018, 1, 14, 1, 46, 56))) self.assertTrue((time.time() - datetime_to_unix(datetime.datetime.utcnow())) < 2) stem-1.7.1/test/unit/util/tor_tools.py0000664000175000017500000000567213340051401020524 0ustar atagaratagar00000000000000""" Unit tests for the stem.util.tor_tools functions. """ import unittest import stem.util.str_tools import stem.util.tor_tools class TestTorTools(unittest.TestCase): def test_is_valid_fingerprint(self): """ Checks the is_valid_fingerprint function. """ valid_fingerprints = ( '$A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB', '$a7569a83b5706ab1b1a9cb52eff7d2d32e4553eb', stem.util.str_tools._to_bytes('$A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB'), stem.util.str_tools._to_unicode('$A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB'), ) invalid_fingerprints = ( None, '', 5, ['A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB'], 'A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB', '$A7569A83B5706AB1B1A9CB52EFF7D2D32E4553E', '$A7569A83B5706AB1B1A9CB52EFF7D2D32E4553E33', '$A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EG', ) for fingerprint in valid_fingerprints: self.assertTrue(stem.util.tor_tools.is_valid_fingerprint(fingerprint, True)) for fingerprint in invalid_fingerprints: self.assertFalse(stem.util.tor_tools.is_valid_fingerprint(fingerprint, True)) def test_is_valid_nickname(self): """ Checks the is_valid_nickname function. """ valid_nicknames = ( 'caerSidi', 'a', 'abcABC123', stem.util.str_tools._to_bytes('caerSidi'), stem.util.str_tools._to_unicode('caerSidi'), ) invalid_nicknames = ( None, '', 5, 'toolongggggggggggggg', 'bad_character', ) for nickname in valid_nicknames: self.assertTrue(stem.util.tor_tools.is_valid_nickname(nickname)) for nickname in invalid_nicknames: self.assertFalse(stem.util.tor_tools.is_valid_nickname(nickname)) def test_is_valid_circuit_id(self): """ Checks the is_valid_circuit_id function. """ valid_circuit_ids = ( '0', '2', 'abcABC123', stem.util.str_tools._to_bytes('2'), stem.util.str_tools._to_unicode('2'), ) invalid_circuit_ids = ( None, '', 0, 2, 'toolonggggggggggg', 'bad_character', ) for circuit_id in valid_circuit_ids: self.assertTrue(stem.util.tor_tools.is_valid_circuit_id(circuit_id)) for circuit_id in invalid_circuit_ids: self.assertFalse(stem.util.tor_tools.is_valid_circuit_id(circuit_id)) def test_is_valid_hex_digits(self): """ Checks the is_valid_hex_digits function. """ valid_hex_digits = ( '12345', 'AbCdE', stem.util.str_tools._to_bytes('AbCdE'), stem.util.str_tools._to_unicode('AbCdE'), ) invalid_hex_digits = ( None, '', 5, 'X', '1234', 'ABCDEF', [1, '2', (3, 4)] ) for hex_digits in valid_hex_digits: self.assertTrue(stem.util.tor_tools.is_hex_digits(hex_digits, 5)) for hex_digits in invalid_hex_digits: self.assertFalse(stem.util.tor_tools.is_hex_digits(hex_digits, 5)) stem-1.7.1/test/unit/util/enum.py0000664000175000017500000000263513237375570017465 0ustar atagaratagar00000000000000""" Unit tests for the stem.util.enum class and functions. """ import unittest import stem.util.enum class TestEnum(unittest.TestCase): def test_enum_examples(self): """ Checks that the pydoc examples are accurate. """ insects = stem.util.enum.Enum('ANT', 'WASP', 'LADYBUG', 'FIREFLY') self.assertEqual('Ant', insects.ANT) self.assertEqual(('Ant', 'Wasp', 'Ladybug', 'Firefly'), tuple(insects)) pets = stem.util.enum.Enum(('DOG', 'Skippy'), 'CAT', ('FISH', 'Nemo')) self.assertEqual('Skippy', pets.DOG) self.assertEqual('Cat', pets.CAT) def test_uppercase_enum_example(self): """ Checks that the pydoc example for the UppercaseEnum constructor function is accurate. """ runlevels = stem.util.enum.UppercaseEnum('DEBUG', 'INFO', 'NOTICE', 'WARN', 'ERROR') self.assertEqual('DEBUG', runlevels.DEBUG) def test_enum_methods(self): """ Exercises enumeration methods. """ insects = stem.util.enum.Enum('ANT', 'WASP', 'LADYBUG', 'FIREFLY') # next method self.assertEqual(insects.WASP, insects.next(insects.ANT)) self.assertEqual(insects.ANT, insects.next(insects.FIREFLY)) # previous method self.assertEqual(insects.FIREFLY, insects.previous(insects.ANT)) self.assertEqual(insects.LADYBUG, insects.previous(insects.FIREFLY)) # keys method self.assertEqual(['ANT', 'WASP', 'LADYBUG', 'FIREFLY'], list(insects.keys())) stem-1.7.1/test/unit/util/str_tools.py0000664000175000017500000001575213237375570020555 0ustar atagaratagar00000000000000""" Unit tests for the stem.util.str_tools functions. """ import datetime import unittest from stem.util import str_tools class TestStrTools(unittest.TestCase): def test_to_int(self): """ Checks the _to_int() function. """ test_inputs = { '': 0, 'h': 104, 'hi': 26729, 'hello': 448378203247, str_tools._to_bytes('hello'): 448378203247, str_tools._to_unicode('hello'): 448378203247, } for arg, expected in test_inputs.items(): self.assertEqual(expected, str_tools._to_int(arg)) def test_to_camel_case(self): """ Checks the _to_camel_case() function. """ # test the pydoc example self.assertEqual('I Like Pepperjack!', str_tools._to_camel_case('I_LIKE_PEPPERJACK!')) # check a few edge cases self.assertEqual('', str_tools._to_camel_case('')) self.assertEqual('Hello', str_tools._to_camel_case('hello')) self.assertEqual('Hello', str_tools._to_camel_case('HELLO')) self.assertEqual('Hello World', str_tools._to_camel_case('hello__world')) self.assertEqual('Hello\tworld', str_tools._to_camel_case('hello\tWORLD')) self.assertEqual('Hello\t\tWorld', str_tools._to_camel_case('hello__world', '_', '\t')) def test_split_by_length(self): self.assertEqual(['h', 'e', 'l', 'l', 'o'], str_tools._split_by_length('hello', 1)) self.assertEqual(['he', 'll', 'o'], str_tools._split_by_length('hello', 2)) self.assertEqual(['hel', 'lo'], str_tools._split_by_length('hello', 3)) self.assertEqual(['hell', 'o'], str_tools._split_by_length('hello', 4)) self.assertEqual(['hello'], str_tools._split_by_length('hello', 5)) self.assertEqual(['hello'], str_tools._split_by_length('hello', 6)) def test_crop(self): # test the pydoc examples self.assertEqual('This is a looo...', str_tools.crop('This is a looooong message', 17)) self.assertEqual('This is a...', str_tools.crop('This is a looooong message', 12)) self.assertEqual('', str_tools.crop('This is a looooong message', 3)) self.assertEqual('', str_tools.crop('This is a looooong message', 0)) def test_size_label(self): """ Checks the size_label() function. """ # test the pydoc examples self.assertEqual('1 MB', str_tools.size_label(2000000)) self.assertEqual('1.02 KB', str_tools.size_label(1050, 2)) self.assertEqual('1.025 Kilobytes', str_tools.size_label(1050, 3, True)) self.assertEqual('1 KB', str_tools.size_label(1050, 0, round = True)) self.assertEqual('1.0 KB', str_tools.size_label(1050, 1, round = True)) self.assertEqual('1.03 KB', str_tools.size_label(1050, 2, round = True)) self.assertEqual('1.025 KB', str_tools.size_label(1050, 3, round = True)) self.assertEqual('0 B', str_tools.size_label(0)) self.assertEqual('0 Bytes', str_tools.size_label(0, is_long = True)) self.assertEqual('0.00 B', str_tools.size_label(0, 2)) self.assertEqual('-10 B', str_tools.size_label(-10)) self.assertEqual('80 b', str_tools.size_label(10, is_bytes = False)) self.assertEqual('-1 MB', str_tools.size_label(-2000000)) # checking that we round down self.assertEqual('23.43 Kb', str_tools.size_label(3000, 2, is_bytes = False)) self.assertRaises(TypeError, str_tools.size_label, None) self.assertRaises(TypeError, str_tools.size_label, 'hello world') def test_time_label(self): """ Checks the time_label() function. """ # test the pydoc examples self.assertEqual('2h', str_tools.time_label(10000)) self.assertEqual('1.0 minute', str_tools.time_label(61, 1, True)) self.assertEqual('1.01 minutes', str_tools.time_label(61, 2, True)) self.assertEqual('0s', str_tools.time_label(0)) self.assertEqual('0 seconds', str_tools.time_label(0, is_long = True)) self.assertEqual('0.00s', str_tools.time_label(0, 2)) self.assertEqual('-10s', str_tools.time_label(-10)) self.assertRaises(TypeError, str_tools.time_label, None) self.assertRaises(TypeError, str_tools.time_label, 'hello world') def test_time_labels(self): """ Checks the time_labels() function. """ # test the pydoc examples self.assertEqual(['6m', '40s'], str_tools.time_labels(400)) self.assertEqual(['1 hour', '40 seconds'], str_tools.time_labels(3640, True)) self.assertEqual([], str_tools.time_labels(0)) self.assertEqual(['-10s'], str_tools.time_labels(-10)) self.assertRaises(TypeError, str_tools.time_labels, None) self.assertRaises(TypeError, str_tools.time_labels, 'hello world') def test_short_time_label(self): """ Checks the short_time_label() function. """ # test the pydoc examples self.assertEqual('01:51', str_tools.short_time_label(111)) self.assertEqual('6-07:08:20', str_tools.short_time_label(544100)) self.assertEqual('00:00', str_tools.short_time_label(0)) self.assertRaises(TypeError, str_tools.short_time_label, None) self.assertRaises(TypeError, str_tools.short_time_label, 'hello world') self.assertRaises(ValueError, str_tools.short_time_label, -5) def test_parse_short_time_label(self): """ Checks the parse_short_time_label() function. """ # test the pydoc examples self.assertEqual(111, str_tools.parse_short_time_label('01:51')) self.assertEqual(544100, str_tools.parse_short_time_label('6-07:08:20')) self.assertEqual(110, str_tools.parse_short_time_label('01:50.62')) self.assertEqual(0, str_tools.parse_short_time_label('00:00')) # these aren't technically valid, but might as well allow unnecessary # digits to be dropped self.assertEqual(300, str_tools.parse_short_time_label('05:0')) self.assertEqual(300, str_tools.parse_short_time_label('5:00')) self.assertRaises(TypeError, str_tools.parse_short_time_label, None) self.assertRaises(TypeError, str_tools.parse_short_time_label, 100) self.assertRaises(ValueError, str_tools.parse_short_time_label, 'blarg') self.assertRaises(ValueError, str_tools.parse_short_time_label, '00') self.assertRaises(ValueError, str_tools.parse_short_time_label, '05:') self.assertRaises(ValueError, str_tools.parse_short_time_label, '05a:00') self.assertRaises(ValueError, str_tools.parse_short_time_label, '-05:00') def test_parse_iso_timestamp(self): """ Checks the _parse_iso_timestamp() function. """ test_inputs = { '2012-11-08T16:48:41.420251': datetime.datetime(2012, 11, 8, 16, 48, 41, 420251), '2012-11-08T16:48:41.000000': datetime.datetime(2012, 11, 8, 16, 48, 41, 0), '2012-11-08T16:48:41': datetime.datetime(2012, 11, 8, 16, 48, 41, 0), } for arg, expected in test_inputs.items(): self.assertEqual(expected, str_tools._parse_iso_timestamp(arg)) invalid_input = [ None, 32, 'boom', 'hello world', '2012-11-08T16:48:41.42025', # too few microsecond digits '2012-11-08T16:48:41.4202511', # too many microsecond digits '2012-11-08T16:48', ] for arg in invalid_input: self.assertRaises(ValueError, str_tools._parse_iso_timestamp, arg) stem-1.7.1/test/unit/installation.py0000664000175000017500000000545113341034346020231 0ustar atagaratagar00000000000000import json import os import re import unittest import test class TestInstallation(unittest.TestCase): # TODO: remove when dropping support for python 2.6 skip_reason = 'setUpClass() unsupported in python 2.6' @classmethod def setUpClass(self): setup_path = os.path.join(test.STEM_BASE, 'setup.py') self.skip_reason = None self.setup_contents = False if os.path.exists(setup_path): with open(setup_path) as setup_file: self.setup_contents = setup_file.read() else: self.skip_reason = '(only for git checkout)' def test_installs_all_modules(self): if self.skip_reason: self.skipTest(self.skip_reason) return True # Modules cited my our setup.py looks like... # # packages = ['stem', 'stem.descriptor', 'stem.util'], modules = json.loads(re.search('packages = (\[.*\])', self.setup_contents).group(1).replace("'", '"')) module_paths = dict([(m, os.path.join(test.STEM_BASE, m.replace('.', os.path.sep))) for m in modules]) for module, path in module_paths.items(): if not os.path.exists(path): self.fail("setup.py's module %s doesn't exist at %s" % (module, path)) for entry in os.walk(os.path.join(test.STEM_BASE, 'stem')): directory = entry[0] if directory.endswith('__pycache__'): continue elif directory not in module_paths.values(): self.fail("setup.py doesn't install %s" % directory) def test_installs_all_data_files(self): if self.skip_reason: self.skipTest(self.skip_reason) return True # Checking that we have all non-source files. Data looks like... # # package_data = { # 'stem': ['cached_fallbacks.cfg', 'cached_manual.cfg', 'settings.cfg'], # }, package_data = {} for line in self.setup_contents.split('package_data = {\n', 1)[1].splitlines(): if '},' in line: break directory = line.strip().split()[0][1:-2] files = line.strip().split(' ', 1)[1][2:-3].split("', '") package_data[directory] = files data_files = [] for module, files in package_data.items(): for module_file in files: data_files.append(os.path.join(test.STEM_BASE, module.replace('.', os.path.sep), module_file)) for path in data_files: if not os.path.exists(path): self.fail("setup.py installs a data file that doesn't exist: %s" % path) for entry in os.walk(os.path.join(test.STEM_BASE, 'stem')): directory = entry[0] if directory.endswith('__pycache__'): continue for filename in entry[2]: path = os.path.join(directory, filename) file_type = path.split('.')[-1] if file_type in (['py'] + test.IGNORED_FILE_TYPES): continue elif path not in data_files: self.fail("setup.py doesn't install %s" % path) stem-1.7.1/test/unit/tutorial.py0000664000175000017500000002064413344342723017400 0ustar atagaratagar00000000000000""" Tests for the examples given in stem's tutorial. """ import io import unittest import stem.descriptor.remote from stem.control import Controller from stem.descriptor.reader import DescriptorReader from stem.descriptor.router_status_entry import RouterStatusEntryV2, RouterStatusEntryV3 from stem.descriptor.networkstatus import NetworkStatusDocumentV3 from stem.descriptor.server_descriptor import RelayDescriptor from test.unit import exec_documentation_example try: from StringIO import StringIO except ImportError: from io import StringIO try: # added in python 3.3 from unittest.mock import Mock, patch except ImportError: from mock import Mock, patch OVER_THE_RIVER_OUTPUT = """\ * Connecting to tor * Creating our hidden service in /home/atagar/.tor/hello_world * Our service is available at uxiuaxejc3sxrb6i.onion, press ctrl+c to quit * Shutting down our hidden service """ MIRROR_MIRROR_OUTPUT = """\ 1. speedyexit (102.13 KB/s) 2. speedyexit (102.13 KB/s) 3. speedyexit (102.13 KB/s) """ class TestTutorial(unittest.TestCase): def tearDown(self): # Ensure we don't cache a Mock object as our downloader. Otherwise future # tests will understandably be very sad. :P stem.descriptor.remote.SINGLETON_DOWNLOADER = None @patch('sys.stdout', new_callable = StringIO) @patch('stem.control.Controller.from_port', spec = Controller) def test_the_little_relay_that_could(self, from_port_mock, stdout_mock): controller = from_port_mock().__enter__() controller.get_info.side_effect = lambda arg: { 'traffic/read': '33406', 'traffic/written': '29649', }[arg] exec_documentation_example('hello_world.py') self.assertEqual('My Tor relay has read 33406 bytes and written 29649.\n', stdout_mock.getvalue()) @patch('sys.stdout', new_callable = StringIO) @patch('shutil.rmtree') @patch('stem.control.Controller.from_port', spec = Controller) def test_over_the_river(self, from_port_mock, rmtree_mock, stdout_mock): def tutorial_example(app): import os import shutil from stem.control import Controller @app.route('/') def index(): return '

Hi Grandma!

' print(' * Connecting to tor') with Controller.from_port() as controller: controller.authenticate() # All hidden services have a directory on disk. Lets put ours in tor's data # directory. hidden_service_dir = os.path.join(controller.get_conf('DataDirectory', '/tmp'), 'hello_world') # Create a hidden service where visitors of port 80 get redirected to local # port 5000 (this is where flask runs by default). print(' * Creating our hidden service in %s' % hidden_service_dir) result = controller.create_hidden_service(hidden_service_dir, 80, target_port = 5000) # The hostname is only available we can read the hidden service directory. # This requires us to be running with the same user as tor. if result.hostname: print(' * Our service is available at %s, press ctrl+c to quit' % result.hostname) else: print(" * Unable to determine our service's hostname, probably due to being unable to read the hidden service directory") try: app.run() finally: # Shut down the hidden service and clean it off disk. Note that you *don't* # want to delete the hidden service directory if you'd like to have this # same *.onion address in the future. print(' * Shutting down our hidden service') controller.remove_hidden_service(hidden_service_dir) shutil.rmtree(hidden_service_dir) flask_mock = Mock() hidden_service_data = Mock() hidden_service_data.hostname = 'uxiuaxejc3sxrb6i.onion' controller = from_port_mock().__enter__() controller.get_conf.return_value = '/home/atagar/.tor' controller.create_hidden_service.return_value = hidden_service_data tutorial_example(flask_mock) controller.get_conf.assert_called_once_with('DataDirectory', '/tmp') controller.create_hidden_service.assert_called_once_with('/home/atagar/.tor/hello_world', 80, target_port = 5000) rmtree_mock.assert_called_once_with('/home/atagar/.tor/hello_world') self.assertEqual(OVER_THE_RIVER_OUTPUT, stdout_mock.getvalue()) @patch('sys.stdout', new_callable = StringIO) @patch('stem.descriptor.remote.DescriptorDownloader') def test_mirror_mirror_on_the_wall_1(self, downloader_mock, stdout_mock): downloader_mock().get_consensus.return_value = [RouterStatusEntryV2.create({ 'r': 'caerSidi p1aag7VwarGxqctS7/fS0y5FU+s oQZFLYe9e4A7bOkWKR7TaNxb0JE 2012-08-06 11:19:31 71.35.150.29 9001 0', })] exec_documentation_example('current_descriptors.py') self.assertEqual('found relay caerSidi (A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB)\n', stdout_mock.getvalue()) @patch('sys.stdout', new_callable = StringIO) @patch('stem.control.Controller.from_port', spec = Controller) def test_mirror_mirror_on_the_wall_2(self, from_port_mock, stdout_mock): controller = from_port_mock().__enter__() controller.get_network_statuses.return_value = [RouterStatusEntryV2.create({ 'r': 'caerSidi p1aag7VwarGxqctS7/fS0y5FU+s oQZFLYe9e4A7bOkWKR7TaNxb0JE 2012-08-06 11:19:31 71.35.150.29 9001 0', })] exec_documentation_example('descriptor_from_tor_control_socket.py') self.assertEqual('found relay caerSidi (A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB)\n', stdout_mock.getvalue()) @patch('sys.stdout', new_callable = StringIO) @patch('%s.open' % __name__, create = True) def test_mirror_mirror_on_the_wall_3(self, open_mock, stdout_mock): def tutorial_example(): from stem.descriptor import parse_file for desc in parse_file(open('/home/atagar/.tor/cached-consensus')): print('found relay %s (%s)' % (desc.nickname, desc.fingerprint)) test_file = io.BytesIO(NetworkStatusDocumentV3.content(routers = [RouterStatusEntryV3.create({ 'r': 'caerSidi p1aag7VwarGxqctS7/fS0y5FU+s oQZFLYe9e4A7bOkWKR7TaNxb0JE 2012-08-06 11:19:31 71.35.150.29 9001 0', })])) test_file.name = '/home/atagar/.tor/cached-consensus' open_mock.return_value = test_file tutorial_example() self.assertEqual('found relay caerSidi (A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB)\n', stdout_mock.getvalue()) @patch('sys.stdout', new_callable = StringIO) @patch('stem.descriptor.reader.DescriptorReader', spec = DescriptorReader) def test_mirror_mirror_on_the_wall_4(self, reader_mock, stdout_mock): reader = reader_mock().__enter__() reader.__iter__.return_value = iter([RelayDescriptor.create({'router': 'caerSidi 71.35.133.197 9001 0 0'})]) exec_documentation_example('past_descriptors.py') self.assertEqual('found relay caerSidi (None)\n', stdout_mock.getvalue()) @patch('sys.stdout', new_callable = StringIO) @patch('stem.descriptor.remote.DescriptorDownloader') @patch('stem.prereq.is_crypto_available', Mock(return_value = False)) def test_mirror_mirror_on_the_wall_5(self, downloader_mock, stdout_mock): def tutorial_example(): from stem.descriptor.remote import DescriptorDownloader from stem.util import str_tools # provides a mapping of observed bandwidth to the relay nicknames def get_bw_to_relay(): bw_to_relay = {} downloader = DescriptorDownloader() try: for desc in downloader.get_server_descriptors().run(): if desc.exit_policy.is_exiting_allowed(): bw_to_relay.setdefault(desc.observed_bandwidth, []).append(desc.nickname) except Exception as exc: print('Unable to retrieve the server descriptors: %s' % exc) return bw_to_relay # prints the top fifteen relays bw_to_relay = get_bw_to_relay() count = 1 for bw_value in sorted(bw_to_relay.keys(), reverse = True): for nickname in bw_to_relay[bw_value]: print('%i. %s (%s/s)' % (count, nickname, str_tools.size_label(bw_value, 2))) count += 1 if count > 15: return exit_descriptor = RelayDescriptor.content({'router': 'speedyexit 149.255.97.109 9001 0 0'}).replace(b'reject *:*', b'accept *:*') exit_descriptor = RelayDescriptor(exit_descriptor) downloader_mock().get_server_descriptors().run.return_value = [ exit_descriptor, RelayDescriptor.create(), # non-exit exit_descriptor, exit_descriptor, ] tutorial_example() self.assertEqual(MIRROR_MIRROR_OUTPUT, stdout_mock.getvalue()) stem-1.7.1/test/arguments.py0000664000175000017500000001004513341034346016551 0ustar atagaratagar00000000000000# Copyright 2015-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Commandline argument parsing for our test runner. """ import collections import getopt import stem.util.conf import stem.util.log import test LOG_TYPE_ERROR = """\ '%s' isn't a logging runlevel, use one of the following instead: TRACE, DEBUG, INFO, NOTICE, WARN, ERROR """ CONFIG = stem.util.conf.config_dict('test', { 'msg.help': '', 'target.description': {}, 'target.torrc': {}, }) DEFAULT_ARGS = { 'run_unit': False, 'run_integ': False, 'specific_test': None, 'logging_runlevel': None, 'tor_path': 'tor', 'run_targets': [test.Target.RUN_OPEN], 'attribute_targets': [], 'quiet': False, 'verbose': False, 'print_help': False, } OPT = 'auit:l:qvh' OPT_EXPANDED = ['all', 'unit', 'integ', 'targets=', 'test=', 'log=', 'tor=', 'quiet', 'verbose', 'help'] def parse(argv): """ Parses our arguments, providing a named tuple with their values. :param list argv: input arguments to be parsed :returns: a **named tuple** with our parsed arguments :raises: **ValueError** if we got an invalid argument """ args = dict(DEFAULT_ARGS) try: recognized_args, unrecognized_args = getopt.getopt(argv, OPT, OPT_EXPANDED) if unrecognized_args: error_msg = "aren't recognized arguments" if len(unrecognized_args) > 1 else "isn't a recognized argument" raise getopt.GetoptError("'%s' %s" % ("', '".join(unrecognized_args), error_msg)) except Exception as exc: raise ValueError('%s (for usage provide --help)' % exc) for opt, arg in recognized_args: if opt in ('-a', '--all'): args['run_unit'] = True args['run_integ'] = True elif opt in ('-u', '--unit'): args['run_unit'] = True elif opt in ('-i', '--integ'): args['run_integ'] = True elif opt in ('-t', '--targets'): run_targets, attribute_targets = [], [] integ_targets = arg.split(',') all_run_targets = [t for t in test.Target if CONFIG['target.torrc'].get(t) is not None] # validates the targets and split them into run and attribute targets if not integ_targets: raise ValueError('No targets provided') for target in integ_targets: if target not in test.Target: raise ValueError('Invalid integration target: %s' % target) elif target in all_run_targets: run_targets.append(target) else: attribute_targets.append(target) # check if we were told to use all run targets if test.Target.RUN_ALL in attribute_targets: attribute_targets.remove(test.Target.RUN_ALL) run_targets = all_run_targets # if no RUN_* targets are provided then keep the default (otherwise we # won't have any tests to run) if run_targets: args['run_targets'] = run_targets args['attribute_targets'] = attribute_targets elif opt == '--test': args['specific_test'] = arg elif opt in ('-l', '--log'): arg = arg.upper() if arg not in stem.util.log.LOG_VALUES: raise ValueError(LOG_TYPE_ERROR % arg) args['logging_runlevel'] = arg elif opt in ('--tor'): args['tor_path'] = arg elif opt in ('-q', '--quiet'): args['quiet'] = True elif opt in ('-v', '--verbose'): args['verbose'] = True elif opt in ('-h', '--help'): args['print_help'] = True # translates our args dict into a named tuple Args = collections.namedtuple('Args', args.keys()) return Args(**args) def get_help(): """ Provides usage information, as provided by the '--help' argument. This includes a listing of the valid integration targets. :returns: **str** with our usage information """ help_msg = CONFIG['msg.help'] # gets the longest target length so we can show the entries in columns target_name_length = max(map(len, test.Target)) description_format = '\n %%-%is - %%s' % target_name_length for target in test.Target: help_msg += description_format % (target, CONFIG['target.description'].get(target, '')) help_msg += '\n' return help_msg stem-1.7.1/test/integ/0000775000175000017500000000000013411004021015261 5ustar atagaratagar00000000000000stem-1.7.1/test/integ/process.py0000664000175000017500000005365213340051401017331 0ustar atagaratagar00000000000000""" Tests the stem.process functions with various use cases. """ from __future__ import absolute_import import binascii import hashlib import os import random import re import shutil import subprocess import tempfile import threading import time import unittest import stem.prereq import stem.process import stem.socket import stem.util.str_tools import stem.util.system import stem.util.test_tools import stem.util.tor_tools import stem.version import test import test.require from contextlib import contextmanager from stem.util.test_tools import asynchronous, assert_equal, assert_in, skip try: # added in python 3.3 from unittest.mock import patch, Mock except ImportError: from mock import patch, Mock BASIC_RELAY_TORRC = """\ SocksPort 9089 ExtORPort 6001 Nickname stemIntegTest ExitPolicy reject *:* PublishServerDescriptor 0 DataDirectory %s """ TOR_CMD = 'tor' def random_port(): while True: port = random.randint(1024, 65535) if stem.util.system.pid_by_port(port) is None: return str(port) @contextmanager def tmp_directory(): tmp_dir = tempfile.mkdtemp() try: yield tmp_dir finally: shutil.rmtree(tmp_dir) @contextmanager def torrc(): with tmp_directory() as data_directory: torrc_path = os.path.join(data_directory, 'torrc') with open(torrc_path, 'w') as torrc_file: torrc_file.write(BASIC_RELAY_TORRC % data_directory) yield torrc_path def run_tor(tor_cmd, *args, **kwargs): # python doesn't allow us to have individual keyword arguments when there's # an arbitrary number of positional arguments, so explicitly checking expect_failure = kwargs.pop('expect_failure', False) with_torrc = kwargs.pop('with_torrc', False) stdin = kwargs.pop('stdin', None) if kwargs: raise ValueError('Got unexpected keyword arguments: %s' % kwargs) with torrc() as torrc_path: if with_torrc: args = ['-f', torrc_path] + list(args) args = [tor_cmd] + list(args) tor_process = subprocess.Popen(args, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE) if stdin: tor_process.stdin.write(stem.util.str_tools._to_bytes(stdin)) stdout = tor_process.communicate()[0] exit_status = tor_process.poll() if exit_status and not expect_failure: raise AssertionError("Tor failed to start when we ran: %s\n%s" % (' '.join(args), stdout)) elif not exit_status and expect_failure: raise AssertionError("Didn't expect tor to be able to start when we run: %s\n%s" % (' '.join(args), stdout)) return stem.util.str_tools._to_unicode(stdout) if stem.prereq.is_python_3() else stdout class TestProcess(unittest.TestCase): @staticmethod def run_tests(args): global TOR_CMD TOR_CMD = args.tor_cmd for func, async_test in stem.util.test_tools.ASYNC_TESTS.items(): if func.startswith('test.integ.process.'): async_test.run(TOR_CMD) @asynchronous def test_version_argument(tor_cmd): """ Check that 'tor --version' matches 'GETINFO version'. """ assert_equal('Tor version %s.\n' % test.tor_version(), run_tor(tor_cmd, '--version')) @asynchronous def test_help_argument(tor_cmd): """ Check that 'tor --help' provides the expected output. """ help_output = run_tor(tor_cmd, '--help') if not help_output.startswith('Copyright (c) 2001') or not help_output.endswith('tor -f [args]\nSee man page for options, or https://www.torproject.org/ for documentation.\n'): raise AssertionError("Help output didn't have the expected strings: %s" % help_output) assert_equal(help_output, run_tor(tor_cmd, '-h'), "'tor -h' should simply be an alias for 'tor --help'") @asynchronous def test_quiet_argument(tor_cmd): """ Check that we don't provide anything on stdout when running 'tor --quiet'. """ quiet_output = run_tor(tor_cmd, '--quiet', '--invalid_argument', 'true', expect_failure = True) assert_equal('', quiet_output, 'No output should be provided with the --quiet argument') @asynchronous def test_hush_argument(tor_cmd): """ Check that we only get warnings and errors when running 'tor --hush'. """ output = run_tor(tor_cmd, '--hush', '--invalid_argument', expect_failure = True) assert_in("[warn] Command-line option '--invalid_argument' with no value. Failing.", output) output = run_tor(tor_cmd, '--hush', '--invalid_argument', 'true', expect_failure = True) assert_in("[warn] Failed to parse/validate config: Unknown option 'invalid_argument'. Failing.", output) @asynchronous def test_hash_password(tor_cmd): """ Hash a controller password. It's salted so can't assert that we get a particular value. Also, tor's output is unnecessarily verbose so including hush to cut it down. """ output = run_tor(tor_cmd, '--hush', '--hash-password', 'my_password').splitlines()[-1] if not re.match('^16:[0-9A-F]{58}$', output): raise AssertionError("Unexpected response from 'tor --hash-password my_password': %s" % output) # I'm not gonna even pretend to understand the following. Ported directly # from tor's test_cmdline_args.py. if stem.prereq.is_python_3(): output_hex = binascii.a2b_hex(stem.util.str_tools._to_bytes(output).strip()[3:]) salt, how, hashed = output_hex[:8], output_hex[8], output_hex[9:] else: output_hex = binascii.a2b_hex(output.strip()[3:]) salt, how, hashed = output_hex[:8], ord(output_hex[8]), output_hex[9:] count = (16 + (how & 15)) << ((how >> 4) + 6) stuff = salt + b'my_password' repetitions = count // len(stuff) + 1 inp = (stuff * repetitions)[:count] assert_equal(hashlib.sha1(inp).digest(), hashed) @asynchronous def test_hash_password_requires_argument(tor_cmd): """ Check that 'tor --hash-password' balks if not provided with something to hash. """ output = run_tor(tor_cmd, '--hash-password', expect_failure = True) assert_in("[warn] Command-line option '--hash-password' with no value. Failing.", output) @asynchronous def test_dump_config_argument(tor_cmd): """ Exercises our 'tor --dump-config' arugments. """ short_output = run_tor(tor_cmd, '--dump-config', 'short', with_torrc = True) non_builtin_output = run_tor(tor_cmd, '--dump-config', 'non-builtin', with_torrc = True) full_output = run_tor(tor_cmd, '--dump-config', 'full', with_torrc = True) run_tor(tor_cmd, '--dump-config', 'invalid_option', with_torrc = True, expect_failure = True) assert_in('Nickname stemIntegTest', short_output) assert_in('Nickname stemIntegTest', non_builtin_output) assert_in('Nickname stemIntegTest', full_output) @asynchronous def test_validate_config_argument(tor_cmd): """ Exercises our 'tor --validate-config' argument. """ valid_output = run_tor(tor_cmd, '--verify-config', with_torrc = True) assert_in('Configuration was valid\n', valid_output, 'Expected configuration to be valid') run_tor(tor_cmd, '--verify-config', '-f', __file__, expect_failure = True) @asynchronous def test_list_fingerprint_argument(tor_cmd): """ Exercise our 'tor --list-fingerprint' argument. """ # This command should only work with a relay (which our test instance isn't). output = run_tor(tor_cmd, '--list-fingerprint', with_torrc = True, expect_failure = True) assert_in("Clients don't have long-term identity keys. Exiting.", output, 'Should fail to start due to lacking an ORPort') with tmp_directory() as data_directory: torrc_path = os.path.join(data_directory, 'torrc') with open(torrc_path, 'w') as torrc_file: torrc_file.write(BASIC_RELAY_TORRC % data_directory + '\nORPort 6954') output = run_tor(tor_cmd, '--list-fingerprint', '-f', torrc_path) nickname, fingerprint_with_spaces = output.splitlines()[-1].split(' ', 1) fingerprint = fingerprint_with_spaces.replace(' ', '') assert_equal('stemIntegTest', nickname) assert_equal(49, len(fingerprint_with_spaces)) if not stem.util.tor_tools.is_valid_fingerprint(fingerprint): raise AssertionError('We should have a valid fingerprint: %s' % fingerprint) with open(os.path.join(data_directory, 'fingerprint')) as fingerprint_file: expected = 'stemIntegTest %s\n' % fingerprint assert_equal(expected, fingerprint_file.read()) @asynchronous def test_list_torrc_options_argument(tor_cmd): """ Exercise our 'tor --list-torrc-options' argument. """ output = run_tor(tor_cmd, '--list-torrc-options') if len(output.splitlines()) < 50: raise AssertionError("'tor --list-torrc-options' should have numerous entries, but only had %i" % len(output.splitlines())) elif 'UseBridges' not in output or 'SocksPort' not in output: raise AssertionError("'tor --list-torrc-options' didn't have options we expect") @asynchronous def test_no_orphaned_process(tor_cmd): """ Check that when an exception arises in the middle of spawning tor that we don't leave a lingering process. """ if not stem.util.system.is_available('sleep'): skip('(sleep unavailable)') with patch('re.compile', Mock(side_effect = KeyboardInterrupt('nope'))): # We don't need to actually run tor for this test. Rather, any process will # do the trick. Picking sleep so this'll clean itself up if our test fails. mock_tor_process = subprocess.Popen(['sleep', '60']) with patch('subprocess.Popen', Mock(return_value = mock_tor_process)): try: stem.process.launch_tor(tor_cmd) raise AssertionError("tor shoudn't have started") except KeyboardInterrupt as exc: if os.path.exists('/proc/%s' % mock_tor_process.pid): raise AssertionError('launch_tor() left a lingering tor process') assert_equal('nope', str(exc)) @asynchronous def test_torrc_arguments(tor_cmd): """ Pass configuration options on the commandline. """ with torrc() as torrc_path: config_args = [ '+SocksPort', '9090', # append an extra SocksPort '/ExtORPort', # drops our ExtORPort '/TransPort', # drops a port we didn't originally have '+ControlPort', '9005', # appends a ControlPort where we didn't have any before ] output = run_tor(tor_cmd, '-f', torrc_path, '--dump-config', 'short', *config_args) result = [line for line in output.splitlines() if not line.startswith('DataDirectory')] expected = [ 'ControlPort 9005', 'ExitPolicy reject *:*', 'Nickname stemIntegTest', 'PublishServerDescriptor 0', 'SocksPort 9089', 'SocksPort 9090', ] assert_equal(expected, result) @asynchronous def test_torrc_arguments_via_stdin(tor_cmd): """ Pass configuration options via stdin. """ if test.tor_version() < stem.version.Requirement.TORRC_VIA_STDIN: skip('(requires %s)' % stem.version.Requirement.TORRC_VIA_STDIN) with tmp_directory() as data_directory: torrc = BASIC_RELAY_TORRC % data_directory output = run_tor(tor_cmd, '-f', '-', '--dump-config', 'short', stdin = torrc) assert_equal(sorted(torrc.splitlines()), sorted(output.splitlines())) @asynchronous def test_with_missing_torrc(tor_cmd): """ Provide a torrc path that doesn't exist. """ output = run_tor(tor_cmd, '-f', '/path/that/really/shouldnt/exist', '--verify-config', expect_failure = True) assert_in('[warn] Unable to open configuration file "/path/that/really/shouldnt/exist".', output, 'Tor should refuse to read a non-existant torrc file') output = run_tor(tor_cmd, '-f', '/path/that/really/shouldnt/exist', '--verify-config', '--ignore-missing-torrc') assert_in('[notice] Configuration file "/path/that/really/shouldnt/exist" not present, using reasonable defaults.', output, 'Missing torrc should be allowed with --ignore-missing-torrc') @asynchronous def test_unanonymous_hidden_service_config_must_match(tor_cmd): """ Checking that startup fails if HiddenServiceNonAnonymousMode and HiddenServiceSingleHopMode don't match. """ try: stem.process.launch_tor_with_config( tor_cmd = tor_cmd, config = {'HiddenServiceNonAnonymousMode': '1'}, ) raise AssertionError("Tor shouldn't start with 'HiddenServiceNonAnonymousMode' set but not 'HiddenServiceSingleHopMode'") except OSError as exc: if test.tor_version() >= stem.version.Requirement.ADD_ONION_NON_ANONYMOUS: assert_equal('Process terminated: HiddenServiceNonAnonymousMode does not provide any server anonymity. It must be used with HiddenServiceSingleHopMode set to 1.', str(exc)) else: assert_equal("Process terminated: Unknown option 'HiddenServiceNonAnonymousMode'. Failing.", str(exc)) try: stem.process.launch_tor_with_config( tor_cmd = tor_cmd, config = {'HiddenServiceSingleHopMode': '1'}, ) raise AssertionError("Tor shouldn't start with 'HiddenServiceSingleHopMode' set but not 'HiddenServiceNonAnonymousMode'") except OSError as exc: if test.tor_version() >= stem.version.Requirement.ADD_ONION_NON_ANONYMOUS: assert_equal('Process terminated: HiddenServiceSingleHopMode does not provide any server anonymity. It must be used with HiddenServiceNonAnonymousMode set to 1.', str(exc)) else: assert_equal("Process terminated: Unknown option 'HiddenServiceSingleHopMode'. Failing.", str(exc)) @asynchronous def test_can_run_multithreaded(tor_cmd): """ Our launch_tor() function uses signal to support its timeout argument. This only works in the main thread so ensure we give a useful message when it isn't. """ with tmp_directory() as data_directory: # Tries running tor in another thread with the given timeout argument. This # issues an invalid torrc so we terminate right away if we get to the point # of actually invoking tor. # # Returns None if launching tor is successful, and otherwise returns the # exception we raised. def launch_async_with_timeout(timeout_arg): raised_exc = [None] def short_launch(): try: stem.process.launch_tor_with_config( tor_cmd = tor_cmd, config = { 'SocksPort': 'invalid', 'DataDirectory': data_directory, }, completion_percent = 100, timeout = timeout_arg, ) except Exception as exc: raised_exc[0] = exc t = threading.Thread(target = short_launch) t.start() t.join() if 'Invalid SocksPort' in str(raised_exc[0]): return None # got to the point of invoking tor else: return raised_exc[0] exc = launch_async_with_timeout(0.5) assert_equal(OSError, type(exc)) assert_equal('Launching tor with a timeout can only be done in the main thread', str(exc)) # We should launch successfully if no timeout is specified or we specify it # to be 'None'. if launch_async_with_timeout(None) is not None: raise AssertionError('Launching tor without a timeout should be successful') if launch_async_with_timeout(stem.process.DEFAULT_INIT_TIMEOUT) is not None: raise AssertionError('Launching tor with the default timeout should be successful') @asynchronous def test_launch_tor_with_config_via_file(tor_cmd): """ Exercises launch_tor_with_config when we write a torrc to disk. """ with tmp_directory() as data_directory: control_port = random_port() control_socket, tor_process = None, None try: # Launch tor without a torrc, but with a control port. Confirms that this # works by checking that we're still able to access the new instance. with patch('stem.version.get_system_tor_version', Mock(return_value = stem.version.Version('0.0.0.1'))): tor_process = stem.process.launch_tor_with_config( tor_cmd = tor_cmd, config = { 'SocksPort': random_port(), 'ControlPort': control_port, 'DataDirectory': data_directory, }, completion_percent = 5 ) control_socket = stem.socket.ControlPort(port = int(control_port)) stem.connection.authenticate(control_socket) # exercises the socket control_socket.send('GETCONF ControlPort') getconf_response = control_socket.recv() assert_equal('ControlPort=%s' % control_port, str(getconf_response)) finally: if control_socket: control_socket.close() if tor_process: tor_process.kill() tor_process.wait() @asynchronous def test_launch_tor_with_config_via_stdin(tor_cmd): """ Exercises launch_tor_with_config when we provide our torrc via stdin. """ if test.tor_version() < stem.version.Requirement.TORRC_VIA_STDIN: skip('(requires %s)' % stem.version.Requirement.TORRC_VIA_STDIN) with tmp_directory() as data_directory: control_port = random_port() control_socket, tor_process = None, None try: tor_process = stem.process.launch_tor_with_config( tor_cmd = tor_cmd, config = { 'SocksPort': random_port(), 'ControlPort': control_port, 'DataDirectory': data_directory, }, completion_percent = 5 ) control_socket = stem.socket.ControlPort(port = int(control_port)) stem.connection.authenticate(control_socket) # exercises the socket control_socket.send('GETCONF ControlPort') getconf_response = control_socket.recv() assert_equal('ControlPort=%s' % control_port, str(getconf_response)) finally: if control_socket: control_socket.close() if tor_process: tor_process.kill() tor_process.wait() @asynchronous def test_with_invalid_config(tor_cmd): """ Spawn a tor process with a configuration that should make it dead on arrival. """ # Set the same SocksPort and ControlPort, this should fail with... # # [warn] Failed to parse/validate config: Failed to bind one of the listener ports. # [err] Reading config failed--see warnings above. with tmp_directory() as data_directory: both_ports = random_port() try: stem.process.launch_tor_with_config( tor_cmd = tor_cmd, config = { 'SocksPort': both_ports, 'ControlPort': both_ports, 'DataDirectory': data_directory, }, ) raise AssertionError('Tor should fail to launch') except OSError as exc: assert_equal('Process terminated: Failed to bind one of the listener ports.', str(exc)) def test_launch_tor_with_timeout(self): """ Runs launch_tor where it times out before completing. """ with tmp_directory() as data_directory: start_time = time.time() try: stem.process.launch_tor_with_config( tor_cmd = TOR_CMD, timeout = 0.05, config = { 'SocksPort': random_port(), 'DataDirectory': data_directory, }, ) raise AssertionError('Tor should fail to launch') except OSError: runtime = time.time() - start_time if not (runtime > 0.05 and runtime < 3): raise AssertionError('Test should have taken 0.05-3 seconds, took %0.1f instead' % runtime) @asynchronous def test_take_ownership_via_pid(tor_cmd): """ Checks that the tor process quits after we do if we set take_ownership. To test this we spawn a process and trick tor into thinking that it is us. """ if not stem.util.system.is_available('sleep'): skip('(sleep unavailable)') elif test.tor_version() < stem.version.Requirement.TAKEOWNERSHIP: skip('(requires %s)' % stem.version.Requirement.TAKEOWNERSHIP) with tmp_directory() as data_directory: sleep_process = subprocess.Popen(['sleep', '60']) tor_process = stem.process.launch_tor_with_config( tor_cmd = tor_cmd, config = { 'SocksPort': random_port(), 'ControlPort': random_port(), 'DataDirectory': data_directory, '__OwningControllerProcess': str(sleep_process.pid), }, completion_percent = 5, ) # Kill the sleep command. Tor should quit shortly after. sleep_process.kill() sleep_process.communicate() # tor polls for the process every fifteen seconds so this may take a # while... # # https://trac.torproject.org/projects/tor/ticket/21281 start_time = time.time() while time.time() - start_time < 30: if tor_process.poll() == 0: return # tor exited time.sleep(0.01) raise AssertionError("tor didn't quit after the process that owned it terminated") @asynchronous def test_take_ownership_via_controller(tor_cmd): """ Checks that the tor process quits after the controller that owns it connects, then disconnects.. """ if test.tor_version() < stem.version.Requirement.TAKEOWNERSHIP: skip('(requires %s)' % stem.version.Requirement.TAKEOWNERSHIP) with tmp_directory() as data_directory: control_port = random_port() tor_process = stem.process.launch_tor_with_config( tor_cmd = tor_cmd, config = { 'SocksPort': random_port(), 'ControlPort': control_port, 'DataDirectory': data_directory, }, completion_percent = 5, take_ownership = True, ) # We're the controlling process. Just need to connect then disconnect. controller = stem.control.Controller.from_port(port = int(control_port)) controller.authenticate() controller.close() # give tor a few seconds to quit start_time = time.time() while time.time() - start_time < 5: if tor_process.poll() == 0: return # tor exited time.sleep(0.01) raise AssertionError("tor didn't quit after the controller that owned it disconnected") stem-1.7.1/test/integ/socket/0000775000175000017500000000000013411004021016551 5ustar atagaratagar00000000000000stem-1.7.1/test/integ/socket/control_socket.py0000664000175000017500000001236013237375570022207 0ustar atagaratagar00000000000000""" Integration tests for the stem.socket.ControlSocket subclasses. When ran these test basic functionality for a ControlPort *or* ControlSocketFile, depending on which can connect to our tor instance. These tests share a similar domain with those for the ControlMessage, but where those focus on parsing and correctness of the content these are more concerned with the behavior of the socket itself. """ import time import unittest import stem.connection import stem.control import stem.socket import test import test.require import test.runner class TestControlSocket(unittest.TestCase): @test.require.controller def test_connection_time(self): """ Checks that our connection_time method tracks when our state's changed. """ test_start = time.time() runner = test.runner.get_runner() with runner.get_tor_socket() as control_socket: connection_time = control_socket.connection_time() # connection time should be between our tests start and now self.assertTrue(test_start <= connection_time <= time.time()) # connection time should be absolute (shouldn't change as time goes on) time.sleep(0.001) self.assertEqual(connection_time, control_socket.connection_time()) # should change to the disconnection time if we detactch control_socket.close() disconnection_time = control_socket.connection_time() self.assertTrue(connection_time < disconnection_time <= time.time()) # then change again if we reconnect time.sleep(0.001) control_socket.connect() reconnection_time = control_socket.connection_time() self.assertTrue(disconnection_time < reconnection_time <= time.time()) @test.require.controller def test_send_buffered(self): """ Sends multiple requests before receiving back any of the replies. """ runner = test.runner.get_runner() with runner.get_tor_socket() as control_socket: for _ in range(100): control_socket.send('GETINFO version') for _ in range(100): response = control_socket.recv() self.assertTrue(str(response).startswith('version=%s' % test.tor_version())) self.assertTrue(str(response).endswith('\nOK')) @test.require.controller def test_send_closed(self): """ Sends a message after we've closed the connection. """ with test.runner.get_runner().get_tor_socket() as control_socket: self.assertTrue(control_socket.is_alive()) control_socket.close() self.assertFalse(control_socket.is_alive()) self.assertRaises(stem.SocketClosed, control_socket.send, 'blarg') @test.require.controller def test_send_disconnected(self): """ Sends a message to a socket that has been disconnected by the other end. Our behavior upon disconnection slightly differs based on if we're a port or socket file based connection. With a control port we won't notice the disconnect (is_alive() will return True) until we've made a failed recv() call. With a file socket, however, we'll also fail when calling send(). """ with test.runner.get_runner().get_tor_socket() as control_socket: control_socket.send('QUIT') self.assertEqual('closing connection', str(control_socket.recv())) self.assertTrue(control_socket.is_alive()) # If we send another message to a port based socket then it will seem to # succeed. However, a file based socket should report a failure. if isinstance(control_socket, stem.socket.ControlPort): control_socket.send('blarg') self.assertTrue(control_socket.is_alive()) else: self.assertRaises(stem.SocketClosed, control_socket.send, 'blarg') self.assertFalse(control_socket.is_alive()) @test.require.controller def test_recv_closed(self): """ Receives a message after we've closed the connection. """ with test.runner.get_runner().get_tor_socket() as control_socket: self.assertTrue(control_socket.is_alive()) control_socket.close() self.assertFalse(control_socket.is_alive()) self.assertRaises(stem.SocketClosed, control_socket.recv) @test.require.controller def test_recv_disconnected(self): """ Receives a message from a socket that has been disconnected by the other end. """ with test.runner.get_runner().get_tor_socket() as control_socket: control_socket.send('QUIT') self.assertEqual('closing connection', str(control_socket.recv())) # Neither a port or file based socket will know that tor has hung up on # the connection at this point. We should know after calling recv(), # however. self.assertTrue(control_socket.is_alive()) self.assertRaises(stem.SocketClosed, control_socket.recv) self.assertFalse(control_socket.is_alive()) @test.require.controller def test_connect_repeatedly(self): """ Checks that we can reconnect, use, and disconnect a socket repeatedly. """ with test.runner.get_runner().get_tor_socket(False) as control_socket: for _ in range(10): # this will raise if the PROTOCOLINFO query fails stem.connection.get_protocolinfo(control_socket) control_socket.close() self.assertRaises(stem.SocketClosed, control_socket.send, 'PROTOCOLINFO 1') control_socket.connect() stem-1.7.1/test/integ/socket/__init__.py0000664000175000017500000000013413237375570020712 0ustar atagaratagar00000000000000""" Integration tests for stem.socket. """ __all__ = ['control_message', 'control_socket'] stem-1.7.1/test/integ/socket/control_message.py0000664000175000017500000001625213237375570022347 0ustar atagaratagar00000000000000""" Integration tests for the stem.response.ControlMessage class. """ import re import unittest import stem.socket import stem.version import test.require import test.runner class TestControlMessage(unittest.TestCase): @test.require.controller def test_unestablished_socket(self): """ Checks message parsing when we have a valid but unauthenticated socket. """ # If an unauthenticated connection gets a message besides AUTHENTICATE or # PROTOCOLINFO then tor will give an 'Authentication required.' message and # hang up. control_socket = test.runner.get_runner().get_tor_socket(False) control_socket.send('GETINFO version') auth_required_response = control_socket.recv() self.assertEqual('Authentication required.', str(auth_required_response)) self.assertEqual(['Authentication required.'], list(auth_required_response)) self.assertEqual('514 Authentication required.\r\n', auth_required_response.raw_content()) self.assertEqual([('514', ' ', 'Authentication required.')], auth_required_response.content()) # The socket's broken but doesn't realize it yet. These use cases are # checked in more depth by the ControlSocket integ tests. self.assertTrue(control_socket.is_alive()) self.assertRaises(stem.SocketClosed, control_socket.recv) self.assertFalse(control_socket.is_alive()) # Additional socket usage should fail, and pulling more responses will fail # with more closed exceptions. self.assertRaises(stem.SocketError, control_socket.send, 'GETINFO version') self.assertRaises(stem.SocketClosed, control_socket.recv) self.assertRaises(stem.SocketClosed, control_socket.recv) self.assertRaises(stem.SocketClosed, control_socket.recv) # The socket connection is already broken so calling close shouldn't have # an impact. control_socket.close() self.assertRaises(stem.SocketClosed, control_socket.send, 'GETINFO version') self.assertRaises(stem.SocketClosed, control_socket.recv) @test.require.controller def test_invalid_command(self): """ Parses the response for a command which doesn't exist. """ with test.runner.get_runner().get_tor_socket() as control_socket: control_socket.send('blarg') unrecognized_command_response = control_socket.recv() self.assertEqual('Unrecognized command "blarg"', str(unrecognized_command_response)) self.assertEqual(['Unrecognized command "blarg"'], list(unrecognized_command_response)) self.assertEqual('510 Unrecognized command "blarg"\r\n', unrecognized_command_response.raw_content()) self.assertEqual([('510', ' ', 'Unrecognized command "blarg"')], unrecognized_command_response.content()) @test.require.controller def test_invalid_getinfo(self): """ Parses the response for a GETINFO query which doesn't exist. """ with test.runner.get_runner().get_tor_socket() as control_socket: control_socket.send('GETINFO blarg') unrecognized_key_response = control_socket.recv() self.assertEqual('Unrecognized key "blarg"', str(unrecognized_key_response)) self.assertEqual(['Unrecognized key "blarg"'], list(unrecognized_key_response)) self.assertEqual('552 Unrecognized key "blarg"\r\n', unrecognized_key_response.raw_content()) self.assertEqual([('552', ' ', 'Unrecognized key "blarg"')], unrecognized_key_response.content()) @test.require.controller def test_getinfo_config_file(self): """ Parses the 'GETINFO config-file' response. """ runner = test.runner.get_runner() torrc_dst = runner.get_torrc_path() with runner.get_tor_socket() as control_socket: control_socket.send('GETINFO config-file') config_file_response = control_socket.recv() self.assertEqual('config-file=%s\nOK' % torrc_dst, str(config_file_response)) self.assertEqual(['config-file=%s' % torrc_dst, 'OK'], list(config_file_response)) self.assertEqual('250-config-file=%s\r\n250 OK\r\n' % torrc_dst, config_file_response.raw_content()) self.assertEqual([('250', '-', 'config-file=%s' % torrc_dst), ('250', ' ', 'OK')], config_file_response.content()) @test.require.controller @test.require.version(stem.version.Requirement.GETINFO_CONFIG_TEXT) def test_getinfo_config_text(self): """ Parses the 'GETINFO config-text' response. """ runner = test.runner.get_runner() # We can't be certain of the order, and there may be extra config-text # entries as per... # https://trac.torproject.org/projects/tor/ticket/2362 # # so we'll just check that the response is a superset of our config torrc_contents = [] for line in runner.get_torrc_contents().splitlines(): line = line.strip() if line and not line.startswith('#'): torrc_contents.append(line) with runner.get_tor_socket() as control_socket: control_socket.send('GETINFO config-text') config_text_response = control_socket.recv() # the response should contain two entries, the first being a data response self.assertEqual(2, len(list(config_text_response))) self.assertEqual('OK', list(config_text_response)[1]) self.assertEqual(('250', ' ', 'OK'), config_text_response.content()[1]) self.assertTrue(config_text_response.raw_content().startswith('250+config-text=\r\n')) self.assertTrue(config_text_response.raw_content().endswith('\r\n.\r\n250 OK\r\n')) self.assertTrue(str(config_text_response).startswith('config-text=\n')) self.assertTrue(str(config_text_response).endswith('\nOK')) for torrc_entry in torrc_contents: self.assertTrue('\n%s\n' % torrc_entry in str(config_text_response)) self.assertTrue(torrc_entry in list(config_text_response)[0]) self.assertTrue('%s\r\n' % torrc_entry in config_text_response.raw_content()) self.assertTrue('%s' % torrc_entry in config_text_response.content()[0][2]) @test.require.controller def test_setconf_event(self): """ Issues 'SETEVENTS CONF_CHANGED' and parses an events. """ with test.runner.get_runner().get_tor_socket() as control_socket: control_socket.send('SETEVENTS CONF_CHANGED') setevents_response = control_socket.recv() self.assertEqual('OK', str(setevents_response)) self.assertEqual(['OK'], list(setevents_response)) self.assertEqual('250 OK\r\n', setevents_response.raw_content()) self.assertEqual([('250', ' ', 'OK')], setevents_response.content()) # We'll receive both a CONF_CHANGED event and 'OK' response for the # SETCONF, but not necessarily in any specific order. control_socket.send('SETCONF NodeFamily=FD4CC275C5AA4D27A487C6CA29097900F85E2C33') msg1 = control_socket.recv() msg2 = control_socket.recv() if msg1.content()[0][0] == '650': conf_changed_event, setconf_response = msg1, msg2 else: setconf_response, conf_changed_event = msg1, msg2 self.assertTrue(re.match('CONF_CHANGED\nNodeFamily=.*', str(conf_changed_event))) self.assertTrue(re.match('650-CONF_CHANGED\r\n650-NodeFamily=.*\r\n650 OK', conf_changed_event.raw_content())) self.assertEqual(('650', '-'), conf_changed_event.content()[0][:2]) self.assertEqual([('250', ' ', 'OK')], setconf_response.content()) stem-1.7.1/test/integ/control/0000775000175000017500000000000013411004021016741 5ustar atagaratagar00000000000000stem-1.7.1/test/integ/control/base_controller.py0000664000175000017500000002042113237375570022521 0ustar atagaratagar00000000000000""" Integration tests for the stem.control.BaseController class. """ import os import hashlib import re import threading import time import unittest import stem.control import stem.socket import stem.util.system import test.require import test.runner class StateObserver(object): """ Simple container for listening to ControlSocket state changes and rembembering them for the test. """ controller = None state = None timestamp = None def reset(self): self.controller = None self.state = None self.timestamp = None def listener(self, controller, state, timestamp): self.controller = controller self.state = state self.timestamp = timestamp class TestBaseController(unittest.TestCase): @test.require.controller def test_connect_repeatedly(self): """ Connects and closes the socket repeatedly. This is a simple attempt to trigger concurrency issues. """ if stem.util.system.is_mac(): self.skipTest('(ticket #6235)') return with test.runner.get_runner().get_tor_socket() as control_socket: controller = stem.control.BaseController(control_socket) for _ in range(50): controller.connect() controller.close() @test.require.controller def test_msg(self): """ Tests a basic query with the msg() method. """ with test.runner.get_runner().get_tor_socket() as control_socket: controller = stem.control.BaseController(control_socket) test.runner.exercise_controller(self, controller) @test.require.controller def test_msg_invalid(self): """ Tests the msg() method against an invalid controller command. """ with test.runner.get_runner().get_tor_socket() as control_socket: controller = stem.control.BaseController(control_socket) response = controller.msg('invalid') self.assertEqual('Unrecognized command "invalid"', str(response)) @test.require.controller def test_msg_invalid_getinfo(self): """ Tests the msg() method against a non-existant GETINFO option. """ with test.runner.get_runner().get_tor_socket() as control_socket: controller = stem.control.BaseController(control_socket) response = controller.msg('GETINFO blarg') self.assertEqual('Unrecognized key "blarg"', str(response)) @test.require.controller def test_msg_repeatedly(self): """ Connects, sends a burst of messages, and closes the socket repeatedly. This is a simple attempt to trigger concurrency issues. """ if stem.util.system.is_mac(): self.skipTest('(ticket #6235)') return with test.runner.get_runner().get_tor_socket() as control_socket: controller = stem.control.BaseController(control_socket) def run_getinfo(): for _ in range(50): try: controller.msg('GETINFO version') controller.msg('GETINFO blarg') controller.msg('blarg') except stem.ControllerError: pass message_threads = [] for _ in range(5): msg_thread = threading.Thread(target = run_getinfo) message_threads.append(msg_thread) msg_thread.setDaemon(True) msg_thread.start() for index in range(50): controller.connect() controller.close() for msg_thread in message_threads: msg_thread.join() @test.require.controller def test_asynchronous_event_handling(self): """ Check that we can both receive asynchronous events while hammering our socket with queries, and checks that when a controller is closed the listeners will still receive all of the enqueued events. """ class ControlledListener(stem.control.BaseController): """ Controller that blocks event handling until told to do so. """ def __init__(self, control_socket): stem.control.BaseController.__init__(self, control_socket) self.received_events = [] self.receive_notice = threading.Event() def _handle_event(self, event_message): self.receive_notice.wait() self.received_events.append(event_message) with test.runner.get_runner().get_tor_socket() as control_socket: controller = ControlledListener(control_socket) controller.msg('SETEVENTS CONF_CHANGED') for i in range(10): fingerprint = hashlib.sha1(os.urandom(20)).hexdigest().upper() controller.msg('SETCONF NodeFamily=%s' % fingerprint) test.runner.exercise_controller(self, controller) controller.msg('SETEVENTS') controller.msg('RESETCONF NodeFamily') # Concurrently shut down the controller. We need to do this in another # thread because it'll block on the event handling, which in turn is # currently blocking on the reveive_notice. close_thread = threading.Thread(target = controller.close, name = 'Closing controller') close_thread.setDaemon(True) close_thread.start() # Finally start handling the BW events that we've received. We should # have at least a couple of them. controller.receive_notice.set() close_thread.join() self.assertTrue(len(controller.received_events) >= 2) for conf_changed_event in controller.received_events: self.assertTrue(re.match('CONF_CHANGED\nNodeFamily=*', str(conf_changed_event))) self.assertTrue(conf_changed_event.raw_content().startswith('650-CONF_CHANGED\r\n650-NodeFamily=')) self.assertEqual(('650', '-'), conf_changed_event.content()[0][:2]) @test.require.controller def test_get_latest_heartbeat(self): """ Basic check for get_latest_heartbeat(). """ # makes a getinfo query, then checks that the heartbeat is close to now with test.runner.get_runner().get_tor_socket() as control_socket: controller = stem.control.BaseController(control_socket) controller.msg('GETINFO version') self.assertTrue((time.time() - controller.get_latest_heartbeat()) < 5) @test.require.controller def test_status_notifications(self): """ Checks basic functionality of the add_status_listener() and remove_status_listener() methods. """ state_observer = StateObserver() with test.runner.get_runner().get_tor_socket(False) as control_socket: controller = stem.control.BaseController(control_socket) controller.add_status_listener(state_observer.listener, False) controller.close() self.assertEqual(controller, state_observer.controller) self.assertEqual(stem.control.State.CLOSED, state_observer.state) self.assertTrue(state_observer.timestamp <= time.time()) self.assertTrue(state_observer.timestamp > time.time() - 1.0) state_observer.reset() controller.connect() self.assertEqual(controller, state_observer.controller) self.assertEqual(stem.control.State.INIT, state_observer.state) self.assertTrue(state_observer.timestamp <= time.time()) self.assertTrue(state_observer.timestamp > time.time() - 1.0) state_observer.reset() # cause the socket to shut down without calling close() controller.msg('Blarg!') self.assertRaises(stem.SocketClosed, controller.msg, 'blarg') self.assertEqual(controller, state_observer.controller) self.assertEqual(stem.control.State.CLOSED, state_observer.state) self.assertTrue(state_observer.timestamp <= time.time()) self.assertTrue(state_observer.timestamp > time.time() - 1.0) state_observer.reset() # remove listener and make sure we don't get further notices controller.remove_status_listener(state_observer.listener) controller.connect() self.assertEqual(None, state_observer.controller) self.assertEqual(None, state_observer.state) self.assertEqual(None, state_observer.timestamp) state_observer.reset() # add with spawn as true, we need a little delay on this since we then # get the notice asynchronously controller.add_status_listener(state_observer.listener, True) controller.close() time.sleep(0.001) # not much work going on so this doesn't need to be much self.assertEqual(controller, state_observer.controller) self.assertEqual(stem.control.State.CLOSED, state_observer.state) self.assertTrue(state_observer.timestamp <= time.time()) self.assertTrue(state_observer.timestamp > time.time() - 1.0) state_observer.reset() stem-1.7.1/test/integ/control/__init__.py0000664000175000017500000000013113237375570021077 0ustar atagaratagar00000000000000""" Integration tests for stem.control. """ __all__ = ['base_controller', 'controller'] stem-1.7.1/test/integ/control/controller.py0000664000175000017500000014661513344001532021524 0ustar atagaratagar00000000000000""" Integration tests for the stem.control.Controller class. """ import os import shutil import socket import tempfile import threading import time import unittest import stem.connection import stem.control import stem.descriptor.reader import stem.descriptor.router_status_entry import stem.response.protocolinfo import stem.socket import stem.util.str_tools import stem.version import test import test.network import test.require import test.runner from stem import Flag, Signal from stem.control import EventType, Listener, State from stem.exit_policy import ExitPolicy from stem.version import Requirement # Router status entry for a relay with a nickname other than 'Unnamed'. This is # used for a few tests that need to look up a relay. TEST_ROUTER_STATUS_ENTRY = None class TestController(unittest.TestCase): @test.require.only_run_once @test.require.controller def test_missing_capabilities(self): """ Check to see if tor supports any events, signals, or features that we don't. """ with test.runner.get_runner().get_tor_controller() as controller: for event in controller.get_info('events/names').split(): if event not in EventType: test.register_new_capability('Event', event) for signal in controller.get_info('signal/names').split(): if signal not in Signal: test.register_new_capability('Signal', signal) # new features should simply be added to enable_feature()'s docs for feature in controller.get_info('features/names').split(): if feature not in ('EXTENDED_EVENTS', 'VERBOSE_NAMES'): test.register_new_capability('Feature', feature) def test_from_port(self): """ Basic sanity check for the from_port constructor. """ if test.runner.Torrc.PORT in test.runner.get_runner().get_options(): with stem.control.Controller.from_port(port = test.runner.CONTROL_PORT) as controller: self.assertTrue(isinstance(controller, stem.control.Controller)) else: self.assertRaises(stem.SocketError, stem.control.Controller.from_port, '127.0.0.1', test.runner.CONTROL_PORT) def test_from_socket_file(self): """ Basic sanity check for the from_socket_file constructor. """ if test.runner.Torrc.SOCKET in test.runner.get_runner().get_options(): with stem.control.Controller.from_socket_file(path = test.runner.CONTROL_SOCKET_PATH) as controller: self.assertTrue(isinstance(controller, stem.control.Controller)) else: self.assertRaises(stem.SocketError, stem.control.Controller.from_socket_file, test.runner.CONTROL_SOCKET_PATH) @test.require.controller @test.require.version(Requirement.EVENT_SIGNAL) def test_reset_notification(self): """ Checks that a notificiation listener is... well, notified of SIGHUPs. """ with test.runner.get_runner().get_tor_controller() as controller: received_events = [] def status_listener(my_controller, state, timestamp): received_events.append((my_controller, state, timestamp)) controller.add_status_listener(status_listener) before = time.time() controller.signal(Signal.HUP) # I really hate adding a sleep here, but signal() is non-blocking. while len(received_events) == 0: if (time.time() - before) > 2: self.fail("We've waited a couple seconds for SIGHUP to generate an event, but it didn't come") time.sleep(0.001) after = time.time() self.assertEqual(1, len(received_events)) state_controller, state_type, state_timestamp = received_events[0] self.assertEqual(controller, state_controller) self.assertEqual(State.RESET, state_type) self.assertTrue(state_timestamp > before and state_timestamp < after) controller.reset_conf('__OwningControllerProcess') @test.require.controller def test_event_handling(self): """ Add a couple listeners for various events and make sure that they receive them. Then remove the listeners. """ event_notice1, event_notice2 = threading.Event(), threading.Event() event_buffer1, event_buffer2 = [], [] def listener1(event): event_buffer1.append(event) event_notice1.set() def listener2(event): event_buffer2.append(event) event_notice2.set() runner = test.runner.get_runner() with runner.get_tor_controller() as controller: controller.add_event_listener(listener1, EventType.CONF_CHANGED) controller.add_event_listener(listener2, EventType.CONF_CHANGED, EventType.DEBUG) # The NodeFamily is a harmless option we can toggle controller.set_conf('NodeFamily', 'FD4CC275C5AA4D27A487C6CA29097900F85E2C33') # Wait for the event. Assert that we get it within 10 seconds event_notice1.wait(10) self.assertEqual(len(event_buffer1), 1) event_notice1.clear() event_notice2.wait(10) self.assertTrue(len(event_buffer2) >= 1) event_notice2.clear() # Checking that a listener's no longer called after being removed. controller.remove_event_listener(listener2) buffer2_size = len(event_buffer2) controller.set_conf('NodeFamily', 'A82F7EFDB570F6BC801805D0328D30A99403C401') event_notice1.wait(10) self.assertEqual(len(event_buffer1), 2) event_notice1.clear() self.assertEqual(buffer2_size, len(event_buffer2)) for event in event_buffer1: self.assertTrue(isinstance(event, stem.response.events.Event)) self.assertEqual(0, len(event.positional_args)) self.assertEqual({}, event.keyword_args) self.assertTrue(isinstance(event, stem.response.events.ConfChangedEvent)) controller.reset_conf('NodeFamily') @test.require.controller def test_reattaching_listeners(self): """ Checks that event listeners are re-attached when a controller disconnects then reconnects to tor. """ event_notice = threading.Event() event_buffer = [] def listener(event): event_buffer.append(event) event_notice.set() runner = test.runner.get_runner() with runner.get_tor_controller() as controller: controller.add_event_listener(listener, EventType.CONF_CHANGED) # trigger an event controller.set_conf('NodeFamily', 'FD4CC275C5AA4D27A487C6CA29097900F85E2C33') event_notice.wait(4) self.assertTrue(len(event_buffer) >= 1) # disconnect, then reconnect and check that we get events again controller.close() event_notice.clear() event_buffer = [] controller.connect() controller.authenticate(password = test.runner.CONTROL_PASSWORD) self.assertTrue(len(event_buffer) == 0) controller.set_conf('NodeFamily', 'A82F7EFDB570F6BC801805D0328D30A99403C401') event_notice.wait(4) self.assertTrue(len(event_buffer) >= 1) controller.reset_conf('NodeFamily') @test.require.controller def test_getinfo(self): """ Exercises GETINFO with valid and invalid queries. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: # successful single query torrc_path = runner.get_torrc_path() self.assertEqual(torrc_path, controller.get_info('config-file')) self.assertEqual(torrc_path, controller.get_info('config-file', 'ho hum')) expected = {'config-file': torrc_path} self.assertEqual(expected, controller.get_info(['config-file'])) self.assertEqual(expected, controller.get_info(['config-file'], 'ho hum')) # successful batch query, we don't know the values so just checking for # the keys getinfo_params = set(['version', 'config-file', 'config/names']) self.assertEqual(getinfo_params, set(controller.get_info(['version', 'config-file', 'config/names']).keys())) # non-existant option self.assertRaises(stem.ControllerError, controller.get_info, 'blarg') self.assertEqual('ho hum', controller.get_info('blarg', 'ho hum')) # empty input self.assertRaises(stem.ControllerError, controller.get_info, '') self.assertEqual('ho hum', controller.get_info('', 'ho hum')) self.assertEqual({}, controller.get_info([])) self.assertEqual({}, controller.get_info([], {})) @test.require.controller def test_get_version(self): """ Test that the convenient method get_version() works. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: version = controller.get_version() self.assertTrue(isinstance(version, stem.version.Version)) self.assertEqual(version, test.tor_version()) @test.require.controller def test_get_exit_policy(self): """ Sanity test for get_exit_policy(). Our 'ExitRelay 0' torrc entry causes us to have a simple reject-all policy. """ with test.runner.get_runner().get_tor_controller() as controller: self.assertEqual(ExitPolicy('reject *:*'), controller.get_exit_policy()) @test.require.controller def test_authenticate(self): """ Test that the convenient method authenticate() works. """ runner = test.runner.get_runner() with runner.get_tor_controller(False) as controller: controller.authenticate(test.runner.CONTROL_PASSWORD) test.runner.exercise_controller(self, controller) @test.require.controller def test_protocolinfo(self): """ Test that the convenient method protocolinfo() works. """ runner = test.runner.get_runner() with runner.get_tor_controller(False) as controller: protocolinfo = controller.get_protocolinfo() self.assertTrue(isinstance(protocolinfo, stem.response.protocolinfo.ProtocolInfoResponse)) # Doing a sanity test on the ProtocolInfoResponse instance returned. tor_options = runner.get_options() auth_methods = [] if test.runner.Torrc.COOKIE in tor_options: auth_methods.append(stem.response.protocolinfo.AuthMethod.COOKIE) if test.tor_version() >= stem.version.Requirement.AUTH_SAFECOOKIE: auth_methods.append(stem.response.protocolinfo.AuthMethod.SAFECOOKIE) if test.runner.Torrc.PASSWORD in tor_options: auth_methods.append(stem.response.protocolinfo.AuthMethod.PASSWORD) if not auth_methods: auth_methods.append(stem.response.protocolinfo.AuthMethod.NONE) self.assertEqual(tuple(auth_methods), protocolinfo.auth_methods) @test.require.controller def test_getconf(self): """ Exercises GETCONF with valid and invalid queries. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: control_socket = controller.get_socket() if isinstance(control_socket, stem.socket.ControlPort): connection_value = str(control_socket.port) config_key = 'ControlPort' elif isinstance(control_socket, stem.socket.ControlSocketFile): connection_value = control_socket.path config_key = 'ControlSocket' # successful single query self.assertEqual(connection_value, controller.get_conf(config_key)) self.assertEqual(connection_value, controller.get_conf(config_key, 'la-di-dah')) # succeessful batch query expected = {config_key: [connection_value]} self.assertEqual(expected, controller.get_conf_map([config_key])) self.assertEqual(expected, controller.get_conf_map([config_key], 'la-di-dah')) request_params = ['ControlPORT', 'dirport', 'datadirectory'] reply_params = controller.get_conf_map(request_params, multiple=False).keys() self.assertEqual(set(request_params), set(reply_params)) # queries an option that is unset self.assertEqual(None, controller.get_conf('HTTPSProxy')) self.assertEqual('la-di-dah', controller.get_conf('HTTPSProxy', 'la-di-dah')) self.assertEqual([], controller.get_conf('HTTPSProxy', [], multiple = True)) # non-existant option(s) self.assertRaises(stem.InvalidArguments, controller.get_conf, 'blarg') self.assertEqual('la-di-dah', controller.get_conf('blarg', 'la-di-dah')) self.assertRaises(stem.InvalidArguments, controller.get_conf_map, 'blarg') self.assertEqual({'blarg': 'la-di-dah'}, controller.get_conf_map('blarg', 'la-di-dah')) self.assertRaises(stem.InvalidRequest, controller.get_conf_map, ['blarg', 'huadf'], multiple = True) self.assertEqual({'erfusdj': 'la-di-dah', 'afiafj': 'la-di-dah'}, controller.get_conf_map(['erfusdj', 'afiafj'], 'la-di-dah', multiple = True)) # multivalue configuration keys nodefamilies = [('abc', 'xyz', 'pqrs'), ('mno', 'tuv', 'wxyz')] controller.msg('SETCONF %s' % ' '.join(['nodefamily="' + ','.join(x) + '"' for x in nodefamilies])) self.assertEqual([','.join(n) for n in nodefamilies], controller.get_conf('nodefamily', multiple = True)) controller.msg('RESETCONF NodeFamily') # empty input self.assertEqual(None, controller.get_conf('')) self.assertEqual({}, controller.get_conf_map([])) self.assertEqual({}, controller.get_conf_map([''])) self.assertEqual(None, controller.get_conf(' ')) self.assertEqual({}, controller.get_conf_map([' ', ' '])) self.assertEqual('la-di-dah', controller.get_conf('', 'la-di-dah')) self.assertEqual({}, controller.get_conf_map('', 'la-di-dah')) self.assertEqual({}, controller.get_conf_map([], 'la-di-dah')) @test.require.controller def test_is_set(self): """ Exercises our is_set() method. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: custom_options = controller._get_custom_options() self.assertTrue('ControlPort' in custom_options or 'ControlSocket' in custom_options) self.assertEqual('1', custom_options['DownloadExtraInfo']) self.assertEqual('1112', custom_options['SocksPort']) self.assertTrue(controller.is_set('DownloadExtraInfo')) self.assertTrue(controller.is_set('SocksPort')) self.assertFalse(controller.is_set('CellStatistics')) self.assertFalse(controller.is_set('ConnLimit')) # check we update when setting and resetting values controller.set_conf('ConnLimit', '1005') self.assertTrue(controller.is_set('ConnLimit')) controller.reset_conf('ConnLimit') self.assertFalse(controller.is_set('ConnLimit')) @test.require.controller def test_hidden_services_conf(self): """ Exercises the hidden service family of methods (get_hidden_service_conf, set_hidden_service_conf, create_hidden_service, and remove_hidden_service). """ runner = test.runner.get_runner() test_dir = runner.get_test_dir() service1_path = os.path.join(test_dir, 'test_hidden_service1') service2_path = os.path.join(test_dir, 'test_hidden_service2') service3_path = os.path.join(test_dir, 'test_hidden_service3') service4_path = os.path.join(test_dir, 'test_hidden_service4') with runner.get_tor_controller() as controller: try: # initially we shouldn't be running any hidden services self.assertEqual({}, controller.get_hidden_service_conf()) # try setting a blank config, shouldn't have any impact controller.set_hidden_service_conf({}) self.assertEqual({}, controller.get_hidden_service_conf()) # create a hidden service initialconf = { service1_path: { 'HiddenServicePort': [ (8020, '127.0.0.1', 8020), (8021, '127.0.0.1', 8021), ], 'HiddenServiceVersion': '2', }, service2_path: { 'HiddenServiceVersion': '2', 'HiddenServiceAuthorizeClient': 'stealth a, b', 'HiddenServicePort': [ (8030, '127.0.0.1', 8030), (8031, '127.0.0.1', 8031), (8032, '127.0.0.1', 8032), ] }, } controller.set_hidden_service_conf(initialconf) self.assertEqual(initialconf, controller.get_hidden_service_conf()) # add already existing services, with/without explicit target self.assertEqual(None, controller.create_hidden_service(service1_path, 8020)) self.assertEqual(None, controller.create_hidden_service(service1_path, 8021, target_port = 8021)) self.assertEqual(initialconf, controller.get_hidden_service_conf()) # add a new service, with/without explicit target hs_path = os.path.join(os.getcwd(), service3_path) hs_address1 = controller.create_hidden_service(hs_path, 8888).hostname hs_address2 = controller.create_hidden_service(hs_path, 8989, target_port = 8021).hostname self.assertEqual(hs_address1, hs_address2) self.assertTrue(hs_address1.endswith('.onion')) conf = controller.get_hidden_service_conf() self.assertEqual(3, len(conf)) self.assertEqual(2, len(conf[hs_path]['HiddenServicePort'])) # remove a hidden service, the service dir should still be there controller.remove_hidden_service(hs_path, 8888) self.assertEqual(3, len(controller.get_hidden_service_conf())) # remove a service completely, it should now be gone controller.remove_hidden_service(hs_path, 8989) self.assertEqual(2, len(controller.get_hidden_service_conf())) # add a new service, this time with client authentication hs_path = os.path.join(os.getcwd(), service4_path) hs_attributes = controller.create_hidden_service(hs_path, 8888, auth_type = 'basic', client_names = ['c1', 'c2']) self.assertEqual(2, len(hs_attributes.hostname.splitlines())) self.assertEqual(2, len(hs_attributes.hostname_for_client)) self.assertTrue(hs_attributes.hostname_for_client['c1'].endswith('.onion')) self.assertTrue(hs_attributes.hostname_for_client['c2'].endswith('.onion')) conf = controller.get_hidden_service_conf() self.assertEqual(3, len(conf)) self.assertEqual(1, len(conf[hs_path]['HiddenServicePort'])) # remove a hidden service controller.remove_hidden_service(hs_path, 8888) self.assertEqual(2, len(controller.get_hidden_service_conf())) finally: controller.set_hidden_service_conf({}) # drop hidden services created during the test # clean up the hidden service directories created as part of this test for path in (service1_path, service2_path, service3_path, service4_path): try: shutil.rmtree(path) except: pass @test.require.controller @test.require.version(Requirement.ADD_ONION) def test_without_ephemeral_hidden_services(self): """ Exercises ephemeral hidden service methods when none are present. """ with test.runner.get_runner().get_tor_controller() as controller: self.assertEqual([], controller.list_ephemeral_hidden_services()) self.assertEqual([], controller.list_ephemeral_hidden_services(detached = True)) self.assertEqual(False, controller.remove_ephemeral_hidden_service('gfzprpioee3hoppz')) @test.require.controller @test.require.version(Requirement.ADD_ONION) def test_with_invalid_ephemeral_hidden_service_port(self): with test.runner.get_runner().get_tor_controller() as controller: for ports in (4567890, [4567, 4567890], {4567: '-:4567'}): exc_msg = "ADD_ONION response didn't have an OK status: Invalid VIRTPORT/TARGET" self.assertRaisesWith(stem.ProtocolError, exc_msg, controller.create_ephemeral_hidden_service, ports) @test.require.controller @test.require.version(Requirement.ADD_ONION) def test_ephemeral_hidden_services_v2(self): """ Exercises creating v2 ephemeral hidden services. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: response = controller.create_ephemeral_hidden_service(4567, key_content = 'RSA1024') self.assertEqual([response.service_id], controller.list_ephemeral_hidden_services()) self.assertTrue(response.private_key is not None) self.assertEqual('RSA1024', response.private_key_type) self.assertEqual({}, response.client_auth) # drop the service self.assertEqual(True, controller.remove_ephemeral_hidden_service(response.service_id)) self.assertEqual([], controller.list_ephemeral_hidden_services()) # recreate the service with the same private key recreate_response = controller.create_ephemeral_hidden_service(4567, key_type = response.private_key_type, key_content = response.private_key) self.assertEqual([response.service_id], controller.list_ephemeral_hidden_services()) self.assertEqual(response.service_id, recreate_response.service_id) # the response only includes the private key when making a new one self.assertEqual(None, recreate_response.private_key) self.assertEqual(None, recreate_response.private_key_type) # create a service where we never see the private key response = controller.create_ephemeral_hidden_service(4568, key_content = 'RSA1024', discard_key = True) self.assertTrue(response.service_id in controller.list_ephemeral_hidden_services()) self.assertEqual(None, response.private_key) self.assertEqual(None, response.private_key_type) # other controllers shouldn't be able to see these hidden services with runner.get_tor_controller() as second_controller: self.assertEqual(2, len(controller.list_ephemeral_hidden_services())) self.assertEqual(0, len(second_controller.list_ephemeral_hidden_services())) @test.require.controller @test.require.version(Requirement.HIDDEN_SERVICE_V3) def test_ephemeral_hidden_services_v3(self): """ Exercises creating v3 ephemeral hidden services. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: response = controller.create_ephemeral_hidden_service(4567, key_content = 'ED25519-V3') self.assertEqual([response.service_id], controller.list_ephemeral_hidden_services()) self.assertTrue(response.private_key is not None) self.assertEqual('ED25519-V3', response.private_key_type) self.assertEqual({}, response.client_auth) # drop the service self.assertEqual(True, controller.remove_ephemeral_hidden_service(response.service_id)) self.assertEqual([], controller.list_ephemeral_hidden_services()) # recreate the service with the same private key recreate_response = controller.create_ephemeral_hidden_service(4567, key_type = response.private_key_type, key_content = response.private_key) self.assertEqual([response.service_id], controller.list_ephemeral_hidden_services()) self.assertEqual(response.service_id, recreate_response.service_id) # the response only includes the private key when making a new one self.assertEqual(None, recreate_response.private_key) self.assertEqual(None, recreate_response.private_key_type) # create a service where we never see the private key response = controller.create_ephemeral_hidden_service(4568, key_content = 'ED25519-V3', discard_key = True) self.assertTrue(response.service_id in controller.list_ephemeral_hidden_services()) self.assertEqual(None, response.private_key) self.assertEqual(None, response.private_key_type) # other controllers shouldn't be able to see these hidden services with runner.get_tor_controller() as second_controller: self.assertEqual(2, len(controller.list_ephemeral_hidden_services())) self.assertEqual(0, len(second_controller.list_ephemeral_hidden_services())) @test.require.controller @test.require.version(Requirement.ADD_ONION_BASIC_AUTH) def test_with_ephemeral_hidden_services_basic_auth(self): """ Exercises creating ephemeral hidden services that uses basic authentication. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: response = controller.create_ephemeral_hidden_service(4567, basic_auth = {'alice': 'nKwfvVPmTNr2k2pG0pzV4g', 'bob': None}) self.assertEqual([response.service_id], controller.list_ephemeral_hidden_services()) self.assertTrue(response.private_key is not None) self.assertEqual(['bob'], list(response.client_auth.keys())) # newly created credentials were only created for bob # drop the service self.assertEqual(True, controller.remove_ephemeral_hidden_service(response.service_id)) self.assertEqual([], controller.list_ephemeral_hidden_services()) @test.require.controller @test.require.version(Requirement.ADD_ONION_BASIC_AUTH) def test_with_ephemeral_hidden_services_basic_auth_no_credentials(self): """ Exercises creating ephemeral hidden services when attempting to use basic auth but not including any credentials. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: exc_msg = "ADD_ONION response didn't have an OK status: No auth clients specified" self.assertRaisesWith(stem.ProtocolError, exc_msg, controller.create_ephemeral_hidden_service, 4567, basic_auth = {}) @test.require.controller @test.require.version(Requirement.ADD_ONION) def test_with_detached_ephemeral_hidden_services(self): """ Exercises creating detached ephemeral hidden services and methods when they're present. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: response = controller.create_ephemeral_hidden_service(4567, detached = True) self.assertEqual([], controller.list_ephemeral_hidden_services()) self.assertEqual([response.service_id], controller.list_ephemeral_hidden_services(detached = True)) # drop and recreate the service self.assertEqual(True, controller.remove_ephemeral_hidden_service(response.service_id)) self.assertEqual([], controller.list_ephemeral_hidden_services(detached = True)) controller.create_ephemeral_hidden_service(4567, key_type = response.private_key_type, key_content = response.private_key, detached = True) self.assertEqual([response.service_id], controller.list_ephemeral_hidden_services(detached = True)) # other controllers should be able to see this service, and drop it with runner.get_tor_controller() as second_controller: self.assertEqual([response.service_id], second_controller.list_ephemeral_hidden_services(detached = True)) self.assertEqual(True, second_controller.remove_ephemeral_hidden_service(response.service_id)) self.assertEqual([], controller.list_ephemeral_hidden_services(detached = True)) # recreate the service and confirms that it outlives this controller response = second_controller.create_ephemeral_hidden_service(4567, detached = True) self.assertEqual([response.service_id], controller.list_ephemeral_hidden_services(detached = True)) controller.remove_ephemeral_hidden_service(response.service_id) @test.require.controller @test.require.version(Requirement.ADD_ONION) def test_rejecting_unanonymous_hidden_services_creation(self): """ Attempt to create a non-anonymous hidden service despite not setting HiddenServiceSingleHopMode and HiddenServiceNonAnonymousMode. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: self.assertEqual('Tor is in anonymous hidden service mode', str(controller.msg('ADD_ONION NEW:BEST Flags=NonAnonymous Port=4567'))) @test.require.controller def test_set_conf(self): """ Exercises set_conf(), reset_conf(), and set_options() methods with valid and invalid requests. """ runner = test.runner.get_runner() tmpdir = tempfile.mkdtemp() with runner.get_tor_controller() as controller: try: # successfully set a single option connlimit = int(controller.get_conf('ConnLimit')) controller.set_conf('connlimit', str(connlimit - 1)) self.assertEqual(connlimit - 1, int(controller.get_conf('ConnLimit'))) # successfully set a single list option exit_policy = ['accept *:7777', 'reject *:*'] controller.set_conf('ExitPolicy', exit_policy) self.assertEqual(exit_policy, controller.get_conf('ExitPolicy', multiple = True)) # fail to set a single option try: controller.set_conf('invalidkeyboo', 'abcde') self.fail() except stem.InvalidArguments as exc: self.assertEqual(['invalidkeyboo'], exc.arguments) # resets configuration parameters controller.reset_conf('ConnLimit', 'ExitPolicy') self.assertEqual(connlimit, int(controller.get_conf('ConnLimit'))) self.assertEqual(None, controller.get_conf('ExitPolicy')) # successfully sets multiple config options controller.set_options({ 'connlimit': str(connlimit - 2), 'contactinfo': 'stem@testing', }) self.assertEqual(connlimit - 2, int(controller.get_conf('ConnLimit'))) self.assertEqual('stem@testing', controller.get_conf('contactinfo')) # fail to set multiple config options try: controller.set_options({ 'contactinfo': 'stem@testing', 'bombay': 'vadapav', }) self.fail() except stem.InvalidArguments as exc: self.assertEqual(['bombay'], exc.arguments) # context-sensitive keys (the only retched things for which order matters) controller.set_options(( ('HiddenServiceDir', tmpdir), ('HiddenServicePort', '17234 127.0.0.1:17235'), )) self.assertEqual(tmpdir, controller.get_conf('HiddenServiceDir')) self.assertEqual('17234 127.0.0.1:17235', controller.get_conf('HiddenServicePort')) finally: # reverts configuration changes controller.set_options(( ('ExitPolicy', 'reject *:*'), ('ConnLimit', None), ('ContactInfo', None), ('HiddenServiceDir', None), ('HiddenServicePort', None), ), reset = True) shutil.rmtree(tmpdir) @test.require.controller def test_set_conf_when_immutable(self): """ Issue a SETCONF for tor options that cannot be changed while running. """ with test.runner.get_runner().get_tor_controller() as controller: self.assertRaisesWith(stem.InvalidArguments, "DisableAllSwap cannot be changed while tor's running", controller.set_conf, 'DisableAllSwap', '1') self.assertRaisesWith(stem.InvalidArguments, "DisableAllSwap, User cannot be changed while tor's running", controller.set_options, {'User': 'atagar', 'DisableAllSwap': '1'}) @test.require.controller @test.require.version(Requirement.LOADCONF) def test_loadconf(self): """ Exercises Controller.load_conf with valid and invalid requests. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: oldconf = runner.get_torrc_contents() try: # Check a request that changes our DataDir. Tor should rightfully balk # at this... # # InvalidRequest: Transition not allowed: Failed to parse/validate # config: While Tor is running, changing DataDirectory # ("/home/atagar/Desktop/stem/test/data"->"/home/atagar/.tor") is not # allowed. self.assertRaises(stem.InvalidRequest, controller.load_conf, 'ContactInfo confloaded') try: controller.load_conf('Blahblah blah') self.fail() except stem.InvalidArguments as exc: self.assertEqual(['Blahblah'], exc.arguments) # valid config controller.load_conf(runner.get_torrc_contents() + '\nContactInfo confloaded\n') self.assertEqual('confloaded', controller.get_conf('ContactInfo')) finally: # reload original valid config controller.load_conf(oldconf) controller.reset_conf('__OwningControllerProcess') @test.require.controller def test_saveconf(self): runner = test.runner.get_runner() # only testing for success, since we need to run out of disk space to test # for failure with runner.get_tor_controller() as controller: oldconf = runner.get_torrc_contents() try: controller.set_conf('ContactInfo', 'confsaved') controller.save_conf() with open(runner.get_torrc_path()) as torrcfile: self.assertTrue('\nContactInfo confsaved\n' in torrcfile.read()) finally: controller.load_conf(oldconf) controller.save_conf() controller.reset_conf('__OwningControllerProcess') @test.require.controller def test_get_ports(self): """ Test Controller.get_ports against a running tor instance. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: self.assertEqual([test.runner.ORPORT], controller.get_ports(Listener.OR)) self.assertEqual([], controller.get_ports(Listener.DIR)) self.assertEqual([test.runner.SOCKS_PORT], controller.get_ports(Listener.SOCKS)) self.assertEqual([], controller.get_ports(Listener.TRANS)) self.assertEqual([], controller.get_ports(Listener.NATD)) self.assertEqual([], controller.get_ports(Listener.DNS)) if test.runner.Torrc.PORT in runner.get_options(): self.assertEqual([test.runner.CONTROL_PORT], controller.get_ports(Listener.CONTROL)) else: self.assertEqual([], controller.get_ports(Listener.CONTROL)) @test.require.controller def test_get_listeners(self): """ Test Controller.get_listeners against a running tor instance. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: self.assertEqual([('0.0.0.0', test.runner.ORPORT)], controller.get_listeners(Listener.OR)) self.assertEqual([], controller.get_listeners(Listener.DIR)) self.assertEqual([('127.0.0.1', test.runner.SOCKS_PORT)], controller.get_listeners(Listener.SOCKS)) self.assertEqual([], controller.get_listeners(Listener.TRANS)) self.assertEqual([], controller.get_listeners(Listener.NATD)) self.assertEqual([], controller.get_listeners(Listener.DNS)) if test.runner.Torrc.PORT in runner.get_options(): self.assertEqual([('127.0.0.1', test.runner.CONTROL_PORT)], controller.get_listeners(Listener.CONTROL)) else: self.assertEqual([], controller.get_listeners(Listener.CONTROL)) @test.require.controller def test_get_socks_listeners(self): """ Test Controller.get_socks_listeners against a running tor instance. """ with test.runner.get_runner().get_tor_controller() as controller: self.assertEqual([('127.0.0.1', 1112)], controller.get_socks_listeners()) @test.require.controller @test.require.online @test.require.version(stem.version.Version('0.1.2.2-alpha')) def test_enable_feature(self): """ Test Controller.enable_feature with valid and invalid inputs. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: self.assertTrue(controller.is_feature_enabled('VERBOSE_NAMES')) self.assertTrue('VERBOSE_NAMES' in controller._enabled_features) self.assertRaises(stem.InvalidArguments, controller.enable_feature, ['NOT', 'A', 'FEATURE']) try: controller.enable_feature(['NOT', 'A', 'FEATURE']) except stem.InvalidArguments as exc: self.assertEqual(['NOT'], exc.arguments) else: self.fail() @test.require.controller def test_signal(self): """ Test controller.signal with valid and invalid signals. """ with test.runner.get_runner().get_tor_controller() as controller: # valid signal controller.signal('CLEARDNSCACHE') # invalid signals self.assertRaises(stem.InvalidArguments, controller.signal, 'FOOBAR') @test.require.controller def test_newnym_availability(self): """ Test the is_newnym_available and get_newnym_wait methods. """ with test.runner.get_runner().get_tor_controller() as controller: self.assertEqual(True, controller.is_newnym_available()) self.assertEqual(0.0, controller.get_newnym_wait()) controller.signal(stem.Signal.NEWNYM) self.assertEqual(False, controller.is_newnym_available()) self.assertTrue(controller.get_newnym_wait() > 9.0) @test.require.controller @test.require.online @test.require.version(Requirement.EXTENDCIRCUIT_PATH_OPTIONAL) def test_extendcircuit(self): with test.runner.get_runner().get_tor_controller() as controller: circuit_id = controller.extend_circuit('0') # check if our circuit was created self.assertNotEqual(None, controller.get_circuit(circuit_id, None)) circuit_id = controller.new_circuit() self.assertNotEqual(None, controller.get_circuit(circuit_id, None)) self.assertRaises(stem.InvalidRequest, controller.extend_circuit, 'foo') self.assertRaises(stem.InvalidRequest, controller.extend_circuit, '0', 'thisroutershouldntexistbecausestemexists!@##$%#') self.assertRaises(stem.InvalidRequest, controller.extend_circuit, '0', 'thisroutershouldntexistbecausestemexists!@##$%#', 'foo') @test.require.controller @test.require.online @test.require.version(Requirement.EXTENDCIRCUIT_PATH_OPTIONAL) def test_repurpose_circuit(self): """ Tests Controller.repurpose_circuit with valid and invalid input. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: circ_id = controller.new_circuit() controller.repurpose_circuit(circ_id, 'CONTROLLER') circuit = controller.get_circuit(circ_id) self.assertTrue(circuit.purpose == 'CONTROLLER') controller.repurpose_circuit(circ_id, 'GENERAL') circuit = controller.get_circuit(circ_id) self.assertTrue(circuit.purpose == 'GENERAL') self.assertRaises(stem.InvalidRequest, controller.repurpose_circuit, 'f934h9f3h4', 'fooo') self.assertRaises(stem.InvalidRequest, controller.repurpose_circuit, '4', 'fooo') @test.require.controller @test.require.online @test.require.version(Requirement.EXTENDCIRCUIT_PATH_OPTIONAL) def test_close_circuit(self): """ Tests Controller.close_circuit with valid and invalid input. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: circuit_id = controller.new_circuit() controller.close_circuit(circuit_id) circuit_output = controller.get_info('circuit-status') circ = [x.split()[0] for x in circuit_output.splitlines()] self.assertFalse(circuit_id in circ) circuit_id = controller.new_circuit() controller.close_circuit(circuit_id, 'IfUnused') circuit_output = controller.get_info('circuit-status') circ = [x.split()[0] for x in circuit_output.splitlines()] self.assertFalse(circuit_id in circ) circuit_id = controller.new_circuit() self.assertRaises(stem.InvalidArguments, controller.close_circuit, circuit_id + '1024') self.assertRaises(stem.InvalidRequest, controller.close_circuit, '') @test.require.controller @test.require.online def test_get_streams(self): """ Tests Controller.get_streams(). """ host = socket.gethostbyname('www.torproject.org') port = 443 runner = test.runner.get_runner() with runner.get_tor_controller() as controller: # we only need one proxy port, so take the first socks_listener = controller.get_socks_listeners()[0] with test.network.Socks(socks_listener) as s: s.settimeout(30) s.connect((host, port)) streams = controller.get_streams() # Because we do not get a stream id when opening a stream, # try to match the target for which we asked a stream. self.assertTrue('%s:%s' % (host, port) in [stream.target for stream in streams]) @test.require.controller @test.require.online def test_close_stream(self): """ Tests Controller.close_stream with valid and invalid input. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: # use the first socks listener socks_listener = controller.get_socks_listeners()[0] with test.network.Socks(socks_listener) as s: s.settimeout(30) s.connect(('www.torproject.org', 443)) # There's only one stream right now. Right? built_stream = controller.get_streams()[0] # Make sure we have the stream for which we asked, otherwise # the next assertion would be a false positive. self.assertEqual([built_stream.id], [stream.id for stream in controller.get_streams()]) # Try to close our stream... controller.close_stream(built_stream.id) # ...which means there are zero streams. self.assertEqual([], controller.get_streams()) # unknown stream self.assertRaises(stem.InvalidArguments, controller.close_stream, 'blarg') @test.require.controller @test.require.online def test_mapaddress(self): self.skipTest('(https://trac.torproject.org/projects/tor/ticket/25611)') runner = test.runner.get_runner() with runner.get_tor_controller() as controller: controller.map_address({'1.2.1.2': 'ifconfig.me'}) s = None response = None # try up to 10 times to rule out transient network failures for _ in range(10): try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(30) s.connect(('127.0.0.1', int(controller.get_conf('SocksPort')))) test.network.negotiate_socks(s, '1.2.1.2', 80) s.sendall(stem.util.str_tools._to_bytes(test.network.IP_REQUEST)) # make the http request for the ip address response = s.recv(1000) if response: break except (stem.ProtocolError, socket.timeout): continue finally: if s: s.close() self.assertTrue(response) # everything after the blank line is the 'data' in a HTTP response. # The response data for our request for request should be an IP address + '\n' ip_addr = response[response.find(b'\r\n\r\n'):].strip() self.assertTrue(stem.util.connection.is_valid_ipv4_address(stem.util.str_tools._to_unicode(ip_addr)), "'%s' isn't an address" % ip_addr) @test.require.controller @test.require.online @test.require.version(Requirement.MICRODESCRIPTOR_IS_DEFAULT) def test_get_microdescriptor(self): """ Basic checks for get_microdescriptor(). """ with test.runner.get_runner().get_tor_controller() as controller: # we should balk at invalid content self.assertRaises(ValueError, controller.get_microdescriptor, '') self.assertRaises(ValueError, controller.get_microdescriptor, 5) self.assertRaises(ValueError, controller.get_microdescriptor, 'z' * 30) # try with a relay that doesn't exist self.assertRaises(stem.ControllerError, controller.get_microdescriptor, 'blargg') self.assertRaises(stem.ControllerError, controller.get_microdescriptor, '5' * 40) test_relay = self._get_router_status_entry(controller) md_by_fingerprint = controller.get_microdescriptor(test_relay.fingerprint) md_by_nickname = controller.get_microdescriptor(test_relay.nickname) self.assertEqual(md_by_fingerprint, md_by_nickname) @test.require.controller @test.require.online def test_get_microdescriptors(self): """ Fetches a few descriptors via the get_microdescriptors() method. """ runner = test.runner.get_runner() if not os.path.exists(runner.get_test_dir('cached-microdescs')): self.skipTest('(no cached microdescriptors)') return with runner.get_tor_controller() as controller: count = 0 for desc in controller.get_microdescriptors(): self.assertTrue(desc.onion_key is not None) count += 1 if count > 10: break @test.require.controller def test_get_server_descriptor(self): """ Basic checks for get_server_descriptor(). """ runner = test.runner.get_runner() if test.tor_version() >= Requirement.MICRODESCRIPTOR_IS_DEFAULT: self.skipTest('(requires server descriptors)') return with runner.get_tor_controller() as controller: # we should balk at invalid content self.assertRaises(ValueError, controller.get_server_descriptor, None) self.assertRaises(ValueError, controller.get_server_descriptor, '') self.assertRaises(ValueError, controller.get_server_descriptor, 5) self.assertRaises(ValueError, controller.get_server_descriptor, 'z' * 30) # try with a relay that doesn't exist self.assertRaises(stem.ControllerError, controller.get_server_descriptor, 'blargg') self.assertRaises(stem.ControllerError, controller.get_server_descriptor, '5' * 40) test_relay = self._get_router_status_entry(controller) desc_by_fingerprint = controller.get_server_descriptor(test_relay.fingerprint) desc_by_nickname = controller.get_server_descriptor(test_relay.nickname) self.assertEqual(desc_by_fingerprint, desc_by_nickname) @test.require.controller @test.require.online def test_get_server_descriptors(self): """ Fetches a few descriptors via the get_server_descriptors() method. """ runner = test.runner.get_runner() if test.tor_version() >= Requirement.MICRODESCRIPTOR_IS_DEFAULT: self.skipTest('(requires server descriptors)') return with runner.get_tor_controller() as controller: count = 0 for desc in controller.get_server_descriptors(): self.assertTrue(desc.fingerprint is not None) self.assertTrue(desc.nickname is not None) # Se don't want to take the time to read the whole thing. We already # have another test that reads the full cached descriptors (and takes a # while to do so). count += 1 if count > 10: break @test.require.controller @test.require.online def test_get_network_status(self): """ Basic checks for get_network_status(). """ with test.runner.get_runner().get_tor_controller() as controller: # we should balk at invalid content self.assertRaises(ValueError, controller.get_network_status, '') self.assertRaises(ValueError, controller.get_network_status, 5) self.assertRaises(ValueError, controller.get_network_status, 'z' * 30) # try with a relay that doesn't exist self.assertRaises(stem.ControllerError, controller.get_network_status, 'blargg') self.assertRaises(stem.ControllerError, controller.get_network_status, '5' * 40) test_relay = self._get_router_status_entry(controller) desc_by_fingerprint = controller.get_network_status(test_relay.fingerprint) desc_by_nickname = controller.get_network_status(test_relay.nickname) self.assertEqual(desc_by_fingerprint, desc_by_nickname) @test.require.controller @test.require.online def test_get_network_statuses(self): """ Fetches a few descriptors via the get_network_statuses() method. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: count = 0 for desc in controller.get_network_statuses(): self.assertTrue(desc.fingerprint is not None) self.assertTrue(desc.nickname is not None) for line in desc.get_unrecognized_lines(): test.register_new_capability('Consensus Line', line) count += 1 if count > 10: break @test.require.controller @test.require.online @test.require.version(Requirement.HSFETCH) def test_get_hidden_service_descriptor(self): """ Fetches a few descriptors via the get_hidden_service_descriptor() method. """ runner = test.runner.get_runner() with runner.get_tor_controller() as controller: # fetch the descriptor for DuckDuckGo desc = controller.get_hidden_service_descriptor('3g2upl4pq6kufc4m.onion') self.assertTrue('MIGJAoGBAJ' in desc.permanent_key) # try to fetch something that doesn't exist exc_msg = 'No running hidden service at m4cfuk6qp4lpu2g3.onion' self.assertRaisesWith(stem.DescriptorUnavailable, exc_msg, controller.get_hidden_service_descriptor, 'm4cfuk6qp4lpu2g3') # ... but shouldn't fail if we have a default argument or aren't awaiting the descriptor self.assertEqual('pop goes the weasel', controller.get_hidden_service_descriptor('m4cfuk6qp4lpu2g5', 'pop goes the weasel')) self.assertEqual(None, controller.get_hidden_service_descriptor('m4cfuk6qp4lpu2g5', await_result = False)) @test.require.controller @test.require.online @test.require.version(Requirement.EXTENDCIRCUIT_PATH_OPTIONAL) def test_attachstream(self): host = socket.gethostbyname('www.torproject.org') port = 80 circuit_id, streams = None, [] def handle_streamcreated(stream): if stream.status == 'NEW' and circuit_id: controller.attach_stream(stream.id, circuit_id) with test.runner.get_runner().get_tor_controller() as controller: # try 10 times to build a circuit we can connect through for i in range(10): controller.add_event_listener(handle_streamcreated, stem.control.EventType.STREAM) controller.set_conf('__LeaveStreamsUnattached', '1') try: circuit_id = controller.new_circuit(await_build = True) socks_listener = controller.get_socks_listeners()[0] with test.network.Socks(socks_listener) as s: s.settimeout(30) s.connect((host, port)) streams = controller.get_streams() break except (stem.CircuitExtensionFailed, socket.timeout): continue finally: controller.remove_event_listener(handle_streamcreated) controller.reset_conf('__LeaveStreamsUnattached') our_stream = [stream for stream in streams if stream.target_address == host][0] self.assertTrue(our_stream.circ_id) self.assertTrue(circuit_id) self.assertEqual(our_stream.circ_id, circuit_id) @test.require.controller @test.require.online @test.require.version(Requirement.EXTENDCIRCUIT_PATH_OPTIONAL) def test_get_circuits(self): """ Fetches circuits via the get_circuits() method. """ with test.runner.get_runner().get_tor_controller() as controller: new_circ = controller.new_circuit() circuits = controller.get_circuits() self.assertTrue(new_circ in [circ.id for circ in circuits]) @test.require.online @test.require.controller def test_transition_to_relay(self): """ Transitions Tor to turn into a relay, then back to a client. This helps to catch transition issues such as the one cited in :trac:`14901`. """ with test.runner.get_runner().get_tor_controller() as controller: try: controller.reset_conf('OrPort', 'DisableNetwork') self.assertEqual(None, controller.get_conf('OrPort')) # DisableNetwork ensures no port is actually opened controller.set_options({'OrPort': '9090', 'DisableNetwork': '1'}) # TODO once tor 0.2.7.x exists, test that we can generate a descriptor on demand. self.assertEqual('9090', controller.get_conf('OrPort')) controller.reset_conf('OrPort', 'DisableNetwork') self.assertEqual(None, controller.get_conf('OrPort')) finally: controller.set_conf('OrPort', str(test.runner.ORPORT)) def _get_router_status_entry(self, controller): """ Provides a router status entry for a relay with a nickname other than 'Unnamed'. This fails the test if unable to find one. """ global TEST_ROUTER_STATUS_ENTRY if TEST_ROUTER_STATUS_ENTRY is None: for desc in controller.get_network_statuses(): if desc.nickname != 'Unnamed' and Flag.NAMED in desc.flags: TEST_ROUTER_STATUS_ENTRY = desc break if TEST_ROUTER_STATUS_ENTRY is None: # this is only likely to occure if we can't get descriptors self.skipTest('(no named relays)') return return TEST_ROUTER_STATUS_ENTRY stem-1.7.1/test/integ/directory/0000775000175000017500000000000013411004021017265 5ustar atagaratagar00000000000000stem-1.7.1/test/integ/directory/authority.py0000664000175000017500000000061613341034346021711 0ustar atagaratagar00000000000000""" Integration tests for stem.directory.Authority. """ import unittest import stem.directory import test.require class TestAuthority(unittest.TestCase): @test.require.online def test_cache_is_up_to_date(self): """ Check if the cached authorities we bundle are up to date. """ self.assertEqual(stem.directory.Authority.from_cache(), stem.directory.Authority.from_remote()) stem-1.7.1/test/integ/directory/__init__.py0000664000175000017500000000013213341034346021411 0ustar atagaratagar00000000000000""" Integration tests for stem.directory. """ __all__ = [ 'authority', 'fallback', ] stem-1.7.1/test/integ/directory/fallback.py0000664000175000017500000000366213341034346021424 0ustar atagaratagar00000000000000""" Integration tests for stem.directory.Fallback. """ import unittest import stem.descriptor.remote import stem.directory import test.require class TestFallback(unittest.TestCase): @test.require.online def test_cache_is_up_to_date(self): """ Check if the cached fallbacks we bundle are up to date. """ cached_fallback_directories = stem.directory.Fallback.from_cache() latest_fallback_directories = stem.directory.Fallback.from_remote() if cached_fallback_directories != latest_fallback_directories: self.fail("Stem's cached fallback directories are out of date. Please run 'cache_fallback_directories.py'...\n\n%s" % stem.directory._fallback_directory_differences(cached_fallback_directories, latest_fallback_directories)) @test.require.online def test_fallback_directory_reachability(self): """ Fetch information from each fallback directory to confirm that it's available. """ # Don't run this test by default. Once upon a time it was fine, but tor has # added so many fallbacks now that this takes a looong time. :( self.skipTest('(skipped by default)') return unsuccessful = {} downloader = stem.descriptor.remote.DescriptorDownloader() moria1_v3ident = stem.directory.Authority.from_cache()['moria1'].v3ident for fallback_directory in stem.directory.Fallback.from_cache().values(): try: downloader.get_key_certificates(authority_v3idents = moria1_v3ident, endpoints = [(fallback_directory.address, fallback_directory.dir_port)]).run() except Exception as exc: unsuccessful[fallback_directory] = exc if unsuccessful: lines = ['We were unable to contact the following fallback directories...\n'] for fallback_directory, exc in unsuccessful.items(): lines.append('* %s:%s (%s): %s' % (fallback_directory.address, fallback_directory.dir_port, fallback_directory.fingerprint, exc)) self.fail('\n'.join(lines)) stem-1.7.1/test/integ/descriptor/0000775000175000017500000000000013411004021017437 5ustar atagaratagar00000000000000stem-1.7.1/test/integ/descriptor/networkstatus.py0000664000175000017500000000701013411002341022747 0ustar atagaratagar00000000000000""" Integration tests for stem.descriptor.networkstatus. """ import os import unittest import stem import stem.descriptor import stem.descriptor.remote import stem.util.test_tools import stem.version import test import test.require import test.runner from stem.util.test_tools import asynchronous class TestNetworkStatus(unittest.TestCase): @staticmethod def run_tests(args): stem.util.test_tools.ASYNC_TESTS['test.integ.descriptor.networkstatus.test_cached_consensus'].run(args.test_dir, threaded = True) stem.util.test_tools.ASYNC_TESTS['test.integ.descriptor.networkstatus.test_cached_microdesc_consensus'].run(args.test_dir, threaded = True) @test.require.only_run_once @test.require.online @test.require.cryptography def test_signature_validation(self): """ The full consensus is pretty sizable so rather than storing a copy of it using the remote module. Chekcing the signature on the current consensus. """ stem.descriptor.remote.get_consensus(document_handler = stem.descriptor.DocumentHandler.DOCUMENT, validate = True).run() @asynchronous def test_cached_consensus(test_dir): """ Parses the cached-consensus file in our data directory. """ consensus_path = os.path.join(test_dir, 'cached-consensus') if not os.path.exists(consensus_path): raise stem.util.test_tools.SkipTest('(no cached-consensus)') elif stem.util.system.is_windows(): # Unable to check memory usage on windows, so can't prevent hanging the # system if things go bad. raise stem.util.test_tools.SkipTest('(unavailable on windows)') count, reported_flags = 0, [] with open(consensus_path, 'rb') as descriptor_file: for router in stem.descriptor.parse_file(descriptor_file, 'network-status-consensus-3 1.0', validate = True): count += 1 for flag in router.flags: if flag not in stem.Flag and flag not in reported_flags: test.register_new_capability('Flag', flag) reported_flags.append(flag) for line in router.get_unrecognized_lines(): test.register_new_capability('Consensus Line', line, suppression_token = line.split()[0]) # Sanity test that there's at least a hundred relays. If that's not the # case then this probably isn't a real, complete tor consensus. if count < 100: raise AssertionError('%s only included %s relays' % (consensus_path, count)) @asynchronous def test_cached_microdesc_consensus(test_dir): """ Parses the cached-microdesc-consensus file in our data directory. """ consensus_path = os.path.join(test_dir, 'cached-microdesc-consensus') if not os.path.exists(consensus_path): raise stem.util.test_tools.SkipTest('(no cached-microdesc-consensus)') elif stem.util.system.is_windows(): raise stem.util.test_tools.SkipTest('(unavailable on windows)') count, reported_flags = 0, [] with open(consensus_path, 'rb') as descriptor_file: for router in stem.descriptor.parse_file(descriptor_file, 'network-status-microdesc-consensus-3 1.0', validate = True): count += 1 for flag in router.flags: if flag not in stem.Flag: test.register_new_capability('Flag (microdescriptor)', flag) reported_flags.append(flag) for line in router.get_unrecognized_lines(): test.register_new_capability('Microdescriptor Consensus Line', line, suppression_token = line.split()[0]) if count < 100: raise AssertionError('%s only included %s relays' % (consensus_path, count)) stem-1.7.1/test/integ/descriptor/extrainfo_descriptor.py0000664000175000017500000000363313237375570024305 0ustar atagaratagar00000000000000""" Integration tests for stem.descriptor.extrainfo_descriptor. """ import os import unittest import stem.descriptor import stem.util.test_tools import test from stem.util.test_tools import asynchronous class TestExtraInfoDescriptor(unittest.TestCase): @staticmethod def run_tests(args): stem.util.test_tools.ASYNC_TESTS['test.integ.descriptor.extrainfo_descriptor.test_cached_descriptor'].run(args.test_dir, threaded = True) @asynchronous def test_cached_descriptor(test_dir): """ Parses the cached descriptor file in our data directory, checking that it doesn't raise any validation issues and looking for unrecognized descriptor additions. """ descriptor_path = os.path.join(test_dir, 'cached-extrainfo') if not os.path.exists(descriptor_path): raise stem.util.test_tools.SkipTest('(no cached descriptors)') with open(descriptor_path, 'rb') as descriptor_file: for desc in stem.descriptor.parse_file(descriptor_file, 'extra-info 1.0', validate = True): for line in desc.get_unrecognized_lines(): test.register_new_capability('Extra-info Line', line) if desc.dir_v2_responses_unknown: raise AssertionError('Unrecognized statuses on dirreq-v2-resp lines: %s' % desc.dir_v2_responses_unknown) elif desc.dir_v3_responses_unknown: raise AssertionError('Unrecognized statuses on dirreq-v3-resp lines: %s' % desc.dir_v3_responses_unknown) elif desc.dir_v2_direct_dl_unknown: raise AssertionError('Unrecognized stats on dirreq-v2-direct-dl lines: %s' % desc.dir_v2_direct_dl_unknown) elif desc.dir_v3_direct_dl_unknown: raise AssertionError('Unrecognized stats on dirreq-v3-direct-dl lines: %s' % desc.dir_v2_direct_dl_unknown) elif desc.dir_v2_tunneled_dl_unknown: raise AssertionError('Unrecognized stats on dirreq-v2-tunneled-dl lines: %s' % desc.dir_v2_tunneled_dl_unknown) stem-1.7.1/test/integ/descriptor/__init__.py0000664000175000017500000000025513341034346021571 0ustar atagaratagar00000000000000""" Integration tests for stem.descriptor.* contents. """ __all__ = [ 'extrainfo_descriptor', 'microdescriptor', 'networkstatus', 'remote' 'server_descriptor', ] stem-1.7.1/test/integ/descriptor/server_descriptor.py0000664000175000017500000000257313237375570023616 0ustar atagaratagar00000000000000""" Integration tests for stem.descriptor.server_descriptor. """ import os import unittest import stem.descriptor import stem.util.test_tools import test from stem.util.test_tools import asynchronous class TestServerDescriptor(unittest.TestCase): @staticmethod def run_tests(args): stem.util.test_tools.ASYNC_TESTS['test.integ.descriptor.server_descriptor.test_cached_descriptor'].run(args.test_dir, threaded = True) @asynchronous def test_cached_descriptor(test_dir): """ Parses the cached descriptor file in our data directory, checking that it doesn't raise any validation issues and looking for unrecognized descriptor additions. """ descriptor_path = os.path.join(test_dir, 'cached-descriptors') if not os.path.exists(descriptor_path): raise stem.util.test_tools.SkipTest('(no cached descriptors)') with open(descriptor_path, 'rb') as descriptor_file: for desc in stem.descriptor.parse_file(descriptor_file, 'server-descriptor 1.0', validate = True): # the following attributes should be deprecated, and not appear in the wild if desc.read_history_end or desc.write_history_end or desc.eventdns or desc.socks_port: raise AssertionError('deprecated attribute appeared on: %s' % desc) for line in desc.get_unrecognized_lines(): test.register_new_capability('Server Descriptor Line', line) stem-1.7.1/test/integ/descriptor/remote.py0000664000175000017500000002106113341474573021335 0ustar atagaratagar00000000000000""" Integration tests for stem.descriptor.remote. """ import unittest import stem import stem.descriptor import stem.descriptor.extrainfo_descriptor import stem.descriptor.networkstatus import stem.descriptor.remote import stem.descriptor.router_status_entry import stem.descriptor.server_descriptor import stem.directory import test.require class TestDescriptorDownloader(unittest.TestCase): @test.require.only_run_once @test.require.online @test.require.cryptography def test_downloading_via_orport(self): moria1 = stem.directory.Authority.from_cache()['moria1'] desc = list(stem.descriptor.remote.their_server_descriptor( endpoints = [stem.ORPort(moria1.address, moria1.or_port)], fall_back_to_authority = False, ).run())[0] self.assertEqual('moria1', desc.nickname) self.assertTrue(isinstance(desc, stem.descriptor.server_descriptor.ServerDescriptor)) @test.require.only_run_once @test.require.online def test_downloading_via_dirport(self): moria1 = stem.directory.Authority.from_cache()['moria1'] desc = list(stem.descriptor.remote.their_server_descriptor( endpoints = [stem.DirPort(moria1.address, moria1.dir_port)], fall_back_to_authority = False, ).run())[0] self.assertEqual('moria1', desc.nickname) self.assertTrue(isinstance(desc, stem.descriptor.server_descriptor.ServerDescriptor)) @test.require.only_run_once @test.require.online def test_shorthand_aliases(self): """ Quick sanity test that we can call our shorthand aliases for getting descriptors. """ desc = list(stem.descriptor.remote.get_server_descriptors('9695DFC35FFEB861329B9F1AB04C46397020CE31').run())[0] self.assertEqual('moria1', desc.nickname) desc = list(stem.descriptor.remote.get_extrainfo_descriptors('9695DFC35FFEB861329B9F1AB04C46397020CE31').run())[0] self.assertEqual('moria1', desc.nickname) consensus = list(stem.descriptor.remote.get_consensus()) self.assertTrue(len(consensus) > 50) @test.require.only_run_once @test.require.online def test_authorities_are_up_to_date(self): """ Check that our hardcoded directory authority data matches the present consensus. """ downloader = stem.descriptor.remote.DescriptorDownloader() consensus = downloader.get_consensus(document_handler = stem.descriptor.DocumentHandler.BARE_DOCUMENT).run()[0] for auth in consensus.directory_authorities: if auth.nickname == 'dannenberg-legacy': continue # skip due to https://trac.torproject.org/projects/tor/ticket/17906 stem_auth = stem.directory.Authority.from_cache().get(auth.nickname) if not stem_auth: self.fail("%s isn't a recognized directory authority in stem" % auth.nickname) for attr in ('v3ident', 'or_port', 'dir_port'): if auth.nickname == 'moria1' and attr == 'address': continue # skip due to https://trac.torproject.org/projects/tor/ticket/14955 if getattr(auth, attr) != getattr(stem_auth, attr): self.fail('%s has %s %s, but we expected %s' % (auth.nickname, attr, getattr(auth, attr), getattr(stem_auth, attr))) @test.require.only_run_once @test.require.online def test_using_authorities(self): """ Fetches a descriptor from each of the directory authorities. This is intended to check that DIRECTORY_AUTHORITIES is still up to date (that addresses and ports haven't changed). This is hardcoded to fetch moria1's descriptor. If its fingerprint changes then this test will need to be updated. """ queries = [] for nickname, authority in stem.directory.Authority.from_cache().items(): queries.append((stem.descriptor.remote.Query( '/tor/server/fp/9695DFC35FFEB861329B9F1AB04C46397020CE31', 'server-descriptor 1.0', endpoints = [(authority.address, authority.dir_port)], timeout = 30, validate = True, ), authority)) for query, authority in queries: try: descriptors = list(query.run()) except Exception as exc: self.fail('Unable to use %s (%s:%s, %s): %s' % (authority.nickname, authority.address, authority.dir_port, type(exc), exc)) self.assertEqual(1, len(descriptors)) self.assertEqual('moria1', descriptors[0].nickname) @test.require.only_run_once @test.require.online def test_use_directory_mirrors(self): """ Checks that we can fetch and use a list of directory mirrors. """ downloader = stem.descriptor.remote.DescriptorDownloader() downloader.use_directory_mirrors() self.assertTrue(len(downloader._endpoints) > 50) @test.require.only_run_once @test.require.online def test_get_server_descriptors(self): """ Exercises the downloader's get_server_descriptors() method. """ downloader = stem.descriptor.remote.DescriptorDownloader(validate = True) # Fetch a single descriptor and a batch. I'd love to also exercise # retrieving all descriptors, but that adds roughly a minute to the runtime # of this test and adds an appreciable load to directory authorities. single_query = downloader.get_server_descriptors('9695DFC35FFEB861329B9F1AB04C46397020CE31') multiple_query = downloader.get_server_descriptors([ '9695DFC35FFEB861329B9F1AB04C46397020CE31', '847B1F850344D7876491A54892F904934E4EB85D', ]) # Explicitly running the queries so they'll provide a useful error if # unsuccessful. single_query.run() multiple_query.run() single_query_results = list(single_query) self.assertEqual(1, len(single_query_results)) self.assertEqual('moria1', single_query_results[0].nickname) self.assertTrue(isinstance(single_query_results[0], stem.descriptor.server_descriptor.ServerDescriptor)) self.assertEqual(2, len(list(multiple_query))) @test.require.only_run_once @test.require.online def test_get_extrainfo_descriptors(self): """ Exercises the downloader's get_extrainfo_descriptors() method. """ downloader = stem.descriptor.remote.DescriptorDownloader(validate = True) single_query = downloader.get_extrainfo_descriptors('9695DFC35FFEB861329B9F1AB04C46397020CE31') multiple_query = downloader.get_extrainfo_descriptors([ '9695DFC35FFEB861329B9F1AB04C46397020CE31', '847B1F850344D7876491A54892F904934E4EB85D', ]) single_query.run() multiple_query.run() single_query_results = list(single_query) self.assertEqual(1, len(single_query_results)) self.assertEqual('moria1', single_query_results[0].nickname) self.assertTrue(isinstance(single_query_results[0], stem.descriptor.extrainfo_descriptor.ExtraInfoDescriptor)) self.assertEqual(2, len(list(multiple_query))) @test.require.only_run_once @test.require.online def test_get_consensus(self): """ Exercises the downloader's get_consensus() method. """ downloader = stem.descriptor.remote.DescriptorDownloader(validate = True) consensus_query = downloader.get_consensus() consensus_query.run() consensus = list(consensus_query) self.assertTrue(len(consensus) > 50) self.assertTrue(isinstance(consensus[0], stem.descriptor.router_status_entry.RouterStatusEntryV3)) @test.require.only_run_once @test.require.online def test_get_microdescriptor_consensus(self): """ Exercises the downloader's get_consensus() method for fetching a microdescriptor consensus. """ downloader = stem.descriptor.remote.DescriptorDownloader(validate = True) consensus_query = downloader.get_consensus(microdescriptor = True) consensus_query.run() consensus = list(consensus_query) self.assertTrue(len(consensus) > 50) self.assertTrue(isinstance(consensus[0], stem.descriptor.router_status_entry.RouterStatusEntryMicroV3)) @test.require.only_run_once @test.require.online def test_get_key_certificates(self): """ Exercises the downloader's get_key_certificates() method. """ downloader = stem.descriptor.remote.DescriptorDownloader(validate = True) single_query = downloader.get_key_certificates('D586D18309DED4CD6D57C18FDB97EFA96D330566') multiple_query = downloader.get_key_certificates([ 'D586D18309DED4CD6D57C18FDB97EFA96D330566', '14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4', ]) single_query.run() multiple_query.run() single_query_results = list(single_query) self.assertEqual(1, len(single_query_results)) self.assertEqual('D586D18309DED4CD6D57C18FDB97EFA96D330566', single_query_results[0].fingerprint) self.assertTrue(isinstance(single_query_results[0], stem.descriptor.networkstatus.KeyCertificate)) self.assertEqual(2, len(list(multiple_query))) stem-1.7.1/test/integ/descriptor/microdescriptor.py0000664000175000017500000000217613237375570023261 0ustar atagaratagar00000000000000""" Integration tests for stem.descriptor.microdescriptor. """ import os import unittest import stem.descriptor import stem.util.test_tools import test from stem.util.test_tools import asynchronous class TestMicrodescriptor(unittest.TestCase): @staticmethod def run_tests(args): stem.util.test_tools.ASYNC_TESTS['test.integ.descriptor.microdescriptor.test_cached_microdescriptors'].run(args.test_dir, threaded = True) @asynchronous def test_cached_microdescriptors(test_dir): """ Parses the cached microdescriptor file in our data directory, checking that it doesn't raise any validation issues and looking for unrecognized descriptor additions. """ descriptor_path = os.path.join(test_dir, 'cached-microdescs') if not os.path.exists(descriptor_path): raise stem.util.test_tools.SkipTest('(no cached descriptors)') with open(descriptor_path, 'rb') as descriptor_file: for desc in stem.descriptor.parse_file(descriptor_file, 'microdescriptor 1.0', validate = True): for line in desc.get_unrecognized_lines(): test.register_new_capability('Microdescriptor Line', line) stem-1.7.1/test/integ/version.py0000664000175000017500000000275713237375570017365 0ustar atagaratagar00000000000000""" Tests that the stem.version functions can handle the tor instance we're running with. """ import unittest import stem.prereq import stem.version import test.require import test.runner class TestVersion(unittest.TestCase): @test.require.command('tor') def test_get_system_tor_version(self): """ Basic verification checks for the get_system_tor_version() function. """ # Since tor is in our path we should expect to be able to get the version # that way, though this might not belong to our test instance (if we're # running against a specific tor binary). stem.version.get_system_tor_version() # try running against a command that exists, but isn't tor self.assertRaises(IOError, stem.version.get_system_tor_version, 'ls') # try running against a command that doesn't exist self.assertRaises(IOError, stem.version.get_system_tor_version, 'blarg') @test.require.controller def test_getinfo_version_parsing(self): """ Issues a 'GETINFO version' query to our test instance and makes sure that we can parse it. """ control_socket = test.runner.get_runner().get_tor_socket() control_socket.send('GETINFO version') version_response = control_socket.recv() control_socket.close() # the getinfo response looks like... # 250-version=0.2.3.10-alpha-dev (git-65420e4cb5edcd02) # 250 OK tor_version = list(version_response)[0] tor_version = tor_version[8:].split(' ', 1)[0] stem.version.Version(tor_version) stem-1.7.1/test/integ/client/0000775000175000017500000000000013411004021016537 5ustar atagaratagar00000000000000stem-1.7.1/test/integ/client/connection.py0000664000175000017500000000424413355453571021305 0ustar atagaratagar00000000000000""" Integration tests for establishing a connection with tor's ORPort. """ import time import unittest import stem import test.runner from stem.client import Relay class TestConnection(unittest.TestCase): def test_invalid_arguments(self): """ Provide invalid arguments to Relay.connect(). """ self.assertRaisesWith(ValueError, "'nope' isn't an IPv4 or IPv6 address", Relay.connect, 'nope', 80) self.assertRaisesWith(ValueError, "'-54' isn't a valid port", Relay.connect, '127.0.0.1', -54) self.assertRaisesWith(ValueError, "Connection can't be established without a link protocol.", Relay.connect, '127.0.0.1', 54, []) def test_not_orport(self): """ Attempt to connect to an ORPort that doesn't exist. """ self.assertRaisesWith(stem.SocketError, "Failed to connect to 127.0.0.1:1587. Maybe it isn't an ORPort?", Relay.connect, '127.0.0.1', 1587) # connect to our ControlPort like it's an ORPort if test.runner.Torrc.PORT in test.runner.get_runner().get_options(): self.assertRaisesWith(stem.SocketError, "Failed to SSL authenticate to 127.0.0.1:1111. Maybe it isn't an ORPort?", Relay.connect, '127.0.0.1', test.runner.CONTROL_PORT) def test_no_common_link_protocol(self): """ Connection without a commonly accepted link protocol version. """ for link_protocol in (1, 2, 6, 20): self.assertRaisesWith(stem.SocketError, 'Unable to establish a common link protocol with 127.0.0.1:1113', Relay.connect, '127.0.0.1', test.runner.ORPORT, [link_protocol]) def test_connection_time(self): """ Checks duration we've been connected. """ before = time.time() with Relay.connect('127.0.0.1', test.runner.ORPORT) as conn: connection_time = conn.connection_time() self.assertTrue(time.time() >= connection_time >= before) time.sleep(0.02) self.assertTrue(conn.is_alive()) self.assertFalse(conn.is_alive()) self.assertTrue(conn.connection_time() >= connection_time + 0.02) def test_established(self): """ Successfully establish ORPort connection. """ conn = Relay.connect('127.0.0.1', test.runner.ORPORT) self.assertEqual(5, int(conn.link_protocol)) stem-1.7.1/test/integ/client/__init__.py0000664000175000017500000000011213341034346020661 0ustar atagaratagar00000000000000""" Integration tests for stem.client. """ __all__ = [ 'connection', ] stem-1.7.1/test/integ/connection/0000775000175000017500000000000013411004021017420 5ustar atagaratagar00000000000000stem-1.7.1/test/integ/connection/connect.py0000664000175000017500000000604513237375570021462 0ustar atagaratagar00000000000000""" Integration tests for the connect_* convenience functions. """ import unittest import stem.connection import test.require import test.runner try: from StringIO import StringIO except ImportError: from io import StringIO try: # added in python 3.3 from unittest.mock import patch except ImportError: from mock import patch class TestConnect(unittest.TestCase): @test.require.controller @patch('sys.stdout', new_callable = StringIO) def test_connect(self, stdout_mock): """ Basic sanity checks for the connect function. """ runner = test.runner.get_runner() control_socket = stem.connection.connect( control_port = ('127.0.0.1', test.runner.CONTROL_PORT), control_socket = test.runner.CONTROL_SOCKET_PATH, password = test.runner.CONTROL_PASSWORD, chroot_path = runner.get_chroot(), controller = None) test.runner.exercise_controller(self, control_socket) self.assertEqual('', stdout_mock.getvalue()) @test.require.controller @patch('sys.stdout', new_callable = StringIO) def test_connect_port(self, stdout_mock): """ Basic sanity checks for the connect_port function. """ runner = test.runner.get_runner() control_socket = stem.connection.connect_port( port = test.runner.CONTROL_PORT, password = test.runner.CONTROL_PASSWORD, chroot_path = runner.get_chroot(), controller = None) if test.runner.Torrc.PORT in runner.get_options(): test.runner.exercise_controller(self, control_socket) control_socket.close() self.assertEqual('', stdout_mock.getvalue()) else: self.assertEqual(control_socket, None) @test.require.controller @patch('sys.stdout', new_callable = StringIO) def test_connect_socket_file(self, stdout_mock): """ Basic sanity checks for the connect_socket_file function. """ runner = test.runner.get_runner() control_socket = stem.connection.connect_socket_file( path = test.runner.CONTROL_SOCKET_PATH, password = test.runner.CONTROL_PASSWORD, chroot_path = runner.get_chroot(), controller = None) if test.runner.Torrc.SOCKET in runner.get_options(): test.runner.exercise_controller(self, control_socket) control_socket.close() self.assertEqual('', stdout_mock.getvalue()) else: self.assertEqual(control_socket, None) @test.require.controller @patch('sys.stdout', new_callable = StringIO) def test_connect_to_socks_port(self, stdout_mock): """ Common user gotcha is connecting to the SocksPort or ORPort rather than the ControlPort. Testing that connecting to the SocksPort errors in a reasonable way. """ runner = test.runner.get_runner() control_socket = stem.connection.connect_port( port = test.runner.SOCKS_PORT, chroot_path = runner.get_chroot(), controller = None) self.assertEqual(None, control_socket) self.assertEqual('Please check in your torrc that 1112 is the ControlPort. Maybe you\nconfigured it to be the ORPort or SocksPort instead?\n', stdout_mock.getvalue()) stem-1.7.1/test/integ/connection/authentication.py0000664000175000017500000004010613237375570023044 0ustar atagaratagar00000000000000""" Integration tests for authenticating to the control socket via stem.connection.authenticate* functions. """ import os import unittest import stem.connection import stem.socket import stem.version import test import test.require import test.runner # Responses given by tor for various authentication failures. These may change # in the future and if they do then this test should be updated. COOKIE_AUTH_FAIL = 'Authentication failed: Wrong length on authentication cookie.' SAFECOOKIE_AUTH_FAIL = 'Authentication failed: Wrong length for safe cookie response.' PASSWORD_AUTH_FAIL = 'Authentication failed: Password did not match HashedControlPassword value from configuration. Maybe you tried a plain text password? If so, the standard requires that you put it in double quotes.' MULTIPLE_AUTH_FAIL = 'Authentication failed: Password did not match HashedControlPassword *or* authentication cookie.' SAFECOOKIE_AUTHCHALLENGE_FAIL = 'Cookie authentication is disabled' # this only arises in cookie-only or password-only auth when we authenticate # with the wrong value INCORRECT_COOKIE_FAIL = 'Authentication failed: Authentication cookie did not match expected value.' INCORRECT_SAFECOOKIE_FAIL = 'Authentication failed: Safe cookie response did not match expected value.' INCORRECT_PASSWORD_FAIL = 'Authentication failed: Password did not match HashedControlPassword value from configuration' def _can_authenticate(auth_type): """ Checks if a given authentication method can authenticate to our control socket. :param stem.connection.AuthMethod auth_type: authentication method to check :returns: bool that's True if we should be able to authenticate and False otherwise """ runner = test.runner.get_runner() tor_options = runner.get_options() password_auth = test.runner.Torrc.PASSWORD in tor_options cookie_auth = test.runner.Torrc.COOKIE in tor_options safecookie_auth = cookie_auth and test.tor_version() >= stem.version.Requirement.AUTH_SAFECOOKIE if not password_auth and not cookie_auth: # open socket, anything but safecookie will work return auth_type != stem.connection.AuthMethod.SAFECOOKIE elif auth_type == stem.connection.AuthMethod.PASSWORD: return password_auth elif auth_type == stem.connection.AuthMethod.COOKIE: return cookie_auth elif auth_type == stem.connection.AuthMethod.SAFECOOKIE: return safecookie_auth else: return False def _get_auth_failure_message(auth_type): """ Provides the message that tor will respond with if our current method of authentication fails. Note that this test will need to be updated if tor changes its rejection reponse. :param stem.connection.AuthMethod auth_type: authentication method to check :returns: string with the rejection message that tor would provide """ tor_options = test.runner.get_runner().get_options() password_auth = test.runner.Torrc.PASSWORD in tor_options cookie_auth = test.runner.Torrc.COOKIE in tor_options if cookie_auth and password_auth: return MULTIPLE_AUTH_FAIL elif cookie_auth: if auth_type == stem.connection.AuthMethod.COOKIE: return INCORRECT_COOKIE_FAIL elif auth_type == stem.connection.AuthMethod.SAFECOOKIE: return INCORRECT_SAFECOOKIE_FAIL else: return COOKIE_AUTH_FAIL elif password_auth: if auth_type == stem.connection.AuthMethod.PASSWORD: return INCORRECT_PASSWORD_FAIL else: return PASSWORD_AUTH_FAIL else: # The only way that we should fail to authenticate to an open control # socket is if we attempt via safecookie (since we get an 'unsupported' # response via the AUTHCHALLENGE call rather than AUTHENTICATE). For # anything else if we get here it indicates that this test has a bug. if auth_type == stem.connection.AuthMethod.SAFECOOKIE: return SAFECOOKIE_AUTHCHALLENGE_FAIL raise ValueError("No methods of authentication. If this is an open socket then auth shouldn't fail.") class TestAuthenticate(unittest.TestCase): def setUp(self): self.cookie_auth_methods = [stem.connection.AuthMethod.COOKIE] if test.tor_version() >= stem.version.Requirement.AUTH_SAFECOOKIE: self.cookie_auth_methods.append(stem.connection.AuthMethod.SAFECOOKIE) @test.require.controller def test_authenticate_general_socket(self): """ Tests that the authenticate function can authenticate to our socket. """ runner = test.runner.get_runner() with runner.get_tor_socket(False) as control_socket: stem.connection.authenticate(control_socket, test.runner.CONTROL_PASSWORD, runner.get_chroot()) test.runner.exercise_controller(self, control_socket) @test.require.controller def test_authenticate_general_controller(self): """ Tests that the authenticate function can authenticate via a Controller. """ runner = test.runner.get_runner() with runner.get_tor_controller(False) as controller: stem.connection.authenticate(controller, test.runner.CONTROL_PASSWORD, runner.get_chroot()) test.runner.exercise_controller(self, controller) @test.require.controller def test_authenticate_general_example(self): """ Tests the authenticate function with something like its pydoc example. """ runner = test.runner.get_runner() tor_options = runner.get_options() try: control_socket = stem.socket.ControlPort(port = test.runner.CONTROL_PORT) except stem.SocketError: # assert that we didn't have a socket to connect to self.assertFalse(test.runner.Torrc.PORT in tor_options) return try: # this authenticate call should work for everything but password-only auth stem.connection.authenticate(control_socket, chroot_path = runner.get_chroot()) test.runner.exercise_controller(self, control_socket) except stem.connection.IncorrectSocketType: self.fail() except stem.connection.MissingPassword: self.assertTrue(test.runner.Torrc.PASSWORD in tor_options) controller_password = test.runner.CONTROL_PASSWORD try: stem.connection.authenticate_password(control_socket, controller_password) test.runner.exercise_controller(self, control_socket) except stem.connection.PasswordAuthFailed: self.fail() except stem.connection.AuthenticationFailure: self.fail() finally: control_socket.close() @test.require.controller def test_authenticate_general_password(self): """ Tests the authenticate function's password argument. """ # this is a much better test if we're just using password auth, since # authenticate will work reguardless if there's something else to # authenticate with runner = test.runner.get_runner() tor_options = runner.get_options() is_password_only = test.runner.Torrc.PASSWORD in tor_options and test.runner.Torrc.COOKIE not in tor_options # tests without a password with runner.get_tor_socket(False) as control_socket: if is_password_only: self.assertRaises(stem.connection.MissingPassword, stem.connection.authenticate, control_socket) else: stem.connection.authenticate(control_socket, chroot_path = runner.get_chroot()) test.runner.exercise_controller(self, control_socket) # tests with the incorrect password with runner.get_tor_socket(False) as control_socket: if is_password_only: self.assertRaises(stem.connection.IncorrectPassword, stem.connection.authenticate, control_socket, 'blarg') else: stem.connection.authenticate(control_socket, 'blarg', runner.get_chroot()) test.runner.exercise_controller(self, control_socket) # tests with the right password with runner.get_tor_socket(False) as control_socket: stem.connection.authenticate(control_socket, test.runner.CONTROL_PASSWORD, runner.get_chroot()) test.runner.exercise_controller(self, control_socket) @test.require.controller def test_authenticate_general_cookie(self): """ Tests the authenticate function with only cookie authentication methods. This manipulates our PROTOCOLINFO response to test each method individually. """ runner = test.runner.get_runner() tor_options = runner.get_options() is_cookie_only = test.runner.Torrc.COOKIE in tor_options and test.runner.Torrc.PASSWORD not in tor_options # test both cookie authentication mechanisms with runner.get_tor_socket(False) as control_socket: if is_cookie_only: for method in (stem.connection.AuthMethod.COOKIE, stem.connection.AuthMethod.SAFECOOKIE): protocolinfo_response = stem.connection.get_protocolinfo(control_socket) if method in protocolinfo_response.auth_methods: # narrow to *only* use cookie auth or safecooke, so we exercise # both independently protocolinfo_response.auth_methods = (method, ) stem.connection.authenticate(control_socket, chroot_path = runner.get_chroot(), protocolinfo_response = protocolinfo_response) @test.require.controller def test_authenticate_none(self): """ Tests the authenticate_none function. """ auth_type = stem.connection.AuthMethod.NONE if _can_authenticate(auth_type): self._check_auth(auth_type) else: self.assertRaises(stem.connection.OpenAuthRejected, self._check_auth, auth_type) @test.require.controller def test_authenticate_password(self): """ Tests the authenticate_password function. """ auth_type = stem.connection.AuthMethod.PASSWORD auth_value = test.runner.CONTROL_PASSWORD if _can_authenticate(auth_type): self._check_auth(auth_type, auth_value) else: self.assertRaises(stem.connection.PasswordAuthRejected, self._check_auth, auth_type, auth_value) # Check with an empty, invalid, and quoted password. These should work if # we have no authentication, and fail otherwise. for auth_value in ('', 'blarg', 'this has a " in it'): if _can_authenticate(stem.connection.AuthMethod.NONE): self._check_auth(auth_type, auth_value) else: if _can_authenticate(stem.connection.AuthMethod.PASSWORD): exc_type = stem.connection.IncorrectPassword else: exc_type = stem.connection.PasswordAuthRejected self.assertRaises(exc_type, self._check_auth, auth_type, auth_value) @test.require.controller def test_wrong_password_with_controller(self): """ We ran into a race condition where providing the wrong password to the Controller caused inconsistent responses. Checking for that... https://trac.torproject.org/projects/tor/ticket/22679 """ runner = test.runner.get_runner() if test.runner.Torrc.PASSWORD not in runner.get_options() or test.runner.Torrc.COOKIE in runner.get_options(): self.skipTest('(requires only password auth)') return for i in range(10): with runner.get_tor_controller(False) as controller: self.assertRaises(stem.connection.IncorrectPassword, controller.authenticate, 'wrong_password') @test.require.controller def test_authenticate_cookie(self): """ Tests the authenticate_cookie function. """ auth_value = test.runner.get_runner().get_auth_cookie_path() for auth_type in self.cookie_auth_methods: if not os.path.exists(auth_value): # If the authentication cookie doesn't exist then we'll be getting an # error for that rather than rejection. This will even fail if # _can_authenticate is true because we *can* authenticate with cookie # auth but the function will short circuit with failure due to the # missing file. self.assertRaises(stem.connection.UnreadableCookieFile, self._check_auth, auth_type, auth_value, False) elif _can_authenticate(auth_type): self._check_auth(auth_type, auth_value) else: self.assertRaises(stem.connection.CookieAuthRejected, self._check_auth, auth_type, auth_value, False) @test.require.controller def test_authenticate_cookie_invalid(self): """ Tests the authenticate_cookie function with a properly sized but incorrect value. """ auth_value = test.runner.get_runner().get_test_dir('fake_cookie') # we need to create a 32 byte cookie file to load from fake_cookie = open(auth_value, 'w') fake_cookie.write('0' * 32) fake_cookie.close() for auth_type in self.cookie_auth_methods: if _can_authenticate(stem.connection.AuthMethod.NONE): # authentication will work anyway unless this is safecookie if auth_type == stem.connection.AuthMethod.COOKIE: self._check_auth(auth_type, auth_value) elif auth_type == stem.connection.AuthMethod.SAFECOOKIE: exc_type = stem.connection.CookieAuthRejected self.assertRaises(exc_type, self._check_auth, auth_type, auth_value) else: if auth_type == stem.connection.AuthMethod.SAFECOOKIE: if _can_authenticate(auth_type): exc_type = stem.connection.AuthSecurityFailure else: exc_type = stem.connection.CookieAuthRejected elif _can_authenticate(auth_type): exc_type = stem.connection.IncorrectCookieValue else: exc_type = stem.connection.CookieAuthRejected self.assertRaises(exc_type, self._check_auth, auth_type, auth_value, False) os.remove(auth_value) @test.require.controller def test_authenticate_cookie_missing(self): """ Tests the authenticate_cookie function with a path that really, really shouldn't exist. """ for auth_type in self.cookie_auth_methods: auth_value = "/if/this/exists/then/they're/asking/for/a/failure" self.assertRaises(stem.connection.UnreadableCookieFile, self._check_auth, auth_type, auth_value, False) @test.require.controller def test_authenticate_cookie_wrong_size(self): """ Tests the authenticate_cookie function with our torrc as an auth cookie. This is to confirm that we won't read arbitrary files to the control socket. """ auth_value = test.runner.get_runner().get_torrc_path(True) for auth_type in self.cookie_auth_methods: if os.path.getsize(auth_value) == 32: # Weird coincidence? Fail so we can pick another file to check against. self.fail('Our torrc is 32 bytes, preventing the test_authenticate_cookie_wrong_size test from running.') else: self.assertRaises(stem.connection.IncorrectCookieSize, self._check_auth, auth_type, auth_value, False) def _check_auth(self, auth_type, auth_arg = None, check_message = True): """ Attempts to use the given type of authentication against tor's control socket. If it succeeds then we check that the socket can then be used. If not then we check that this gives a message that we'd expect then raises the exception. :param stem.connection.AuthMethod auth_type: method by which we should authentiate to the control socket :param str auth_arg: argument to be passed to the authentication function :param bool check_message: checks that failure messages are what we'd expect :raises: :class:`stem.connection.AuthenticationFailure` if the authentication fails """ with test.runner.get_runner().get_tor_socket(False) as control_socket: # run the authentication, re-raising if there's a problem try: if auth_type == stem.connection.AuthMethod.NONE: stem.connection.authenticate_none(control_socket) elif auth_type == stem.connection.AuthMethod.PASSWORD: stem.connection.authenticate_password(control_socket, auth_arg) elif auth_type == stem.connection.AuthMethod.COOKIE: stem.connection.authenticate_cookie(control_socket, auth_arg) elif auth_type == stem.connection.AuthMethod.SAFECOOKIE: stem.connection.authenticate_safecookie(control_socket, auth_arg) test.runner.exercise_controller(self, control_socket) except stem.connection.AuthenticationFailure as exc: # authentication functions should re-attach on failure self.assertTrue(control_socket.is_alive()) # check that we got the failure message that we'd expect if check_message: failure_msg = _get_auth_failure_message(auth_type) self.assertEqual(failure_msg, str(exc)) raise exc stem-1.7.1/test/integ/connection/__init__.py0000664000175000017500000000012613237375570021562 0ustar atagaratagar00000000000000""" Integration tests for stem.connection. """ __all__ = ['authenticate', 'connect'] stem-1.7.1/test/integ/interpreter.py0000664000175000017500000000317013237375570020231 0ustar atagaratagar00000000000000""" Tests invocation of our interpreter. """ import os import tempfile import unittest import stem.util.system import test import test.require import test.runner PROMPT_CMD = os.path.join(test.STEM_BASE, 'tor-prompt') def _run_prompt(*args): if test.runner.Torrc.SOCKET not in test.runner.get_runner().get_options(): return stem.util.system.call([PROMPT_CMD, '--interface', test.runner.CONTROL_PORT] + list(args)) else: return stem.util.system.call([PROMPT_CMD, '--socket', test.runner.CONTROL_SOCKET_PATH] + list(args)) class TestInterpreter(unittest.TestCase): @test.require.controller def test_running_command(self): # We'd need to provide the password to stdin. Fine test to add later but # not gonna hassle for now. if test.runner.Torrc.PASSWORD in test.runner.get_runner().get_options(): self.skipTest('password auth unsupported') return expected = ['250-config-file=%s' % test.runner.get_runner().get_torrc_path(), '250 OK'] self.assertEqual(expected, _run_prompt('--run', 'GETINFO config-file')) @test.require.controller def test_running_file(self): if test.runner.Torrc.PASSWORD in test.runner.get_runner().get_options(): self.skipTest('password auth unsupported') return expected = [ '250-config-file=%s' % test.runner.get_runner().get_torrc_path(), '250 OK', '', '250-version=%s' % test.tor_version(), '250 OK', ] with tempfile.NamedTemporaryFile(prefix = 'test_commands.') as tmp: tmp.write(b'GETINFO config-file\nGETINFO version') tmp.flush() self.assertEqual(expected, _run_prompt('--run', tmp.name)) stem-1.7.1/test/integ/response/0000775000175000017500000000000013411004021017117 5ustar atagaratagar00000000000000stem-1.7.1/test/integ/response/protocolinfo.py0000664000175000017500000001241413237375570022242 0ustar atagaratagar00000000000000""" Integration tests for the stem.response.protocolinfo.ProtocolInfoResponse class and related functions. """ import unittest import stem.connection import stem.socket import stem.util.system import stem.version import test import test.integ.util.system import test.require import test.runner try: # added in python 3.3 from unittest.mock import Mock, patch except ImportError: from mock import Mock, patch class TestProtocolInfo(unittest.TestCase): @test.require.controller def test_parsing(self): """ Makes a PROTOCOLINFO query and processes the response for our control connection. """ control_socket = test.runner.get_runner().get_tor_socket(False) control_socket.send('PROTOCOLINFO 1') protocolinfo_response = control_socket.recv() stem.response.convert('PROTOCOLINFO', protocolinfo_response) control_socket.close() # according to the control spec the following _could_ differ or be # undefined but if that actually happens then it's gonna make people sad self.assertEqual(1, protocolinfo_response.protocol_version) self.assertNotEqual(None, protocolinfo_response.tor_version) self.assertNotEqual(None, protocolinfo_response.auth_methods) self.assert_matches_test_config(protocolinfo_response) @test.require.controller @patch('stem.util.proc.is_available', Mock(return_value = False)) @patch('stem.util.system.is_available', Mock(return_value = True)) def test_get_protocolinfo_path_expansion(self): """ If we're running with the 'RELATIVE' target then test_parsing() will exercise cookie path expansion when we're able to query the pid by our prcess name. This test selectively disables system.call() so we exercise the expansion via our control port or socket file. This test is largely redundant with test_parsing() if we aren't running with the 'RELATIVE' target. """ if test.runner.Torrc.PORT in test.runner.get_runner().get_options(): lookup_prefixes = ( stem.util.system.GET_PID_BY_PORT_NETSTAT, stem.util.system.GET_PID_BY_PORT_SOCKSTAT % '', stem.util.system.GET_PID_BY_PORT_LSOF, stem.util.system.GET_CWD_PWDX % '', 'lsof -a -p ') control_socket = stem.socket.ControlPort(port = test.runner.CONTROL_PORT) else: lookup_prefixes = ( stem.util.system.GET_PID_BY_FILE_LSOF % '', stem.util.system.GET_CWD_PWDX % '', 'lsof -a -p ') control_socket = stem.socket.ControlSocketFile(test.runner.CONTROL_SOCKET_PATH) call_replacement = test.integ.util.system.filter_system_call(lookup_prefixes) with patch('stem.util.system.call') as call_mock: call_mock.side_effect = call_replacement protocolinfo_response = stem.connection.get_protocolinfo(control_socket) self.assert_matches_test_config(protocolinfo_response) # we should have a usable socket at this point self.assertTrue(control_socket.is_alive()) control_socket.close() @test.require.controller def test_multiple_protocolinfo_calls(self): """ Tests making repeated PROTOCOLINFO queries. This use case is interesting because tor will shut down the socket and stem should transparently re-establish it. """ with test.runner.get_runner().get_tor_socket(False) as control_socket: for _ in range(5): protocolinfo_response = stem.connection.get_protocolinfo(control_socket) self.assert_matches_test_config(protocolinfo_response) @test.require.controller def test_pre_disconnected_query(self): """ Tests making a PROTOCOLINFO query when previous use of the socket had already disconnected it. """ with test.runner.get_runner().get_tor_socket(False) as control_socket: # makes a couple protocolinfo queries outside of get_protocolinfo first control_socket.send('PROTOCOLINFO 1') control_socket.recv() control_socket.send('PROTOCOLINFO 1') control_socket.recv() protocolinfo_response = stem.connection.get_protocolinfo(control_socket) self.assert_matches_test_config(protocolinfo_response) def assert_matches_test_config(self, protocolinfo_response): """ Makes assertions that the protocolinfo response's attributes match those of the test configuration. """ runner = test.runner.get_runner() tor_options = runner.get_options() auth_methods, auth_cookie_path = [], None if test.runner.Torrc.COOKIE in tor_options: auth_methods.append(stem.response.protocolinfo.AuthMethod.COOKIE) if test.tor_version() >= stem.version.Requirement.AUTH_SAFECOOKIE: auth_methods.append(stem.response.protocolinfo.AuthMethod.SAFECOOKIE) chroot_path = runner.get_chroot() auth_cookie_path = runner.get_auth_cookie_path() if chroot_path and auth_cookie_path.startswith(chroot_path): auth_cookie_path = auth_cookie_path[len(chroot_path):] if test.runner.Torrc.PASSWORD in tor_options: auth_methods.append(stem.response.protocolinfo.AuthMethod.PASSWORD) if not auth_methods: auth_methods.append(stem.response.protocolinfo.AuthMethod.NONE) self.assertEqual((), protocolinfo_response.unknown_auth_methods) self.assertEqual(tuple(auth_methods), protocolinfo_response.auth_methods) self.assertEqual(auth_cookie_path, protocolinfo_response.cookie_path) stem-1.7.1/test/integ/response/__init__.py0000664000175000017500000000011113237375570021253 0ustar atagaratagar00000000000000""" Integration tests for stem.response. """ __all__ = ['protocolinfo'] stem-1.7.1/test/integ/__init__.py0000664000175000017500000000026613341034346017415 0ustar atagaratagar00000000000000""" Integration tests for the stem library. """ __all__ = [ 'client', 'connection', 'control', 'descriptor', 'response', 'socket', 'util', 'process', 'version', ] stem-1.7.1/test/integ/manual.py0000664000175000017500000003007713355717363017152 0ustar atagaratagar00000000000000""" Integ testing for the stem.manual module, fetching the latest man page from the tor git repository and checking for new additions. """ import codecs import os import tempfile import unittest import stem.manual import stem.util.system import test import test.runner from stem.manual import Category EXPECTED_CATEGORIES = set([ 'NAME', 'SYNOPSIS', 'DESCRIPTION', 'COMMAND-LINE OPTIONS', 'THE CONFIGURATION FILE FORMAT', 'GENERAL OPTIONS', 'CLIENT OPTIONS', 'SERVER OPTIONS', 'DIRECTORY SERVER OPTIONS', 'DIRECTORY AUTHORITY SERVER OPTIONS', 'HIDDEN SERVICE OPTIONS', 'DENIAL OF SERVICE MITIGATION OPTIONS', 'CLIENT AUTHORIZATION', 'TESTING NETWORK OPTIONS', 'NON-PERSISTENT OPTIONS', 'SIGNALS', 'FILES', 'SEE ALSO', 'BUGS', 'AUTHORS', ]) EXPECTED_CLI_OPTIONS = set(['-f FILE', '--hash-password PASSWORD', '--ignore-missing-torrc', '--defaults-torrc FILE', '--key-expiration [purpose]', '--list-fingerprint', '--list-deprecated-options', '--allow-missing-torrc', '--nt-service', '--verify-config', '--service remove|start|stop', '--passphrase-fd FILEDES', '--keygen [--newpass]', '--list-torrc-options', '--service install [--options command-line options]', '--quiet|--hush', '--version', '-h, -help']) EXPECTED_SIGNALS = set(['SIGTERM', 'SIGINT', 'SIGHUP', 'SIGUSR1', 'SIGUSR2', 'SIGCHLD', 'SIGPIPE', 'SIGXFSZ']) EXPECTED_DESCRIPTION = """ Tor is a connection-oriented anonymizing communication service. Users choose a source-routed path through a set of nodes, and negotiate a "virtual circuit" through the network, in which each node knows its predecessor and successor, but no others. Traffic flowing down the circuit is unwrapped by a symmetric key at each node, which reveals the downstream node. Basically, Tor provides a distributed network of servers or relays ("onion routers"). Users bounce their TCP streams -- web traffic, ftp, ssh, etc. -- around the network, and recipients, observers, and even the relays themselves have difficulty tracking the source of the stream. By default, tor will act as a client only. To help the network by providing bandwidth as a relay, change the ORPort configuration option -- see below. Please also consult the documentation on the Tor Project's website. """.strip() EXPECTED_FILE_DESCRIPTION = 'Specify a new configuration file to contain further Tor configuration options OR pass - to make Tor read its configuration from standard input. (Default: @CONFDIR@/torrc, or $HOME/.torrc if that file is not found)' EXPECTED_BANDWIDTH_RATE_DESCRIPTION = 'A token bucket limits the average incoming bandwidth usage on this node to the specified number of bytes per second, and the average outgoing bandwidth usage to that same value. If you want to run a relay in the public network, this needs to be at the very least 75 KBytes for a relay (that is, 600 kbits) or 50 KBytes for a bridge (400 kbits) -- but of course, more is better; we recommend at least 250 KBytes (2 mbits) if possible. (Default: 1 GByte)\n\nNote that this option, and other bandwidth-limiting options, apply to TCP data only: They do not count TCP headers or DNS traffic.\n\nWith this option, and in other options that take arguments in bytes, KBytes, and so on, other formats are also supported. Notably, "KBytes" can also be written as "kilobytes" or "kb"; "MBytes" can be written as "megabytes" or "MB"; "kbits" can be written as "kilobits"; and so forth. Tor also accepts "byte" and "bit" in the singular. The prefixes "tera" and "T" are also recognized. If no units are given, we default to bytes. To avoid confusion, we recommend writing "bytes" or "bits" explicitly, since it\'s easy to forget that "B" means bytes, not bits.' EXPECTED_EXIT_POLICY_DESCRIPTION_START = 'Set an exit policy for this server. Each policy' EXPECTED_EXIT_POLICY_DESCRIPTION_END = 'it applies to both IPv4 and IPv6 addresses.' class TestManual(unittest.TestCase): # TODO: remove when dropping support for python 2.6 skip_reason = 'setUpClass() unsupported in python 2.6' @classmethod def setUpClass(self): self.man_path = None self.man_content = None self.skip_reason = None self.download_error = None if stem.util.system.is_windows(): self.skip_reason = '(unavailable on windows)' elif test.Target.ONLINE not in test.runner.get_runner().attribute_targets: self.skip_reason = '(requires online target)' elif not stem.util.system.is_available('a2x'): self.skip_reason = '(requires asciidoc)' else: try: with tempfile.NamedTemporaryFile(prefix = 'tor_man_page.', delete = False) as tmp: stem.manual.download_man_page(file_handle = tmp) self.man_path = tmp.name man_cmd = 'man %s -P cat %s' % ('' if not stem.manual.HAS_ENCODING_ARG else '--encoding=ascii', self.man_path) self.man_content = stem.util.system.call(man_cmd, env = {'MANWIDTH': '10000000'}) except Exception as exc: self.download_error = 'Unable to download the man page: %s' % exc @classmethod def tearDownClass(self): if self.man_path and os.path.exists(self.man_path): os.remove(self.man_path) def requires_downloaded_manual(self): if self.skip_reason: self.skipTest(self.skip_reason) return True elif self.download_error: self.fail(self.download_error) return False def test_escapes_non_ascii(self): """ Check that our manual parser escapes all non-ascii characters. If this fails then that means someone probably added a new type of non-ascii character. Easy to fix: please simply add an escape for it in stem/manual.py's _get_categories(). """ if self.requires_downloaded_manual(): return def check(content): try: codecs.ascii_encode(content, 'strict') except UnicodeEncodeError as exc: self.fail("Unable to read '%s' as ascii: %s" % (content, exc)) categories = stem.manual._get_categories(self.man_content) for category, lines in categories.items(): check(category) for line in lines: check(line) def test_parsing_with_indented_lines(self): """ Our ExitPolicy's description is an interesting one for our parser in that it has indented lines within it. Ensure we parse this correctly. """ if self.requires_downloaded_manual(): return manual = stem.manual.Manual.from_man(self.man_path) self.assertTrue(manual.config_options['ExitPolicy'].description.startswith(EXPECTED_EXIT_POLICY_DESCRIPTION_START)) self.assertTrue(manual.config_options['ExitPolicy'].description.endswith(EXPECTED_EXIT_POLICY_DESCRIPTION_END)) def test_that_cache_is_up_to_date(self): """ Check if the cached manual information bundled with Stem is up to date or not. """ if self.requires_downloaded_manual(): return cached_manual = stem.manual.Manual.from_cache() latest_manual = stem.manual.Manual.from_man(self.man_path) if cached_manual != latest_manual: self.fail("Stem's cached manual information is out of date. Please run 'cache_manual.py'...\n\n%s" % stem.manual._manual_differences(cached_manual, latest_manual)) def test_attributes(self): """ General assertions against a few manual fields. If you update tor's manual then go ahead and simply update these assertions. """ if self.requires_downloaded_manual(): return def assert_equal(category, expected, actual): if expected != actual: self.fail("Changed tor's man page? The %s changed as follows...\n\nexpected: %s\n\nactual: %s" % (category, expected, actual)) manual = stem.manual.Manual.from_man(self.man_path) assert_equal('name', 'tor - The second-generation onion router', manual.name) assert_equal('synopsis', 'tor [OPTION value]...', manual.synopsis) assert_equal('description', EXPECTED_DESCRIPTION, manual.description) assert_equal('commandline options', EXPECTED_CLI_OPTIONS, set(manual.commandline_options.keys())) assert_equal('help option', 'Display a short help message and exit.', manual.commandline_options['-h, -help']) assert_equal('file option', EXPECTED_FILE_DESCRIPTION, manual.commandline_options['-f FILE']) assert_equal('signals', EXPECTED_SIGNALS, set(manual.signals.keys())) assert_equal('sighup description', 'Tor will catch this, clean up and sync to disk if necessary, and exit.', manual.signals['SIGTERM']) assert_equal('number of files', 48, len(manual.files)) assert_equal('lib path description', 'The tor process stores keys and other data here.', manual.files['@LOCALSTATEDIR@/lib/tor/']) for category in Category: if len([entry for entry in manual.config_options.values() if entry.category == category]) == 0 and category != Category.UNKNOWN: self.fail('We had an empty %s section, did we intentionally drop it?' % category) unknown_options = [entry for entry in manual.config_options.values() if entry.category == Category.UNKNOWN] if unknown_options: self.fail("We don't recognize the category for the %s options. Maybe a new man page section? If so then please update the Category enum in stem/manual.py." % ', '.join([option.name for option in unknown_options])) option = manual.config_options['BandwidthRate'] self.assertEqual(Category.GENERAL, option.category) self.assertEqual('BandwidthRate', option.name) self.assertEqual('N bytes|KBytes|MBytes|GBytes|TBytes|KBits|MBits|GBits|TBits', option.usage) self.assertEqual('Average bandwidth usage limit', option.summary) self.assertEqual(EXPECTED_BANDWIDTH_RATE_DESCRIPTION, option.description) def test_has_all_categories(self): """ Check that the categories in tor's manual matches what we expect. If these change then we likely want to add/remove attributes from Stem's Manual class to match. """ if self.requires_downloaded_manual(): return categories = stem.manual._get_categories(self.man_content) present = set(categories.keys()) missing_categories = EXPECTED_CATEGORIES.difference(present) extra_categories = present.difference(EXPECTED_CATEGORIES) if missing_categories: self.fail("Changed tor's man page? We expected the %s man page sections but they're no longer around. Might need to update our Manual class." % ', '.join(missing_categories)) elif extra_categories: self.fail("Changed tor's man page? We weren't expecting the %s man page sections. Might need to update our Manual class." % ', '.join(extra_categories)) self.assertEqual(['tor - The second-generation onion router'], categories['NAME']) self.assertEqual(['tor [OPTION value]...'], categories['SYNOPSIS']) def test_has_all_tor_config_options(self): """ Check that all the configuration options tor supports are in the man page. """ if self.requires_downloaded_manual(): return with test.runner.get_runner().get_tor_controller() as controller: config_options_in_tor = set([line.split()[0] for line in controller.get_info('config/names').splitlines() if line.split()[1] != 'Virtual']) # options starting with an underscore are hidden by convention for name in list(config_options_in_tor): if name.startswith('_'): config_options_in_tor.remove(name) # TODO: Looks like options we should remove from tor... # # https://trac.torproject.org/projects/tor/ticket/17665 for option in ('SchedulerMaxFlushCells__', 'SchedulerLowWaterMark__', 'SchedulerHighWaterMark__'): if option in config_options_in_tor: config_options_in_tor.remove(option) manual = stem.manual.Manual.from_man(self.man_path) config_options_in_manual = set(manual.config_options.keys()) missing_from_manual = config_options_in_tor.difference(config_options_in_manual) if missing_from_manual: self.fail("The %s config options supported by tor isn't in its man page. Maybe we need to add them?" % ', '.join(missing_from_manual)) extra_in_manual = config_options_in_manual.difference(config_options_in_tor) if extra_in_manual: self.fail("The %s config options in our man page aren't presently supported by tor. Are we using the latest git commit of tor? If so, maybe we need to remove them?" % ', '.join(extra_in_manual)) stem-1.7.1/test/integ/util/0000775000175000017500000000000013411004021016236 5ustar atagaratagar00000000000000stem-1.7.1/test/integ/util/system.py0000664000175000017500000004251113411002341020142 0ustar atagaratagar00000000000000""" Integration tests for the stem.util.system functions against the tor process that we're running. """ import getpass import os import tempfile import unittest import stem.prereq import stem.util.proc import stem.util.system import test.require import test.runner from stem.util.system import State, DaemonTask try: # added in python 3.3 from unittest.mock import Mock, patch except ImportError: from mock import Mock, patch def filter_system_call(prefixes): """ Provides a functor that passes calls on to the stem.util.system.call() function if it matches one of the prefixes, and acts as a no-op otherwise. """ original_call = stem.util.system.call def _filter_system_call(command, default): for prefix in prefixes: if command.startswith(prefix): real_call_function = original_call return real_call_function(command) return _filter_system_call def _is_single_tor_running(): if stem.util.system.is_windows(): return True # TODO: not sure how to check for this on windows elif not stem.util.system.is_bsd(): tor_cmd = test.runner.get_runner().get_tor_command(True) pgrep_results = stem.util.system.call(stem.util.system.GET_PID_BY_NAME_PGREP % tor_cmd) return len(pgrep_results) == 1 else: ps_results = stem.util.system.call(stem.util.system.GET_PID_BY_NAME_PS_BSD) results = [r for r in ps_results if r.endswith(' tor')] return len(results) == 1 def _is_linux(): return not stem.util.system.is_bsd() and not stem.util.system.is_windows() def _has_port(): """ True if our test runner has a control port, False otherwise. """ return test.runner.Torrc.PORT in test.runner.get_runner().get_options() require_single_tor_instance = test.require.needs(_is_single_tor_running, 'multiple tor instances') require_control_port = test.require.needs(_has_port, 'test instance has no port') require_linux = test.require.needs(_is_linux, 'linux only') require_bsd = test.require.needs(stem.util.system.is_bsd, 'bsd only') require_path = test.require.needs(lambda: 'PATH' in os.environ, 'requires PATH') class TestSystem(unittest.TestCase): def test_daemon_task_when_successful(self): """ Checks a simple, successfully DaemonTask that simply echos a value. """ task = DaemonTask(lambda arg: arg, ('hello world',)) self.assertEqual(None, task.result) self.assertEqual(State.PENDING, task.status) task.run() self.assertEqual('hello world', task.join()) self.assertEqual(State.DONE, task.status) self.assertTrue(0 < task.runtime < 1.0) def test_daemon_task_on_failure(self): """ Checks DaemonTask when an exception is raised. """ def _test_task(arg): raise RuntimeError(arg) task = DaemonTask(_test_task, ('hello world',)) self.assertEqual(None, task.result) self.assertEqual(State.PENDING, task.status) task.run() self.assertRaisesWith(RuntimeError, 'hello world', task.join) self.assertEqual(State.FAILED, task.status) self.assertTrue(0 < task.runtime < 1.0) @require_path def test_is_available(self): """ Checks the stem.util.system.is_available function. """ # I have yet to see a platform without 'ls' if stem.util.system.is_windows(): self.assertTrue(stem.util.system.is_available('dir')) else: self.assertTrue(stem.util.system.is_available('ls')) # but it would be kinda weird if this did... self.assertFalse(stem.util.system.is_available('blarg_and_stuff')) def test_is_running_by_pid(self): """ Checks the stem.util.system.is_running function with a pid. """ self.assertTrue(stem.util.system.is_running(test.runner.get_runner().get_pid())) self.assertFalse(stem.util.system.is_running(528955)) @test.require.command('ps') def test_is_running_by_name(self): """ Checks the stem.util.system.is_running function with a process name. """ # Check to see if the command we started tor with is running. The process # might be running under another name so need to check for 'tor.real' too # (#15449). tor_cmd = test.runner.get_runner().get_tor_command(True) self.assertTrue(stem.util.system.is_running(tor_cmd) or stem.util.system.is_running('tor.real')) self.assertFalse(stem.util.system.is_running('blarg_and_stuff')) @require_path @require_single_tor_instance def test_pid_by_name(self): """ Checks general usage of the stem.util.system.pid_by_name function. This will fail if there's other tor instances running. """ tor_pid = test.runner.get_runner().get_pid() tor_cmd = test.runner.get_runner().get_tor_command(True) self.assertEqual(tor_pid, stem.util.system.pid_by_name(tor_cmd)) self.assertEqual(None, stem.util.system.pid_by_name('blarg_and_stuff')) @require_single_tor_instance @test.require.command('pgrep') def test_pid_by_name_pgrep(self): """ Tests the pid_by_name function with a pgrep response. """ pgrep_prefix = stem.util.system.GET_PID_BY_NAME_PGREP % '' call_replacement = filter_system_call([pgrep_prefix]) with patch('stem.util.system.call') as call_mock: call_mock.side_effect = call_replacement tor_pid = test.runner.get_runner().get_pid() tor_cmd = test.runner.get_runner().get_tor_command(True) self.assertEqual(tor_pid, stem.util.system.pid_by_name(tor_cmd)) @require_single_tor_instance @test.require.command('pidof') def test_pid_by_name_pidof(self): """ Tests the pid_by_name function with a pidof response. """ pidof_prefix = stem.util.system.GET_PID_BY_NAME_PIDOF % '' call_replacement = filter_system_call([pidof_prefix]) with patch('stem.util.system.call') as call_mock: call_mock.side_effect = call_replacement tor_pid = test.runner.get_runner().get_pid() tor_cmd = test.runner.get_runner().get_tor_command() self.assertEqual(tor_pid, stem.util.system.pid_by_name(tor_cmd)) @require_linux @require_single_tor_instance @test.require.command('ps') def test_pid_by_name_ps_linux(self): """ Tests the pid_by_name function with the linux variant of ps. """ ps_prefix = stem.util.system.GET_PID_BY_NAME_PS_LINUX % '' call_replacement = filter_system_call([ps_prefix]) with patch('stem.util.system.call') as call_mock: call_mock.side_effect = call_replacement tor_pid = test.runner.get_runner().get_pid() tor_cmd = test.runner.get_runner().get_tor_command(True) self.assertEqual(tor_pid, stem.util.system.pid_by_name(tor_cmd)) @require_bsd @require_single_tor_instance @test.require.command('ps') def test_pid_by_name_ps_bsd(self): """ Tests the pid_by_name function with the bsd variant of ps. """ ps_prefix = stem.util.system.GET_PID_BY_NAME_PS_BSD call_replacement = filter_system_call([ps_prefix]) with patch('stem.util.system.call') as call_mock: call_mock.side_effect = call_replacement tor_pid = test.runner.get_runner().get_pid() tor_cmd = test.runner.get_runner().get_tor_command(True) self.assertEqual(tor_pid, stem.util.system.pid_by_name(tor_cmd)) @require_single_tor_instance @test.require.ptrace @test.require.command('lsof') def test_pid_by_name_lsof(self): """ Tests the pid_by_name function with a lsof response. """ lsof_prefix = stem.util.system.GET_PID_BY_NAME_LSOF % '' call_replacement = filter_system_call([lsof_prefix]) with patch('stem.util.system.call') as call_mock: call_mock.side_effect = call_replacement tor_cmd = test.runner.get_runner().get_tor_command(True) our_tor_pid = test.runner.get_runner().get_pid() all_tor_pids = stem.util.system.pid_by_name(tor_cmd, multiple = True) if len(all_tor_pids) == 1: self.assertEqual(our_tor_pid, all_tor_pids[0]) @require_single_tor_instance @test.require.command('tasklist') def test_pid_by_name_tasklist(self): """ Tests the pid_by_name function with a tasklist response. """ runner = test.runner.get_runner() self.assertEqual(runner.get_pid(), stem.util.system.pid_by_name(runner.get_tor_command(True))) @require_control_port @test.require.ptrace def test_pid_by_port(self): """ Checks general usage of the stem.util.system.pid_by_port function. """ if stem.util.system.is_windows(): self.skipTest('(unavailable on windows)') return elif stem.util.system.is_mac() or stem.util.system.is_gentoo(): self.skipTest('(resolvers unavailable)') return elif not (stem.util.system.is_available('netstat') or stem.util.system.is_available('sockstat') or stem.util.system.is_available('lsof')): self.skipTest('(connection resolvers unavailable)') return runner = test.runner.get_runner() tor_pid, tor_port = runner.get_pid(), test.runner.CONTROL_PORT self.assertEqual(tor_pid, stem.util.system.pid_by_port(tor_port)) self.assertEqual(None, stem.util.system.pid_by_port(99999)) @require_linux @require_control_port @test.require.ptrace @test.require.command('netstat') def test_pid_by_port_netstat(self): """ Tests the pid_by_port function with a netstat response. """ if stem.util.system.is_gentoo(): self.skipTest('(unavailable on gentoo)') return netstat_prefix = stem.util.system.GET_PID_BY_PORT_NETSTAT call_replacement = filter_system_call([netstat_prefix]) with patch('stem.util.system.call') as call_mock: call_mock.side_effect = call_replacement tor_pid = test.runner.get_runner().get_pid() self.assertEqual(tor_pid, stem.util.system.pid_by_port(test.runner.CONTROL_PORT)) @require_bsd @require_control_port @test.require.ptrace @test.require.command('sockstat') def test_pid_by_port_sockstat(self): """ Tests the pid_by_port function with a sockstat response. """ sockstat_prefix = stem.util.system.GET_PID_BY_PORT_SOCKSTAT % '' call_replacement = filter_system_call([sockstat_prefix]) with patch('stem.util.system.call') as call_mock: call_mock.side_effect = call_replacement tor_pid = test.runner.get_runner().get_pid() self.assertEqual(tor_pid, stem.util.system.pid_by_port(test.runner.CONTROL_PORT)) @require_control_port @test.require.ptrace @test.require.command('lsof') def test_pid_by_port_lsof(self): """ Tests the pid_by_port function with a lsof response. """ if stem.util.system.is_mac() or stem.util.system.is_gentoo(): self.skipTest('(resolvers unavailable)') return lsof_prefix = stem.util.system.GET_PID_BY_PORT_LSOF call_replacement = filter_system_call([lsof_prefix]) with patch('stem.util.system.call') as call_mock: call_mock.side_effect = call_replacement tor_pid = test.runner.get_runner().get_pid() self.assertEqual(tor_pid, stem.util.system.pid_by_port(test.runner.CONTROL_PORT)) def test_pid_by_open_file(self): """ Checks the stem.util.system.pid_by_open_file function. """ # check a directory that exists, but isn't claimed by any application tmpdir = tempfile.mkdtemp() self.assertEqual(None, stem.util.system.pid_by_open_file(tmpdir)) # check a directory that doesn't exist os.rmdir(tmpdir) self.assertEqual(None, stem.util.system.pid_by_open_file(tmpdir)) @require_path def test_pids_by_user(self): """ Checks the stem.util.system.pids_by_user function. """ # our own pid should be among the processes for our user pids = stem.util.system.pids_by_user(getpass.getuser()) self.assertTrue(os.getpid() in pids) @test.require.ptrace def test_cwd(self): """ Checks general usage of the stem.util.system.cwd function. """ if stem.util.system.is_windows(): self.skipTest('(unavailable on windows)') return runner = test.runner.get_runner() runner_pid, tor_cwd = runner.get_pid(), runner.get_tor_cwd() self.assertEqual(tor_cwd, stem.util.system.cwd(runner_pid)) self.assertEqual(None, stem.util.system.cwd(99999)) @test.require.ptrace @test.require.command('pwdx') def test_cwd_pwdx(self): """ Tests the pid_by_cwd function with a pwdx response. """ # filter the call function to only allow this command pwdx_prefix = stem.util.system.GET_CWD_PWDX % '' call_replacement = filter_system_call([pwdx_prefix]) with patch('stem.util.system.call') as call_mock: call_mock.side_effect = call_replacement runner = test.runner.get_runner() runner_pid, tor_cwd = runner.get_pid(), runner.get_tor_cwd() self.assertEqual(tor_cwd, stem.util.system.cwd(runner_pid)) @test.require.ptrace @test.require.command('lsof') def test_cwd_lsof(self): """ Tests the pid_by_cwd function with a lsof response. """ # filter the call function to only allow this command lsof_prefix = 'lsof -a -p ' call_replacement = filter_system_call([lsof_prefix]) with patch('stem.util.system.call') as call_mock: call_mock.side_effect = call_replacement runner = test.runner.get_runner() runner_pid, tor_cwd = runner.get_pid(), runner.get_tor_cwd() self.assertEqual(tor_cwd, stem.util.system.cwd(runner_pid)) def test_user_none(self): """ Tests the user function when the process doesn't exist. """ self.assertEqual(None, stem.util.system.user(None)) self.assertEqual(None, stem.util.system.user(-5)) self.assertEqual(None, stem.util.system.start_time(98765)) @test.require.proc def test_user_proc(self): """ Tests the user function with a proc response. """ call_replacement = filter_system_call(['ps ']) with patch('stem.util.system.call') as call_mock: call_mock.side_effect = call_replacement # we started our tor process so it should be running with the same user pid = test.runner.get_runner().get_pid() self.assertTrue(getpass.getuser(), stem.util.system.user(pid)) @test.require.command('ps') @patch('stem.util.proc.is_available', Mock(return_value = False)) def test_user_ps(self): """ Tests the user function with a ps response. """ pid = test.runner.get_runner().get_pid() self.assertTrue(getpass.getuser(), stem.util.system.user(pid)) def test_start_time_none(self): """ Tests the start_time function when the process doesn't exist. """ self.assertEqual(None, stem.util.system.start_time(None)) self.assertEqual(None, stem.util.system.start_time(-5)) self.assertEqual(None, stem.util.system.start_time(98765)) @test.require.proc def test_start_time_proc(self): """ Tests the start_time function with a proc response. """ call_replacement = filter_system_call(['ps ']) with patch('stem.util.system.call') as call_mock: call_mock.side_effect = call_replacement pid = test.runner.get_runner().get_pid() self.assertTrue(stem.util.system.start_time(pid) >= 0) @test.require.command('ps') @patch('stem.util.proc.is_available', Mock(return_value = False)) def test_start_time_ps(self): """ Tests the start_time function with a ps response. """ pid = test.runner.get_runner().get_pid() self.assertTrue(stem.util.system.start_time(pid) >= 0) def test_bsd_jail_id(self): """ Exercises the stem.util.system.bsd_jail_id function, running through the failure case (since I'm not on BSD I can't really test this function properly). """ self.assertEqual(0, stem.util.system.bsd_jail_id(99999)) def test_expand_path(self): """ Exercises the expand_path() method with actual runtime data. """ # Some of the following tests get confused when ran as root. For instance, # in my case... # # >>> os.path.expanduser('~') # '/home/atagar' # # >>> os.path.expanduser('~root') # '/root' if getpass.getuser() == 'root': self.skipTest('(running as root)') return self.assertEqual(os.getcwd(), stem.util.system.expand_path('.')) self.assertEqual(os.getcwd(), stem.util.system.expand_path('./')) self.assertEqual(os.path.join(os.getcwd(), 'foo'), stem.util.system.expand_path('./foo')) home_dir, username = os.path.expanduser('~'), getpass.getuser() self.assertEqual(home_dir, stem.util.system.expand_path('~')) self.assertEqual(home_dir, stem.util.system.expand_path('~/')) self.assertEqual(home_dir, stem.util.system.expand_path('~%s' % username)) self.assertEqual(os.path.join(home_dir, 'foo'), stem.util.system.expand_path('~%s/foo' % username)) def test_call_timeout(self): self.assertRaisesWith(stem.util.system.CallTimeoutError, "Process didn't finish after 0.0 seconds", stem.util.system.call, 'sleep 1', timeout = 0.001) def test_call_time_tracked(self): """ Check that time taken in the call() function is tracked by SYSTEM_CALL_TIME. """ initial = stem.util.system.SYSTEM_CALL_TIME stem.util.system.call('sleep 0.005') self.assertTrue(stem.util.system.SYSTEM_CALL_TIME - initial > 0.004) def test_set_process_name(self): """ Exercises the get_process_name() and set_process_name() methods. """ if stem.prereq.is_pypy(): self.skipTest('(unimplemented for pypy)') return initial_name = stem.util.system.get_process_name() self.assertTrue('run_tests.py' in initial_name) try: stem.util.system.set_process_name('stem_integ') self.assertEqual('stem_integ', stem.util.system.get_process_name()) finally: stem.util.system.set_process_name(initial_name) stem-1.7.1/test/integ/util/conf.py0000664000175000017500000000726413237375570017600 0ustar atagaratagar00000000000000""" Integration tests for the stem.util.conf class and functions. """ import os import unittest import stem.util.conf import test.runner CONF_HEADER = """# Demo configuration for integration tests to run against. Nothing to see here, # move along, move along. """ EXAMPLE_CONF = """ destination.ip 1.2.3.4 destination.port blarg startup.run export PATH=$PATH:~/bin startup.run alias l=ls """ MULTILINE_CONF = """ multiline.entry.simple |la de da |and a ho hum multiline.entry.leading_whitespace |la de da |and a ho hum multiline.entry.empty multiline.entry.squashed_top |la de da |and a ho hum multiline.entry.squashed_bottom |la de da |and a ho hum """ HERALD_POEM = """ What a beautiful morning, what a beautiful day. Why are those arrows", coming my way?!?""" def _get_test_config_path(): return test.runner.get_runner().get_test_dir('integ_test_cfg') def _make_config(contents): """ Writes a test configuration to disk, returning the path where it is located. """ test_config_path = _get_test_config_path() test_conf_file = open(test_config_path, 'w') test_conf_file.write(CONF_HEADER) test_conf_file.write(contents) test_conf_file.close() return test_config_path class TestConf(unittest.TestCase): def tearDown(self): # clears the config contents test_config = stem.util.conf.get_config('integ_testing') test_config.clear() test_config.clear_listeners() # cleans up test configurations we made test_config_path = _get_test_config_path() if os.path.exists(test_config_path): os.remove(test_config_path) def test_example(self): """ Checks that the pydoc example is correct. """ ssh_config = stem.util.conf.config_dict('integ_testing', { 'login.user': 'atagar', 'login.password': 'pepperjack_is_awesome!', 'destination.ip': '127.0.0.1', 'destination.port': 22, 'startup.run': [], }) test_config_path = _make_config(EXAMPLE_CONF) user_config = stem.util.conf.get_config('integ_testing') user_config.load(test_config_path) self.assertEqual('atagar', ssh_config['login.user']) self.assertEqual('pepperjack_is_awesome!', ssh_config['login.password']) self.assertEqual('1.2.3.4', ssh_config['destination.ip']) self.assertEqual(22, ssh_config['destination.port']) self.assertEqual(['export PATH=$PATH:~/bin', 'alias l=ls'], ssh_config['startup.run']) def test_load_multiline(self): """ Tests the load method with multi-line configuration files. """ test_config_path = _make_config(MULTILINE_CONF) test_config = stem.util.conf.get_config('integ_testing') test_config.load(test_config_path) for entry in ('simple', 'leading_whitespace', 'squashed_top', 'squashed_bottom'): self.assertEqual('la de da\nand a ho hum', test_config.get('multiline.entry.%s' % entry)) self.assertEqual('', test_config.get('multiline.entry.empty')) def test_save(self): """ Saves then reloads a configuration with several types of values. """ # makes a configuration with a variety of types test_config = stem.util.conf.get_config('integ_testing') test_config.set('single_value', "yup, I'm there") test_config.set('multiple_values', 'a', False) test_config.set('multiple_values', 'b', False) test_config.set('multiple_values', 'c', False) test_config.set('multiline_value', HERALD_POEM) test_config.save(_get_test_config_path()) test_config.clear() test_config.load() self.assertEqual("yup, I'm there", test_config.get_value('single_value')) self.assertEqual(['a', 'b', 'c'], test_config.get_value('multiple_values', multiple = True)) self.assertEqual(HERALD_POEM, test_config.get_value('multiline_value')) stem-1.7.1/test/integ/util/proc.py0000664000175000017500000000463413237375570017614 0ustar atagaratagar00000000000000""" Integration tests for stem.util.proc functions against the tor process that we're running. """ import os import unittest import test.require import test.runner from stem.util import proc class TestProc(unittest.TestCase): @test.require.proc @test.require.ptrace def test_cwd(self): """ Checks that stem.util.proc.cwd matches our tor instance's cwd. """ runner = test.runner.get_runner() runner_pid, tor_cwd = runner.get_pid(), runner.get_tor_cwd() self.assertEqual(tor_cwd, proc.cwd(runner_pid)) @test.require.proc def test_uid(self): """ Checks that stem.util.proc.uid matches our tor instance's uid. """ tor_pid = test.runner.get_runner().get_pid() self.assertEqual(os.geteuid(), proc.uid(tor_pid)) @test.require.proc def test_memory_usage(self): """ Checks that stem.util.proc.memory_usage looks somewhat reasonable. """ tor_pid = test.runner.get_runner().get_pid() res_size, vir_size = proc.memory_usage(tor_pid) # checks that they're larger than a kilobyte self.assertTrue(res_size > 1024) self.assertTrue(vir_size > 1024) @test.require.proc def test_stats(self): """ Checks that stem.util.proc.stats looks somewhat reasonable. """ tor_cmd = test.runner.get_runner().get_tor_command(True) tor_pid = test.runner.get_runner().get_pid() command, utime, stime, start_time = proc.stats(tor_pid, 'command', 'utime', 'stime', 'start time') self.assertEqual(tor_cmd, command) self.assertTrue(float(utime) > 0) self.assertTrue(float(stime) >= 0) self.assertTrue(float(start_time) > proc.system_start_time()) @test.require.proc @test.require.ptrace def test_connections(self): """ Checks for our control port in the stem.util.proc.connections output if we have one. """ runner = test.runner.get_runner() if test.runner.Torrc.PORT not in runner.get_options(): self.skiTestp('(no control port)') return elif not os.access('/proc/net/tcp', os.R_OK) or not os.access('/proc/net/udp', os.R_OK): self.skipTest('(proc lacks read permissions)') return # making a controller connection so that we have something to query for with runner.get_tor_socket(): tor_pid = test.runner.get_runner().get_pid() for conn in proc.connections(tor_pid): if ('127.0.0.1', test.runner.CONTROL_PORT) == conn[:2]: return self.fail() stem-1.7.1/test/integ/util/connection.py0000664000175000017500000000475613411002341020766 0ustar atagaratagar00000000000000""" Integration tests for stem.util.connection functions against the tor process that we're running. """ import unittest import stem.util.system import test.require import test.runner from stem.util.connection import RESOLVER_COMMAND, Resolver, get_connections, system_resolvers class TestConnection(unittest.TestCase): @test.require.ptrace def check_resolver(self, resolver): runner = test.runner.get_runner() if test.runner.Torrc.PORT not in runner.get_options(): self.skipTest('(no control port)') return elif resolver not in system_resolvers(): self.skipTest('(resolver unavailable on this platform)') return with runner.get_tor_socket(): connections = get_connections(resolver, process_pid = runner.get_pid()) for conn in connections: if conn.local_address == '127.0.0.1' and conn.local_port == test.runner.CONTROL_PORT: return resolver_command = RESOLVER_COMMAND[resolver].format(pid = runner.get_pid()) resolver_output = stem.util.system.call(resolver_command) self.fail('Unable to find our controller connection with %s (%s). Connections found were...\n\n%s\n\nCommand output was...\n\n%s' % (resolver, resolver_command, '\n'.join(map(str, connections)), resolver_output)) def test_connections_by_proc(self): self.check_resolver(Resolver.PROC) def test_connections_by_netstat(self): self.check_resolver(Resolver.NETSTAT) def test_connections_by_windows_netstat(self): self.check_resolver(Resolver.NETSTAT_WINDOWS) def test_connections_by_ss(self): try: self.check_resolver(Resolver.SS) except OSError: self.skipTest('(ticket 27479)') def test_connections_by_lsof(self): self.check_resolver(Resolver.LSOF) def test_connections_by_bsd_sockstat(self): self.check_resolver(Resolver.BSD_SOCKSTAT) def test_connections_by_bsd_procstat(self): self.check_resolver(Resolver.BSD_PROCSTAT) def test_connections_by_bsd_fstat(self): self.check_resolver(Resolver.BSD_FSTAT) def test_that_we_are_checking_all_resolvers(self): # Quick check to confirm that if we add a new Resolver, we include a test # for it here. recognized_resolvers = ( Resolver.PROC, Resolver.NETSTAT, Resolver.NETSTAT_WINDOWS, Resolver.SS, Resolver.LSOF, Resolver.SOCKSTAT, Resolver.BSD_SOCKSTAT, Resolver.BSD_PROCSTAT, Resolver.BSD_FSTAT, ) for resolver in Resolver: self.assertTrue(resolver in recognized_resolvers) stem-1.7.1/test/integ/util/__init__.py0000664000175000017500000000015013237375570020375 0ustar atagaratagar00000000000000""" Integration tests for stem.util.* contents. """ __all__ = ['conf', 'connection', 'proc', 'system'] stem-1.7.1/test/integ/installation.py0000664000175000017500000001302613341474573020367 0ustar atagaratagar00000000000000""" Tests installation of our library. """ import glob import os import shutil import sys import tarfile import time import unittest import stem import stem.prereq import stem.util.system import stem.util.test_tools import test from stem.util.test_tools import asynchronous BASE_INSTALL_PATH = '/tmp/stem_test' DIST_PATH = os.path.join(test.STEM_BASE, 'dist') PYTHON_EXE = sys.executable if sys.executable else 'python' INSTALL_MISMATCH_MSG = "Running 'python setup.py sdist' doesn't match our git contents in the following way. The manifest in our setup.py may need to be updated...\n\n" def _assert_has_all_files(path): """ Check that all the files in the stem directory are present in the installation. This is a very common gotcha since our setup.py requires us to remember to add new modules and non-source files. :raises: **AssertionError** files don't match our content """ expected, installed = set(), set() for root, dirnames, filenames in os.walk(os.path.join(test.STEM_BASE, 'stem')): for filename in filenames: file_format = filename.split('.')[-1] if file_format not in test.IGNORED_FILE_TYPES: expected.add(os.path.join(root, filename)[len(test.STEM_BASE) + 1:]) for root, dirnames, filenames in os.walk(path): for filename in filenames: if not filename.endswith('.pyc') and not filename.endswith('egg-info'): installed.add(os.path.join(root, filename)[len(path) + 1:]) missing = expected.difference(installed) extra = installed.difference(expected) if missing: raise AssertionError("The following files were expected to be in our installation but weren't. Maybe our setup.py needs to be updated?\n\n%s" % '\n'.join(missing)) elif extra: raise AssertionError("The following files weren't expected to be in our installation.\n\n%s" % '\n'.join(extra)) class TestInstallation(unittest.TestCase): @staticmethod def run_tests(args): test_install = stem.util.test_tools.ASYNC_TESTS['test.integ.installation.test_install'] test_install.run() stem.util.test_tools.ASYNC_TESTS['test.integ.installation.test_sdist'].run(test_install.pid()) @asynchronous def test_install(): """ Installs with 'python setup.py install' and checks we can use what we install. """ try: try: stem.util.system.call('%s setup.py install --prefix %s' % (PYTHON_EXE, BASE_INSTALL_PATH), timeout = 60, cwd = test.STEM_BASE) stem.util.system.call('%s setup.py clean --all' % PYTHON_EXE, timeout = 60, cwd = test.STEM_BASE) # tidy up the build directory if stem.prereq.is_pypy(): site_packages_paths = glob.glob('%s/site-packages' % BASE_INSTALL_PATH) else: site_packages_paths = glob.glob('%s/lib*/*/site-packages' % BASE_INSTALL_PATH) except Exception as exc: raise AssertionError("Unable to install with 'python setup.py install': %s" % exc) if len(site_packages_paths) != 1: raise AssertionError('We should only have a single site-packages directory, but instead had: %s' % site_packages_paths) install_path = site_packages_paths[0] version_output = stem.util.system.call([PYTHON_EXE, '-c', "import sys;sys.path.insert(0, '%s');import stem;print(stem.__version__)" % install_path])[0] if stem.__version__ != version_output: raise AssertionError('We expected the installed version to be %s but was %s' % (stem.__version__, version_output)) _assert_has_all_files(install_path) finally: if os.path.exists(BASE_INSTALL_PATH): shutil.rmtree(BASE_INSTALL_PATH) @asynchronous def test_sdist(dependency_pid): """ Creates a source distribution tarball with 'python setup.py sdist' and checks that it matches the content of our git repository. This primarily is meant to test that our MANIFEST.in is up to date. """ while stem.util.system.is_running(dependency_pid): time.sleep(0.1) # we need to run these tests serially git_dir = os.path.join(test.STEM_BASE, '.git') if not stem.util.system.is_available('git'): raise stem.util.test_tools.SkipTest('(git unavailable)') elif not os.path.exists(git_dir): raise stem.util.test_tools.SkipTest('(not a git checkout)') if os.path.exists(DIST_PATH): raise AssertionError("%s already exists, maybe you manually ran 'python setup.py sdist'?" % DIST_PATH) try: try: stem.util.system.call('%s setup.py sdist --dryrun' % PYTHON_EXE, timeout = 60, cwd = test.STEM_BASE) except Exception as exc: raise AssertionError("Unable to run 'python setup.py sdist': %s" % exc) git_contents = [line.split()[-1] for line in stem.util.system.call('git --git-dir=%s ls-tree --full-tree -r HEAD' % git_dir)] # tarball has a prefix 'stem-[verion]' directory so stipping that out dist_tar = tarfile.open(os.path.join(DIST_PATH, 'stem-dry-run-%s.tar.gz' % stem.__version__)) tar_contents = ['/'.join(info.name.split('/')[1:]) for info in dist_tar.getmembers() if info.isfile()] issues = [] for path in git_contents: if path not in tar_contents and path not in ['.gitignore', '.travis.yml']: issues.append(' * %s is missing from our release tarball' % path) for path in tar_contents: if path not in git_contents and path not in ['MANIFEST.in', 'PKG-INFO']: issues.append(" * %s isn't expected in our release tarball" % path) if issues: raise AssertionError(INSTALL_MISMATCH_MSG + '\n'.join(issues)) finally: if os.path.exists(DIST_PATH): shutil.rmtree(DIST_PATH) stem-1.7.1/test/runner.py0000664000175000017500000004627213353505515016074 0ustar atagaratagar00000000000000# Copyright 2011-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Runtime context for the integration tests. This is used both by the test runner to start and stop tor, and by the integration tests themselves for information about the tor test instance they're running against. :: RunnerStopped - Runner doesn't have an active tor instance TorInaccessable - Tor can't be queried for the information exercise_controller - basic sanity check that a controller connection can be used get_runner - Singleton for fetching our runtime context. Runner - Runtime context for our integration tests. |- start - prepares and starts a tor instance for our tests to run against |- stop - stops our tor instance and cleans up any temporary files |- is_running - checks if our tor test instance is running |- is_accessible - checks if our tor instance can be connected to |- get_options - custom torrc options used for our test instance |- get_test_dir - testing directory path |- get_torrc_path - path to our tor instance's torrc |- get_torrc_contents - contents of our tor instance's torrc |- get_auth_cookie_path - path for our authentication cookie if we have one |- get_tor_cwd - current working directory of our tor process |- get_chroot - provides the path of our emulated chroot if we have one |- get_pid - process id of our tor process |- get_tor_socket - provides a socket to our test instance |- get_tor_controller - provides a controller for our test instance +- get_tor_command - provides the command used to start tor """ import logging import os import shutil import stat import tempfile import threading import time import uuid import stem.connection import stem.prereq import stem.process import stem.socket import stem.util.conf import stem.util.enum import test from test.output import println, STATUS, ERROR, SUBSTATUS, NO_NL CONFIG = stem.util.conf.config_dict('test', { 'integ.test_directory': './test/data', 'integ.log': './test/data/log', 'target.torrc': {}, }) SOCKS_PORT = 1112 ORPORT = 1113 BASE_TORRC = """# configuration for stem integration tests DataDirectory %%s SocksPort %i ORPort %i ExitRelay 0 PublishServerDescriptor 0 AssumeReachable 1 DownloadExtraInfo 1 Log notice stdout Log notice file %%s/tor_log """ % (SOCKS_PORT, ORPORT) # singleton Runner instance INTEG_RUNNER = None # control authentication options and attributes CONTROL_PASSWORD = 'pw' CONTROL_PORT = 1111 CONTROL_SOCKET_PATH = os.path.join(tempfile.gettempdir(), str(uuid.uuid4()), 'socket') Torrc = stem.util.enum.Enum( ('PORT', 'ControlPort %i' % CONTROL_PORT), ('COOKIE', 'CookieAuthentication 1'), ('PASSWORD', 'HashedControlPassword 16:8C423A41EF4A542C6078985270AE28A4E04D056FB63F9F201505DB8E06'), ('SOCKET', 'ControlSocket %s' % CONTROL_SOCKET_PATH), ('PTRACE', 'DisableDebuggerAttachment 0'), ) class RunnerStopped(Exception): "Raised when we try to use a Runner that doesn't have an active tor instance" class TorInaccessable(Exception): 'Raised when information is needed from tor but the instance we have is inaccessible' def exercise_controller(test_case, controller): """ Checks that we can now use the socket by issuing a 'GETINFO config-file' query. Controller can be either a :class:`stem.socket.ControlSocket` or :class:`stem.control.BaseController`. :param unittest.TestCase test_case: test being ran :param controller: tor controller connection to be authenticated """ runner = get_runner() torrc_path = runner.get_torrc_path() if isinstance(controller, stem.socket.ControlSocket): controller.send('GETINFO config-file') config_file_response = controller.recv() else: config_file_response = controller.msg('GETINFO config-file') test_case.assertEqual('config-file=%s\nOK' % torrc_path, str(config_file_response)) def get_runner(): """ Singleton for the runtime context of integration tests. :returns: :class:`test.runner.Runner` with context for our integration tests """ global INTEG_RUNNER if not INTEG_RUNNER: INTEG_RUNNER = Runner() return INTEG_RUNNER class _MockChrootFile(object): """ Wrapper around a file object that strips given content from readline() responses. This is used to simulate a chroot setup by removing the prefix directory from the paths we report. """ def __init__(self, wrapped_file, strip_text): self.wrapped_file = wrapped_file self.strip_text = strip_text def readline(self): return self.wrapped_file.readline().replace(self.strip_text, '') class Runner(object): def __init__(self): self.attribute_targets = [] self._runner_lock = threading.RLock() # runtime attributes, set by the start method self._test_dir = '' self._tor_cmd = None self._tor_cwd = '' self._torrc_contents = '' self._custom_opts = [] self._tor_process = None self._chroot_path = None # set if we monkey patch stem.socket.recv_message() self._original_recv_message = None # The first controller to attach takes ownership so tor will promptly # terminate if the tests do. As such we need to ensure that first # connection is our runner's. self._owner_controller = None def start(self, config_target, attribute_targets, tor_cmd): """ Makes temporary testing resources and starts tor, blocking until it completes. :param str config_target: **Target** for this test run's torrc settings :param list attribute_targets: **Targets** for our non-configuration attributes :param str tor_cmd: command to start tor with :raises: OSError if unable to run test preparations or start tor """ with self._runner_lock: self.attribute_targets = attribute_targets # if we're holding on to a tor process (running or not) then clean up after # it so we can start a fresh instance if self._tor_process: self.stop() println('Setting up a test instance...', STATUS) # if 'test_directory' is unset then we make a new data directory in /tmp # and clean it up when we're done config_test_dir = CONFIG['integ.test_directory'] if config_test_dir: self._test_dir = stem.util.system.expand_path(config_test_dir, test.STEM_BASE) else: self._test_dir = tempfile.mktemp('-stem-integ') original_cwd, data_dir_path = os.getcwd(), self._test_dir self._tor_cmd = stem.util.system.expand_path(tor_cmd) if os.path.sep in tor_cmd else tor_cmd if test.Target.RELATIVE in self.attribute_targets: tor_cwd = os.path.dirname(self._test_dir) if not os.path.exists(tor_cwd): os.makedirs(tor_cwd) os.chdir(tor_cwd) data_dir_path = './%s' % os.path.basename(self._test_dir) config_csv = CONFIG['target.torrc'].get(config_target) extra_torrc_opts = [] if config_csv: for opt in config_csv.split(','): opt = opt.strip() if opt in Torrc.keys(): extra_torrc_opts.append(Torrc[opt]) else: raise ValueError("'%s' isn't a test.runner.Torrc enumeration" % opt) self._custom_opts = extra_torrc_opts self._torrc_contents = BASE_TORRC % (data_dir_path, data_dir_path) if extra_torrc_opts: self._torrc_contents += '\n'.join(extra_torrc_opts) + '\n' try: self._tor_cwd = os.getcwd() self._run_setup() self._start_tor(self._tor_cmd) # strip the testing directory from recv_message responses if we're # simulating a chroot setup if test.Target.CHROOT in self.attribute_targets and not self._original_recv_message: # TODO: when we have a function for telling stem the chroot we'll # need to set that too self._original_recv_message = stem.socket.recv_message self._chroot_path = data_dir_path def _chroot_recv_message(control_file): return self._original_recv_message(_MockChrootFile(control_file, data_dir_path)) stem.socket.recv_message = _chroot_recv_message if self.is_accessible(): self._owner_controller = self.get_tor_controller(True) if test.Target.RELATIVE in self.attribute_targets: os.chdir(original_cwd) # revert our cwd back to normal except OSError as exc: raise exc def stop(self): """ Stops our tor test instance and cleans up any temporary resources. """ with self._runner_lock: println('Shutting down tor... ', STATUS, NO_NL) if self._owner_controller: self._owner_controller.close() self._owner_controller = None if self._tor_process: # if the tor process has stopped on its own then the following raises # an OSError ([Errno 3] No such process) try: self._tor_process.kill() except OSError: pass self._tor_process.stdout.close() self._tor_process.stderr.close() self._tor_process.wait() # blocks until the process is done # if we've made a temporary data directory then clean it up if self._test_dir and CONFIG['integ.test_directory'] == '': shutil.rmtree(self._test_dir, ignore_errors = True) # reverts any mocking of stem.socket.recv_message if self._original_recv_message: stem.socket.recv_message = self._original_recv_message self._original_recv_message = None # clean up our socket directory if we made one socket_dir = os.path.dirname(CONTROL_SOCKET_PATH) if os.path.exists(socket_dir): shutil.rmtree(socket_dir, ignore_errors = True) self._test_dir = '' self._tor_cmd = None self._tor_cwd = '' self._torrc_contents = '' self._custom_opts = [] self._tor_process = None println('done', STATUS) def is_running(self): """ Checks if we're running a tor test instance and that it's alive. :returns: True if we have a running tor test instance, False otherwise """ with self._runner_lock: # Check for an unexpected shutdown by calling subprocess.Popen.poll(), # which returns the exit code or None if we're still running. if self._tor_process and self._tor_process.poll() is not None: # clean up the temporary resources and note the unexpected shutdown self.stop() println('tor shut down unexpectedly', ERROR) return bool(self._tor_process) def is_accessible(self): """ Checks if our tor instance has a method of being connected to or not. :returns: True if tor has a control socket or port, False otherwise """ return Torrc.PORT in self._custom_opts or Torrc.SOCKET in self._custom_opts def get_options(self): """ Provides the custom torrc options our tor instance is running with. :returns: list of Torrc enumerations being used by our test instance """ return self._custom_opts def get_test_dir(self, resource = None): """ Provides the absolute path for our testing directory or a file within it. :param str resource: file within our test directory to provide the path for :returns: str with our test directory's absolute path or that of a file within it :raises: :class:`test.runner.RunnerStopped` if we aren't running """ if resource: return os.path.join(self._get('_test_dir'), resource) else: return self._get('_test_dir') def get_torrc_path(self, ignore_chroot = False): """ Provides the absolute path for where our testing torrc resides. :param bool ignore_chroot: provides the real path, rather than the one that tor expects if True :returns: str with our torrc path :raises: RunnerStopped if we aren't running """ test_dir = self._get('_test_dir') torrc_path = os.path.join(test_dir, 'torrc') if not ignore_chroot and self._chroot_path and torrc_path.startswith(self._chroot_path): torrc_path = torrc_path[len(self._chroot_path):] return torrc_path def get_torrc_contents(self): """ Provides the contents of our torrc. :returns: str with the contents of our torrc, lines are newline separated :raises: :class:`test.runner.RunnerStopped` if we aren't running """ return self._get('_torrc_contents') def get_auth_cookie_path(self): """ Provides the absolute path for our authentication cookie if we have one. If running with an emulated chroot this is uneffected, still providing the real path. :returns: str with our auth cookie path :raises: :class:`test.runner.RunnerStopped` if we aren't running """ test_dir = self._get('_test_dir') return os.path.join(test_dir, 'control_auth_cookie') def get_tor_cwd(self): """ Provides the current working directory of our tor process. """ return self._get('_tor_cwd') def get_chroot(self): """ Provides the path we're using to emulate a chroot environment. This is None if we aren't emulating a chroot setup. :returns: str with the path of our emulated chroot """ return self._chroot_path def get_pid(self): """ Provides the process id of the tor process. :returns: int pid for the tor process :raises: :class:`test.runner.RunnerStopped` if we aren't running """ tor_process = self._get('_tor_process') return tor_process.pid def get_tor_socket(self, authenticate = True): """ Provides a socket connected to our tor test instance. :param bool authenticate: if True then the socket is authenticated :returns: :class:`stem.socket.ControlSocket` connected with our testing instance :raises: :class:`test.runner.TorInaccessable` if tor can't be connected to """ if Torrc.PORT in self._custom_opts: control_socket = stem.socket.ControlPort(port = CONTROL_PORT) elif Torrc.SOCKET in self._custom_opts: control_socket = stem.socket.ControlSocketFile(CONTROL_SOCKET_PATH) else: raise TorInaccessable('Unable to connect to tor') if authenticate: stem.connection.authenticate(control_socket, CONTROL_PASSWORD, self.get_chroot()) return control_socket def get_tor_controller(self, authenticate = True): """ Provides a controller connected to our tor test instance. :param bool authenticate: if True then the socket is authenticated :returns: :class:`stem.socket.Controller` connected with our testing instance :raises: :class: `test.runner.TorInaccessable` if tor can't be connected to """ control_socket = self.get_tor_socket(False) controller = stem.control.Controller(control_socket) if authenticate: controller.authenticate(password = CONTROL_PASSWORD, chroot_path = self.get_chroot()) return controller def get_tor_command(self, base_cmd = False): """ Provides the command used to run our tor instance. :param bool base_cmd: provides just the command name if true rather than the full '--tor path' argument """ return os.path.basename(self._get('_tor_cmd')) if base_cmd else self._get('_tor_cmd') def assert_tor_is_running(self): """ Checks if our tor process is running. If not, this prints an error and provides **False**. """ process_status = self._tor_process.poll() # None if running if process_status is None: return True else: process_output = (self._tor_process.stdout.read() + '\n\n' + self._tor_process.stderr.read()).strip() println('\n%s\nOur tor process ended prematurely with exit status %s\n%s\n\n%s' % ('=' * 60, process_status, '=' * 60, process_output), ERROR) return False def _get(self, attr): """ Fetches one of our attributes in a thread safe manner, raising if we aren't running. :param str attr: class variable that we want to fetch :returns: value of the fetched variable :returns: :class:`test.runner.RunnerStopped` if we aren't running """ with self._runner_lock: if self.is_running(): return self.__dict__[attr] else: raise RunnerStopped() def _run_setup(self): """ Makes a temporary runtime resources of our integration test instance. :raises: OSError if unsuccessful """ # makes a temporary data directory if needed try: println(' making test directory (%s)... ' % self._test_dir, STATUS, NO_NL) if os.path.exists(self._test_dir): println('skipped', STATUS) else: os.makedirs(self._test_dir) println('done', STATUS) except OSError as exc: println('failed (%s)' % exc, ERROR) raise exc # Tor checks during startup that the directory a control socket resides in # is only accessible by the tor user (and refuses to finish starting if it # isn't). if Torrc.SOCKET in self._custom_opts: try: socket_dir = os.path.dirname(CONTROL_SOCKET_PATH) println(' making control socket directory (%s)... ' % socket_dir, STATUS, NO_NL) if os.path.exists(socket_dir) and stat.S_IMODE(os.stat(socket_dir).st_mode) == 0o700: println('skipped', STATUS) else: if not os.path.exists(socket_dir): os.makedirs(socket_dir) os.chmod(socket_dir, 0o700) println('done', STATUS) except OSError as exc: println('failed (%s)' % exc, ERROR) raise exc # configures logging logging_path = CONFIG['integ.log'] if logging_path: logging_path = stem.util.system.expand_path(logging_path, test.STEM_BASE) println(' configuring logger (%s)... ' % logging_path, STATUS, NO_NL) # delete the old log if os.path.exists(logging_path): os.remove(logging_path) logging.basicConfig( filename = logging_path, level = logging.DEBUG, format = '%(asctime)s [%(levelname)s] %(message)s', datefmt = '%D %H:%M:%S', ) println('done', STATUS) else: println(' configuring logger... skipped', STATUS) # writes our testing torrc torrc_dst = os.path.join(self._test_dir, 'torrc') try: println(' writing torrc (%s)... ' % torrc_dst, STATUS, NO_NL) torrc_file = open(torrc_dst, 'w') torrc_file.write(self._torrc_contents) torrc_file.close() println('done', STATUS) for line in self._torrc_contents.strip().splitlines(): println(' %s' % line.strip(), SUBSTATUS) println() except Exception as exc: println('failed (%s)\n' % exc, ERROR) raise OSError(exc) def _start_tor(self, tor_cmd): """ Initializes a tor process. This blocks until initialization completes or we error out. :param str tor_cmd: command to start tor with :raises: OSError if we either fail to create the tor process or reached a timeout without success """ println('Starting %s...\n' % tor_cmd, STATUS) start_time = time.time() try: self._tor_process = stem.process.launch_tor( tor_cmd = tor_cmd, torrc_path = os.path.join(self._test_dir, 'torrc'), completion_percent = 100 if test.Target.ONLINE in self.attribute_targets else 0, init_msg_handler = lambda line: println(' %s' % line, SUBSTATUS), take_ownership = True, close_output = False, ) runtime = time.time() - start_time println(' done (%i seconds)\n' % runtime, STATUS) except OSError as exc: println(' failed to start tor: %s\n' % exc, ERROR) raise exc stem-1.7.1/test/output.py0000664000175000017500000001642313341034346016112 0ustar atagaratagar00000000000000# Copyright 2011-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Variety of filters for the python unit testing output, which can be chained together for improved readability. """ import re import sys import stem.util.enum import stem.util.test_tools from stem.util import system, term COLOR_SUPPORT = sys.stdout.isatty() and not system.is_windows() DIVIDER = '=' * 70 HEADER_ATTR = (term.Color.CYAN, term.Attr.BOLD) CATEGORY_ATTR = (term.Color.GREEN, term.Attr.BOLD) NO_NL = 'no newline' STDERR = 'stderr' # formatting for various categories of messages STATUS = (term.Color.BLUE, term.Attr.BOLD) SUBSTATUS = (term.Color.BLUE, ) SUCCESS = (term.Color.GREEN, term.Attr.BOLD) ERROR = (term.Color.RED, term.Attr.BOLD) LineType = stem.util.enum.Enum('OK', 'FAIL', 'ERROR', 'SKIPPED', 'CONTENT') LINE_ENDINGS = { ' ... ok': LineType.OK, ' ... FAIL': LineType.FAIL, ' ... ERROR': LineType.ERROR, ' ... skipped': LineType.SKIPPED, } LINE_ATTR = { LineType.OK: (term.Color.GREEN,), LineType.FAIL: (term.Color.RED, term.Attr.BOLD), LineType.ERROR: (term.Color.RED, term.Attr.BOLD), LineType.SKIPPED: (term.Color.BLUE,), LineType.CONTENT: (term.Color.CYAN,), } SUPPRESS_STDOUT = False # prevent anything from being printed to stdout def println(msg = '', *attr): if SUPPRESS_STDOUT and STDERR not in attr: return attr = _flatten(attr) no_newline = False stream = sys.stderr if STDERR in attr else sys.stdout if NO_NL in attr: no_newline = True attr.remove(NO_NL) if STDERR in attr: attr.remove(STDERR) if COLOR_SUPPORT and attr: msg = term.format(msg, *attr) if not no_newline: msg += '\n' stream.write(msg) stream.flush() def print_divider(msg, is_header = False): attr = HEADER_ATTR if is_header else CATEGORY_ATTR println('%s\n%s\n%s\n' % (DIVIDER, msg.center(70), DIVIDER), *attr) def print_logging(logging_buffer): if SUPPRESS_STDOUT: return if not logging_buffer.is_empty(): for entry in logging_buffer: println(entry.replace('\n', '\n '), term.Color.MAGENTA) print('') def apply_filters(testing_output, *filters): """ Gets the tests results, possibly processed through a series of filters. The filters are applied in order, each getting the output of the previous. A filter's input arguments should be the line's (type, content) and the output is either a string with the new content or None if the line should be omitted. :param str testing_output: output from the unit testing :param list filters: functors to be applied to each line of the results :returns: str with the processed test results """ results = [] for line in testing_output.splitlines(): # determine the type of the line line_type = LineType.CONTENT for ending in LINE_ENDINGS: if ending in line: line_type = LINE_ENDINGS[ending] break for result_filter in filters: line = result_filter(line_type, line) if line is None: break if line is not None: results.append(line) return '\n'.join(results) + '\n' def colorize(line_type, line_content): """ Applies escape sequences so each line is colored according to its type. """ if COLOR_SUPPORT: line_content = term.format(line_content, *LINE_ATTR[line_type]) return line_content def strip_module(line_type, line_content): """ Removes the module name from testing output. This information tends to be repetitive, and redundant with the headers. """ m = re.match('.*( \(test\..*?\)).*', line_content) if m: line_content = line_content.replace(m.groups()[0], '', 1) return line_content def runtimes(line_type, line_content): """ Provides test runtimes if showing verbose results. """ m = re.search('(test\.[^)]*)', line_content) if m and line_type == LineType.OK: test = '%s.%s' % (m.group(0), line_content.split()[0]) runtime = stem.util.test_tools.test_runtimes().get(test) if runtime is None: pass if runtime >= 1.0: line_content = '%s (%0.2fs)' % (line_content, runtime) else: line_content = '%s (%i ms)' % (line_content, runtime * 1000) return line_content def align_results(line_type, line_content): """ Strips the normal test results, and adds a right aligned variant instead with a bold attribute. """ if line_type == LineType.CONTENT: return line_content # strip our current ending for ending in LINE_ENDINGS: if LINE_ENDINGS[ending] == line_type: line_content = line_content.replace(ending, '', 1) break # right align runtimes if line_content.endswith('s)'): div = line_content.rfind(' (') line_content = '%-53s%6s ' % (line_content[:div], line_content[div + 2:-1]) # skipped tests have extra single quotes around the reason if line_type == LineType.SKIPPED: line_content = line_content.replace("'(", "(", 1).replace(")'", ")", 1) if line_type == LineType.OK: new_ending = 'SUCCESS' elif line_type in (LineType.FAIL, LineType.ERROR): new_ending = 'FAILURE' elif line_type == LineType.SKIPPED: new_ending = 'SKIPPED' else: assert False, 'Unexpected line type: %s' % line_type return line_content if COLOR_SUPPORT: return '%-61s[%s]' % (line_content, term.format(new_ending, term.Attr.BOLD)) else: return '%-61s[%s]' % (line_content, term.format(new_ending)) class ErrorTracker(object): """ Stores any failure or error results we've encountered. """ def __init__(self): self._errors = [] self._error_modules = set() self._category = None self._error_noted = False def register_error(self): """ If called then has_errors_occured() will report that an error has occured, even if we haven't encountered an error message in the tests. """ self._error_noted = True def set_category(self, category): """ Optional label that will be presented with testing failures until another category is specified. If set to None then no category labels are included. For tests with a lot of output this is intended to help narrow the haystack in which the user needs to look for failures. In practice this is mostly used to specify the integ target we're running under. :param str category: category to label errors as being under """ self._category = category def has_errors_occured(self): return self._error_noted or bool(self._errors) def get_filter(self): def _error_tracker(line_type, line_content): if line_type in (LineType.FAIL, LineType.ERROR): if self._category: self._errors.append('[%s] %s' % (self._category, line_content)) else: self._errors.append(line_content) module_match = re.match('.*\((test\.\S+)\.\S+\).*', line_content) if module_match: self._error_modules.add(module_match.group(1)) return line_content return _error_tracker def get_modules(self): return self._error_modules def __iter__(self): for error_line in self._errors: yield error_line def _flatten(seq): # Flattens nested collections into a single list. For instance... # # >>> _flatten([1, [2, 3], 4]) # [1, 2, 3, 4] result = [] for item in seq: if (isinstance(item, (tuple, list))): result.extend(_flatten(item)) else: result.append(item) return result stem-1.7.1/test/network.py0000664000175000017500000001701113341034346016235 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Helper functions and classes to support tests which need to connect through the tor network. :: ProxyError - Base error for proxy issues. +- SocksError - Reports problems returned by the SOCKS proxy. Socks - Communicate through a SOCKS5 proxy with a socket interface """ import socket import struct import stem import stem.util.connection import stem.util.str_tools # Store a reference to the original class so we can find it after # monkey patching. _socket_socket = socket.socket SOCKS5_NOAUTH_GREETING = (0x05, 0x01, 0x00) SOCKS5_NOAUTH_RESPONSE = (0x05, 0x00) SOCKS5_CONN_BY_IPV4 = (0x05, 0x01, 0x00, 0x01) SOCKS5_CONN_BY_NAME = (0x05, 0x01, 0x00, 0x03) ERROR_MSG = { 0x5a: 'SOCKS4A request granted', 0x5b: 'SOCKS4A request rejected or failed', 0x5c: 'SOCKS4A request failed because client is not running identd (or not reachable from the server)', 0x5d: "SOCKS4A request failed because client's identd could not confirm the user ID string in the request", } IP_REQUEST = """GET /ip HTTP/1.0 Host: ifconfig.me Accept-Encoding: identity """ class ProxyError(Exception): 'Base error for proxy issues.' class SocksError(ProxyError): """ Exception raised for any problems returned by the SOCKS proxy. :var int code: error code returned by the SOCKS proxy """ # Error messages copied from http://en.wikipedia.org/wiki/SOCKS, # retrieved 2012-12-15 17:09:21. _ERROR_MESSAGE = { 0x01: 'general failure', 0x02: 'connection not allowed by ruleset', 0x03: 'network unreachable', 0x04: 'host unreachable', 0x05: 'connection refused by destination host', 0x06: 'TTL expired', 0x07: 'command not supported / protocol error', 0x08: 'address type not supported', } def __init__(self, code): self.code = code def __str__(self): code = 0x01 if self.code in self._ERROR_MESSAGE: code = self.code return '[%s] %s' % (code, self._ERROR_MESSAGE[code]) class Socks(_socket_socket): """ A **socket.socket**-like interface through a SOCKS5 proxy connection. Tor does not support proxy authentication, so neither does this class. This class supports the context manager protocol. When used this way, the socket will automatically close when leaving the context. An example: :: from test.network import Socks with Socks(('127.0.0.1', 9050)) as socks: socks.settimeout(2) socks.connect(('www.torproject.org', 443)) """ def __init__(self, proxy_addr, family = socket.AF_INET, type_ = socket.SOCK_STREAM, proto = 0, _sock = None): """ Creates a SOCKS5-aware socket which will route connections through the proxy_addr SOCKS5 proxy. Currently, only IPv4 TCP connections are supported, so the defaults for family and type_ are your best option. :param tuple proxy_addr: address of the SOCKS5 proxy, for IPv4 this contains (host, port) :param int family: address family of the socket :param int type_: address type of the socket (see **socket.socket** for more information about family and type_) :returns: :class:`~test.network.Socks` """ _socket_socket.__init__(self, family, type_, proto, _sock) self._proxy_addr = proxy_addr def __enter__(self, *args, **kwargs): return self def __exit__(self, exit_type, value, traceback): self.close() return False def _recvall(self, expected_size): """ Returns expected number bytes from the socket, or dies trying. :param int expected_size: number of bytes to return :returns: * **str** in Python 2 (bytes is str) * **bytes** in Python 3 :raises: * :class:`socket.error` for socket errors * :class:`test.SocksError` if the received data was more that expected """ while True: response = self.recv(expected_size * 2) if len(response) == 0: raise socket.error('socket closed unexpectedly?') elif len(response) == expected_size: return response elif len(response) > expected_size: raise SocksError(0x01) def _ints_to_bytes(self, integers): """ Returns a byte string converted from integers. :param list integers: list of ints to convert :returns: * **str** in Python 2 (bytes is str) * **bytes** in Python 3 """ if bytes is str: bytes_ = ''.join([chr(x) for x in integers]) # Python 2 else: bytes_ = bytes(integers) # Python 3 return bytes_ def _bytes_to_ints(self, bytes_): """ Returns a tuple of integers converted from a string (Python 2) or bytes (Python 3). :param str,bytes bytes_: byte string to convert :returns: **list** of ints """ try: integers = [ord(x) for x in bytes_] # Python 2 except TypeError: integers = [x for x in bytes_] # Python 3 return tuple(integers) def _pack_string(self, string_): """ Returns a packed string for sending over a socket. :param str string_: string to convert :returns: * **str** in Python 2 (bytes is str) * **bytes** in Python 3 """ try: return struct.pack('>%ss' % len(string_), string_) except struct.error: # Python 3: encode str to bytes return struct.pack('>%ss' % len(string_), string_.encode()) def connect(self, address): """ Establishes a connection to address through the SOCKS5 proxy. :param tuple address: target address, for IPv4 this contains (host, port) :raises: :class:`test.SocksError` for any errors """ _socket_socket.connect(self, (self._proxy_addr[0], self._proxy_addr[1])) # ask for non-authenticated connection self.sendall(self._ints_to_bytes(SOCKS5_NOAUTH_GREETING)) response = self._bytes_to_ints(self._recvall(2)) if response != SOCKS5_NOAUTH_RESPONSE: raise SocksError(0x01) if stem.util.connection.is_valid_ipv4_address(address[0]): header = self._ints_to_bytes(SOCKS5_CONN_BY_IPV4) header = header + socket.inet_aton(address[0]) else: # As a last gasp, try connecting by name header = self._ints_to_bytes(SOCKS5_CONN_BY_NAME) header = header + self._ints_to_bytes([len(address[0])]) header = header + self._pack_string(address[0]) header = header + struct.pack('>H', address[1]) self.sendall(header) response = self._bytes_to_ints(self._recvall(10)) # check the status byte if response[1] != 0x00: raise SocksError(response[1]) def connect_ex(self, address): """ Not Implemented. """ raise NotImplementedError def negotiate_socks(sock, host, port): """ Negotiate with a socks4a server. Closes the socket and raises an exception on failure. :param socket sock: socket connected to socks4a server :param str host: hostname/IP to connect to :param int port: port to connect to :raises: :class:`stem.ProtocolError` if the socks server doesn't grant our request :returns: a list with the IP address and the port that the proxy connected to """ # SOCKS4a request here - http://en.wikipedia.org/wiki/SOCKS#Protocol request = b'\x04\x01' + struct.pack('!H', port) + b'\x00\x00\x00\x01' + b'\x00' + stem.util.str_tools._to_bytes(host) + b'\x00' sock.sendall(request) response = sock.recv(8) if len(response) != 8 or response[0:2] != b'\x00\x5a': sock.close() raise stem.ProtocolError(ERROR_MSG.get(response[1], 'SOCKS server returned unrecognized error code')) return [socket.inet_ntoa(response[4:]), struct.unpack('!H', response[2:4])[0]] stem-1.7.1/test/__init__.py0000664000175000017500000001032013411002341016263 0ustar atagaratagar00000000000000# Copyright 2011-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Unit and integration tests for the stem library. Helpers include... :: get_new_capabilities - missing capabilities found while testing register_new_capability - note that tor feature stem lacks get_all_combinations - provides all combinations of attributes tor_version - provides the version of tor we're testing against """ import collections import itertools import os import stem.util.enum import stem.version __all__ = [ 'network', 'output', 'prompt', 'runner', ] # Integration targets fall into two categories: # # * Run Targets (like RUN_COOKIE and RUN_PTRACE) which customize our torrc. # We do an integration test run for each run target we get. # # * Attribute Target (like CHROOT and ONLINE) which indicates # non-configuration changes to your test runs. These are applied to all # integration runs that we perform. Target = stem.util.enum.UppercaseEnum( 'ONLINE', 'RELATIVE', 'CHROOT', 'RUN_NONE', 'RUN_OPEN', 'RUN_PASSWORD', 'RUN_COOKIE', 'RUN_MULTIPLE', 'RUN_SOCKET', 'RUN_SCOOKIE', 'RUN_PTRACE', 'RUN_ALL', ) AsyncTestArgs = collections.namedtuple('AsyncTestArgs', ['test_dir', 'tor_cmd']) TOR_VERSION = None # We make some paths relative to stem's base directory (the one above us) # rather than the process' cwd. This doesn't end with a slash. STEM_BASE = os.path.sep.join(__file__.split(os.path.sep)[:-2]) # Store new capabilities (events, descriptor entries, etc.) NEW_CAPABILITIES = [] NEW_CAPABILITIES_SUPPRESSION_TOKENS = set() # File extensions of contents that should be ignored. IGNORED_FILE_TYPES = [] GIT_IGNORE_PATH = os.path.join(STEM_BASE, '.gitignore') if os.path.exists(GIT_IGNORE_PATH): with open(GIT_IGNORE_PATH) as ignore_file: for line in ignore_file: if line.startswith('*.'): IGNORED_FILE_TYPES.append(line[2:].strip()) if os.path.exists(os.path.join(STEM_BASE, '.travis.yml')): IGNORED_FILE_TYPES.append('.travis.yml') def get_new_capabilities(): """ Provides a list of capabilities tor supports but stem doesn't, as discovered while running our tests. :returns: **list** of (type, message) tuples for the capabilities """ return NEW_CAPABILITIES def register_new_capability(capability_type, msg, suppression_token = None): """ Register new capability found during the tests. :param str capability_type: type of capability this is :param str msg: description of what we found :param str suppression_token: skip registration if this token's already been provided """ if suppression_token not in NEW_CAPABILITIES_SUPPRESSION_TOKENS: NEW_CAPABILITIES.append((capability_type, msg)) if suppression_token: NEW_CAPABILITIES_SUPPRESSION_TOKENS.add(suppression_token) def get_all_combinations(attr, include_empty = False): """ Provides an iterator for all combinations of a set of attributes. For instance... :: >>> list(test.get_all_combinations(['a', 'b', 'c'])) [('a',), ('b',), ('c',), ('a', 'b'), ('a', 'c'), ('b', 'c'), ('a', 'b', 'c')] :param list attr: attributes to provide combinations for :param bool include_empty: includes an entry with zero items if True :returns: iterator for all combinations """ # Makes an itertools.product() call for 'i' copies of attr... # # * itertools.product(attr) => all one-element combinations # * itertools.product(attr, attr) => all two-element combinations # * ... etc if include_empty: yield () seen = set() for index in range(1, len(attr) + 1): product_arg = [attr for _ in range(index)] for item in itertools.product(*product_arg): # deduplicate, sort, and only provide if we haven't seen it yet item = tuple(sorted(set(item))) if item not in seen: seen.add(item) yield item def tor_version(tor_path = None): """ Provides the version of tor we're testing against. :param str tor_path: location of tor executable to cehck the version of :returns: :class:`~stem.version.Version` of tor invoked by our integration tests """ global TOR_VERSION if TOR_VERSION is None or tor_path: TOR_VERSION = stem.version.get_system_tor_version(tor_path) return TOR_VERSION stem-1.7.1/test/settings.cfg0000664000175000017500000003233013411002341016500 0ustar atagaratagar00000000000000# Testing Configuration # # The following contains customizable configuration information for stem's # testing framework. # # integ.test_directory # Path used for our data directory and any temporary test resources. Relative # paths are expanded in reference to the location of 'run_tests.py'. # # If set then the directory's contents are reused for future tests (so we # have a faster startup and lower load on authorities). If set to an empty # value then this makes a fresh data directory for each test run. # # integ.log # Path runtime logs are placed. Relative paths are expanded in reference to # 'run_tests.py'. Logging is disabled if set ot an empty value. integ.test_directory ./test/data exclude_paths .*/stem/test/data/.* integ.log ./test/data/log # The following are less testing framework attributes that aren't as commonly # reconfigured. # # msg.* # Rendered text. # # target.* # Attributes of the integration testing targets. This helps determine what is # ran when the user runs with '--target'. msg.help |Usage run_tests.py [OPTION] |Runs tests for the stem library. | | -a, --all runs unit, integ, and style checks (same as '-ui') | -u, --unit runs unit tests | -i, --integ runs integration tests | --test TEST_NAME only run tests with this in the module name | | -t, --target TARGET comma separated list of integ targets (see below) | --tor PATH custom tor binary to run testing against | -l, --log RUNLEVEL include log output with test results, runlevels are: | TRACE, DEBUG, INFO, NOTICE, WARN, ERROR | | -q, --quiet only present failures | -v, --verbose provides additional test output | -h, --help presents this help | | Examples: | | run_tests.py --unit --integ | Run unit and integration tests. | | run_tests.py --integ --target RUN_ALL | Run integration tests against all tor configurations. | | run_tests.py --integ --test test.integ.util | Only run integration tests for the util modules. | | Integration targets: | ################## # CATEGORY: TARGET # ################## # The '--help' description of the target. target.description ONLINE => Includes tests that require network activity. target.description RELATIVE => Uses a relative path for tor's data directory. target.description CHROOT => Simulates a chroot setup. target.description RUN_NONE => Configuration without a way for controllers to connect. target.description RUN_OPEN => Configuration with an open control port (default). target.description RUN_PASSWORD => Configuration with password authentication. target.description RUN_COOKIE => Configuration with an authentication cookie. target.description RUN_MULTIPLE => Configuration with both password and cookie authentication. target.description RUN_SOCKET => Configuration with a control socket. target.description RUN_SCOOKIE => Configuration with a control socket and authentication cookie. target.description RUN_PTRACE => Configuration with an open control port and 'DisableDebuggerAttachment 0' target.description RUN_ALL => Runs integration tests for all connection configurations. # Torrc configuration options included with the target. Having this option set # means that each of these targets will have a dedicated integration test run. target.torrc RUN_NONE => target.torrc RUN_OPEN => PORT target.torrc RUN_PASSWORD => PORT, PASSWORD target.torrc RUN_COOKIE => PORT, COOKIE target.torrc RUN_MULTIPLE => PORT, PASSWORD, COOKIE target.torrc RUN_SOCKET => SOCKET target.torrc RUN_SCOOKIE => SOCKET, COOKIE target.torrc RUN_PTRACE => PORT, PTRACE # Pycodestyle compliance issues that we're ignoreing... # # * E251 no spaces around keyword / parameter equals # # This one I dislike a great deal. It makes keyword arguments different # from assignments which looks... aweful. I'm not sure what Pycodestyle's # author was on when he wrote this one but it's stupid. # # Someone else can change this if they really care. # # * E501 line is over 79 characters # # We're no longer on TTY terminals. Overly constraining line length makes # things far less readable, encouraging bad practices like abbreviated # variable names. # # If the code fits on my tiny netbook screen then it's narrow enough. # # * E111, E114, and E121 four space indentations # # Ahhh, indentation. The holy war that'll never die. Sticking with two # space indentations since it leads to shorter lines. # # * E127 and E131 continuation line over-indented for visual indent # # Pycodestyle only works with this one if we have four space indents (its # detection is based on multiples of four). # # * E722 do not use bare except # # Iirc they advise against this because it catches KeyboardInterrups and # interpreter termination. That's a fair concern, but on the other hand we # don't have strong assurance that socket errors and the like will be caught # without it. We've been doing this for years without issue but I'd be # ameanable to a patch if this causes issues for someone. pycodestyle.ignore E111 pycodestyle.ignore E114 pycodestyle.ignore E121 pycodestyle.ignore E501 pycodestyle.ignore E251 pycodestyle.ignore E127 pycodestyle.ignore E131 pycodestyle.ignore E722 pycodestyle.ignore stem/__init__.py => E402: import stem.util.connection pycodestyle.ignore stem/descriptor/__init__.py => E402: import stem.descriptor.server_descriptor pycodestyle.ignore stem/descriptor/__init__.py => E402: import stem.descriptor.extrainfo_descriptor pycodestyle.ignore stem/descriptor/__init__.py => E402: import stem.descriptor.networkstatus pycodestyle.ignore stem/descriptor/__init__.py => E402: import stem.descriptor.microdescriptor pycodestyle.ignore stem/descriptor/__init__.py => E402: import stem.descriptor.tordnsel pycodestyle.ignore stem/descriptor/__init__.py => E402: import stem.descriptor.hidden_service_descriptor pycodestyle.ignore test/unit/util/connection.py => W291: _tor tor 15843 10 pipe 0x0 state: pycodestyle.ignore test/unit/util/connection.py => W291: _tor tor 15843 11 pipe 0x0 state: # False positives from pyflakes. These are mappings between the path and the # issue. pyflakes.ignore run_tests.py => 'unittest' imported but unused pyflakes.ignore stem/client/datatype.py => redefinition of unused 'pop' from * pyflakes.ignore stem/control.py => undefined name 'controller' pyflakes.ignore stem/interpreter/__init__.py => undefined name 'raw_input' pyflakes.ignore stem/manual.py => undefined name 'unichr' pyflakes.ignore stem/prereq.py => 'int_to_bytes' imported but unused pyflakes.ignore stem/prereq.py => 'int_from_bytes' imported but unused pyflakes.ignore stem/prereq.py => 'default_backend' imported but unused pyflakes.ignore stem/prereq.py => 'load_der_public_key' imported but unused pyflakes.ignore stem/prereq.py => 'modes' imported but unused pyflakes.ignore stem/prereq.py => 'Cipher' imported but unused pyflakes.ignore stem/prereq.py => 'algorithms' imported but unused pyflakes.ignore stem/prereq.py => 'unittest' imported but unused pyflakes.ignore stem/prereq.py => 'unittest.mock' imported but unused pyflakes.ignore stem/prereq.py => 'long_to_bytes' imported but unused pyflakes.ignore stem/prereq.py => 'encoding' imported but unused pyflakes.ignore stem/prereq.py => 'signing' imported but unused pyflakes.ignore stem/prereq.py => 'sqlite3' imported but unused pyflakes.ignore stem/prereq.py => 'cryptography.utils.int_to_bytes' imported but unused pyflakes.ignore stem/prereq.py => 'cryptography.utils.int_from_bytes' imported but unused pyflakes.ignore stem/prereq.py => 'cryptography.hazmat.backends.default_backend' imported but unused pyflakes.ignore stem/prereq.py => 'cryptography.hazmat.primitives.serialization.load_der_public_key' imported but unused pyflakes.ignore stem/prereq.py => 'cryptography.hazmat.primitives.ciphers.modes' imported but unused pyflakes.ignore stem/prereq.py => 'cryptography.hazmat.primitives.ciphers.Cipher' imported but unused pyflakes.ignore stem/prereq.py => 'cryptography.hazmat.primitives.ciphers.algorithms' imported but unused pyflakes.ignore stem/prereq.py => 'lzma' imported but unused pyflakes.ignore stem/prereq.py => 'nacl.encoding' imported but unused pyflakes.ignore stem/prereq.py => 'nacl.signing' imported but unused pyflakes.ignore stem/response/events.py => undefined name 'long' pyflakes.ignore stem/util/__init__.py => undefined name 'long' pyflakes.ignore stem/util/__init__.py => undefined name 'unicode' pyflakes.ignore stem/util/conf.py => undefined name 'unicode' pyflakes.ignore stem/util/test_tools.py => 'pyflakes' imported but unused pyflakes.ignore stem/util/test_tools.py => 'pycodestyle' imported but unused pyflakes.ignore test/unit/descriptor/reader.py => 'bz2' imported but unused pyflakes.ignore test/unit/response/events.py => 'from stem import *' used; unable to detect undefined names pyflakes.ignore test/unit/response/events.py => *may be undefined, or defined from star imports: stem pyflakes.ignore stem/util/str_tools.py => undefined name 'unicode' pyflakes.ignore test/__init__.py => undefined name 'test' # Test modules we want to run. Modules are roughly ordered by the dependencies # so the lowest level tests come first. This is because a problem in say, # controller message parsing, will cause all higher level tests to fail too. # Hence we want the test that most narrowly exhibits problems to come first. test.unit_tests |test.unit.util.enum.TestEnum |test.unit.util.connection.TestConnection |test.unit.util.conf.TestConf |test.unit.util.log.TestLog |test.unit.util.proc.TestProc |test.unit.util.str_tools.TestStrTools |test.unit.util.system.TestSystem |test.unit.util.term.TestTerminal |test.unit.util.tor_tools.TestTorTools |test.unit.util.__init__.TestBaseUtil |test.unit.installation.TestInstallation |test.unit.descriptor.export.TestExport |test.unit.descriptor.reader.TestDescriptorReader |test.unit.descriptor.remote.TestDescriptorDownloader |test.unit.descriptor.server_descriptor.TestServerDescriptor |test.unit.descriptor.extrainfo_descriptor.TestExtraInfoDescriptor |test.unit.descriptor.microdescriptor.TestMicrodescriptor |test.unit.descriptor.router_status_entry.TestRouterStatusEntry |test.unit.descriptor.tordnsel.TestTorDNSELDescriptor |test.unit.descriptor.networkstatus.directory_authority.TestDirectoryAuthority |test.unit.descriptor.networkstatus.key_certificate.TestKeyCertificate |test.unit.descriptor.networkstatus.document_v2.TestNetworkStatusDocument |test.unit.descriptor.networkstatus.document_v3.TestNetworkStatusDocument |test.unit.descriptor.networkstatus.bridge_document.TestBridgeNetworkStatusDocument |test.unit.descriptor.hidden_service_descriptor.TestHiddenServiceDescriptor |test.unit.descriptor.certificate.TestEd25519Certificate |test.unit.exit_policy.rule.TestExitPolicyRule |test.unit.exit_policy.policy.TestExitPolicy |test.unit.endpoint.TestEndpoint |test.unit.version.TestVersion |test.unit.manual.TestManual |test.unit.directory.authority.TestAuthority |test.unit.directory.fallback.TestFallback |test.unit.tutorial.TestTutorial |test.unit.tutorial_examples.TestTutorialExamples |test.unit.response.add_onion.TestAddOnionResponse |test.unit.response.control_message.TestControlMessage |test.unit.response.control_line.TestControlLine |test.unit.response.events.TestEvents |test.unit.response.getinfo.TestGetInfoResponse |test.unit.response.getconf.TestGetConfResponse |test.unit.response.singleline.TestSingleLineResponse |test.unit.response.authchallenge.TestAuthChallengeResponse |test.unit.response.protocolinfo.TestProtocolInfoResponse |test.unit.response.mapaddress.TestMapAddressResponse |test.unit.client.size.TestSize |test.unit.client.address.TestAddress |test.unit.client.link_protocol.TestLinkProtocol |test.unit.client.certificate.TestCertificate |test.unit.client.kdf.TestKDF |test.unit.client.cell.TestCell |test.unit.connection.authentication.TestAuthenticate |test.unit.connection.connect.TestConnect |test.unit.control.controller.TestControl |test.unit.interpreter.arguments.TestArgumentParsing |test.unit.interpreter.autocomplete.TestAutocompletion |test.unit.interpreter.help.TestHelpResponses |test.unit.interpreter.commands.TestInterpreterCommands |test.unit.doctest.TestDocumentation test.integ_tests |test.integ.util.conf.TestConf |test.integ.util.connection.TestConnection |test.integ.util.proc.TestProc |test.integ.util.system.TestSystem |test.integ.interpreter.TestInterpreter |test.integ.version.TestVersion |test.integ.manual.TestManual |test.integ.directory.authority.TestAuthority |test.integ.directory.fallback.TestFallback |test.integ.client.connection.TestConnection |test.integ.response.protocolinfo.TestProtocolInfo |test.integ.socket.control_socket.TestControlSocket |test.integ.socket.control_message.TestControlMessage |test.integ.connection.authentication.TestAuthenticate |test.integ.connection.connect.TestConnect |test.integ.control.base_controller.TestBaseController |test.integ.control.controller.TestController |test.integ.descriptor.remote.TestDescriptorDownloader |test.integ.descriptor.server_descriptor.TestServerDescriptor |test.integ.descriptor.extrainfo_descriptor.TestExtraInfoDescriptor |test.integ.descriptor.microdescriptor.TestMicrodescriptor |test.integ.descriptor.networkstatus.TestNetworkStatus |test.integ.installation.TestInstallation |test.integ.process.TestProcess stem-1.7.1/test/task.py0000664000175000017500000002301413411002341015472 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ :class:`~test.task.Task` that can be ran with :func:`~test.task.run_tasks` to initialize our tests. tasks are... :: Initialization Tasks |- STEM_VERSION - checks our stem version |- TOR_VERSION - checks our tor version |- PYTHON_VERSION - checks our python version |- PLATFORM_VERSION - checks our operating system version |- CRYPTO_VERSION - checks our version of cryptography |- PYNACL_VERSION - checks our version of pynacl |- MOCK_VERSION - checks our version of mock |- PYFLAKES_VERSION - checks our version of pyflakes |- PYCODESTYLE_VERSION - checks our version of pycodestyle |- CLEAN_PYC - removes any *.pyc without a corresponding *.py |- IMPORT_TESTS - ensure all test modules have been imported |- UNUSED_TESTS - checks to see if any tests are missing from our settings |- PYFLAKES_TASK - static checks +- PYCODESTYLE_TASK - style checks """ import os import platform import re import sys import time import traceback import stem import stem.prereq import stem.util.conf import stem.util.system import stem.util.test_tools import stem.version import test import test.output from test.output import STATUS, ERROR, NO_NL, println try: # TODO: remove check when dropping python 2.6 support import importlib HAS_IMPORTLIB = True except ImportError: HAS_IMPORTLIB = False CONFIG = stem.util.conf.config_dict('test', { 'integ.test_directory': './test/data', 'test.unit_tests': '', 'test.integ_tests': '', }) SRC_PATHS = [os.path.join(test.STEM_BASE, path) for path in ( 'stem', 'test', 'run_tests.py', 'cache_manual.py', 'cache_fallback_directories.py', 'setup.py', 'tor-prompt', os.path.join('docs', 'republish.py'), os.path.join('docs', 'roles.py'), )] PYFLAKES_UNAVAILABLE = 'Static error checking requires pyflakes version 0.7.3 or later. Please install it from ...\n http://pypi.python.org/pypi/pyflakes\n' PYCODESTYLE_UNAVAILABLE = 'Style checks require pycodestyle version 1.4.2 or later. Please install it from...\n http://pypi.python.org/pypi/pycodestyle\n' def _check_tor_version(tor_path): return str(test.tor_version(tor_path)).split()[0] def _check_platform_version(): if platform.system() == 'Windows': extra = platform.release() elif platform.system() == 'Darwin': extra = platform.release() elif platform.system() == 'Linux': extra = ' '.join(platform.linux_distribution()[:2]) else: extra = None return '%s (%s)' % (platform.system(), extra) if extra else platform.system() def _clean_orphaned_pyc(paths): """ Deletes any file with a *.pyc extention without a corresponding *.py. :param list paths: paths to search for orphaned pyc files """ return ['removed %s' % path for path in stem.util.test_tools.clean_orphaned_pyc(paths)] def _import_tests(): """ Ensure all tests have been imported. This is important so tests can register if they're asynchronous. """ if not HAS_IMPORTLIB: return for module in (CONFIG['test.unit_tests'].splitlines() + CONFIG['test.integ_tests'].splitlines()): try: importlib.import_module(module.rsplit('.', 1)[0]) except: raise ImportError(traceback.format_exc()) def _check_for_unused_tests(paths): """ The 'test.unit_tests' and 'test.integ_tests' in our settings.cfg defines the tests that we run. We do it this way so that we can control the order in which our tests are run but there's a disadvantage: when we add new test modules we can easily forget to add it there. Checking to see if we have any unittest.TestCase subclasses not covered by our settings. :param list paths: paths to search for unused tests """ unused_tests = [] for path in paths: for py_path in stem.util.system.files_with_suffix(path, '.py'): if os.path.normpath(CONFIG['integ.test_directory']) in py_path: continue with open(py_path) as f: file_contents = f.read() test_match = re.search('^class (\S*)\(unittest.TestCase\):$', file_contents, re.MULTILINE) if test_match: class_name = test_match.groups()[0] module_name = py_path.replace(os.path.sep, '.')[len(test.STEM_BASE) + 1:-3] + '.' + class_name if not (module_name in CONFIG['test.unit_tests'] or module_name in CONFIG['test.integ_tests']): unused_tests.append(module_name) if unused_tests: raise ValueError('Test modules are missing from our test/settings.cfg:\n%s' % '\n'.join(unused_tests)) def run(category, *tasks): """ Runs a series of :class:`test.Task` instances. This simply prints 'done' or 'failed' for each unless we fail one that is marked as being required. If that happens then we print its error message and call sys.exit(). :param str category: label for the series of tasks :param list tasks: **Task** instances to be ran """ test.output.print_divider(category, True) for task in tasks: if task is None: continue task.run() if task.is_required and task.error: println('\n%s\n' % task.error, ERROR) sys.exit(1) println() class Task(object): """ Task we can process while running our tests. The runner can return either a message or list of strings for its results. """ def __init__(self, label, runner, args = None, is_required = True, print_result = True, print_runtime = False, background = False): super(Task, self).__init__() self.label = label self.runner = runner self.args = args self.is_required = is_required self.print_result = print_result self.print_runtime = print_runtime self.error = None self.is_successful = False self.result = None self._is_background_task = background self._background_process = None def run(self): start_time = time.time() println(' %s...' % self.label, STATUS, NO_NL) padding = 50 - len(self.label) println(' ' * padding, NO_NL) try: if self._is_background_task: self._background_process = stem.util.system.DaemonTask(self.runner, self.args, start = True) else: self.result = self.runner(*self.args) if self.args else self.runner() self.is_successful = True output_msg = 'running' if self._is_background_task else 'done' if self.result and self.print_result and isinstance(self.result, str): output_msg = self.result elif self.print_runtime: output_msg += ' (%0.1fs)' % (time.time() - start_time) println(output_msg, STATUS) if self.print_result and isinstance(self.result, (list, tuple)): for line in self.result: println(' %s' % line, STATUS) except Exception as exc: output_msg = str(exc) if not output_msg or self.is_required: output_msg = 'failed' println(output_msg, ERROR) self.error = exc def join(self): if self._background_process: self.result = self._background_process.join() class ModuleVersion(Task): def __init__(self, label, modules, prereq_check = None): if isinstance(modules, str): modules = [modules] # normalize to a list def version_check(): if prereq_check is None or prereq_check(): for module in modules: if HAS_IMPORTLIB and stem.util.test_tools._module_exists(module): return importlib.import_module(module).__version__ return 'missing' super(ModuleVersion, self).__init__(label, version_check) class StaticCheckTask(Task): def __init__(self, label, runner, args = None, is_available = None, unavailable_msg = None, background = True): super(StaticCheckTask, self).__init__(label, runner, args, is_required = False, print_result = False, print_runtime = not background, background = background) self.is_available = is_available self.unavailable_msg = unavailable_msg def run(self): if self.is_available: return super(StaticCheckTask, self).run() else: println(' %s...' % self.label, STATUS, NO_NL) println(' ' * (50 - len(self.label)), NO_NL) println('unavailable', STATUS) STEM_VERSION = Task('stem version', lambda: stem.__version__) TOR_VERSION = Task('tor version', _check_tor_version) PYTHON_VERSION = Task('python version', lambda: platform.python_version()) PLATFORM_VERSION = Task('operating system version', _check_platform_version) CRYPTO_VERSION = ModuleVersion('cryptography version', 'cryptography', stem.prereq.is_crypto_available) PYNACL_VERSION = ModuleVersion('pynacl version', 'nacl', stem.prereq._is_pynacl_available) MOCK_VERSION = ModuleVersion('mock version', ['unittest.mock', 'mock'], stem.prereq.is_mock_available) PYFLAKES_VERSION = ModuleVersion('pyflakes version', 'pyflakes') PYCODESTYLE_VERSION = ModuleVersion('pycodestyle version', ['pycodestyle', 'pep8']) CLEAN_PYC = Task('checking for orphaned .pyc files', _clean_orphaned_pyc, (SRC_PATHS,), print_runtime = True) IMPORT_TESTS = Task('importing test modules', _import_tests, print_runtime = True) UNUSED_TESTS = Task('checking for unused tests', _check_for_unused_tests, [( os.path.join(test.STEM_BASE, 'test', 'unit'), os.path.join(test.STEM_BASE, 'test', 'integ'), )], print_runtime = True) PYFLAKES_TASK = StaticCheckTask( 'running pyflakes', stem.util.test_tools.pyflakes_issues, args = (SRC_PATHS,), is_available = stem.util.test_tools.is_pyflakes_available(), unavailable_msg = PYFLAKES_UNAVAILABLE, ) PYCODESTYLE_TASK = StaticCheckTask( 'running pycodestyle', stem.util.test_tools.stylistic_issues, args = (SRC_PATHS, True, True, True), is_available = stem.util.test_tools.is_pycodestyle_available(), unavailable_msg = PYCODESTYLE_UNAVAILABLE, ) stem-1.7.1/test/require.py0000664000175000017500000000603013411002341016203 0ustar atagaratagar00000000000000# Copyright 2012-2018, Damian Johnson and The Tor Project # See LICENSE for licensing information """ Testing requirements. This provides annotations to skip tests that shouldn't be run. :: Test Requirements |- only_run_once - skip test if it has been ran before |- needs - skips the test unless a requirement is met | |- cryptography - skips test unless the cryptography module is present |- pynacl - skips test unless the pynacl module is present |- command - requires a command to be on the path |- proc - requires the platform to have recognized /proc contents | |- controller - skips test unless tor provides a controller endpoint |- version - skips test unless we meet a tor version requirement |- ptrace - requires 'DisableDebuggerAttachment' to be set +- online - skips unless targets allow for online tests """ import stem.util.system import stem.version import test import test.runner RAN_TESTS = [] def only_run_once(func): """ Skips the test if it has ran before. If it hasn't then flags it as being ran. This is useful to prevent lengthy tests that are independent of integ targets from being run repeatedly with ``RUN_ALL``. """ def wrapped(self, *args, **kwargs): if self.id() not in RAN_TESTS: RAN_TESTS.append(self.id()) return func(self, *args, **kwargs) else: self.skipTest('(already ran)') return wrapped def needs(condition, message): """ Skips teh test unless the conditional evaluates to 'true'. """ def decorator(func): def wrapped(self, *args, **kwargs): if condition(): return func(self, *args, **kwargs) else: self.skipTest('(%s)' % message) return wrapped return decorator def _can_access_controller(): return test.runner.get_runner().is_accessible() def _can_ptrace(): # If we're running a tor version where ptrace is disabled and we didn't # set 'DisableDebuggerAttachment=1' then we can infer that it's disabled. has_option = test.tor_version() >= stem.version.Requirement.TORRC_DISABLE_DEBUGGER_ATTACHMENT return not has_option or test.runner.Torrc.PTRACE in test.runner.get_runner().get_options() def _is_online(): return test.Target.ONLINE in test.runner.get_runner().attribute_targets def command(cmd): """ Skips the test unless a command is available on the path. """ return needs(lambda: stem.util.system.is_available(cmd), '%s unavailable' % cmd) def version(req_version): """ Skips the test unless we meet the required version. :param stem.version.Version req_version: required tor version for the test """ return needs(lambda: test.tor_version() >= req_version, 'requires %s' % req_version) cryptography = needs(stem.prereq.is_crypto_available, 'requires cryptography') pynacl = needs(stem.prereq._is_pynacl_available, 'requires pynacl module') proc = needs(stem.util.proc.is_available, 'proc unavailable') controller = needs(_can_access_controller, 'no connection') ptrace = needs(_can_ptrace, 'DisableDebuggerAttachment is set') online = needs(_is_online, 'requires online target') stem-1.7.1/tor-prompt0000775000175000017500000000030713157571677015306 0ustar atagaratagar00000000000000#!/usr/bin/env python # Copyright 2014-2017, Damian Johnson and The Tor Project # See LICENSE for licensing information import stem.interpreter if __name__ == '__main__': stem.interpreter.main() stem-1.7.1/PKG-INFO0000664000175000017500000000266713411004021014304 0ustar atagaratagar00000000000000Metadata-Version: 1.1 Name: stem Version: 1.7.1 Summary: Stem is a Python controller library that allows applications to interact with Tor (https://www.torproject.org/). Home-page: https://stem.torproject.org/ Author: Damian Johnson Author-email: atagar@torproject.org License: LGPLv3 Description: For tutorials and API documentation see `Stem's homepage `_. Quick Start ----------- To install you can either use... :: pip install stem ... or install from the source tarball. Stem supports both the python 2.x and 3.x series. To use its python3 counterpart you simply need to install using that version of python. :: python3 setup.py install After that, give some `tutorials `_ a try! For questions or to discuss project ideas we're available on `irc `_ and the `tor-dev@ email list `_. Keywords: tor onion controller Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3) Classifier: Topic :: Security Classifier: Topic :: Software Development :: Libraries :: Python Modules